Reverb · Hall
Custom FDN reverb "Hall", reverb sends on Synth 1, Synth 2 and MIDI 1. Compare with "Stock delay + reverb" below.
Independent offline research notebook
Turn the DSP research into musical engines with useful preset libraries, then test four logical synth tracks sharing the existing finite voice pool without sacrificing safe rollback.
CPU-emulated DSP output
Matched stock-program probes plus clean-room DSP56300 algorithm kernels. Headphones recommended.
Custom FX · 14 Oct 2026
The first custom effects built to actually run on the Circuit: code and settings in the DSP's internal memory, only the tape echo buffer in external memory (16-bit audio). They sit alongside stock: FX view pad 32 opens a Custom FX page with 8 reverb and 8 tape delay presets (each takes the stock slot while chosen, fed by the same sends), plus lo-fi and chorus presets per Synth/MIDI track. With everything off, the output is bit-identical to the build without them. The same phrase, stock patches with a pluck on MIDI 1, rendered through the whole emulated firmware. Not heard on hardware yet.
Custom FDN reverb "Hall", reverb sends on Synth 1, Synth 2 and MIDI 1. Compare with "Stock delay + reverb" below.
Custom FDN reverb "Plate", reverb sends on Synth 1 and MIDI 1.
No custom FX, no sends. The reference for everything below.
Synth 1 Cassette, Synth 2 Warm tape, MIDI 1 Worn tape.
Synth 1 12-bit, Synth 2 Old sampler, MIDI 1 8-bit.
Synth 1 Radio, Synth 2 and MIDI 1 Dusty blend.
Synth 1 Juno I, Synth 2 Juno II, MIDI 1 Juno I+II.
Synth 1 Ensemble, MIDI 1 Slow wide.
Stock effects only, for comparing with the tape delays.
Delay sends on Synth 1, Synth 2 and MIDI 1.
Delay send on MIDI 1 only.
Delay sends on Synth 1 and MIDI 1.
Lo-fi and chorus on three tracks, tape delay "Wide tape", custom reverb "Chamber" with sends at half. Re-rendered with the custom reverb.
Real DX7 engine · 14 Oct 2026
The old DX7 engine is gone; this is the only one now. Each card plays the same phrase three ways: the reference DX7 (msfa), our whole firmware in the emulator, and our firmware with the extra-voice fix (DX7 notes no longer also run a hidden stock voice, so the DSP's overload guard drops far fewer notes). Factory ROM voices, dry, no reverb, level-matched. Single notes match the reference on pitch, harmonics and loudness for keys, bell and bass. Brass has the right pitch and harmonics, but some notes are up to 4.3 dB off in body or tail. Still not like a real DX7: vibrato and tremolo, a small operator tuning offset (being fixed). Emulator only, not yet measured on hardware.
153 notes. Without the extra-voice fix the stock overload guard drops 15 notes and cuts 22 held ones short; with it, 2 and 3.
Reference DX7 (msfa, the engine inside Dexed)
Our firmware as it stands (whole firmware, emulated)
Our firmware + extra-voice fix (next build)
After the fidelity pass: exact DX7 tuning, shared vibrato (14 Oct)
60 notes. With the extra-voice fix, 0 dropped and 1 cut short.
Reference DX7 (msfa, the engine inside Dexed)
Our firmware as it stands (whole firmware, emulated)
Our firmware + extra-voice fix (next build)
After the fidelity pass: exact DX7 tuning, shared vibrato (14 Oct)
89 notes. Nothing dropped in either version.
Reference DX7 (msfa, the engine inside Dexed)
Our firmware as it stands (whole firmware, emulated)
Our firmware + extra-voice fix (next build)
After the fidelity pass: exact DX7 tuning, shared vibrato (14 Oct)
100 notes. 3 dropped and 4 cut short, or 1 and 2 with the extra-voice fix. Still off: operator tuning differs from a DX7 by up to 0.2 cents, so the beating between operators drifts (body up to 4.3 dB off). Being fixed.
Reference DX7 (msfa, the engine inside Dexed)
Our firmware as it stands (whole firmware, emulated)
Our firmware + extra-voice fix (next build)
After the fidelity pass: exact DX7 tuning, shared vibrato (14 Oct)
New engine · 13 Oct 2026
A plucked-string engine with live excitation (no stored samples), on the new shared filter/envelope/LFO block. The bank has 32 presets in 7 groups (harps and koto, guitars, mallets and tines, basses, synth plucks, plucked pads, lo-fi), checked so no two are near-duplicates and kept warm (no harsh top end). Start with the tour, which plays 18 presets back to back. Everything is played by the exact DSP code in firmware 4680 (emulator only; nothing on hardware yet).
18 presets back to back on one 2-bar phrase: Concert Harp, Koto, Nylon Classical, Steel Acoustic, Twelve String, Jazz Archtop, Kalimba, Wood Marimba, Music Box, Glass Celesta, Finger Bass, Bright Synth Pluck, Soft Synth Pluck, Trance Detune Pluck, Bell Pluck, Glass Pad Pluck, Tape Wobble Pluck, Dusty Kalimba. Listen for: Whether each change is a genuinely different instrument (not a slight tweak). Which ones you'd keep.
Tape Wobble Pluck, Telephone Pluck, Dusty Kalimba, with an Upright Pizz bass. Listen for: Tape wobble should waver like worn tape without sounding out of tune; telephone is deliberately narrow.
Warm Pluck Pad, Glass Pad Pluck, Evolving Strum Pad. Listen for: Slow swells that still start with a pluck; the filter breathing / sweeping.
Bright Synth Pluck, Soft Synth Pluck, Resonant Zap, Trance Detune Pluck + Hollow Square Pluck, Bell Pluck, over a Sub Pluck bass. Listen for: House/trance-style plucks: the filter "snap" on Bright, the wide detune on Trance, the squelch on Resonant Zap.
Palm Mute Bass, Upright Pizz, Finger Bass, Sub Pluck, Slap Funk Bass (quiet pluck chords behind). Listen for: Low notes in tune and solid (the bottom octave runs on the half-rate string); short vs sustained basses.
Kalimba, Mbira Buzz, Wood Marimba, Music Box, Glass Celesta, Tongue Drum. Listen for: Hollow, bell-like tones from the "stiff string" setting; the mbira rattle; marimba should be a soft warm thock.
Nylon Classical (fingerpicking), Bossa Thumb, Steel Acoustic (strum), Twelve String (strum), Jazz Archtop (comping). Listen for: Warm nylon vs brighter steel; the twelve-string shimmer; whether strums sound like strings rather than synths.
Concert Harp (arpeggios), Celtic Harp, Koto (melody over harp), Dulcimer Shimmer. Listen for: Long harp ring and soft attack; koto's nasal bite and late vibrato; dulcimer's beating shimmer.
New · 13 Oct 2026
Six warm background generators (wind, rain, vinyl, tape & room, swells & risers, ocean), aiming at the soft bed under Ben Böhmer’s “Hiding”. Every foley sound is real DSP56300 code run in the emulator and matched bit for bit against its model, with live noise that never loops. Start with the three in-context clips and the no-foley reference. Not in firmware yet: tell us which you’d use.
Wind on the left with gusts on bars 1, 9 and 17, soft vinyl on the right, breath swells in the intro and a 4-bar riser through the breakdown that lands on the drop. Listen for air you feel more than hear once the kick is in.
Light rain on the left, tape hiss and a distant-room murmur on the right, breath swells and the riser. At the breakdown a note makes the rain surge while the kick drops out. Listen for rain that reads as rain, not hiss.
Slow waves in the middle, a thin wind layer on the left, a touch of vinyl on the right. The waves drift against the groove like a real shore: noticeable in the intro and breakdown, barely there in the drop.
The identical music bed with no foley at all, for A/B against the three clips above. The bed is a quick synthesised sketch made for these demos (pad, pluck, sub bass, soft kick), not a Circuit engine.
Noise through five resonances tuned to the scale (here F minor: F, Ab, C, Eb, G at 1.4–3.1 kHz), each drifting in level on its own, so the air shimmers in key with the music. On the Circuit it would follow your Scales setting. Inspired by the pitched, in-key air under “Hiding”. A resonance knob makes it less glassy.
Soft moving air; the band wanders by itself, and notes at 5, 14 and 20 s raise gusts. Should feel like distant wind, never like hiss.
The same wind run on both strips 3 and 4 with different seeds, panned left and right. Compare the width with the mono wind clip.
Drizzle that swells into steadier rain: a note-on surge at 8 s and heavier settings from 15 s. Drops are now short, soft, unpitched taps: no more robot-bird tweets.
Crackle that never loops (every click has its own size and shape), soft hiss, low rumble, slow drift. A dust burst at 9 s; denser crackle from 16 s. This is the fix for August’s “sounded like a loop”.
Warm, slightly wavering tape hiss plus a muffled “people in another room” murmur. A note at 10 s brings the room forward; from 18 s the murmur is nearer.
Breath swells, then a riser from bar 9: a resonant band sweeps up about four octaves, it builds in loudness, and a tempo-synced pulse speeds up from 8ths to 32nds, peaking on bar 13 and stopping dead.
Distant surf, each wave with its own random length and size; a note at 21 s forces a big wave.
DX7 fix · 13 Oct 2026
Two bugs made our DX7 near-sine. (1) The importer used modulation about 15 dB too gentle, ignored half the envelope settings and ignored key scaling. It now follows msfa, the open engine inside Dexed. (2) The engine's sine on the box peaked at half height, halving every modulation depth. Each card has four versions: as on your box now; the new card bank only (a file swap, works on 4672 today); the new bank plus the 6-word engine fix (needs a new build, about 6 dB louder); and FM4. Measured against a real-DX7 reference, the brightness error falls from 0.24 to 0.11 octave (bank only) and to 0.06 octave (bank plus engine fix).
The tine comes back: strong 2nd–5th harmonics instead of near-sine, and it decays like a DX7 instead of holding like an organ.
DX7 as on your box now
DX7, new card bank only (works on 4672 today)
DX7, new bank + engine fix (needs a new build)
FM4 for comparison
Brightness goes from 600 Hz to about 2.1 kHz, close to a real DX7, with the metallic ring restored.
DX7 as on your box now
DX7, new card bank only (works on 4672 today)
DX7, new bank + engine fix (needs a new build)
FM4 for comparison
From a dull 93 Hz thud to a defined bass (~310 Hz brightness, matching a real DX7).
DX7 as on your box now
DX7, new card bank only (works on 4672 today)
DX7, new bank + engine fix (needs a new build)
FM4 for comparison
Only a little brighter. This patch is genuinely dark on the engine because one modulator feeds three carriers.
DX7 as on your box now
DX7, new card bank only (works on 4672 today)
DX7, new bank + engine fix (needs a new build)
FM4 for comparison
A/B · 13 Oct 2026
Same phrase, same reverb, loudness-matched, each engine on its best-fitting patch from the libraries the device uses. Cost: one DX7 voice ≈ two FM4 voices (with all custom FX: 8 FM4 voices vs 4 DX7). Important caveat: rendering these showed our DX7 import is too gentle. Its modulation depth is capped well below a real DX7, which makes many voices near-sine and dull, and envelopes are simplified. So the DX7 side here undersells the engine. The fixed DX7 is in the section above.
FM4 has a glassier tine; the DX7 side is rounder, near-sine, and barely decays (organ-like on held chords). Same 16-bar phrase (Fmaj9 | Em9 | Dm9 | Cmaj9, 120 BPM), loudness matched.
FM4
DX7 (6-op)
The DX7 has a short inharmonic strike over a pure ring; FM4 is about twice as bright with a sustained shimmer. Same 16-bar phrase (Fmaj9 | Em9 | Dm9 | Cmaj9, 120 BPM), loudness matched.
FM4
DX7 (6-op)
DX7: a short, deep pluck, mostly below 250 Hz (thin on a phone). FM4: brighter and sustained, cuts through small speakers. Same 16-bar phrase (Fmaj9 | Em9 | Dm9 | Cmaj9, 120 BPM), loudness matched.
FM4
DX7 (6-op)
DX7 starts mellow and swells open over ~0.4 s; FM4 is brassy from the attack but changes less. Same 16-bar phrase (Fmaj9 | Em9 | Dm9 | Cmaj9, 120 BPM), loudness matched.
FM4
DX7 (6-op)
Wavetables · rendered Aug 2026
About a third of your 256 patches (dnb, keys, sunsets) use the stock synth’s wavetable slots, so swapping in new tables would change their character with no new patches needed. These clips play three of your patches through nine different tables each. Caveat: timbre studies only. The patch’s filter, macros, chorus and effects aren’t applied, so judge the oscillator colour, not the finished sound. Never on the device yet. The separate “Prototype · wavetable pads” card further down is the other wavetable demo.
The same 4-second phrase on your keys patch “ACOUSTIC PIANO”, swapping only the wavetable. “Synthetic saw” is the plain reference.
Synthetic saw control: bright geometric reference
Tube: rounded, warm movement
Solid: firm but restrained harmonics
Hollow FM: glassy and hollow
Fold: brighter folded edge
Boys Choir: soft vocal/formant colour
Hammond L-103: organ-like harmonic body
Moog Filtered Saw: dark analogue saw colour
Prophet High Pipe: airy digital pipe colour
The same 4-second phrase on your dnb patch “SoftPad”, swapping only the wavetable. “Synthetic saw” is the plain reference.
Synthetic saw control: bright geometric reference
Tube: rounded, warm movement
Solid: firm but restrained harmonics
Hollow FM: glassy and hollow
Fold: brighter folded edge
Boys Choir: soft vocal/formant colour
Hammond L-103: organ-like harmonic body
Moog Filtered Saw: dark analogue saw colour
Prophet High Pipe: airy digital pipe colour
The same 4-second phrase on your sunsets patch “Circuit Strings”, swapping only the wavetable. “Synthetic saw” is the plain reference.
Synthetic saw control: bright geometric reference
Tube: rounded, warm movement
Solid: firm but restrained harmonics
Hollow FM: glassy and hollow
Fold: brighter folded edge
Boys Choir: soft vocal/formant colour
Hammond L-103: organ-like harmonic body
Moog Filtered Saw: dark analogue saw colour
Prophet High Pipe: airy digital pipe colour
A phrase played through the Circuit's built-in global delay — captured from the real firmware running in our emulator. The 'before' side, for comparing against our replacement. Emulator-only, no hardware was touched.
The same phrase, the same firmware, but the delay socket has been swapped for our own darkening, gently saturating ping-pong tape delay via a live switch (one command always restores the original). Same notes, same settings — only the delay is different. This is the second effect we've dropped into the emulated firmware's own effect chain, after the FDN reverb. Emulator-only, no hardware was written.
The real thing: a full six-operator FM engine with five DX7 algorithms and per-note envelopes, rendering actual DX7 voices (EP, bell, bass, pad, strings, glockenspiel) at full fidelity. This is what the buzzy 4-operator Finetales conversions were approximating — A/B them. Measured cost fits about 8 rich voices at once.
The warm song through a lush three-voice chorus — the classic Juno ensemble shimmer that makes thin sounds wide and expensive. Wide stereo. Compare with the dry 'A side' higher up.
The warm song run through a lo-fi channel: tape-style wow/flutter wobble, reduced sample rate and bit depth, a soft filter, and a quiet vinyl-crackle bed. Dusty and warm.
A sustained chord into a shimmer reverb — our lush reverb with an octave-up sparkle folded back into the tail, the big angelic ambient sound. Wide stereo.
A sustained chord with a four-on-the-floor ducking pump at 120 BPM — the breathing house/melodic-techno movement, without needing a kick track to trigger it.
A Hammond-style drawbar organ: nine tuned tones stacked per note with a percussive key-click. Three patches in one clip — fat gospel chords, a hollow jazzy comp, then bright stabs. Every sample verified.
Seven detuned saws plus a sub per note — the big trance/dnb wall of sound. Three patches: a wide lead, a tight detuned bass, and a mellow pad. Clean and dynamic, no clipping.
A chiptune voice: pulse waves with switchable duty, a triangle, and true LFSR noise for percussion, with fast arpeggios. Three patches — NES-style arp lead, square bass, and a noise-drum + triangle-sub groove.
A brand-new plucked-string engine: harp rolls, a koto-like descent and short kalimba accents over a long ringing drone, in A minor. Made by a tiny amount of code (the smallest engine yet). Every sample verified. Tell me if it earns a place.
The warm song's opening bars through a new tape-style delay: echoes bounce left-to-right, and each repeat gets darker and gently saturated like real tape. Compare with the dry 'A side' higher up the page. (A subtle tape 'wobble' was left out for now to keep everything exactly verified.)
A slowly-breathing ambient pad that morphs between five hand-drawn wave shapes, dark to bright and back, in wide stereo. Sixteen seconds, every sample verified. A glassy, evolving sound the stock machine can't make.
The melodic-house atmosphere layer you asked about: an airy wind bed with slowly opening and closing filters, vinyl-dust crackle, and a long riser that builds and dissolves. No musical notes — it sits under a track. This would become a global effect, varied per track rather than a synth patch.
Nineteen seconds of warm electric piano, bass, slow pads and soft bells, all played by our new FM engine in the test lab. Every audio sample was double-checked against an independent calculation. This is the sound the real in-firmware engine is being upgraded toward.
The first two bars of the warm song with no effects at all. Use this as the 'before' when judging the reverb and tape-delay demos below.
The same two bars through our new reverb: four echo lines that blur into a soft, dark tail, in true stereo. Compare with the dry version.
A four-note chord played through an electric-piano patch from a user keys pack, on the stock engine. Heads-up: offline renders substitute the factory waveforms with synthetic ones, so this approximates the stock sound rather than matching it exactly.
The same chord and the very same patch — envelopes, filter and effects untouched — but the tone generator underneath is our FM engine, with smooth waves and brightness that fades naturally as each note rings.
A high three-note chord through the pluckiest patch in the same keys pack, on the stock engine (synthetic waveforms, as above).
The same chord and patch with our FM engine underneath, using a brighter bell-like recipe that softens as it rings.
A low, wide chord through the best pad patch in a user ambient pack, stock engine (synthetic waveforms).
The same chord and pad patch with our FM engine underneath — the patch's own slow fade-in does the pad work; only the tone changed.
The ambient pack's best string-like patch on the stock engine (synthetic waveforms).
The same notes and patch with our FM engine playing a soft string-like tone underneath.
A single low C through the strongest bass patch in a user drum-and-bass pack, stock engine (synthetic waveforms). This patch happens to play quietly in the offline setup.
The same note and patch with our FM bass recipe underneath.
A five-note chord through the drum-and-bass pack's pad-like patch, stock engine (synthetic waveforms).
The same chord and patch with our FM engine underneath.
A held chord with the reverb send turned right up, using the Circuit's built-in reverb — captured from the real firmware running in our emulator. The 'before' side.
The identical chord, but the firmware's reverb has been swapped for ours via a live switch (one command always restores the original). Same notes, same settings — only the reverb is different.
A gentle chord from our FM engine dressed in the factory patch whose envelope and filter best suit an electric piano. Technically verified; whether it's beautiful is your call — that's what these audition clips are for.
A bright, bell-like chord from the FM engine in the best-matching plucky factory patch, with brightness that now fades naturally as notes ring.
A soft low chord from the FM engine in the most string-like factory patch. The Circuit's own filter, chorus and reverb are all still doing their jobs downstream.
A slow-blooming chord: gentle FM tone inside the factory patch with the slowest fade-in.
A single low note from the FM engine in the punchiest factory bass patch.
The two-part FM tone running inside the real firmware path, fully replacing the stock oscillator, with every sample verified.
A classic analogue-style tone — saw, square and a sub-octave underneath — running inside the real firmware path.
The same analogue tone with smarter anti-aliasing: cleaner high notes at lower processing cost.
The analogue engine with adjustable pulse width and a level mixer for its saw, pulse and sub — the controls a Juno-style sound needs.
Live-switch proof for the analogue engine: starts on the stock sound, switches to the new engine mid-recording. One command always restores the original.
One sustained middle C through the completely untouched firmware — the reference everything else is compared against. (Factory waveforms substituted with synthetic ones, as in all offline stock renders.)
The same middle C with the patch's chorus turned up to maximum — proof that changing patch settings works through the real firmware code.
The same middle C with the reverb send at maximum — the built-in reverb heard clearly, useful for comparing against our replacement.
Our first proof that the firmware's reverb can be replaced at all: a deliberately simple echo-smearing effect running where the reverb normally does. An engineering milestone, not a pretty sound — the proper lush reverb came later.
Proof that effects can swap mid-note: this recording starts on the built-in reverb and switches to the replacement exactly one second in, without a glitch.
The first custom sound ever run on this chip in our lab: a plain two-part FM tone. Historic rather than musical.
The original nine-second electric-piano sketch that set the whole direction — the first demo that sounded like music instead of a test tone.
An early stepping-stone experiment, kept for the record. Uses an older pitch mapping and plays an octave low.
Another early stepping-stone, kept for the record. Same older pitch mapping; plays an octave low.
Approximate 4-op reductions
Curated DX7 voices from Finetales' DX Collection, reduced to the two-pair FM4 engine and played through a matched stock shell.
A soft FM electric piano (DX7 “EP 1”) playing a major-7th chord. An approximate 4-operator reduction of the 6-operator DX7 voice from Finetales' DX Collection.
A brighter tine electric piano (DX7 “EP 7”) on a minor-7th chord. Approximate 4-operator reduction of a 6-operator DX7 voice, from Finetales' DX Collection.
A dulcimer-like bell (DX7 “Dulcibell”) ringing a high triad. Approximate 4-operator reduction of a 6-operator DX7 voice, courtesy Finetales' DX Collection.
A metallic bell (DX7 “Rode Bell”) with a sharp modulator ratio, on a spread chord. Approximate 4-operator reduction of a 6-op DX7 voice from Finetales' DX Collection.
A plucked music-box mallet (DX7 “Music Box”) chiming an open triad. Approximate 4-operator reduction of a 6-operator DX7 voice, from Finetales' DX Collection.
A round FM bass (DX7 “Nice Bass”) playing a low root-and-fifth. Approximate 4-operator reduction of a 6-operator DX7 voice, from Finetales' DX Collection.
A synth-brass stab (DX7 “PntrBrass”) on a mid triad. Approximate 4-operator reduction of a 6-operator DX7 voice, courtesy Finetales' DX Collection.
A short pizzicato pluck (DX7 “Melo Pizz”) on a bright triad. Approximate 4-operator reduction of a 6-operator DX7 voice, from Finetales' DX Collection.
A warm FM string section (DX7 “Low Strgs”) holding a wide voicing. Approximate 4-operator reduction of a 6-operator DX7 voice, from Finetales' DX Collection.
An analog-style pad (DX7 “Ana Pad”) on a slow sustained chord. Approximate 4-operator reduction of a 6-operator DX7 voice, from Finetales' DX Collection.
A soft warm pad (DX7 “Warm Pad”) swelling under a low chord. Approximate 4-operator reduction of a 6-operator DX7 voice, from Finetales' DX Collection.
A plucked harpsichord (DX7 “Hrpsichord”) on a keyboard voicing. Approximate 4-operator reduction of a 6-operator DX7 voice, from Finetales' DX Collection.
Evidence ledger
Claims stay deliberately separated from implementation hypotheses.
A new reproducible sweep asks one logical part for 7–12 held notes. The 696-byte STM32 allocator selects every requested slot, changes only that descriptor, preserves its guard and writes every DSP identity exactly. Seven notes produce seven long-running regular oscillator records. From eight through twelve requests, only the newest seven records remain long-running while older records receive brief retirement dispatches. The present hook runs after stock selection, so slot reassignment cannot undo an earlier stock lifecycle decision. Four small logical parts remain viable; twelve sustained notes on one part now has a precise next target: capture and replace the earlier selection/retirement policy. Emulator-only; no hardware was written.
The stock program hard-banks two sets of six voices, so raw part IDs 2/3 remain unsafe. Expected-byte-gated MCU hooks now select a physical slot for note-on, send engine/recipe/logical-part identity to the DSP, and filter note-off by that same slot. The native FM producer decodes recipes 10/20/30/40 with 574,336 exact samples. A 696-byte MCU-resident allocator now derives release, reuse and surplus-steal slots from slotless logical events and drives them through the complete emulated MCU/DSP path at 51.531% of the observed deadline. This is still four oscillator patches sharing two stock buses—not four independent filter/envelope/FX patches—and no hardware was written.
Stock note-off releases every descriptor matching stock bus plus MIDI note, so parts 0/2 or 1/3 would collide. In the control, releasing part 0 note 60 changed both slots 0 and 5. A distinct CTR4 operation at an expected-byte-gated hook filters the stock release block by exact physical slot; the same request then changes only slot 0 and leaves slot 5 intact. The full 2/3/4/3 fixture also releases slot 2 while same-bus/same-note slot 11 survives, reuses slot 2 for another part and recipe, and explicitly reassigns active slot 1. All twelve DSP records complete with zero invalid entries. Invalid or stale mailbox behavior is exactly stock across transport, audio, timing, cycles and instructions. Emulator-only; no hardware was written.
A 696-byte STM32 payload gives four logical parts a soft two-voice reserve and shares the other four voices dynamically. Its slotless mailbox accepts logical part, note, velocity, recipe and engine; the MCU itself selects and records the physical voice. Starting from 2/3/4/3, it releases slot 2, reuses it for another part, and steals slot 5 as the requesting part's oldest surplus voice. All fifteen choices match an independent model, every final DSP identity matches, the SRAM guard stays untouched, and all twelve DSP records complete at 51.531% of the observed deadline. Invalid-mailbox behavior is exactly stock. The SRAM range and payload remain offline-qualified only; a real event dispatcher, interrupt safety and independent downstream patch state are still open. No hardware was written.
All 128 retained 340-byte patch payloads leave the documented 14-byte reserved region empty. A CTX/version/engine extension fits there while the other 326 bytes remain unchanged, preserving filter, envelopes, LFOs, inserts, EQ, modulation matrix and macros. The first conservative mapping yields 25 FM recipes over 128 distinct downstream sound shells: a theoretical 3,200 combinations. A new heuristic audition queue finds 20 electric-piano, 35 bell/pluck, 10 string, 16 pad and 49 bass shell candidates scoring at least 70/100, without publishing patch names or bytes. DX7 packed-bank parsing is implemented, but current four-operator conversion is explicitly approximate.
A bounded runtime recipe override now feeds pair-A/B modulation indices and levels into the native four-operator DSP path. Five private Projects combine authored recipes with the highest-ranked retained electric-piano, bell/pluck, string, slow-pad and bass shells. Their restrained voicings render 96,094 frames each: every native sample matches the independent model, all requested slots and DSP identities match, the five WAVs are non-silent, distinct and contain zero clipped PCM samples, and maximum load remains 50.286%–50.384% of the observed deadline. This proves the shell shortcut reaches audio, not that metrics can judge beauty. Brightness decay and interpolated sine reads landed in the recipe ABI v2 round; ratios, feedback and per-operator envelopes remain unimplemented.
Moved two carrier/modulator pairs into the expected-word-gated producer bypass at P:0x000384 and rejoined the stock downstream path at P:0x000a7f. The independent model checks 53,632 legacy single/dense samples with zero mismatches; the recipe-aware routine uses 2,601–2,654 cycles per 32-sample block. The later coupled four-part run extends exact verification to 574,336 samples across four recipes. This proves integration and throughput, not subjective musical quality; stress audio stays private.
A 9.16-second Cmaj7–G/B–Am7–G–C arpeggio now replaces test-tone listening as the FM target. Two carrier/modulator pairs use separate harmonic ratios and exponential loudness/brightness decay to make a dry electric-piano/pluck voice. The DSP CPU emulator produced all 440,000 samples; every sample and all four final phase words match a separate Q1.23/Q0.24 model, with zero clipping. This proves implementation fidelity, not artistic quality—the published player is intended for subjective feedback before the engine is integrated into the stock envelope, filter and effects path.
The MCU already has a physical DSP reset, complete stock-program reload and an independent whole-device watchdog. A new offline policy model watches a counter produced by the DSP: normal and wrapping counters continue untouched; four frozen observations mute and request the official stock program; any failed read or reload falls back to a complete unit reset. The stock loader itself contains waits with no deadline, so bounded replacements are still required before this becomes executable firmware. No device was contacted or written.
After normal boot and synthetic table generation, the emulator protected all host pages covering X:0x5fc0–0x5fff and every X/Y/P alias covering 0x500000–0x500e01. Forked deliberate accesses proved all four protected mappings fault by SIGSEGV. The parent then completed 1,200 runtime frames, 75 voice dispatches, 76 oscillator passes and 37 reverb/delay passes without touching a protected page. Its instruction/cycle counts, TX digest, voice state, waypoints, signal probes and STM32↔DSP events match an identical unprotected control exactly. This excludes observed stock Core 0 CPU collisions, not physical DMA, independent Core 1 activity, every Project/mode or real-hardware ownership; the image remains NOT-FOR-HARDWARE.
Stock build 4486 uploads only 10,846 Core 0 words, so the emulator's upper zero-filled P memory is not automatically present on hardware. A build-only experiment relocates the qualified 15,464-word selector payload and changes only its pointer-table entry inside the original image. Executing the real STM32 selector at 0x08029260 offline makes normal selection request that relocated block while the common block, Core 1 and complete alternate selection remain unchanged. The real packed sender at 0x08029200 then covers all 46,398 bytes as 91 contiguous DMA requests with an exact reconstructed hash. The final DMA/SPI primitive and DSP boot were not executed; the private artifact is explicitly NOT-FOR-HARDWARE and is not served by this site.
A five-word CFX/version-1 mailbox in internal X memory selects stock engine 0 or diffuser engine 1. Existing host W writes change the engine and both all-pass coefficients without rewriting program memory. Selected stock, bad magic, unsupported ABI and unknown engine 7 each reproduce the untouched 7,936-word reverb-output digest exactly. A sustained session switches after 62 stock blocks and verifies the following 62 custom blocks with zero mismatches. The fixed 64-word loop and 0x7fffff coefficient mask bound this kernel; they are not a general execution-time watchdog, and hardware installation remains blocked.
Across 124 matched stock/custom blocks, 18 of 37 observed register families are already identical. The other 19 are each overwritten before their first downstream use; the gate checks the exact build-4486 instructions at those overwrite sites, including R2/R3 and modifier registers in the first downstream callee. Five extracted normal Core 0 payloads end below P:0x3c00 with a minimum 4,514-word margin. Y:0x500d00–0x500d7f does not overlap another native experiment, remains shadow-exact, and now passes the stock Core 0 CPU page-trap test. Physical DMA/Core 1/hardware ownership is still unproven, so installation remains blocked by design rather than attempted.
The mapped call consumes and returns 64 interleaved stereo words per block. A 36-word expected-target-gated patch redirects it to a two-stage diffuser, verifies 7,936 words plus both state banks exactly in single-note and dense runs, preserves active sample drums and delay, and remains below the observed block deadline. The direct routine costs 1,305–1,358 cycles per block versus about 18,500 for stock reverb, leaving substantial room for a richer design. No device was written.
The STM32 initialization, Project activation, live note routine, Core 1 shared-copy service, stock Core 0 program and ESAI output are coupled in one deterministic CPU-emulation profile.
Both projects pin dsp56300 commit c051afa. Gearmulator contributes device-wrapper, debugger, profiling and hash-gated patch patterns—not reusable Virus oscillator source.
Voice accumulation, mix, delay, reverb send/return, master ring and ESAI staging are independently observed. Several one-word offline patches already produce changed-and-restored audio evidence.
The native saw, pulse and sub block now retains the stock pitch preparation, downstream gain controls, filter/envelope voice path, part mixer, delay, reverb and output. Continuous PWM and independent wave levels pass the dense integration gate, and the engine can now be selected through the existing host write transport; table interpolation and guarded hardware qualification remain follow-on work.
A versioned seven-word mailbox in internal X memory drives a 256-entry native dispatcher. Existing host W writes switch the same patched DSP image from stock to engine 2 and back before note rendering; a sustained-note test also commits engine 2 at an exact ESAI frame boundary. Stock selection, bad magic, unsupported version and unknown ID all produce the exact unmodified 7,936-word oscillator digest. After the mid-session commit, custom words remain model-exact and the stock-reader count freezes. No device was written.
The 39-word benchmark produces 256 bit-exact samples at 20.03 instructions / 30.10 modeled cycles each. A separate two-second render matches the independent Q1.23/Q0.24 model for all 96,094 samples. That standalone result did not itself prove integration; later native PM and VA producer-bypass results do.
The 64-slot descriptor and external PCM layout are reconstructed with clean samples. Twelve requested synth notes change all twelve allocator blocks, while four stock drum voices complete 448 renderer blocks with a nonzero interpolation buffer and delay/reverb remain active. The observed maximum is 42,214 / 81,920 Timer ticks (51.53%). A dispatch-pointer trace saw eleven regular sustained/partial voice pointers, so this is an exact high-activity fixture—not proof of twelve simultaneous synth voices or an exhaustive worst case.
The stock synth queues table reads in one scheduler phase and consumes them in a later phase over the same control records. Both clean saw and square runs reach a common active 32-sample voice buffer before stock part accumulation, and its digest changes with the source waveform. This is the leading offline hook for the clean-room PM or classic-VA kernel.
At the stock voice dispatch, R5 identifies a 96-word allocator record and R3 a 40-word oscillator record. Six controlled notes isolate two exact semitone fields and two phase accumulators; their 32-frame deltas follow equal temperament within 0.0022%. At all 1,134 observed post-oscillator completions, R4 resolves directly to the same voice record with zero invalid entries.
At the mapped P:0x000a7f boundary, the emulator replaces each 32-sample oscillator block with per-voice two-operator PM. The seam and final ESAI digests change, then disabling the replacement restores both exactly. Host-side execution proves the integration contract but does not measure in-program DSP cycle cost.
An expected-word-gated 14-word emulator-only mutation calls an 11-word DSP56300 buffer-inversion routine, restores the displaced stock instructions and returns into the original downstream engine. Across 248 matched entries, the stock seam segment is exactly 4 cycles and the native path 116: a directly measured 112-cycle increment. Audio changes and restores bit-exactly, and the added program words remain unchanged during execution.
The native DSP56300 routine keeps per-voice carrier and modulator state, derives tuning from the stock phase accumulator, renders each 32-word oscillator block and returns through the original downstream engine. Six notes from C3 to G4 track equal temperament within one Q0.24 LSB; all 47,616 pitch-series words and 192,192 words in the playable render match the independent model. Direct added cost is 1,182–1,235 cycles per block.
With both synth parts busy, four clean sample drums, delay and reverb, all 34,176 completed native words remain bit-exact. But native PM reaches 1,070 synth seam entries and 440 drum blocks versus 1,206 and 448 for stock/restored controls in the same 3,971 frames. A nearly unchanged Timer maximum hides this backlog, so optimization is required before hardware or larger engines.
An indexed Y-memory sine table, block-local modulator state and DSP parallel moves reduce the clean kernel from 30.10 to 19.13 cycles per sample and the native seam from 1,186–1,239 to 596–649 cycles per block. All 34,816 dense output words remain bit-exact, while synth-seam completion improves from 88.72% to 92.12% of stock and sample drums from 440 to 444 of 448. This is still a failed gate: the stock oscillator producer must be bypassed or replaced, not followed by another full renderer.
The expected-word-gated native PM path now redirects the original producer call, consumes the upstream per-sample pitch word and enters the stock downstream voice path directly. In the retained 3,971-frame stress fixture it makes zero stock table-reader calls, verifies all 45,696 generated words, completes 1,428 voice blocks versus stock's 1,206, and completes 452 sample-drum blocks versus 448 while delay and stereo reverb remain active. Its routine is 592–645 cycles, has no nested entries and remains emulator-only.
The producer ABI now hosts a clean-room DCO-style mix of band-limited saw, 50% pulse and sub-octave square. The dense run verifies 45,696 generated words with zero mismatches, makes zero stock reader calls, completes 1,428 voice blocks and 452 sample-drum blocks, and retains active delay and stereo reverb. The routine costs 934–987 cycles per 32-word block with no genuine nested entries. It remains emulator-only; its fixed 31-harmonic table is not yet a keyboard-wide anti-aliasing solution.
A 256-word offset lookup selects 63-, 31-, 15- or 7-partial saw/pulse pairs once per native block without unsupported conditional opcodes. The dense run verifies all 45,696 words, completes 1,428 voice and 452 drum blocks, keeps delay/stereo reverb active, and has pending depth one with no nesting. Hoisted bases reduce direct cost to 830–883 cycles from the fixed engine's 934–987.
Possibility map
The order favors bounded experiments that reuse proven stock contracts.
Stored modulation slots 13–20, deep patch fields, effect macros and live setters can add capability without replacing synthesis code.
High value · lower DSP riskA common post-oscillator 32-sample buffer is now measured. Juno-style composite DCO, two-op PM/FM, additive, wavetable and Karplus-Strong modes can target it while retaining the stock downstream voice gain, part accumulation, FX and output path.
Native PM and classic-VA engines both pass the dense producer-bypass gateChorus, tape/modulated delay, diffusion, freeze, reverb variants, dynamics, width and output coloration can run at part or global block rate.
Native diffuser and guarded live selector pass the emulator gateThe populated 64-slot memory model now supports measured work on interpolation, slicing, reverse, transient shaping, per-drum filters, granular playback and clean-room drum synthesis.
Stock renderer active · safe offline testbedFour logical recipes share twelve voices at 2/3/4/3. Configurable logical-track pairing now also maps 6/2/4/0 into stock-safe 6+6 physical banks with a complete release/reuse/steal/retrigger lifecycle. A one-word DSP bypass remains an experimental option for distributions that cannot be paired below six per bus. Four full patch strips still need new envelope/filter/macro/mixer state and persistence.
2/3/4/3 and paired 6/2/4/0 lifecycles proven offlineChronological notebook
Short entries are published when a result changes the working model or creates something audible.
Operator frequencies now come from msfa's own table (all 32,640 operator/key values identical; 35% were before), worked out on the main processor per note. One LFO per part as on a DX7, and a bug that ran sine vibrato at half depth is fixed. Across factory banks 1A and 1B, 559 of 576 test notes now match msfa (was 527) and 59 of 64 voices match on every note (was 48). Brass body error 4.3 → 1.75 dB. Tremolo follows Dexed's curve, which Dexed calls untuned. Each card in "Real DX7 vs our firmware" has a fourth player. Emulator only; dropped notes in these phrases come from the stock overload guard, not the engine.
The old DX7 engine was removed; the firmware now runs only the engine that matches msfa bit for bit in the lab. Played through the whole emulated firmware, single notes match msfa for keys, bell and bass. Brass is up to 4.3 dB off on some notes, from a 0.2-cent operator tuning offset. Across factory ROM banks 1A and 1B, 503 of 576 test notes are in tolerance. A bug capped operator loudness at half the DX7 range in 310 of 384 voice/velocity cases; fixed. Dropped notes in phrases all come from the stock overload guard; skipping the hidden stock voice behind each DX7 note cuts keys drops from 15 to 2. Emulator only, uncalibrated.
From the second listen. Tuned air no longer turns into a whistle: bands are wide and soft and notes no longer sharpen them. Wind is distant: gusts swell over 5–12 s, darker, with no steam-train puffs. Rain is a fine light patter with the low debris wash removed (check it isn't too hissy). Vinyl hiss now wanders like a detuned radio, with the crackle unchanged. Designs follow Farnell’s procedural wind and rain. Still bit-exact on both emulator backends; emulator-only.
After the first listen (“artificial, like a wave”; rain had a robot-bird tweet; the riser sounded like the swells): wind, tape and vinyl now move on three overlapping random drifts instead of one slow swell, and vinyl crackle comes in clusters with quiet stretches. Rain’s rising droplet chirps are gone. The riser sweeps up about four octaves and accelerates into a stop on the bar. New “tuned air” generator: noise through resonances tuned to the scale, the pitched, in-key air measured under the reference track. Still bit-exact on both emulator backends. Emulator-only; no hardware was written.
Six separate atmosphere generators built for the melodic-house “Hiding” brief, each designed to run as a MIDI-track engine on its own mixer strip with level, pan and reverb send. Noise is generated live (a 24-bit LCG that repeats only every ~349 s), so the August crackle loop is gone, and all state sits in small internal memory. Each generator matches its fixed-point model word for word on both emulator backends. Costs 540–2,031 instructions per 32-sample block and 99–135 program words each. Eleven MP3 demos are at the top of Listen. Emulator-only; no hardware was written.
The second effect now runs inside the emulated firmware's own effect chain, after the FDN reverb: a darkening, gently saturating ping-pong tape delay dropped into the stock global-delay socket via a live engine switch (custom engine ID 3). The same phrase is rendered twice — stock delay and our tape delay — as an A/B pair. The tape run is shadow-verified word-for-word against an independent model over 3,003 blocks (192,192 samples, zero mismatches); program memory is unchanged during the run, its delay return is non-silent, and invalid magic/version/ID fall back to bit-identical stock. Emulator-only; no hardware was written.
Two listener-flagged issues fixed and re-rendered: the lo-fi vinyl crackle now sweeps its noise table once so it no longer audibly repeats, and the shimmer reverb's octave-up shifter got a longer crossfade window and gentler feedback to remove the grainy glitches. Both re-verified sample-exact.
A full six-operator FM engine (five DX7 algorithms, per-operator envelopes, feedback) renders real DX7 voices at full fidelity, sample-exactly verified. The benchmark is now measured, not estimated: 13,284 cycles per voice, so roughly 8 full-fidelity voices fit the audio budget (12 needs a leaner mode). This is the real fix for the DX sounds and the reference the 4-op reductions are judged against.
A Juno-style chorus, a lo-fi channel, a shimmer reverb and a sidechain pump — each built and sample-exactly verified in the clean-room lab with full dynamics. Candidates for the held-FX effects layer; thumbs up the keepers.
Drawbar organ, supersaw unison swarm and an 8-bit chip engine — each built and sample-exactly verified in the clean-room lab, each demoed with a few sample patches so you can hear the range. Candidates: give each a thumbs up or down and the winners get built into the firmware.
Every coupled FM4 clip (the bank before/afters, the five presets and the twelve Finetales conversions) was re-rendered with proper headroom. The overdrive was traced to recipe carrier levels sitting far above the DSP output clamp, which flattened chords into a squared wall; the fix cuts those levels so the sounds keep their dynamics (crest factor rose from ~1.3 to 3-5). This is the set now worth listening to and scoring.
Plucked strings, a tape delay, morphing wavetable pads, and a wind/crackle/riser texture layer — each built and sample-exactly verified in the clean-room lab. They are candidates: give each a listen and a thumbs up or down, and the ones you like get built into the real firmware next.
Each audio card carries a dated what-changed label (new, re-rendered and why, or unchanged), and the cards are ordered newest-update-first to match the changelog. Labels update automatically with future re-renders.
The native FM4 oscillator that runs inside the stock voice path picked up the two sound-quality features previously proved only in the clean-room warm-song kernel: every sine read is linearly interpolated (removing raw table-step grit), and each voice's modulation indices now fade over the note with per-recipe time constants — fast for bells and plucks, medium for keys and bass, slow for pads and strings. Recipes grew from four to six control words (ABI v2); a decay word of zero reproduces the old behavior exactly, so existing recipes stay valid. The cost rose from about 2,654 to at most 5,006 cycles per voice per 32-sample block — the kernel-lab estimate predicted the seam within 0.3% — and the dense twelve-voice stress fixture still peaks at about 50% of the observed deadline. Every generated sample continues to verify word-for-word against the independent model, and all five preset auditions plus the six user-bank before/after pairs were re-rendered with the new engine. Emulator-only; no hardware was written.
The published FDN kernel design now runs inside the coupled STM32/DSP emulator at the mapped global-reverb call: four prime-length delay lines with one-pole damping and Householder feedback consume the mono-summed reverb send and return a wet-only stereo tail, matching the seam contract the diffuser established. A seam-shaped kernel-lab build predicted the cost at 7,609 cycles per 64-word block and the integrated routine measured 7,600 (stock: 18,529). Every output word and all 16,389 persistent state words are compared against an independent model on every call across single-note, dense twelve-voice and selector fixtures, and the new 16,384-word delay-line range joins the page-trap memory-ownership audit. Engine ID 2 selects the FDN live; invalid controls still fall back bit-exactly to stock. Everything remains emulator-only; no hardware was written.
Completing the octave fix for the PM2 and virtual-analogue engines surfaced a pre-existing defect: the optimized pm2-bypass loop keeps its modulator phase only in an accumulator and never wrote it back to Y memory, so the phase silently reset every 32-sample block. It evaded the retained-JSON tests because they only validate retained outputs; the shadow model caught it the moment the target was re-run. The postamble now persists the modulator phase for pm2-bypass (FM4/VA write theirs in-body), and the PM2/VA preambles double the half-rate stock pitch word as FM4 already did. A C4 through pm2-bypass now measures 261 Hz; the VA carrier increment matches 261.6 Hz with the sub square one octave below, exactly as the independent model predicts. All PM2/VA clips were re-rendered and the changed-program-word counts moved to 93 (PM2 bypass), 93/109/126 (VA plain/banded/PWM) and 180 (VA selector).
Listening feedback flagged the bank auditions as dirty and low. Spectral measurement against a stock control proved the native oscillator injections consume the stock per-sample pitch word directly, while the stock table reader effectively runs it at twice that rate: a requested C4 rendered as an odd-harmonic C3. The FM4 preamble now doubles the pitch word (carrier 2x, pair modulators 4x and 6x), the same C4 measures 262 Hz with a clean series, and every FM4 clip on this page was re-rendered. Sample-exact verification could not catch this class of error because the shadow model faithfully models the implemented mapping; a pitch-measurement gate against the stock control is the new lesson. The PM2 and virtual-analogue clips still carry the same octave offset and are queued for the equivalent fix (the banded VA needs matched band-table changes).
Six before/after pairs render user-supplied lo-fi keys, ambient and drum-and-bass bank shells first through the untouched stock engine (with the documented synthetic-seed limitation) and then through the native FM4 oscillator with the identical downstream envelope/filter/effects shell. The .cpb bank container is decoded as eight 340-byte patches in 512-byte slots. Only bank/slot coordinates, hashes and metrics are retained publicly; patch names and bytes stay private.
A clean-room four-line feedback delay network — prime-length delays inside circular buffers, one-pole damping, Householder feedback, alternating injection and decorrelated stereo taps — processes the warm song's first two bars. All 1,024,000 stereo output samples and the reverb state match an independent fixed-point model. The dry A side and wet B side are published together for direct comparison. This is a kernel-level design study for the recovered global-reverb seam, not yet a seam integration.
The FM4 kernel family gains the controls the static recipes lacked: per-note operator ratios, pair detune, velocity scaling, linear attack plus exponential amplitude decay, independent per-pair brightness decay, and linear interpolation on every sine read. Notes are sixteen-word table entries that accumulate into one shared buffer, so chords overlap and tails ring under later notes. Sixty-two notes across keys, bass, pad and bell layers verify sample-exactly (903,500 samples, zero clipping) against an independent model.
The pinned dsp56300 JIT computes mpy incorrectly whenever the second source register holds a negative value: the operand is treated as unsigned, adding an error of twice the first operand. Every earlier kernel passed because its second operands (indices, levels, envelope coefficients) were always positive; the new interpolation code was the first to multiply by a possibly-negative delta. The workaround keeps the possibly-negative operand first, is enforced in the generators, and is covered by a regression micro-test so any future emulator bump is re-checked.
Every verified clip is now published both as the exact PCM WAV and as a small MP3 for mobile listening. The WAV remains the artifact whose SHA-256 is bound to the emulator report; the MP3 is a convenience transcode of that verified file.
Rebuilt all five STM32 images with identical checksum-gated Ghidra analysis instead of projecting the 1.2.1 helper addresses backwards. Releases 1.0 and 1.1 make 280 recovered transport calls through a Core-0-only write(value,address) ABI. Version 1.1.5 adds an explicit core argument; 1.2 adds one bulk-transfer call, and 1.2/1.2.1 have identical operation counts and fixed DSP-address sets. Eighty-nine fixed X/Y locations are common to all five releases out of a 139-location union. The 1.0-to-1.1 transition changes 24 fixed X locations in each direction, so a modern host patch cannot be made safe for old firmware merely by relocating its branch. Published output is address/call metadata and hashes only; Ghidra projects, firmware and detailed exports remain private.
The retirement metric is a per-bus workload-balance calculation: a twelve-voice single bus clamps to zero, while balanced six-plus-six work stays above the 0x80 threshold. Added a bank-preserving STM32 allocator mode and configurable logical-track pairing. Mapping tracks 0+3 to bus 0 and 1+2 to bus 1 turns requested polyphony 6/2/4/0 into physical 6+6. Moving allocation before both stock selectors prevents their old victim release from leaking into a custom steal. With 64 rendered frames between lifecycle events, release, released-slot reuse, surplus steal, stale note-off suppression and retrigger all reach the DSP exactly; all twelve records complete 94 blocks, no forced retirement occurs, 45,312 FM4 samples match the independent model and peak observed deadline use is 52.794%. No device was written.
Exact-block state attribution maps the stock per-bus retirement service. A countdown at X:0x3239+bus reloads to twelve and, while a derived X:0x0036+bus metric is below 0x80, calls a six-record minimum-score selector every thirteenth service cycle. Its wrapper writes the selected release state at P:0x001bb1. In the matched stock trace, slots 0-4 are forced into release at frames 76, 492, 908, 1324 and 1740, exactly 416 frames apart. Replacing only P:0x001bb1 with NOP leaves the host allocation caller and selector intact and keeps all twelve single-bus voices dispatched for 24,024 frames. The result repeats with twelve distinct pitches from MIDI note 48 through 67, one note command and exact identity per slot, nonzero output and 51.531% maximum observed deadline use. This proves the causal modification seam and removes the paired 6+6 oscillator budget offline. It does not yet explain the stock safeguard or prove release/retrigger, worst-case FX, long-run or hardware safety, and no device was written.
Added non-advancing DSP snapshots and exact-block command instrumentation. All twelve forced single-bus slots receive exactly one note-on and no hidden note-off, while the scheduler still visits every descriptor; the earlier rolling-seven result is therefore a stock per-bus voice-management effect. In a matched control using the same MIDI note, engine ID, recipe and two maximum-sustain poly patches, routing six requests to bus 0 and six to bus 1 keeps all twelve oscillator records long-running for 24,024 frames. Every slot completes 750 or 751 blocks, output is nonzero and peak observed deadline use remains 51.531%. This gives a practical twelve-note mirrored-timbre mode and explains why the proven 2/3/4/3 four-patch schedule works: parts 0+2 use six voices and parts 1+3 use six. It does not create four independent downstream filter/envelope/FX strips, and no hardware was written.
Moved the payload allocator to 0x080217ca, before both stock slot selectors, and generated a matched test Project with poly mode 2 and amp sustain 127. In all six coupled MCU/DSP cases, slots 0–11 reach the common continuation unchanged, descriptor choices and identities are exact, guards hold and timing stays at 51.531% of the observed deadline. Yet requests above seven still retain a rolling window of the newest seven long-running oscillator records. Reducing DSP advancement per host read from four calls to one leaves the twelve-note per-slot counts exactly unchanged. This falsifies the earlier late-hook explanation and makes ordinary elapsed envelope time unlikely; the limiter is downstream in stock activation/continuation or DSP runtime. Separately, four parts at 2/3/4/3 execute all twelve records with four distinct verified FM recipes. No hardware was written.
Added a bounded per-run FM4 recipe override and proved recipe 50 through slot selection, DSP identity routing, exact native execution and active stock-path audio. A reproducible batch then chose the strongest retained Tracks shell for electric piano, bell/pluck, strings, slow pad and bass, rendered restrained chords or one bass note, and emitted a factory-data-free report. All five two-second clips are exact, distinct, non-silent, zero-clipping and below 52.929% of the observed deadline. The audit also found that 25 abstract translated recipes collapse to 12 combinations under today's four implemented controls, so ratios and operator envelopes are the next higher-value engine work. No hardware was written.
Qualified a bounded 128-byte DTCM candidate by watching four application-init entries, Project activation, fourteen stock note calls, the coupled DSP path and 2,048 frames: stock made zero reads and zero writes there. A 696-byte expected-byte-gated payload now accepts slotless logical events, maintains twelve voice records and chooses unused, released, surplus or oldest victims inside the emulated MCU. Its complete 2/3/4/3 release/reuse/steal schedule matches an independent model for all fifteen routed decisions, leaves the guard untouched, preserves exact stock behavior for an invalid mailbox and reaches 51.531% of the observed DSP deadline. This is an offline candidate, not proof of hardware SRAM ownership or interrupt safety; no device was written.
Removed physical slot numbers from the logical test stream and connected the shared-flex allocator to the coupled emulator. Its priority is unused, released, above-reserve, requesting-part oldest, then oldest remaining. It automatically recreated the 2/3/4/3 layout, released part 1 note 48 in slot 2 without touching the duplicate note in slot 11, reused slot 2 for part 3, and stole slot 5 as part 2's oldest surplus voice. A later note-off for the stolen note is suppressed instead of killing the replacement. Every routed decision changed only one requested host descriptor; all final DSP identities match, all twelve DSP records complete with zero invalid entries, and the run reaches 51.531% of the observed deadline. At this stage embedding the allocator in the MCU was the next routing step; the newer log entry above closes that offline gate. No hardware was written.
Traced the stock release helper and confirmed its key is only stock bus plus MIDI note: with logical parts 0 and 2 both playing note 60, the original scan changed slots 0 and 5 together. Added a separate 120-byte offline lifecycle variant with CTX4 for note-on and CTR4 for note-off. Its second expected-byte-gated hook skips matched descriptors until the requested physical slot, then resumes the original stock release block. The collision now changes slot 0 only. A full twelve-slot run releases one of two same-bus/same-note voices, reuses that slot for another part/recipe, explicitly reassigns one active slot, retains all final DSP identities and reaches 51.531% of the observed deadline. Invalid mailbox behavior remains exactly stock. No hardware was written.
Turned the 128 retained Tracks patches into reusable downstream sound shells instead of discarding their envelopes, filters, LFOs, modulation, macros and insert effects. Twenty-five conservative FM oscillator recipes make a 3,200-combination raw search space. A deterministic classifier now builds smaller electric-piano, bell/pluck, string, pad and bass audition queues; the next gate renders each candidate at two velocities across three octaves, removes silence/clipping/long tails/near-duplicates, then asks for human listening. This is a shortcut to curated variety, not a claim that multiplying parameters automatically makes 3,200 good patches. Raw factory data remains private.
Connected the MCU's per-slot identity to the native FM producer through a bounded DSP lookup. The first sparse-address attempt correctly failed because the stock host write truncates external addresses; a second audit also found that three old FM scratch words overlapped identity slots 9–11. The retained design uses the unique low byte of each stock oscillator record to resolve X:0x5fd4+slot and moves scratch elsewhere. In the full 2/3/4/3 fixture, recipes 10, 20, 30 and 40 each produce a distinct digest; 17,948 blocks and 574,336 samples match the independent model with zero errors. All twelve voices complete, the renderer stays at 2,601–2,654 cycles per block, and the whole run reaches 52.789% of the observed deadline. These are distinct oscillator recipes, not yet polished instruments or independent filter/envelope/FX patches. No hardware was written.
An expected-byte-gated 76-byte MCU trampoline now overrides the physical slot only after the stock allocator has made its decision, then resumes the original voice initializer. A coupled 2/3/4/3 schedule selects all twelve requested slots and writes exact engine, recipe and logical-part identities into per-slot DSP memory. The stock Core 0 dispatcher reaches all twelve oscillator and allocator records; 17,880 completion observations contain zero invalid records, active audio remains below 51.531% of the measured deadline, and an invalid mailbox makes the patched image exactly match stock across transport, audio, timing, cycles and instructions. A later experiment now consumes these identities as four FM recipes; independent downstream patch state remains open. No hardware was written.
Built a 20-note, five-chord arpeggio around two decaying carrier/modulator pairs instead of exposing the harsh serial-chain benchmark. The complete 440,000-sample render and four final phase words are bit-exact against an independent fixed-point model; peak magnitude is 0x49cd03 with zero clipped samples. The nine-second dry audition is now in the player above. It is labelled a candidate pending listening feedback, not declared musically successful from metrics alone.
Removed the intentionally overloaded twelve-note-plus-drums stress render from the listening gallery. It remains retained as private diagnostic evidence, but it is not a useful example of what a new instrument should sound like. New synthesis work now needs two proofs: exact DSP correctness/timing and an authored musical render with note shape, dynamics and effects. The first sound target is a warm four-operator electric-piano/pluck phrase; the next VA target is a slow-PWM string pad with chorus.
Mapped the existing DSP reset, complete stock reload and STM32 whole-device watchdog. The new offline model leaves a healthy or wrapping heartbeat alone, restores stock after four frozen checks, disables custom engines after recovery, and deliberately lets the complete unit reset if communication or reload fails. Nine exact build-4486 code sites gate the report. This is safety planning around the musical DSP experiments—not a hardware install—and no device was touched.
Replaced the impractically slow instruction-interpreter scan with a non-perturbing page-trap test on the normal JIT workload. After boot, every host page covering the X control mailboxes and all X/Y/P aliases of the external oscillator/effect state is set inaccessible. One forked child per mapping deliberately faults, proving all four detector mappings are armed; the parent then completes 1,200 frames with active voice, oscillator, reverb and delay passes. An identical unprotected control matches every retained execution, audio, state and event digest. This closes observed stock Core 0 CPU collisions for the retained profile only; physical DMA, Core 1, hardware persistence and broad Project coverage remain open. No device was written.
Corrected a crucial emulator assumption: stock firmware sends 10,846 program words and does not upload the proposed P:0x3c00 code cave. The private build-only path now emits a 15,464-word Core 0 image, relocates its packed block, hash-gates the exact 105-word delta, round-trips experimental and official-recovery containers, and executes the genuine STM32 selector for both normal and alternate modes. Normal mode selects the relocated block; all other blocks remain unchanged. The stock sender also splits the complete 46,398-byte block into 90 510-byte chunks plus one 498-byte chunk, with contiguous coverage and an exact reconstructed hash. The final DMA/SPI primitive, DSP boot acceptance, physical DMA/Core 1 memory ownership, watchdog behavior and XT8 coexistence remain blockers. No hardware was written and no firmware artifact is public.
Wrapped the mapped global-reverb call in a 105-word expected-target-gated selector. CFX magic, ABI 1 and engine 1 choose the diffuser; invalid magic, version or ID tail-jumps to untouched stock after restoring the entry registers. Across 124 matched blocks, every fallback produces the exact stock 7,936-word effect digest. Live host writes also change two masked diffusion coefficients, with both 7,936-word variants remaining shadow-exact. A mid-session test records zero custom blocks before frame 1,985 and 62 exact blocks after the engine commit. Stock rollback is one engine-0 write; the mailbox now passes the retained stock Core 0 CPU page-trap test, while an execution-time watchdog, physical ownership and a checksum-gated recovery installer remain unresolved. A two-second stock-to-custom render is published above; no hardware was written.
Captured 37 register families at every stock and custom reverb return. Eighteen distributions match stock exactly. The nineteen differences are all dead before use and now have disassembly-gated overwrite sites; this includes the first downstream callee rather than stopping at the immediate caller. Cross-version metadata shows all five extracted normal Core 0 payloads end between P:0x2a30 and P:0x2a5e, at least 4,514 words below the proposed P:0x3c00 cave. The 128-word effect state follows the existing experiment dispatcher without overlap, and a later protected-page workload excludes observed stock Core 0 CPU access. DMA, Core 1 and hardware behavior remain outside that proof, so readiness stays false.
Mapped the global reverb call at P:0x000d1f as a 64-word stereo block contract and redirected its expected build-4486 target into a zero-filled P cave. The clean-room two-stage all-pass diffuser matches an independent full-accumulator model for 256 isolated words and both final states, then for all 7,936 words and both live state banks in matched single-note and dense workloads. The dense fixture retains 12 note requests, four sample drums, delay and final audio with no reduced service counts. Direct cost is 1,305–1,358 cycles per block versus roughly 18,500 stock cycles. The timer high-water rise is logged as scheduler/wait behavior, not a simple CPU metric. A two-second listening render is published above; no hardware was written.
Built a native indirect dispatcher around the stock oscillator producer and moved the seven-word control ABI to host-addressable X:0x5fe0. Pre-note host writes switch one identical program both ways; stock selection, invalid magic, unsupported version and unknown engine 7 all match the unmodified 7,936-word oscillator digest and peak. In a sustained session, the stock path reaches 124 completions and 248 reader entries before an engine-2 commit at frame 1,985; afterwards 124 custom blocks / 3,968 words verify exactly while the reader count remains frozen, with pending depth one and no nesting. A two-second audible version switches at one second and is published above. The mailbox now passes the retained stock Core 0 CPU page-trap test; physical DMA/Core 1 ownership and real hardware remain unclaimed. No hardware was written.
Moved the versioned pulse-width and saw/pulse/sub mixer into the stock oscillator-producer bypass. The single-note run verifies 7,936 words; the dense notes-plus-four-sample-drums fixture verifies 45,696 with zero mismatches, completes 1,428 voice and 452 drum blocks, makes no stock reader calls, retains delay/reverb and never nests. The direct routine costs 1,502–1,555 cycles per block. A two-second 192,192-word verified listening render is now published; no hardware was written.
A versioned seven-word control block now drives continuous pulse width and independent saw, pulse and sub levels. The pulse is made by subtracting two phase-offset reads from the proven 63/31/15/7-partial saw banks. Four settings—saw only, 25% pulse, 50% pulse and a mixed 37.5% pulse—produce 256 exact words, exact final phases and exact final controls against an independent full-accumulator model. Cost is 54.02 cycles/sample, so block-level control hoisting and scheduling optimization come before full-engine integration; no hardware was written.
Integrated the 63/31/15/7-partial bank through a branch-free high-byte offset lookup, preserved the R4 voice identity and added exact band-aware shadow verification. The dense fixture verifies 45,696 words with zero mismatches, reaches 1,428 voice blocks and 452 drums, makes zero stock reader calls, retains delay/reverb and has no nested entries. Direct cost improves from 934–987 to 830–883 cycles per block. A new two-second verified render is published above; no hardware was written.
Added a block-rate selector for 63-, 31-, 15- and 7-partial saw/pulse table pairs and drove one controlled increment through every band. All 256 output words and both phase states match the independent model. Hoisting the selected table bases out of the sample loop reduces the clean kernel from 37.08 to 30.75 cycles/sample despite the selector. This is retained pre-integration evidence; the published fixed-band VA audio is unchanged while native producer integration and dense qualification are next.
Built an independently verified 256-sample clean-room kernel, then moved its 31-harmonic saw, pulse and sub mixer into the native producer bypass. The 3,971-frame dense fixture verifies all 45,696 oscillator words, completes 1,428 voice blocks and 452 drum blocks versus stock's 1,206 and 448, and keeps the original downstream filter/envelope controls, delay and stereo reverb active. Direct cost is 934–987 cycles per block; the two-second listening render verifies another 192,192 words. This is fixed-band, emulator-only work and no hardware was written.
Mapped X:(R0+0x09) as the upstream phase increment, redirected the expected build-4486 producer call and reconstructed the downstream control/voice pointers. The direct engine skips all 2,407 stock reader calls in the dense control, verifies 45,696 output words with zero mismatches, reaches 1,428 voice blocks and 452 drum blocks versus stock's 1,206 and 448, and keeps delay/reverb active. The two-second listening render verifies another 192,192 oscillator words. This is the first throughput-qualified replacement-engine result; it remains emulator-only and no hardware was written.
Reworked the bit-exact PM loop around an indexed external Y-memory table, block-local modulator state and legal DSP56300 parallel moves. The clean kernel falls from 30.10 to 19.13 cycles per sample; the native program shrinks from 346 to 94 changed P words and its incremental block cost falls by 50.22%. Dense correctness still passes for all 34,816 completed words with active sample drums, delay and reverb. Capacity improves to 1,111 seam entries and 444 drum blocks, but stock reaches 1,206 and 448. The result remains emulator-only and fails the throughput gate; redirecting before the stock oscillator producer is next.
The first busy run exposed an R4 lifetime assumption; explicitly preserving it fixed the ABI. Exact-loop verification then proved all 34,176 completed PM words bit-for-bit while clean sample drums, delay and reverb stayed active. The hard result is capacity: native PM completes 88.72% of stock synth-seam work and 98.21% of drum blocks before the same frame cutoff, even though the Timer maximum rises by only 24 ticks. This is a failed safety gate; parallel-move optimization and inactive-voice skipping come next.
Ran isolated C3, E3, G3, C4, E4 and G4 fixtures through the native DSP program. All 47,616 generated words match the independent fixed-point model, each note has a distinct final audio digest, and steady phase increments agree with equal temperament within one Q0.24 LSB—a maximum 0.025296-cent quantization error. The native cycle distribution is unchanged across notes and no hardware was written.
Ported the clean-room two-operator PM kernel into the expected-word-gated DSP trampoline. A pitch audit caught and corrected the stock phase interval from 32 to 16 advances before publication. In the final matched C4 run, 7,936 native output words match the independent model, 122 steady active blocks use the exact calculated C4 increment, stock/restored ESAI output is bit-identical, and measured added cost is 1,182–1,235 cycles per 32-word block. The two-second gallery clip extends verification to 192,192 words; no hardware was written.
Installed an emulator-only, expected-word-gated call/return trampoline at the mapped seam and used it to invert each 32-sample voice block. Matched stock, native and restored runs each reach 248 completions; audio changes under the mutation and restores bit-exactly. Direct seam-to-return counters measure 4 stock cycles versus 116 native cycles on every entry, giving a deterministic 112-cycle increment. The upper program range is only qualified for this fixture, and no hardware was written.
Ran matched 3,971-frame stock-observe, host-side PM2 replacement and restored-observe profiles at P:0x000a7f. All three complete 248 voice blocks; PM replaces 7,936 samples and changes both seam and ESAI digests, while the restored run is bit-exact to the first control. The published two-second clip extends that experiment to 6,006 blocks. Timer bounds remain stable, but the replacement runs outside modeled DSP cycles, so a native program patch is required for a real cost measurement.
Tested the R4 pointer at every P:0x000a7f completion in the qualified high-activity capture. All 1,134 entries are exactly oscillator-record base + 0x25; subtracting 0x25 recovers the same eleven R3 records and corresponding R5 allocator identities observed at dispatch. The clean-room kernel can therefore select per-voice state directly at the seam without an external FIFO.
Separated the P:0x00037a voice diagnostic from the oscillator-seam schedule. R5 advances by 96-word allocator records; R3 advances by 40-word oscillator records. Across MIDI notes 48, 52, 55, 60, 64 and 67, only two allocator offsets encode semitone position, while two oscillator offsets accumulate phase at equal-tempered ratios. Raw internal words remain private; only aggregate metadata is published.
Corrected the apparent synth/reverb reader split into a two-phase producer/completion pipeline over the same control list. Matched clean saw and square profiles both fill all 32 words at the common post-oscillator convergence point, with different rolling digests. The diagnostic is explicitly separated from canonical audio/timing because its extra trace boundaries alter emulator service scheduling.
Recovered the MCU WAV validator, 64-slot allocator, external Y-memory range, descriptor table and Core0 kind-7 installer. A clean resampled bank keeps four stock sample voices active for 448 renderer blocks; the matched no-sample control completes only four zero-output blocks. Both retain the same 51.53% observed Timer maximum.
Sent six note requests to each synth through the original live STM32 method under a mapped high-activity Project. All twelve Y-memory allocator blocks change, both part accumulators and global delay/reverb paths are nonzero, and the maximum block cost is 42,214 of 81,920 Timer ticks. The result is retained as an exact event fixture; changed blocks alone do not establish twelve simultaneous dispatching voices.
Built a firmware-independent DSP56300 kernel lab, then assembled a stateful two-operator phase-modulation oscillator. The 39-word benchmark and two-second render both match an independent fixed-point model exactly; the long render is now published above.
The benchmark uses a shared 256-word sine table, two persistent phase words and 39 P words. It measures 30.10 modeled DSP cycles per sample before parallel-move optimization; twelve voices would represent about 7.1% of the raw 32-frame DSP-cycle deadline if added wholesale, but replacement cost and worst-case stock load remain unknown.
Added opt-in WAV capture at the ESAI callback. The harness measures all six transmitter lines, selects active transmitter 4, exports the two time slots as stereo PCM and records frame count plus SHA-256.
Confirmed that the existing Tracks harness already uses Gearmulator's exact dsp56300 revision. Adopted its checksum-gated patch discipline and separated multi-DSP emulation lessons from unsupported single-chip capacity assumptions.
AMY is the strongest clean reference found: MIT-licensed fixed-point C with six-op DX7 routing, a Juno voice, bandlimited oscillators, filters and effects. It will supply behavior and vectors, not drop-in DSP code.
Build a 32-sample kernel ABI and assemble a sine lookup plus two-operator phase-modulation routine. The kernel, convergence seam, per-voice state mapping and host-side stock-path injection are complete; the next target is a version-gated DSP program patch with true cycle measurement.
Research boundary