project name: ndls
project url: https://github.com/andr-ew/ndls/releases/download/latest/complete-source-code.zip
author: andrew
description: 4-track modeless tape looper, delay, & sampler
discussion url: https://llllllll.co/t/ndls/
documentation url: https://github.com/andr-ew/ndls
tags: delay looper sampler grid arc


ndls overview documentation image, labeled diagrams of the grid, norns screen, and arc. see rest of document for accesible text documentation

4-track, grid-based, tape looper, delay, & sampler based on softcut. modeless, gesture looping, & performance-minded. highly bendy.

a spiritual successor to anachronism, anaphora, and several unreleased precursors.

currently in beta - any & all feedback is highly appreciated! feel free to create an issue here or send me an email andrewcshike@gmail.com :) (email is usually the best way to reach me). if you’re running into trouble, be sure to check out the issues section to see if your issue has already been logged ~



also supported


install from the maiden catalog


in the maiden REPL, type:

;install https://github.com/andr-ew/ndls/releases/download/latest/complete-source-code.zip

if you wish to install a different version, see the releases tab


recommended: luanch the script from the norns SELECT menu.

users with accesibility needs who are unable to acess the norns system menus might consider launching the script from the maiden REPL via the browser or another websocket-connected application:


grid UI

grid documentation image. a labeled diagram of the grid. text descriptions below

the grid is split in two halves with two blocks of metaparams mapped to four tracks of softcut. rows 1-4 control tracks 1-4, rows 5-8 also control tracks 1-4.

see here for alternate grid layouts (64, midigrid, 256)

note: x & y ranges of each component in the 128 grid layout are labelled between the square brackets [] for those unable to view the daigrams in this document. if you need adjusted labels for 64 or 256 layout please email andrewcshike@gmail.com

rec & play

[x: 1-2, y: 5-6]

toggle record & playback states. these controls are interdependent. here are some ways to use them:

by default, ndls loops asynchronously between tracks & independently from the global clock. see window scopes for info on synchronous modes & additional params for clock-synced settings.

track focus & page focus

[track focus x: 1, y: 1-4; page focus x: 3-5, y: 1]

set the focus for the norns screen & encoders (not grid). norns’ controls are split into three pages: MIX, TAPE, and FILTER, and are editable intependently across four tracks, focused with track focus.

rate: reverse & octave

[reverse x: 7, y: 1-4; octave x: 8-14 ]

set the record and playback direction and power-of-two rate multiple (AKA octave, or time division). the rate of change (or slew) for both these controls is touch-reactive. a single key tap will jump instantly to a new value, while hold-and-release gestures increase slew time in proportion to the held duration.


[ x: 3-6, y: 5-8 ]

select which audio buffer (1-4) to record & play back from. multiple tracks can share the same buffer, for multi-octave polyphonic looping & decoupled record & play head delay systems. lots of possibilities!

sample loading

to load a sample file into a buffer, hold one of the four buffer keys on any track and press K3 when the modal pops up. this will enter the fileselect screen on norns & you can select a file with the keys & encoders.

users with accesibility needs: visual feedback neccesary for file browsing. you can alernatively load a sample by running a line of code like this in the REPL

sc.loadsample(buffer_number, '/home/we/dust/audio/path/to/file.wav')


[ x: 3-6, y: 7-13 ]

select a preset. there is 1 default preset + 6 unique, optionally randomized presets for any/all track controls. by default, only window parameters will be included in the preset. see metaparams for advanced info.


[ x: 15, y: 1-4 ]

toggle looping on or off. disable for one-shot playback, triggered by the preset keys. turn ndls into a sampler!

send & return

[ send x: 14, y: 5-8; return x: 15, y: 5-8 ]

these keys allow you to send the output of a track into an invisibe audio bus & return them back into the input of another track. tracks with a lit send key will be routed into every track with a lit return key.

pattern recorders

[ x: 16, y 1-8 ]

the rightmost column contans 8 pattern recorders, these can record & play back any combination of input on grid, norns, or arc. use them like this:

norns UI

across 3 pages, all 3 norns encoders are mapped to 9 metaparams for each track, with K2 & K3 mapped to randomizations of certain values. use the track focus + page focus components on the top left of the grid to switch between views. hold K1 on any page to assign scopes. changes to any control can be pattern recorded using the grid.

page 1: MIX

norns MIX page documentation image. labelled image of the norns sreen. text descriptions below.

E1: perserve/feedback level

the rate at which old material fades away. turn it up in a delay for long echo tails, or turn it down in a loop for tape decay memory loss. note that by default this is globally scoped.

E2: playback/output level

this level is summed with the gain param in the params menu to set the actual output level.

E3: stereo pan amount

