Release date:
Fri, 04 Sep 2026 18:36:50 +0300
New features:
-
Add per-pad tuning to the Sampler
- Coarse in whole semitones, two octaves either way, plus fine tuning in cents
-
Add a per-pad amp envelope to the Sampler
- Attack, decay, sustain and release, on top of the pad's own filters
-
Add an end offset and reverse playback to the Sampler's pads
- The end offset trims the pad the way the start offset already did
- Reverse plays the trimmed range backwards
-
Add looping to the Sampler's pads
- Repeats the pad's range until the note is released
- Works with reverse, and wraps on whole frames so the loop does not buzz
-
Add a loop point to the Sampler's pads
- The pad plays its range once and then repeats only what follows the point
- Turning looping on drops the point in the middle of the range
-
Draw the pad's amp envelope over the Sampler's waveform
- White lines over the range, the release included
-
Drag the Sampler's start, end and loop markers on the waveform
- Each has a handle, and neither trim can be dragged past the other
-
Add choke groups to the Sampler's pads
- Triggering a pad silences the other pads sharing its group
- Eight groups, the way a closed hi-hat cuts off an open one
Bug fixes:
-
Validate the --window-size argument
- A malformed size reported "stoi" instead of saying what was wrong
- A zero or negative size was accepted and saved over the stored one
-
Stop rebuilding the Sampler's waveform for every pad setting
- The sample file was read again on every knob move
-
Fix the Sampler's offsets at whole seconds
- Some read back a second short, with a thousand milliseconds beside them
-
Stop Piano Synth V3 clicking when a key is struck over its own decay
- The restrike zeroed the sounding string instead of damping it
- A restrike under the sustain pedal now layers, as the instrument does
-
Steal the quietest Piano Synth V3 voice once all sixteen are sounding
- Round-robin cut the loudest note as readily as the faintest
-
Stop sending note-offs for notes that never played
- A muted or unsoloed track logged "No port found" once per note
-
Ask PulseAudio for the latency the audio buffer size implies
- The stream took the server's own, on PipeWire up to 2048 frames
- The callback then came four buffers at a time, and notes landed on
the 42 ms burst instead of the buffer
-
Give devices a MIDI event queue that carries the frame to play on
- The engine breaks a block wherever an event falls, so a note no
longer waits for the next block boundary - A device holding an event is no longer skipped for being silent
- The engine publishes where it is in the stream and when, so a tick's
time can be turned into the frame it falls on
- The engine breaks a block wherever an event falls, so a note no
-
Play internal synths on the frame the note was written for
- The player runs a little ahead of itself and names the moment, so a
note no longer waits for whichever block starts next - Only for songs played entirely by internal devices; anything going
out of a port keeps the timing it had - How far ahead comes from what the backend is doing, so the buffer
size no longer has to be guessed at - Controller and bend moves go the same way, so a value written on a
note's own line still reaches the device with it
- The player runs a little ahead of itself and names the moment, so a