@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
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A short rendered excerpt of a generated style (quality-08): the first
|
|
3
|
+
* bar at a low sample rate, with notes clipped to the bar and the song
|
|
4
|
+
* master kept. The card test and `/style info --audition` paths use it to
|
|
5
|
+
* check that a style sounds without rendering the whole song.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { createScore, type TrackScore } from "../score.ts";
|
|
9
|
+
import type { GeneratedStyle } from "./generate.ts";
|
|
10
|
+
|
|
11
|
+
export function excerptScore(generated: GeneratedStyle, bars = 1): TrackScore {
|
|
12
|
+
const { data, plan } = generated;
|
|
13
|
+
const count = Math.max(1, Math.min(plan.bars, Math.trunc(bars)));
|
|
14
|
+
const endTick = plan.barTicks * count;
|
|
15
|
+
return createScore({
|
|
16
|
+
...data,
|
|
17
|
+
bars: count,
|
|
18
|
+
sections: undefined,
|
|
19
|
+
notes: (data.notes ?? [])
|
|
20
|
+
.filter((note) => (note.startTick ?? 0) < endTick)
|
|
21
|
+
.map((note) => ({
|
|
22
|
+
...note,
|
|
23
|
+
durationTicks: Math.min(
|
|
24
|
+
note.durationTicks ?? 1,
|
|
25
|
+
endTick - (note.startTick ?? 0),
|
|
26
|
+
),
|
|
27
|
+
})),
|
|
28
|
+
});
|
|
29
|
+
}
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gamelan theory data (quality-08, europe-asia-pacific lane): colotomic
|
|
3
|
+
* gong cycles (gongan) and pathet degree sets, written as abstract
|
|
4
|
+
* structure rather than material.
|
|
5
|
+
*
|
|
6
|
+
* Colotomy: a nested cycle of gong-chime punctuation over the balungan
|
|
7
|
+
* (the skeletal melody, one note per keteg beat). The cycle is end-weighted:
|
|
8
|
+
* the strongest stroke, the gong ageng, falls on the LAST beat of the
|
|
9
|
+
* gongan, where the melody resolves (seleh). Kenong divides the gongan into
|
|
10
|
+
* equal parts (nongan), kempul marks the middle of each part except the
|
|
11
|
+
* first (whose place is wela, a deliberate silence), and kethuk fills the
|
|
12
|
+
* off-positions. Strokes here use the instrument names; `gong`, `kempul`
|
|
13
|
+
* and `kenong` sound the perc role's low voice, `kethuk` its high voice.
|
|
14
|
+
*
|
|
15
|
+
* Pathet: which tuning degrees a piece favours and which degree ends its
|
|
16
|
+
* phrases (the gong tone). Pelog lima and nem omit pelog 4 and 7, barang
|
|
17
|
+
* omits pelog 1 (and 4); slendro uses all five and differs only in its
|
|
18
|
+
* finals, so its pathet are given by gong tone.
|
|
19
|
+
*
|
|
20
|
+
* References: Judith Becker, "Traditional Music in Modern Java" (1980);
|
|
21
|
+
* Sumarsam, "Gamelan: Cultural Interaction and Musical Development in
|
|
22
|
+
* Central Java" (1995); Michael Tenzer, "Gamelan Gong Kebyar" (2000).
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import type { CycleSpec } from "./schema.ts";
|
|
26
|
+
|
|
27
|
+
/** One stroke name per beat from a map of beat (1-based) to stroke. */
|
|
28
|
+
function strokes(beats: number, at: Record<number, string>): string[] {
|
|
29
|
+
return Array.from({ length: beats }, (_, i) => at[i + 1] ?? ".");
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Every `step`-th beat from `from` (1-based) up to `beats`, as a stroke map. */
|
|
33
|
+
function every(
|
|
34
|
+
beats: number,
|
|
35
|
+
from: number,
|
|
36
|
+
step: number,
|
|
37
|
+
name: string,
|
|
38
|
+
): Record<number, string> {
|
|
39
|
+
const out: Record<number, string> = {};
|
|
40
|
+
for (let beat = from; beat <= beats; beat += step) out[beat] = name;
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Lancaran: 16 beats, kenong every 4, kempul on 6, 10, 14 (wela at 2),
|
|
46
|
+
* kethuk on the odd beats, gong on 16.
|
|
47
|
+
*/
|
|
48
|
+
export const LANCARAN: CycleSpec = Object.freeze({
|
|
49
|
+
kind: "gongan",
|
|
50
|
+
name: "lancaran",
|
|
51
|
+
beats: 16,
|
|
52
|
+
divisions: [4, 4, 4, 4],
|
|
53
|
+
strokes: Object.freeze(
|
|
54
|
+
strokes(16, {
|
|
55
|
+
...every(16, 1, 2, "kethuk"),
|
|
56
|
+
...every(16, 4, 4, "kenong"),
|
|
57
|
+
6: "kempul",
|
|
58
|
+
10: "kempul",
|
|
59
|
+
14: "kempul",
|
|
60
|
+
16: "gong",
|
|
61
|
+
}),
|
|
62
|
+
),
|
|
63
|
+
low: Object.freeze(["gong", "kempul", "kenong"]),
|
|
64
|
+
stress: Object.freeze([16]),
|
|
65
|
+
release: Object.freeze([2]),
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Ketawang: 16 beats in two kenongan, kethuk on 2, 6, 10, 14, kempul on
|
|
70
|
+
* 12 (wela at 4), kenong on 8 and 16, gong on 16.
|
|
71
|
+
*/
|
|
72
|
+
export const KETAWANG: CycleSpec = Object.freeze({
|
|
73
|
+
kind: "gongan",
|
|
74
|
+
name: "ketawang",
|
|
75
|
+
beats: 16,
|
|
76
|
+
divisions: [8, 8],
|
|
77
|
+
strokes: Object.freeze(
|
|
78
|
+
strokes(16, {
|
|
79
|
+
...every(16, 2, 4, "kethuk"),
|
|
80
|
+
8: "kenong",
|
|
81
|
+
12: "kempul",
|
|
82
|
+
16: "gong",
|
|
83
|
+
}),
|
|
84
|
+
),
|
|
85
|
+
low: Object.freeze(["gong", "kempul", "kenong"]),
|
|
86
|
+
stress: Object.freeze([16]),
|
|
87
|
+
release: Object.freeze([4]),
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Ladrang: 32 beats in four kenongan, kethuk on 2, 6, 10..., kempul on
|
|
92
|
+
* 12, 20, 28 (wela at 4), kenong every 8, gong on 32.
|
|
93
|
+
*/
|
|
94
|
+
export const LADRANG: CycleSpec = Object.freeze({
|
|
95
|
+
kind: "gongan",
|
|
96
|
+
name: "ladrang",
|
|
97
|
+
beats: 32,
|
|
98
|
+
divisions: [8, 8, 8, 8],
|
|
99
|
+
strokes: Object.freeze(
|
|
100
|
+
strokes(32, {
|
|
101
|
+
...every(32, 2, 4, "kethuk"),
|
|
102
|
+
...every(32, 8, 8, "kenong"),
|
|
103
|
+
12: "kempul",
|
|
104
|
+
20: "kempul",
|
|
105
|
+
28: "kempul",
|
|
106
|
+
32: "gong",
|
|
107
|
+
}),
|
|
108
|
+
),
|
|
109
|
+
low: Object.freeze(["gong", "kempul", "kenong"]),
|
|
110
|
+
stress: Object.freeze([32]),
|
|
111
|
+
release: Object.freeze([4]),
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Balinese gilak (gong kebyar, beleganjur): 8 beats, gong on 8 and 4
|
|
116
|
+
* (the kempur half-way), kempli time-keeper on every beat between.
|
|
117
|
+
*/
|
|
118
|
+
export const GILAK: CycleSpec = Object.freeze({
|
|
119
|
+
kind: "gongan",
|
|
120
|
+
name: "gilak",
|
|
121
|
+
beats: 8,
|
|
122
|
+
divisions: [4, 4],
|
|
123
|
+
strokes: Object.freeze(
|
|
124
|
+
strokes(8, {
|
|
125
|
+
...every(8, 1, 1, "kempli"),
|
|
126
|
+
4: "kempur",
|
|
127
|
+
8: "gong",
|
|
128
|
+
}),
|
|
129
|
+
),
|
|
130
|
+
low: Object.freeze(["gong", "kempur"]),
|
|
131
|
+
stress: Object.freeze([8]),
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Sundanese degung: the goong closes a 16-beat cycle and the jengglong
|
|
136
|
+
* (low gong-chimes) answers half-way.
|
|
137
|
+
*/
|
|
138
|
+
export const DEGUNG: CycleSpec = Object.freeze({
|
|
139
|
+
kind: "gongan",
|
|
140
|
+
name: "degung",
|
|
141
|
+
beats: 16,
|
|
142
|
+
divisions: [8, 8],
|
|
143
|
+
strokes: Object.freeze(
|
|
144
|
+
strokes(16, {
|
|
145
|
+
...every(16, 2, 2, "bonang"),
|
|
146
|
+
8: "jengglong",
|
|
147
|
+
16: "gong",
|
|
148
|
+
}),
|
|
149
|
+
),
|
|
150
|
+
low: Object.freeze(["gong", "jengglong"]),
|
|
151
|
+
stress: Object.freeze([16]),
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Thai and Khmer ching cycle (piphat, pinpeat): the small
|
|
156
|
+
* cymbals alternate an open "ching" and a damped, stressed "chap" on
|
|
157
|
+
* every beat; the chap closes each pair.
|
|
158
|
+
*/
|
|
159
|
+
export const CHING: CycleSpec = Object.freeze({
|
|
160
|
+
kind: "gongan",
|
|
161
|
+
name: "ching-chap",
|
|
162
|
+
beats: 4,
|
|
163
|
+
divisions: [2, 2],
|
|
164
|
+
strokes: Object.freeze(["ching", "chap", "ching", "chap"]),
|
|
165
|
+
low: Object.freeze(["chap"]),
|
|
166
|
+
stress: Object.freeze([2, 4]),
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Burmese si-wa (hsaing waing): the si bell and the wa clapper alternate
|
|
171
|
+
* at the half bar in the slow nayi-se; the wa, the clapper, marks the
|
|
172
|
+
* stronger beat.
|
|
173
|
+
*/
|
|
174
|
+
export const SI_WA: CycleSpec = Object.freeze({
|
|
175
|
+
kind: "gongan",
|
|
176
|
+
name: "si-wa",
|
|
177
|
+
beats: 4,
|
|
178
|
+
divisions: [2, 2],
|
|
179
|
+
strokes: Object.freeze(["si", ".", "wa", "."]),
|
|
180
|
+
low: Object.freeze(["wa"]),
|
|
181
|
+
stress: Object.freeze([3]),
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Kulintang (Maguindanao): the agung pair plays an off-beat 8-pulse
|
|
186
|
+
* cell (low agung on the beat, high on the off-beat).
|
|
187
|
+
*/
|
|
188
|
+
export const AGUNG: CycleSpec = Object.freeze({
|
|
189
|
+
kind: "gongan",
|
|
190
|
+
name: "agung binalig",
|
|
191
|
+
beats: 8,
|
|
192
|
+
divisions: [4, 4],
|
|
193
|
+
strokes: Object.freeze([
|
|
194
|
+
"gong",
|
|
195
|
+
"agung",
|
|
196
|
+
"gong",
|
|
197
|
+
"agung",
|
|
198
|
+
"gong",
|
|
199
|
+
"agung",
|
|
200
|
+
"agung",
|
|
201
|
+
".",
|
|
202
|
+
]),
|
|
203
|
+
low: Object.freeze(["gong"]),
|
|
204
|
+
stress: Object.freeze([1, 5]),
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
/** All gongan cycles by name. */
|
|
208
|
+
export const GONGAN: Readonly<Record<string, CycleSpec>> = Object.freeze({
|
|
209
|
+
lancaran: LANCARAN,
|
|
210
|
+
ketawang: KETAWANG,
|
|
211
|
+
ladrang: LADRANG,
|
|
212
|
+
gilak: GILAK,
|
|
213
|
+
degung: DEGUNG,
|
|
214
|
+
"ching-chap": CHING,
|
|
215
|
+
"agung binalig": AGUNG,
|
|
216
|
+
"si-wa": SI_WA,
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Pathet: the pelog or slendro degrees (0-based tuning indices) a piece
|
|
221
|
+
* uses, and its phrase-final degrees as indices into that set.
|
|
222
|
+
*/
|
|
223
|
+
export const PATHET = Object.freeze({
|
|
224
|
+
/** Pelog lima: pelog 1 2 3 5 6, gong tone 1 (also 5). */
|
|
225
|
+
"pelog-lima": Object.freeze({
|
|
226
|
+
tuning: "pelog",
|
|
227
|
+
degrees: Object.freeze([0, 1, 2, 4, 5]),
|
|
228
|
+
finals: Object.freeze([0, 3]),
|
|
229
|
+
}),
|
|
230
|
+
/** Pelog nem: pelog 1 2 3 5 6, gong tone 6 (also 2). */
|
|
231
|
+
"pelog-nem": Object.freeze({
|
|
232
|
+
tuning: "pelog",
|
|
233
|
+
degrees: Object.freeze([0, 1, 2, 4, 5]),
|
|
234
|
+
finals: Object.freeze([4, 1]),
|
|
235
|
+
}),
|
|
236
|
+
/** Pelog barang: pelog 2 3 5 6 7, gong tone 6 (also 2). */
|
|
237
|
+
"pelog-barang": Object.freeze({
|
|
238
|
+
tuning: "pelog",
|
|
239
|
+
degrees: Object.freeze([1, 2, 4, 5, 6]),
|
|
240
|
+
finals: Object.freeze([3, 0]),
|
|
241
|
+
}),
|
|
242
|
+
/** Slendro nem: gong tone 2 (also 6). */
|
|
243
|
+
"slendro-nem": Object.freeze({
|
|
244
|
+
tuning: "slendro",
|
|
245
|
+
degrees: Object.freeze([0, 1, 2, 3, 4]),
|
|
246
|
+
finals: Object.freeze([1, 4]),
|
|
247
|
+
}),
|
|
248
|
+
/** Slendro sanga: gong tone 5 (also 1). */
|
|
249
|
+
"slendro-sanga": Object.freeze({
|
|
250
|
+
tuning: "slendro",
|
|
251
|
+
degrees: Object.freeze([0, 1, 2, 3, 4]),
|
|
252
|
+
finals: Object.freeze([3, 0]),
|
|
253
|
+
}),
|
|
254
|
+
/** Slendro manyura: gong tone 6 (also 3). */
|
|
255
|
+
"slendro-manyura": Object.freeze({
|
|
256
|
+
tuning: "slendro",
|
|
257
|
+
degrees: Object.freeze([0, 1, 2, 3, 4]),
|
|
258
|
+
finals: Object.freeze([4, 2]),
|
|
259
|
+
}),
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
export type PathetName = keyof typeof PATHET;
|
|
263
|
+
|
|
264
|
+
/** A card `pitch` patch for a pathet. */
|
|
265
|
+
export function pathetPitch(name: PathetName) {
|
|
266
|
+
const pathet = PATHET[name];
|
|
267
|
+
return Object.freeze({
|
|
268
|
+
tuning: pathet.tuning,
|
|
269
|
+
degrees: pathet.degrees,
|
|
270
|
+
scales: Object.freeze([Object.freeze(["major-pentatonic", 1] as const)]),
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/** Phrase-final weights for a pathet (gong tone first). */
|
|
275
|
+
export function pathetFinals(
|
|
276
|
+
name: PathetName,
|
|
277
|
+
): readonly (readonly [number, number])[] {
|
|
278
|
+
const [gong, second] = PATHET[name].finals;
|
|
279
|
+
return Object.freeze([
|
|
280
|
+
Object.freeze([gong!, 0.7] as const),
|
|
281
|
+
Object.freeze([second!, 0.3] as const),
|
|
282
|
+
]);
|
|
283
|
+
}
|