@hraness/dawg 0.6.1 → 0.8.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 +118 -0
- package/DAWG.md +454 -140
- package/README.md +30 -26
- package/core/autotune.ts +1119 -0
- package/core/chords.ts +271 -23
- package/core/clips.ts +499 -0
- package/core/diff.ts +184 -104
- package/core/expression.ts +15 -0
- package/core/fx.ts +99 -29
- package/core/ids.ts +52 -0
- package/core/instruments.ts +19 -0
- package/core/keys.ts +3 -3
- package/core/loop.ts +8 -0
- package/core/lyrics.ts +297 -0
- package/core/master.ts +3 -3
- package/core/range.ts +581 -0
- package/core/resonators.ts +16 -2
- package/core/routing.ts +165 -0
- package/core/score.ts +955 -14
- package/core/sdk/eval-child.ts +7 -2
- package/core/sdk/eval.ts +35 -6
- package/core/sdk/print.ts +287 -5
- package/core/sdk/sync-lyrics.ts +49 -0
- package/core/sdk/v1.ts +2132 -46
- package/core/sections.ts +480 -35
- package/core/sing.ts +815 -0
- 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/guides/agent.md +29 -0
- package/guides/arrange.md +31 -0
- package/guides/audio.md +31 -0
- package/guides/audition.md +20 -14
- package/guides/automation.md +12 -7
- package/guides/chords.md +15 -15
- package/guides/effects.md +17 -16
- 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 +15 -7
- package/guides/music.md +23 -8
- package/guides/notes.md +15 -9
- package/guides/panes.md +32 -0
- package/guides/performance.md +15 -13
- package/guides/play.md +21 -13
- package/guides/project.md +26 -8
- package/guides/providers.md +20 -14
- package/guides/resample.md +15 -9
- package/guides/rhythm.md +18 -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 -13
- package/guides/styles.md +31 -0
- package/guides/tape.md +32 -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 +6 -2
- package/src/agent/agent.ts +130 -18
- package/src/agent/calibration-tools.ts +53 -0
- package/src/agent/clip-tools.ts +453 -0
- package/src/agent/command-agent.ts +378 -0
- package/src/agent/drum-tools.ts +2 -2
- package/src/agent/expression-tools.ts +1 -1
- package/src/agent/gateway.ts +246 -60
- package/src/agent/models.ts +53 -12
- package/src/agent/ops.ts +27 -1
- package/src/agent/pack-tools.ts +1 -1
- package/src/agent/planner.ts +25 -0
- package/src/agent/portable-schema.ts +80 -0
- package/src/agent/preview-tool.ts +4 -1
- package/src/agent/provider.ts +22 -8
- package/src/agent/range-tools.ts +216 -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 +110 -23
- package/src/agent/usage.ts +2 -2
- package/src/agent/voice-tools.ts +925 -0
- package/src/agent/xcb-agent.ts +13 -10
- package/src/argv.ts +38 -0
- package/src/audio/analysis.ts +253 -0
- package/src/audio/arrange.ts +49 -5
- package/src/audio/audio-command.ts +218 -0
- 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/devices.ts +264 -0
- package/src/audio/doctor.ts +157 -0
- package/src/audio/dsp/bandbank.ts +138 -0
- package/src/audio/dsp/envelope.ts +10 -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/effects/chain.ts +3 -1
- package/src/audio/effects/common.ts +43 -0
- package/src/audio/effects/convolution.ts +7 -4
- package/src/audio/effects/filter.ts +48 -69
- package/src/audio/effects/formant.ts +263 -0
- package/src/audio/engine.ts +360 -40
- package/src/audio/fit.ts +35 -3
- package/src/audio/instrument-check.ts +59 -43
- package/src/audio/instruments.ts +4 -0
- package/src/audio/keys/calibration.ts +56 -0
- package/src/audio/keys/electric.ts +8 -1
- package/src/audio/keys/engine.ts +13 -1
- package/src/audio/keys/piano.ts +22 -2
- package/src/audio/kits.ts +135 -6
- package/src/audio/live.ts +114 -20
- package/src/audio/native.ts +615 -0
- package/src/audio/preview.ts +30 -2
- package/src/audio/render-worker.ts +2 -0
- package/src/audio/renderer.ts +2 -0
- package/src/audio/resample.ts +2 -1
- package/src/audio/sampler.ts +85 -4
- package/src/audio/samples.ts +20 -2
- package/src/audio/sing/analysis.ts +193 -0
- package/src/audio/sing/engine.ts +949 -0
- package/src/audio/strings/bow.ts +48 -5
- package/src/audio/strings/engine.ts +8 -2
- 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 +500 -77
- package/src/audio/winds/engine.ts +5 -1
- package/src/audio/winds/trim.ts +28 -4
- package/src/audio/winds/trims1.ts +297 -0
- package/src/audio/winds/voice.ts +15 -2
- 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 +82 -32
- 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 +1 -1
- package/src/commands/formant.ts +221 -0
- package/src/commands/fx.ts +101 -32
- package/src/commands/grammar.ts +560 -0
- package/src/commands/help.ts +774 -366
- package/src/commands/history.ts +139 -10
- package/src/commands/keys.ts +25 -8
- package/src/commands/modal.ts +1 -1
- 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 +135 -0
- package/src/commands/progression.ts +170 -0
- package/src/commands/range.ts +763 -0
- package/src/commands/resample.ts +13 -10
- package/src/commands/rhythm.ts +3 -0
- package/src/commands/rig.ts +3 -24
- package/src/commands/sample.ts +11 -1
- package/src/commands/sing.ts +474 -0
- package/src/commands/strum.ts +13 -1
- 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 +617 -0
- package/src/commands/vocal.ts +147 -0
- package/src/commands/vocoder.ts +627 -0
- package/src/commands/wind.ts +2 -2
- package/src/fs/durable.ts +50 -0
- package/src/identity/actor.ts +127 -0
- package/src/lang/glossary.ts +511 -0
- package/src/launch-args.ts +267 -0
- package/src/main.ts +2508 -308
- package/src/media/cli.ts +20 -3
- package/src/media/import.ts +3 -1
- package/src/project/check.ts +21 -2
- 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 +20 -1
- package/src/session/client.ts +107 -3
- package/src/session/clipboard.ts +79 -0
- package/src/session/daemon.ts +199 -5
- package/src/session/live-host.ts +232 -0
- package/src/session/meta.ts +14 -0
- package/src/session/origin.ts +174 -0
- package/src/session/port.ts +109 -14
- package/src/session/presence.ts +34 -4
- package/src/session/protocol.ts +365 -7
- package/src/session/rebase.ts +63 -12
- package/src/session/receipt.ts +265 -0
- package/src/session/shared-live.ts +131 -0
- package/src/session/store.ts +126 -45
- package/src/tui/arrange-menu.ts +225 -23
- package/src/tui/audition.ts +1 -1
- package/src/tui/euclid.ts +113 -27
- package/src/tui/fader.ts +282 -42
- package/src/tui/granular-menu.ts +2 -4
- package/src/tui/knob-fields.ts +107 -0
- package/src/tui/knob-map.ts +198 -0
- 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 +987 -179
- package/src/tui/modal-menu.ts +6 -6
- package/src/tui/performance-menu.ts +5 -2
- package/src/tui/play-chords.ts +4 -2
- package/src/tui/play-mode.ts +15 -1
- package/src/tui/play-session.ts +243 -28
- package/src/tui/sing-menu.ts +278 -0
- package/src/tui/style-menu.ts +104 -0
- package/src/tui/tape-mode.ts +580 -0
- package/src/tui/tape-view.ts +263 -0
- package/src/tui/vocoder-menu.ts +244 -0
- package/src/tui/wind-menu.ts +3 -3
- package/src/version.ts +8 -0
- package/src/web/fetch.ts +115 -29
- package/tui/activity.ts +180 -9
- package/tui/app.ts +491 -84
- package/tui/clip-row.ts +132 -0
- package/tui/delight.ts +193 -0
- package/tui/drawer.ts +233 -27
- package/tui/frame-gate.ts +76 -0
- package/tui/grammar.ts +143 -65
- package/tui/guide.ts +50 -5
- package/tui/highway.ts +309 -30
- package/tui/hints.ts +197 -0
- package/tui/hits.ts +7 -1
- package/tui/input.ts +60 -9
- package/tui/keys.ts +1 -1
- package/tui/knobs.ts +268 -0
- package/tui/play-strip.ts +80 -14
- package/tui/prompt.ts +1 -1
- package/tui/screen.ts +151 -18
- package/tui/tape.ts +439 -0
- package/tui/text.ts +35 -2
- package/tui/theme.ts +46 -1
package/core/routing.ts
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-track references (0.7). A track field that names another track (the
|
|
3
|
+
* vocoder's `src`, autotune's `from`, 0.7.1 harmony's `guide`) registers
|
|
4
|
+
* here once, at module load, with the edges it reads and how it forgets a
|
|
5
|
+
* removed track. `removeTrack` then drops dangling references, the renderer
|
|
6
|
+
* orders stems with `routingOrder`, and stem digests include the notes a
|
|
7
|
+
* track follows through `notesDigestInputs`.
|
|
8
|
+
*
|
|
9
|
+
* Audio edges carry rendered sound (the target must render first, and a
|
|
10
|
+
* cycle is an error). Notes edges only read the other track's notes, so
|
|
11
|
+
* they never order rendering and never form a cycle.
|
|
12
|
+
*/
|
|
13
|
+
import {
|
|
14
|
+
registerTrackRefDrop,
|
|
15
|
+
ScoreValidationError,
|
|
16
|
+
type Note,
|
|
17
|
+
type Track,
|
|
18
|
+
type TrackScore,
|
|
19
|
+
} from "./score.ts";
|
|
20
|
+
import { trackSlug } from "./slug.ts";
|
|
21
|
+
|
|
22
|
+
export type TrackRefKind = "audio" | "notes";
|
|
23
|
+
|
|
24
|
+
/** One reference from a track to another track. */
|
|
25
|
+
export type TrackRef = Readonly<{ trackId: string; kind: TrackRefKind }>;
|
|
26
|
+
|
|
27
|
+
export type TrackRefSpec = Readonly<{
|
|
28
|
+
/** The tracks `track` references through this field. */
|
|
29
|
+
refs(track: Track): readonly TrackRef[];
|
|
30
|
+
/** `track` without its references to `removedId`. */
|
|
31
|
+
drop(track: Track, removedId: string): Track;
|
|
32
|
+
}>;
|
|
33
|
+
|
|
34
|
+
const specs = new Map<string, TrackRefSpec>();
|
|
35
|
+
|
|
36
|
+
/** Registers a referencing field once; registering it again replaces it. */
|
|
37
|
+
export function registerTrackRefs(field: string, spec: TrackRefSpec): void {
|
|
38
|
+
specs.set(field, spec);
|
|
39
|
+
registerTrackRefDrop(field, spec.drop);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** Every reference `track` holds, in field registration order. */
|
|
43
|
+
export function trackRefs(track: Track): readonly TrackRef[] {
|
|
44
|
+
const refs: TrackRef[] = [];
|
|
45
|
+
for (const spec of specs.values()) refs.push(...spec.refs(track));
|
|
46
|
+
return refs;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Finds a track by id, then by name slug (`Lead Vox` and `lead-vox` both
|
|
51
|
+
* match). Returns undefined when nothing matches.
|
|
52
|
+
*/
|
|
53
|
+
export function resolveTrackRef(
|
|
54
|
+
score: TrackScore,
|
|
55
|
+
idOrSlug: string,
|
|
56
|
+
): Track | undefined {
|
|
57
|
+
const byId = score.tracks.find((track) => track.id === idOrSlug);
|
|
58
|
+
if (byId) return byId;
|
|
59
|
+
const slug = trackSlug(idOrSlug);
|
|
60
|
+
return score.tracks.find((track) => trackSlug(track.name) === slug);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Track ids in render order: every audio source before the tracks that
|
|
65
|
+
* read it, otherwise score order. References to missing tracks are ignored.
|
|
66
|
+
* A cycle throws a ScoreValidationError that names it (`a -> b -> a`).
|
|
67
|
+
*/
|
|
68
|
+
export function routingOrder(score: TrackScore): readonly string[] {
|
|
69
|
+
const ids = new Set(score.tracks.map((track) => track.id));
|
|
70
|
+
const sources = new Map<string, string[]>();
|
|
71
|
+
for (const track of score.tracks)
|
|
72
|
+
sources.set(
|
|
73
|
+
track.id,
|
|
74
|
+
trackRefs(track)
|
|
75
|
+
.filter((ref) => ref.kind === "audio" && ids.has(ref.trackId))
|
|
76
|
+
.map((ref) => ref.trackId),
|
|
77
|
+
);
|
|
78
|
+
const order: string[] = [];
|
|
79
|
+
const state = new Map<string, "visiting" | "done">();
|
|
80
|
+
const stack: string[] = [];
|
|
81
|
+
const visit = (id: string): void => {
|
|
82
|
+
const seen = state.get(id);
|
|
83
|
+
if (seen === "done") return;
|
|
84
|
+
if (seen === "visiting") {
|
|
85
|
+
const cycle = [...stack.slice(stack.indexOf(id)), id];
|
|
86
|
+
throw new ScoreValidationError(
|
|
87
|
+
`track routing has a cycle: ${cycle.join(" -> ")}`,
|
|
88
|
+
"routing-cycle",
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
state.set(id, "visiting");
|
|
92
|
+
stack.push(id);
|
|
93
|
+
for (const source of sources.get(id) ?? []) visit(source);
|
|
94
|
+
stack.pop();
|
|
95
|
+
state.set(id, "done");
|
|
96
|
+
order.push(id);
|
|
97
|
+
};
|
|
98
|
+
for (const track of score.tracks) visit(track.id);
|
|
99
|
+
return order;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* The notes a track's render depends on through notes edges, by referenced
|
|
104
|
+
* track id (sorted, deduplicated), for its stem digest. Missing tracks and
|
|
105
|
+
* self references contribute nothing.
|
|
106
|
+
*/
|
|
107
|
+
export function notesDigestInputs(
|
|
108
|
+
score: TrackScore,
|
|
109
|
+
trackId: string,
|
|
110
|
+
): readonly Readonly<{ trackId: string; notes: readonly Note[] }>[] {
|
|
111
|
+
const track = score.tracks.find((candidate) => candidate.id === trackId);
|
|
112
|
+
if (!track) return [];
|
|
113
|
+
const ids = new Set(score.tracks.map((candidate) => candidate.id));
|
|
114
|
+
const followed = [
|
|
115
|
+
...new Set(
|
|
116
|
+
trackRefs(track)
|
|
117
|
+
.filter(
|
|
118
|
+
(ref) =>
|
|
119
|
+
ref.kind === "notes" &&
|
|
120
|
+
ref.trackId !== trackId &&
|
|
121
|
+
ids.has(ref.trackId),
|
|
122
|
+
)
|
|
123
|
+
.map((ref) => ref.trackId),
|
|
124
|
+
),
|
|
125
|
+
].sort();
|
|
126
|
+
return followed.map((id) => ({
|
|
127
|
+
trackId: id,
|
|
128
|
+
notes: score.notes.filter((note) => note.trackId === id),
|
|
129
|
+
}));
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* The vocoder's modulator (0.7): `vocoder.src` is an audio edge, so the
|
|
134
|
+
* modulator renders first and removing it drops the `src` (the carrier then
|
|
135
|
+
* plays dry until a new source is set).
|
|
136
|
+
*/
|
|
137
|
+
registerTrackRefs("vocoder", {
|
|
138
|
+
refs: (track) =>
|
|
139
|
+
track.vocoder?.src !== undefined
|
|
140
|
+
? [{ trackId: track.vocoder.src, kind: "audio" }]
|
|
141
|
+
: [],
|
|
142
|
+
drop: (track, removedId) => {
|
|
143
|
+
if (track.vocoder?.src !== removedId) return track;
|
|
144
|
+
const { src: _src, ...rest } = track.vocoder;
|
|
145
|
+
return { ...track, vocoder: rest };
|
|
146
|
+
},
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
// ---------------------------------------------------------------------------
|
|
150
|
+
// Registered reference fields (one block per lane).
|
|
151
|
+
|
|
152
|
+
// autotune: `Track.autotune.from` follows another track's notes.
|
|
153
|
+
registerTrackRefs("autotune.from", {
|
|
154
|
+
refs: (track) =>
|
|
155
|
+
track.autotune?.from !== undefined
|
|
156
|
+
? [{ trackId: track.autotune.from, kind: "notes" }]
|
|
157
|
+
: [],
|
|
158
|
+
drop: (track, removedId) => {
|
|
159
|
+
if (track.autotune?.from !== removedId) return track;
|
|
160
|
+
// Without its melody the track follows its own notes; `to` and the
|
|
161
|
+
// preset stay as the user set them.
|
|
162
|
+
const { from: _from, ...autotune } = track.autotune;
|
|
163
|
+
return { ...track, autotune };
|
|
164
|
+
},
|
|
165
|
+
});
|