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