<feed xmlns='http://www.w3.org/2005/Atom'>
<title>demo.git/tools/mq_editor, branch main</title>
<subtitle>Vide-coded 64k demo system</subtitle>
<id>https://git.taar-o.com/demo.git/atom?h=main</id>
<link rel='self' href='https://git.taar-o.com/demo.git/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.taar-o.com/demo.git/'/>
<updated>2026-02-19T06:54:01Z</updated>
<entry>
<title>update tools mq-editor TODO</title>
<updated>2026-02-19T06:54:01Z</updated>
<author>
<name>skal</name>
<email>pascal.massimino@gmail.com</email>
</author>
<published>2026-02-19T06:54:01Z</published>
<link rel='alternate' type='text/html' href='https://git.taar-o.com/demo.git/commit/?id=1030807a58c8f4315d209c3756a9f98d8dc6bd91'/>
<id>urn:sha1:1030807a58c8f4315d209c3756a9f98d8dc6bd91</id>
<content type='text'>
</content>
</entry>
<entry>
<title>fix(mq_editor): offset playhead to partial t_start when playing single partial (key 3)</title>
<updated>2026-02-19T06:47:17Z</updated>
<author>
<name>skal</name>
<email>pascal.massimino@gmail.com</email>
</author>
<published>2026-02-19T06:47:17Z</published>
<link rel='alternate' type='text/html' href='https://git.taar-o.com/demo.git/commit/?id=7554f59a328acc706119d0952b50ab9fdee8c623'/>
<id>urn:sha1:7554f59a328acc706119d0952b50ab9fdee8c623</id>
<content type='text'>
handoff(Claude): playhead offset fix for single partial playback
</content>
</entry>
<entry>
<title>fix(mq_editor): remove duplicate mode toggle, add SINE badge, fix mini-spectrum invalidation</title>
<updated>2026-02-19T06:26:26Z</updated>
<author>
<name>skal</name>
<email>pascal.massimino@gmail.com</email>
</author>
<published>2026-02-19T06:26:26Z</published>
<link rel='alternate' type='text/html' href='https://git.taar-o.com/demo.git/commit/?id=07538091b1fac417104c273bd9dc117af8afdb9e'/>
<id>urn:sha1:07538091b1fac417104c273bd9dc117af8afdb9e</id>
<content type='text'>
- Remove redundant synthModeToggle from _updatePropPanel + index.html
- Add SINE badge (grey) to panel title, matching existing RES badge (blue)
- Invalidate mini-spectrum (viewer.render) on sinusoid/resonator switch

handoff(Claude): mq_editor partial panel polish
</content>
</entry>
<entry>
<title>feat(mq_editor): UI revamp — params panel, layout, partial spectrum</title>
<updated>2026-02-19T05:46:57Z</updated>
<author>
<name>skal</name>
<email>pascal.massimino@gmail.com</email>
</author>
<published>2026-02-19T05:46:57Z</published>
<link rel='alternate' type='text/html' href='https://git.taar-o.com/demo.git/commit/?id=83eec3cece795f56f4edc1298a008216cb9511a0'/>
<id>urn:sha1:83eec3cece795f56f4edc1298a008216cb9511a0</id>
<content type='text'>
- Move Synthesis controls (integratePhase, jitter, spread, resonator,
  LP/HP filters) and Auto Spread All into the ⚙ Params dropdown
- Group Extract Partials / +Partial / ✕ Clear All in one toolbar group
- Add per-partial Sine/Res mode toggle in the property panel (Mode row)
- Move partial mini-spectrum below the right panel (right-col layout)
- Partial mini-spectrum: dynamic dB range scanned across full duration
  (8 samples, [peak−60, peak]), cached on partial select
