99 lines
6.5 KiB
Markdown
99 lines
6.5 KiB
Markdown
# Changelog
|
||
|
||
All notable changes to this project will be documented in this file.
|
||
|
||
## [0.0.7] - Unreleased
|
||
|
||
### Added
|
||
- 3-operator FM synthesis words: `fm2` (operator 2 depth), `fm2h` (operator 2 harmonic ratio), `fmalgo` (algorithm: 0=cascade, 1=parallel, 2=branch), `fmfb` (feedback amount). Extends the existing 2-OP FM engine to a full 3-OP architecture with configurable routing and operator feedback.
|
||
- Background head-preload for sample libraries. At startup, a background thread decodes the first 4096 frames (~93ms) of every sample into RAM. Short samples (most percussion/drums) are fully captured and play instantly on first trigger. Eliminates first-hit misses for live performance.
|
||
|
||
### Fixed
|
||
- Code editor now scrolls vertically to keep the cursor visible. Previously, lines beyond the visible area were clipped and the cursor could move off-screen.
|
||
|
||
## [0.0.6] - 2026-05-02
|
||
|
||
### Added
|
||
- TachyonFX based animations
|
||
- Prelude: project-level Forth script for persistent word definitions. Press `d` to edit, `D` to re-evaluate. Runs automatically on playback start and project load.
|
||
- Varargs stack words: `rev`, `shuffle`, `sort` (ascending), `rsort` (descending), `sum`, `prod`. All take a count and operate on the top n items.
|
||
- Euclidean rhythm words: `euclid` (k n -- hits) distributes k hits across n steps, `euclidrot` (k n r -- hits) adds rotation offset.
|
||
- Shorthand float syntax: `.25` parses as `0.25`, `-.5` parses as `-0.5`.
|
||
|
||
### Changed
|
||
- Split `words.rs` (3,078 lines) into a `words/` directory module with category-based files: `core.rs`, `sound.rs`, `effects.rs`, `sequencing.rs`, `music.rs`, `midi.rs`, plus `compile.rs` and `mod.rs`.
|
||
- Renamed `tri` Forth word to `triangle`.
|
||
- Sequencer rewritten with prospective lookahead scheduling. Instead of sleeping until a substep, waking late, and detecting past events, the sequencer now pre-computes all events within a ~20ms forward window. Events arrive at doux with positive time deltas, scheduled before they need to fire. Sleep+spin-wait replaced by `recv_timeout(3ms)` on the command channel. Timing no longer depends on OS sleep precision.
|
||
- `audio_sample_pos` updated at buffer start instead of end, so `engine_time` reflects current playback position.
|
||
- Doux grace period increased from 1ms to 50ms as a safety net (events should never be late with lookahead).
|
||
- Flattened model re-export indirection; `script.rs` now exports only `ScriptEngine`.
|
||
- Hue rotation step size increased from 1° to 5° for faster adjustment.
|
||
- Moved catalog data (DOCS, CATEGORIES) from views to `src/model/`, eliminating state-to-view layer inversion.
|
||
- Extracted shared initialization into `src/init.rs`, deduplicating ~140 lines between terminal and desktop binaries.
|
||
- Split App dispatch into focused service modules (`help_nav`, `dict_nav`, `euclidean`, `clipboard`, extended `pattern_editor`), reducing `app.rs` by ~310 lines.
|
||
- Moved stack preview computation from render path to input time, making editor rendering pure.
|
||
- Decoupled script runtime state between UI and sequencer threads, eliminating shared mutexes on the RT path.
|
||
|
||
### Fixed
|
||
- Prelude content no longer leaks into step editor. Closing the prelude editor now restores the current step's content to the buffer.
|
||
- Desktop binary now loads color theme and connects MIDI devices on startup (was missing).
|
||
- Audio commands no longer silently dropped when channel is full; switched to unbounded channel matching MIDI dispatch pattern.
|
||
- PatternProps and EuclideanDistribution modals now use the global theme background instead of the terminal default.
|
||
- Changing pattern properties is now a stage/commit operation.
|
||
- Changing pattern speed only happens at pattern boundaries.
|
||
- `mlockall` warning no longer appears on macOS; memory locking is now Linux-only.
|
||
- `clear` now resets `at` deltas, so subsequent emits default to a single emit at position 0.
|
||
|
||
## [0.0.5] - 2026-04-02
|
||
|
||
### Added
|
||
- Mute/solo for patterns: stage with `m`/`x`, commit with `c`. Solo mutes all other patterns. Clear with `M`/`X`.
|
||
- Lookahead scheduling: scripts are pre-evaluated ahead of time and audio commands are scheduled at precise beat positions, improving timing accuracy under CPU load.
|
||
- Realtime thread scheduling (`SCHED_FIFO`) for sequencer thread on Unix systems, improving timing reliability.
|
||
- Deep into the Linux hellscape: trying to get reliable performance, better stability, etc.
|
||
|
||
### Fixed
|
||
- Editor completion popup no longer steals arrow keys. Arrow keys always move the cursor; use Ctrl+N/Ctrl+P to navigate the completion list.
|
||
|
||
## [0.0.4] - 2026-02-02
|
||
|
||
### Added
|
||
- Double-stack words: `2dup`, `2drop`, `2swap`, `2over`.
|
||
- `forget` word to remove user-defined words from the dictionary.
|
||
- Active patterns panel showing playing patterns with bank, pattern, iteration count, and step position.
|
||
- Configurable visualization layout (Top/Bottom/Left/Right) for scope and spectrum placement.
|
||
- Euclidean distribution modal to spread a step's script across the pattern using Euclidean rhythms.
|
||
- Fairyfloss theme (pastel candy colors by sailorhg).
|
||
- Hot Dog Stand theme (classic Windows 3.1 red/yellow).
|
||
- Hue rotation option in Options menu to shift all theme colors (0-360°).
|
||
|
||
### Changed
|
||
- Title view now adapts to smaller terminal sizes gracefully.
|
||
|
||
### Fixed
|
||
- Scope/spectrum ratio asymmetry in Left/Right layout modes.
|
||
- Updated `cpal` dependency from 0.15 to 0.17 to fix type mismatch with `doux` audio backend.
|
||
- Copy/paste (Ctrl+C/V/X) not working in desktop version due to egui intercepting clipboard shortcuts.
|
||
|
||
## [0.0.3] - 2026-02-02
|
||
|
||
### Added
|
||
- Polyphonic parameters: param words (`note`, `freq`, `gain`, etc.) and sound words now consume the entire stack, enabling polyphony (e.g., `60 64 67 note sine s .` emits 3 voices).
|
||
- New random distribution words: `exprand` (exponential) and `logrand` (logarithmic).
|
||
- Music theory chord words: `maj`, `m`, `dim`, `aug`, `sus2`, `sus4`, `maj7`, `min7`, `dom7`, `dim7`, `m7b5`, `minmaj7`, `aug7`, `maj6`, `min6`, `dom9`, `maj9`, `min9`, `dom11`, `min11`, `dom13`, `add9`, `add11`, `madd9`, `dom7b9`, `dom7s9`, `dom7b5`, `dom7s5`.
|
||
- Playing patterns are now saved with the project and restored on load.
|
||
|
||
### Changed
|
||
- `at` now consumes the entire stack for time offsets; polyphony multiplies with deltas (2 notes × 2 times = 4 voices).
|
||
- Iterator (`iter`) now resets when a pattern restarts.
|
||
- Project loading now properly resets state: stops all patterns, clears user variables/dictionary, and clears queued changes.
|
||
|
||
### Removed
|
||
- `tcycle` word (replaced by polyphonic parameter behavior).
|
||
|
||
## [0.0.2] - 2026-02-01
|
||
- CI testing and codebase cleanup
|
||
|
||
## [0.0.1] - Initial Release
|
||
- CI testing
|