Divider oscillator: a channel's top-octave generator, and keys that tap it instead of owning a phase #110

Open
opened 2026-10-04 22:02:29 +00:00 by bcox · 0 comments
Owner

bcox asked on 2026-10-04 whether the tonewheel tuning is a string-synth divider (it is not) and then for a ticket to build one, after the ARP Solina and the Korg Trident's string section. Nothing here is built, measured or listened to. The claims about the engine are from reading the tree at 7c821944 on phaser. The claims about the hardware are from memory, with no source read in that session; treat every one as unverified until a spec cites something.

Summary

A divider oscillator is one free-running generator for a whole channel, which every key taps. Tymbal has nothing shaped like that today: every pitched thing in the VA layer is a phase accumulator a voice owns and resets at its own note-on.

  • The generator is twelve top-octave pitches, one per pitch class, that run whether or not a key is down.
  • A key is a pitch class and an octave: the top-octave position shifted right by the octave. It owns no phase.
  • What that buys is the string machine's character. Octaves are exact and phase-locked across the whole keyboard, the same key struck twice continues the same waveform, and a chord's phase relationships do not change from one playing to the next.
  • What it costs is everything per-voice about pitch: no per-note bend, vibrato, detune or unison. Pitch modulation moves the generator, so it moves every key at once.

What is here, and why none of it is this

Thing Where Why it is not a divider
VaFootage::kFeet, 16'/8'/4'/2' dsp/va_footage.h:35, used by patches/poly800_strings.h Each foot is its own accumulator. The feet start in phase at note-on (dsp/va_oscillator.h:1279-1296) and the spread lane pulls them apart. Nothing is shared between keys.
VaTuning::kTonewheel dsp/va_footage.h:252-293 A wheel is picked per foot per note and runs on the voice's own accumulator at the gear table's pitch. Two keys on the same wheel are two phases.
The compartment partner dsp/va_footage.h:53-58 Read from the wheel's own position, so it is exact, but it is leakage inside one foot.
DivideLockTap dsp/va_oscillator.h:970-981 A real division by 2^1 to 2^4 of another oscillator's position. It is the right arithmetic, but it runs inside one voice, between that voice's oscillators.
free_run dsp/va_oscillator.h:1279 Skips the note-on phase reset. The accumulators are still the voice's own.

DivideLockTap is the piece to reuse: a divider's octave is that shift, applied to a position the channel owns instead of one the voice owns.

The work

1. A channel-owned generator

  • Twelve positions per channel, advanced once per sample, never reset by a note.
  • The allocator already hands every voice on a channel that channel's shared sources one sample late (kSharedExternalInput, kSharedSidechain, kSharedChannelLoad, per CLAUDE.md's dsp/ paragraph). The generator's twelve positions are the same kind of thing, and would travel the same way.
  • The position has to be wide enough that the lowest octave's shift still leaves a full Q0.32 phase. LockTap carries a phase and a wrap count for exactly this reason.

2. A tap as an oscillator source

  • A voice resolves its key to a pitch class and a shift at note-on, and reads position[class] >> shift per sample.
  • A divided position is a whole phase, so every phase shape the VA oscillator already has works on it, band-limiting included: the increment is the generator's, shifted the same way.
  • Whether the hardware's own waveform is worth modelling is a separate choice. A flip-flop divider gives squares; how the Solina and the Trident got from squares to a string tone is a hardware claim this ticket does not make.
  • Footages fall out for free: a 4' and a 16' are the same class at other shifts, locked by construction. That is what kFeet imitates today with a note-on phase match.

3. Tuning

There are two honest versions, and the spec should pick or offer both.

  • Twelve tempered increments. Simple, and in tune.
  • One master and twelve integer divisors, as a top-octave generator chip does. The integer table is the instrument's temperament error, the same role the gear table plays for the tonewheel in dsp/va_footage.h:132. The table must come from a datasheet; none was read for this ticket, and the repo has no divider in the audio path, so the division would be a counter per class and not a divide.

4. Keying

  • A tap has no phase to start at, so a note-on lands wherever the generator is. A hard gate there is a click.
  • The hardware's answer is a per-key attack/release keyer. #108 already names this ("a short AR in the front half is not optional") and its "Omni strings" row is this ticket's oscillator under that ticket's split.

