v0.5.27
currentOct 13, 2026- Fixed collapsed octave and semitone transpose faders on desktop, tablet and other wider layouts. - Preserved narrow-screen wrapping and verified mouse/keyboard adjustment and transpose values across viewport sizes.

Version history
- Fixed collapsed octave and semitone transpose faders on desktop, tablet and other wider layouts. - Preserved narrow-screen wrapping and verified mouse/keyboard adjustment and transpose values across viewport sizes.
- Made native export room startup preserve the intended audio crossfade regardless of preparation time. - Connected the complete worker master path to unchanged WAV, MP3 and Ogg encoders with reusable transfers and bounded writes. - Added complete export comparison and lifecycle checks; worker export remains a development API while native UI exports remain available.
- Added a stateful linked-stereo worker compressor with native knee, adaptive attack/release, automatic makeup gain and look-ahead timing. - Added a short native compressor compatibility gate and bounded diagnostic stereo output through compressor, master gain and ceiling. - Verified native primitive/full MIDI comparisons and worker cleanup; production exports retain the native graph while deterministic room startup and bounded encoder integration remain pending.
- Added a bounded single-worker diagnostic renderer combining dry audio, reverb, echo and chorus before common space, width and master EQ. - Preserved native processing order and Float32 boundaries; verified pre-compressor comparisons, reusable transfers, backpressure and cleanup. - Production exports retain the native graph; compression, deterministic room startup and final encoder integration remain pending.
- Added independently implemented worker reverb predelay, initial room fade, wet gain, space/bypass and stereo-width processing using complete unchanged room responses. - Added a bounded diagnostic reverb-wet pipeline with reusable transfers, backpressure, cancellation, validation and clean restart. Both native room-startup states are covered by explicit diagnostic profiles; production exports retain native processing. - Released obsolete-room spectra after the initial fade and skipped their allocation when the first possible arrival is after that fade. Full faster export still requires combined dry/wet/master processing and complete-chain quality checks.
- Added independently implemented, browser-calibrated tempo automation for diagnostic worker echo. Preserved channel/quantum state, fractional event boundaries, overlapping and duplicate targets, native convergence and speed-adjusted tempo maps. - Corrected Float32 delay-read and interpolation boundaries. Tempo echo now passes the same tight primitive limit as static echo, including minimum/maximum delay, late notes, silence gaps and controller/reset MIDI fixtures. - Added a short native profile check, fixed automation storage and tempo-specific cancellation, consumer failure, transfer reuse, restart and long-run checks. Both production export modes retain native processing; complete faster worker export still requires reverb wet integration, compression and full-chain quality checks.
- Added independently implemented static echo delay, native-checked feedback timing/tone/guard, and stereo chorus delay/LFO processing with persistent state across blocks. - Added a bounded diagnostic worker echo/chorus pipeline with controller/reset sends, reusable 256 KiB output, backpressure, cancellation and restart. Both production export modes retain native effects and master processing. - Tempo-synced worker echo remains gated after native automation comparisons found a significant mismatch. Full faster export still requires tempo automation, reverb wet integration, compression and complete-chain quality checks.
- Added independently implemented stereo partitioned FFT convolution using the unchanged MIDIogre room responses, with fixed history and reusable transfer buffers. Native comparisons preserve stereo separation, full tails and sample timing. - Added a diagnostic MIDI reverb-convolution pipeline combining the verified synth/filter workers with a dedicated convolution worker. Its borrowed block API handles backpressure, cancellation, failed consumers and cleanup. - Verified the longest existing room response with 128 KiB PCM transfers and approximately 14.6 MiB of convolution array storage, independent of song length. Full fast export still requires predelay/wet integration, chorus, echo and compression; both production export modes retain native processing.
- Added independently implemented worker high-pass/low-pass, shelving and peaking filters, with channel-isolated state preserved across blocks and explicit Float32 boundaries. - Added native-checked saturation-curve lookup and post-compressor master gain/ceiling primitives. Existing synth, sound bank, effects and codec binaries remain unchanged. - Added a bounded developer filter-stage renderer for dry EQ, reverb and echo high-pass buses, and the filtered mono chorus input. A 15-minute fixture uses one 448 KiB output buffer, 21 KiB quantum scratch and 480 bytes of filter-history storage. - Compared primitives and integrated MIDI stages against native Web Audio, including native run-to-run variation, controller resets, bypasses, cancellation, consumer failure, backpressure and clean restart. Both production exporters retain the established native effects and master graph; full faster streaming remains under development.
- Added an optional low-memory export for WAV, MP3 and Ogg: worker synthesis feeds the existing continuous native mixer and effects, then worker encoding writes bounded audio blocks. It runs at playback speed; the default faster offline exporter remains available. - Kept stereo 44.1 kHz output, the bundled sound bank and synth, all native effects and master processing, and existing codec quality. Direct file writes avoid retaining the completed file; fallback downloads still accumulate encoded output. - Added bounded buffer pools, pause/resume backpressure, cancellation, startup failure cleanup and clean restart. Streaming exports are silent and create no full-song AudioBuffer. - Added independently implemented worker gain/pan/mute/solo/send buses and verified them against native graph outputs. This developer foundation remains separate from the production native effects route.
- Moved WAV, MP3 and Ogg encoding into dedicated offline-capable workers with reusable PCM buffers, sequential writes and cancellation. Unsupported worker initialization falls back before writing any output. - Added a bounded dry-channel synthesis worker foundation using the unchanged bundled SpessaSynth engine and sequencer. Raw channel fixtures match the existing worklet output exactly; the full effects mixer continues using the established native rendering path. - Validated worker/main codec parity, controller/SysEx sequencing, buffer reuse, cancellation, failed writes, restart and a 15-minute synthesis run. Complete mixed-audio streaming remains the next phase.
- Removed offline-render meters and reused the default channel snapshot and unchanged saturation curves. - Added a bounded, sample-rate-aware shared reverb PCM cache without retaining export contexts. - Batched MP3/Ogg fallback output into 256 KiB Blob parts; native file output still writes each encoded block directly. - Released the export iframe before encoding and cleared embedded sound-bank text only after successful decompression. - Tracked fallback download URLs for delayed and page-exit cleanup. Stereo, sample rate, effects, sound bank and codec quality remain unchanged. - Acknowledged queued end-of-song controller messages before rendering to prevent timing-dependent note release.
- Export now captures settings and releases playback audio before creating the offline engine; cold export no longer initializes a redundant live synthesizer. Play resumes from the saved position after export. - Streamed encoded blocks directly to native file destinations with abort-on-failure; retained offline download fallback and unchanged stereo, 44.1 kHz audio, effects, sound bank and codec quality.
- Encoded WAV in bounded blocks and stored encoded chunks as immutable Blob parts, avoiding a second full-size output buffer while retaining exact WAV samples. - Made cancellation during offline rendering release the export realm promptly, with regression coverage for render/encode cancellation, restart and memory cleanup.
- Added export duration and memory advice, a long-export warning, and separate rendering/encoding progress. All formats still use a full uninterrupted render. - Improved keyboard focus, slider names/readouts, dropdown navigation and enlarged-text transport layout while retaining 12A styling and the grey/green palette. - Added audio, accessibility, lifecycle and consolidated release checks with size and sound-bank guards.
- Stopped piano-roll and channel-meter work while those sections are outside the viewport; visible controls catch up automatically when scrolled into view. - Cached the piano roll’s static pitch background, leaving moving time lines, notes and playhead live. Added sustained-playback and full-export memory profiling.
- Organized transport into loading, playback, position and mix groups with full-width song information and evenly sized buttons. - Aligned Tempo, Master, FX mix and Voices in a responsive grid; grouped the bundled-song selector and navigation. Retained 12A styling and existing control behavior.
- Applied selected UI study 12A: fine highlighted bevels and soft drop shadows on buttons, knob frames, dropdown options and sliders. - Retained the grey/green palette, 45° bottom-left cuts, rectangular touch targets and keyboard focus indicators.
- Reduced display-loop allocation and unchanged DOM writes, used direct channel voice counts, and skipped unchanged piano-roll renders. - Synchronized controls on edits with a lower-frequency fallback poll; retained meter sampling and Stem Hero falloff timing. - Added complete, idempotent effects disposal and cleanup for offline-export setup failures. Kept the compact sound bank and audio processing unchanged.
- Kept AUDITION visible throughout patch previews when a MIDI is loaded, instead of allowing the animation refresh to replace it with the song status and tempo. - Verified that ending the preview and returning to Play restore the correct paused or playing song label.
- Added a decorative 45° bottom-left cut to buttons, file-load controls, slider frames and floating adjustment rails, retaining the grey/green palette. - Preserved rectangular touch targets and keyboard focus; diagonal borders and slider fills are drawn on non-interactive paint layers.
- Matched Stem Hero pan gestures: immediate horizontal intent, early pointer capture, a floating value rail and preserved vertical scrolling. - Pan drags update only their channel with short audio smoothing, avoiding repeated program and mixer updates. - Made patch previews audible regardless of channel mute, solo, volume or pan, while preserving the song and mix. Serialized audition loading with Play and made startup cancellable by Stop/Pause.
- Replaced OS dropdown menus with square app-rendered grey/green lists, including search for long instrument lists and keyboard navigation. - Framed the faders as filled rectangles and moved each channel and master VU meter directly below its fader. - Matched Stem Hero meter ballistics: 40 ms peak hold and a frame-rate-independent 500 ms full-scale falloff for all 17 meters.
- Made Stop and Pause responsive during audio startup; stale Play and seek requests cannot restart a stopped or replaced song. - Added an in-app export filename dialog and Cancel export. Stop also cancels pending exports; encoders yield so cancellation stays responsive. - Validated full-length WAV, MP3 and Ogg exports for the four bundled songs, transport races and mobile-emulated interruption and downloads.
- Began the flat console UI conversion with square panels, buttons, selectors and fader handles, preserving MIDIogre’s grey and green palette. - Replaced master EQ/compressor, reverb/echo/chorus, FX mix and channel pan sliders with knobs. Tap for a precise slider; hold and drag sideways for quick adjustment. - Added keyboard adjustment, numeric readouts and an in-app knob editor. Presets, resets and tempo-synced echo update the knobs; pan sits between Mute and Solo.
- Added 12 master EQ/compression presets and 14 reverb/echo/chorus presets with descriptions. - Presets apply immediately to playback and offline exports; effects presets include wet mix and tempo sync. Manual edits mark only their group Custom. - Default buttons restore the named original presets. Updated both clean and four-song SF3 editions.
- Replaced the full SF2 payload with the 8.42 MB GeneralUser GS 2.0.3 SF3 bank; all 287 presets, 324 instruments and 920 samples remain. - Added explicit SF3 decoder readiness before sound-bank use and updated format labels and licensing notes. - Restored the separate four-song bundle with its original MIDI bytes, song selector and previous/next controls.
- Replaced all procedural instrument and drum engines with bundled SpessaSynth 4.3.14 and GeneralUser GS 2.0.3. No legacy synthesis fallback remains. - Moved playback, seeking, MIDI controllers, banks, SysEx and pressure handling to the SpessaSynth worklet sequencer. Retained channel mixer, meters, piano roll, effects and master EQ/compressor. - Replaced offline audio export with the same SpessaSynth sample engine; retained embedded MP3/Ogg encoders and added WAV export. - Bundled runtime, worklet and compressed SF2 bank in one offline HTML with third-party licenses.
- Moved acoustic and bright-piano bodies onto the age-resumable WASM modal bank, with paired unison modes on their first two partials and fixed soundboard resonances weighted by key distance and velocity. - Added a rolling 10 ms per 100 ms live modal-generation budget with oscillator fallback; offline rendering remains unrestricted, and actual fallback events are exposed in resource statistics. - Kept hammer excitation, body filtering, pedal behavior and the established native modal path intact while adding bounded piano-plan diagnostics that do not create an OfflineAudioContext.
- Added a reusable WASM modal-bank summer that advances up to 32 independently tuned modes, amplitudes and RT60 decays in one block kernel. - Modal buffers initialize phase and amplitude from note age, so seek and resume continue the ringing body without replaying the strike or resetting every mode to zero phase. - Moved glockenspiel, marimba, xylophone, celesta, music-box and timpani mode summation to the bounded WASM path while retaining oscillator-per-mode fallback and separate attack-noise processing.
- Extended the WASM string loop with two first-order dispersion allpasses and a decaying velocity-scaled tension term for a brighter, slightly chirped hard-pluck attack. - Compensated the dispersion phase at each note's fundamental before calculating the fractional delay, preserving tuning while allowing upper partials to spread. - Enabled the extended loop for electric, steel, clavinet, overdrive and distortion guitar recipes while preserving the existing cold-generation budget, modal overload fallback and original string kernel for compatibility.
- Added a 4×-oversampled WASM soft-saturation kernel using interpolated substeps, a bounded cubic transfer and short box-FIR decimation. - Generated electric-guitar, clavinet, overdrive and distortion buffers now use the oversampled path before playback; the prior native 2× WaveShaper remains the compatibility fallback. - Separated saturated and native pluck cache keys so initialization timing cannot mix differently rendered buffers.
- Added a 4×-oversampled WASM two-operator FM attack renderer with a per-sample exponential index envelope and short-FIR decimation. - FM voices now combine the oversampled high-index attack with a native floor-index oscillator graph for indefinite sustain, pitch bend and vibrato; unsupported browsers retain the previous native envelope path. - Marked oversampled nonlinear/FM roadmap work as in progress while retaining native oscillators for simple subtractive voices.
- Added a deterministic WASM LCG noise generator and routed the shared one-second percussion/noise source plus plucked-string excitation through it, with sample-identical JavaScript fallback. - Added a bounded in-browser WASM-versus-JavaScript noise benchmark to core diagnostics without using OfflineAudioContext. - Added a capability-focused WASM roadmap covering oversampled nonlinear/FM rendering, string dispersion, a shared modal bank, feedback winds and an optional live modulated FDN room.
- Moved the complete eight-delay stereo feedback-network reverb generator into embedded WASM, including damping, Householder feedback and stereo output mixing. - Kept the original double-precision JavaScript FDN as fallback and added bounded diagnostics for finite, stereo WASM impulse output.
- Moved reverb-tail fading, energy accumulation and final normalization into one embedded WASM kernel. The complete full-buffer cleanup now leaves JavaScript only as a compatibility fallback. - Expanded bounded diagnostics with export and numerical checks for the new WASM normalization path.
- Replaced the unbounded browser audio-render diagnostic button with a bounded core health check, preventing a stalled OfflineAudioContext from leaving playback controls disabled. - Added an embedded WASM block-scaling kernel and moved the final full-length reverb impulse normalization pass to it, retaining the JavaScript fallback.
- Grouped the octave and half-step transpose controls so they remain adjacent, and moved Wider panels ahead of the transpose group. - Diagnostics now release the live audio engine before and after their offline render suite. Playback creates a fresh AudioContext afterward while preserving the loaded song, position and mixer settings. - Moved the reverb allpass-diffusion passes into the embedded WASM DSP module, with the original JavaScript path retained as fallback.
- Moved the full-length Karplus–Strong feedback/sample loop into the embedded WASM DSP module. Excitation setup, Web Audio buffer creation and the matching JavaScript fallback remain in the single offline HTML. - Split melodic transpose into independent −1 to +1 octave and −11 to +11 half-step controls while preserving synchronized live-playback rebuilding and unchanged channel 10 percussion. - Renamed Full-width panels to Wider panels and expanded each channel VU meter across nearly the full panel width in that mode.
- Added low-overhead profiling for MIDI parsing, synth initialization, reverb-response generation, periodic-wave creation, per-engine voice construction and cold plucked-string rendering. - Diagnostics now print sorted timing, cache-hit and work-unit measurements so the next WASM migration targets the measured bottleneck on the current browser and device.
- Started the embedded WASM DSP line with a self-contained block-ramp kernel, readiness/fallback state and regression coverage. The live Web Audio synth remains unchanged while larger numerical kernels are profiled and migrated.
- Corrected live transpose: committing a transpose change now rebuilds playback at the current playhead, so sustained melodic notes and queued notes move together. Channel 10 percussion remains untransposed.
- Audio export now requests a destination before rendering. Chromium desktop uses its native save dialog for a name and folder; unsupported mobile browsers ask for a filename before using their normal download location.
- Wider panels now changes the portrait mobile channel mixer to a one-column layout, rather than only widening the slider controls. - Added global melodic transpose from −24 to +24 semitones. It applies to new melodic notes in live playback and offline exports, while channel 10 percussion always keeps its original drum mapping.
- Replaced real-time recording export with direct OfflineAudioContext rendering. The full MIDI mix, channel controls, effects, master EQ and compressor now render without playing through the song in real time. - Embedded the MIT-licensed wasm-media-encoders runtime and MP3/Ogg Vorbis codecs directly in this offline HTML. No network request, external converter or browser MediaRecorder codec is required.
- Corrected the transport startup lead-in: the playhead never reports an earlier time during the 120 ms scheduling allowance, so an immediate pause or seek keeps the selected position. - Closed-context recovery now captures held-note ages before rebuilding the audio graph. Added playhead and recovery regressions; corrected the visible changelog label. Clean and four-song offline builds remain paired.
- Playback UI optimization: channel descriptions update only when MIDI/override state changes; activity is counted in one voice pass instead of repeated per channel. - VU sampling is throttled independently from position and piano-roll updates, reducing analyser reads and DOM churn during long playback. Clean and four-song offline builds remain paired.
- Transport hardening: self-scheduling pump avoids overlapping interval work and stops cleanly when an audio context is interrupted. - Playback now preserves position/held-note ages through a hidden-page or suspended-context interruption; Play resumes only from a user gesture. - A closed audio context is rebuilt on the next Play request, retaining channel settings and MIDI state. Separate clean and four-song builds remain offline-capable.
- Optimization pass 1: reverb responses, generated string buffers and periodic waves now use explicit entry and byte-bounded LRU caches, preventing high-sample-rate sessions from retaining unbounded generated audio. - Hardened FX reset retirement and added owned-resource accounting for voices, rotary cabinets, FX nodes, timers and caches. - Added lifecycle stress diagnostics covering repeated FX/master changes, voice stealing, cache eviction and panic/reset cleanup. Separate clean and four-song builds remain offline-capable.
- Added final-output EQ: bass shelf, presence bell and treble shelf with safe ±12 dB controls; the existing subsonic filter and soft ceiling stay active. - Exposed compressor threshold, ratio, knee, attack and release, plus a processing bypass that retains output protection. - Added rendered master-output EQ, compressor, bypass and automation regressions. Separate clean and four-song builds remain offline-capable.