@hraness/dawg 0.6.1 → 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.
Files changed (253) hide show
  1. package/CHANGELOG.md +92 -0
  2. package/DAWG.md +343 -116
  3. package/README.md +27 -25
  4. package/core/autotune.ts +1119 -0
  5. package/core/chords.ts +271 -23
  6. package/core/clips.ts +499 -0
  7. package/core/diff.ts +182 -104
  8. package/core/expression.ts +15 -0
  9. package/core/fx.ts +99 -29
  10. package/core/instruments.ts +19 -0
  11. package/core/keys.ts +3 -3
  12. package/core/loop.ts +5 -0
  13. package/core/lyrics.ts +297 -0
  14. package/core/master.ts +3 -3
  15. package/core/resonators.ts +16 -2
  16. package/core/routing.ts +165 -0
  17. package/core/score.ts +832 -13
  18. package/core/sdk/eval-child.ts +7 -2
  19. package/core/sdk/eval.ts +35 -6
  20. package/core/sdk/print.ts +276 -3
  21. package/core/sdk/sync-lyrics.ts +49 -0
  22. package/core/sdk/v1.ts +1849 -42
  23. package/core/sections.ts +292 -26
  24. package/core/sing.ts +815 -0
  25. package/core/style-provenance.ts +80 -0
  26. package/core/styles/africa-mena-southasia.ts +2893 -0
  27. package/core/styles/americas.ts +3810 -0
  28. package/core/styles/art.ts +4993 -0
  29. package/core/styles/base.ts +123 -0
  30. package/core/styles/cycles.ts +106 -0
  31. package/core/styles/electronic.ts +2723 -0
  32. package/core/styles/europe-asia-pacific.ts +2838 -0
  33. package/core/styles/excerpt.ts +29 -0
  34. package/core/styles/gamelan.ts +283 -0
  35. package/core/styles/generate.ts +2199 -0
  36. package/core/styles/index.ts +515 -0
  37. package/core/styles/parts.ts +106 -0
  38. package/core/styles/pop.ts +3189 -0
  39. package/core/styles/rock.ts +2993 -0
  40. package/core/styles/roots.ts +4175 -0
  41. package/core/styles/schema.ts +429 -0
  42. package/core/styles/taxonomy.ts +940 -0
  43. package/core/styles/validate.ts +528 -0
  44. package/core/tempo.ts +32 -2
  45. package/core/tuning.ts +19 -3
  46. package/core/vocoder.ts +524 -0
  47. package/guides/agent.md +29 -0
  48. package/guides/arrange.md +30 -0
  49. package/guides/audition.md +20 -14
  50. package/guides/automation.md +12 -7
  51. package/guides/chords.md +15 -15
  52. package/guides/effects.md +17 -16
  53. package/guides/faders.md +20 -16
  54. package/guides/files.md +13 -9
  55. package/guides/getting-started.md +15 -11
  56. package/guides/keys.md +19 -15
  57. package/guides/media.md +17 -12
  58. package/guides/mix.md +12 -6
  59. package/guides/music.md +23 -8
  60. package/guides/notes.md +15 -9
  61. package/guides/performance.md +15 -13
  62. package/guides/play.md +21 -13
  63. package/guides/project.md +25 -8
  64. package/guides/providers.md +20 -14
  65. package/guides/resample.md +15 -9
  66. package/guides/rhythm.md +17 -13
  67. package/guides/sessions.md +17 -7
  68. package/guides/show-me.md +31 -0
  69. package/guides/sound.md +25 -9
  70. package/guides/sounds.md +15 -13
  71. package/guides/styles.md +31 -0
  72. package/guides/tempo.md +15 -10
  73. package/guides/tracks.md +15 -10
  74. package/guides/tuning.md +32 -0
  75. package/guides/voice.md +31 -0
  76. package/guides/web-search.md +18 -8
  77. package/native/prebuilt/darwin-arm64/libdawg_sink.dylib +0 -0
  78. package/native/prebuilt/darwin-x64/libdawg_sink.dylib +0 -0
  79. package/native/prebuilt/linux-arm64/libdawg_sink.so +0 -0
  80. package/native/prebuilt/linux-x64/libdawg_sink.so +0 -0
  81. package/native/prebuilt/manifest.json +21 -0
  82. package/package.json +5 -2
  83. package/src/agent/agent.ts +126 -14
  84. package/src/agent/calibration-tools.ts +53 -0
  85. package/src/agent/clip-tools.ts +453 -0
  86. package/src/agent/command-agent.ts +369 -0
  87. package/src/agent/drum-tools.ts +2 -2
  88. package/src/agent/expression-tools.ts +1 -1
  89. package/src/agent/gateway.ts +246 -60
  90. package/src/agent/models.ts +53 -12
  91. package/src/agent/ops.ts +12 -1
  92. package/src/agent/pack-tools.ts +1 -1
  93. package/src/agent/planner.ts +13 -0
  94. package/src/agent/portable-schema.ts +80 -0
  95. package/src/agent/preview-tool.ts +4 -1
  96. package/src/agent/provider.ts +22 -8
  97. package/src/agent/rhythm-tools.ts +1 -1
  98. package/src/agent/section-tools.ts +1 -1
  99. package/src/agent/show-me.ts +497 -0
  100. package/src/agent/steer.ts +15 -0
  101. package/src/agent/style-tools.ts +217 -0
  102. package/src/agent/tool-error.ts +12 -0
  103. package/src/agent/tools.ts +108 -23
  104. package/src/agent/usage.ts +2 -2
  105. package/src/agent/voice-tools.ts +925 -0
  106. package/src/agent/xcb-agent.ts +11 -7
  107. package/src/argv.ts +38 -0
  108. package/src/audio/analysis.ts +253 -0
  109. package/src/audio/arrange.ts +37 -3
  110. package/src/audio/autotune-engine.ts +101 -0
  111. package/src/audio/autotune.ts +640 -0
  112. package/src/audio/clips.ts +240 -0
  113. package/src/audio/doctor.ts +86 -0
  114. package/src/audio/dsp/bandbank.ts +138 -0
  115. package/src/audio/dsp/envelope.ts +10 -0
  116. package/src/audio/dsp/follow.ts +120 -0
  117. package/src/audio/dsp/formant.ts +427 -0
  118. package/src/audio/dsp/glottal.ts +243 -0
  119. package/src/audio/dsp/interp.ts +7 -2
  120. package/src/audio/dsp/lpc.ts +50 -0
  121. package/src/audio/dsp/periodicity.ts +59 -0
  122. package/src/audio/dsp/pitch.ts +995 -0
  123. package/src/audio/dsp/psola.ts +199 -0
  124. package/src/audio/effects/chain.ts +3 -1
  125. package/src/audio/effects/common.ts +43 -0
  126. package/src/audio/effects/convolution.ts +7 -4
  127. package/src/audio/effects/filter.ts +48 -69
  128. package/src/audio/effects/formant.ts +263 -0
  129. package/src/audio/engine.ts +160 -28
  130. package/src/audio/fit.ts +35 -3
  131. package/src/audio/instrument-check.ts +59 -43
  132. package/src/audio/instruments.ts +4 -0
  133. package/src/audio/keys/calibration.ts +56 -0
  134. package/src/audio/keys/electric.ts +8 -1
  135. package/src/audio/keys/engine.ts +13 -1
  136. package/src/audio/keys/piano.ts +22 -2
  137. package/src/audio/kits.ts +135 -6
  138. package/src/audio/live.ts +114 -20
  139. package/src/audio/native.ts +615 -0
  140. package/src/audio/preview.ts +30 -2
  141. package/src/audio/render-worker.ts +2 -0
  142. package/src/audio/renderer.ts +2 -0
  143. package/src/audio/resample.ts +2 -1
  144. package/src/audio/sampler.ts +85 -4
  145. package/src/audio/samples.ts +20 -2
  146. package/src/audio/sing/analysis.ts +193 -0
  147. package/src/audio/sing/engine.ts +949 -0
  148. package/src/audio/strings/bow.ts +48 -5
  149. package/src/audio/strings/engine.ts +8 -2
  150. package/src/audio/synth/oscillators.ts +31 -21
  151. package/src/audio/synth/voice.ts +34 -1
  152. package/src/audio/vocoder/bank.ts +314 -0
  153. package/src/audio/vocoder/carrier.ts +165 -0
  154. package/src/audio/vocoder/control.ts +68 -0
  155. package/src/audio/vocoder/detect.ts +50 -0
  156. package/src/audio/vocoder/index.ts +304 -0
  157. package/src/audio/vocoder/talkbox.ts +143 -0
  158. package/src/audio/wav.ts +500 -77
  159. package/src/audio/winds/engine.ts +5 -1
  160. package/src/audio/winds/trim.ts +28 -4
  161. package/src/audio/winds/trims1.ts +297 -0
  162. package/src/audio/winds/voice.ts +15 -2
  163. package/src/auth/cli.ts +38 -36
  164. package/src/auth/credentials.ts +30 -1
  165. package/src/auth/login.ts +15 -9
  166. package/src/auth/tui.ts +19 -10
  167. package/src/commands/arrange.ts +44 -29
  168. package/src/commands/autotune.ts +421 -0
  169. package/src/commands/calibration.ts +74 -0
  170. package/src/commands/clips.ts +887 -0
  171. package/src/commands/drums.ts +3 -2
  172. package/src/commands/edit.ts +11 -4
  173. package/src/commands/expression.ts +1 -1
  174. package/src/commands/formant.ts +221 -0
  175. package/src/commands/fx.ts +101 -32
  176. package/src/commands/grammar.ts +558 -0
  177. package/src/commands/help.ts +610 -380
  178. package/src/commands/history.ts +18 -0
  179. package/src/commands/keys.ts +8 -8
  180. package/src/commands/modal.ts +1 -1
  181. package/src/commands/music.ts +1 -1
  182. package/src/commands/nearest.ts +53 -0
  183. package/src/commands/pack.ts +9 -2
  184. package/src/commands/param-range.ts +56 -0
  185. package/src/commands/parses.ts +130 -0
  186. package/src/commands/progression.ts +170 -0
  187. package/src/commands/rhythm.ts +3 -0
  188. package/src/commands/rig.ts +3 -24
  189. package/src/commands/sing.ts +478 -0
  190. package/src/commands/strum.ts +13 -1
  191. package/src/commands/style.ts +415 -0
  192. package/src/commands/time.ts +6 -3
  193. package/src/commands/tuning.ts +3 -3
  194. package/src/commands/vocal-pitch.ts +616 -0
  195. package/src/commands/vocal.ts +147 -0
  196. package/src/commands/vocoder.ts +627 -0
  197. package/src/commands/wind.ts +2 -2
  198. package/src/fs/durable.ts +50 -0
  199. package/src/lang/glossary.ts +493 -0
  200. package/src/launch-args.ts +163 -0
  201. package/src/main.ts +1397 -253
  202. package/src/media/cli.ts +20 -3
  203. package/src/media/import.ts +3 -1
  204. package/src/project/check.ts +21 -2
  205. package/src/project/clip-pins.ts +72 -0
  206. package/src/project/init.ts +23 -8
  207. package/src/project/sync.ts +418 -86
  208. package/src/render.ts +20 -1
  209. package/src/session/daemon.ts +3 -0
  210. package/src/session/meta.ts +14 -0
  211. package/src/session/origin.ts +154 -0
  212. package/src/session/port.ts +22 -4
  213. package/src/session/presence.ts +34 -4
  214. package/src/session/protocol.ts +5 -1
  215. package/src/session/rebase.ts +18 -5
  216. package/src/session/receipt.ts +258 -0
  217. package/src/session/store.ts +65 -43
  218. package/src/tui/arrange-menu.ts +65 -31
  219. package/src/tui/audition.ts +1 -1
  220. package/src/tui/euclid.ts +18 -13
  221. package/src/tui/fader.ts +228 -41
  222. package/src/tui/granular-menu.ts +2 -4
  223. package/src/tui/menu-clips.ts +297 -0
  224. package/src/tui/menu-time.ts +20 -13
  225. package/src/tui/menu-voice.ts +405 -0
  226. package/src/tui/menu.ts +759 -177
  227. package/src/tui/modal-menu.ts +6 -6
  228. package/src/tui/performance-menu.ts +5 -2
  229. package/src/tui/play-chords.ts +4 -2
  230. package/src/tui/play-mode.ts +15 -1
  231. package/src/tui/play-session.ts +47 -7
  232. package/src/tui/sing-menu.ts +278 -0
  233. package/src/tui/style-menu.ts +104 -0
  234. package/src/tui/vocoder-menu.ts +244 -0
  235. package/src/tui/wind-menu.ts +3 -3
  236. package/src/version.ts +8 -0
  237. package/src/web/fetch.ts +115 -29
  238. package/tui/activity.ts +180 -9
  239. package/tui/app.ts +274 -40
  240. package/tui/clip-row.ts +132 -0
  241. package/tui/delight.ts +144 -0
  242. package/tui/drawer.ts +70 -22
  243. package/tui/frame-gate.ts +76 -0
  244. package/tui/grammar.ts +112 -63
  245. package/tui/guide.ts +42 -4
  246. package/tui/highway.ts +269 -25
  247. package/tui/hints.ts +192 -0
  248. package/tui/input.ts +60 -9
  249. package/tui/keys.ts +1 -1
  250. package/tui/play-strip.ts +68 -14
  251. package/tui/prompt.ts +1 -1
  252. package/tui/screen.ts +144 -14
  253. package/tui/theme.ts +27 -0
