一键导入
write-music
write limut DSL code to produce music in a style requested by the user
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
write limut DSL code to produce music in a style requested by the user
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Internals of the limut DSL parser, lambda/user-function machinery, player overrides, pattern timing, and sections. Use when modifying anything under expression/ (especially parse-expression.js, parse-var.js, parse-map.js, lookupOp.js), section/sections.js, player/callstack.js, player/standard.js, player/player.js, parse-line.js, or pattern/pattern.js — or when debugging issues with lambdas/user-defined functions, `set` overrides not taking effect, `dur` timing oddities, chord/stutter/delay expansion, or sections (active/next tracking, section params).
Run the limut in-browser test suite from a shell using headless Chrome. Use when the user asks to run, check, or verify tests without opening a browser, or when validating a change touched testable code.
Verify audio-graph wiring changes (fx chains, connectable construction, node-function output) in limut by driving the running app in headless Chrome and inspecting the constructed Web Audio graph. Use when modifying play/player-fx.js, play/nodes/graph.js, play/effects/*, play/synth/bus.js, expression/connectOp.js, expression/connectableOps.js, or anything else whose effect is "the audio node graph wires up differently."
Internals of the limut audio node graph, lifecycle, and parameter evaluation. Use when modifying anything under play/, expression/connectOp.js, expression/connectableOps.js, play/nodes/, play/effects/, play/envelopes.js, play/player-fx.js, or play/eval-audio-params.js — or when debugging audio leaks, "_destructor is undefined" errors, fx chain bugs, or Web Audio API constraint violations.
| name | write-music |
| description | write limut DSL code to produce music in a style requested by the user |
Write limut DSL code to produce music. Read the CLAUDE.md in the project root for full DSL reference. Below are practical patterns learned from examples.limut and the full index.html documentation.
A piece typically has:
set bpm=N (common: 80-150)set scale=NAME (minor, phrygian, dorian, mixolydian, lydian, penta, major, etc.)set root=N to transposeset ch=... for shared chord progressionsEach line defines one player: ID TYPE PATTERN, param=value, param=value
Limut is case insensitive; piano, Piano, and PIANO are all treated the same.
// line comment/* ... */ block commentid synth pattern, params - define a playerset id params - override player paramsset var=value - set global varpreset name synth, params - create a synth presetinclude 'url' - include a limut source fileCommands can span multiple lines. A new command starts when the beginning of a line matches set , preset , or id type pattern.
Use play type with letter patterns. Each character is a 1-beat hit; . is rest.
Each letter maps to a sample folder. Multiple samples exist per letter (selected via sample=N).
| Char | Sound | Char | Sound |
|---|---|---|---|
x | Bass drum | X | Heavy kick |
v | Soft kick | V | Hard kick |
o | Snare drum | O | Heavy snare |
u | Soft snare | i | Jungle snare |
I | Rock snare | D | Dirty snare |
- | Hi hat closed | = | Hi hat open |
: | Hi-hats | + | Clicks |
* | Clap | H | Clap |
h | Finger snaps | # | Crash |
~ | Ride cymbal | s | Shaker |
S | Tambourine | t | Rimshot |
T | Cowbell | e | Electronic Cowbell |
k | Wood shaker | K | Percussive hits |
l | Robot noise | L | Noisy percussive hits |
m | 808 toms | M | Acoustic toms |
r | Metal | R | Metallic |
p | Tabla | P | Tabla long |
d | Woodblock | n | Noise |
a | Gameboy hihat | A | Gameboy kick drum |
b | Noisy beep | B | Short saw |
c | Voice/string | C | Choral |
E | Ringing percussion | f | Pops |
F | Trumpet stabs | g | Ominous |
G | Ambient stabs | J | Ambient stabs |
N | Gameboy SFX | w | Dub hits |
W | Distorted | y | Percussive hits |
Y | High buzz | z | Scratch |
Z | Loud stabs | q | Ambient stabs |
Q | Electronic stabs | U | Misc. Fx |
| | Hangdrum | / | Reverse sounds |
\ | Lazer | % | Noise bursts |
$ | Beatbox | @ | Gameboy noise |
& | Chime | ! | Yeah! |
1 | Vocals (One) | 2 | Vocals (Two) |
3 | Vocals (Three) | 4 | Vocals (Four) |
kd play X., room=0.1 // four-on-floor kick
kd play (Xv)., room=0.1 // kick with ghost note chord
kd play X..X.X.., room=0.1 // syncopated kick
sd play ..O., room=0.1 // backbeat snare
sd play ..(OH*)., room=0.2 // snare with clap layer
hh play -, echo=1/4, amp=2 // 8th note hats
hh play -[--]-[.-], fold, amp=2 // breakbeat-style hats
hh play .[::], echo=1/8 // hat pattern with tight hats
(...) = chord (play all simultaneously)[...] = subsequence (fit multiple events into one dur)<...> = supersequence (cycle through alternatives each pattern repeat)Examples:
X<...[.v]> = first time X then ..., second time X then .v[XX] = two kicks in one beat (double time)(OH) = snare and clap together. = rest (silence)_ = continuation/tie (extends previous note, NOT rest)0# = sharp0b = flat0= = extend duration by 50%0! = shorten duration by 33%0^ = 50% louder0v = 33% quieterx^ = 50% louder (non-numeric, for play synth)0a = other chars after digits become params; eg t tri 01g23, glide=this.g/2`01 23` = backtick pattern literal; whitespace is ignored, contents treated as literal
01 loop 2 = play pattern only N times then stop0123 crop 2 = crop pattern to N steps (repeats if needed)1 + 2 = concatenate two patterns1 * 2 = repeat pattern N timesnow 01 = play starting on next beat instead of from beat 0follow p1 = follow another player's patterngamepad = generate notes from gamepad controllermidi = generate notes from MIDI controllerplay - sample player (letters/symbols for samples). Duration defaults to 1/2perc - sampled percussion. Duration defaults to 1/4, has choke groupsaw - sawtooth wave, oct=4sine - sine wave, oct=4square - square wave, oct=4tri - triangle wave, oct=4pulse - pulse wave, oct=3wave - waveform specified by wave paramping - sine wave ping, oct=5, simple envelopenoise - white noise pad (AudioWorklet)dsaw - detuned sawtooth, oct=4dsine - detuned sine pad, oct=4dsquare - detuned square, oct=4dtri - detuned triangle, oct=4dbass - detuned sawtooth bass, oct=2dpulse - detuned pulse, oct=3dwave - detuned waveform specified by wave paramswell - detuned triangle pad, oct=4fm - FM base synth; configure operators with op1 to op6 params
op1={ratio:5.19,target:3,wave:'saw',depth:0.8,att:0.01,rel:0.1}fmbass - FM bass, oct=2bell - FM bellglock - FM glockenspiel, oct=4glass - FM glass/chime, oct=5xylo - FM xylophone, oct=4ethereal - FM pad, oct=5epiano - DX7-style electric pianoaudiosynth - base type; use play param for custom audio node graphpiano - sampled pianopwm - pulse width modulation (AudioWorklet). pwm=1/2 for pulse widthprophet - PWM with LFO pulse-width (AudioWorklet)supersaw - 7-oscillator supersaw lead, oct=4ambi - ambient drone, multiple sinesmultiwave - multiple oscillators: wave1={'saw',amp:[0:1]n,detune:wow}pitchedperc - synthesised percussion (click/hit/body/rattle components)
click={1}, hit={0,sample:'^',index:1,rate:3/2}body={1,att:5ms,dec:400ms,freq:55hz,boost:150hz,wave:'sine',saturation:0}rattle={1,att:0ms,dec:30ms,rate:1,filter:'lowpass',freq:55hz,boost:205hz,q:18}bd - preset kick drum based on pitchedperc. Params: accent, tone, tune=55io808 - TR-808 simulation. type='bd' selects sound. Params: level, tone, decay, snappy, tuningimpulse - single pulsesample - pitched sample player. Use sample param for URL, start for playback offsetexternal - microphone/line input. track=1, channel=1crackle - crackly soundsnoisefloor - slowly varying noise floorbus - audio mix bus (plays continuously, all params per-frame). Implicit main bus exists! / stop / none - stop/remove a playerScale degrees (0-indexed): 0 = root, 1 = 2nd, 2 = 3rd, etc. Negative numbers go down.
// Melodic bass line
db dbass 0[.0][10]_, dur=1/2, lpf=[200:2000]s8, att=0, oct=(1,2)
// Arpeggio
arp dsaw 02435167, dur=1/2, sus=1/4, echo=3/4, lpf={[500:1500]l7,q:22}, att=0
// Chord stab
stab dsaw (0246), dur=[3,3,2]/4, att=0, sus=1/4, echo=3/4, lpf={[500:1700]l5,q:20}
// Pad
pad ethereal (024)(035), dur=4, room=0.7, oct=4
Basic structure: value{modifiers}@interval
1 - constant number0dB - decibel value (converted to gain; 0dB=1, +6dB100ms - milliseconds; 1s - seconds; 1Hz/1cps - Hertz; 1kHz = 1000Hz1b - beats; 1cpb - cycles per beat; 1kcpb = 1000cpb; 1cpm - cycles per minute1 (eg monochrome same as monochrome=1)[1,2] - sequence, one per event[] - equivalent to [0,1][1,2]t3 - timed sequence, each value lasts 3 beats[1:12,2:4]t - timed sequence with variable timing per value[0:3]t1 - expanded timed sequence = [0,1,2,3]t1[1,2]l3 - linear interpolated sequence over 3 beats[1:12,2:4]l - linear interpolated with variable timing[1,2]s3 - smooth (S-curve) interpolated sequence over 3 beats[1,2]e - interpolated over event duration[1,2]e1 - interpolated starting at event start, 1 beat per value[0:!300ms,1:_[1/4b:1/2b]r,0]e - piecewise envelope with mixed timing[1:!200ms,0]e@s - segment-based (more accurate timing for envelopes)[]r - random 0 to 1 each event[1,4,7]r - random choice from list[:9]r or [0:9]r - random float from range[0,1:7]r - weighted random (1 is 7x more likely than 0)[1,2]r4 - random, hold for 4 beats[1:3]r{seed:1,per:4} - deterministic seeded random[]n - smooth Perlin noise 0 to 1[1:2]n4 - noise between 1-2, period ~4 beats[]n{seed:1,per:4} - deterministic noise[v1:i1t1, v2:i2t2, ...]{p, repeat:0} - interpolate between values with custom control parameter
:/ :\ linear, :_ const/step, :~ smooth bezier, :! exponential, :^4: power curve+, -, *, /, %, ^ (power), - (unary minus)
(1,2,4) - play simultaneously| - concatenate chords: 1|2 = (1,2), (1,2)|(3,4) = (1,2,3,4)?? - "if then": this.foo??5 returns 5 if foo is truthy, nothing if not (short circuits)?: - "or else": this.foo?:5 returns foo if present, else 5 (short circuits)this.foo>1 ?? 2 ?: 3==, !=, <, >, <=, >=
{x:0,y:1} - map with key-value pairs{2,y:1} - map with main value plus subparams (eg chop={2,wave:'tri'}){r:0,g:1,b:0,a:1} (RGBA), {h:1,s:1,v:1,a:1} (HSV), {labh:1,c:1,l:1} (LabLCH)#f00f (RGBA short), #ff0000ff (RGBA long), #f00 / #ff0000 (RGB, alpha=1)'abc' - string value (single line; use \n for line breaks)p1.amp - player param lookup (returns chord of all playing events)p1.amp.0 - chord index (wraps around)p1.pulse.max - chord aggregator: max, min, first, last, rand, count, sum, avgthis.value - current event paramthis.freq - current note frequency{foo:2}.foo - map field lookup([0,1]t1@f).accum - smoothly accumulate values{time:time*2+8} - modify the time expression{per:8} - repeat sequence every 8 beats{per:8,0:7,2:3} - force values at specific beat positions within repeat{step:1/2} - advance time in discrete steps[]r@f{seed:1} = []r{seed:1}@f@e - evaluate once per event@f - evaluate per frame (~60fps) for smooth animationthis.foo@e applies @e to foo only; use (this.foo)@e for the whole lookupfoo - lookup global var named foo; returns string 'foo' if no var existsfoo{x:2} - call var as function with named paramsdur=N - duration in beats (1/4=16th, 1/2=8th, 1=quarter, 2=half, 4=whole)dur=[3,3,2]/4 - common shuffle/swing patterndelay=N - event start time offset in beatsdelay={1/2,add:2} - delay with param overrides on delayed eventsstutter=N - split event into N evenly-spaced sub-eventsswing=N - swing amount (50=straight, 58-66=swung, 75=max dotted)swing={66,period:1/2} - swing with custom period (default 1/4)amp - player amplitude (defaults to event vel)vel - event velocity (default 3/4; controls amp and usually brightness)voice - voice index within a chordtime - current time in beats this event has been playingidx - pattern index of this eventexists - 1 if player is definedplaying - 1 if player is currently soundingpulse - rise/fall value as note plays (pre-multiplied by vel)player - name of current playerfreq - note frequency in Hz (set by tonal synths)rate - playback rate for samples, animation rate for visualsatt - attack time (default unit: beats). att=0 for sharp attackdec - decay timesus - sustain time. sus={level:0.5} for sustain level (default 0.8)rel - release timeenvelope - type: 'full' (ADSR), 'simple' (ADR), 'organ' (ASR), 'pad' (cosine crossfade), 'linpad' (linear crossfade), 'percussion' (R only). Or custom expression: envelope=[1:!300ms,0]e@soct=N - octave (1=sub bass, 2=bass, 3=low, 4=mid, 5=high)oct=(2,3) - chord across octavesadd=N - add scale degrees to pitch (per-event only)add={0,#:1} - sharpen; add={0,b:1} - flattenaddc=N - add continuous semitones (per-frame, fractional). addc=wow for pitch driftdetune=N - oscillator detuning in semitonesvib=RATE - vibrato rate (default unit: cpb)vib={2,depth:1} - vibrato depth in semitones (default 0.4)vib={2,delay:1} - delay before vibrato starts (default 1/2 beat)glide=N - portamento time in beats. glide={1/3,curve:4} for curve shape (default curve:1)root=N - override root for this player onlyscale=NAME - override scale for this playerlpf=FREQ - low pass filter. lpf={400,q:20} for resonance (default q:5). lpf={400,poles:4} for 24dB/octhpf=FREQ - high pass filter. Same subparams as lpfbpf={FREQ,q:20} - band pass filter (default q:1). Multiple parallel: bpf1, bpf2 etcnf={FREQ,q:20} - notch filter (default q:1)apf1={FREQ,q:2} - allpass filter. Multiple apf1, apf2 etc (parallel, allowing phase cancellation)psf={f1:300,f2:2300,q:0.7} - phaser stage filter. Multiple psf1, psf2 etc (series)low=-6dB - low shelf EQ. low={-8db,freq:400} (default freq:200Hz)mid=-6dB - mid EQ. mid={-8db,freq:400,q:10} (default freq:600Hz, q:5)high=-6dB - high shelf EQ. high={-8db,freq:400} (default freq:1100Hz)lpf={[200:2000]l8,q:15}room=N - freeverb (0.1-2). room={2,hpf:300,mix:1/4} (default mix:1/2)reverb=N - convolution reverb duration in beats. reverb={2,curve:3,hpf:300,mix:1/4} (default mix:1/2, curve:5)echo=TIME - echo delay. echo={1,feedback:0.8} (default feedback:0.35). Bus echo: echo={1,max:2}chorus=N - stereo chorus. chorus={1,mix:1/4}phaser=RATE - phaser (default unit: cpb). phaser={1/3,mix:1/4}flanger=RATE - flanger (default unit: cpb). flanger={1/3,mix:1/4}chop=N - tremolo/gating (default unit: cpb). chop={2,wave:'triangle',mix:1/4} (waves: sine, square, triangle, saw)ring=FREQ - ring modulation (default unit: Hz). ring={32,wave:'saw',mix:1/4} (default wave: triangle)drive=N - overdrive/soft clip (1/32=gentle, 1/4=distortion, 1=fuzz). drive={1,gain:2,mix:1/4}fold=N - wavefolder. fold={1,gain:2,mix:1/4}clip=N - hard clipping. clip={1,gain:2,mix:1/4}noisify=N - distort into noise. noisify={1,gain:2,mix:1/4}bits=N - bitcrusher (1=very distorted, 32=clean, 0=off). bits={4,gain:2,mix:1/4}suck=N - scale down small amplitudes (gated tail effect). suck={1,gain:2,mix:1/4}compress=RATIO - compression. compress={12,gain:2,threshold:-40dB,knee:10dB,att:0.1,rel:0.2}pan=N - stereo position (-1 to 1)pan=(-1,1) - hard pan left and rightmono - force signal to monochoke=GROUP - choke group (string); notes cut off others in same group across playerssample=N - with play: choose sample set. With sample synth: URL of audio filesample={32,pitch:261.6} - specify original sample pitch (default 261.6Hz = C4)start=N - sample playback start time (default unit: seconds)wave=NAME - waveform: sine, square, sawtooth/saw, triangle/tri, pulse, plus many more: ah, bass, brass, buzzy, celeste, ethnic, organ, piano, trombone, wurlitzer, etc. (hyphenated names need quotes)bus=ID - mix to specified bus player (default: main)cutoff - filter cutoff 0-1 (for presets that support it)resonance - filter resonance (for presets that support it)blank - solid colourclouds - moving cloudskal - kaleidoscopeswirl - psychedelic swirljulia - Julia set fractallines - twisting linesblob - morphing 3D blobstreetlight - passing streetlightsgrid - square gridglow - additive glowstars - exploding starsbits - bitwise fractal patternsxor - bitwise xor patternsgradient - simple y gradientshadertoy - shadertoy shader (use id param; must be public+api)image - online image (use url param; must support CORS)webcam - webcam feed. device param for device index/label. width/height for resolutiontext - text display. text={'Hello',font:'times',size:'144',linesize:0.7,y:1/4,x:2/3,style:'bold italic'}buffer - render target. Other synths render into it with buffer=IDscope - audio waveform displayscopefft - frequency spectrum displayreadout - digital value displaydmx - DMX lighting output. channel, set, lights, addl, mul, min, max paramsadd - add to pattern valuezorder - draw order (default: line number / 1000)fade - brightness fadeouttime - override shader time (default unit: beats; overrides rate and sway)rate - shader time progression ratepulse - audio signal effect on visual valuesway - audio signal effect on visual timeloc - position/size: {x:0,y:0,w:2,h:2} for fullscreen. Coords: (-1,-1) bottom-left to (1,1) top-rightwindow - display only portion matching screen positionscroll - scroll shader: {x:0,y:0}repeat - repeat shader section. repeat={1/2,x:0.1,y:-0.05}zoom - zoom: {x:1,y:1}rotate - rotation in full turns (1/2 = 180 degrees)mirror=N - number of mirror planes. mirror={10,rotate:1/4,fan:1}fore - foreground colourmid - middleground colour (defaults to midway between fore and back)back - background colourpixellate=N - pixellate to N pixels in x. pixellate={10,y:20}perspective=N - perspective warp (negative to invert). perspective={-1,shade:1/2}tunnel - tunnel/slitscan warpripple - ripple distortion. ripple={1,scale:1/4}additive - additive blendblend - blend mode: additive, subtractive, average, multiply, invert, min, maxmonochrome - 0=normal, 1=monochromevignette - edge fadeout. vignette={1/2,aspect:4/3,cutoff:0.95}vhs - VHS tape effectrecol - recolour: oil, hue, fire, sunset, neon, titaniumcontrast - power contrast curve (0=none)buffer=ID - render to a buffer synthrez=N - buffer render target resolution scale (default 1/2)feedback - buffer video feedback. feedback={zoom:1.01,ripple:1/32,contrast:0.005}bpm - beats per minute (resets unless set every update)scale - scale name (resets unless set every update)root - root pitch offset in semitones (fractional OK for tuning nudges)beat.readouts - beat counter display: beat.readouts=(3,12) (default: (12,16,32), max 3)time - current time in beatswow - smooth random pitch drift for analog feel; eg addc=wowtg - trance gate signal (flips on/off every quarter beat)drop6_2 through drop63_1 - predefined on/off drop patterns (eg [1,0]t[6,2])tile_full, tile_tl/tr/bl/br/m, tile_h1-h5, tile_v1-v5 - visual locationsfullscreen - full screen tiletile_random/tile_rand - random location tilesparkle - small random location tiledroplet - small tile falling down screenspark - small tile flying outwardsgravity - accelerating downward motion (combine: spark+gravity)firefly - random insect-like motiontransparent, black, darkgray, gray, lightgray, white, red, orange, yellow, green, blue, indigo, violet, neonpink, neongreenrandom - random colourrainbow - colour cycling through rainbowabs{-1} - absolute valuesign{-1} / sgn - sign (-1, 0, 1)pitch{1} - frequency for scale degree. pitch{4#} sharp. pitch{0,oct:3,scale:minor,root:2}eventpitch{} - frequency based on current event paramsfloor{1.5} / ceil{1.2} / round{1.7} - rounding. floor{1.7,to:1/2} rounds to precisionaccum{1} - accumulate value over time (only rises)smooth{[]r@f} - smooth a value. smooth{x,att:4,dec:4} or smooth{x,2} combined raterate{[0:1]l1@f} - rate of change in units per beatfirst{3,1,2} / last{3,1,2} - first/last argumentmin{3,1,2} / max{3,1,2} - min/max of argumentscount{3,1,2} / sum{3,1,2} / avg{3,1,2} - count/sum/averagerand{3,1,2} - random choice from argumentsrand - pseudo-random 0-1 (time-hashed; respects step/per modifiers)euclid{3,from:8} - Euclidean rhythm generator. euclid{3,from:8,offset:1} for rotationsin{x} / cos{x} / tan{x} - trig functions (radians)time - current time in beats (respects modifiers)For building custom audio graphs with >> connect operator and audiosynth:
osc{'sawtooth',freq:440,phase:0} - oscillator nodeconst{1} - constant value nodegain{1} - gain nodedelay{1/4b,feedback:...,max:1b} - delay nodepanner{0} - stereo panner (-1 to 1)sample{sample:'url',start:0s,rate:1} - sample player. Also: sample{sample:{x}->...,length:0.2s} function-generatedsample{sample:'url',loopstart:1,looplen:2} - looping samplebiquad{'lowpass',freq:440Hz,q:5} - biquad filter (lowpass/highpass/bandpass/notch/lowshelf/highshelf/peaking)compress{ratio:0,threshold:1/316,knee:100,attack:0.01s,release:0.25s} - compressorconvolver{env:{x}->...,length:1s} - convolver reverb. Stereo: convolver{env:{l:{x}->...,r:{x}->...},length:1s}shaper{{x}->...,samples:2,oversample:'2x'} - wave shaper ('2x', '4x', 'none')series{...,count:2} - repeat chain in seriesloop{...,feedback:...} - audio feedback loop (must contain delay)mix{...,mix:1/2} - dry/wet mix. Also mix3 through mix8 for fixed ratiosstereo{l:...,r:...} - split/process/join stereo channelsflipper - swap L/R channelsidnode / dry / thru - pass-through nodeinclude 'lib/nodes.limut')Helper functions wrapping node functions (all args can be positional):
lpf{freq,q:5} / hpf{freq,q:5} / bpf{freq,q:5} / nf{freq,q:5} / apf{freq,q:5} - filterslpf4{freq,q:5} - 4-pole low passlsf{gain,freq:1100Hz} / hsf{gain,freq:1100Hz} / pkf{gain,freq:1100Hz} - shelf/peak EQlfo{freq,wave:'triangle',lo:0,hi:1,phase:0} - LFO (any frequency)osc.sin{freq} / osc.saw{freq} / osc.square{freq} / osc.tri{freq} / osc.pulse{freq} - typed oscillatorsdrive{amount:1/2} - overdrive waveshaperstanh{gain:3/2} - tanh saturation (alias for shaper.tanh)shaper.tanh{gain} / shaper.atan{gain} / shaper.poly{gain} / shaper.pow{curve} / shaper.asym{gain,bias} / shaper.diode{gain,pos,neg} - waveshaperscompressor{...} / limiter{...} - dynamicsinclude 'lib/effects.limut')Wet-path effects (wrap in mix{} for dry signal):
echo{time:1/8b,feedback:0.7,max} - echo with feedback and dry pathpingpong{time:1/4b,feedback:0.7} - stereo ping-pong delayreverb{length:1b,curve:3} - convolution reverbflanger{control:[0,1]l8@f,feedback:0,lo:0.0005,hi:0.007} - flangerphaser{control:[0,1]l4@f,lo:300Hz,hi:2600Hz,stages:4,q:1/2} - phasershifter{ratio,length:0.03} - pitch shiftershimmer{ratio:2,length:2s} - shimmer reverbtape{wow:1,cut:-10db} - cassette tape effectairverb{delay:1/2b} - airy reverb with flanger and stereo pingponggrain{ratio,length:0.03,phase:0} - granular resynthesis graindemon{} - demon voice effect (for vocals/mic)ultracomb{f:...,p:...,s:...,stages:6} - ultracomb filter (growling sounds)slider{0.1} - on-screen slider. slider{name:'Foo',min:-5,max:5,curve:2}gamepad{1} - gamepad axis (-1 to 1). gamepad{button:0} (0-1). gamepad{'lsh'} left stick horizontal. gp is aliasmidi{70} - MIDI control/note (0-1). midi{36,9,1} (control 36, channel 9, port 1)midi{'bend'} - pitch bend (-1 to 1). midi{'notes'} - chord of playing notes. midi{'vel'} - velocitylist - list all player base types including presetslist audio - list filtered by stringinclude 'preset/synthwave.limut')Audio: moroder, blade, laserharp, synlead, synpluck, synbass, chiparp, softpad, space, blues, basspluck, bloom, pick, softkeys, epiano, lushpad, stringpad, oxy, vambi, cybass, cydist, cyborg, hiss, blips, chime, play80s
Visual: neongrid, neonbars, neonbits, neonlines, neonsine, neonheart, neonshapes, skybars, sun, sunsetsky, vhsbuffer
Many support cutoff param (0-1, default 1/2). Some support decay param.
include 'preset/808.limut')Individual: bd808, sd808, oh808, ch808, cb808, cp808, ma808, ht808, mt808, lt808, hc808, mc808, lc808, cl808, rs808, cy808
Combined: tr808 (all-in-one; pattern chars select sound: x/v=bd, o/i/u=sd, h/*=cp, -/:/a=ch, ==oh, ~=cy, k=cl, m=mt, t=rs, s=ma, p=mc, e=cb; ^ flag for accent), h808 (hihats; o flag for open), t808 (toms; h/l flags), c808 (congas; h/l flags)
include 'preset/909.limut')Synthesized: bd909 (level, tune, attack, decay), sd909 (level, tune, tone, snappy), h909 (level, chdecay, ohdecay; o flag for open), cp909 (level), cc909 (level, tune), rc909 (level, tune), t909 (level, tune, decay; l/h flags), rs909 (level)
Sampled (lighter CPU): bds909, sds909, hs909, cps909, ccs909, rcs909, ts909, rss909
All: event value gives accent.
include 'preset/303.limut')tb303 - acid bass. Controls: wave ('saw'/'square'), cutoff, resonance, envmod, decay, accent (all 0-1, default 1/2). Pattern flags: a accent, u up octave, d down octave, s slide.
Example: b tb303 `0a2u2b0d 0u0a2d3 00u0a0d 0da4ua5a6u`, cutoff=[1/4:1]n3, resonance=0.8, accent=1
include 'preset/trance.limut')trance - classic supersaw lead (default add=(0,2)). Controls: cutoff, decay, detune (all 0-1).
include 'preset/techno.limut')Includes 909, 303, trance libraries. Audio: hollow, tinbass (cutoff), sweep (cutoff), robot, techbass (cutoff, decay), growl
include 'preset/house.limut')Includes 909, 303, trance libraries. Audio: m1organ (cutoff), reese (cutoff, detune), donk (cutoff, decay), didgeridoo
chromatic, major, minor, pentatonic/penta, minorpentatonic/minorpenta, mixolydian, dorian, phrygian, lydian, locrian, harmonicminor, harmonicmajor, melodicminor, melodicmajor, diminished, egyptian, blues, wholetone, chinese, hungarianminor, romanianminor, halfwhole, wholehalf, bebopmaj, bebopdorian, bebopdom, bebopmelmin, majorpentatonic, aeolian, dorian2, yu, zhi, prometheus, indian, locrianmajor, lydianminor, minmaj, susb9, lydianaug, lydiandom, melmin5th, halfdim, altered
set (p1,p2,p3) room=0.7, echo=3/4 // apply params to multiple players
set p* amp=0 // wildcard: all players starting with p
set !p* add+=7 // all players NOT starting with p
set * swing=58 // all players
set ch=[0,2,4,3]t8 // define shared variable
add+=N - add to existing valueamp*=N - multiply existing valueoct+=N - shift octaveThere is an implicit main bus. Players can route to named buses:
fx bus 0, echo=1/2, room=0.5
bass dbass 0, bus=fx
Override main bus: set main echo=1/2
set bpm=130
set scale=phrygian
kd play X., room=0.1
hh play -, echo=1/4, amp=2
sd play ..(H*)., room=0.2
db dbass 0, dur=1/4, lpf={[150:800]r,q:12}, att=0, amp=2
pad dsaw (0246), dur=8, envelope=pad, lpf=[500:3000]l16@f, oct=(3,4), amp=1/2
set bpm=125
set scale=minor
kd play X., room=0.1
hh play .[::], echo=1/4
sd play ..O., room=0.3
bass fmbass 0[.0][.0][0.], dur=1/2, sus=1/2, lpf={[300:800]n4,q:8}, oct=(2,3), att=0, amp=0.8
pad prophet (0246), dur=8, oct=(2,3), amp=1/2, room=0.7
set bpm=70
set scale=penta
pad ethereal (024)(035), dur=4, room=2, oct=(3,4), amp=1/3, pan=[-1:1]r
pi piano 0, dur=[2,4], add=[-2:3]n1/4, amp=[0:1]n6, room=0.7, oct=5
n noise 0, dur=8, amp=1/16, lpf=[800:1200]n4, pan=(-1,1), room=2
set bpm=170
set scale=minor
kd play X..X.X.., room=0.1
sd play ..O., room=0.1
hh play -[--]-[.-], amp=2, echo=1/4
db dbass 0, dur=1/4, lpf=[200:1000]l8, att=0, oct=(1,2), amp=2
set bpm=127
set scale=phrygian
kd play X., room=0.1
hh play -, amp=2
b saw 00[43]-707[-32]-4, dur=1/2, oct=2, amp=2, echo=3/4, lpf={this.freq*[2:50]n4,q:25}
set bpm=100
set scale=minor
kd play X.v., room=0.2
sd play ..O., room=0.2
hh play -===---=, dur=1/4, amp=2
db dbass 0, dur=1/4, lpf={[200:1400]n8,q:15}, amp=1+wow, room=0.2
pad blade (024)(035), dur=4, oct=3, add=[0,4,5,6]t8
arp synpluck 02479742, dur=1/4, echo=3/4, lpf=[500:3000]l11
set bpm=132
set * swing=58
kd play V., room=0.1
hh play [.-]-[.-][--], fold, amp=2
sd play ..*., fold, room=0.1
b saw .0, dur=1/2, oct=2, lpf={[200:1500]l8,q:12}, flanger=1/7, amp=3/2
lpf={[300:2000]l8,q:15} adds movement and interest.echo=3/4 (dotted quarter) or echo=1/2 creates rhythmic interest.set ch=[0,2,4,3]t8 and use add=ch on multiple players.pan=(-1,1) or pan=[-1/2:1/2]r.amp=1-kd.pulse.min makes things duck with the kick.set overrides and commented lines for live arrangement.oct=(2,3) or oct=(3,4,5) for thickness.addc=wow adds subtle pitch drift to pads/leads.set * swing=58 gives a nice groove (50=straight, 66=heavy triplet swing).amp=[0:1]n4 for perlin noise dynamics, amp=[]r for random.chop=2 or chop=4 for rhythmic gating on pads.dsf dsquare follow ds - layer the same pattern with a different synth.main busAlmost every finished piece ends with one of these on set main:
set main compress={2,gain:2}, drive=1/32 // gentle glue + warmth
set main compress={2,gain:2}, drive=1/64, reverb={1,mix:1/4} // + tail
set main compress={3/2,gain:3/2}, drive=1/96, amp=3/2 // heavy techno glue
drive 1/96 → 1/16 trades subtle warmth for audible saturation. compress ratio 2-3 with gain:2-3 is the sweet spot.
Separate buses per stem so each can be shaped independently:
set p* bus='bp' // all perc → bp
set !p* bus='blead' // everything else → blead
bp bus 0, compress={2,gain:2}, drive=1/32, amp=2/3
blead bus 0, compress={2,gain:2}, reverb={2,mix:1/3}, amp=1/2
Common bus names: bp/bperc, bb/bbass, blead/bl, be (external).
delay|=[...]t[N,M])Adds occasional delay throws without changing every event:
set p* delay|=[(),[1,3]r/4]t[14,2] // 14 bars dry, 2 bars random throws
set p* delay|=[(),[1,3,5]r/4]t[13,3]
delay=[0,(0,[1/4,3/4]r)]t[7,1] // single-player form
|= (concat-assign) appends to existing delay rather than overwriting.
crop and +b reese 0_7 crop 14 + 89 // 14 beats of 0_7, then 89
ps sd909 ..0 crop 16
t trance 72. crop 14 + 89
pulseamp=2/3+kd.pulse.0/3 // pad swells with kick
contrast=3-2*bs.pulse.max // visual reacts to bass
zoom=1+smooth{main.pulse,att:1/2,dec:1/2} // smoothed pulse for visuals
vk kal 1, buffer='vb', blend=max, contrast=3, fore=neonpink
vb buffer 0, feedback={fore:0.95,zoom:1.01,rotate:0.001}
Common feedback knobs: fore:0.85-0.97 (decay), zoom:1.001-1.05, rotate, ripple, scroll, mirror. Reactive: feedback={fore:0.85+0.15*pk.pulse.0,zoom:1.02}.
vw webcam 0, vignette=0, buffer='vb', recol=neon, blend=max
vb buffer 0, loc=tile_tr, feedback={fore:0.9,zoom:1.02}
v kal 0, vhs, vignette={1/2,aspect:4/3}, contrast
vb vhsbuffer 0, feedback={fore:0.85}
riserriser is typically a slider ramp. Pieces stash a "drop" block as comments:
// set (b*,p*) hpf=10000-10000*riser^3 // sweep filters open
// set t cutoff=riser^3 // open lead filter
// f sd909 2, level=riser^6 // snare roll fades in
Define with set riser=slider{0,name:'Riser'}.
ph h909 0, o=euclid{16,from:[19,23]t4}-1 // open-hat pattern
b tb303 0, amp=euclid{32,from:53}-7/8 // sparse 303 line
o m1organ 0, dur=euclid{7,from:16}/4 // polymeter via dur
now ... loop 1boom play now [(vx)(vX)(VXM)] loop 1, room=2, echo=0.46
whoosh dsaw now (047) loop 1, envelope=simple, att=1/2, rel=3
now starts on next beat (not beat 0); loop 1 plays once.
Layer a delayed copy with different params on the same event:
delay=(0,{1/4,oct:3}) // dry + delayed-up-an-octave
delay=(0,{3/4,oct:2,addc:19}) // detuned/octave-shifted
delay=(0,{1/2,add:1,stutter:2}) // multiple overrides
set ch=...set ch=[(0,2,4,7),(0,3,5,7),(1,3,5b,7),(1,3,4,6#)]t4
p dsaw 0, add=ch, glide=2/3
l sine 0, add=ch.rand, oct=5 // .rand picks a voice
b bass 0, add=ch.0 // .0 picks first voice
set !p*set !p* add+=[2,-1,1,0]t4
set !p* bus='blead'
bd909, sd909, h909, cp909, t909, rs909, cc909, rc909): pass attack flag to bd909 for pitch-envelope click. Params: level, tune, decay, tone, snappy.bds909, sds909, hs909, cps909, ts909, rss909, ccs909, rcs909): much lighter CPU — prefer for dense patterns.h909/hs909: pattern char o = open hat. Drum char letters in patterns also pick variations.tb303 flags: a=accent, u=up oct, d=down oct, s=slide.Typical improv file:
include 'preset/synthwave.limut' // or techno/house
set scale=minor
set bpm=120
set main compress={2,gain:2}, drive=1/64
vk kal 0, buffer='vb', blend=max, contrast
vb buffer 0, feedback={fore:0.95,zoom:1.01}
pk bd909 0..., attack
ph h909 ..0, swing=54
ps sd909 ..0., swing=58
b tb303 0, cutoff=[0:1]n4, resonance=7/8
// l trance 0_7, decay=5, reverb=2 // bring in lead
// pad softpad (024), dur=4
// set (p*,b) amp=0 // drop block
// set t cutoff=riser^3