Repository navigation
Slab 0.0.14
Thanks to Lost Robot, the author of septabee, for pointing out the
audio-thread inefficiencies that this release fixes.
-
C-Beam 80, a Yamaha CS-80. Eight notes of two complete voices each.
Each voice has a linear-in-Hz VCO, an HPF and an LPF that don't
self-oscillate, and the IL/AL filter envelope behind CS-80 brass. Velocity
is a fading initial-touch accent. Per-note pressure opens the filter,
raises the level and brings in vibrato on the pressed notes only. The
sub oscillator, ring modulator, BBD chorus/tremolo, keyboard scaling,
constant-rate portamento and sustain are global, as on the original.
It ships with Yamaha's factory pairings from the Owner's Manual charts
and four sounds of ours. See docs/38. -
Choose the audio buffer size. The audio menu next to record lists
64 to 1024 frames with their latency; 64 is 1.3 ms. The choice is
remembered. -
Notes played at idle sound at once. A key pressed after the app
had been quiet could wait up to 50 ms before reaching the engine. -
Recorded takes land in time. Placement now uses the latency the
audio device reports each way, plus how long the input actually
waited, instead of a two-buffer guess. With AirPods as the output,
takes used to land about 150 ms late. -
Record from any input, mono or stereo. Right-click a track's R to
pick its input: In 1, In 2, … or a stereo pair. Before, every input
of an interface was mixed into one, 6 dB down and with the other
inputs' noise. The choice is saved with the project. -
Recording holds up when things go wrong. Audio the disk couldn't
keep up with becomes silence instead of shifting the rest of the take
earlier; seeking or stopping ends the take where it still lines up; a
loop pauses for the take. Unplugging a device, a sample-rate change
from another app, or the system audio service restarting now reopens
the device instead of leaving it silent. -
The Sampler no longer aliases when you play high. Clean playback
now band-limits the sample to the speed it is read at, using octave
copies made when the sample loads, so playing a sample an octave or
more above its root, or a 96 kHz file, no longer folds whistles and
grit back into the mix. -
No more Sampler clicks on retrigger, choke or voice steal. Its
envelope now picks up from wherever it is, a choked hi-hat fades
instead of cutting, and a note that takes over a sounding voice fades
the old one out. -
The Limiter no longer clips transients. It now holds the gain
reduction a peak needs across the whole lookahead and ramps into it, so
a drum hit or a single-sample spike over the ceiling is turned down
smoothly instead of being clipped. Latency is unchanged. -
Machines use about 20% less CPU. The fy compiler computes repeated
expressions once, addresses state fields directly and writes them as
soon as they are final. Output is bit-identical. -
The Extract pack finds uv when Slab is opened from Finder. Its
download said uv was missing unless Slab was started from a terminal; it
now looks in Homebrew's,~/.local/binand~/.cargo/bintoo. -
Starting a pack download can no longer crash Slab. Clicking Download
or Import sometimes quit the app as the import began. -
Stop lets tails ring. Stopping releases the notes and lets reverbs
and delays ring out instead of cutting everything with a click; press
play again and the tails carry on. -
No clicks from edits while playing. Mute, solo, track enable and
insert bypass fade over a few milliseconds. Adding, removing,
reordering or replacing instruments and inserts fades the old chain
out and the new one in, and a new instrument picks up held notes.
Bypassing a lookahead or oversampled effect keeps its latency, so the
rest of the mix no longer jumps in time; any latency change crossfades.
Audio clips fade at cut edges and around seeks and loop wraps. -
5 ms less latency. Audio reaches the output one block sooner on
every path. -
About 6% less CPU for the same audio: peak scans run on vectors and
are shared between inserts, compensation delays copy in bulk, and
machines no longer copy their control tables every block. -
A blown-up machine can no longer reach your speakers. A track whose
signal turns NaN or infinite (an unstable filter, a division by zero)
is silenced for that block and its machines reset, so the fault cannot
spread into buses, sends or the master. The output stage never passes
a non-finite sample, in any clip mode; the hard clip used to turn one
into full-scale DC. Exports write silence there too. -
No more stuck notes from mute, solo or odd notes. A track that is
unmuted, un-soloed or re-enabled starts clean and picks up the notes
sounding at that moment. Notes past a trimmed clip end, zero-length
notes and notes shorter than a sample no longer hang. -
Smooth faders. Dragging a track or master fader ramps per sample
instead of stepping each block. -
Tempo-synced effects on the master follow the song. A synced
phaser on the master used to restart every block (a buzz); auditioning
while stopped now runs synced LFOs too. -
Audio devices recover. If the input stalls or is unplugged while a
track is armed, playback keeps running with silent input instead of
freezing. A device that fails to open is retried about once a second. -
Adding tracks no longer races playback. Slicing to a sampler,
extracting notes, chords or drums, placing stems and placing bounces
insert tracks with the device stopped, as adding and moving tracks
already did. -
Parallel rendering follows the output device. When macOS switches
the default output (headphones, AirPods), playback renders serially
until the render workers have joined the new device's workgroup. After
a bounce, freeze or export they re-request realtime scheduling. Arming
a track during a freeze or export no longer restarts the device.
If workers keep the audio thread waiting for two blocks in a row,
playback renders serially until they have been re-admitted. -
Fewer first-use stalls. Clip stretchers and the duplex capture
buffer are allocated and touched before audio uses them.
Apple Silicon, macOS 13 or later. Built from v0.0.14, which is its complete source (GPL-3.0-or-later, see COPYING.md).
Install:
curl -fsSL https://github.com/nooga/slab/releases/latest/download/install.sh | bash
Or with Homebrew: brew install --cask nooga/tap/slab
Or open the DMG and drag Slab to Applications. It is not notarized, so the first launch needs System Settings > Privacy & Security > Open Anyway.