Analog quirks: shape every instrument toward its hardware #4

Open
opened 2026-10-11 23:39:08 +00:00 by bcox · 1 comment
Owner

Every instrument here is built "clean": ideal waveforms, linear filters but for the four-pole filter's limited feedback, straight-line envelopes, and placeholder curves. CLAUDE.md says this is deliberate until the hardware has been measured, and that each quirk of an original gets a switch of its own, not one switch for the whole instrument.

This ticket stands for all of that work, on all five instruments. It is deliberately not a list. As a quirk is understood (measured from hardware, read from a service manual, or heard on a recording), split it out into a ticket of its own and do it there.

Where the known gaps are written down today:

  • each instrument's "Deliberately not done" paragraph in CLAUDE.md;
  • the opening comment of each header in engine/ and instruments/*/, which says what is a placeholder and what is a plain choice;
  • "Open decisions" in CLAUDE.md.

Rules that apply to every split-out ticket: provenance rule 3 (curves come from published manuals or from measuring a real instrument's audio, never from a ROM or firmware), and no shaping parameters invented ahead of the measurements.

Every instrument here is built "clean": ideal waveforms, linear filters but for the four-pole filter's limited feedback, straight-line envelopes, and placeholder curves. CLAUDE.md says this is deliberate until the hardware has been measured, and that each quirk of an original gets a switch of its own, not one switch for the whole instrument. This ticket stands for all of that work, on all five instruments. It is deliberately not a list. As a quirk is understood (measured from hardware, read from a service manual, or heard on a recording), split it out into a ticket of its own and do it there. Where the known gaps are written down today: - each instrument's "Deliberately not done" paragraph in CLAUDE.md; - the opening comment of each header in `engine/` and `instruments/*/`, which says what is a placeholder and what is a plain choice; - "Open decisions" in CLAUDE.md. Rules that apply to every split-out ticket: provenance rule 3 (curves come from published manuals or from measuring a real instrument's audio, never from a ROM or firmware), and no shaping parameters invented ahead of the measurements.
Author
Owner

Parking #4 here on 2026-10-18, left open. Where it stands, so it can be picked up again.

Done (on main, through 1cd6096; CLAUDE.md has the detail of each):

  • Filter saturation, from documents and not measured: OTA cells (kOta) and the transistor ladder (kLadder) in engine/four_pole_filter.h; also in engine/sallen_key_filter.h, engine/state_variable_filter.h and engine/multimode_ladder.h. Each instrument has filter.saturation, at nothing as it comes, and renders byte for byte as before at nothing. --config=no_analog compiles it out. mini-Bit's filter.chip chooses between the CEM3328 and the SSM2044, and the SSM2044 is there for the Mono/Poly and Polysix to reuse.
  • Mixer drive (engine/mixer_drive.h) on every instrument with a mixer ahead of an analog filter, and the 2600's filter input overdriving.
  • Oscillator shaping: 3340 symmetry (engine/vco_symmetry.h) on the Prophets, the Jupiters and the SH-101; the JX ramp spread; the Juno ramp tracking and bend; the 2600's VCO-2 fold and sine shape; the Prodigy's triangle fold.
  • Voice drift (engine/drift.h) on fifteen instruments, with the variance.* drift settings. Retune comes from the page button, MIDI Tune Request (F6), --retune-cc and the automatable variance.retune. The Juno has the full variance.* set.
  • Bench: mini-XP's saturation on the Pi costs about a fifth more a voice, and up to about 24 voices fit.

Decided not to model (recorded in CLAUDE.md):

  • The Prodigy's sawtooth reset time, which at about 1 µs is a twentieth of a sample at 48 kHz.
  • The CEM 3340's top-octave flattening, which its HF track trimmer corrects. The datasheet gives no figure for what is left.
  • The CEM 3340's slow pulse fall, about a microsecond, with no figure in the datasheet.

Still open on #4, not started:

  • The ARP filters as ladders, which is a reading of the circuit still to be done.
  • Whole-instrument drift for the Omni and mini-RS, whose divide-down tones would want a master-oscillator drift.
  • The 3340's reversing hard sync, deferred until an instrument here is wired that way.
  • mini-CS's and mini-RS's filter chips, which no document read so far names.
  • The Poly-800 and DW-8000 filter, to be measured last on Ben's Poly-800.
Parking #4 here on 2026-10-18, left open. Where it stands, so it can be picked up again. **Done** (on main, through 1cd6096; CLAUDE.md has the detail of each): - Filter saturation, from documents and not measured: OTA cells (`kOta`) and the transistor ladder (`kLadder`) in `engine/four_pole_filter.h`; also in `engine/sallen_key_filter.h`, `engine/state_variable_filter.h` and `engine/multimode_ladder.h`. Each instrument has `filter.saturation`, at nothing as it comes, and renders byte for byte as before at nothing. `--config=no_analog` compiles it out. mini-Bit's `filter.chip` chooses between the CEM3328 and the SSM2044, and the SSM2044 is there for the Mono/Poly and Polysix to reuse. - Mixer drive (`engine/mixer_drive.h`) on every instrument with a mixer ahead of an analog filter, and the 2600's filter input overdriving. - Oscillator shaping: 3340 symmetry (`engine/vco_symmetry.h`) on the Prophets, the Jupiters and the SH-101; the JX ramp spread; the Juno ramp tracking and bend; the 2600's VCO-2 fold and sine shape; the Prodigy's triangle fold. - Voice drift (`engine/drift.h`) on fifteen instruments, with the `variance.*` drift settings. Retune comes from the page button, MIDI Tune Request (F6), `--retune-cc` and the automatable `variance.retune`. The Juno has the full `variance.*` set. - Bench: mini-XP's saturation on the Pi costs about a fifth more a voice, and up to about 24 voices fit. **Decided not to model** (recorded in CLAUDE.md): - The Prodigy's sawtooth reset time, which at about 1 µs is a twentieth of a sample at 48 kHz. - The CEM 3340's top-octave flattening, which its HF track trimmer corrects. The datasheet gives no figure for what is left. - The CEM 3340's slow pulse fall, about a microsecond, with no figure in the datasheet. **Still open on #4, not started:** - The ARP filters as ladders, which is a reading of the circuit still to be done. - Whole-instrument drift for the Omni and mini-RS, whose divide-down tones would want a master-oscillator drift. - The 3340's reversing hard sync, deferred until an instrument here is wired that way. - mini-CS's and mini-RS's filter chips, which no document read so far names. - The Poly-800 and DW-8000 filter, to be measured last on Ben's Poly-800.
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
bcox/mini-800#4
No description provided.