@@ -0,0 +1,147 @@
1
+ /**
2
+ * `/vocal` (0.7): the umbrella over every voice verb. Each lane appends its
3
+ * verbs to its own commented block in `VOCAL_VERBS`; bare `/vocal` lists
4
+ * them and `/help` prints a Voice section from the same table, so a verb is
5
+ * documented and typo-matched the moment it is registered.
6
+ */
7
+ import { applyAutotuneCommand, parseAutotuneArgs } from "./autotune.ts";
8
+ import type { TrackScore } from "../../core/score.ts";
9
+ import { applyFormantCommand, formantArgs, FORMANT_USAGE } from "./formant.ts";
10
+ import { CLIP_VOCAL_VERBS } from "./clips.ts";
11
+ import { PITCH_VERBS } from "./vocal-pitch.ts";
12
+ import { applyVocoderCommand, parseVocoderCommand } from "./vocoder.ts";
13
+
14
+ /** What a verb sees: the score, the focused track and the project folder. */
15
+ export type VocalContext = Readonly<{
16
+ score: TrackScore;
17
+ trackId: string;
18
+ cwd: string;
19
+ }>;
20
+
21
+ /** A verb's outcome. `next` and `kind` commit a score change. */
22
+ export type VocalResult = Readonly<{
23
+ ok: boolean;
24
+ message: string;
25
+ next?: TrackScore;
26
+ /** History kind for the commit, e.g. `clip.place`. */
27
+ kind?: string;
28
+ payload?: Readonly<Record<string, unknown>>;
29
+ /** The track the verb changed or created, focused when it differs. */
30
+ trackId?: string;
31
+ }>;
32
+
33
+ export type VocalVerb = Readonly<{
34
+ /** The word after `/vocal`, e.g. `import`. */
35
+ verb: string;
36
+ /** Full usage after `/vocal`, e.g. `import <file> [at <beat>]`. */
37
+ usage: string;
38
+ /** What it does, short enough for one help row. */
39
+ summary: string;
40
+ /** The 0.7 lane that owns it. */
41
+ lane: string;
42
+ run: (args: string, context: VocalContext) => Promise<VocalResult>;
43
+ }>;
44
+
45
+ /** Every `/vocal` verb, one block per lane in signal order. */
46
+ export const VOCAL_VERBS: readonly VocalVerb[] = [
47
+ // clips: import, stem, setups
48
+ ...CLIP_VOCAL_VERBS,
49
+ // pitch: pitch, notes
50
+ ...PITCH_VERBS,
51
+ // autotune: autotune
52
+ {
53
+ verb: "autotune",
54
+ usage: "autotune [preset] [field value …]",
55
+ summary: "pitch correction, gentle to hard (same as /autotune)",
56
+ lane: "autotune",
57
+ run: async (args, { score, trackId }) =>
58
+ applyAutotuneCommand(
59
+ score,
60
+ trackId,
61
+ parseAutotuneArgs(args.split(/\s+/)),
62
+ ),
63
+ },
64
+ // formant: formant
65
+ {
66
+ verb: "formant",
67
+ usage: FORMANT_USAGE,
68
+ summary: "shift formants at constant pitch · same as /formant",
69
+ lane: "formant",
70
+ run: async (args, context) =>
71
+ applyFormantCommand(context.score, context.trackId, formantArgs(args)),
72
+ },
73
+ // vocoder: vocoder
74
+ {
75
+ verb: "vocoder",
76
+ usage: "vocoder [preset|src <track>|<param> <value>]",
77
+ summary: "vocode a voice onto a synth carrier (same as /vocoder)",
78
+ lane: "vocoder",
79
+ run: async (args, context) => {
80
+ const command = parseVocoderCommand(`vocoder ${args}`.trim())!;
81
+ return applyVocoderCommand(context.score, context.trackId, command);
82
+ },
83
+ },
84
+ // 0.7.1: record, take, comp (record), say (say), harmony (harmony),
85
+ // chop (chops)
86
+ ];
87
+
88
+ export type VocalCommand =
89
+ | Readonly<{ kind: "list" }>
90
+ | Readonly<{ kind: "verb"; verb: VocalVerb; args: string }>
91
+ | Readonly<{ kind: "unknown"; word: string }>;
92
+
93
+ /** Parse `/vocal [<verb> [args]]` (the slash is optional). */
94
+ export function parseVocalCommand(
95
+ command: string,
96
+ verbs: readonly VocalVerb[] = VOCAL_VERBS,
97
+ ): VocalCommand | undefined {
98
+ const match = command.trim().match(/^\/?vocal(?:\s+(\S+)(?:\s+(.*))?)?$/i);
99
+ if (!match) return undefined;
100
+ const word = match[1]?.toLowerCase();
101
+ if (word === undefined || word === "help" || word === "list")
102
+ return { kind: "list" };
103
+ const verb = verbs.find((candidate) => candidate.verb === word);
104
+ if (!verb) return { kind: "unknown", word };
105
+ return { kind: "verb", verb, args: (match[2] ?? "").trim() };
106
+ }
107
+
108
+ /** The lines bare `/vocal` prints. */
109
+ export function vocalListLines(
110
+ verbs: readonly VocalVerb[] = VOCAL_VERBS,
111
+ ): string[] {
112
+ if (verbs.length === 0) return ["vocal: no voice tools yet in this build"];
113
+ const width = Math.max(...verbs.map((verb) => verb.usage.length));
114
+ return [
115
+ "vocal <verb>:",
116
+ ...verbs.map(
117
+ (verb) => ` /vocal ${verb.usage.padEnd(width)} ${verb.summary}`,
118
+ ),
119
+ ];
120
+ }
121
+
122
+ /** Run a parsed `/vocal` command. Never throws: failures come back as text. */
123
+ export async function runVocalCommand(
124
+ command: VocalCommand,
125
+ context: VocalContext,
126
+ verbs: readonly VocalVerb[] = VOCAL_VERBS,
127
+ ): Promise<VocalResult> {
128
+ if (command.kind === "list")
129
+ return { ok: true, message: vocalListLines(verbs).join("\n") };
130
+ if (command.kind === "unknown") {
131
+ const known = verbs.map((verb) => verb.verb);
132
+ return {
133
+ ok: false,
134
+ message: known.length
135
+ ? `vocal: unknown verb ${command.word} · try ${known.join(", ")}`
136
+ : `vocal: unknown verb ${command.word} · no voice tools yet in this build`,
137
+ };
138
+ }
139
+ try {
140
+ return await command.verb.run(command.args, context);
141
+ } catch (error) {
142
+ return {
143
+ ok: false,
144
+ message: `vocal ${command.verb.verb}: ${error instanceof Error ? error.message : String(error)}`,
145
+ };
146
+ }
147
+ }