@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/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
|
-
/**
|
|
34
|
-
|
|
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,
|