5. How many keys

This is the main open design question.

  • Voice-scope taps. A key is still a pool voice, with its envelope and its slot. Cheap to build, since only the oscillator's phase source changes. Polyphony stays the pool's, which is not a string machine's "every key".
  • A channel-scope layer that keys all of them. One layer renders every held key from the generator, each through its own keyer. That is full polyphony at one voice's pool cost, but a channel-scope layer has one held voice and no per-key state today, so it needs a key table and a keyer per key.

What falls outside

  • The shared filter and VCA are #108.
  • The ensemble chorus is most of what a Solina sounds like and is an effect, not this oscillator. It wants its own ticket or a line in #105; that issue was not read for this one.
  • The Trident's other sections. Only its string section is in scope here.

Open questions

  • Is the generator a new VaShape/phase source inside the VA layer, or an engine of its own?
  • One generator per channel, or one per layer slot? Two divider layers at different tunings in one patch need two.
  • Does channel pitch bend move the generator? It is the only pitch control the hardware has, and it is channel-wide by construction.
  • What an MPE member channel's per-note bend means for a tap. The plain answer is that it reaches nothing.
  • Fabric price. A tap is a bit select on a shared register, so it should cost less than an accumulator per voice, but nothing has been fitted and docs/superpowers/ledgers/2026-10-03-fabric-prices.md is the only place a price is stated.

What a test would hold

  • Two keys an octave apart render positions that differ by exactly one shift, sample for sample, at any note-on times.
  • A key released and struck again continues the generator's phase and does not restart it.
  • A note on one key does not move a sample of another key's tap.
  • Each with its injection: a tap that keeps its own accumulator passes the first only when both keys start on the same sample.

Addendum, 2026-10-05: what the third set of instruments says, and the Polymoog's two generators

From the research recorded in bcox's moregaps.md that day, read as archive.org OCR of the manuals by research agents and not re-checked here. Nothing built.

The Polymoog, which this ticket's shape does not cover

