@hraness/dawg 0.3.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +138 -0
- package/DAWG.md +608 -39
- package/README.md +4 -4
- package/core/chords.ts +1724 -0
- package/core/diff.ts +13 -1
- package/core/euclid.ts +670 -0
- package/core/fx.ts +1065 -0
- package/core/kits.ts +320 -0
- package/core/params.ts +111 -0
- package/core/rhythm.ts +287 -0
- package/core/score.ts +735 -18
- package/core/sdk/eval-child.ts +34 -22
- package/core/sdk/eval.ts +4 -1
- package/core/sdk/print.ts +304 -22
- package/core/sdk/sync-chords.ts +54 -0
- package/core/sdk/v1.ts +3226 -21
- package/core/synth.ts +1001 -0
- package/package.json +1 -1
- package/src/agent/agent.ts +38 -3
- package/src/agent/brief.ts +29 -4
- package/src/agent/chord-tools.ts +357 -0
- package/src/agent/drum-tools.ts +135 -0
- package/src/agent/models.ts +4 -4
- package/src/agent/pack-tools.ts +369 -0
- package/src/agent/planner.ts +17 -2
- package/src/agent/preview-tool.ts +270 -0
- package/src/agent/rhythm-tools.ts +145 -0
- package/src/agent/tools.ts +308 -14
- package/src/agent/xcb-agent.ts +8 -2
- package/src/audio/audition.ts +93 -0
- package/src/audio/cache.ts +160 -0
- package/src/audio/effects/bus.ts +147 -0
- package/src/audio/effects/chain.ts +109 -0
- package/src/audio/effects/common.ts +251 -0
- package/src/audio/effects/convolution.ts +339 -0
- package/src/audio/effects/drive.ts +142 -0
- package/src/audio/effects/duck.ts +122 -0
- package/src/audio/effects/dynamics.ts +121 -0
- package/src/audio/effects/filter.ts +319 -0
- package/src/audio/effects/modulation.ts +174 -0
- package/src/audio/effects/space.ts +394 -0
- package/src/audio/engine.ts +112 -4
- package/src/audio/kits.ts +200 -0
- package/src/audio/packs.ts +1787 -0
- package/src/audio/preview.ts +481 -0
- package/src/audio/random.ts +15 -0
- package/src/audio/sampler.ts +157 -29
- package/src/audio/samples.ts +386 -44
- package/src/audio/synth/oscillators.ts +268 -0
- package/src/audio/synth/voice.ts +555 -0
- package/src/audio/synth/zzfx.ts +137 -0
- package/src/audio/wav.ts +411 -295
- package/src/audio/wavetable-maker.ts +717 -0
- package/src/audio/wavetable.ts +624 -0
- package/src/commands/drums.ts +299 -0
- package/src/commands/edit.ts +26 -4
- package/src/commands/fx.ts +360 -0
- package/src/commands/help.ts +298 -10
- package/src/commands/music.ts +10 -8
- package/src/commands/pack.ts +423 -0
- package/src/commands/rhythm.ts +230 -0
- package/src/commands/sample.ts +162 -2
- package/src/commands/synth.ts +229 -0
- package/src/commands/wavetable.ts +370 -0
- package/src/main.ts +1222 -30
- package/src/media/cli.ts +15 -2
- package/src/media/tools.ts +106 -1
- package/src/media/wavetable.ts +202 -0
- package/src/render.ts +22 -1
- package/src/session/naming.ts +3 -1
- package/src/tui/audition.ts +521 -0
- package/src/tui/euclid.ts +516 -0
- package/src/tui/menu.ts +1305 -244
- package/src/tui/play-chords.ts +630 -0
- package/src/tui/play-session.ts +364 -16
- package/src/tui/sketch.ts +108 -0
- package/src/web/search.ts +4 -1
- package/tui/app.ts +161 -39
- package/tui/grammar.ts +286 -0
- package/tui/highway.ts +7 -1
- package/tui/play-strip.ts +59 -14
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,144 @@ All notable changes to dawg are recorded here. Versions follow [semantic version
|
|
|
4
4
|
|
|
5
5
|
## Unreleased
|
|
6
6
|
|
|
7
|
+
## 0.4.1
|
|
8
|
+
|
|
9
|
+
Sound previews now crossfade instead of clicking, reverb changes are heard in under 100 ms, and the rhythm editor and chord settings hold changes until you keep them. dawg.sh gains a security policy and security headers.
|
|
10
|
+
|
|
11
|
+
### Previewing changes
|
|
12
|
+
|
|
13
|
+
- **Edits crossfade instead of clicking.** When the loop (audition or song) swaps to a new render, the old and new buffers crossfade over 20 ms with equal-power gains at the same beat, so a change no longer steps the waveform. Playback only: renders and exports are byte-identical.
|
|
14
|
+
- **`/euclid` and the chord settings stage while the loop plays.** `Space` in the rhythm editor or the menu's Chords section (`/menu chords`) starts the audition loop; changes are then staged and heard (`●`, `B staged N`, `E(5,16) ← E(4,16)`, `Db ← C`), `a` flips A/B, `Enter` keeps them as one undo step and `Esc` reverts with nothing written. In the Chords section the loop plays the track's chord phrase under the current settings. With the loop off, both commit at once as before; their key footers and `?` panels use the shared audition keys.
|
|
15
|
+
- **Reverb changes are heard faster.** The stem cache keeps each track's reverb input and tail apart from its dry signal, so a reverb mix (or mix lane) change re-mixes the cached tail instead of re-rendering the voice and the room. Key to audio scheduled on a 4-track song: reverb mix on a wavetable pad in context 140 → 64 ms median (p90 151 → 68 ms); a filter change in context 100 → 74 ms. The bus mix loops also moved out of the large render function, which the JIT optimized late. Renders stay byte-identical (a new test checks cached re-mixes against cold renders and recorded digests).
|
|
16
|
+
|
|
17
|
+
### Security
|
|
18
|
+
|
|
19
|
+
- **A security policy.** `SECURITY.md` and `https://dawg.sh/.well-known/security.txt` say how to report a vulnerability privately.
|
|
20
|
+
- **dawg.sh sends security headers** on every route: a Content Security Policy limited to the site's own origin and its analytics hosts, HSTS, `nosniff`, `DENY` framing, a strict referrer policy and a permissions policy that turns off camera, microphone and location.
|
|
21
|
+
- Dependabot also watches the site's dependencies (minor and patch updates, grouped).
|
|
22
|
+
|
|
23
|
+
## 0.4.0
|
|
24
|
+
|
|
25
|
+
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).
|
|
26
|
+
|
|
27
|
+
### Previewing changes
|
|
28
|
+
|
|
29
|
+
- **Audition loop in the edit menu.** `Space` loops the focused track (solo, or the whole mix with `c`), 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).
|
|
30
|
+
- **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). `a` flips between the committed and the staged sound, `Enter` keeps all staged changes as one revision and one undo step, `Esc` reverts. Changed rows show `staged ← committed`. Edits from another window are re-applied under the staged ones.
|
|
31
|
+
- 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.
|
|
32
|
+
- **Hover to hear lists.** With the loop on, moving through a list (wavetables, instruments, drum kits, patterns, choice lists in `/menu`, and the `/kit` and `/pattern` pickers) 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 shows `fetching…` without blocking the cursor. Enter chooses, Esc leaves with nothing changed.
|
|
33
|
+
- **The agent can hear before it commits.** `preview_sound` renders a track, or candidate `set_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 off` keeps it silent.
|
|
34
|
+
- **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.
|
|
35
|
+
- **`/try <sound command>`** hears a prompt command on the loop first: `/try fx reverb mix 0.6`, then `a` for A/B, Enter to keep (one undo step) or Esc to drop it.
|
|
36
|
+
|
|
37
|
+
### Effects
|
|
38
|
+
|
|
39
|
+
- **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**.
|
|
40
|
+
- **Filter** gains `type` lpf/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.
|
|
41
|
+
- **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.
|
|
42
|
+
- **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.
|
|
43
|
+
- Parameter names follow Strudel's (`lpq`, `delayfeedback`, `room`, `tremolodepth`…), and every numeric parameter can be automated (`automate distort-drive points 0:1 8:6`).
|
|
44
|
+
- **`fx` prompt 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 new `set_fx` tool sets the same parameters.
|
|
45
|
+
- **ZzFX sounds**: `instrument z_square` (and `z_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`, plus `zrand`, `curve`, `deltaSlide`, `zmod`, `zdelay`, `tremolo` and the `zap` preset. Clean-room, deterministic. SDK 1.10.0 (additive).
|
|
46
|
+
- **Orbits and sidechain ducking**: `fx orbit 2` puts a track on orbit 2; `fx duck preset pump` on a kick dips every track on that orbit at each hit and lets it swell back (Strudel's `orbit`, `duckorbit`, `duckdepth`, `duckattack`, `duckonset`). SDK 1.9.0 (additive).
|
|
47
|
+
- **Convolution reverb** (Strudel `ir`/`iresponse`): `fx reverb ir hall` (also `room`, `plate`, a pack sound or a project WAV), with FFT convolution; `fx ir off` returns to the algorithmic tail. SDK 1.12.0 (additive).
|
|
48
|
+
- **Shared orbit buses**: `fx orbit shared on` sends a track to one delay and one reverb shared by its orbit, as Strudel orbits do.
|
|
49
|
+
- **Raw ZzFX arrays**: `synth zzfx ,,129,.01,,.15,2`, SDK `zzfx([...])` and `set_synth { zzfx }` map ZzFX's positional array to the named controls.
|
|
50
|
+
- **Strudel sample controls** on sampler voices: `loopBegin`/`loopEnd`, `clip` (`legato`), `fit`, `unit` "c"/"s", `loopAt`, `accelerate` and `squiz`, beside `begin`/`end`/`speed`/`loop`/`cut`. `/sample set brk fit on clip 1`, the per-voice menu and the agent's `set_sample` tool edit them. SDK 1.13.0 (additive).
|
|
51
|
+
- Older projects and sessions load and sound exactly as before. The `dawg` SDK is 1.5.0 (additive).
|
|
52
|
+
|
|
53
|
+
### Synth
|
|
54
|
+
|
|
55
|
+
- **A full synth voice with Strudel's parameters.** `synth` on a track takes Strudel's names and aliases: sine, sawtooth, square, triangle, supersaw, pulse, additive `user` and white/pink/brown/crackle noise; `noise`/`density`; `unison`/`detune`/`spread`; pulse width with `pwrate`/`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 and `ftype`.
|
|
56
|
+
- **Presets**: pad, lead, pluck, bass, sub, acid, keys, bell, organ, strings, brass, wind, chip.
|
|
57
|
+
- **`synth` prompt 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 new `set_synth` tool sets the same parameters. Every numeric parameter has a `synth-<param>` automation lane.
|
|
58
|
+
- Older projects and sessions load and sound exactly as before. The `dawg` SDK is 1.6.0 (additive).
|
|
59
|
+
|
|
60
|
+
### Rhythm (Euclidean rows)
|
|
61
|
+
|
|
62
|
+
- **Drum parts as generators.** A kit or oneshot sampler track can carry `rhythm` rows: `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's `euclid`/`euclidRot`.
|
|
63
|
+
- **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.
|
|
64
|
+
- **`/euclid` editor** (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.
|
|
65
|
+
- **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...`.
|
|
66
|
+
- The agent's new `set_rhythm` tool takes the same rows, and the agent prefers it to hand-placed drum hits.
|
|
67
|
+
- Editing a generated lane by hand freezes that row into plain notes. Changing the loop length regenerates rows.
|
|
68
|
+
|
|
69
|
+
### Chords
|
|
70
|
+
|
|
71
|
+
- **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.
|
|
72
|
+
- **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.
|
|
73
|
+
- **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).
|
|
74
|
+
- **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"`).
|
|
75
|
+
- **Pattern perform mode** with thirteen chord rhythms (eighths, offbeat, pop, charleston, bossa, skank, tresillo, oom-pah, …) by name or number: `/chords pattern 3`, `9` in play mode, the menu, `write_chords {perform: "pattern", pattern}` and SDK 1.7.0 `perform: "pattern", pattern: "bossa"`.
|
|
76
|
+
- **Orchid bass modes.** Bass is now `off`, `chords`, `unison`, `single` or `solo`, as in the Orchid's bass menu: `B` in play mode cycles them, `/chords bass unison`, the menu, `write_chords {bassMode}` and SDK 1.7.0 `bass: "solo"`.
|
|
77
|
+
- **Agent tools.** `suggest_progression` returns voice-led chords with names, numerals and bass; `write_chords` writes them to a track (and its bass to another) as block chords, strums, arpeggios or harp sweeps.
|
|
78
|
+
- **SDK 1.3.0.** `chord("Cm7")` and `progression(["ii7", "V7", "Imaj7"], { key, perform })` expand to notes in `track.ts` files.
|
|
79
|
+
- **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`–`4` latch dim/min/maj/sus, `5`–`8` latch 6/m7/M7/9, `0` clears, `-`/`=` turn the voicing dial, `9` cycles the perform mode, `B` toggles bass, `N` plays the suggested next chord and `Q` switches 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.
|
|
80
|
+
- **`/chords`** and a Chords section in `/menu` edit the same settings; **`key <tonic> <mode>`** sets the song key.
|
|
81
|
+
|
|
82
|
+
### Wavetable synth
|
|
83
|
+
|
|
84
|
+
- **`instrument: "wavetable"`**: a band-limited wavetable oscillator (per-octave mipmaps, smooth frame interpolation) with Strudel's parameter names: position `wt`, a position envelope (`wtenv`, `wtattack`, `wtdecay`, `wtsustain`, `wtrelease`), a position LFO (`wtrate`, `wtdepth`), `warp`/`warpmode` (`asym`, `bendp`, `bendm`, `bendmp`, `sync`, `quant`) and `wtphaserand`. `wt` is automatable.
|
|
85
|
+
- **Tables**: four built-ins that work offline (`basic`, `pwm`, `formant`, `harmonics`) and Strudel's `wt_` sounds (`wt_digital:2`) from the new `uzu-wavetables` pack, fetched once and pinned by sha256 like any pack sound.
|
|
86
|
+
- **`/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's `set_wavetable` tool. Play mode plays wavetable tracks.
|
|
87
|
+
- It runs through the new synth voice, so ADSR, filter envelopes, FM, unison/detune and vibrato apply to wavetable tracks too.
|
|
88
|
+
- SDK 1.8.0 (additive): `wavetable("basic", { wt: 0.4 })` as a track's `instrument`, and `automation: { wt: [...] }`.
|
|
89
|
+
|
|
90
|
+
### Wavetables from audio
|
|
91
|
+
|
|
92
|
+
- **`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 at `tracks/<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.
|
|
93
|
+
- **Project tables play like any other table**: `/wt vox.wav`, the menu's table picker (project tables are listed first), `set_wavetable` with the path, and `wavetable("./wavetables/vox.wav")` in `track.ts`. They are pinned by sha256; a changed file plays with a warning, a missing one is reported with a fix.
|
|
94
|
+
- SDK 1.11.0 (additive): `wavetable()` accepts a project `.wav` path.
|
|
95
|
+
|
|
96
|
+
### Sample packs
|
|
97
|
+
|
|
98
|
+
- **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.
|
|
99
|
+
- 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).
|
|
100
|
+
- `/pack list|add|info|remove|use`, `/kit <bank>`, a sounds list in the menu, and agent tools `list_packs`, `search_sounds` and `use_sound`.
|
|
101
|
+
- Renders credit the packs they use, and projects using CC-BY or CC-BY-SA packs get a `CREDITS.md`.
|
|
102
|
+
|
|
103
|
+
### Sample packs: bank nicknames and cache sizes
|
|
104
|
+
|
|
105
|
+
- **Bank nicknames.** Strudel's drum-machine nicknames (`TR909`, `tr808`, `Linn`, `DMX`, `SP12`, `MPC60`, … from its `tidal-drum-machines-alias.json`) work in `/kit`, `/pack use`, `pack:` refs in `track.ts`, the agent's `use_sound` and a new **Strudel banks** list in the menu's drum kits. dawg ships a snapshot and refreshes it with the manifest. `909`, `808`, `linn` and the other short names work as before, and pins keep the full bank name.
|
|
106
|
+
- **`/pack cache`** shows disk used by pack downloads and decoded audio against their caps; `/pack cache prune [size]` and `/pack cache clear` evict least recently used files and keep the open project's sounds.
|
|
107
|
+
- 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_MAX` and `DAWG_ASSETS_CACHE_MAX`. Eviction never removes a file the open project uses; an evicted pack file re-fetches by its pinned sha256.
|
|
108
|
+
|
|
109
|
+
### Drum patterns and kits
|
|
110
|
+
|
|
111
|
+
- **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. `/pattern` opens 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`, and `pattern("boom-bap")` in `track.ts`.
|
|
112
|
+
- **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.
|
|
113
|
+
- **One kit picker.** A bare `/kit` now 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 909` still does). `/kit syn909` on a sampler kit turns it back into a synth kit.
|
|
114
|
+
- The agent's new `list_drum_patterns`, `apply_drum_pattern` and `set_drum_kit` tools, and it starts genre grooves from a pattern.
|
|
115
|
+
- SDK 1.4.0.
|
|
116
|
+
|
|
117
|
+
### Menus (reorganised)
|
|
118
|
+
|
|
119
|
+
- **`/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.
|
|
120
|
+
- 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; `x` resets a value to its default.
|
|
121
|
+
- New prompt commands behind the menu: `automate <lane> points <b:v>...`, `automate <lane> remove <beat>`, `track name <text>` and `meter <n>`.
|
|
122
|
+
|
|
123
|
+
### One key grammar
|
|
124
|
+
|
|
125
|
+
- **Every picker, menu, editor and panel uses the same keys**: `↑↓`/`j k` move, `←→`/`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.
|
|
126
|
+
- **A one-line key footer on every screen** that fits 80 columns; when narrower it drops the middle and keeps `esc` and `? keys`.
|
|
127
|
+
- **`?` 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.
|
|
128
|
+
- **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.
|
|
129
|
+
- The `/euclid` editor 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.
|
|
130
|
+
|
|
131
|
+
### Help
|
|
132
|
+
|
|
133
|
+
- **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, or `pan 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.
|
|
134
|
+
- **`/help` is a short task guide** (start here, play notes, make drums, shape the sound, chords) pointing to Ctrl-K, Ctrl-P and `?`; `/help all` is the full reference and `/help music|session|window|keys` shows one group. The reference now lists `fx`, `synth`, `/pattern`, `/kit` and `/pack`.
|
|
135
|
+
- **Typos get the nearest command**: `/clik on` answers `unknown command /clik · did you mean /click? · /help` instead of a bare "unknown". Entering play mode says `? keys · esc leaves` instead of listing four keys.
|
|
136
|
+
- **Bare-word slips are caught too**: `tempoo 90` answers `did you mean tempo 90?` without a model call when the rest parses as that command's arguments; sentences still go to the agent.
|
|
137
|
+
- **First run names the three ways in**: an empty track reads `<track> · empty · type a request · ctrl-p play · ctrl-k menu` (narrow windows keep `add C4 at 0 to start`).
|
|
138
|
+
- **The play `?` panel's chord line uses the header's words** (`next G`, `(assumed)`, `voicing +1`) instead of `→`, `?` and `inv`.
|
|
139
|
+
|
|
140
|
+
### Fixed
|
|
141
|
+
|
|
142
|
+
- 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.
|
|
143
|
+
- 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.
|
|
144
|
+
|
|
7
145
|
## 0.3.0
|
|
8
146
|
|
|
9
147
|
dawg projects are now plain TypeScript files that you, an agent or another window can edit, with sampler tracks, local media tools, a computer-keyboard play mode and menus for every edit by hand.
|