this does not set the pan value directly, but rather, each track has a unique multiple that sets the pan value relative to the spread value. by default, in the global scope, spread will spread out all tracks evenly in the stereo feild, but you can switch the scope to track or preset to set pans independently, there will just be some uneven scaling between tracks.

K2: randomize level

hold to reset to 0db.

K3: randomize spread

hold to reset to center.

page 2: TAPE

norns TAPE page documentation image. labelled image of the norns sreen. text descriptions below.

E1: record & playback rate detune

non-quantized exponential rate multiple. +1 ocave to -1 octave.

E2: window position

adjusts both start & end points, displayed in seconds. note that by default this is preset scoped.

E3: window length

adjusts loop length in seconds. note that by default this is preset scoped.

K2: randomize position

hold to reset to 0

K3: randomize length

hold to reset to full length of loop

page 3: FILTER

norns FILTER page documentation image. labelled image of the norns sreen. text descriptions below.

E1: filter resonance

make stuff sound pointy. note that by default this is globally scoped.

E2: filter cutoff

cutoff frequency, from 20 to 20k Hz.

E3: filter type

select between lowpass (default), bandpass, highpass, and bypass (dry).

K2: randomize cutoff

hold to reset to 1.

K3: randomize type

hold to reset to lowpass

arc UI

when arc is connected, the arc focus component will be visible to the right of track focus. the norns section above contains more info about the available params & metaparams (gain, cut, win, len). any changes to these controls can be pattern recorded using the grid.

horizontal orientation

arc documentation image

by default, the arc will display four different metaparams from a single track – gain, cut, win, and len. press any row in the 4x4 grid with one finger to focus on another track.

vertical orientation

arc documentation image

to rotate to the vertical orientation, hold & release any two keys in the same column with two fingers. now, arc will display the same metaparam across all four tracks. press any column to focus on another metaparam ( gain, cut, win, or len).


the majority of the values mapped to norns, grid, and arc, are metaparams. metaparams are a way of connecting one or more intependently-editable values to a single destination, like filter cutoff or window length. each metaparam has an assignable scope, which detirmines whether values are edited on a global basis (across tracks), on a per-track basis, or on a per-preset basis.

the three scopes are (predictably) called global, track, and preset. on the norns screen, track-scoped metaparams are boxed-out while preset-scoped metaparams are underlined. by default, window+length are the only metaparams in the preset scope, while old, spread, and q start out in global scope.

a diagram visually illustrating the relationships between the three scopes. text desctiptions above & below.

you can think of each metaparam as having either 1, 4, or 28 true values, either shared, different between tracks, or different between presets on different tracks, depending on the scope. in the diagram, the true values have the box around it.

assigning scope

a diagram showing the scope assignment modal. text description below.

to change a scope, hold K1 on any page & turn the encoder associated with the metaparam you’d like to edit.

[TODO: TAPE page scope capture]

note that on the TAPE page, E1 sets the scope for all rate controls (rate, rate: reverse, and rate: octave), E2 sets the scope for both window and length, and E3 is left over to set the scope for loop

———————————- BETA 0.2 NOTE ————————————–


preset initialization

to assist with differentiation across the 7 presets in preset scope, preset values can be optionally auto-randomized upon creating a new loop. this is called preset intitalization and there are two options, random (x) or default (d). while holding K1, preset initilizatition can be assigned using the K2 or K3 associated with the metaparam, assuming the scope has been assigned to preset.

window scopes

TODO: further descriptions for preset & global behaviors. BETA NOTE: these modes aren’t done yet.


in ndls, norns PSET system serves two important roles: saving sessings, and overriding default values.

saving sessions

ndls saves all session data, including buffer audio & pattern data, alongside your PSETs. just head to PARAMETERS > PSET and save a new PSET. note that the first two slots should already be in use. the first is the default slot, always loaded when launching the app. the second slot (last session) is always saved to when exiting the app. load this slot if you need to access your last session, but didn’t save it.

———————————- BETA 0.2 NOTE ————————————–

any PSETs saved on a beta version may not load in full on a future version. you can always re-download an older version of ndls to access obsolete PSETs.


overriding default values

as mentioned, the default slot is loaded when starting the app. you can save to this slot to change the default parameter values that are loaded when you start up. this is especially useful for redefining metaparam scopes, but you can also tweak default values on global & track scoped metaparams. first, if you have any audio in your buffers (still visible in the TAPE page waveforms, even if all playback is silenced), you might want to clear that out by going to PARAMS > EDIT scrolling down to the PSET options header and triggering force clear all buffers. then, right below that, there’s a shortcut for overwrite default pset.

PSET options

there are a couple more useful tweaks under the PSET options header in PARAMS > EDIT

additional params

a few more params can be accessed exclusively in the params menu

track params

softcut options

———————————- BETA 0.2 NOTE ————————————–

clock-sync forthcoming