@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.
Files changed (277) hide show
  1. package/CHANGELOG.md +118 -0
  2. package/DAWG.md +454 -140
  3. package/README.md +30 -26
  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 +184 -104
  8. package/core/expression.ts +15 -0
  9. package/core/fx.ts +99 -29
  10. package/core/ids.ts +52 -0
  11. package/core/instruments.ts +19 -0
  12. package/core/keys.ts +3 -3
  13. package/core/loop.ts +8 -0
  14. package/core/lyrics.ts +297 -0
  15. package/core/master.ts +3 -3
  16. package/core/range.ts +581 -0
  17. package/core/resonators.ts +16 -2
  18. package/core/routing.ts +165 -0
  19. package/core/score.ts +955 -14
  20. package/core/sdk/eval-child.ts +7 -2
  21. package/core/sdk/eval.ts +35 -6
  22. package/core/sdk/print.ts +287 -5
  23. package/core/sdk/sync-lyrics.ts +49 -0
  24. package/core/sdk/v1.ts +2132 -46
  25. package/core/sections.ts +480 -35
  26. package/core/sing.ts +815 -0
  27. package/core/style-provenance.ts +80 -0
  28. package/core/styles/africa-mena-southasia.ts +2893 -0
  29. package/core/styles/americas.ts +3810 -0
  30. package/core/styles/art.ts +4993 -0
  31. package/core/styles/base.ts +123 -0
  32. package/core/styles/cycles.ts +106 -0
  33. package/core/styles/electronic.ts +2723 -0
  34. package/core/styles/europe-asia-pacific.ts +2838 -0
  35. package/core/styles/excerpt.ts +29 -0
  36. package/core/styles/gamelan.ts +283 -0
  37. package/core/styles/generate.ts +2199 -0
  38. package/core/styles/index.ts +515 -0
  39. package/core/styles/parts.ts +106 -0
  40. package/core/styles/pop.ts +3189 -0
  41. package/core/styles/rock.ts +2993 -0
  42. package/core/styles/roots.ts +4175 -0
  43. package/core/styles/schema.ts +429 -0
  44. package/core/styles/taxonomy.ts +940 -0
  45. package/core/styles/validate.ts +528 -0
  46. package/core/tempo.ts +32 -2
  47. package/core/tuning.ts +19 -3
  48. package/core/vocoder.ts +524 -0
  49. package/guides/agent.md +29 -0
  50. package/guides/arrange.md +31 -0
  51. package/guides/audio.md +31 -0
  52. package/guides/audition.md +20 -14
  53. package/guides/automation.md +12 -7
  54. package/guides/chords.md +15 -15
  55. package/guides/effects.md +17 -16
  56. package/guides/faders.md +20 -16
  57. package/guides/files.md +13 -9
  58. package/guides/getting-started.md +15 -11
  59. package/guides/keys.md +19 -15
  60. package/guides/media.md +17 -12
  61. package/guides/mix.md +15 -7
  62. package/guides/music.md +23 -8
  63. package/guides/notes.md +15 -9
  64. package/guides/panes.md +32 -0
  65. package/guides/performance.md +15 -13
  66. package/guides/play.md +21 -13
  67. package/guides/project.md +26 -8
  68. package/guides/providers.md +20 -14
  69. package/guides/resample.md +15 -9
  70. package/guides/rhythm.md +18 -13
  71. package/guides/sessions.md +17 -7
  72. package/guides/show-me.md +31 -0
  73. package/guides/sound.md +25 -9
  74. package/guides/sounds.md +15 -13
  75. package/guides/styles.md +31 -0
  76. package/guides/tape.md +32 -0
  77. package/guides/tempo.md +15 -10
  78. package/guides/tracks.md +15 -10
  79. package/guides/tuning.md +32 -0
  80. package/guides/voice.md +31 -0
  81. package/guides/web-search.md +18 -8
  82. package/native/prebuilt/darwin-arm64/libdawg_sink.dylib +0 -0
  83. package/native/prebuilt/darwin-x64/libdawg_sink.dylib +0 -0
  84. package/native/prebuilt/linux-arm64/libdawg_sink.so +0 -0
  85. package/native/prebuilt/linux-x64/libdawg_sink.so +0 -0
  86. package/native/prebuilt/manifest.json +21 -0
  87. package/package.json +6 -2
  88. package/src/agent/agent.ts +130 -18
  89. package/src/agent/calibration-tools.ts +53 -0
  90. package/src/agent/clip-tools.ts +453 -0
  91. package/src/agent/command-agent.ts +378 -0
  92. package/src/agent/drum-tools.ts +2 -2
  93. package/src/agent/expression-tools.ts +1 -1
  94. package/src/agent/gateway.ts +246 -60
  95. package/src/agent/models.ts +53 -12
  96. package/src/agent/ops.ts +27 -1
  97. package/src/agent/pack-tools.ts +1 -1
  98. package/src/agent/planner.ts +25 -0
  99. package/src/agent/portable-schema.ts +80 -0
  100. package/src/agent/preview-tool.ts +4 -1
  101. package/src/agent/provider.ts +22 -8
  102. package/src/agent/range-tools.ts +216 -0
  103. package/src/agent/rhythm-tools.ts +1 -1
  104. package/src/agent/section-tools.ts +1 -1
  105. package/src/agent/show-me.ts +497 -0
  106. package/src/agent/steer.ts +15 -0
  107. package/src/agent/style-tools.ts +217 -0
  108. package/src/agent/tool-error.ts +12 -0
  109. package/src/agent/tools.ts +110 -23
  110. package/src/agent/usage.ts +2 -2
  111. package/src/agent/voice-tools.ts +925 -0
  112. package/src/agent/xcb-agent.ts +13 -10
  113. package/src/argv.ts +38 -0
  114. package/src/audio/analysis.ts +253 -0
  115. package/src/audio/arrange.ts +49 -5
  116. package/src/audio/audio-command.ts +218 -0
  117. package/src/audio/autotune-engine.ts +101 -0
  118. package/src/audio/autotune.ts +640 -0
  119. package/src/audio/clips.ts +240 -0
  120. package/src/audio/devices.ts +264 -0
  121. package/src/audio/doctor.ts +157 -0
  122. package/src/audio/dsp/bandbank.ts +138 -0
  123. package/src/audio/dsp/envelope.ts +10 -0
  124. package/src/audio/dsp/follow.ts +120 -0
  125. package/src/audio/dsp/formant.ts +427 -0
  126. package/src/audio/dsp/glottal.ts +243 -0
  127. package/src/audio/dsp/interp.ts +7 -2
  128. package/src/audio/dsp/lpc.ts +50 -0
  129. package/src/audio/dsp/periodicity.ts +59 -0
  130. package/src/audio/dsp/pitch.ts +995 -0
  131. package/src/audio/dsp/psola.ts +199 -0
  132. package/src/audio/effects/chain.ts +3 -1
  133. package/src/audio/effects/common.ts +43 -0
  134. package/src/audio/effects/convolution.ts +7 -4
  135. package/src/audio/effects/filter.ts +48 -69
  136. package/src/audio/effects/formant.ts +263 -0
  137. package/src/audio/engine.ts +360 -40
  138. package/src/audio/fit.ts +35 -3
  139. package/src/audio/instrument-check.ts +59 -43
  140. package/src/audio/instruments.ts +4 -0
  141. package/src/audio/keys/calibration.ts +56 -0
  142. package/src/audio/keys/electric.ts +8 -1
  143. package/src/audio/keys/engine.ts +13 -1
  144. package/src/audio/keys/piano.ts +22 -2
  145. package/src/audio/kits.ts +135 -6
  146. package/src/audio/live.ts +114 -20
  147. package/src/audio/native.ts +615 -0
  148. package/src/audio/preview.ts +30 -2
  149. package/src/audio/render-worker.ts +2 -0
  150. package/src/audio/renderer.ts +2 -0
  151. package/src/audio/resample.ts +2 -1
  152. package/src/audio/sampler.ts +85 -4
  153. package/src/audio/samples.ts +20 -2
  154. package/src/audio/sing/analysis.ts +193 -0
  155. package/src/audio/sing/engine.ts +949 -0
  156. package/src/audio/strings/bow.ts +48 -5
  157. package/src/audio/strings/engine.ts +8 -2
  158. package/src/audio/synth/oscillators.ts +31 -21
  159. package/src/audio/synth/voice.ts +34 -1
  160. package/src/audio/vocoder/bank.ts +314 -0
  161. package/src/audio/vocoder/carrier.ts +165 -0
  162. package/src/audio/vocoder/control.ts +68 -0
  163. package/src/audio/vocoder/detect.ts +50 -0
  164. package/src/audio/vocoder/index.ts +304 -0
  165. package/src/audio/vocoder/talkbox.ts +143 -0
  166. package/src/audio/wav.ts +500 -77
  167. package/src/audio/winds/engine.ts +5 -1
  168. package/src/audio/winds/trim.ts +28 -4
  169. package/src/audio/winds/trims1.ts +297 -0
  170. package/src/audio/winds/voice.ts +15 -2
  171. package/src/auth/cli.ts +38 -36
  172. package/src/auth/credentials.ts +30 -1
  173. package/src/auth/login.ts +15 -9
  174. package/src/auth/tui.ts +19 -10
  175. package/src/commands/arrange.ts +82 -32
  176. package/src/commands/autotune.ts +421 -0
  177. package/src/commands/calibration.ts +74 -0
  178. package/src/commands/clips.ts +887 -0
  179. package/src/commands/drums.ts +3 -2
  180. package/src/commands/edit.ts +11 -4
  181. package/src/commands/expression.ts +1 -1
  182. package/src/commands/formant.ts +221 -0
  183. package/src/commands/fx.ts +101 -32
  184. package/src/commands/grammar.ts +560 -0
  185. package/src/commands/help.ts +774 -366
  186. package/src/commands/history.ts +139 -10
  187. package/src/commands/keys.ts +25 -8
  188. package/src/commands/modal.ts +1 -1
  189. package/src/commands/music.ts +1 -1
  190. package/src/commands/nearest.ts +53 -0
  191. package/src/commands/pack.ts +9 -2
  192. package/src/commands/param-range.ts +56 -0
  193. package/src/commands/parses.ts +135 -0
  194. package/src/commands/progression.ts +170 -0
  195. package/src/commands/range.ts +763 -0
  196. package/src/commands/resample.ts +13 -10
  197. package/src/commands/rhythm.ts +3 -0
  198. package/src/commands/rig.ts +3 -24
  199. package/src/commands/sample.ts +11 -1
  200. package/src/commands/sing.ts +474 -0
  201. package/src/commands/strum.ts +13 -1
  202. package/src/commands/style.ts +415 -0
  203. package/src/commands/time.ts +6 -3
  204. package/src/commands/tuning.ts +3 -3
  205. package/src/commands/vocal-pitch.ts +617 -0
  206. package/src/commands/vocal.ts +147 -0
  207. package/src/commands/vocoder.ts +627 -0
  208. package/src/commands/wind.ts +2 -2
  209. package/src/fs/durable.ts +50 -0
  210. package/src/identity/actor.ts +127 -0
  211. package/src/lang/glossary.ts +511 -0
  212. package/src/launch-args.ts +267 -0
  213. package/src/main.ts +2508 -308
  214. package/src/media/cli.ts +20 -3
  215. package/src/media/import.ts +3 -1
  216. package/src/project/check.ts +21 -2
  217. package/src/project/clip-pins.ts +72 -0
  218. package/src/project/init.ts +23 -8
  219. package/src/project/sync.ts +418 -86
  220. package/src/render.ts +20 -1
  221. package/src/session/client.ts +107 -3
  222. package/src/session/clipboard.ts +79 -0
  223. package/src/session/daemon.ts +199 -5
  224. package/src/session/live-host.ts +232 -0
  225. package/src/session/meta.ts +14 -0
  226. package/src/session/origin.ts +174 -0
  227. package/src/session/port.ts +109 -14
  228. package/src/session/presence.ts +34 -4
  229. package/src/session/protocol.ts +365 -7
  230. package/src/session/rebase.ts +63 -12
  231. package/src/session/receipt.ts +265 -0
  232. package/src/session/shared-live.ts +131 -0
  233. package/src/session/store.ts +126 -45
  234. package/src/tui/arrange-menu.ts +225 -23
  235. package/src/tui/audition.ts +1 -1
  236. package/src/tui/euclid.ts +113 -27
  237. package/src/tui/fader.ts +282 -42
  238. package/src/tui/granular-menu.ts +2 -4
  239. package/src/tui/knob-fields.ts +107 -0
  240. package/src/tui/knob-map.ts +198 -0
  241. package/src/tui/menu-clips.ts +297 -0
  242. package/src/tui/menu-time.ts +20 -13
  243. package/src/tui/menu-voice.ts +405 -0
  244. package/src/tui/menu.ts +987 -179
  245. package/src/tui/modal-menu.ts +6 -6
  246. package/src/tui/performance-menu.ts +5 -2
  247. package/src/tui/play-chords.ts +4 -2
  248. package/src/tui/play-mode.ts +15 -1
  249. package/src/tui/play-session.ts +243 -28
  250. package/src/tui/sing-menu.ts +278 -0
  251. package/src/tui/style-menu.ts +104 -0
  252. package/src/tui/tape-mode.ts +580 -0
  253. package/src/tui/tape-view.ts +263 -0
  254. package/src/tui/vocoder-menu.ts +244 -0
  255. package/src/tui/wind-menu.ts +3 -3
  256. package/src/version.ts +8 -0
  257. package/src/web/fetch.ts +115 -29
  258. package/tui/activity.ts +180 -9
  259. package/tui/app.ts +491 -84
  260. package/tui/clip-row.ts +132 -0
  261. package/tui/delight.ts +193 -0
  262. package/tui/drawer.ts +233 -27
  263. package/tui/frame-gate.ts +76 -0
  264. package/tui/grammar.ts +143 -65
  265. package/tui/guide.ts +50 -5
  266. package/tui/highway.ts +309 -30
  267. package/tui/hints.ts +197 -0
  268. package/tui/hits.ts +7 -1
  269. package/tui/input.ts +60 -9
  270. package/tui/keys.ts +1 -1
  271. package/tui/knobs.ts +268 -0
  272. package/tui/play-strip.ts +80 -14
  273. package/tui/prompt.ts +1 -1
  274. package/tui/screen.ts +151 -18
  275. package/tui/tape.ts +439 -0
  276. package/tui/text.ts +35 -2
  277. package/tui/theme.ts +46 -1