- Print bezier amplitude A= in red at top-right of partial spectrum
- Status/info messages set to 80% gray (#ccc)

handoff(Claude): UI revamp complete, TODO items implemented.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>fix(mq_editor): jitter + central spectrum invalidation</title>
<updated>2026-02-18T23:32:54Z</updated>
<author>
<name>skal</name>
<email>pascal.massimino@gmail.com</email>
</author>
<published>2026-02-18T23:32:54Z</published>
<link rel='alternate' type='text/html' href='https://git.taar-o.com/demo.git/commit/?id=c804808870cf3775362c02e40ea7d3d082ed0d91'/>
<id>urn:sha1:c804808870cf3775362c02e40ea7d3d082ed0d91</id>
<content type='text'>
mq_synth.js:
- jitter was only used as a static initial phase offset (inaudible);
  now drives per-sample LCG frequency perturbation (±jitter fraction of
  instantaneous freq) in both sinusoidal (integratePhase path) and
  resonator modes (separate jitterSeed, independent from noise excitation)
- disableJitter option now correctly gates jitter to 0 in both modes
  (was never read before)

viewer.js / app.js:
- remove invalidatePartialSpectrum() and onResonatorParamChange callback;
  replace with viewer.onGetSynthOpts callback, called inside
  _computePartialSpectrum to pull fresh synthOpts at compute time
- all UI changes (resonator r/gain, forceResonator, globalR/gain,
  forceRGain, sinusoidal params) now use viewer.render() as the single
  invalidation path — no more split between render() and
  invalidatePartialSpectrum()

handoff(Gemini): jitter active on both synth modes; spectrum always sees
fresh synthOpts via onGetSynthOpts; viewer.render() is the only
invalidation path needed.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>fix(mq_editor): fuse spread_above/below into single spread param</title>
<updated>2026-02-18T23:00:06Z</updated>
<author>
<name>skal</name>
<email>pascal.massimino@gmail.com</email>
</author>
<published>2026-02-18T23:00:06Z</published>
<link rel='alternate' type='text/html' href='https://git.taar-o.com/demo.git/commit/?id=db5c023acd237d7015933bd21a5a6dbe5755841d'/>
<id>urn:sha1:db5c023acd237d7015933bd21a5a6dbe5755841d</id>
<content type='text'>
Asymmetric spread offset the pitch center. Replace with a single
symmetric `spread` in harmonics config. autodetectSpread now returns
max(above, below). Update all defaults, UI, comments, and README.

handoff(Gemini): spread is now a single param; no compat shims.
Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>fix(mq_editor): partial mini-spectrum — correct FFT, time selection, resonator sync</title>
<updated>2026-02-18T22:55:02Z</updated>
<author>
<name>skal</name>
<email>pascal.massimino@gmail.com</email>
</author>
<published>2026-02-18T22:55:02Z</published>
<link rel='alternate' type='text/html' href='https://git.taar-o.com/demo.git/commit/?id=618bd1dc9af4beb98584ed817772951007017f79'/>
<id>urn:sha1:618bd1dc9af4beb98584ed817772951007017f79</id>
<content type='text'>
- Fix: fftRadix2 called without bitReversePermute → noisy spectrum (use fftForward)
- specTime = mouse pos if inside partial [t0,t3], else center of partial interval
- Cache check moved before canvas clear to keep spectrum visible outside [t0,t3]
- viewer.synthOpts forwarded to synthesizeMQ so forceResonator/globalR/gain apply
- invalidatePartialSpectrum() wired to forceResonator/forceRGain/globalR/globalGain

handoff(Gemini): mini-spectrum now correct; fft bug fixed, resonator mode synced
</content>
</entry>
<entry>
<title>feat(mq_editor): partial spectrum viewer — synth+FFT power display</title>
<updated>2026-02-18T22:25:46Z</updated>
<author>
<name>skal</name>
<email>pascal.massimino@gmail.com</email>
</author>
<published>2026-02-18T22:25:46Z</published>
<link rel='alternate' type='text/html' href='https://git.taar-o.com/demo.git/commit/?id=e63f885c7caaf7496d01e37f8ed2769190f8a51e'/>
<id>urn:sha1:e63f885c7caaf7496d01e37f8ed2769190f8a51e</id>
<content type='text'>
Adds a 200×100 canvas (left of the main spectrum overlay) that shows
the synthesised power spectrum of the selected partial at the time
under the mouse (or playhead).

Pipeline: synthesizeMQ → Hann window → FFT (2048-pt) → dB power bars.
- freqCurve times are shifted so the synthesis window is centred on t
- X-axis: log-frequency (same scale as main view)
- Y-axis: dB, normalised to peak of the synthesised frame
- Cache: {partialIndex, time} → avoids re-synthesis on mouse move;
  bypassed (force=true) from render() so param changes always redraw

handoff(Claude): partial spectrum viewer complete

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat(mq_editor): replace replicas with harmonics model</title>
<updated>2026-02-18T21:59:15Z</updated>
<author>
<name>skal</name>
<email>pascal.massimino@gmail.com</email>
</author>
<published>2026-02-18T21:59:15Z</published>
<link rel='alternate' type='text/html' href='https://git.taar-o.com/demo.git/commit/?id=cd771a49d1d59b1403ef7f358398fa2f0f646cc4'/>
<id>urn:sha1:cd771a49d1d59b1403ef7f358398fa2f0f646cc4</id>
<content type='text'>
- Fundamental f0 always synthesized; harmonics added at n*freq_mult
- decay^n amplitude rolloff per harmonic (capped at 0.90)
- Resonator mode also expanded across harmonics (per-harmonic y1/y2 state)
- UI: h.decay, h.freq (default 2.0), jitter, spread↑/↓ params
- Viewer: faint dotted harmonic bands with spread visualization
- Default freq_mult=2.0 (natural harmonic series)

handoff(Gemini): harmonics model complete, ready for next task

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>fix(mq_editor): swap keys 1/2 — 1=original, 2=synth, 3=partial</title>
<updated>2026-02-18T20:50:54Z</updated>
<author>
<name>skal</name>
<email>pascal.massimino@gmail.com</email>
</author>
<published>2026-02-18T20:50:54Z</published>
<link rel='alternate' type='text/html' href='https://git.taar-o.com/demo.git/commit/?id=080f457040ca54256325b922ebd67cde5c0dc030'/>
<id>urn:sha1:080f457040ca54256325b922ebd67cde5c0dc030</id>
<content type='text'>
handoff(Gemini): key bindings updated in app.js and README.md
</content>
</entry>
</feed>
