@hraness/dawg 0.6.0 → 0.7.0
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 +126 -0
- package/DAWG.md +655 -141
- package/README.md +27 -25
- package/core/autotune.ts +1119 -0
- package/core/chords.ts +759 -23
- package/core/clips.ts +499 -0
- package/core/diff.ts +182 -99
- package/core/expression.ts +158 -6
- package/core/fx.ts +354 -32
- package/core/granular.ts +91 -0
- package/core/instruments.ts +180 -0
- package/core/keys.ts +573 -4
- package/core/loop.ts +5 -0
- package/core/lyrics.ts +297 -0
- package/core/master.ts +3 -3
- package/core/resonators.ts +306 -4
- package/core/routing.ts +165 -0
- package/core/score.ts +1181 -16
- package/core/sdk/eval-child.ts +7 -2
- package/core/sdk/eval.ts +35 -6
- package/core/sdk/print.ts +354 -6
- package/core/sdk/sync-lyrics.ts +49 -0
- package/core/sdk/v1.ts +3160 -69
- package/core/sections.ts +298 -24
- package/core/sing.ts +815 -0
- package/core/strings.ts +237 -2
- package/core/style-provenance.ts +80 -0
- package/core/styles/africa-mena-southasia.ts +2893 -0
- package/core/styles/americas.ts +3810 -0
- package/core/styles/art.ts +4993 -0
- package/core/styles/base.ts +123 -0
- package/core/styles/cycles.ts +106 -0
- package/core/styles/electronic.ts +2723 -0
- package/core/styles/europe-asia-pacific.ts +2838 -0
- package/core/styles/excerpt.ts +29 -0
- package/core/styles/gamelan.ts +283 -0
- package/core/styles/generate.ts +2199 -0
- package/core/styles/index.ts +515 -0
- package/core/styles/parts.ts +106 -0
- package/core/styles/pop.ts +3189 -0
- package/core/styles/rock.ts +2993 -0
- package/core/styles/roots.ts +4175 -0
- package/core/styles/schema.ts +429 -0
- package/core/styles/taxonomy.ts +940 -0
- package/core/styles/validate.ts +528 -0
- package/core/tempo.ts +32 -2
- package/core/tuning.ts +19 -3
- package/core/vocoder.ts +524 -0
- package/core/winds.ts +652 -0
- package/guides/agent.md +29 -0
- package/guides/arrange.md +30 -0
- package/guides/audition.md +20 -14
- package/guides/automation.md +12 -6
- package/guides/chords.md +16 -14
- package/guides/effects.md +17 -15
- package/guides/faders.md +20 -16
- package/guides/files.md +13 -9
- package/guides/getting-started.md +15 -11
- package/guides/keys.md +19 -15
- package/guides/media.md +17 -12
- package/guides/mix.md +12 -6
- package/guides/music.md +23 -8
- package/guides/notes.md +15 -9
- package/guides/performance.md +15 -10
- package/guides/play.md +21 -13
- package/guides/project.md +25 -8
- package/guides/providers.md +20 -14
- package/guides/resample.md +32 -0
- package/guides/rhythm.md +17 -13
- package/guides/sessions.md +17 -7
- package/guides/show-me.md +31 -0
- package/guides/sound.md +25 -9
- package/guides/sounds.md +15 -12
- package/guides/styles.md +31 -0
- package/guides/tempo.md +15 -10
- package/guides/tracks.md +15 -10
- package/guides/tuning.md +32 -0
- package/guides/voice.md +31 -0
- package/guides/web-search.md +18 -8
- package/native/prebuilt/darwin-arm64/libdawg_sink.dylib +0 -0
- package/native/prebuilt/darwin-x64/libdawg_sink.dylib +0 -0
- package/native/prebuilt/linux-arm64/libdawg_sink.so +0 -0
- package/native/prebuilt/linux-x64/libdawg_sink.so +0 -0
- package/native/prebuilt/manifest.json +21 -0
- package/package.json +5 -2
- package/src/agent/agent.ts +131 -13
- package/src/agent/calibration-tools.ts +53 -0
- package/src/agent/chord-tools.ts +153 -1
- package/src/agent/clip-tools.ts +453 -0
- package/src/agent/command-agent.ts +369 -0
- package/src/agent/drum-tools.ts +2 -2
- package/src/agent/expression-tools.ts +91 -0
- package/src/agent/gateway.ts +246 -60
- package/src/agent/models.ts +53 -12
- package/src/agent/ops.ts +15 -1
- package/src/agent/pack-tools.ts +1 -1
- package/src/agent/planner.ts +13 -0
- package/src/agent/portable-schema.ts +80 -0
- package/src/agent/preview-tool.ts +5 -1
- package/src/agent/provider.ts +22 -8
- package/src/agent/resample-tool.ts +131 -0
- package/src/agent/rhythm-tools.ts +1 -1
- package/src/agent/section-tools.ts +1 -1
- package/src/agent/show-me.ts +497 -0
- package/src/agent/steer.ts +15 -0
- package/src/agent/style-tools.ts +217 -0
- package/src/agent/tool-error.ts +12 -0
- package/src/agent/tools.ts +307 -37
- package/src/agent/usage.ts +2 -2
- package/src/agent/voice-tools.ts +925 -0
- package/src/agent/xcb-agent.ts +16 -6
- package/src/argv.ts +38 -0
- package/src/audio/analysis.ts +253 -0
- package/src/audio/arrange.ts +58 -3
- package/src/audio/autotune-engine.ts +101 -0
- package/src/audio/autotune.ts +640 -0
- package/src/audio/clips.ts +240 -0
- package/src/audio/doctor.ts +86 -0
- package/src/audio/dsp/bandbank.ts +138 -0
- package/src/audio/dsp/envelope.ts +171 -0
- package/src/audio/dsp/follow.ts +120 -0
- package/src/audio/dsp/formant.ts +427 -0
- package/src/audio/dsp/glottal.ts +243 -0
- package/src/audio/dsp/interp.ts +7 -2
- package/src/audio/dsp/lpc.ts +50 -0
- package/src/audio/dsp/periodicity.ts +59 -0
- package/src/audio/dsp/pitch.ts +995 -0
- package/src/audio/dsp/psola.ts +199 -0
- package/src/audio/dsp/shift.ts +256 -0
- package/src/audio/effects/chain.ts +21 -4
- package/src/audio/effects/common.ts +57 -0
- package/src/audio/effects/convolution.ts +113 -5
- package/src/audio/effects/filter.ts +48 -69
- package/src/audio/effects/formant.ts +263 -0
- package/src/audio/effects/gaze.ts +354 -0
- package/src/audio/engine.ts +206 -33
- package/src/audio/fit.ts +80 -3
- package/src/audio/granular.ts +352 -21
- package/src/audio/instrument-check.ts +67 -47
- package/src/audio/instruments.ts +36 -3
- package/src/audio/keys/calibration.ts +56 -0
- package/src/audio/keys/electric.ts +427 -0
- package/src/audio/keys/engine.ts +156 -20
- package/src/audio/keys/organ.ts +1335 -0
- package/src/audio/keys/piano.ts +72 -8
- package/src/audio/keys/sympathetic.ts +127 -0
- package/src/audio/kits.ts +135 -6
- package/src/audio/live-worker.ts +3 -1
- package/src/audio/live.ts +247 -26
- package/src/audio/native.ts +615 -0
- package/src/audio/preview.ts +45 -3
- package/src/audio/render-worker.ts +2 -0
- package/src/audio/renderer.ts +2 -0
- package/src/audio/resample.ts +286 -0
- package/src/audio/resonators.ts +10 -2
- package/src/audio/sampler.ts +252 -24
- package/src/audio/samples.ts +46 -3
- package/src/audio/sing/analysis.ts +193 -0
- package/src/audio/sing/engine.ts +949 -0
- package/src/audio/strings/body.ts +29 -16
- package/src/audio/strings/bow.ts +699 -0
- package/src/audio/strings/engine.ts +274 -22
- package/src/audio/strings/measure.test-helpers.ts +2 -0
- package/src/audio/synth/oscillators.ts +31 -21
- package/src/audio/synth/voice.ts +34 -1
- package/src/audio/vocoder/bank.ts +314 -0
- package/src/audio/vocoder/carrier.ts +165 -0
- package/src/audio/vocoder/control.ts +68 -0
- package/src/audio/vocoder/detect.ts +50 -0
- package/src/audio/vocoder/index.ts +304 -0
- package/src/audio/vocoder/talkbox.ts +143 -0
- package/src/audio/wav.ts +608 -85
- package/src/audio/winds/engine.ts +306 -0
- package/src/audio/winds/filters.ts +153 -0
- package/src/audio/winds/pitch.ts +104 -0
- package/src/audio/winds/trim.ts +104 -0
- package/src/audio/winds/trims.ts +917 -0
- package/src/audio/winds/trims1.ts +297 -0
- package/src/audio/winds/voice.ts +492 -0
- package/src/auth/cli.ts +38 -36
- package/src/auth/credentials.ts +30 -1
- package/src/auth/login.ts +15 -9
- package/src/auth/tui.ts +19 -10
- package/src/commands/arrange.ts +44 -29
- package/src/commands/autotune.ts +421 -0
- package/src/commands/calibration.ts +74 -0
- package/src/commands/clips.ts +887 -0
- package/src/commands/drums.ts +3 -2
- package/src/commands/edit.ts +11 -4
- package/src/commands/expression.ts +104 -23
- package/src/commands/formant.ts +221 -0
- package/src/commands/fx.ts +105 -33
- package/src/commands/grammar.ts +558 -0
- package/src/commands/granular.ts +7 -2
- package/src/commands/help.ts +652 -339
- package/src/commands/history.ts +18 -0
- package/src/commands/keys.ts +293 -17
- package/src/commands/modal.ts +67 -4
- package/src/commands/music.ts +1 -1
- package/src/commands/nearest.ts +53 -0
- package/src/commands/pack.ts +9 -2
- package/src/commands/param-range.ts +56 -0
- package/src/commands/parses.ts +130 -0
- package/src/commands/progression.ts +170 -0
- package/src/commands/resample.ts +281 -0
- package/src/commands/rhythm.ts +3 -0
- package/src/commands/rig.ts +8 -25
- package/src/commands/sample.ts +49 -2
- package/src/commands/shift.ts +119 -0
- package/src/commands/sing.ts +478 -0
- package/src/commands/string.ts +28 -2
- package/src/commands/strum.ts +485 -0
- package/src/commands/style.ts +415 -0
- package/src/commands/time.ts +6 -3
- package/src/commands/tuning.ts +3 -3
- package/src/commands/vocal-pitch.ts +616 -0
- package/src/commands/vocal.ts +147 -0
- package/src/commands/vocoder.ts +627 -0
- package/src/commands/wind.ts +244 -0
- package/src/fs/durable.ts +50 -0
- package/src/lang/glossary.ts +493 -0
- package/src/launch-args.ts +163 -0
- package/src/main.ts +1521 -255
- package/src/media/cli.ts +20 -3
- package/src/media/import.ts +3 -1
- package/src/project/check.ts +26 -3
- package/src/project/clip-pins.ts +72 -0
- package/src/project/init.ts +23 -8
- package/src/project/sync.ts +418 -86
- package/src/render.ts +36 -1
- package/src/session/daemon.ts +3 -0
- package/src/session/meta.ts +14 -0
- package/src/session/origin.ts +154 -0
- package/src/session/port.ts +22 -4
- package/src/session/presence.ts +50 -7
- package/src/session/protocol.ts +5 -1
- package/src/session/rebase.ts +18 -5
- package/src/session/receipt.ts +258 -0
- package/src/session/store.ts +65 -43
- package/src/tui/arrange-menu.ts +65 -31
- package/src/tui/audition.ts +1 -1
- package/src/tui/euclid.ts +18 -13
- package/src/tui/fader.ts +228 -41
- package/src/tui/granular-menu.ts +2 -4
- package/src/tui/menu-clips.ts +297 -0
- package/src/tui/menu-time.ts +20 -13
- package/src/tui/menu-voice.ts +405 -0
- package/src/tui/menu.ts +1377 -193
- package/src/tui/modal-menu.ts +38 -11
- package/src/tui/performance-menu.ts +46 -1
- package/src/tui/play-chords.ts +108 -5
- package/src/tui/play-mode.ts +16 -1
- package/src/tui/play-session.ts +81 -16
- package/src/tui/sing-menu.ts +278 -0
- package/src/tui/style-menu.ts +104 -0
- package/src/tui/vocoder-menu.ts +244 -0
- package/src/tui/wind-menu.ts +144 -0
- package/src/version.ts +8 -0
- package/src/web/fetch.ts +115 -29
- package/tui/activity.ts +180 -9
- package/tui/app.ts +274 -40
- package/tui/clip-row.ts +132 -0
- package/tui/delight.ts +144 -0
- package/tui/drawer.ts +70 -22
- package/tui/frame-gate.ts +76 -0
- package/tui/grammar.ts +112 -63
- package/tui/guide.ts +42 -4
- package/tui/highway.ts +269 -25
- package/tui/hints.ts +192 -0
- package/tui/input.ts +60 -9
- package/tui/keys.ts +1 -1
- package/tui/play-strip.ts +68 -14
- package/tui/prompt.ts +1 -1
- package/tui/screen.ts +144 -14
- package/tui/theme.ts +27 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,132 @@ All notable changes to dawg are recorded here. Versions follow [semantic version
|
|
|
4
4
|
|
|
5
5
|
## Unreleased
|
|
6
6
|
|
|
7
|
+
## 0.7.0
|
|
8
|
+
|
|
9
|
+
Voice: pitch tracking, formant shift and vowel morph, sung voices and choirs, audio clips with lyrics, vocoder and talkbox, and autotune. Plus a theory-driven style library with a card for every leaf, show-me command lines, faster agent turns with `/model fast`, a native audio sink, and a coherent design pass with one language, one command grammar and one Ctrl-K tree.
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- **Native audio sink.** Live keys are heard about 17 ms after the press on macOS, down from about 80 ms, measured on a loopback (`bench/sink-latency.ts`, `docs/perf.md`). `native/sink` is a small Rust library: a lock-free ring drained by the device's real audio callback through cpal (CoreAudio on macOS, ALSA on Linux), loaded with bun:ffi only after its sha256 matches the shipped manifest. The engine still renders every sample; the sink receives the same stream the stdin players got, converted exactly, through a 5 ms pump with a 15 ms play lead (`DAWG_PLAY_LEAD_MS`). The ffplay path measured 78 to 89 ms and dropped about 4 in 10 short clicks. Release tarballs and npm carry prebuilt libraries for darwin-arm64, darwin-x64, linux-x64 and linux-arm64, built in CI, listed in `SHA256SUMS`, attested, and attached on their own as `libdawg_sink-<platform>.<ext>`; nothing is compiled on install. With no prebuilt for the platform, or a library that fails to load, dawg falls back to ffplay, SoX or afplay. `dawg doctor` shows the backend, why the sink is or is not in use, the lead and the audio devices; the play strip names the backend. It also adds device enumeration, input capture that stores takes as `tracks/<slug>/takes/<sha256>.wav`, and per-buffer host timestamps with input and output latency.
|
|
14
|
+
- **Caribbean and Latin American styles.** Cards for all 98 leaves of the `caribbean` and `latin-america` families (reggae lineage, calypso and soca, kompa and zouk, Cuban son to songo, timba and the carnival conga, salsa, merengue, bachata and Dominican dembow, Mexican forms including son huasteco, cumbia and joropo, Andean, tango and its neighbours, samba to baile funk), each with a theory note. Shared timelines (son, rumba and bossa claves, tresillo, cinquillo, dembow, cascara, partido alto, the bembe bell and the 6/8 against 3/4 sesquialtera) live in `core/styles/cycles.ts`; tests check the clave, dembow, tumbao, cascara, one-drop and sesquialtera onsets exactly in generated notes, and that sibling styles are told apart by onset, pitch-class and tempo fingerprints across seeds.
|
|
15
|
+
- **Roots styles.** Cards for all 99 jazz, blues, R&B/soul/funk, gospel, country and North American folk leaves, each with a theory note: 12-bar, quick-change and 8-bar blues forms in dominant sevenths, swung ii-V chains with tritone substitution, backbeat grids and funk on the one, plagal gospel amens, bluegrass chop and banjo rolls, the barbershop III7-VI7-II7-V7 circle, Appalachian drones and the katajjaq hocket. Family and parent cards hold the shared patterns; leaves carry deltas. The jazz ride plays spang-a-lang, boogie-woogie walks eight to the bar, cool jazz plays brushes, the funk revue ghosts its snare against P-Funk's plain backbeat, and country leaves split into honky-tonk shuffle, Nashville cross-stick ballads, outlaw thump and red-dirt two-step. Style-specific tests pin the forms, grids and meters, and check that sibling leaves stay distinguishable by tempo, onset and pitch-class fingerprints across seeds.
|
|
16
|
+
- **One language.** Every concept has one id and one word, and the help and guide doors share those ids. Ten topics, **sound**, **voice**, **effects**, **rhythm**, **chords**, **mix**, **arrange**, **project**, **keys** and **agent**, open in `/help` and `/guide` (and in `/menu` where the menu has that section); old topic names (music, session, window, tuning, performance, styles, …) still open their topic as aliases, and an unknown one answers `no topic X · did you mean Y · /help`. `/help` lists every command once in its bare form with the placeholders `<drum>`, `<sample>`, `<register>` and `<lane>`, and `/help keys` is drawn from the key table itself. The guides follow the topic tree with one template (Ask, Type it yourself, Menu, Keys, Next), each within 20 rows at 72 columns, and four are new: Voice, Arrange, Tuning and Agent. Getting started explains the NOW / NEXT pill and Voice. `src/lang/glossary.ts` holds the topics, the canonical terms with the words they retired, and the American spellings; the guides, help and docs are checked against it (BPM, Ctrl-K › Label › label breadcrumbs, center, modeled, behavior, color). Receipts never lie: a command that changes nothing says so, and a usage refusal always reads `usage · <cmd> <args>`. Guitar amp presets have their own verb, `rig <preset>` (`rig jangle`; `track <preset>` stays an alias), and the agent key is set with `model key [provider]` (`dawg model key`; `login` is an alias no longer shown in help). Instrument names are exact words (`sawtooth`, listed once; `saw` is an alias). `play` is the transport and play mode is Ctrl-P, which help and guides now name as such. `/help` groups follow the menu order and stay within about fifteen rows, with sub-groups such as `sound · samples` and `project · window`; `dawg --help` lists display flags under "Display options".
|
|
17
|
+
- **Show-me.** The agent works the way you would. It writes dawg commands one per line, and you watch each one appear in the prompt bar as ghost text at the model's speed. Each line runs through the same path as Enter the moment it ends, so the song changes during the turn. A caption names the gesture: the typed command, a fader gliding about 150 ms through the audition, or the play-mode key for each note, which sounds in time as it streams. Each turn ends with a do-it-yourself hint. About a ninth of the input tokens and half the turn time of the JSON tool loop (`docs/show-me.md`). `/showme on|quiet|off`, Ctrl-K › Project › agent › show-me, `showMe` in config; `/showme off`, non-TTY runs and subscription providers keep the JSON tools. `/help` and the guide `show-me` describe it.
|
|
18
|
+
- **`/track rm <name>` and `/track move <name> <position>`** remove (^Z undoes) and reorder tracks, so every score operation has a typed command. `remove` and `delete` are aliases of `rm`, names may have spaces, and removing a track drops any `vocoder.src` or `autotune.from` that named it. Ctrl-K › Arrange › tracks has **move** and **remove** rows for the focused track.
|
|
19
|
+
- **Autotune.** `Track.autotune` corrects pitch on a track's clips and sampler voices, from `gentle` to `hard`: presets `hard robot warble trap pop natural gentle guided locked`, scale targets through the song or track key and tuning (maqam, raga and n-EDO included), chromatic, chord and note targets (`from` another track, a notes routing edge), Antares-style flex, voicing weight, octave guard and hysteresis, plus a `drift` note expression. `/autotune`, `/vocal autotune`, Ctrl-K › Voice › autotune, `autotune_vocal` and `autotune("hard")` (SDK 1.33.0). Tuned spans are cached separately (128 MB); live play stays untuned until a span is ready. Tracks without `autotune` render byte-identically. Correction runs on the 0.7 pitch tracker and PSOLA, on clips (per clip, by offset and nudge) and sampler voices alike. License lines for tuned `say` clips are deferred to 0.7.1 with `say`.
|
|
20
|
+
- **0.7 Voice groundwork.** Optional score shapes for audio clips on tracks (`Track.clips`: file, sha256, start, offset, length, gain, fades, reverse, take, mute, text), takes (`Track.takes`) and per-note lyrics (`Note.lyric`), validated on load with errors that name the key, and a `setClips` score operation. Nothing renders them yet; projects without them load, print and render byte-identically. Cross-track references (`core/routing.ts`) resolve tracks by id or slug, order audio edges and report cycles, and removing a track drops references to it. `/vocal` lists the voice verbs as they arrive, and `/help voice` shows them. SDK 1.32.0.
|
|
21
|
+
- **Formant shift.** A new `formant` effect (after `autofilter`, before `vowel`) moves the formants at constant pitch: `shift` -12..12 st and `mix`, presets `deep giant bright tiny`, lanes `formant-shift` and `formant-mix`. A cepstral envelope warp with a pitch-adaptive lifter; within 1 cent of the pitch, about 4 ms per audio-second at 22.05 kHz, and a preview window matches the full render bit for bit. `/formant -4`, `/vocal formant`, Ctrl-K › Voice › formant, the `set_formant` agent tool (previewable) and `fx: { formant: { shift: -4 } }` in the SDK.
|
|
22
|
+
- **Vowel morph.** The vowel filter takes optional `to` and `morph` (0..1, lane `vowel-morph`) and glides its five formants between two vowels in log frequency: `/vowel a o 0.5`, To and Morph rows in the vowel menu, `set_fx vowel` with `to` and `morph`. Without them the filter bank is unchanged.
|
|
23
|
+
- **Singing voice.** A built-in, synthetic singing voice: an LF glottal source (Rd voice quality, band-limited so it never aliases) through a Klatt formant cascade with soprano, alto, tenor and bass vowels, jitter, shimmer, breath, delayed vibrato, a singer's ring and F1 tuning on high notes. Presets `aah ooh choir oohchoir chorale airy glass lament soprano basso drone khoomei sygyt kargyraa`; the choirs are seeded stereo ensembles of up to 8 voices, and the Tuvan throat presets hold a drone whose overtone the melody steers (kargyraa adds the sub an octave below). Per-note vowels and morphs (`a>o`), and a note's lyric sings its vowel. `sing choir`, `sing voices 4`, `sing vowels a e i o u`, `note vowel o`, Ctrl-K › Voice › sing (Choir, Solo, Throat and the sing rows), Ctrl-K › Sound › performance › Vowels, `sing-*` automation lanes, agent tools `set_sing` and `set_vowels`, and `sing()` and `note(…, { vowel })` in the SDK. A throat preset on an empty track writes a short demo line, and its drone follows the song key in the style's own register. A note's own vibrato replaces the voice's, and half pedal fades the voice. It plays live in play mode (a throat track is one drone), with its tables built before the first key sounds. Tracks without the `sing` field render byte-identically.
|
|
24
|
+
- **Audio clips and lyrics.** Tracks play audio clips: `/vocal import <file> [bar]` copies a ready 48 kHz mono WAV in (converting anything else through ffmpeg) (48 kHz mono, peak set to -6 dBFS), pins its sha256 and places it at a bar on the tempo map; `/vocal stem [bar]` places the vocals stem from `split_stems`; `/vocal setups` lists one-step vocal setups and applies what this build has. `/clip` edits gain (dB, `gain by` nudges), equal-power fades (each side on its own), reverse, mute, move, split, trim and repeat, and `/lyrics` puts syllables on notes (`hel-lo`, `_` holds, `~` skips, words split automatically; a sing track sings each syllable's vowel and holds it through `_`). The new `vocal` instrument turns a track's notes into guides, silent in exports and a soft sine in play mode and the audition loop, and starts with a vocal chain (90 Hz high-pass, 3:1 compressor, plate). Section mutes and arranged windows cut clips with 5 ms fades, a missing file renders silence with a warning, and `dawg check` reports a changed file. Ctrl-K › Voice › clips, lyrics and voice presets, a highway clip row with waveforms, seams and lyrics, agent tools `place_clip`, `edit_clip` and `set_lyrics`, and SDK `audio()`, `repeatAudio()`, `take()` and `lyrics()`. Projects without clips render byte-identically.
|
|
25
|
+
- **Pitch tracking.** `/vocal pitch` reports the detected key, median pitch and range (with cents) of the focused audio clip or sampler voice; `/vocal pitch trace on` draws the sung pitch over the note highway, colored when it is more than 15 cents off; `/vocal notes` adds a guide-notes track with one note per sung note, placed through the tempo map. Ctrl-K › Voice › pitch, agent tools `analyze_pitch` and `pitch_to_notes`. The tracker (pYIN-style at 16 kHz with Viterbi smoothing, p95 within 12 cents on sung phrases and 10 on held notes, 22-30 ms per audio second on clean voice) runs in 0.5 s slices that yield to the TUI on a first analysis, and caches curves in `.dawg/analysis/` (64 MB, oldest first, shown by `/pack cache` and `dawg media doctor`). Fast scoops and falls are tracked a few frames late (p95 about 100 cents on glide frames), so autotune treats tracked glides as trailing the voice. `/vocal notes` keeps a held note with wide vibrato (up to ±150 cents) as one note, and the highway trace covers a whole take and follows tempo and clip moves. A pitch-synchronous (PSOLA) shifter with a formant factor is in place for autotune and harmony. No score field changes; renders are unchanged.
|
|
26
|
+
- **Vocoder and talkbox.** A track's `vocoder` field (`{ src, preset, ...params }`) makes the track a carrier shaped by another track's voice: a channel vocoder (4 to 40 bands) or an LPC talkbox, with formant shift, unvoiced noise on consonants, an auto gate, hiss, freeze, depth, mix and gain. `instrument vocoder` is a built-in saw, supersaw, pulse or noise carrier following notes, the song's chords or a drone. Presets `classic robot talkbox choir glass whisper smear lofi`. `/vocoder` on a vocal makes a vocoder track in one step (and mutes the vocal); `/vocal vocoder`, Ctrl-K › Voice › vocoder and voice presets, `vocoder-*` automation lanes, the `set_vocoder` and `vocode` agent tools, and `vocoder()` in the SDK. The modulator renders first and is cached; cycles are rejected and removing the source drops `src`. Tracks without the field render byte-identically.
|
|
27
|
+
- **Electronic style cards.** `/style` covers all 100 electronic leaves outside breakbeat (disco, house, techno, trance, hardcore, downtempo, ambient, IDM, synthwave and chip), each with a theory note: four-on-the-floor with off-beat open hat, psytrance rolling bass that never sits on the kick, half-time witch house, electro's syncopated kick, ambient pedal points without a kit, dance breakdowns that drop the kick, galloping bass for progressive trance and the new melodic techno leaf, a two-note roll for the new progressive psytrance leaf, gabber's kick-as-bass, a downbeat-held ambient pedal and an 8th sequencer bass for Berlin school.
|
|
28
|
+
- **Agent model benchmark.** `bench/agent-eval/` drives the real agent loop and tools against a temp project with 65 tasks in five tiers (single edits, composition, project-file edits, multi-step, error recovery) and grades the resulting score with code, never an LLM judge. It records pass, steps, tool calls, tokens, first-token and full-turn latency and cost per model, with a hard spend cap. CI replays the reference solutions and recorded live transcripts offline. Results and the recommended default and fast models are in `docs/model-eval.md`.
|
|
29
|
+
|
|
30
|
+
- **Style engine.** `/style <id> [bars] [seed]` writes a whole song in a style from a style card: theory patterns for meter and cycles, tempo, groove and swing, onset grids per role, scales and tunings, harmony grammar, melody statistics, texture and form, with inheritance from family to branch to leaf. The taxonomy covers about 850 styles in eight families; every leaf is present and generates from its nearest card. Every generated song passes numeric pattern checks (meter, tempo, onset grids, swing ratio, scale and tuning membership, progression grammar, melody range and intervals, instruments). `/style list|search|info`, `/style blend a b 0.3`, `/style again`, Ctrl-K › Arrange › style (`/menu style`), agent tools `list_styles`, `style_info` and `apply_style`, and `song({ style: style("deep-house", { seed: 3 }) })` provenance in the SDK (1.33.0). Projects without `style` render byte-identically.
|
|
31
|
+
- **Art, experimental, screen and stage styles.** Cards for all 106 leaves under `western-art`, `experimental`, `screen-stage` and `childrens`, from plainchant and organum through baroque, classical, romantic, modernist, serial and minimalist music to musique concrète, drone, harsh noise, film, game and anime scores, show tunes, marches and a 6/8 lullaby (its own leaf, apart from the sing-along children's song). Each card states its theory in the summary (ground bass, Alberti bass, chromatic mediants, tintinnabuli, the royal road IV-V-iii-vi, the 32-bar AABA refrain) and tests pin the defining patterns, such as oom-pah march bass on the strong beats and an unbroken sixteenth pulse in pulse minimalism. Twelve-tone cards order pitch from a seeded row in its prime, inversion, retrograde and retrograde-inversion forms (card field `melody.row`; `integral` also serializes durations and dynamics); the new scales `chromatic`, `harmonic-series` (partials 8 to 15, with a just tuning of the same name) and `quarter-tone` give expressionism, spectralism and microtonal art their pitch worlds, and a test keeps sibling leaves apart by tempo, meter, instruments, pitch classes or onsets.
|
|
32
|
+
- **Styles: Africa, MENA and South Asia.** Written cards for all 78 leaves under `africa`, `mena` and `south-asia`, each with a theory note: the Ewe standard bell and 12/8 timelines, sebene and soukous guitars, mbira interlock, iqa'at (maqsum, sama'i thaqil, aksak 9/8, devr-i revan) in maqam tunings (rast, bayati, shur, segah), and talas (teental with its khali, chautal, deepchandi, adi, misra chapu) over raga aroha and avaroha. Tests check the bell, tala rests and that a raga's forbidden svaras never sound.
|
|
33
|
+
- **European folk, East and Southeast Asian and Oceanian styles.** Every one of the 88 leaves under europe-folk, east-asia, southeast-asia and oceania has its own card. Family and branch cards hold the shared patterns (drones, the Andalusian phrygian cadence, aksak 7/8 and 9/8 with their 2+2+3 groupings, pentatonic gong-chime textures, colotomic cycles), and each leaf adds its own: flamenco soleá compás with accents on 3, 6, 8, 10 and 12, fado and rebetiko modes, jig and reel lilt, joik and kulning without harmony, gamelan ladrang and lancaran cycles in pelog and slendro with gong on the last beat, Korean jangdan and Japanese yatsu-byōshi timelines, the in, yo and Ryūkyū scales gated so their avoided degrees never sound, Thai and Khmer pentatonic heterophony, Tuvan drones and Pacific log-drum and slack-key textures. Each card's summary names the theory it encodes.
|
|
34
|
+
- **Style critic pass, europe-asia-pacific.** An aksak card's groupings now only apply to bars they fill (2+2+3 is a 7/8, never an 11/8), and its hand drum strikes the group starts. Bulgarian, Macedonian and Sevdalinka leaves get their modes and tempi; nanguan and Jiangnan sizhu sit in zhi mode (no major third), the guqin in gong mode, gagaku in ritsu, shōmyō in ryo melisma, honkyoku on its in-scale finals. Unaccompanied or drumless traditions (gusle epic, iso-polyphony, runo song, polska, għana, tamburica, kan ha diskan, solo zithers and chant) no longer inherit a frame drum or bass. A test checks that sibling leaves are told apart by onset, pitch-class and tempo fingerprints across three seeds.
|
|
35
|
+
- **Faster agent turns and `/model fast`.** `/model fast` (`dawg model fast`, `DAWG_MODEL=fast`) picks Claude Haiku 5.5, the fastest model that passes the agent eval about as well as the default; Haiku 5.5 and GLM-5.3 Flash join the fast models. A parameter edit (tempo, mix, effects, sound) whose reply starts with `Done:` beside its tool calls ends the turn once they apply, saving a round trip; note, rhythm, chord and structure writes keep their review step. A provider that sends nothing for 20 s after its headers is retried, and Haiku 5.5 falls back once to GLM-5.3 Flash when every attempt failed before its first byte. Typed commands entered during an agent turn run at once instead of steering it. Before and after numbers are in `docs/model-eval.md`.
|
|
36
|
+
- **`progression i7 IV7 each 8`** writes sustained, voice-led block chords on the focused track from the prompt, the same notes as the SDK's `progression()`. `bass` adds a root under each chord; `prog` is an alias. Menu: Ctrl-K › Chords and key › progression.
|
|
37
|
+
- **Rock, punk and metal styles.** Every one of the 93 rock-family leaves (Latin rock is new: timbale bell and congas over a rock kit, dorian i-IV vamps) has its own card (early rock, classic and hard rock, prog, alternative and indie with shoegaze, punk, metal). Branch cards hold the shared patterns (backbeat on 2 and 4, power chords, 12-bar blues with boogie bass, additive 7/8 and 5/4, phrygian bII riffing, double kick), and each leaf adds its own: skank beat, d-beat, blast beat, gallop, motorik, quiet-loud and crescendo forms, slap upright, spring twang, drum-machine goth. Sibling leaves are told apart in generated notes, not only in summaries: first-wave punk's quarter-note kick and I-IV-V against pop punk's syncopated kick and axis loop, minor hardcore against major skate punk, the thrash beat's kick on the beat, major-key choir-led power metal against mid-tempo harmonic-minor neoclassical, and a distinct kick figure for every classic-rock leaf. Each card's summary names the theory it encodes.
|
|
38
|
+
- **Pop, hip hop and breakbeat style cards.** All 100 leaves of traditional, sixties and modern pop (hyperpop, PC Music, bedroom and indie pop included), hip hop (old school, regional and modern rap) and breakbeat and UK bass (jungle, drum and bass, dubstep, garage, footwork) have their own cards, each naming its theory: backbeat or half-time snare, two-step and dembow kicks, tresillo bass, royal-road J-pop, yonanuki-minor enka, kayokyoku and trot over harmonic-minor i-iv-V7, ppongjjak, oom-pah schlager on I-IV-V7, minor-key Southeast Asian ballads, swung boom bap, triplet footwork. Tests pin each defining grid in the card and in generated notes, and check that sibling leaves differ in onsets, pitch classes, tempo and swing across seeds.
|
|
39
|
+
- **Yonanuki minor scale.** `yonanuki-minor` (aliases `yonanuki`, `enka minor`): the minor scale without its 4th and 7th (1 2 b3 5 b6), the Japanese and Korean popular-song pentatonic. Use it in a key string (`"A yonanuki-minor"`) like any library scale.
|
|
40
|
+
|
|
41
|
+
### Changed
|
|
42
|
+
|
|
43
|
+
- **Audit pass.** `track loop` is the canonical loop verb (`cycle` stays an alias) and `key <mode>` keeps the tonic and changes the mode; Ctrl-K rows run the canonical verbs. Drum groove lists and receipts say "grooves", the empty vocal hint reads `lyrics "la la"` (bare `lyrics` has its own usage line), and sign-in prose everywhere says `model key`. The "synced" card no longer fires for this window's own writes through dawgd. Every line of `dawg --help` fits 78 columns. A sung legato line glides its vowel over 40 ms at each note change instead of jumping, so a four-part chorale with lyrics no longer clicks to 0 dBFS (each part now peaks near -9 dBFS). Each style taxonomy leaf has its own card, and a test keeps sibling leaves apart by onset, pitch-class and tempo fingerprints across three seeds. `docs/model-eval.md` records an audit rerun of the agent eval.
|
|
44
|
+
- **Feel.** Receipts name the musical change: `✓ lofi-hip-hop · G dorian · 133 BPM · 8 bars · 4 tracks`, an agent turn ends on one receipt, and undo names what it took back; play and pause never move the shown revision. The TUI opens straight into the editor with one optional card (`/model key adds an agent · optional`). Hints read `space play · ctrl-p play mode · ctrl-k menu`, with drum (`hit kick at 0`) and vocal hints, a seeded style suggestion at 100 columns or more, and `space stop · type a request` while playing (`space stop · ctrl-p play mode` with no agent), on a reserved row that never covers the ruler. One-time cards fade after 8 s or 3 actions (still in ctrl-o), take turns whole when they do not fit side by side, and duplicates collapse to `×N`; the prompt placeholder suggests the same seeded style as the empty line. "synced" only appears for a revision written by another window, and names it by the track that window has open (`synced · lead window`). Play mode wears a `PLAY MODE` badge with a compressed header (`▶ 120 BPM · drums · rev 1`); on a kit its keys are labelled by drum and the chord row is hidden. A quiet downbeat glint, a one-time first-loop sweep and lane glows, all seeded and off with `/motion off`. Frames rewrite only each row's changed cells with minimal color codes, bursts of forced frames coalesce to 30 fps, a style-sized playback stays under 60 KB/s at 80x24, and frames back off when the terminal lags.
|
|
45
|
+
- **One command grammar.** `/x` and `x` run the same command; `remove|rm|delete` and `list|presets|ls` work on every object; aliases (`rig`, `model key`, `chords idiom`, `synth filter`, `loop a-b|off`, `export f.wav [stems]`, bare `pattern`/`kit`) parse as their canonical form. A known verb that fails gets a usage card with a suggestion instead of reaching the agent. Instrument names are checked exactly on write (`sawtoth` is refused), `remove` checks the note exists, errors use one template with no raw core keys, and status reads print `•`. `set_effects`, `vocode` and `add_drums` stay callable but are no longer advertised to the agent. Agent command lines may only name files inside the project folder. Out-of-range synth and fx values name their range (`lpf takes 20…20000 Hz`), `loop 2-3` marks and loops that span when no section matches it, and `swing` points at the rhythm row. One nearest-match helper serves every vocabulary.
|
|
46
|
+
- **One ctrl-k tree.** The menu has eight roots: Sound, Voice, Effects, Rhythm, Chords and key (with tuning), Mix, Arrange (tracks, sections, style) and Project (export, session, agent with model, show-me and model key, help and guides). `/menu <id>` takes the ten topic ids, every topic alias or any row name; `/menu keys` opens the `?` panel, and an unknown id answers `no menu "sond" · did you mean /menu sound? · /menu <topic or row>`. Labels are sentence case and fit 16 columns. One key does one job: `Enter` opens or confirms everywhere, `←` `h` go back except on value rows, where `←` `→` adjust, `x` `d` `Delete` reset, `0`-`9` type, and `Tab`/`Shift-Tab` move between fields. The key sets live in `tui/grammar.ts`, and each `?` panel lists a key once. Faders snap to detents (volume 1, pan 0, whole tempos, mix 0/0.5/1, octave cutoffs), and the staged badge reads `A/B: 1 change staged · enter keep · esc revert`. The fader hint puts `enter keep` and `x reset` first so they survive 80 columns, and tempo, meter and loop length, which apply at once, say so; `x` puts every number row back, tempo included. Show-me's finish hint names the path as `Ctrl-K › Chords and key › tuning`, a bare `pattern house` line runs, and a command line that fails to parse, or names an unknown pattern or kit (`pattern housee`), shows as a red receipt with a did-you-mean (`✗ pattern housee · did you mean pattern house?`). A `/model` with an unknown name now shows `✗`, not `✓`.
|
|
47
|
+
- `fx formant` is no longer an alias of the vowel filter; `/fx formant o` and `set_fx {effect: "formant", vowel}` explain that the vowel filter is `vowel`.
|
|
48
|
+
|
|
49
|
+
### Fixed
|
|
50
|
+
|
|
51
|
+
- **Consistency checks.** New tests keep the docs and the product in step. They walk every menu action and value over saw, piano, drums, organ, sampler, voice and strings, parse each command, and check that each row runs the canonical verb (`/track remove`, not `rm`). Help and usage examples, lane aliases, help-topic and guide aliases, and `Ctrl-K ›` paths are checked against the real tables, and window commands with nonsense arguments are refused. A glossary lint scans help, menus, guides, DAWG.md, README, docs and the prose in core/, tui/, src/agent and src/main.ts: British spellings are at zero, and retired phrases (login, sign in, browse sounds, drum kit, cycle, STEER and others) have exact per-source counts that must fall as renames land. A four-ways table names each feature's command, menu node, agent tool and SDK door, with rig and play mode as their own rows. Two 80x24 PTY suites check that each topic id opens its own page in `/help`, `/guide` and `/menu`, and that receipts tell the truth (`remove n1`, `instrument sawtoth`, `tempo 900`, the sync card in one window with an agent tool write and with the daemon on, Space, and a streamed bare `pattern house`). Cases still waiting on the grammar, menu, feel and language lanes are listed by name and fail once fixed, so the lists only shrink. Fixed along the way: automation lanes in any case (`SYNTH-PITCHJUMP`), the compressor attack fader floor, `/menu` usage lists only root ids, the `/style` receipt says BPM, and American spelling in style cards, agent tool text and receipts (modeled, color, center, license).
|
|
52
|
+
- **0.7 Voice integration.** Fixes from scenario runs on the merged voice lanes. Throat presets keep an audible drone under the whistle (overtone gain lowered), kargyraa's period-doubled sub is deeper, and a melody note a few cents outside the harmonic band no longer jumps an octave. A static vocoder `freeze` holds the last sung vowel instead of an empty envelope, and the gate no longer fades a frozen vowel when the singer stops (channel and talkbox). `sing voice: auto` picks one formant table per part from its median pitch instead of per note. `/vocal notes` splits repeated pitches at re-articulation dips, and `/vocal pitch` weighs a line's first and last notes when naming the key. Hard autotune corrects low-confidence onsets and glides. Reversed clips mirror exactly (they were one sample late).
|
|
53
|
+
- **Voice surfaces.** A project file whose src names a missing track says how to fix it. `/vocal import` on a fresh track makes it a `vocal` track and `instrument vocal` lists the chain it adds; `/vocal setups hyper` now applies autotune. `/clip repeat 4` repeats to the song end. `/help <command>` (`/help vocoder`, `/help clip`) shows a command's rows and full usage. `/sing khoomei harmonics 6 12` is accepted, `/instrument aah` and `instrument sing chorale` pick sing presets, and throat demo notes say how to remove them. The root ctrl-k filter finds nested groups (`/autotune`, `/voice`, `/formant`). `strum` grows the song when its chords run past the end. `test/pty-harness.ts` can be imported from a driver script. DAWG.md explains talkbox register and what `render --section` does at its edges.
|
|
54
|
+
- **Sample `shift` with `formant 0` keeps the new pitch.** The formant envelope traced the source's harmonics, so a shifted sample came back near its old pitch (-7 st landed about 1900 cents off). Peaks now join the envelope only within 9 dB of the cepstral envelope; the shifted pitch re-tracks within 10 cents at -7, +5 and +12 st. Sampler voices that set `shift` and `formant` render differently.
|
|
55
|
+
- **Sound calibration 1.** A song-level `calibration` (`/calibration 0|1|latest|off`, Project › calibration, the `set_calibration` agent tool, `song({ calibration: 1 })` in the SDK, SDK 1.32.0) gates fixes to released engines; `dawg init` starts new songs at 1, and songs without it render byte-identically. Under 1: a closed or pedal hat chokes a sounding open hat in 8 ms; GM toms 41 to 50 are pitched (a fill now descends); GM 49, 52, 55 and 57 play a crash, 51, 53 and 59 a ride, and 56 a cowbell instead of a rim click (fills end on the crash); hat metal is band-limited (polyBLEP) and no longer aliases at 22.05 kHz; grand, upright, felt, harpsichord, epiano and the other keys presets sit within 3 dB of piano from note 36 to 96 at velocity 0.8; and lip-model brass (trumpet, harmon, plunger, trombone, tuba, horn) no longer warbles about 30 Hz (period-to-period peak variation under 5%, from 23 to 35%), and plays within 5 cents by YIN as well as by FFT.
|
|
56
|
+
- **Sing and choir level.** The singing voice was about 16 dB hotter than every other engine and clipped any mix it joined; it now lands within 3 dB of the piano reference (about -18 LUFS for one note at velocity 0.8).
|
|
57
|
+
- **Roman numerals spell by letter.** `bVII` in C names Bb (not A#), `bII` in A minor Bb, `vii°` in F# E#dim; the exact `I[7]` forms spell the same way. Dominant and major 11 chords voice without the major 3rd (C11 = C G Bb D F), avoiding the minor-9th clash.
|
|
58
|
+
- **Shuffle.** The `shuffle` groove plays triplet 8ths; the old swung-16th groove is `half-time-shuffle`.
|
|
59
|
+
- **SDK `track({ wind })` and `track({ sing })`** were dropped silently; they now apply as `instrument: wind({...})` does.
|
|
60
|
+
- **Render summary names the rate.** A plain song still exports at 22.05 kHz (byte-identical), and the render line says so and suggests `--rate 48000`.
|
|
61
|
+
- **Prompt caching on the AI Gateway.** Anthropic models on the Gateway now get the same explicit cache breakpoint on the system prompt as on OpenRouter; the Gateway's automatic caching option cached nothing on its chat endpoint. Later steps of a turn now read about 27K cached tokens, which made Claude Haiku 4.5 about seven times cheaper per step in `bench/agent-eval`.
|
|
62
|
+
- **Agent replies no longer stop after 15 s.** The gateway header timeout now covers only the wait for response headers; a reply may stream for as long as the turn budget allows. A transport timeout or a dropped stream is reported as a provider error that names the timeout, not as an internal error.
|
|
63
|
+
- **`fetch_url` connects to the address it checked.** The request is pinned to the resolved, public address, so a rebinding hostname cannot point the second lookup at loopback or cloud metadata. IPv4-compatible (`::127.0.0.1`), 6to4 (`2002::/16`), site-local (`fec0::/10`) and discard-prefix (`100::/64`) IPv6 addresses are now refused when they reach a private range.
|
|
64
|
+
- **OpenRouter routing variants.** Model IDs with a `:nitro`, `:free`, `:floor` or other variant suffix are accepted on OpenRouter (`/model`, `dawg login`, `DAWG_MODEL`) and sent unchanged; the AI Gateway still refuses them.
|
|
65
|
+
- **Prompt caching.** Requests to Anthropic models mark the static system prompt with a cache breakpoint, and tool descriptions fit the 1024-character limit some providers apply, so later agent steps reuse the cached prefix instead of re-sending about 22K tokens at full cost.
|
|
66
|
+
- **Synth filter envelopes no longer spike.** A negative `lpenv`, `hpenv` or `bpenv` runs the note filter on a state-variable filter that stays stable while its cutoff falls, so a deep downward sweep no longer jumps up to 35 dB above the steady level or clips. Zero and positive depths are byte-identical.
|
|
67
|
+
- **Live keys respond faster.** A live note renders a buffer sized by its release instead of the whole 12 s window, so a warm grand note-on drops from about 21 ms to 4 ms at 48 kHz; the result is byte-identical to the full window.
|
|
68
|
+
- **Bowed tremolo stays in tune.** At each `tremhz` reversal the bow eases its force, and the pitch lock takes one step per stroke, so a tremolo cello reads within 8 cents from C2 to E5 instead of 10 to 37 cents off. Strings without tremolo are byte-identical.
|
|
69
|
+
- **Non-finite samples are caught.** A NaN or infinite sample in any stem or bus is zeroed before it reaches the feedback stages or the 16-bit writer, and `dawg render` names the tracks it came from.
|
|
70
|
+
- **`djf` at 1 stays audible.** The high-pass end of the DJ filter stops at 10 kHz instead of 20 kHz, which removed everything (values below about 0.95 are unchanged); the low-pass end is unchanged. The amp gate doc notes that 0 dB gates everything.
|
|
71
|
+
- Shortening a song (`/bars`, `setBars`) drops tempo marks, meter changes and fermatas past the new end; they were never heard, and the printed `song.ts` failed to load. Older projects that hold such marks print without them, and a tempo ramp ending exactly on the final barline prints at the last tick, as `ramp()` writes it.
|
|
72
|
+
- A wavetable kept on a track after it switched to another instrument is printed as `wavetable: wavetable(...)` (SDK 1.32.0) instead of being lost on the next sync.
|
|
73
|
+
- **Command-line argv.** `dawg <command> --help` prints usage, exits 0 and writes nothing for every subcommand (`dawg init --help` used to create a project, `dawg media --help` exited 2, `dawg check --help` ran the check); `init`, `check` and `sessions` reject unknown options and extra arguments with exit 2. Value flags with no value, an unknown `--theme`, and an invalid or over-long `--track` exit 2 with one line instead of attaching, defaulting or printing a stack trace. `--track` is normalized like `/track` and matches an existing track by id or name. `dawg --import a --export b` is now a pure conversion that leaves the session alone, and a demo frame in a fresh directory no longer creates `.dawg/`. `dawg --help` shows every render flag.
|
|
74
|
+
- **Typo suggestions** count an adjacent swap as one edit, so `/hlep`, `/meun` and `/plya` suggest `/help`, `/menu` and `/play`; `/play in-key` is in help.
|
|
75
|
+
- **Original lyric examples.** Help, menus, SDK docs and the `/lyrics` hints use original syllables; a test guards shipped text against known lyric phrases.
|
|
76
|
+
- Gemini models can run agent turns: tool schemas are sent without `type` unions, which the gateway rewrote into a form Gemini rejected on every request.
|
|
77
|
+
- Reasoning models no longer end a turn at the response cap while thinking: the cap is 1 MiB of raw stream.
|
|
78
|
+
- The agent stops re-applying an edit it already made: tool results say the brief already reflects the change, and `update_notes` takes a relative `transpose` in semitones and reports each note's before and after pitch.
|
|
79
|
+
- Models place "beats 2 and 4" on the backbeat: the prompt maps musical counts (from 1) to dawg beats (from 0), and `set_rhythm` says how a row tiles the loop.
|
|
80
|
+
- Two-way sync never overwrites a track or song file you are still editing: a file whose bytes differ from what dawg last wrote (or that fails to evaluate) is kept, with an `edited · not overwritten` card, and untouched files keep their formatting and comments when another track changes.
|
|
81
|
+
- Two sessions opened in one project folder no longer replace each other's music through the files; the files belong to one session at a time, and another session's window stays detached.
|
|
82
|
+
- A window no longer reverts its own newer edit by applying another window's reprint, and concurrent windows merge `.dawg/sync.json` under a lock.
|
|
83
|
+
- Editing a helper module or `.scl` file that a track imports now syncs; a look with nothing new says `files unchanged` instead of repeating the last outcome.
|
|
84
|
+
- A valid score over 1 MiB of JSON no longer fails evaluation as "timed out"; the output bound is 32 MiB and an overflow is reported as such.
|
|
85
|
+
- Undo of the edit just made works at the session record's size cap, and a session past 2000 events keeps accepting edits (the oldest events fold away; records gain an optional `folded` count, older records load unchanged).
|
|
86
|
+
- Project files and `.dawg/sync.json` are written durably (fsync of the file and its directory), and closing a window no longer leaves a ghost presence entry or stray temp files.
|
|
87
|
+
- The evaluator is described as an isolated process, not a sandbox: project code runs with your user's access.
|
|
88
|
+
- **The terminal is always restored.** Quitting restores the main screen, plain paste, the cursor and mouse reporting before any teardown step runs, and each step runs on its own, so a read-only `.dawg` or a dead audio engine no longer leaves the shell on the alternate screen with paste brackets on. An uncaught exception leaves the alternate screen before printing its stack and exits 1; a rejected background action becomes an error card and the editor repaints over anything the runtime printed. Runtime warnings and `console.error` go to the transcript instead of over the frame.
|
|
89
|
+
- **A failing header click on the transport** shows the same `transport failed` card as space and the menu, instead of printing a stack into the frame.
|
|
90
|
+
- **The idle editor no longer rebuilds its frame 30 times a second.** Frames build when input, the score, the activity strip or a playing clock changes, with a 2 Hz heartbeat otherwise.
|
|
91
|
+
- **End and Home on the help panel and transcript** stop at the last full page, so the next arrow press moves the view. The help panel's keys list no longer offers `j k`, which type into the prompt there.
|
|
92
|
+
- **Help rows and headings clip with an ellipsis** at narrow widths, like every other panel.
|
|
93
|
+
- **`/fork` and `/resume` keep the new session's name.** A change the old session's watcher was still reading when the session switched no longer lands afterwards and puts the old name (and score) back in the header.
|
|
94
|
+
|
|
95
|
+
## 0.6.1
|
|
96
|
+
|
|
97
|
+
Instruments wave 2: bowed strings and sampler velocity layers, gamelan presets and a wind engine, electric keys with soft and sostenuto pedals, tonewheel, combo and pipe organs, shoegaze effects and guitar strumming, and granular resample with formant-keeping shift. Every new field is optional, so 0.4, 0.5 and 0.6.0 projects load, print and render byte-identically.
|
|
98
|
+
|
|
99
|
+
### Added
|
|
100
|
+
|
|
101
|
+
- **Electric keys.** Three new keys families on the modelled-piano `keys` field: `epiano` (a tine piano with a nonlinear pickup at 2x oversampling, `bark` and `bell`, and the `vibe` suitcase stereo vibrato), `wurli` (a reed piano with a capacitive pickup and a `trem` tremolo) and `clav` (neck and bridge pickups with `pickup neck|bridge|both|out` and a `mute` slider, seeded per track, with a release plunk). Presets `epiano suitcase dyno wurli clav funkclav`, aliases `rhodes wurlitzer clavinet`. `epiano preset suitcase`, `clav pickup bridge`, Sound › browse sounds › Keys › Electric and the electric rows in the Sound page, `set_instrument` and `set_keys`, and `track({ instrument: "suitcase" })` in the SDK. The legacy word `keys` is unchanged.
|
|
102
|
+
- **Soft pedal and sostenuto.** The modelled pianos take `softPedal` (una corda: fewer unison strings, a softer hammer and a darker, quieter note, read at each onset) and `sostenuto` (holds only the keys already down when it presses). `pedal soft 0-8`, `pedal sost 0-4`, the Soft pedal and Sostenuto rows in Sound › performance, the `set_piano_pedals` agent tool and `track({ softPedal, sostenuto })` in the SDK (1.26.0). The piano parameter `keys sym` adds sympathetic string resonance while the sustain pedal is down. Tracks without them render byte-identically.
|
|
103
|
+
- **Shoegaze effects.** Four new track effects after the guitar cab: `wobble` (a held tremolo arm: seeded pitch wow and flutter, `depth` in cents), `bloom` (amp feedback: the top held note grows a singing harmonic, seeded per note), `swell` (a volume-pedal fade-in on every strum) and `double` (automatic double tracking: a seeded second take spread left and right). `fx wobble`, Effects › Shoegaze, `set_fx`, and `fx: { wobble: { depth: 30 } }` in the SDK; lanes `wobble-depth` and `swell-mix`. Rigs `shoegaze glide dreampop swell ebow` (`rig shoegaze`, `track shoegaze`), and `jangle` gains a light double when applied again (stored jangle rigs render unchanged). Reverb `ir builtin:reverse` is a reverse-gate swell (it rises after the attack; not a pre-verb), with `builtin:gate` and `builtin:spring` beside it, all generated from seeded noise. A full shoegaze rig costs under 25 ms per track-second. SDK 1.27.0 (additive).
|
|
104
|
+
- **Guitar strumming.** `guitar tune dadgad`, `guitar capo 2` (also `hand`, `ring`, `position`) set a track's fretboard, stored as an optional `guitar` field. `strum G D Em C folk` writes strummed chords voiced on that fretboard (no barre over an open string; a fifth, then an 11th, then a 9th are dropped when a chord has too many notes; chord symbols now also take `11 m11 maj11 add11 madd11 13 m13 maj13 7b9 7#11 maj7#11 7b13 13b9`), with stroke grids (`D U d u x - .` or `down folk pop punk funk reggae waltz jangle island`) and a strum `speed` in milliseconds (22 ms by default; the spread equals it within 1 ms). `/chords perform guitar` strums play-mode chords, with `/chords strokes` and `/chords speed` and `[` `]` to change speed while playing; Chords › strokes and speed, Sound › guitar; agent tools `set_guitar` and `strum_chords`, and `write_chords` takes `perform: "guitar"`; SDK `track({ guitar })` and `strum()`.
|
|
105
|
+
- **Organs.** Tonewheel, combo and pipe organs on the keys engine: 91 free-running tonewheels phase-locked to song time with nine drawbars, single-trigger percussion that mutes the 1' bar, key click, scanner vibrato/chorus V1-C3, drive and a two-rotor rotary speaker with inertia (`rotary slow|fast|stop`, lanes `keys-rotary` and `keys-drive`); a five-register combo organ; band-limited additive pipe ranks with stops, registrations, chiff, wind and tremulant, on any tuning. Presets tonewheel gospel jazzorgan combo vox pipe flutes cornet reeds celeste (aliases hammond b3 farfisa church pipeorgan). Reach them with `tonewheel`, `combo`, `pipe` and `rotary`, the menu's Sound › browse sounds › Keys › Organs and the Drawbars, Registers and Stops sub-menus, the agent's `set_keys` (`drawbars`, `registers`, `stops`, `rotary`), or `keys({ drawbars, stops, registers })` in the SDK (1.26.0). `organ` keeps its old tone. Percussion is one envelope per track (chords all sound it; `percvol soft` for the soft setting), mutations are tuned pure, footages follow non-12 tunings by octave, drive keeps loudness, presets sit within a few dB, `rotary fast at <beat>` writes the lane, a row the family does not read is refused, and long exports keep the wheels and rotor phase-locked across windows.
|
|
106
|
+
- Resample (SDK 1.29.0): `resample <track>|orbit <n>|master [section <name>|bars a-b] [post] [grain] [as <id>]` renders a track, an orbit or the mix through the offline renderer to a WAV pinned by sha256 under the track's `samples/`, records where it came from on the voice (`from`), and adds a sampler track, or with `grain` a granular track, that plays it. Project › Resample in the ctrl-k menu and the agent's `resample` tool do the same.
|
|
107
|
+
- Grain play: granular `sync` (grain onsets on a note-value grid that follows the tempo map), `quant` (`scale` or `chord`: grain pitches snap to the key or to what the other tracks sound), `mono` (legato notes retarget one voice and its cloud) and `pedal` (the sustain pedal freezes the head), plus `grain-<param>` automation lanes for every movable granular parameter, in Mix & automation's picker.
|
|
108
|
+
- Sample shift and fades: `shift <st> [formant keep|<n>]` pitches a sampler voice without changing its length (phase vocoder with formant keeping from 110 to 330 Hz voices, within 1 cent), and `fade in|out <s>` sets Strudel's `fadeInTime`/`fadeTime`. Sound › Sample rows Shift, Formant, Fade in and Fade out, and `set_sample` arguments.
|
|
109
|
+
- **Gamelan.** Fifteen presets appended to the modal engine: the bronzes `saron` `demung` `slenthem` `gangsa` `gender` `bonang` `kenong` `kethuk` `kempul`, the bells `crotales` `musicbox` `toypiano` and the frame drums `daf` `bodhran` `tabla`. `modal gamelan` lists them, with a hint to use `tuning slendro` or `pelog`. `modal pair <track>` makes an ombak pair: the pengisep sounds `ombak` Hz above its pengumbang partner, so the two beat at exactly that rate (gangsa 7 Hz). `modal ombak 6` on a track that is not modal yet starts a gangsa. Saron, demung, gangsa and bonang damp the key at note-off, as a player's hand does before the next stroke (tutupan). In the SDK a gangsa partner without its own `ombak` plays one straight voice, and `dawg check` warns when `pair` names a missing or non-modal track. Menu Sound › browse sounds › Mallets and bells › Gamelan, `set_modal` takes `pair`, SDK `modal("gangsa", { pair })` (1.30.0). `RESONATOR_TABLE_VERSION` is 2 (rows appended, existing presets unchanged), so cached stems re-render once.
|
|
110
|
+
- **Ring-out in play mode.** Undamped modal voices (gongs, kempul, bowls) keep ringing after note-off in play mode and the audition loop, capped at 32 with a 250 ms fade for the oldest; the loop fold fades a tail that would outlast it.
|
|
111
|
+
- **Winds and brass.** A new wind engine of breath-driven waveguides (jet, reed, conical reed and lip models; Thiran-tuned bores; reed and jet at 2x with ADAA) with 21 presets: `flute` `recorder` `whistle` `ney` `shakuhachi` `panpipe` `suling` `bansuri` `clarinet` `bassclarinet` `oboe` `bassoon` `sax` `altosax` `barisax` `trumpet` `harmon` `plunger` `trombone` `tuba` `horn`. Per-rate trims from `scripts/calibrate-winds.ts` keep every preset within 3 cents. `bright` opens the tone of every model, and presets are level-matched on loudness (sustain RMS) rather than peak. Lines slur by default, back-to-back notes included, `players` spreads a section over chord tones, mutes, growl, flutter and a plunger wah, `wind-<param>` lanes. `wind <preset>`, `wind trumpet mute harmon`, `wind breath 0.8` (`vibrato` is an alias of `vib`), staged A/B in the audition loop, `presets wind`, `instrument flute`, menu Sound › browse sounds › Winds and brass and the Sound page, agent `set_wind`, SDK `wind()` (1.30.0). The legacy `wind` word keeps its old tone byte-identically.
|
|
112
|
+
- **Bowed strings.** The string engine gains a bow (`exciter: "bow"`): a bowed waveguide after the STK model with a Schelleng guard, so every pressure, speed and position setting stays in Helmholtz motion (0 of 1296 unstable), a pitch lock (within 1 cent to C7 at 22.05 and 48 kHz) and 2x oversampling for short strings. 13 presets are appended: violin, viola, cello, contrabass, fiddle, erhu, kamancheh, the sections violins, violas, cellos and contrabasses, pizz and trem, with a `violin` body. Bow parameters `pressure speed attack tremhz sord dyn` (alias `expression`) join `vib vibmod vibdelay`; `string-pressure`, `string-speed`, `string-sord` and `string-dyn` automate. True legato (the held note lets go within a 64th note or 150 ms) or `legato` notes slur in one bow stroke, up to two octaves, and a note held under a moving line keeps sounding. Section players get seeded vibrato and onsets up to 25 ms apart; staccato is a detache stroke and accents bite. `bowed violin`, `bowed pressure 0.7`, Sound › browse sounds › Strings › Bowed and the bow rows in the Sound page, `set_string` and `stringed({ preset: "cello" })` (SDK 1.31.0). The bare words `cello`, `contrabass` and `strings` keep their old voices byte-identically; `bowed-cello`, `violin`, `viola`, `fiddle`, `erhu`, `kamancheh`, `violins`, `violas`, `cellos` and `contrabasses` pick the bowed presets. The string preset table hash changes because rows were appended; the 22 earlier rows are unchanged.
|
|
113
|
+
- **Sampler velocity layers and round robin.** Sampler voices take `vel: [lo, hi]` (SFZ `lovel`/`hivel`) and `rr: "<group>"`: keyed voices with the same root become velocity layers, and voices in a group take turns A B A B, deterministically. `/sample set sn1 vel 0-63 rr sn`, the Velocity layer and Round robin rows on each sample voice, `set_sample` and `sample(path, { vel, rr })`. Voices without them play as before.
|
|
114
|
+
|
|
115
|
+
### Fixed
|
|
116
|
+
|
|
117
|
+
- **Lossless score diffs.** `diffScores` carries note vowels, orders song-level changes so any valid pair applies (sections and fermatas that would block a meter or tempo change are cleared first), keeps a bar-0 meter change, and treats `-0` as `0`. Notes sort by plain code-unit id order, not the locale. Notes on a missing track are rejected (an older file drops them on load), `updateNote` on an unknown id and `moveTrack` outside the track list throw, and the tick bound covers the longest valid song (notes may not end past it).
|
|
118
|
+
- **Bar and section edits carry the tempo map, fermatas and pedals.** Insert, delete, duplicate and move bars or sections now move tempo changes, fermatas and sustain, una corda and sostenuto pedals with the music. Deleting bars keeps the parts of notes that sound outside them, inserting bars inside a held note extends it, deleting a section past the song end removes only its marker, and bad bar numbers are rejected.
|
|
119
|
+
- **Roman numerals round-trip.** `romanOf` no longer drops chord quality or extensions (`C7` was `I7`, which read back as `Cmaj7`); see Chords in DAWG.md. Altered and stacked chord symbols (`C7#5`, `C9#11`, `C7alt`, `C-maj7`, `Cadd2`) now parse.
|
|
120
|
+
|
|
121
|
+
- Switching tracks could fail at random with a "no such file" error when the presence heartbeat and the focus change wrote at the same moment, leaving play mode recording onto the old track. Presence writes are now serialised with unique temp names, and a presence error never fails a focus change.
|
|
122
|
+
- Guitar strumming kept a slash bass only when it was a chord tone: `B/E` now has E as its lowest note in every tuning, like `A/E`.
|
|
123
|
+
- `dreampop` and `ebow` work as instrument words (`track ebow`, `instrument: "dreampop"`), giving the rig and its reverb wash like `shoegaze`. `glide` and `swell` stay rig-only (`rig glide`), because `glide` is already the portamento command and `swell` an effect.
|
|
124
|
+
- The `shoegaze` rig sat 4-9 dB under clean on strummed parts; its trim is raised so strummed and held parts both land within 2.5 dB of clean (a new strummed test). `ebow` and `swell` are documented as held-note rigs.
|
|
125
|
+
- `fx <effect>` alone (`fx wobble`) turns the effect on instead of printing usage. /help and DAWG.md show `fx reverb ir builtin:reverse` (the bare `reverb ir …` went to the agent).
|
|
126
|
+
- `dawg render` warns on stderr when samples hit 16-bit full scale, with the fix (lower volumes, or a master with a limiter).
|
|
127
|
+
- `resample` refuses a source that is silent over the range instead of writing a silent file and track, and trims the file's silent tail (20 ms after the last sound) rather than a fixed 4 s.
|
|
128
|
+
- Keeping formants (`shift 7 formant 0`) no longer drops the level by about 7 dB on an upward shift: each frame keeps its energy through the correction.
|
|
129
|
+
- `dawg --import` of a file that is not loop JSON (such as an exported .mid) prints one line instead of a stack trace.
|
|
130
|
+
- Changing a keys track to another instrument (`wind sax`, `bowed violins`) drops its stale `keys` block.
|
|
131
|
+
- Sound › browse sounds › Winds and brass lists Saxophones (`sax`, `altosax`, `barisax`) as their own group. DAWG.md names the Sound page for instrument rows (there is no Parameters page).
|
|
132
|
+
|
|
7
133
|
## 0.6.0
|
|
8
134
|
|
|
9
135
|
Instruments: plucked strings, mallets and bells, a modelled piano, granular clouds, fitting samples to the tempo map, and a guitar rig, all built on the 0.5 foundations. Every new field is optional, so 0.4 and 0.5 projects load, print and render byte-identically.
|