A voice-index source: offsets fixed per voice, as the OB-8's halves and every analog chip have #132

Open
opened 2026-10-05 23:46:14 +00:00 by bcox · 0 comments
Owner

bcox asked on 2026-10-05 for a ticket for each engine gap in his moregaps.md feature table that no existing ticket covers. Engine claims are from reading the tree at f6aa8eba on main. Instrument claims are from that day's research, read mostly as archive.org OCR of the manuals by research agents and not re-checked; the sources are listed in that document. Nothing here is built, measured or listened to.

Summary

Nothing a voice can read tells it which voice it is. The two per-note randoms (kSharedRandomA, kSharedRandomB) are drawn at note-on and differ per note, not per voice; the allocator keeps a per-channel ordinal for each sounding note voice (region_ordinal, dsp/voice_allocator.h:254, :719-724) for the storage region and does not publish it. Three instruments are built on fixed per-voice differences:

  • OB-8: the LFO of voices 5-8 runs at 90 or 180 degrees from voices 1-4 (17 of 104 factory programs use it); some voices are tuned flat, some sharp, some not; with the portamento match switch off "the voices will portamento at slightly different rates". The manual confirms all three.
  • Every analog polysynth, by its chips: the CEM3340's triangle symmetry is specified at 45 to 55 percent, fixed per chip, so each voice has its own small fixed difference. The Curtis section of moregaps.md lists it.
  • GX-1: its Random section may be a different fixed resistor on every card (the restoration blog) or a per-key-down offset (Sound On Sound); the sources disagree.

The LFO phase offset is already a destination (dsp/va_layer.h:455), so for the OB-8's halves only the source is missing.

The work, as a sketch

  • kSharedVoiceIndex: the voice's ordinal on its channel as a unipolar level, ordinal over polyphony (or over the pool when unlimited), set at note-on. Through kQuantize and kGreater it becomes halves, thirds or a single voice.
  • kSharedVoiceConstant: a per-slot random drawn once at program install or channel reset, so it is fixed for the life of the program as a chip's trim is, and not redrawn per note.
  • Which slot counts: the pool is shared, so the ordinal must be the channel's, not the pool slot's, or a voice's "index" would change with other channels' load.
  • A timbre per voice (the Four Voice's one program per SEM) is the whole-patch form of this and is #133; with this source and the level lanes it is partly reachable through the matrix.
  • The glide-rate difference (OB-8 match off) also needs glide time as a destination, #119.
bcox asked on 2026-10-05 for a ticket for each engine gap in his `moregaps.md` feature table that no existing ticket covers. Engine claims are from reading the tree at `f6aa8eba` on `main`. Instrument claims are from that day's research, read mostly as archive.org OCR of the manuals by research agents and not re-checked; the sources are listed in that document. **Nothing here is built, measured or listened to.** ## Summary Nothing a voice can read tells it which voice it is. The two per-note randoms (`kSharedRandomA`, `kSharedRandomB`) are drawn at note-on and differ per note, not per voice; the allocator keeps a per-channel ordinal for each sounding note voice (`region_ordinal`, `dsp/voice_allocator.h:254`, `:719-724`) for the storage region and does not publish it. Three instruments are built on fixed per-voice differences: - **OB-8**: the LFO of voices 5-8 runs at 90 or 180 degrees from voices 1-4 (17 of 104 factory programs use it); some voices are tuned flat, some sharp, some not; with the portamento match switch off "the voices will portamento at slightly different rates". The manual confirms all three. - **Every analog polysynth, by its chips**: the CEM3340's triangle symmetry is specified at 45 to 55 percent, fixed per chip, so each voice has its own small fixed difference. The Curtis section of `moregaps.md` lists it. - **GX-1**: its Random section may be a different fixed resistor on every card (the restoration blog) or a per-key-down offset (Sound On Sound); the sources disagree. The LFO phase offset is already a destination (`dsp/va_layer.h:455`), so for the OB-8's halves only the source is missing. ## The work, as a sketch - `kSharedVoiceIndex`: the voice's ordinal on its channel as a unipolar level, ordinal over polyphony (or over the pool when unlimited), set at note-on. Through `kQuantize` and `kGreater` it becomes halves, thirds or a single voice. - `kSharedVoiceConstant`: a per-slot random drawn once at program install or channel reset, so it is fixed for the life of the program as a chip's trim is, and not redrawn per note. - Which slot counts: the pool is shared, so the ordinal must be the channel's, not the pool slot's, or a voice's "index" would change with other channels' load. ## Related - A timbre per voice (the Four Voice's one program per SEM) is the whole-patch form of this and is #133; with this source and the level lanes it is partly reachable through the matrix. - The glide-rate difference (OB-8 match off) also needs glide time as a destination, #119.
Sign in to join this conversation.
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/tymbal#132
No description provided.