Note priority and chord memory: the allocator has no rule for which held key sounds, and nothing re-sounds a stolen one #113

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

bcox asked on 2026-10-05 for a ticket for each engine gap that the third set of instruments in his moregaps.md left without one. 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

  • VoiceMode (dsp/layer.h:267-296) carries a polyphony limit, the steal's retrigger and pickup rules, and unison. It has no note priority.
  • At the limit a steal takes the released-oldest voice, then the held-oldest (dsp/voice_allocator.h:827-841). So at polyphony 1 the newest key always wins, and when it lifts, NoteOff releases only its own voices (:296-302): an older key, still held, does not come back. There is no held-key stack.
  • Nothing stores a set of intervals to play from one key.

Note priority is the most repeated gap in the third set: every monosynth there states one.

What the instruments do

  • Low-note priority: SH-2, SH-09, SH-101 (in its gate and LFO trigger modes), ARP 2600, Odyssey (VCO 1), Pro-One, Omni (bass section), CAT (VCO 2), OB-8 and Prophet-600 in unison.
  • High-note: CS-15, SY-1, GX-1 (Solo and Pedal; its Solo-to-Upper coupler doubles the top Upper note), Odyssey (VCO 2), CAT (VCO 1 in its poly setting).
  • Selectable: Memorymoog (last, low, high), Pro 2 (low, high, last), Chroma (first, bottom, top).
  • The SH-101 changes priority with its trigger switch: gate is low-note without retrigger, gate-and-trigger is last-note.
  • Return to a held key when the newer one lifts: Polysix (five notes deep), Wasp.
  • Chord memory: Polysix (six notes), Mono/Poly, Memorymoog (hold memorizes a chord and transposes it), Prophet-5 Rev 4, Prophet-600 (tracking unison latches a chord), Chroma (chord buffer); Poly-800 and Alpha Juno from recollection.

What is here

  • Last-note priority without return, as above.
  • The Mono/Poly's chord memory is reachable exactly today as fixed coarse offsets per oscillator, because its chord also shares one filter. A machine with a filter per note needs a voice per interval, which is the allocator's job.
  • Unison already fans one note out to copies (kMaxUnison, dsp/layer.h:268); chord memory is the same fan-out at intervals rather than detunes.

The work, as a sketch

  • A priority field: last (today), low, high; with a per-channel held-key set so a lifted key hands the voice back to the highest-priority key still held. A 128-bit set of held keys answers lowest and highest in one find-first-set.
  • Chord memory as an allocator fan-out: a stored interval set, learned from held keys in the editor, applied at note-on as one note per interval sharing the trigger; release together, as copies do.
  • Interactions to settle: the glide seed (it is the channel's last-started key today, dsp/voice_allocator.h:222-234), retrigger_envelope on the hand-back, unison copies, MPE.

Open

  • Patch or channel. VoiceMode is the patch's, and priority is about a keyboard; the SH-101 ties it to the envelope's trigger mode, which is patch state.
  • Duophony wants low and high at once, in one voice; that is #114.
  • The arpeggiator, #112, sits beside this.
bcox asked on 2026-10-05 for a ticket for each engine gap that the third set of instruments in his `moregaps.md` left without one. 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 - `VoiceMode` (`dsp/layer.h:267-296`) carries a polyphony limit, the steal's retrigger and pickup rules, and unison. It has no note priority. - At the limit a steal takes the released-oldest voice, then the held-oldest (`dsp/voice_allocator.h:827-841`). So at polyphony 1 the newest key always wins, and when it lifts, `NoteOff` releases only its own voices (`:296-302`): an older key, still held, does not come back. There is no held-key stack. - Nothing stores a set of intervals to play from one key. Note priority is the most repeated gap in the third set: every monosynth there states one. ## What the instruments do - Low-note priority: SH-2, SH-09, SH-101 (in its gate and LFO trigger modes), ARP 2600, Odyssey (VCO 1), Pro-One, Omni (bass section), CAT (VCO 2), OB-8 and Prophet-600 in unison. - High-note: CS-15, SY-1, GX-1 (Solo and Pedal; its Solo-to-Upper coupler doubles the top Upper note), Odyssey (VCO 2), CAT (VCO 1 in its poly setting). - Selectable: Memorymoog (last, low, high), Pro 2 (low, high, last), Chroma (first, bottom, top). - The SH-101 changes priority with its trigger switch: gate is low-note without retrigger, gate-and-trigger is last-note. - Return to a held key when the newer one lifts: Polysix (five notes deep), Wasp. - Chord memory: Polysix (six notes), Mono/Poly, Memorymoog (hold memorizes a chord and transposes it), Prophet-5 Rev 4, Prophet-600 (tracking unison latches a chord), Chroma (chord buffer); Poly-800 and Alpha Juno from recollection. ## What is here - Last-note priority without return, as above. - The Mono/Poly's chord memory is reachable exactly today as fixed coarse offsets per oscillator, because its chord also shares one filter. A machine with a filter per note needs a voice per interval, which is the allocator's job. - Unison already fans one note out to copies (`kMaxUnison`, `dsp/layer.h:268`); chord memory is the same fan-out at intervals rather than detunes. ## The work, as a sketch - A priority field: last (today), low, high; with a per-channel held-key set so a lifted key hands the voice back to the highest-priority key still held. A 128-bit set of held keys answers lowest and highest in one find-first-set. - Chord memory as an allocator fan-out: a stored interval set, learned from held keys in the editor, applied at note-on as one note per interval sharing the trigger; release together, as copies do. - Interactions to settle: the glide seed (it is the channel's last-started key today, `dsp/voice_allocator.h:222-234`), `retrigger_envelope` on the hand-back, unison copies, MPE. ## Open - Patch or channel. `VoiceMode` is the patch's, and priority is about a keyboard; the SH-101 ties it to the envelope's trigger mode, which is patch state. - Duophony wants low and high at once, in one voice; that is #114. - The arpeggiator, #112, sits beside this.
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#113
No description provided.