TD-3-MO: translating expansion controls into a plugin
A separate study of expanded 303-style controls, MIDI adaptation, audio-rate inputs and documented capacity differences.
Technical research · edition 2 · reviewed 2026-10-24

Prismal Labs native editor capture, illustrating the corresponding software project. View full-size image
What we found
The TD-3-MO study was most useful where hardware features did not translate directly into plug-in controls. Audio-rate filter modulation cannot be replaced by a stream of MIDI CC values, a chained monophonic instrument is not the same as a polyphonic voice engine, and contradictory storage descriptions should not become an invented firmware layout.
We used the manufacturer guide to identify musical behavior, then made the software mappings explicit. The result is a reusable approach for translating CV-oriented instruments: preserve control meaning, separate audio-rate signals from control-rate messages, and document where the software extends the hardware.
Resolve the capacity discrepancy explicitly
The manufacturer's product page additionally advertises an arpeggiator, pattern capacity of 250 and 16-device Poly Chain. The guide describes 4x8x2 pattern slots; do not claim identical memory capacity from these contradictory descriptions. Include an arpeggiator and expanded storage as product functions even if exact firmware behavior cannot be established from documentation. Do not turn one instance into a polyphonic synthesizer: chain functionality belongs to MIDI output routing.
The implemented memory model preserves the guide's 64 original addresses per bank and adds four software banks (256 total patterns), plus seven 256-entry tracks per bank. These explicit software capacities cover the advertised storage use case without inventing a mapping for an undocumented 250-slot firmware bank. Pattern group restrictions for tracks follow the guide: groups I/II/III supply tracks 1-2/3-4/5-6 respectively; group IV supplies track 7. The native Patterns page now selects the four software banks through parameter 151 / CC 0. State v2 appends that selector and imports v1 with bank one selected.
Evidence: research/tb303/TD3MO-EXTENSIONS.md.
Mapping hardware functions to software
- Base mode restores nominal TB-303 topology and control meanings. In particular, the original Decay knob controls the main/filter envelope, not volume decay. Expansion mode provides the three separate decay controls without silently changing the original panel's automation ID or meaning.
- All synthesis controls, discrete switches, sequencing controls, and former CV/gate inputs receive documented CC assignments and VST3 automation parameters. CC74 remains cutoff. Pitch CV uses CC20/52 and filter CV CC21/53 as optional 14-bit MSB/LSB pairs. Gate/slide/accent use thresholded CC switches.
- MIDI input and the sequencer drive the same monophonic voice. External CC gate can hold the gate; an explicit pitch-input enable selects absolute CC pitch. On release, restore the remaining MIDI/sequence gate state without stuck notes.
- CV, gate and accent outputs become optional MIDI CC output. Bound update rate for continuous pitch, emit edges at their actual offsets, and suppress feedback into the same instance. Output host support requires a separate DAW gate.
- Audio input and audio-rate filter FM cannot be encoded faithfully as CC data. Use optional audio buses for those signals; CC controls their gain/routing. A separate filter audio output corresponds to the physical filter output.
- Host transport replaces USB/DIN clocks in normal plugin use. Retain a CC pulse clock input and internal tempo for externally driven/standalone sequences.
- USB ports, a physical power supply and hardware firmware updating do not become fake software controls. State/preset export and calibration settings provide their relevant software functions.
This is an implementation contract and feature inventory, not a completed-feature claim. Behringer behavior documentation does not establish its transistor values; record assumptions for additions whose component-level schematics are unavailable.
The standalone CC decoder is not sufficient for a VST3 host. Implement
IMidiMapping in the controller and sample-offset parameter queues in the
processor. The 14-bit input pairs need separate raw coarse/fine mapped parameters;
otherwise a host automation value cannot be distinguished from a seven-bit MIDI
coarse value. Apply all inputs at a shared sample timestamp before evaluating a
new gate. Keep those raw adapter parameters separate from user-facing continuous
Pitch CV/Filter CV automation. Do not claim an Ableton CC input/output pass from
the portable encoder/decoder tests.
PL-33 0.2.21 implements the guide's alternative timing method via front Clear/TAP and MIDI CC 24/25. See ../../PL-33/TAP-RECORDING.md for the audio-clock contract and explicit software quantization/metronome policies. Existing CC 103/104 retain pitch-enable and output-enable behavior. This addition does not establish identical TD-3-MO or TB-303 sound.
Evidence: research/tb303/TD3MO-EXTENSIONS.md.
Sample timing and chained controllers
Incoming mapped raw CC values are forwarded to every configured downstream channel at their supplied sample offsets, including controllers unknown locally. Both bytes of the CC20/52 and CC21/53 pairs remain separate messages. Clock CC102 edges retain their offsets and values. Pitch bend is encoded as the SDK's 14-bit LegacyMIDICCOut event, with the low seven bits in value and high seven bits in value2. Its minimum, center, interior and maximum values are tested.
CC119 stays local: forwarding it would change the downstream distributor count. Routing changes at a timestamp are applied before that timestamp's controllers, regardless of host queue insertion order. Controllers then precede note events, so a new downstream note receives its simultaneous control changes first.
Native knob/host patch automation remains local, as distinct from incoming raw MIDI CC. The exceptions are native Panic and All Notes Off presses, which emit CC120/123 to downstream voices as well as releasing tracked notes. Their low button-release values update the parameter without executing the action again. Incoming MIDI CC120/123 retain standard command semantics regardless of value.
Controls sent before chain enable are not cached or broadcast later. Zero-frame parameter flushes do not invent an output timestamp. With no output event list, controls affect the local instrument and are not replayed at a later time. The host must accept the emitted events; rejected or absent host delivery is not buffered. MIDI output feedback/routing is a host setup responsibility.
Evidence: PL-33/MIDI-CHAIN.md.
The implemented synthesis boundary
- Four-times oversampled reverse saw with polynomial band-limited edges drives the Q8 pulse shaper. A phase-related square sub oscillator runs one octave below.
- Four coupled trapezoidal capacitor states with the documented 18/33 nF values, fitted amplifier/coupling poles and five bounded scalar feedback iterations. Independent nominal AC observations cover the reference control point; stage diode curvature, source loading and the full cutoff law remain approximations.
- Original slide retains the analytic 100 kohm / 0.22 uF (22 ms) RC law. Expansion Slide Time extends its time constant to one second. Tune is now a deliberate +/-6-semitone software range around concert pitch; the old provisional supply binding is no longer used in playback.
- Gate edges trigger separate filter and amplitude envelopes. Held-note legato changes pitch without retriggering either. Original Decay affects the filter envelope; the original amplitude envelope has its own fixed decay/release.
- Expansion enables soft attack, independent normal/accent/volume decays, tracking, overdrive, sub level, slide time, sweep speed, accent sweep, audio-output filter FM and two progressively darker soft-clipping Muffler modes. These are authored responses to documented functions, not measured TD-3-MO circuit laws.
- CC filter input affects cutoff; gate, slide, accent and absolute pitch keep the established MIDI contract. Optional audio buses are mix input (after VCA), filter FM input and filter input (before VCF). CC22 controls mix/filter input gain; CC23 controls FM gain. External FM requires Expansion enabled.
- Shared
PrismalLabs::Dsp::FirDecimator<4,32>reconstructs main and filter outputs. The processor reports 32 samples of latency. No callback allocation, file I/O, mutex, adaptive subdivision or unbounded convergence loop is introduced. Continuous controls smooth over 3 ms; decay coefficients refresh every 8 samples. Discrete controls change at their supplied sample offset. Tiny states are flushed to avoid denormal slowdowns. A small trigger seed permits self-oscillation.
Evidence: PL-33/REALTIME-ENGINE.md.
Applying the findings
When replacing a CV input with MIDI, define its units, range, enable state and interaction with notes before assigning a CC. Apply the coarse and fine parts of a 14-bit input at their shared sample timestamp before evaluating a new gate. Keep routing selectors local to the router, and propagate note/controller edges only once.
For an audio-rate input, expose an audio bus and use CC only for its gain or routing. For expanded storage, publish the software's actual capacities and migration rules. These choices make a controller useful without implying undocumented hardware compatibility.
Limits and open questions
The software's four banks and MIDI chain are declared translations. The guide does not supply enough component data to claim identical extension circuitry or sound. The reduced playback engine is implemented, with component fidelity and host-specific MIDI forwarding assessed separately.
Primary references
Research provenance
The methods and results above are drawn from these retained research records. Dates and product versions inside the article identify the scope of each experiment; publication review does not mean the hardware or numerical tests were rerun.
research/tb303/TD3MO-EXTENSIONS.md— SHA-256942f3916877b737b081231a9e47cd3ad1c9579b4b48d781e34a41eed22cefad6PL-33/MIDI-CHAIN.md— SHA-2560bd1b87d7de7997f91e4812f88a3da61fcf33e60060753189175022bb33036f6PL-33/REALTIME-ENGINE.md— SHA-256871b9f90bd489fc06e9f0701827f98251f160af8bdda5f7ab5a755b229270b0f