package/tui/text.ts CHANGED
@@ -30,9 +30,37 @@ export function graphemeWidth(cluster: string): number {
30
30
  return Math.max(0, Math.min(2, width));
31
31
  }
32
32
 
33
- /** Segment text into grapheme clusters with code-point offsets and widths. */
34
- export function graphemes(text: string): Grapheme[] {
33
+ /** Printable ASCII only: one cell per character, no segmentation needed. */
34
+ const PRINTABLE_ASCII = /^[\x20-\x7e]*$/;
35
+
36
+ /**
37
+ * Recent segmentations. A frame paints the same strings every tick (help
38
+ * rows, labels, hints), and segmenting them is most of a large frame's
39
+ * cost; the cache holds a frame's worth and is dropped whole when full.
40
+ */
41
+ const segmented = new Map<string, readonly Grapheme[]>();
42
+ const SEGMENTED_MAX = 4096;
43
+
44
+ /**
45
+ * Segment text into grapheme clusters with code-point offsets and widths.
46
+ * The result is shared between calls: read it, never mutate it.
47
+ */
48
+ export function graphemes(text: string): readonly Grapheme[] {
49
+ const cached = segmented.get(text);
50
+ if (cached) return cached;
51
+ const result = segment(text);
52
+ if (segmented.size >= SEGMENTED_MAX) segmented.clear();
53
+ segmented.set(text, result);
54
+ return result;
55
+ }
56
+
57
+ function segment(text: string): Grapheme[] {
35
58
  const result: Grapheme[] = [];
59
+ if (PRINTABLE_ASCII.test(text)) {
60
+ for (let index = 0; index < text.length; index += 1)
61
+ result.push({ text: text[index]!, start: index, length: 1, width: 1 });
62
+ return result;
63
+ }
36
64
  let start = 0;
37
65
  const clusters = segmenter
38
66
  ? Array.from(segmenter.segment(text), (part) => part.segment)
@@ -51,6 +79,7 @@ export function graphemes(text: string): Grapheme[] {
51
79
  }
52
80
 
53
81
  export function displayWidth(text: string): number {
82
+ if (PRINTABLE_ASCII.test(text)) return text.length;
54
83
  let width = 0;
55
84
  for (const cluster of graphemes(text)) width += cluster.width;
56
85
  return width;
@@ -61,6 +90,10 @@ export function truncate(text: string, width: number, ellipsis = "…"): string
61
90
  if (width <= 0) return "";
62
91
  if (displayWidth(text) <= width) return text;
63
92
  const room = Math.max(0, width - displayWidth(ellipsis));
93
+ if (PRINTABLE_ASCII.test(text))
94
+ return room === 0
95
+ ? ellipsis.slice(0, width)
96
+ : `${text.slice(0, room)}${ellipsis}`;
64
97
  let used = 0;
65
98
  let out = "";
66
99
  for (const cluster of graphemes(text)) {
package/tui/theme.ts CHANGED
@@ -56,7 +56,12 @@ export type SemanticRole =
56
56
  | "promptBg"
57
57
  | "promptText"
58
58
  | "pillSteer"
59
- | "pillQueue";
59
+ | "pillQueue"
60
+ /** The four knobs (design §7.1): reserved, never reused for other things. */
61
+ | "knob1"
62
+ | "knob2"
63
+ | "knob3"
64
+ | "knob4";
60
65
 
61
66
  export interface Rgb {
62
67
  readonly r: number;
@@ -115,6 +120,10 @@ const defaultTheme: Theme = {
115
120
  promptText: { fg: rgb(232, 237, 246) },
116
121
  pillSteer: { fg: rgb(17, 20, 26), bg: rgb(91, 211, 145), bold: true },
117
122
  pillQueue: { fg: rgb(17, 20, 26), bg: rgb(255, 193, 87), bold: true },
123
+ knob1: { fg: rgb(80, 160, 255), bold: true },
124
+ knob2: { fg: rgb(90, 210, 140), bold: true },
125
+ knob3: { fg: rgb(225, 228, 236), bold: true },
126
+ knob4: { fg: rgb(255, 140, 60), bold: true },
118
127
  },
119
128
  accents: [
120
129
  rgb(95, 181, 255),
@@ -160,6 +169,10 @@ const highContrastTheme: Theme = {
160
169
  promptText: { fg: rgb(255, 255, 255), bold: true },
161
170
  pillSteer: { fg: rgb(0, 0, 0), bg: rgb(0, 255, 0), bold: true },
162
171
  pillQueue: { fg: rgb(0, 0, 0), bg: rgb(255, 255, 0), bold: true },
172
+ knob1: { fg: rgb(60, 150, 255), bold: true },
173
+ knob2: { fg: rgb(60, 255, 140), bold: true },
174
+ knob3: { fg: rgb(236, 240, 255), bold: true },
175
+ knob4: { fg: rgb(255, 130, 30), bold: true },
163
176
  },
164
177
  accents: [
165
178
  rgb(0, 200, 255),
@@ -206,6 +219,11 @@ const monoTheme: Theme = {
206
219
  promptText: {},
207
220
  pillSteer: { reverse: true, bold: true },
208
221
  pillQueue: { reverse: true, bold: true, underline: true },
222
+ // No hue: the knob glyphs (● ▲ ■ ◆) carry which knob is which.
223
+ knob1: { bold: true },
224
+ knob2: { bold: true },
225
+ knob3: { bold: true },
226
+ knob4: { bold: true },
209
227
  },
210
228
  accents: [],
211
229
  };
@@ -425,6 +443,33 @@ export function styleSgr(
425
443
  return sequence;
426
444
  }
427
445
 
446
+ /**
447
+ * The shortest SGR that moves the terminal from `from` to `to` when they
448
+ * differ only in foreground colour: `38;…` or `39`, never a full reset.
449
+ * Undefined when anything else differs (the caller emits `styleSgr`).
450
+ */
451
+ export function foregroundSgr(
452
+ from: Style,
453
+ to: Style,
454
+ capabilities: TerminalCapabilities,
455
+ ): string | undefined {
456
+ if (capabilities.attributes === false) return "";
457
+ if (
458
+ !!from.bold !== !!to.bold ||
459
+ !!from.dim !== !!to.dim ||
460
+ !!from.italic !== !!to.italic ||
461
+ !!from.underline !== !!to.underline ||
462
+ !!from.reverse !== !!to.reverse
463
+ )
464
+ return undefined;
465
+ const fromBg = from.bg && colorCode(from.bg, capabilities.colorDepth, true);
466
+ const toBg = to.bg && colorCode(to.bg, capabilities.colorDepth, true);
467
+ if (fromBg !== toBg) return undefined;
468
+ if (!to.fg) return "\u001b[39m";
469
+ const code = colorCode(to.fg, capabilities.colorDepth, false);
470
+ return code ? `\u001b[${code}m` : "\u001b[39m";
471
+ }
472
+
428
473
  /** Resolve the effective theme: no-color terminals always use attributes only. */
429
474
  export function effectiveTheme(
430
475
  name: ThemeName,