Improvements
SID GoatTracker .sid (PSID/RSID) bank loading — extracts instruments and macro tables from PSID files packed by GoatTracker 2's exporter; algorithm adapted from 2bt/sid2sng with automatic detection of per-export feature flags (nopulse, nofilter, noinstrvib, fixedparams)
Bug Fixes
Fixed SID program combo showing only the index (e.g. "001") with no instrument name after bank load — the patch-name update path was clearing the authoritative name from the bank file
Bug Fixes
Fixed DX7 tuning — corrected -75 cents in the EGS pitch register so A4 sits at 440 Hz
Fixed DX7 tuning loss after bulk dump on Logic AU reload — master tune is now re-applied after the firmware reloads its parameter set
New Hardware Cores
Commodore 64 SID 6581 / 8580 — cycle-accurate emulation via reSID by Dag Lem with 3-voice polyphony, oldest-voice stealing, RESAMPLE high-quality sampling, and a full 50 Hz macro playback engine driving wavetable, pulsetable, filtertable, and speedtable per voice
Improvements
SID GoatTracker bank loading: .sng files (formats GTS3/4/5) appear in the Bank dropdown with every instrument exposed in the Patch dropdown; standalone .ins files (GTI3/4/5) loaded as single-patch banks
SID live MIDI control: CC 1 vibrato depth (6 Hz LFO scaled by mod wheel), CC 22 pitch bend range (1–48 semitones), CC 64 sustain pedal, CC 71 filter resonance (auto-routes all 3 voices through the filter), CC 74 filter cutoff (full 11-bit, auto-arms low-pass mode), CC 75 12-bit pulse width on all 3 voices
SID CC override semantics: touching cutoff, resonance, or pulse width suspends the corresponding patch macro for the rest of the note so DAW automation isn't overwritten by the 50 Hz frame ticker; cleared on next note-on (per voice for PW, globally on all-notes-off / program change for filter)
SID state persistence: bank file path and selected instrument restored on project reload
Bug Fixes
Fixed DX7 master tuning offset — firmware boots with cleared battery RAM causing the EGS pitch register to compute ~1.25 semitones (107 freq-units) sharp; compensated in updateFrequency to keep A4 at 440 Hz
Fixed resampler stale rate on synth swap — Plugin::setDevice now re-resolves the device samplerate so the resampler reconfigures correctly when switching to a synth with a different native rate (e.g. DX7's fixed 49096 Hz)
Fixed OpenWurli tremolo depth/swing curve being non-monotonic at high settings — depth=1.0 produced less modulation than depth=0.75 because the 50 kΩ vibrato pot was double-counted into both the LED drive path and the feedback shunt path
Fixed OpenWurli noteOff not clamping to the valid MIDI range like noteOn did — out-of-range notes could become unreleasable
Improvements
OpenWurli 0.4: post-speaker gain raised from +10.5 dB to +19.5 dB to hit industry-standard output levels (-10 to -14 dBFS for single ff notes at vol=0.50) without touching any circuit model
OpenWurli 0.4: bass onset ramp 30 ms upper clamp removed — heavy bass reeds now show audible velocity dependence in attack timing (C2 ff: 38 ms, C2 pp: 77 ms)
OpenWurli 0.4: MLP per-note level compensation added so ds_correction adjusts timbre without shifting overall level
OpenWurli sustained voice handling reworked — re-striking a sustained note releases the old voice first (one reed per pitch), and stealing priority is now Free > Releasing > Sustained > Held
Bug Fixes
Fixed OpenWurli tremolo depth/swing curve being non-monotonic at high settings — depth=1.0 produced less modulation than depth=0.75 because the 50 kΩ vibrato pot was double-counted into both the LED drive path and the feedback shunt path
Fixed OpenWurli noteOff not clamping to the valid MIDI range like noteOn did — out-of-range notes could become unreleasable
Bug Fixes
Fixed OpenWurli stuck notes when re-triggering the same key while sustain pedal is held — deferred note-off counter was a boolean flag, losing track of multiple releases
Fixed OpenWurli MIDI panic (CC 123) not clearing sustain pedal state — sustained notes could remain stuck after All Notes Off
Improvements
DX7: added pitch bend support — uses patch PB range when set, defaults to +/- 2 semitones when patch has range 0
DX7: added mod wheel support — uses patch mod sensitivity when set, defaults to vibrato when sensitivity is 0
DX7: aftertouch, breath controller, and foot controller now delivered to firmware via sub-CPU protocol
Improvements
OpenWurli 0.3: melange-generated 12-node DK preamp circuit solver replaces analytical DkPreamp — closer match to Wurlitzer 200A preamp nonlinearity
OpenWurli 0.3: Twin-T circuit tremolo oscillator replaces sine LFO — fixed ~5.6 Hz rate matching real hardware (tremolo rate parameter removed)
OpenWurli 0.3: recalibrated post-speaker gain from +13 dB to +10.5 dB to match Brad Avenson's 2–7 mV measurement
OpenWurli 0.3: speaker tanh saturation bypassed at character=0 to prevent nonlinear coloration on polyphonic ff chords
OpenWurli 0.3: removed unused filter classes (OnePoleHpf, OnePoleLpf, TptLpf, DcBlocker)
Replaced libresample with Speex resampler (quality 5) — SNR improved from 75 dB to 107 dB at the same CPU cost
Added Disk Operations backup/restore on None machine core
Bug Fixes
Fixed OPL3 preset navigation switching bank instead of stepping through patches
Fixed Standalone preset not sounding on project reopen — deferred sysex resend was never triggered because the Standalone host provides no BPM transport
Fixed AU setCurrentProgramStateInformation overwriting DX7 voice bank RAM on state restore
Improvements
Updated firmware-missing dialogs to reference official ROM filenames: Virus TI asks for firmware.bin, MicroQ for mq_2_23.mid, XT explains that two 128 KB IC dump .bin files are required
Firmware-missing dialog now triggers automatically on state restoration when ROM is not found
Replaced M_PI with juce::MathConstants in SFZero sinc resampler for cross-platform compatibility
Improvements
Enabled filter coefficient interpolation in libresample for cleaner sample rate conversion on non-integer ratios (e.g. DX7 49096→44100 Hz)
Bug Fixes
Fixed crash/freeze on plugin unload when GUI was opened — editor timers are now stopped before destruction
Fixed MIDI clock drift causing arpeggiator to go out of sync
Improvements
Added Virus preset converter for C→B/A downgrade
Shift+< > navigation to jump between bank folders
Synth core listing sorted alphabetically
Waldorf XT bank SingleDump redirected to edit buffer for immediate playback
GUI window size now persisted in settings.xml across all instances
Bug Fixes
Fixed OpenWurli upper register metallic plink and ringing harmonics
Fixed high CPU usage caused by libresample filter parameter regression
Fixed crash on macOS Mojave by disabling PMR
Fixed auto-slice count not resetting when loading a new sample
New Hardware Cores
Wurlitzer 200A — physical model piano via OpenWurli, ported from ~3,000 lines of Rust to C++ and integrated directly into the JUCE plugin framework. OpenWurli models the tine, pickup, and tone bars of the classic electric piano with per-voice physics — a wonderful open-source instrument we are deeply grateful to bring inside Retromulator
Yamaha OPL3 — FM synthesis via Nuked OPL3 v1.8 cycle-accurate emulation by Nuke.YKT, with SBI instrument loading, folder-based bank browsing, and zip import support
Improvements
OpenWurli settings panel with live parameter editing via combo and navigation pill
Akai S1000 browse folder mode with auto-slice drum mapping and state persistence
Akai S1000 ISO/BIN/CUE disk image loading
CC20 global tuning support with auto-slice and tuning state recall
Import/Export/Delete and drag & drop support for all cores
Engine author credits in synth selector
Bug Fixes
Fixed DX7 AU: preset changes after project reload now sound correctly — Logic Pro floods CC100/CC101 (RPN) into the DX7 serial RX buffer every block; the buffer is now flushed on bulk voice dump receipt and CC100/CC101 are blocked at input, ensuring Program Change bytes are not delayed or lost
Fixed DX7 AU: switching synth type to None and back to DX7 no longer produces silence
Fixed DX7 pitch being 2 semitones too low
Fixed DX7 preset navigator resetting to position 1 after project reload when the bank file path was not yet restored
New Hardware Cores
Akai S1000 sampler — SF2, SFZ, ZBP, and ZBB sample bank playback via the SFZero v3.0.0 MIT-licensed engine with 8-point sinc interpolation, extended SFZ/SF2 opcode support, discoDSP Bliss sampler format (.zbp/.zbb), MIDI CC support (mod wheel vibrato, volume, expression, pan), sustain pedal, and pitch bend
Yamaha DX7 — full hardware-level emulation via VDX7 of the Hitachi HD6303R sub-CPU, Yamaha YM21280 EGS, and YM21290 OPS chip set with 16 KB firmware ROM and 32 KB factory voice data
Improvements
JP-8000 .pfm performance bank loading support
SysEx preset and bank export with embedded patch names
Virus ABC/TI sysex cross-detection on patch import — loads ABC patches into TI and vice versa
Nord Lead 2X sysex patch name support expanded from 10 to 20 bytes with backward compatibility
Per-synth remembered file chooser directory persisted across sessions
Hardened runtime with JIT entitlement for macOS code signing
DSP thread stack increased to 64 MB for stability
AAX plugin format support
Bug Fixes
Fixed sysex hang when using external patch editors
Fixed Linux build: ptypes semaphore shadowing, POSIX compatibility, and GNU extensions
Fixed Windows data folder path corruption on sysex file load
Fixed Standalone last used MIDI device not being remembered across sessions
Resolved all compiler warnings across the codebase
Retromulator 1.0 is the initial release of DiscoDSP's hardware synthesizer emulation plugin. The virtual analog synths run on a cycle-accurate Motorola DSP 56300. Supported synths include the Access Virus ABC/TI, Waldorf MicroQ, Waldorf XT, Nord Lead 2X, and Roland JP-8000 — available on macOS, Windows, and Linux as AAX, AU, VST3, and Standalone. Built on Gearmulator, an open-source synthesizer emulation project by the dsp56300 team.
Hardware Cores
Access Virus ABC and TI emulation with sysex patch loading and ROM preset extraction to bank combo
Nord Lead 2X (N2X) emulation with per-program sysex navigation, edit buffer patch support, and output level correction by summing DSP A and DSP B voices at full scale
Roland JP-8000 (JE-8086) emulation with ROM preset extraction, patch browsing, multi-performance bank loading, and AU MIDI latency fix running at 44100 Hz
Waldorf MicroQ and XT emulation via dsp56300 cycle-accurate DSP engine with folder-per-bank ROM loading
SRC (sample rate conversion) with high-quality Rolloff 0.97 / Beta 9 settings
Firmware & ROM Management
Browse dialog accepts .bin, .mid, and .zip files; ZIP archives are extracted flat to the ROM folder with automatic multi-synth detection — all recognised firmware files are saved in one pass
Required ROM files per synth (filename is not checked — any file of the correct size and content is accepted):
Virus ABC/C — virus_c.bin (512 KB)
Virus TI — virus_ti.bin (6–9 MB)
Nord Lead 2X — nord_lead_2x.bin (512 KB)
Roland JP-8000 — jp8000.bin (512 KB); can be assembled automatically from 8 original firmware MIDI dump files
Waldorf MicroQ — micro_q.bin (512 KB); can be assembled automatically from the original firmware MIDI dump
Waldorf XT — xt.bin (256 KB); can be assembled automatically from two 128 KB IC dump files
Assembled ROM binaries are written to the ROM folder and source MIDI/IC dumps deleted, so subsequent launches load instantly from a single .bin
Firmware-missing browse flow on synth type change with synth-specific instructions
Per-synth patch name extraction and bank/program combo selectors
Plugin & Standalone
AAX, AU, VST3, and Standalone plugin formats with DAW state persistence
Resizable editor window with aspect ratio enforcement and in-editor corner resizer for AU host resize support
Window size persists across DAW sessions
DAW notified of state changes on preset and synth updates