Sun Apr 26 13:56:06 CEST 2026
================================================================================

- Much improved master compressor. Parameters are not backwards-compatible
- Add per-track compressor to be controlled from FX Patch Memory
- Utility track type: can use tracker bus outputs as audio source
- Make edit+enter work for FXPatchIdx (allocate new or duplicate patch)
- New bindings for FXPatch and Chord Memory (left joystick + back button left/right)

- [Fix] There was a long-standing performance regression in program execution


Sat Apr 18 01:12:51 CEST 2026
================================================================================

- Improved Pattern Cmd formatting
- When possible preserve OpCode arguments when type changes
- Lots of rendering backend changes.
  - UI now rendered with pre-multiplied alpha instead of additive blending. 
  - Correct layering of UI elements and transparency
  - Visual tweaks
- Graphics track: removed background text for now
- New modulator display in main screen (shows waveform, phase, value)
- FMSynth: render waveforms
- PolySampler: per voice parameter is now a per-patch setting instead of
  instrument setting (in the modulation page)

- [Fix] speed multiplier in modulation memory. Behavior now consistent with the
  `mods' PatternCmd.
- [Fix] couldn't delete ProgramIdx in some UI elements
- [Fix] FMSynth: new waveforms were producing occasional crackle artifacts
- [Fix] FMSynth: could only select envelope 0..3
- [Fix] Change of audio block size wasn't handled correctly
- [Fix] Screensaver now correctly eats input events 


Sun Apr  5 23:35:23 CEST 2026
================================================================================

- Major UI update (everything OpCode related, continuation of the previous
  effort), lots of polish and cleared up documentation
- Add pattern/table/program selector. Press Enter on an empty cell
- Allow switching tracks in Patch Memory and in Patterns
  (left joystick + left/right).
- In patch memory move through patches with (left joystick + up/down)
- FMSynth: more envelopes
- FMSynth: envelope looping
- FMSynth: pitch modulation
- FMSynth: tx81z waveforms
- FMSynth: UI polish 
- FMSynth: fixed frequency mode when denominator set to 0
- FMSynth: change: ringmod01 and ringmod23 share the same envelope now
- FMSynth: ratio callback now per oscillator
- FMSynth: hardcore performance optimizations, probably still a bit
  more expensive than before
- FMSynth: add velocity as modulation source
- MonoSampler: Add new sine wave shape, wire up pitch modulation in UI
- MonoSampler: Option to reset oscillator phase
- MonoSampler, PolySampler, FMSynth: add pitch-tracking to Filter
- UI: change style of OpCode cells
- Programs: add PatternIdx and TableIDX immediate values
- Experimental feature: Frequency Shifter in FXPatch. Might change in future
  versions.

- [Fix] Step-mutes were not rendered
- [Fix] division by 0 in FMSynth oscillators
- [Fix] various small UI fixes where last-edited value etc were not remebered
  correctly

Wed Jan 21 20:55:02 CET 2026
================================================================================

- Bring back the program variables in the Track Settings screen

- [Fix] Quantization index was not reset when changing patterns

Thu Jan 15 23:02:12 CET 2026
================================================================================

- Huge UI rewrite and UI polishing pass
- add LFO8
- add quantizaton (UI for 31 edo is still WIP) opcode
- add quantized note editing
- add schd and uscd opcode for scheduling program execution

mac specific:
- fixed blurry UI
- core audio improvements
- fixed some shader issues


Sun Oct 19 02:00:24 PM PDT 2025
================================================================================

- [Fix] MonoSampler: envelope re-triggering behavior was broken
- [Fix] MonoSampler: note-off through tables was not correctly handled in midi output


Mon Sep 29 11:24:35 PM PDT 2025
================================================================================

- change key-repeat behavior for pgup/down  

- [Fix] using program variables editor from project settings could corrupt program variables under certain conditions
- [Fix?] possibly fix clicks from monosampler envelopes in certain conditions. This fixes an issue encountered on mac, was not able to reproduce on linux.
- [Fix] sample visualization was drawn in inactive patterns



Fri Sep  5 07:46:08 PM PDT 2025
================================================================================

- add tlen command to control the length of a table step


Fri Sep  5 06:46:33 PM PDT 2025
================================================================================

- Add spbs command which allows to set sequencer playback state (stopped and running).
- Remove hcf command.
- New per-track callbacks: project_load, sequencer_start, sequencer_stop
- Nicer rendering of source displayed for special variables and functions and some cleanups.


Thu Sep  4 10:09:45 PM PDT 2025
================================================================================

- Rewrote the implementation for tables since the original implementation was a huge spaghetti mess. Please report any inconsistencies or changes in behavior to previous versions.
- Trigger conditions for tables. Each line of the table maintains a counter that gets incremented each time a line is played. Activating a different table will reset the counters. 
- Add tjmp opcode for jumping in tables. The jump will be executed in the next tick of the table. Jumps can be triggered from programs/patterns/tables and can refer to arbitrary table columns. For example, one table can control the execution of another.
- Increase text resolution to 132x68 from 120x68. Previously, characters were rendered too wide which made them a bit harder to read. This should get the display closer to the correct aspect ratio. Changed layout of the main sequencer screen accordingly. Glow effect has been slightly reduced for increased legibility of text.
- Special variables are now documented by displaying the underlying c++ implementation in the selection dialog.
- Sequencer screen can now be scrolled by holding the right joystick and turning the left joystick (in addition to right joystick + up/down)
- Prototype version of note callbacks. Gets called for note on/off events after the transpose callback and before chord callback. Currently only implemented in the polyphonic voices.

- [Fix] tble command did not work in tables that had special trigger modes.
- [Fix] add a few missing index checks to special variable opcodes which could have resulted in crashes.
- [Fix] brk command was jumping to line 0 when break count was reached. It will now always jump to the destination.



Wed Aug 27 11:20:05 PM PDT 2025
================================================================================

- Increase number of patches per track to 64 (from 32)
- expose force_all_audio_to_master as special variable 
- expose patch and fxpch as special variables in programming language. Use IDX_X to select track, can be magic to refer to the current track.
- Small ui tweaks

- [Fix] importer crashes, fixed importing of fx-patches and program variables

Mon Aug 25 07:58:27 PM PDT 2025
================================================================================

- Add phase modulation to MonoSampler
- Add rstml8 func (reset modulator). Reads the modulator index from the stack. If the modulator index is magic then all of the modulators will be reset.
- Visually grey out modulation memory entries where the modulator index is not set


Mon Aug 25 04:18:32 PM PDT 2025
================================================================================

- Allow routing aux-sends to audio outputs (in routing page in project settings)
- Add "live" special register that indicates whether live mode is active or not

- [Fix] don't send send-only tracks to master when forcing individual outs to master


Sun Aug 24 11:05:01 PM PDT 2025
================================================================================

- Add initial version of effects patches. Use fxpt to select fx patch for current track.
- Indicate queueing status per track similar to playing state
- Add note preview for chrd opcode. Will play preview when there is a note in the current line.
- Add note preview in patch memory. If a pattern is opened on the currently selected track and if the cursor is positioned on a note, the preview will play the note and an optional chord memory. Otherwise the default note will be played. While the 'start' button is held, the currently selected value in patch memory can be edited.

- [Fix] Delay in "ticks" mode accidentally updated delay taps twice per tick.  This resulted in incorrect delay time and weird stutters when stopping the sequencer.
- [Fix] tble opcode not handled correctly in OpCode preview

Tue Aug 19 11:42:49 PM PDT 2025
================================================================================

- Pattern: add step_callback (called on each step of the pattern) and add clock_tick_callback (called on each tick while the pattern is active).  clock_tick_callback is called before step_callback.
- step opcode now accepts magic to mute step
- add pattern_start_callback and pattern_stop_callback to per-track callback settings
- add force_all_audio_to_master setting to project settings (routing page). This allows to override the per-track routing setting and forces everything to play on the master track. This makes it easier to switch between a hardware setup and fully mobile setup, but poses a bit of a potential foot gun.

- [Fix] MonoSampler could crash when transpose_note callback returns empty note
- [Fix] Drop UI page stack when track type changes, otherwise incorrect patterns could be displayed.
- [Fix] Multi-cursor editing of opcodes would always change the first opcode column



Mon Aug 18 10:49:53 PM PDT 2025
================================================================================

- Allow editing values with the cursor keys while the play-button is held for note/slice preview

- [Fix] mute->unmute for breakbeat now resumes on next Transpose or BreakSlice value
- [Fix] queuing of pattern could get screwed up in tutorial mode


Wed Aug 13 01:33:59 PM PDT 2025
================================================================================

- Allow stopping live set mode
- Add live_stop_mode setting. Optionally protects stopping the sequencer in live mode by requiring to press left joystick + start + stop
- More aggressive feedback when exceeding the live set timer. (big warning when 5 minutes over). Add visual indicator for live set progress.
- In enum dialogs bind PGLEFT and PGRIGHT (buttons on back side of steam deck) to jump to top/bottom of list
- strp opcode to store PatchIdx in memory location
- Allow setting variables using different store opcodes. Pressing enter on the memory address allows to select variable.
- Render store opcodes for variables as "variablename=value" when the variable name is set
- Up to 16 variables can now be displayed in the track settings page
- Track callbacks moved to the second page of Track Settings
- Program Funcs now display their source code in the selection dialog

- [Fix] Magic value was not rendered correctly for ImmediateValue 



Tue Aug  5 09:10:47 PM PDT 2025
================================================================================

- Note preview: press and hold the 'start' button (Y on steamdeck) when the cursor is over a note to initiate preview. It will try to determine using heuristics what the appropriate patch/chord is for the given note.
- Slice preview: in BreakBeat track type hold 'start' button on a slice value in the slice column. Heuristics are used to select the break and transpose value for playback
- OpCode preview: press 'start' on an OpCode command (only works in patterns). Works with running and stopped sequencer. Trigger conditions etc will be ignored.
- Sequencer view now indicates per track whether a pattern is playing. Patterns that are outside of the current view are indicated as above/below
- pbnd command which performs a pitch bend to a given transpose value in semitones
- dlay arguments can now be magic. When magic they will keep the previously set value

- [Fix] stop callback in whole_table_once trigger mode was not called
- [Fix] imm_zz immediate zz value was not implemented in programs
- [Fix] cvva opcode was not working
- [Fix] could delete values in the dialogs that shouldn't be deletable
- [Fix] steamdeck_jack_connections.sh was not run from scripts_custom folder on startup
- [Fix] steamdeck_startup.sh was not run from scripts_custom folder 



Fri Jul  4 05:14:51 PM PDT 2025
================================================================================

- MonoSampler, PolySampler, OneShot: play backwards when sample_end < sample_start
- OneShot, PolySampler: handle ppos and rev commands
- OneShot, PolySampler: use sample position callback instead of modulation slot
- Programs: maintain log, allow printing values, report errors (visible in program editor page)
- Programs: add named variables. Variables can either be per track (like local memory) or global
- Programs: allow addressing stack memory relative to the current stack position. Accessing this memory will not push/pop values from stack
- Programs: remove per-track display memory and all related functionality
- Programs: run programs even if sequencer is stopped (e.g. midi callbacks, modulation, track tick, etc)
- Programs: made magic behaviour more consistent with arithmetic ops. Magic op X and X op Magic will result in Magic
- Global: all parameters are now updated when sequencer is stopped. Callbacks in modulation callback slots etc will always be called, irrespective whether sequencer is running
- Mix Settings: remove modulation slots, replaced by callback programs
- Input: fix last-deleted vs last-inserted value log. On empty cell: edit+left inserts last deleted value, edit+right inserts last edited value, edit+up/down inserts default value. Pressing edit on a cell updates the last edited value
- Fix Monosampler midi-note mirroring and sample retriggering when using magic in tables


