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
Parameter Description
atk Amp envelope attack
dec Amp envelope decay
sus Amp envelope sustain
rel Amp envelope release
detune Detume amount
strch Sample stretch
ctf Filter cutoff frequency
res Filter resonance frequency
ftype Filter type
qlt Sample quality
fm-lfo1 Freq. modulation amount by LFO1
fm-lfo2 Freq. modulation amount by LFO2
f-lfo1 Filter freq. modulation amount by LFO1
f-lfo2 Filter freq. modulation amount by LFO2
p-lfo1 Panning modulation amount by LFO1
p-lfo2 Panning modulation amount by LFO2
a-lfo1 Amplitude modulation amount by LFO1
a-lfo2 Amplitude modulation amount by LFO2
fm-env Envelope freq. modulation amount
f-fm-env Filter freq. modulation envelope
f-fm-vel Filter freq. modulation velocity
f-fm-pr Filter freq. modulation pressure
f-track Filter tracking
p-env Panning modulation envelope
m-atk Modulation envelope attack
m-dec Modulation envelope decay
m-sus Modulation envelope sustain
m-rel Modulation 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