SNAPS (Scale Navigator Particle System) is a SuperCollider library for creating real-time sound collages that conform to a particular key or scale. SNAPS is meant particularly to interface with the Scale Navigator. It is also Nathan Turczan's personal software for electronic music performance, and it is largely built by Nathan Ho.
SNAPS requires a database of samples that have been manually tagged with pitch class information. It takes MIDI input, whose notes are interpreted as the pitch classes of the desired scale. Although this MIDI input is designed to work with the Scale Navigator, one can use any MIDI input, such as a keyboard. SNAPS then draws randomly from the sample database to produce samples whose pitch classes are the subset of the scale. Additionally, if a sample can be transposed in pitch to match the scale, SNAPS will repitch it using simple varispeed playback to make it in key. If the scale changes, SNAPS does something special: sample playback rates are changed to match the new scale, but with slow portamento. This lends a unique effect where a scale "melts" into another.
SNAPS is structured more as a library than a complete instrument. The file nt.scd is an example of SNAPS in practice, mapping SNAPS's various parameters to a MIDI interface. Edit config.json to map MIDI controls and select sample categories.
AI disclosure: I built SNAPS for my client. My client has contributed to the repo using LLM coding tools. I do not use any LLM coding tools myself. --Nathan Ho
SNAPS runs in SuperCollider. Download and install it for your platform.
SNAPS outputs 8 stereo pairs (16 channels) of audio, one per player. You need virtual audio routing software to receive these channels individually in a DAW or other application.
| Platform | Software | Notes |
|---|---|---|
| macOS | Loopback by Rogue Amoeba | Create a virtual device with 16 channels (8 stereo pairs). |
| Windows | Voicemeeter Potato by VB-Audio | Use the ASIO driver for low latency and multi-channel support. |
| Linux | JACK Audio Connection Kit | Most Linux audio setups already use JACK. Use a patchbay (e.g. QjackCtl, Carla) to route channels. |
To find your audio device name, run this in SuperCollider:
ServerOptions.devices;
Then set the "device" field in your config.json to the exact string shown (see Configuration below).
SNAPS is designed to be controlled with an Akai MIDI Mix hardware controller. If you don't have the hardware, you can use the web-based MIDI Mix emulator which runs in Chrome or any browser that supports Web MIDI. The emulator sends identical MIDI note and CC messages to the physical controller.
- Launch SuperCollider IDE.
- Run
Platform.userExtensionDir(Shift+Enter). This prints your extensions path. - Move or symlink the SNAPS directory into that extensions directory.
- In SuperCollider IDE, click Language > Reboot Interpreter.
SNAPS uses two JSON config files that are not tracked by git (they contain machine-specific settings). Example templates are provided:
config_example.json— copy toconfig.jsonlibrary_example.json— copy tolibrary.json
| Field | Description |
|---|---|
device |
Your audio device name. Run ServerOptions.devices in SuperCollider to see available devices. See platform-specific examples below. |
bpmCC |
MIDI CC number for the BPM knob. |
rhythms |
Array of rhythm patterns (subdivisions in beats). |
loopPlayers |
Array of looping sample players. |
alphanumericPlayers |
Array of alphabetical one-shot players. |
players |
Array of random one-shot players. |
Device name by platform:
| Platform | Example device value |
|---|---|
| macOS + Loopback | "Loopback Audio" |
| Windows + Voicemeeter Potato | "ASIO : Voicemeeter Potato Insert Vi..." |
| Linux + JACK | "JackRouter" |
Player fields:
| Field | Description |
|---|---|
startStopMidiNote |
MIDI note number that toggles the player on/off. |
reRandomizeMidiNote |
(Loop players only) MIDI note to pick a new random sample. |
rhythmCC |
MIDI CC for the rhythm subdivision knob. |
maxParticlesCC |
MIDI CC for the max simultaneous particles knob. |
categoriesCC |
MIDI CC to crossfade between two sample categories. |
category / categories |
Sample category name(s) from library.json. |
MidiChannel |
MIDI channel for Scale Navigator input to this player. |
| Field | Description |
|---|---|
root |
Absolute path to your samples directory. |
paths |
Map of category names to subdirectory names inside root. |
Each sample subdirectory should contain audio files tagged with pitch class information.
- Copy
config_example.jsontoconfig.jsonand edit:- Set
"device"to your audio device (see Configuration above). - Set
"MidiChannel"on each player to match your Scale Navigator setup. - Set sample categories to match your library.
- Set
- Copy
library_example.jsontolibrary.jsonand edit:- Set
"root"to the absolute path to your samples folder. - Map category names to subdirectories.
- Set
- Open
nt.scdin SuperCollider IDE. - Run the blocks top to bottom (select each block and press Ctrl+Enter / Cmd+Enter):
- Block 1 — Loads config and sets the audio device.
- Block 2 — Boots the server, defines synth defs, and loads the sample library.
- Block 3 — Connects MIDI and clears MIDI Mix LEDs.
- Block 4 — Sets up all players, clock, and CC mappings.
- Press buttons on the MIDI Mix (or web emulator) to start and stop players.