o1nk: eight parts, each a whole o1nk, and a MIDI page mapping them #10

Merged
peterswimm merged 1 commit from feat/multitimbral into main 2026-10-23 21:44:56 +00:00
Owner

o1nk is now eight instruments. Each part has its own copy of every
parameter (bank, voice, filter, effects, all of it) and a MIDI map:
channel (Omni or 1-16), key range low/high, transpose (+/-48) and on/off.
A note plays every part that is on and takes its channel and key, moved
by that part's transpose, so parts split, layer, or listen on channels
of their own. Parts are monophonic, as o1nk was.

Ids and addresses are part x 128 + the parameter's own, so part 1 keeps
every id and name it had: existing presets, automation and saved state
load as part 1 with parts 2-8 off. State stays version 1. Parts 2-8 are
named "P2 Cutoff" in modules "Part N/

" (AU groups part2-part8),
all automatable.

  • core/o1nk_parts.{h,cpp} and O1NKParts (Swift): the router, kept
    bit-identical by parity.sh, with new scenarios and two controls
    (transpose dropped, channel ignored). Part 1 alone renders exactly what
    o1nk rendered; silent parts cost nothing. Switching a part on or off is
    settled on the audio thread, so a state load can't reset a kernel
    mid-render.
  • CLAP: 264 params, banks shared across parts, per-part voice hand-off,
    72 remote pages (each part's UDG pages plus MIDI). The handheld screen
    has PART n in its title, L2/R2 to change part, and a ninth page: the
    MIDI table, a row per part.
  • AU: the tree holds all eight parts; bank and voice are parameters per
    part (factory presets still set part 1's voice, and the
    o1nk.lgptVoice state key still restores it by path); MIDI channel
    from the status byte; scheduled parameter events applied. The view
    gets a part picker and the MIDI page as an 8-row table.
  • UDG parity checks the MIDI page, the part count, and the bank list in
    O1NKBanks.

Tests: parity.sh 13 scenarios + 4 controls; o1nk-parts-test 54 checks;
tests/lgpt/run.sh with new AU part checks (wavetable engine still
byte-identical to origin/main); lgpt.sh; controls-test; udg_parity and
opsl_parity; clapcheck conformant on linux arm64; Xcode simulator build.
On the RG35XX SP, 8 parts layered with every effect: 206 us a 256-frame
block, 3.9% of a core.

Wish 04408ee8.

o1nk is now eight instruments. Each part has its own copy of every parameter (bank, voice, filter, effects, all of it) and a MIDI map: channel (Omni or 1-16), key range low/high, transpose (+/-48) and on/off. A note plays every part that is on and takes its channel and key, moved by that part's transpose, so parts split, layer, or listen on channels of their own. Parts are monophonic, as o1nk was. Ids and addresses are part x 128 + the parameter's own, so part 1 keeps every id and name it had: existing presets, automation and saved state load as part 1 with parts 2-8 off. State stays version 1. Parts 2-8 are named "P2 Cutoff" in modules "Part N/<section>" (AU groups part2-part8), all automatable. - core/o1nk_parts.{h,cpp} and O1NKParts (Swift): the router, kept bit-identical by parity.sh, with new scenarios and two controls (transpose dropped, channel ignored). Part 1 alone renders exactly what o1nk rendered; silent parts cost nothing. Switching a part on or off is settled on the audio thread, so a state load can't reset a kernel mid-render. - CLAP: 264 params, banks shared across parts, per-part voice hand-off, 72 remote pages (each part's UDG pages plus MIDI). The handheld screen has PART n in its title, L2/R2 to change part, and a ninth page: the MIDI table, a row per part. - AU: the tree holds all eight parts; bank and voice are parameters per part (factory presets still set part 1's voice, and the o1nk.lgptVoice state key still restores it by path); MIDI channel from the status byte; scheduled parameter events applied. The view gets a part picker and the MIDI page as an 8-row table. - UDG parity checks the MIDI page, the part count, and the bank list in O1NKBanks. Tests: parity.sh 13 scenarios + 4 controls; o1nk-parts-test 54 checks; tests/lgpt/run.sh with new AU part checks (wavetable engine still byte-identical to origin/main); lgpt.sh; controls-test; udg_parity and opsl_parity; clapcheck conformant on linux arm64; Xcode simulator build. On the RG35XX SP, 8 parts layered with every effect: 206 us a 256-frame block, 3.9% of a core. Wish 04408ee8.
o1nk is now eight instruments. Each part has its own copy of every
parameter (bank, voice, filter, effects, all of it) and a MIDI map:
channel (Omni or 1-16), key range low/high, transpose (+/-48) and on/off.
A note plays every part that is on and takes its channel and key, moved
by that part's transpose, so parts split, layer, or listen on channels
of their own. Parts are monophonic, as o1nk was.

Ids and addresses are part x 128 + the parameter's own, so part 1 keeps
every id and name it had: existing presets, automation and saved state
load as part 1 with parts 2-8 off. State stays version 1. Parts 2-8 are
named "P2 Cutoff" in modules "Part N/<section>" (AU groups part2-part8),
all automatable.

- core/o1nk_parts.{h,cpp} and O1NKParts (Swift): the router, kept
  bit-identical by parity.sh, with new scenarios and two controls
  (transpose dropped, channel ignored). Part 1 alone renders exactly what
  o1nk rendered; silent parts cost nothing. Switching a part on or off is
  settled on the audio thread, so a state load can't reset a kernel
  mid-render.
- CLAP: 264 params, banks shared across parts, per-part voice hand-off,
  72 remote pages (each part's UDG pages plus MIDI). The handheld screen
  has PART n in its title, L2/R2 to change part, and a ninth page: the
  MIDI table, a row per part.
- AU: the tree holds all eight parts; bank and voice are parameters per
  part (factory presets still set part 1's voice, and the
  o1nk.lgptVoice state key still restores it by path); MIDI channel
  from the status byte; scheduled parameter events applied. The view
  gets a part picker and the MIDI page as an 8-row table.
- UDG parity checks the MIDI page, the part count, and the bank list in
  O1NKBanks.

Tests: parity.sh 13 scenarios + 4 controls; o1nk-parts-test 54 checks;
tests/lgpt/run.sh with new AU part checks (wavetable engine still
byte-identical to origin/main); lgpt.sh; controls-test; udg_parity and
opsl_parity; clapcheck conformant on linux arm64; Xcode simulator build.
On the RG35XX SP, 8 parts layered with every effect: 206 us a 256-frame
block, 3.9% of a core.

Wish 04408ee8.
peterswimm deleted branch feat/multitimbral 2026-10-23 21:44:57 +00:00
Sign in to join this conversation.
No reviewers
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
peterswimm/01nk!10
No description provided.