The Polymoog's 1976 owner's manual describes two divide-down ranks, not one: a sawtooth rank at 8' or 4' and a square rank at 16' or 8'. The square rank is either locked to the sawtooth rank or free; free, it has its own tuning over nine semitones and a beat against the other. Each rank has its own FM LFO, and in lock the square's FM becomes phase modulation against the sawtooth. The square's duty runs 5 to 50 percent with its own LFO. Every key then has an amplifier and a filter of its own (71 of each by Sound On Sound's count), and one shared VCF and the resonators sit after the sum.

Against the ticket as written: "a channel-owned generator" is one generator per channel. The Polymoog wants two per patch, each with its own tuning and its own pitch modulation, with lock as the case where the second is a shifted tap of the first. Two generators per channel, or a generator per layer slot, each with its own tuning and modulation, is the shape that covers it; a locked pair is then the ticket's one generator read twice.

Evidence for and against the ticket's hardware claims

  • Omni and Omni-2, confirmed: the service manual describes a master oscillator near 500 kHz into an LSI top-octave divider, then CD4520 binary dividers to a square wave per key, each differentiated and diode-clipped into a sawtooth-like wave. That is this ticket's shape. The manual names the chips and gives no divisor table.
  • Solina, unverified: no primary source was read. Wikipedia's wording is "twelve discrete tone generators with octave divide-down", which is not a single master and twelve divisors; a search summary gave a crystal and a divider cascade instead. Whether keys are articulated one by one or share one envelope was not settled either.
  • Trident, Lambda, Delta: none of the three owner's manuals says divide-down. The Lambda's "252 oscillators" and the Trident's signal-generator board are the nearest evidence; the Delta's and Trident's shared-filter behavior is #108's.
  • Quadra: the strings and poly synth sections are the same generator as the Omni's by lineage; the service manual's OCR did not settle it.

What falls outside, restated

The ensemble chorus (#105, as three delay layers), the shared filter and envelope (#108, amended the same day), and the Polymoog's per-key filters and resonators (#122) are the rest of those instruments; this ticket stays the generator.

bcox asked on 2026-10-04 whether the tonewheel tuning is a string-synth divider (it is not) and then for a ticket to build one, after the ARP Solina and the Korg Trident's string section. **Nothing here is built, measured or listened to.** The claims about the engine are from reading the tree at `7c821944` on `phaser`. The claims about the hardware are from memory, with no source read in that session; treat every one as unverified until a spec cites something. ## Summary A divider oscillator is one free-running generator for a whole channel, which every key taps. Tymbal has nothing shaped like that today: every pitched thing in the VA layer is a phase accumulator a voice owns and resets at its own note-on. - **The generator** is twelve top-octave pitches, one per pitch class, that run whether or not a key is down. - **A key** is a pitch class and an octave: the top-octave position shifted right by the octave. It owns no phase. - **What that buys** is the string machine's character. Octaves are exact and phase-locked across the whole keyboard, the same key struck twice continues the same waveform, and a chord's phase relationships do not change from one playing to the next. - **What it costs** is everything per-voice about pitch: no per-note bend, vibrato, detune or unison. Pitch modulation moves the generator, so it moves every key at once. ## What is here, and why none of it is this | Thing | Where | Why it is not a divider | |---|---|---| | `VaFootage::kFeet`, 16'/8'/4'/2' | `dsp/va_footage.h:35`, used by `patches/poly800_strings.h` | Each foot is its own accumulator. The feet start in phase at note-on (`dsp/va_oscillator.h:1279-1296`) and the spread lane pulls them apart. Nothing is shared between keys. | | `VaTuning::kTonewheel` | `dsp/va_footage.h:252-293` | A wheel is picked per foot per note and runs on the voice's own accumulator at the gear table's pitch. Two keys on the same wheel are two phases. | | The compartment partner | `dsp/va_footage.h:53-58` | Read from the wheel's own position, so it is exact, but it is leakage inside one foot. | | `DivideLockTap` | `dsp/va_oscillator.h:970-981` | A real division by 2^1 to 2^4 of another oscillator's position. It is the right arithmetic, but it runs inside one voice, between that voice's oscillators. | | `free_run` | `dsp/va_oscillator.h:1279` | Skips the note-on phase reset. The accumulators are still the voice's own. | `DivideLockTap` is the piece to reuse: a divider's octave is that shift, applied to a position the channel owns instead of one the voice owns. ## The work ### 1. A channel-owned generator - Twelve positions per channel, advanced once per sample, never reset by a note. - The allocator already hands every voice on a channel that channel's shared sources one sample late (`kSharedExternalInput`, `kSharedSidechain`, `kSharedChannelLoad`, per CLAUDE.md's `dsp/` paragraph). The generator's twelve positions are the same kind of thing, and would travel the same way. - The position has to be wide enough that the lowest octave's shift still leaves a full Q0.32 phase. `LockTap` carries a phase and a wrap count for exactly this reason. ### 2. A tap as an oscillator source - A voice resolves its key to a pitch class and a shift at note-on, and reads `position[class] >> shift` per sample. - A divided position is a whole phase, so every phase shape the VA oscillator already has works on it, band-limiting included: the increment is the generator's, shifted the same way. - Whether the hardware's own waveform is worth modelling is a separate choice. A flip-flop divider gives squares; how the Solina and the Trident got from squares to a string tone is a hardware claim this ticket does not make. - Footages fall out for free: a 4' and a 16' are the same class at other shifts, locked by construction. That is what `kFeet` imitates today with a note-on phase match. ### 3. Tuning There are two honest versions, and the spec should pick or offer both. - **Twelve tempered increments.** Simple, and in tune. - **One master and twelve integer divisors**, as a top-octave generator chip does. The integer table is the instrument's temperament error, the same role the gear table plays for the tonewheel in `dsp/va_footage.h:132`. The table must come from a datasheet; none was read for this ticket, and the repo has no divider in the audio path, so the division would be a counter per class and not a divide. ### 4. Keying - A tap has no phase to start at, so a note-on lands wherever the generator is. A hard gate there is a click. - The hardware's answer is a per-key attack/release keyer. #108 already names this ("a short AR in the front half is not optional") and its "Omni strings" row is this ticket's oscillator under that ticket's split. ### 5. How many keys This is the main open design question. - **Voice-scope taps.** A key is still a pool voice, with its envelope and its slot. Cheap to build, since only the oscillator's phase source changes. Polyphony stays the pool's, which is not a string machine's "every key". - **A channel-scope layer that keys all of them.** One layer renders every held key from the generator, each through its own keyer. That is full polyphony at one voice's pool cost, but a channel-scope layer has one held voice and no per-key state today, so it needs a key table and a keyer per key. ## What falls outside - **The shared filter and VCA** are #108. - **The ensemble chorus** is most of what a Solina sounds like and is an effect, not this oscillator. It wants its own ticket or a line in #105; that issue was not read for this one. - **The Trident's other sections.** Only its string section is in scope here. ## Open questions - Is the generator a new `VaShape`/phase source inside the VA layer, or an engine of its own? - One generator per channel, or one per layer slot? Two divider layers at different tunings in one patch need two. - Does channel pitch bend move the generator? It is the only pitch control the hardware has, and it is channel-wide by construction. - What an MPE member channel's per-note bend means for a tap. The plain answer is that it reaches nothing. - Fabric price. A tap is a bit select on a shared register, so it should cost less than an accumulator per voice, but nothing has been fitted and `docs/superpowers/ledgers/2026-10-03-fabric-prices.md` is the only place a price is stated. ## What a test would hold - Two keys an octave apart render positions that differ by exactly one shift, sample for sample, at any note-on times. - A key released and struck again continues the generator's phase and does not restart it. - A note on one key does not move a sample of another key's tap. - Each with its injection: a tap that keeps its own accumulator passes the first only when both keys start on the same sample. ## Addendum, 2026-10-05: what the third set of instruments says, and the Polymoog's two generators From the research recorded in bcox's `moregaps.md` that day, read as archive.org OCR of the manuals by research agents and not re-checked here. Nothing built. ### The Polymoog, which this ticket's shape does not cover The Polymoog's 1976 owner's manual describes two divide-down ranks, not one: a sawtooth rank at 8' or 4' and a square rank at 16' or 8'. The square rank is either locked to the sawtooth rank or free; free, it has its own tuning over nine semitones and a beat against the other. Each rank has its own FM LFO, and in lock the square's FM becomes phase modulation against the sawtooth. The square's duty runs 5 to 50 percent with its own LFO. Every key then has an amplifier and a filter of its own (71 of each by Sound On Sound's count), and one shared VCF and the resonators sit after the sum. Against the ticket as written: "a channel-owned generator" is one generator per channel. The Polymoog wants two per patch, each with its own tuning and its own pitch modulation, with lock as the case where the second is a shifted tap of the first. Two generators per channel, or a generator per layer slot, each with its own tuning and modulation, is the shape that covers it; a locked pair is then the ticket's one generator read twice. ### Evidence for and against the ticket's hardware claims - **Omni and Omni-2, confirmed**: the service manual describes a master oscillator near 500 kHz into an LSI top-octave divider, then CD4520 binary dividers to a square wave per key, each differentiated and diode-clipped into a sawtooth-like wave. That is this ticket's shape. The manual names the chips and gives no divisor table. - **Solina, unverified**: no primary source was read. Wikipedia's wording is "twelve discrete tone generators with octave divide-down", which is not a single master and twelve divisors; a search summary gave a crystal and a divider cascade instead. Whether keys are articulated one by one or share one envelope was not settled either. - **Trident, Lambda, Delta**: none of the three owner's manuals says divide-down. The Lambda's "252 oscillators" and the Trident's signal-generator board are the nearest evidence; the Delta's and Trident's shared-filter behavior is #108's. - **Quadra**: the strings and poly synth sections are the same generator as the Omni's by lineage; the service manual's OCR did not settle it. ### What falls outside, restated The ensemble chorus (#105, as three delay layers), the shared filter and envelope (#108, amended the same day), and the Polymoog's per-key filters and resonators (#122) are the rest of those instruments; this ticket stays the generator.
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#110
No description provided.