summaryrefslogtreecommitdiff
path: root/tools/mq_editor/README.md
blob: 1f43c19e71eece4555785148f25e3c04b5868b22 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# MQ Spectral Editor

McAulay-Quatieri sinusoidal analysis and synthesis tool.

## Usage

```bash
open tools/mq_editor/index.html
```

1. Load WAV file
2. Adjust MQ parameters (FFT size, hop, threshold)
3. Click "Extract Partials"
4. View extracted sinusoidal trajectories with bezier curve fits

## Features (Phase 1)

- **MQ Extraction:** FFT → peak detection → trajectory tracking → bezier fitting
- **Visualization:** Time-frequency plot with raw trajectories and bezier overlays
- **Real-time:** Adjustable extraction parameters

## Parameters

- **FFT Size:** 1024-4096 (default 2048)
- **Hop Size:** 64-2048 samples (default 512, 75% overlap)
- **Threshold:** -80 to -20 dB (default -60 dB)

## Architecture

- `index.html` - UI and integration
- `fft.js` - Fast Fourier Transform (Cooley-Tukey radix-2)
- `mq_extract.js` - MQ algorithm (peak detection, tracking, bezier fitting)
- `viewer.js` - Visualization (spectrogram, partials, zoom, mouse interaction)

## Implementation Status

- [x] Phase 1: MQ extraction + visualization
  - [x] Spectrogram rendering with power-law colormap (gamma=0.3)
  - [x] Horizontal zoom (shift+mousewheel) and scroll (mousewheel)
  - [x] Axis ticks and labels
  - [x] Mouse tooltip (time/frequency/dB intensity)
  - [x] Improved partial tracking (frequency-dependent threshold, candidate system)
  - [x] Original WAV playback with animated playhead
  - [x] Keyboard shortcuts ('1' synthesized, '2' original)
  - [x] Mini-spectrum viewer (bottom-right overlay)
  - [x] STFT cache for optimized FFT access
- [x] Phase 2: JS synthesizer (preview playback)
  - [x] Bezier curve evaluation (cubic)
  - [x] Replica oscillator bank with frequency spread and jitter
  - [x] PCM synthesis from extracted partials
  - [x] Playback via Web Audio API
- [ ] Phase 3: Editing UI (drag control points, replicas)
- [ ] Phase 4: Export (.txt + C++ code generation)

## Algorithm

1. **STFT:** Overlapping Hann windows, radix-2 Cooley-Tukey FFT (from spectral_editor/dct.js)
2. **Peak Detection:** Local maxima above threshold, parabolic interpolation
3. **Tracking:** Birth/death/continuation (50 Hz tolerance, 2-frame persistence)
4. **Bezier Fitting:** Cubic curves (4 control points), fixed endpoints

## See Also

- Design doc: `doc/SPECTRAL_BRUSH_2.md`