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.

NOTE: to view images, please read at github.com not norns.community



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!

hold a buffer key in any track to access the buffer screen, and to export/import samples


[ 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:


[ x: 3-5, y: 2 ]

hold to enter assignment mode for modulation sources 1-3. see modulation for more info.

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: quality

from -5 to 0, smoothly engages the tracks filter, form bypass to the response set by curve. past 0, ressonance is increased.

E2: cutoff

cutoff frequency, from 20 to 20k Hz.

E3: curve

select the response curve. smoothly crossfades between lowpass at -5, bandpass at 0, and highpass at 5.

K2: randomize cutoff

hold to reset to 1.

K3: randomize curve

hold to reset to lowpass

arc UI

when arc is connected, the arc focus component will be visible on the far left of the grid.

horizontal orientation

arc documentation image

by default, the first ring of the arc is mapped to the gain control of the selected track, and rings 3-4 are mapped to the tree other metaparams associated with the current page (lvl from MIX is skipped, since gain is shown). tap a row on the arc focus component to focus on that 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.


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 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 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


on the grid, hold a buffer key in any track to access the buffer screen. this displays some useful information about the held buffer, and allows you to export and import audio with K2 & K3.


either displays the current playback window of the held buffer & track, or shows “empty”, if the buffer is empty

free space

this is the amount of free space currently allocated to the buffer. by default, it’s 2m 55s on 128 & 64 grids, and 1m 57s for 256 grids.

max free space

in some circumstances, samples up to 5m 50s can be loaded into a buffer. if this is the case, max free space will display “5:50”.

to accomplish this, ndls will reallocate softcut’s total buffer space of 11m 40s between adjacent buffers. so, if a sample is longer than 2m 55s is loaded into buffer one, the remaining free space will be taken from buffer 2. this only works if buffer 2 is empty, i.e. no loops or samples have been loaded/recorded to it.

currently buffer allocation is only supported for 128 & 64 grids – on 256 free space is fixed to 1m 57s for every buffer.

if you’d like to get buffer allocation back to its default state, use the force clear all buffers param.


tap K2 on the buffer screen to export the current loop window of the buffer/track to disk. useful for trimming a recording & re-importing it back to ndls.


load a sample into the buffer. see max free space for sample length limitations.


all metaparams can accept modulation from one of two internal LFOs, or an input of a connected crow. at any given time there are three sources available for mapping, the defaults are below, which can be changed in the params menu.

source 1 source 2 source 3
lfo 1 lfo 2 crow in 1

controls for the LFOs can be found in the params menu (midi-mapping reccommended)

to assign a metaparam to a source, hold one of the three source keys on the grid, located right below page focus, and tap or turn any metaparam on the grid, norns, or arc. a source can be mapped to multiple metaparams.