@hraness/dawg 0.6.0 → 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.
- package/CHANGELOG.md +126 -0
- package/DAWG.md +655 -141
- package/README.md +27 -25
- package/core/autotune.ts +1119 -0
- package/core/chords.ts +759 -23
- package/core/clips.ts +499 -0
- package/core/diff.ts +182 -99
- package/core/expression.ts +158 -6
- package/core/fx.ts +354 -32
- package/core/granular.ts +91 -0
- package/core/instruments.ts +180 -0
- package/core/keys.ts +573 -4
- package/core/loop.ts +5 -0
- package/core/lyrics.ts +297 -0
- package/core/master.ts +3 -3
- package/core/resonators.ts +306 -4
- package/core/routing.ts +165 -0
- package/core/score.ts +1181 -16
- package/core/sdk/eval-child.ts +7 -2
- package/core/sdk/eval.ts +35 -6
- package/core/sdk/print.ts +354 -6
- package/core/sdk/sync-lyrics.ts +49 -0
- package/core/sdk/v1.ts +3160 -69
- package/core/sections.ts +298 -24
- package/core/sing.ts +815 -0
- package/core/strings.ts +237 -2
- 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/core/winds.ts +652 -0
- package/guides/agent.md +29 -0
- package/guides/arrange.md +30 -0
- package/guides/audition.md +20 -14
- package/guides/automation.md +12 -6
- package/guides/chords.md +16 -14
- package/guides/effects.md +17 -15
- 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 +12 -6
- package/guides/music.md +23 -8
- package/guides/notes.md +15 -9
- package/guides/performance.md +15 -10
- package/guides/play.md +21 -13
- package/guides/project.md +25 -8
- package/guides/providers.md +20 -14
- package/guides/resample.md +32 -0
- package/guides/rhythm.md +17 -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 -12
- package/guides/styles.md +31 -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 +5 -2
- package/src/agent/agent.ts +131 -13
- package/src/agent/calibration-tools.ts +53 -0
- package/src/agent/chord-tools.ts +153 -1
- package/src/agent/clip-tools.ts +453 -0
- package/src/agent/command-agent.ts +369 -0
- package/src/agent/drum-tools.ts +2 -2
- package/src/agent/expression-tools.ts +91 -0
- package/src/agent/gateway.ts +246 -60
- package/src/agent/models.ts +53 -12
- package/src/agent/ops.ts +15 -1
- package/src/agent/pack-tools.ts +1 -1
- package/src/agent/planner.ts +13 -0
- package/src/agent/portable-schema.ts +80 -0
- package/src/agent/preview-tool.ts +5 -1
- package/src/agent/provider.ts +22 -8
- package/src/agent/resample-tool.ts +131 -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 +307 -37
- package/src/agent/usage.ts +2 -2
- package/src/agent/voice-tools.ts +925 -0
- package/src/agent/xcb-agent.ts +16 -6
- package/src/argv.ts +38 -0
- package/src/audio/analysis.ts +253 -0
- package/src/audio/arrange.ts +58 -3
- 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/doctor.ts +86 -0
- package/src/audio/dsp/bandbank.ts +138 -0
- package/src/audio/dsp/envelope.ts +171 -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/dsp/shift.ts +256 -0
- package/src/audio/effects/chain.ts +21 -4
- package/src/audio/effects/common.ts +57 -0
- package/src/audio/effects/convolution.ts +113 -5
- package/src/audio/effects/filter.ts +48 -69
- package/src/audio/effects/formant.ts +263 -0
- package/src/audio/effects/gaze.ts +354 -0
- package/src/audio/engine.ts +206 -33
- package/src/audio/fit.ts +80 -3
- package/src/audio/granular.ts +352 -21
- package/src/audio/instrument-check.ts +67 -47
- package/src/audio/instruments.ts +36 -3
- package/src/audio/keys/calibration.ts +56 -0
- package/src/audio/keys/electric.ts +427 -0
- package/src/audio/keys/engine.ts +156 -20
- package/src/audio/keys/organ.ts +1335 -0
- package/src/audio/keys/piano.ts +72 -8
- package/src/audio/keys/sympathetic.ts +127 -0
- package/src/audio/kits.ts +135 -6
- package/src/audio/live-worker.ts +3 -1
- package/src/audio/live.ts +247 -26
- package/src/audio/native.ts +615 -0
- package/src/audio/preview.ts +45 -3
- package/src/audio/render-worker.ts +2 -0
- package/src/audio/renderer.ts +2 -0
- package/src/audio/resample.ts +286 -0
- package/src/audio/resonators.ts +10 -2
- package/src/audio/sampler.ts +252 -24
- package/src/audio/samples.ts +46 -3
- package/src/audio/sing/analysis.ts +193 -0
- package/src/audio/sing/engine.ts +949 -0
- package/src/audio/strings/body.ts +29 -16
- package/src/audio/strings/bow.ts +699 -0
- package/src/audio/strings/engine.ts +274 -22
- package/src/audio/strings/measure.test-helpers.ts +2 -0
- 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 +608 -85
- package/src/audio/winds/engine.ts +306 -0
- package/src/audio/winds/filters.ts +153 -0
- package/src/audio/winds/pitch.ts +104 -0
- package/src/audio/winds/trim.ts +104 -0
- package/src/audio/winds/trims.ts +917 -0
- package/src/audio/winds/trims1.ts +297 -0
- package/src/audio/winds/voice.ts +492 -0
- 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 +44 -29
- 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 +104 -23
- package/src/commands/formant.ts +221 -0
- package/src/commands/fx.ts +105 -33
- package/src/commands/grammar.ts +558 -0
- package/src/commands/granular.ts +7 -2
- package/src/commands/help.ts +652 -339
- package/src/commands/history.ts +18 -0
- package/src/commands/keys.ts +293 -17
- package/src/commands/modal.ts +67 -4
- 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 +130 -0
- package/src/commands/progression.ts +170 -0
- package/src/commands/resample.ts +281 -0
- package/src/commands/rhythm.ts +3 -0
- package/src/commands/rig.ts +8 -25
- package/src/commands/sample.ts +49 -2
- package/src/commands/shift.ts +119 -0
- package/src/commands/sing.ts +478 -0
- package/src/commands/string.ts +28 -2
- package/src/commands/strum.ts +485 -0
- 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 +616 -0
- package/src/commands/vocal.ts +147 -0
- package/src/commands/vocoder.ts +627 -0
- package/src/commands/wind.ts +244 -0
- package/src/fs/durable.ts +50 -0
- package/src/lang/glossary.ts +493 -0
- package/src/launch-args.ts +163 -0
- package/src/main.ts +1521 -255
- package/src/media/cli.ts +20 -3
- package/src/media/import.ts +3 -1
- package/src/project/check.ts +26 -3
- 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 +36 -1
- package/src/session/daemon.ts +3 -0
- package/src/session/meta.ts +14 -0
- package/src/session/origin.ts +154 -0
- package/src/session/port.ts +22 -4
- package/src/session/presence.ts +50 -7
- package/src/session/protocol.ts +5 -1
- package/src/session/rebase.ts +18 -5
- package/src/session/receipt.ts +258 -0
- package/src/session/store.ts +65 -43
- package/src/tui/arrange-menu.ts +65 -31
- package/src/tui/audition.ts +1 -1
- package/src/tui/euclid.ts +18 -13
- package/src/tui/fader.ts +228 -41
- package/src/tui/granular-menu.ts +2 -4
- 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 +1377 -193
- package/src/tui/modal-menu.ts +38 -11
- package/src/tui/performance-menu.ts +46 -1
- package/src/tui/play-chords.ts +108 -5
- package/src/tui/play-mode.ts +16 -1
- package/src/tui/play-session.ts +81 -16
- package/src/tui/sing-menu.ts +278 -0
- package/src/tui/style-menu.ts +104 -0
- package/src/tui/vocoder-menu.ts +244 -0
- package/src/tui/wind-menu.ts +144 -0
- package/src/version.ts +8 -0
- package/src/web/fetch.ts +115 -29
- package/tui/activity.ts +180 -9
- package/tui/app.ts +274 -40
- package/tui/clip-row.ts +132 -0
- package/tui/delight.ts +144 -0
- package/tui/drawer.ts +70 -22
- package/tui/frame-gate.ts +76 -0
- package/tui/grammar.ts +112 -63
- package/tui/guide.ts +42 -4
- package/tui/highway.ts +269 -25
- package/tui/hints.ts +192 -0
- package/tui/input.ts +60 -9
- package/tui/keys.ts +1 -1
- package/tui/play-strip.ts +68 -14
- package/tui/prompt.ts +1 -1
- package/tui/screen.ts +144 -14
- package/tui/theme.ts +27 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BASE_STYLE: the neutral body every style resolves on top of (quality-08).
|
|
3
|
+
* A 4/4 straight-sixteenths song in a major key with a functional
|
|
4
|
+
* progression, a root bass, a piano comp, a lead and a plain kit. Root
|
|
5
|
+
* cards replace what their family does differently; nothing here is a
|
|
6
|
+
* style of its own.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { StyleBody } from "./schema.ts";
|
|
10
|
+
|
|
11
|
+
/** Signed interval weights for -12..12 semitones: mostly steps, few leaps. */
|
|
12
|
+
export const STEPWISE_INTERVALS: readonly number[] = Object.freeze([
|
|
13
|
+
0.2, 0.1, 0.1, 0.2, 0.4, 0.6, 0.5, 1.2, 1.4, 2.6, 4.2, 5.2, 1.6, 5.2, 4.2,
|
|
14
|
+
2.6, 1.4, 1.2, 0.5, 0.6, 0.4, 0.2, 0.1, 0.1, 0.2,
|
|
15
|
+
]);
|
|
16
|
+
|
|
17
|
+
export const BASE_STYLE: StyleBody = Object.freeze({
|
|
18
|
+
summary: "neutral 4/4 song: functional harmony, root bass, comp and lead",
|
|
19
|
+
seedSalt: 0,
|
|
20
|
+
meter: { signatures: [["4/4", 1]], hypermeter: [[4, 1]] },
|
|
21
|
+
tempo: { bpm: [90, 130], typical: 110 },
|
|
22
|
+
groove: {
|
|
23
|
+
subdivision: 4,
|
|
24
|
+
swingRatio: [1, 1],
|
|
25
|
+
velocity: [1, 0.7, 0.85, 0.7],
|
|
26
|
+
humanize: { timingMs: 4, velocity: 0.05 },
|
|
27
|
+
},
|
|
28
|
+
rhythm: {
|
|
29
|
+
onsets: {
|
|
30
|
+
kick: [1, 0, 0, 0, 0, 0, 0, 0.2, 1, 0, 0.3, 0, 0, 0, 0, 0],
|
|
31
|
+
snare: [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0.1],
|
|
32
|
+
hat: [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
|
|
33
|
+
},
|
|
34
|
+
fills: { every: 4, density: [0.3, 0.6] },
|
|
35
|
+
},
|
|
36
|
+
pitch: {
|
|
37
|
+
scales: [["major", 1]],
|
|
38
|
+
tonic: "any",
|
|
39
|
+
},
|
|
40
|
+
harmony: {
|
|
41
|
+
model: "functional",
|
|
42
|
+
presets: [
|
|
43
|
+
["axis", 0.4],
|
|
44
|
+
["fifties", 0.3],
|
|
45
|
+
["canon", 0.3],
|
|
46
|
+
],
|
|
47
|
+
cadences: [
|
|
48
|
+
["V-I", 0.6],
|
|
49
|
+
["IV-I", 0.2],
|
|
50
|
+
["half", 0.2],
|
|
51
|
+
],
|
|
52
|
+
rhythm: [[1, 1]],
|
|
53
|
+
sevenths: 0.1,
|
|
54
|
+
voicing: { types: [["close", 1]], range: [52, 76], notes: [3, 4] },
|
|
55
|
+
},
|
|
56
|
+
melody: {
|
|
57
|
+
contour: [
|
|
58
|
+
["arch", 0.5],
|
|
59
|
+
["wave", 0.5],
|
|
60
|
+
],
|
|
61
|
+
ambitus: [5, 12],
|
|
62
|
+
range: [60, 84],
|
|
63
|
+
intervals: STEPWISE_INTERVALS,
|
|
64
|
+
chordToneRate: 0.7,
|
|
65
|
+
density: [1, 2],
|
|
66
|
+
phraseBars: [
|
|
67
|
+
[2, 0.5],
|
|
68
|
+
[4, 0.5],
|
|
69
|
+
],
|
|
70
|
+
repetition: 0.4,
|
|
71
|
+
finals: [
|
|
72
|
+
[0, 0.6],
|
|
73
|
+
[2, 0.2],
|
|
74
|
+
[4, 0.2],
|
|
75
|
+
],
|
|
76
|
+
},
|
|
77
|
+
bass: {
|
|
78
|
+
behaviour: [["root", 1]],
|
|
79
|
+
range: [33, 52],
|
|
80
|
+
onsets: [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
|
|
81
|
+
},
|
|
82
|
+
form: {
|
|
83
|
+
plans: [[["intro", "verse", "chorus", "verse", "chorus", "outro"], 1]],
|
|
84
|
+
energy: {
|
|
85
|
+
intro: 0.4,
|
|
86
|
+
verse: 0.6,
|
|
87
|
+
pre: 0.7,
|
|
88
|
+
chorus: 0.9,
|
|
89
|
+
build: 0.8,
|
|
90
|
+
drop: 1,
|
|
91
|
+
breakdown: 0.3,
|
|
92
|
+
bridge: 0.6,
|
|
93
|
+
outro: 0.4,
|
|
94
|
+
},
|
|
95
|
+
archetype: "verse-chorus",
|
|
96
|
+
},
|
|
97
|
+
texture: {
|
|
98
|
+
kind: "homophonic",
|
|
99
|
+
roles: {
|
|
100
|
+
kick: {
|
|
101
|
+
required: true,
|
|
102
|
+
voices: [{ instrument: "drums", kit: "acoustic", weight: 1 }],
|
|
103
|
+
},
|
|
104
|
+
snare: {
|
|
105
|
+
required: true,
|
|
106
|
+
voices: [{ instrument: "drums", kit: "acoustic", weight: 1 }],
|
|
107
|
+
},
|
|
108
|
+
hat: {
|
|
109
|
+
required: false,
|
|
110
|
+
voices: [{ instrument: "drums", kit: "acoustic", weight: 1 }],
|
|
111
|
+
},
|
|
112
|
+
bass: { required: true, voices: [{ instrument: "bass", weight: 1 }] },
|
|
113
|
+
chords: { required: true, voices: [{ instrument: "piano", weight: 1 }] },
|
|
114
|
+
lead: { required: true, voices: [{ instrument: "lead", weight: 1 }] },
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
expression: { dynamics: [0.45, 0.95] },
|
|
118
|
+
mix: {
|
|
119
|
+
levels: { kick: -2, snare: -4, hat: -10, bass: -3, chords: -6, lead: 0 },
|
|
120
|
+
space: 0.25,
|
|
121
|
+
},
|
|
122
|
+
wants: [],
|
|
123
|
+
} satisfies StyleBody);
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timelines (quality-08): the asymmetric bell, clave and stick patterns
|
|
3
|
+
* that organise a groove, written as abstract one-bar step grids (`x` hit,
|
|
4
|
+
* `.` rest; see `grid` in parts.ts). They are theory, not material: each is
|
|
5
|
+
* a rhythmic cell named and analysed in the literature, not a transcription
|
|
6
|
+
* of a recording.
|
|
7
|
+
*
|
|
8
|
+
* 16-step patterns are one 4/4 bar of sixteenths (two cut-time bars, the
|
|
9
|
+
* way clave is felt). 12-step patterns are one 12/8 bar of eighths, or one
|
|
10
|
+
* 6/8 or 3/4 bar of sixteenths.
|
|
11
|
+
*
|
|
12
|
+
* References: David Peñalosa, "The Clave Matrix" (2009); Godfried
|
|
13
|
+
* Toussaint, "The Geometry of Musical Rhythm" (2013).
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import type { CycleSpec } from "./schema.ts";
|
|
17
|
+
|
|
18
|
+
export const TIMELINES = Object.freeze({
|
|
19
|
+
/** Son clave, three side first: 3+3+4 | 2+4 (onsets 0 3 6 10 12). */
|
|
20
|
+
sonClave32: "x..x..x...x.x...",
|
|
21
|
+
/** Son clave, two side first (the 3-2 rotated by half a bar). */
|
|
22
|
+
sonClave23: "..x.x...x..x..x.",
|
|
23
|
+
/** Rumba clave: the third stroke of the three side delayed to 7. */
|
|
24
|
+
rumbaClave32: "x..x...x..x.x...",
|
|
25
|
+
rumbaClave23: "..x.x...x..x...x",
|
|
26
|
+
/** Bossa nova clave: the son clave with the last stroke moved to 13. */
|
|
27
|
+
bossaClave: "x..x..x...x..x..",
|
|
28
|
+
/** Tresillo 3+3+2 twice: the Afro-Latin cell under habanera and dembow. */
|
|
29
|
+
tresillo: "x..x..x.x..x..x.",
|
|
30
|
+
/** Habanera (contradanza): tresillo with the middle stroke split. */
|
|
31
|
+
habanera: "x..xx.x.x..xx.x.",
|
|
32
|
+
/** Cinquillo: five strokes in a 2/4 bar, x.xx.xx. (danzon, kompa, biguine). */
|
|
33
|
+
cinquillo: "x.xx.xx.x.xx.xx.",
|
|
34
|
+
/** Danzon baqueteo: cinquillo bar answered by a plain eighths bar. */
|
|
35
|
+
baqueteo: "x.xx.xx.x.x.x.x.",
|
|
36
|
+
/** Cascara (shell of the timbal), 2-3: the 2 side x.x.xx.x, then x.xx.x.x. */
|
|
37
|
+
cascara: "x.x.xx.xx.xx.x.x",
|
|
38
|
+
/** Cascara, 3-2: the halves swapped (rumba palitos under a 3-2 clave). */
|
|
39
|
+
cascara32: "x.xx.x.xx.x.xx.x",
|
|
40
|
+
/** Dembow / tresillo off-beat snare: 3 6 11 14. */
|
|
41
|
+
dembowSnare: "...x..x....x..x.",
|
|
42
|
+
/** Four on the floor. */
|
|
43
|
+
fourFloor: "x...x...x...x...",
|
|
44
|
+
/** Off-beat eighths (skank, llamador, upstroke). */
|
|
45
|
+
offbeats: "..x...x...x...x.",
|
|
46
|
+
/** One drop: kick and rim together on beat three only. */
|
|
47
|
+
oneDrop: "........x.......",
|
|
48
|
+
/** Partido alto: the syncopated samba cell (2+3, anticipated). */
|
|
49
|
+
partidoAlto: ".x..x.x..x..x.x.",
|
|
50
|
+
/** Guira / guacharaca scrape: long-short-short per beat. */
|
|
51
|
+
scrape: "x.xxx.xxx.xxx.xx",
|
|
52
|
+
/**
|
|
53
|
+
* Tumbao bass: the and of two (bombo) and beat four (ponche) of each 4/4
|
|
54
|
+
* bar, never the one. A 4/4 bar is eight steps here, a quarter two.
|
|
55
|
+
*/
|
|
56
|
+
tumbao: "...x..x....x..x.",
|
|
57
|
+
/** Conga tumbao: open tones on 4 and 4-and, slap on two. */
|
|
58
|
+
congaTumbao: "x.x.x.xxx.x.x.xx",
|
|
59
|
+
/** Huayno short-long: sixteenth then dotted eighth on every beat. */
|
|
60
|
+
huayno: "xx..xx..xx..xx..",
|
|
61
|
+
/** Standard 12/8 bell (bembe): 2+2+1+2+2+2+1, seven strokes. */
|
|
62
|
+
bembe12: "x.x.xx.x.x.x",
|
|
63
|
+
/** 6/8 sesquialtera: 6/8 accents (0, 6) against 3/4 (0, 4, 8). */
|
|
64
|
+
sixEight12: "x.....x.....",
|
|
65
|
+
threeFour12: "x...x...x...",
|
|
66
|
+
} as const);
|
|
67
|
+
|
|
68
|
+
export type TimelineName = keyof typeof TIMELINES;
|
|
69
|
+
|
|
70
|
+
/** The onset steps of a timeline (or any `x.` grid string). */
|
|
71
|
+
export function onsetSteps(pattern: string): number[] {
|
|
72
|
+
const out: number[] = [];
|
|
73
|
+
let i = 0;
|
|
74
|
+
for (const char of pattern) {
|
|
75
|
+
if (char === " " || char === "|") continue;
|
|
76
|
+
if (char === "x" || char === "X") out.push(i);
|
|
77
|
+
i += 1;
|
|
78
|
+
}
|
|
79
|
+
return out;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* A timeline as a cycle the perc role plays one stroke per pulse (the
|
|
84
|
+
* meter's beat unit: an eighth in 6/8 and 12/8). Hits on `low` steps play
|
|
85
|
+
* the low voice; `stress` steps are accented (1-based, like a tala).
|
|
86
|
+
*/
|
|
87
|
+
export function timelineCycle(
|
|
88
|
+
name: string,
|
|
89
|
+
pattern: string,
|
|
90
|
+
low: readonly number[] = [0],
|
|
91
|
+
stress: readonly number[] = [1],
|
|
92
|
+
): CycleSpec {
|
|
93
|
+
const steps = [...pattern].filter((c) => c !== " " && c !== "|");
|
|
94
|
+
const strokes = steps.map((c, i) =>
|
|
95
|
+
c === "." ? "." : low.includes(i) ? "bum" : "ka",
|
|
96
|
+
);
|
|
97
|
+
return Object.freeze({
|
|
98
|
+
kind: "timeline",
|
|
99
|
+
name,
|
|
100
|
+
beats: strokes.length,
|
|
101
|
+
divisions: Object.freeze([strokes.length]),
|
|
102
|
+
strokes: Object.freeze(strokes),
|
|
103
|
+
low: Object.freeze(["bum"]),
|
|
104
|
+
stress: Object.freeze([...stress]),
|
|
105
|
+
});
|
|
106
|
+
}
|