nisp

Nisp is a four voice tracker with built-in scheme interpreter, written in Lua
Each cell can store small code snippets, which are executed every time playhead passes the cell

Keyboard shortcuts

~ - Toggle REPL screen
⇧ Shift + ⌃ Ctrl - Sequencer playback
⇪ CapsLock - Toggle follow mode
⇧ Shift+1 - 4 - Mute track
↩ Enter - Open script editor
⎋ Esc - Close script editor
⇧ Shift + ↩ Enter - Save script
⌃ Ctrl + C - Copy
⌃ Ctrl + V - Paste
⇧ Shift + ⎋ Esc - Norns system menu
⌃ Ctrl + - Switch menu tabs
⇧ Shift + - Fast navigation in system menu

Commands

(def symbol value)
Define a symbol

(lambda (...)(func))
Anonymous function

(quote expr) ('expr))
Returns unevaluated expression

(if cond (expr1) (expr2))
Evaluate expr1 if cond is true, else evaluates expr2

(when cond (expr))
Evaluate expr if cond is true

(@ track)
Returns current position, track argument is optional

(bpm value)
Set global bpm

(length value)
Set pattern length

(div value)
Set track speed divider

(jmp pos)
Jump to position

(skip pos)
Skip current step

(ever N, expr)
Evaluate expression every N cycle

(mute track)
Mute track, track argument is optional

(sync track)
Sync positions to track, or to global pos. Track argument is optional

(save id)
Save pattern

(load id)
Load pattern

(note value)
Write note value at current position

(sample value)
Write sample value at current position

(pos value)
Set position of current sample

(param value)
Set engine parameter for current sample slot

(help) - Display help
Engine parameters
ParameterDescription
atkAmp envelope attack
decAmp envelope decay
susAmp envelope sustain
relAmp envelope release
detuneDetume amount
strchSample stretch
ctfFilter cutoff frequency
resFilter resonance frequency
ftypeFilter type
qltSample quality
fm-lfo1Freq. modulation amount by LFO1
fm-lfo2Freq. modulation amount by LFO2
f-lfo1Filter freq. modulation amount by LFO1
f-lfo2Filter freq. modulation amount by LFO2
p-lfo1Panning modulation amount by LFO1
p-lfo2Panning modulation amount by LFO2
a-lfo1Amplitude modulation amount by LFO1
a-lfo2Amplitude modulation amount by LFO2
fm-envEnvelope freq. modulation amount
f-fm-envFilter freq. modulation envelope
f-fm-velFilter freq. modulation velocity
f-fm-prFilter freq. modulation pressure
f-trackFilter tracking
p-envPanning modulation envelope
m-atkModulation envelope attack
m-decModulation envelope decay
m-susModulation envelope sustain
m-relModulation envelope release

Math

+ - * / % ^ = eq > < <= >= rnd

Other

list list? append apply begin car cdr cons len get put nil? num? print concat map #t #f

Examples

nisp

Code snippets can be either executed live in REPL or stored in pattern cells

(def A 1) 
Set A to 1

(print "Hello")
Double quotes for strings

(def A (lambda () (print "Hello")))
Define a function A with no arguments

(def A (lambda (a b c) (+ a b c))) 
Define a function A which takes 3 arguments and returns their sum.

(get '(1 2 3 4) 1) 
Returns first element from list

(bpm 120) 
Set bpm to 120

(jmp)
Set current track position to zero

(jmp (@ 2))
Set current track position same as track 2

(pos (rnd 1 99))
Set random start position for current sample

(atk 0.25)
Set current sample attack to 0.25

Check out this detailed step-by-step guide by mudlogger to get familiar with Nisp.

Extras

Scheme how-to