2.5.7 Shared VCF downsampling, variable oversample, compiler optimization
- Shared mix-bus decimator: per-voice upsample, single shared downsample (15-18% CPU reduction)
- Variable VCF oversample (Off/2x/4x) via settings menu and LV2 parameter
- AnalogBW filter runs at oversampled rate inside the decimator loop
- Release build flags: -ffp-contract=fast, -fno-math-errno (Clang/GCC), /fp:contract (MSVC)
- Standalone DSP profiler tool (tools/profile)
2.5.6 Fix silence at sample rates below 96 kHz
- Fix AnalogBW filter silence at 44.1/48 kHz (cutoff exceeded Nyquist, causing NaN)
- LFO onset ramp advances during release tails (matches ROM firmware behavior)
- Chorus wet noise reduced, SysEx Chorus II switch byte fix
2.5.5 VCF input gain calibration, CV smoothers, PWM fix, zoom persistence
- VCF FreqGain: empirical bell curve in log-frequency space matches hardware passband level across all 128 factory presets
- VCF resonance fade: k fades to zero between 20 kHz and Nyquist, prevents aliased ringing on high-cutoff patches
- RC smoothers (1ms tau) on PWM, DCO pitch, and VCF resonance CVs, matching .01uF cap on all 16 DAC outputs
- PWM uses raw LFO (pre-onset envelope), matching ROM firmware where PWM path bypasses LFO delay scalar
- VCF hardware calibration: J106 resonance curve, 2D FreqComp lookup table from hardware noise sweep
- Arp sync fix for hosts without PPQ (Zynthian LV2)
- UI zoom persistence: settings.json is authoritative, setStateInformation no longer overwrites saved scale
- Fix AU scale: set editor size before setResizable to prevent host clobbering saved zoom on reopen
- Startup click fix: snap volume smoothers to targets in prepareToPlay
2.5.4 LFO release fix, analog bandwidth filter, VCF slope compensation
- LFO onset envelope preserved during release tail (matches D7811G firmware behavior)
- Analog bandwidth filter: 1-pole at 38 kHz models aggregate HF rolloff from IR3109/BA662/mixing stage
- VCF slope and mid-range frequency compensation from hardware noise sweep
- Gate VCA smoothing: RC filter on gate envelope prevents clicks on fast gate transitions
2.5.3 AU dead zone fix, scope LED font, tuning knob improvements
- Fix AU dead zones by removing setAlwaysOnTop
- Scope LED font for preset display
- Menu highlight and arp range position fixes
- Tuning knob: center snap, 1px/cent gearing, MIDI CC 63/64 both map to center
2.5.2 Scope nav bar, interactive params, AU cursor fix
- Scope nav bar with mode labels
- Interactive VCF, ADSR, and master volume drag in scope display
- AU cursor fix
2.5.1 Chorus hardware recalibration, BBD saturation, arp fixes
- Chorus LFO rates, delay depth, and dry/wet gains recalibrated from clean J6 hardware recordings
- BBD saturation model: soft clipping on delay line input matched to hardware 6-voice unison levels
- Arp-off no longer retriggers held notes (smooth transition to sustained chord)
- Arp mode change (up/down/up-down) continues sequence instead of restarting
2.5.0 Oscillator sinc interpolation, VCF calibration, analog noise model
- Saw oscillator: 16-tap windowed sinc interpolator replaces Hermite, fixes harmonic rolloff above 1 kHz
- Wavetable selection off-by-one fix: correct table now used at octave boundaries
- VCF frequency-dependent InputComp: passband gain calibrated from 10x10 hardware noise sweep at 96 kHz
- VCF high-frequency resonance damping: feedback drive increases with cutoff to match IR3109 OTA compression
- VCF output scaling at high freq/res to match hardware self-oscillation amplitude
- Analog noise model: separate broadband, mains ripple (120/240/360 Hz), and BBD clock bleed
- Variance sheet: independent Analog Noise, Mains Noise, Clock Noise controls; Robot Tune zeros all three
- Chorus major recalibration: true BBD shift register, matched pre/post filters
- Master volume moved after chorus (noise injected in chorus now scales with volume)
- Preset search: type to filter presets, arrow keys skip non-matching entries
- Scope: FFT spectrum smoothing, Nyquist bin fix, flat line on idle, silence blanking
2.4.12 VCF/DCO hardware recalibration, MIDI learn for all controls
- VCF InputComp and output gain recalibrated from hardware recordings
- DCO sub oscillator amplitude from hardware measurement (1.51x pulse)
- New J106 sub level 11-point lookup table from osc_calibrate recording
- MIDI learn for switches and buttons (right-click, tooltip, green border, CC display)
- Shift+Tab fix for backward MIDI learn navigation
- Left-click cancel no longer blocks drag start on knobs/sliders
2.4.11 LV2 host sync fix, true BBD chorus
- Fix LV2 host sync: extrapolate beat position when host skips atoms
- True BBD shift register chorus model with matched pre/post filters
- Add optimized VCF implementation (cached coefficients, no per-sample transcendentals)
2.4.10 Optimized VCF, WASM improvements
- Optimized VCF: cached coefficients avoid redundant transcendentals per sample
- LFO rate fix, oversample improvements, UI tweaks
- WASM: AudioWorklet with ScriptProcessor fallback
- WASM: Poly I default, power switch, scope double-buffer, adaptive audio buffer
2.4.9 Hardware-measured VCA, Poly I allocator, portamento
- Hardware-measured VCA curve, Poly I voice allocator matching IC20 ROM
- Portamento on all voice modes
- VCF passband compensation, J106 oscillator mix calibration
- DC blocker fix, analog noise floor model
- 300% UI scale, free drag-resize, transport fallback
2.4.8 Host drag-resize, AU scale fix
- Add host drag-resize support
- Fix AU scale handling
- Add 300% UI scale option
2.4.7 Arp/LFO quantize, UI scaling fix
- Separate arp/LFO quantize parameters for headless hosts
- Fix UI scaling issues
- Improve Init preset defaults
2.4.6.3 LV2/CLAP UI scale fix, preset name cleanup, bass boost DC fix
- Fix UI scale not applying on LV2 and CLAP hosts (defer setTransform to after host parenting)
- Trim long factory preset names to reduce truncation in preset display
- Increase preset popup grid display from 14 to 16 characters
- Fix bass boost mode bypassing the DC blocking filter
- Remove legacy polyBLEP oscillator code (replaced by wavetable DCO)
- Browser-playable WASM synthesizer on the website
2.4.6.2 Per-model HPF, bass boost biquad, VCF frequency compensation, LFO delay fix
- HPF: per-model frequencies from circuit analysis and ngspice simulation (J6/J60/J106)
- J106 bass boost: low-shelf biquad modeled from M5218L two-stage op amp circuit (fc=103 Hz, +9.4 dB, Q=0.47)
- J60 HPF: flat + 3 HPF positions (no bass boost), derived from CD4051 caps into 470K/38K/30K network
- HPF mode remap on model switch (J106 boost/flat both map to J60 flat), click-free 64-sample crossfade
- VCF frequency compensation: frequency-dependent power law (2.004 * frq^0.162) replaces flat 1.96x boost, fit to J106 hardware -3dB measurements
- LFO delay: gate-based reset trigger matching D7811G firmware state machine (was using voice busy state, never re-triggered between notes)
- DCO Sub: J60/J106 use J6 measured A-taper curve (diode shunt attenuator)
- VCF scope: Hz readout in top-right corner
- HPF labels: J60 mode shows correct frequencies (was showing J106 labels)
2.4.6 Per-model DSP framework, chorus filter, SysEx fixes, AU SysEx variant
- Sub oscillator and noise levels calibrated from Juno-6 hardware measurements (11-point tables)
- J60 VCF frequency curve: calibrated to 248 Hz at slider 0.3, separate from J6/J106 curves
- J60 noise/sub CV curves from ngspice transistor simulation (2SA1015 PNP + BA662)
- Per-model parameter framework: every slider has J6, J60, and J106 functions with fallback chain
- Oscillator mix levels normalized: sub and noise return 0-1, kSubAmp/kNoiseAmp handle scaling
- kSubAmp corrected to 0.5942 (matches J6 hardware: +1.5 dB over saw)
- BBD chorus prefilter: 2nd-order Butterworth + 1-pole from ngspice simulation of transistor circuit
- AU SysEx variant: separate "Ultramaster KR-106 (SysEx)" AU (aumf) for Logic Pro SysEx support
- SysEx fix: VCA mode and PWM switch bits were inverted vs real Juno-106 hardware
- SysEx: sub switch inferred from sub level byte (J106 has no physical sub switch)
- HPF slider: J60 now correctly uses 4-position switch (was showing continuous J6 slider)
- VCA Level: J6 forced to unity (no patch-level VCA), J60 uses +/-10 dB like J106
- Settings (voices, oversample, velocity, sync, retrigger) exposed as LV2 parameters
- Tuning display corrected (was showing -100 cents at center position)
- Manual-trigger Linux CI workflow
2.4.5.1 LV2 arp sync, MIDI output mode, settings menu fix
- Arp DAW sync: cache host transport state for LV2 hosts (Jalv/Zynthian) that only send updates on state changes, with beat position extrapolation between updates
- Graceful sync fallback: free-run at host tempo when beat position unavailable, fall back to arp rate slider when host provides no transport info
- MIDI output mode setting: switch between CC/PC (default) and SysEx (IPR/APR, matches real Juno-106). Receiving always accepts both
- Settings menu: fix not reopening after Component Variance or Keyboard Shortcuts
- Chorus: remove incorrect BBD charge-well saturation model
2.4.5 Juno-60 mode, hardware-calibrated DSP, UI improvements
- Juno-60 preset bank: 128 factory patches from the original manual, dual 60/106 banks with mode switch
- 60 mode uses authentic J6 VCF frequency curve and C1 keyboard tracking by default
- DCO LFO depth calibrated from Juno-6 hardware (strobe tuner, 11-point A-taper pot curve)
- VCA: BA662 exponential gain model from schematic (Q17 transistor converter)
- VCA Level: +/-10 dB range confirmed from hardware recording
- Scope: dynamic ADSR zoom with continuous A-D-S-R curve, 1.5px smooth path strokes
- Icon buttons with hover glow, preset sheet close button and ESC dismiss
- Menu crash fix: deferred callbacks for patch manager actions
- README.md in release zips, replaces per-platform INSTALL.txt
- User guide: 60/106 mode docs, merged MIDI mapping, full QWERTY table
2.4.4 DAW sync, VCA/VCF corrections, UI improvements
- Arpeggiator DAW sync: locks to host tempo with 9 note divisions (4 Beats to 32nd Note), beat-grid aligned stepping
- LFO DAW sync: 13 divisions (24 Beats to 64th Note), phase resets on transport start
- Both sync modes free-run at tempo-matched rate when transport is stopped
- VCA Level: dB-linear gain law with correct +-10.6 dB range (PC1252H2 circuit analysis)
- VCF output gain corrected from hardware recordings (self-oscillation matches saw level)
- Sliders draw their own tick marks (removed from background image), wider hit area
- Settings menu: two-column layout, radio groups update in-place, toggles stay open for multiple changes
- Scope: patch bank mode with square cells and nav buttons, dimmer grid lines across all modes
- VCF scope: frequency response includes output gain, dimmer cutoff marker
- SysEx send/receive for all parameters, save patch dialog with bank/group/patch selection
- Standard QWERTY piano layout, keyboard shortcut viewer
2.4.3 VCF recalibration from hardware measurements
- Improved self-oscillation: cleaner sine wave, more accurate pitch tracking, consistent volume across the frequency range
- Self-oscillation and passthrough signal levels now matched
- Resonance amplitude consistent between R=0.9 and R=1.0 (matches hardware)
- Noise source shared across all voices (matches hardware single 2SC945 generator), with schematic-derived filtering
- Fixed click when switching VCA gate/env mode mid-note
- Fixed click on first note after voice initialization
- Waveform scope: peak amplitude readout with clip indicator
- Spectrum analyzer: higher resolution rendering
- Fixed scope freezing on rapid note retrigger and low notes
- MIDI program change messages now processed before notes
- Debug logging auto-disabled in release builds
2.4.2 Wavetable DCO, UI improvements
- Replaced polyBLEP oscillators with bandlimited wavetable DCO, eliminates aliasing at all pitches
- Oscillator runs at base sample rate; VCF handles its own oversampling internally
- Remove output saturator for cleaner signal path (clip LED at ±1.0)
- Master volume: squared audio taper for better low-end control, CC7 mapped
- Double-click text editing on knobs (was sliders only)
- Spectrum analyzer: 4096-point FFT for better low-frequency resolution
- VCF frequency response scope: stop drawing line along bottom of display
2.4.1 Oversampling fixes, performance
- Fix sub oscillator PolyBLEP sign (use absolute value for symmetric correction)
- Fix oscillator noise LP running at wrong rate when oversampled (pass oversampled rate to Init)
- Fix VCF thermal noise envelope decay being oversampling-dependent (compute coefficient from sample rate)
- Fix waveform switch ramp halving in duration at higher oversampling (derive from time constant)
- Hoist audio taper exp() curves from per-sample to per-block in oscillator mixer
- Replace powf() with expf(logf()) in VCF resonance rolloff inner loop
2.4.0 DCO antialiasing
- 4th-order PolyBLEP (4-sample window) replaces 2nd-order for ~40 dB better alias suppression
- Oscillator runs inside VCF oversampling loop (2x/4x) for combined osc+filter antialiasing
- Fix missing PolyBLEP on sub oscillator (only half the transitions were corrected)
- Fix saw PolyBLEP sign (was adding instead of subtracting)
- Remove saw reset blip (384 kHz ring data was likely a resampler artifact)
- Fix HPF slider drifting on standalone relaunch (mode remap firing on state restore)
- Fix window scale not persisting on Linux X11
2.3.2 Bug fixes, arm64 glibc compatibility
- Fix dropped MIDI notes when CC messages flood processBlock (Ableton + external controllers)
- Fix J106 attack click at slider position 0 (let DAC RC filter smooth the onset)
- Add All Notes Off (CC 120/123) to prevent stuck notes on controller disconnect
- Re-enable DC blocking in J106 HPF modes 0 and 1
- Build arm64 Linux in Debian Bullseye container (glibc 2.31) for Zynthian/Pi compatibility
- Component variance section in user's guide
2.3.1 MIDI learn, 1982 HPF, DSP calibration
- MIDI learn: right-click any slider or knob to assign a CC, persisted to JSON
- Multiple parameters can share a CC (e.g. Decay + Release on one knob)
- Tooltip shows CC assignment; Shift+drag fine, Cmd+drag superfine
- Patch bank scope mode (P key): 16×8 grid with drag-to-launch bouncing ball
- Component variance editor with Robot/Human/Out of Tune presets
- 1982 continuous HPF (39–1394 Hz from 11 hardware measurements)
- 1982 VCF frequency recalibrated to 248 Hz at slider 5.5 (service manual)
- 1982 LFO rate circuit model (TA75558S integrator + Schmitt trigger)
- IR3109 expo converter tanh saturation on 1982 VCF (40 kHz ceiling)
- Classic VCF Frq Scale setting for authentic 1982 frequency curve
- Mono retrigger setting, bender/ADSR mode as live performance params
- Frequency-matched VCF and HPF slider remapping on 1982/1984 switch
- Custom macOS .icns icon for standalone app
2.3.0 Major VCF overhaul
- 4x oversampling (cascaded 2x polyphase stages) for clean self-oscillation up to 20 kHz
- Runtime-selectable 2x/4x oversampling via settings menu
- Empirical frequency compensation applied post-warp, sample-rate independent
- Describing function tuned for ±20 cent self-oscillation pitch tracking
- Filters run continuously (no reset on note-on, matches real hardware)
- Per-voice VCF cutoff variance re-enabled (±5%)
- Standalone app icon
- New: tools/vcf-analyze standalone filter analysis tool
2.2.3 Spectrum analyzer, UI improvements, Chorus fix
- Spectrum analyzer scope mode (1024-point FFT, log frequency scale)
- Custom LED popup menus for settings and patch manager (replaces system menus)
- Patch selector grid showing all 128 presets in 8x16 layout
- Settings and patch manager icon buttons (Tabler SVG icons)
- Fix Chorus I not engaging when kChorusOff param was stale from preset
- Fix SysEx echo loop toggling chorus state
- User's guide page
2.2.2 ARM64 build, CDN icons, CLAP/LV2 in releases
- Linux ARM64 (Raspberry Pi) build in CI and release workflows
- CLAP and LV2 formats added to all platform release packages
- Download button icons from cdn.simpleicons.org
- Fix LV2 codesign on macOS (sign dylib inside bundle)
2.2.1 CSV preset bank, MIDI fixes, Default patch
- Editable CSV patch bank with copy/paste, load/save, and bank file persistence
- Global settings persistence (zoom, voice count, velocity, arp limit)
- Fix double-triggered notes from UI keyboard MIDI echo loop
- Fix stuck notes on hold release (release all voices matching a note)
- Clean voice allocation on DAW suspend/resume
- Show "Default" on fresh spawn; scroll to enter patch bank
- SysEx output on preset change and individual knob tweaks
- Slider fine control and text editor with bracket notation
2.2.0Clock-domain BBD chorus, Configurable number of voices
- Clock-domain VCO modulation for BBD chorus (replaces linear delay)
- 4-pole cascaded TPT pre/post filters from Juno-6 schematic RC values
- Configurable 6/8/10 voices via right-click menu, persisted per instance
- Fix stuck voices when switching unison to poly
2.1.9 CLAP and LV2 support
- Add CLAP and LV2 plugin format support
- Deprecation fixes for newer toolchains
2.1.8 MIDI CC/SysEx receive, master volume
- Receive standard MIDI CC and Roland Juno SysEx for all parameters
- Master volume control placed pre-chorus in signal chain
2.1.7Added Preset Display
- Preset name display with drag-to-scroll and mouse wheel
- Arrow key and Page Up/Down preset navigation
- Custom 14-segment LED font
2.1.6 Added UI Scaling
- Mono mode: legato when keys overlap (no envelope retrigger)
- VCF KBD tracking follows portamento glide instead of snapping
- DCO LFO depth: model 10K wiper-to-ground shunt on 50K linear pot
- UI scale preference saved/restored in project state
2.1.5 About screen, display scaling fix
- About/version screen with vector stroke font in scope display
- Fix 1x display scaling
2.1.4 Scope modes, output gain staging
- 3 scope modes: waveform, ADSR, VCF frequency response
- VCF range extended to 5 Hz – 50 kHz
- Output saturation and master volume gain staging improvements
2.1.3 VCF frequency compensation, J106 resonance model
- kBaseFreq calibrated from ROM data (5.0 → 5.53)
- J106 transistor resonance model (2SA1015-GR PNP)
- FreqCompensation: corrects 4-pole cascade droop at low Q
- VCF frequency response scope with analytical transfer function
- Inverted pulse polarity in J106 mode (80017A positive-first)
- ADSR: apply first tick immediately on NoteOn (D7811G firmware)
2.1.2 BBD charge-well saturation, modulated bandwidth
- Three-stage filter chain matching MN3009 signal path
- Clock-rate-dependent BBD bandwidth filter that sweeps with LFO
- Charge-well soft saturation modeling 256 BBD stages
2.1.1 VCF self-oscillation tuning fix
- Base compensation on k (actual feedback gain) instead of res²
- Fix self-oscillation pitch nearly an octave flat at low cutoff
- Calibrated against tuner measurements at 220/440/880/1760 Hz
2.0.0 Initial JUCE release
- Port from iPlug2 to JUCE framework
- macOS, Windows, and Linux support
- VST3, AU, and standalone formats
- CI/CD with GitHub Actions