Repository navigation
v0.4.0
·
9 commits
to main
since this release
Immutable
release. Only release title and notes can be modified.
dawg now has a full sound engine with Strudel's synth, effect and sample parameters, Strudel sample packs, wavetables (including ones made from your own audio), Euclidean drum rows and a pattern library, Orchid-style chords, sound previews with A/B, and one consistent set of keys across every screen. Projects from 0.3.0 open and sound the same, and the dawg SDK is 1.13.0 (every step additive within v1).
Previewing changes
- Audition loop in the edit menu.
Spaceloops the focused track (solo, or the whole mix withc), using its own notes over a region of at most four bars, or a short phrase by role when it has none (chord, riff, groove, or one held wavetable note). - Staged edits with A/B. While the loop plays, menu changes are staged and heard within about 100 ms (only the changed track re-renders, off-thread).
aflips between the committed and the staged sound,Enterkeeps all staged changes as one revision and one undo step,Escreverts. Changed rows showstaged ← committed. Edits from another window are re-applied under the staged ones. - The audition controller (
src/tui/audition.ts) and the preview score builder (src/audio/preview.ts) are reusable by any screen; a preview renders byte-identical to the same bars of a full render. - Hover to hear lists. With the loop on, moving through a list (wavetables, instruments, drum kits, patterns, choice lists in
/menu, and the/kitand/patternpickers) plays the highlighted item on the loop. Hovers replace each other, fast moves skip straight to the latest item, and a pack sound that needs fetching showsfetching…without blocking the cursor. Enter chooses, Esc leaves with nothing changed. - The agent can hear before it commits.
preview_soundrenders a track, or candidateset_fx/set_synth/set_wavetable/… calls applied to a copy, over the audition loop's bars, and returns RMS/peak dBFS, spectral centroid, a description and a comparison with the current sound. It plays once in a quiet window;/try agent offkeeps it silent. - Audition visuals. The menu title shows a level meter with a clip mark while the loop plays, and the focused cutoff, envelope or wavetable position row draws a one-line sketch of its response.
/try <sound command>hears a prompt command on the loop first:/try fx reverb mix 0.6, thenafor A/B, Enter to keep (one undo step) or Esc to drop it.
Effects
- A full effects chain on every track, in a fixed order: filter → dj filter → auto filter → vowel → bitcrush → distortion → tremolo → compressor → pan → phaser → chorus → leslie → post gain → delay → reverb. Each effect turns on with a good default and has a few simple parameters, with the rest under advanced.
- Filter gains
typelpf/hpf/bpf and a 12 dB, 24 dB or ladder slope. Auto filter sweeps the cutoff with a tempo-synced or free LFO (sine, triangle, square, saw, ramp, sample-and-hold) and can follow the input's envelope. - Delay turns on as a dotted-eighth stereo ping-pong with gentle feedback and a high-cut on the repeats. Reverb adds decay time, damping and pre-delay.
- Distortion (ten curves, tone, mix, automatic gain compensation), compressor (threshold, ratio, knee, attack, release, make-up), chorus, tremolo, plus Strudel's dj filter, vowel, bitcrush/coarse, phaser, leslie and post gain.
- Parameter names follow Strudel's (
lpq,delayfeedback,room,tremolodepth…), and every numeric parameter can be automated (automate distort-drive points 0:1 8:6). fxprompt command:fx delay mix 0.3,fx filter type hpf cutoff 300,fx chorus preset wide,fx tremolo off. The Effects menu lists the core effects first, with presets. The agent's newset_fxtool sets the same parameters.- ZzFX sounds:
instrument z_square(andz_sine,z_triangle,z_sawtooth,z_tan,z_noise) with Strudel's ZzFX controls as synth parameters:synth slide -4 pitchJump 300 pitchJumpTime 0.1 lfo 0.25 zcrush 0.3, pluszrand,curve,deltaSlide,zmod,zdelay,tremoloand thezappreset. Clean-room, deterministic. SDK 1.10.0 (additive). - Orbits and sidechain ducking:
fx orbit 2puts a track on orbit 2;fx duck preset pumpon a kick dips every track on that orbit at each hit and lets it swell back (Strudel'sorbit,duckorbit,duckdepth,duckattack,duckonset). SDK 1.9.0 (additive). - Convolution reverb (Strudel
ir/iresponse):fx reverb ir hall(alsoroom,plate, a pack sound or a project WAV), with FFT convolution;fx ir offreturns to the algorithmic tail. SDK 1.12.0 (additive). - Shared orbit buses:
fx orbit shared onsends a track to one delay and one reverb shared by its orbit, as Strudel orbits do. - Raw ZzFX arrays:
synth zzfx ,,129,.01,,.15,2, SDKzzfx([...])andset_synth { zzfx }map ZzFX's positional array to the named controls. - Strudel sample controls on sampler voices:
loopBegin/loopEnd,clip(legato),fit,unit"c"/"s",loopAt,accelerateandsquiz, besidebegin/end/speed/loop/cut./sample set brk fit on clip 1, the per-voice menu and the agent'sset_sampletool edit them. SDK 1.13.0 (additive). - Older projects and sessions load and sound exactly as before. The
dawgSDK is 1.5.0 (additive).
Synth
- A full synth voice with Strudel's parameters.
synthon a track takes Strudel's names and aliases: sine, sawtooth, square, triangle, supersaw, pulse, additiveuserand white/pink/brown/crackle noise;noise/density;unison/detune/spread; pulse width withpwrate/pwsweep; eight FM operators (fm,fmh, an ADSR,fmenv,fmwave); ADSR; a pitch envelope (penv…); vibrato; and low-, high- and band-pass filters with envelopes andftype. - Presets: pad, lead, pluck, bass, sub, acid, keys, bell, organ, strings, brass, wind, chip.
synthprompt command:synth preset pad,synth lpf 800 lpenv 3,synth fm 4 fmh 1.5,synth reset. The menu's Parameters section shows the preset and simple parameters, with every parameter under advanced. The agent's newset_synthtool sets the same parameters. Every numeric parameter has asynth-<param>automation lane.- Older projects and sessions load and sound exactly as before. The
dawgSDK is 1.6.0 (additive).
Rhythm (Euclidean rows)
- Drum parts as generators. A kit or oneshot sampler track can carry
rhythmrows:euclid("kick", 4, 16),euclid("hat", 7, 16, 2, { swing: 0.15 }),grid("snare", "....X.......x..."). dawg expands them into ordinary notes, so you and the agent edit four numbers instead of sixteen hits, and rendering, sync and diffs are unchanged. Patterns and rotation match Strudel'seuclid/euclidRot. - Torso T-1 parameters: steps, pulses, rotate, division, repeats with time/pace/ramp (rolls that speed up, slow down, build or fade), velocity, accent, gate/legato, seeded probability, swing, nudge and per-pass cycles. The same seed always gives the same hits.
/euclideditor (also Rhythm in/menu): one row per voice with its step grid. Arrows nudge the selected parameter, Tab moves between parameters, digits type a value, Space auditions. Every change is one undo step.- Prompt grammar:
euclid kick 4 16,euclid hat 7 16 rotate 2,euclid hat swing 0.2,euclid snare off|freeze,grid snare ....X.......x.... - The agent's new
set_rhythmtool takes the same rows, and the agent prefers it to hand-placed drum hits. - Editing a generated lane by hand freezes that row into plain notes. Changing the loop length regenerates rows.
Chords
- Chord engine (
core/chords.ts) modelled on the Telepathic Instruments Orchid: four chord types (dim, min, maj, sus) with combinable 6, m7, M7 and 9 extensions, Key-mode diatonic chords for major, minor and the church modes, a voicing dial, voice leading to the nearest inversion, bass, and block, strum, arpeggio and harp performance. - Progressions. Eleven presets (I–V–vi–IV, ii–V–I, i–VI–III–VII, the Andalusian cadence, …) and pop, jazz, modal and classical styles that walk a weighted functional-harmony graph with a seed, so the same request always gives the same chords.
- Secret chords from the Orchid manual. Two latched chord types now play the official table: dim+sus C5, maj+sus C+, min+sus Cm(add4), min+dim Cm(b6), maj+dim C(b6), maj+min C7♯9 (they replace dawg's earlier guesses).
- Slop perform mode, Orchid's humanised timing: a block chord whose voices land a seeded fraction of up to 1/16 beat late (SDK 1.5.0,
perform: "slop"). - Pattern perform mode with thirteen chord rhythms (eighths, offbeat, pop, charleston, bossa, skank, tresillo, oom-pah, …) by name or number:
/chords pattern 3,9in play mode, the menu,write_chords {perform: "pattern", pattern}and SDK 1.7.0perform: "pattern", pattern: "bossa". - Orchid bass modes. Bass is now
off,chords,unison,singleorsolo, as in the Orchid's bass menu:Bin play mode cycles them,/chords bass unison, the menu,write_chords {bassMode}and SDK 1.7.0bass: "solo". - Agent tools.
suggest_progressionreturns voice-led chords with names, numerals and bass;write_chordswrites them to a track (and its bass to another) as block chords, strums, arpeggios or harp sweeps. - SDK 1.3.0.
chord("Cm7")andprogression(["ii7", "V7", "Imaj7"], { key, perform })expand to notes intrack.tsfiles. - Chord mode in play mode, on by default (
auto) for chord-capable tracks: every note key plays the song key's diatonic chord, voice-led from the last one.1–4latch dim/min/maj/sus,5–8latch 6/m7/M7/9,0clears,-/=turn the voicing dial,9cycles the perform mode,Btoggles bass,Nplays the suggested next chord andQswitches auto ⇄ manual. The header shows the mode, key, current chord and the suggestion. Recorded chords keep their strum or arpeggio and stay one undo step per bar. /chordsand a Chords section in/menuedit the same settings;key <tonic> <mode>sets the song key.
Wavetable synth
instrument: "wavetable": a band-limited wavetable oscillator (per-octave mipmaps, smooth frame interpolation) with Strudel's parameter names: positionwt, a position envelope (wtenv,wtattack,wtdecay,wtsustain,wtrelease), a position LFO (wtrate,wtdepth),warp/warpmode(asym,bendp,bendm,bendmp,sync,quant) andwtphaserand.wtis automatable.- Tables: four built-ins that work offline (
basic,pwm,formant,harmonics) and Strudel'swt_sounds (wt_digital:2) from the newuzu-wavetablespack, fetched once and pinned by sha256 like any pack sound. /wt <table|0..1|list>, one command per parameter (/wtenv 0.5,/warpmode bendp), the table picker and parameters in the menu's Parameters section, and the agent'sset_wavetabletool. Play mode plays wavetable tracks.- It runs through the new synth voice, so ADSR, filter envelopes, FM, unison/detune and vibrato apply to wavetable tracks too.
- SDK 1.8.0 (additive):
wavetable("basic", { wt: 0.4 })as a track'sinstrument, andautomation: { wt: [...] }.
Wavetables from audio
make_wavetable, a new agent media tool (dawg media wavetable <file> <name>from the shell): turns any audio in the project (a download, a stem, an imported sample) into a 2048-sample-frame wavetable attracks/<slug>/wavetables/<name>.wav. Pitched material is sliced into single cycles at the detected pitch; vocals, pads and noise become spectral snapshots. It picks the most stable tonal region by default, phase-aligns and normalises the frames, and tells the agent how the timbre moves across the table (for example "brightens, very smooth morph") so it can choose a position or envelope. Output is deterministic.- Project tables play like any other table:
/wt vox.wav, the menu's table picker (project tables are listed first),set_wavetablewith the path, andwavetable("./wavetables/vox.wav")intrack.ts. They are pinned by sha256; a changed file plays with a warning, a missing one is reported with a fix. - SDK 1.11.0 (additive):
wavetable()accepts a project.wavpath.
Sample packs
- Strudel's sample ecosystem, read through its public manifest format (clean-room, no Strudel code). Built-in catalog: tidal-drum-machines, dirt-samples, uzu-drumkit, VCSL, piano, mridangam, emu-sp12 and two General MIDI soundfonts, each with its license.
- Files download lazily on first use over HTTPS and are cached offline. A sampler voice can point at
pack:<pack>/<sound>[:<n>], and first use pins its sha256, URL and license. SDK 1.1.0 (additive). /pack list|add|info|remove|use,/kit <bank>, a sounds list in the menu, and agent toolslist_packs,search_soundsanduse_sound.- Renders credit the packs they use, and projects using CC-BY or CC-BY-SA packs get a
CREDITS.md.
Sample packs: bank nicknames and cache sizes
- Bank nicknames. Strudel's drum-machine nicknames (
TR909,tr808,Linn,DMX,SP12,MPC60, … from itstidal-drum-machines-alias.json) work in/kit,/pack use,pack:refs intrack.ts, the agent'suse_soundand a new Strudel banks list in the menu's drum kits. dawg ships a snapshot and refreshes it with the manifest.909,808,linnand the other short names work as before, and pins keep the full bank name. /pack cacheshows disk used by pack downloads and decoded audio against their caps;/pack cache prune [size]and/pack cache clearevict least recently used files and keep the open project's sounds.- Pack downloads are now capped at 2 GiB (they were uncapped) and decoded audio at 1 GiB per project (was 512 MiB), overridable with
DAWG_PACKS_CACHE_MAXandDAWG_ASSETS_CACHE_MAX. Eviction never removes a file the open project uses; an evicted pack file re-fetches by its pinned sha256.
Drum patterns and kits
- Pattern library. 31 starting grooves (house, techno, boom bap, trap, drill, dnb, reggaeton, afrobeats, bossa nova, samba, garage, jersey club, footwork, funk and more), each a set of rhythm rows you keep editing as parameters.
/patternopens a picker that plays one bar of the pattern under the cursor;/pattern <name> [keep-tempo|tempo]applies one and moves the tempo into the pattern's range when needed. Also under Sounds → Drum patterns in/menu, andpattern("boom-bap")intrack.ts. - Synthesized kits.
kit: "syn808" | "syn909" | "acoustic" | "lofi" | "electro" | "trap"on a drum track, or/kit <name>, chooses an offline drum synth sound. Tracks without a kit sound exactly as before. - One kit picker. A bare
/kitnow opens a picker of every kit, synth kits first and then the sample kits from packs (it used to apply the 909 sample kit directly;/kit 909still does)./kit syn909on a sampler kit turns it back into a synth kit. - The agent's new
list_drum_patterns,apply_drum_patternandset_drum_kittools, and it starts genre grooves from a pattern. - SDK 1.4.0.
Menus (reorganised)
/menu [section]or Ctrl-K opens six plain sections, most used first: Sound, Effects, Rhythm, Chords, Mix & automation and Project. The old section names (parameters,sounds,track,automation,transport) still open the matching place.- Rows show a plain label and the value with its unit (s, Hz, oct, st, dB, BPM, bars); a line under the list describes the focused row and shows, dimmed, the prompt command it runs. Every change is one receipt and one undo step;
xresets a value to its default. - New prompt commands behind the menu:
automate <lane> points <b:v>...,automate <lane> remove <beat>,track name <text>andmeter <n>.
One key grammar
- Every picker, menu, editor and panel uses the same keys:
↑↓/j kmove,←→/h l/- +adjust, Enter opens or confirms, Space auditions or toggles,/filters, Esc goes back one level (filter or typed value first),?shows the keys for the current screen. Digits type a value only where one is focused. - A one-line key footer on every screen that fits 80 columns; when narrower it drops the middle and keeps
escand? keys. ?panel: the keys for the screen underneath, drawn over it; on an empty prompt it lists the prompt keys and the three ways in (type a request, Ctrl-P, Ctrl-K). In play mode it also holds velocity, grid, click, count-in and the chord settings.- Play mode header keeps range, record state and the chord at a glance (
AUTO C major · Dm (ii) · next G); chord mode adds a legend row for the number-row latches. - The
/euclideditor is titled rhythm and its rows use the shared keys; pickers report the highlighted row on every move (pick-move), the hook live previews (and a future audition controller) listen on.
Help
- Sentences reach the agent: a request that merely starts with a command word (
add a walking bass in A minor, the prompt's own example, orpan the hats left) goes to the agent instead of answering with the command's usage. Short or numeric misuse (pan 3,add H4 at 0) still gets the usage hint locally. /helpis a short task guide (start here, play notes, make drums, shape the sound, chords) pointing to Ctrl-K, Ctrl-P and?;/help allis the full reference and/help music|session|window|keysshows one group. The reference now listsfx,synth,/pattern,/kitand/pack.- Typos get the nearest command:
/clik onanswersunknown command /clik · did you mean /click? · /helpinstead of a bare "unknown". Entering play mode says? keys · esc leavesinstead of listing four keys. - Bare-word slips are caught too:
tempoo 90answersdid you mean tempo 90?without a model call when the rest parses as that command's arguments; sentences still go to the agent. - First run names the three ways in: an empty track reads
<track> · empty · type a request · ctrl-p play · ctrl-k menu(narrow windows keepadd C4 at 0 to start). - The play
?panel's chord line uses the header's words (next G,(assumed),voicing +1) instead of→,?andinv.
Fixed
- Rhythm rows with options but no rotate printed as
euclid("hat", 8, 16, { … }), which the SDK read as a rotate and rejected. The printer now writes rotate 0, and the SDK accepts options in that position. - Gateway web searches no longer count the search fee twice in the spend line and ledger. The gateway's reported cost already includes it. A real Exa search response is now a test fixture.