@ugfoundation/swaralipi-js 0.13.1 → 0.14.1

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 (39) hide show
  1. package/README.md +25 -0
  2. package/dist/{batch-XVQRHLTN.js → batch-J72GGBG2.js} +4 -4
  3. package/dist/{batch-XVQRHLTN.js.map → batch-J72GGBG2.js.map} +1 -1
  4. package/dist/{chunk-MORX7G6E.js → chunk-4WDAVRET.js} +3 -3
  5. package/dist/{chunk-MORX7G6E.js.map → chunk-4WDAVRET.js.map} +1 -1
  6. package/dist/{chunk-L6YZ3GC6.js → chunk-GIOGYJMM.js} +180 -19
  7. package/dist/chunk-GIOGYJMM.js.map +1 -0
  8. package/dist/{chunk-GKS4WZZ6.js → chunk-KUZSW4FN.js} +3 -3
  9. package/dist/{chunk-GKS4WZZ6.js.map → chunk-KUZSW4FN.js.map} +1 -1
  10. package/dist/cli.cjs +1 -1
  11. package/dist/cli.cjs.map +1 -1
  12. package/dist/cli.js +2 -2
  13. package/dist/convert/index.cjs +1 -1
  14. package/dist/convert/index.cjs.map +1 -1
  15. package/dist/convert/index.js +2 -2
  16. package/dist/index.cjs +1 -1
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.js +1 -1
  19. package/dist/{schedule-V-fgepvP.d.cts → instruments-DTIuTlda.d.cts} +174 -140
  20. package/dist/{schedule-ClyON98C.d.ts → instruments-NcUb0ozc.d.ts} +174 -140
  21. package/dist/player/index.cjs +330 -84
  22. package/dist/player/index.cjs.map +1 -1
  23. package/dist/player/index.d.cts +40 -16
  24. package/dist/player/index.d.ts +40 -16
  25. package/dist/player/index.js +150 -69
  26. package/dist/player/index.js.map +1 -1
  27. package/dist/spec/index.cjs +1 -1
  28. package/dist/spec/index.cjs.map +1 -1
  29. package/dist/spec/index.d.cts +1 -1
  30. package/dist/spec/index.d.ts +1 -1
  31. package/dist/spec/index.js +1 -1
  32. package/dist/viewer/index.cjs +189 -31
  33. package/dist/viewer/index.cjs.map +1 -1
  34. package/dist/viewer/index.d.cts +62 -2
  35. package/dist/viewer/index.d.ts +62 -2
  36. package/dist/viewer/index.js +123 -4
  37. package/dist/viewer/index.js.map +1 -1
  38. package/package.json +1 -1
  39. package/dist/chunk-L6YZ3GC6.js.map +0 -1
@@ -1,143 +1,6 @@
1
- import * as tone from 'tone';
2
1
  import { T as Taal, S as Swaralipi, N as Note } from './schema-DZag9qkF.js';
3
- import { T as TaalId, L as Lay, a as LaySpeeds } from './lay-CWlEhImP.js';
4
-
5
- /** The dynamically-imported Tone module, typed without importing it. */
6
- type ToneModule = typeof tone;
7
- /** A melodic instrument: a Tone.Sampler note→filename map + where to find it. */
8
- interface InstrumentDef {
9
- /** Human label for UIs. */
10
- label: string;
11
- /** Tone.Sampler `urls`: note name (`C#4`) → filename (`Cs4.mp3`). */
12
- urls: Record<string, string>;
13
- /** Sample directory: an absolute URL, or — when `local` — a path segment
14
- * appended to the player's `soundsBaseUrl`. */
15
- baseUrl: string;
16
- /** `baseUrl` is relative to `soundsBaseUrl` (needs it set). */
17
- local?: boolean;
18
- /** Sampler release time in seconds. */
19
- release?: number;
20
- }
21
- /** Built-in melody instrument ids (consumers may add their own via the
22
- * player's `customInstruments`, so the runtime id type stays open). */
23
- type InstrumentId = string;
24
- /**
25
- * Default host for the project's samples (santoor / tabla / tanpura /
26
- * metronome) — CORS-enabled, so the player works with zero config. Override via
27
- * the player's `soundsBaseUrl` to self-host. (Melody defaults to the CDN-hosted
28
- * piano, so it needs no host.) Licences: see THIRD-PARTY.md.
29
- */
30
- declare const DEFAULT_SOUNDS_BASE = "https://bitoron.pages.dev/audio/instruments/";
31
- /** CC-BY Salamander Grand Piano (Tone's de-facto piano), CDN-hosted. */
32
- declare const SALAMANDER_BASE = "https://tonejs.github.io/audio/salamander/";
33
- /** CC-BY tonejs-instruments sample CDN (harmonium/violin/flute). */
34
- declare const TONEJS_INSTRUMENTS_BASE = "https://nbrosowsky.github.io/tonejs-instruments/samples/";
35
- /** Built-in melody instruments. santoor is local; the rest are CDN-hosted
36
- * (CC-BY) so they need only network — `pianoBaseUrl`/`customInstruments`
37
- * override for self-hosting. */
38
- declare const INSTRUMENTS: Record<string, InstrumentDef>;
39
- /** Taals with recorded tabla loops (everything else → metronome fallback). */
40
- declare const SAMPLED_TAALS: ReadonlySet<TaalId>;
41
- /** Available tabla loop tempos (file suffix `…<bpm>bpm.mp3`). */
42
- declare const TABLA_BPMS: readonly number[];
43
- /**
44
- * Tabla loop variations per taal. Most taals have one unnamed loop at
45
- * `tabla/<id>/`; an entry here overrides that:
46
- * - `variations` lists the variation suffixes, **first = default**.
47
- * A lone named variation (shashthi → `pro`, i.e. `tabla/shashthi-pro/`) IS
48
- * the default; later entries are premium upsells the player never auto-selects.
49
- * An empty-string entry (kehrwa → `''`) means the unnamed `tabla/<id>/` loop
50
- * is the default and a named entry follows it as an upsell.
51
- * - `skipBpms` are grid tempos this taal's loops were not recorded at.
52
- * Consumers read this to build a variation/upsell UI; the player itself only
53
- * ever plays the default (or whatever a doc's `meta.taal.variation` pins).
54
- */
55
- declare const TABLA_VARIATIONS: Record<string, {
56
- variations: string[];
57
- skipBpms?: number[];
58
- }>;
59
- /** Tabla tempos actually available for a taal: the grid minus any it lacks. */
60
- declare function tablaBpms(taalId: string): readonly number[];
61
- /** Ensure exactly one trailing slash. */
62
- declare function normalizeBase(url: string): string;
63
- /** The 37 santoor samples, as a Tone.Sampler `urls` map (`C4` → `c4.mp3`). */
64
- declare function santoorUrls(): Record<string, string>;
65
- /**
66
- * Restrict a Sampler `urls` map to just the samples needed to cover MIDI
67
- * `[lo, hi]`: every sample inside the range, plus the nearest one below and
68
- * above it (so Tone interpolates the edges without extrapolating). Cuts a
69
- * typical song from ~37 santoor files to a handful — a big win on mobile and
70
- * never worse on fast links (Tone fetches what's left in parallel). The
71
- * Sampler pitch-shifts from the nearest sample, so audio is unchanged.
72
- */
73
- declare function subsetUrls(urls: Record<string, string>, lo: number, hi: number): Record<string, string>;
74
- /** Resolve a representative sample URL for an instrument (its first sample),
75
- * used to probe availability. undefined when a local instrument has no
76
- * `soundsBaseUrl` or the def has no samples. */
77
- declare function instrumentSampleUrl(def: InstrumentDef, soundsBaseUrl?: string): string | undefined;
78
- /**
79
- * Liveness check for a sample URL: a single tiny ranged GET (one byte), the
80
- * same CORS-enabled fetch Tone uses to load the buffer — so a pass means Tone
81
- * can actually load it. Resolves false on any error/timeout/non-2xx, and false
82
- * (no throw) when `fetch` is unavailable (Node/SSR). `Range: bytes=0-0` is a
83
- * CORS-safelisted header, so no preflight.
84
- */
85
- declare function probeUrl(url: string, timeoutMs?: number): Promise<boolean>;
86
- /**
87
- * Snap a tabla loop's end to the nearest whole beat of its measured length so a
88
- * slightly-mistrimmed file still phase-locks to the melody grid instead of
89
- * drifting a fraction of a beat each cycle. `spb` = seconds per beat (60/bpm).
90
- * No-op for correctly trimmed loops (already an integer beat count); never
91
- * extends past the buffer — a too-short file can't be repaired here.
92
- *
93
- * ponytail: belt-and-braces for off-spec audio; the real fix is trimming each
94
- * loop to exactly `cycles × numBeats × 60/bpm` seconds at production time.
95
- */
96
- declare function quantizeLoopEnd(durationSec: number, spb: number): number;
97
- /** Snap an arbitrary bpm to the nearest available tabla tempo (default grid;
98
- * pass a taal's `tablaBpms()` so it never snaps to a tempo that taal lacks). */
99
- declare function nearestTablaBpm(bpm: number, bpms?: readonly number[]): number;
100
- /** URL of the tabla loop for a taal at a (snapped) bpm, optionally a named
101
- * variation (defaults to the taal's default variation — see TABLA_VARIATIONS). */
102
- declare function tablaUrl(base: string, taalId: string, bpm: number, variation?: string): string;
103
- declare const DRUM_KIT_BASE = "https://tonejs.github.io/audio/drum-samples/acoustic-kit/";
104
- type DrumVoice = 'kick' | 'snare' | 'hihat' | 'tom1' | 'tom2' | 'tom3';
105
- /**
106
- * Per-beat drumset voice for one তাল cycle, following sam/tali/khaali theory:
107
- * sam (cycle start) → kick, the first beat of each accented (non-khaali)
108
- * vibhag → snare (the tali clap), the first beat of a khaali vibhag → closed
109
- * hihat (the khaali "wave off"), every other beat → hihat (fill, keeping the
110
- * kit's groove going the way a tabla's filler strokes do).
111
- */
112
- declare function drumPattern(taal: Pick<Taal, 'numBeats' | 'sam' | 'bhaags' | 'khaali'>): DrumVoice[];
113
- /**
114
- * Fraction of the gap between two মীড় notes spent holding the source pitch
115
- * before the slide begins. 0 = slide the whole way (an alaap-slow meend);
116
- * 0.5 = hold half the note, then roll into the target.
117
- */
118
- declare const MEEND_HOLD = 0.5;
119
- /** Sampler `urls` key whose pitch is nearest `midi` (the sample to slide). */
120
- declare function nearestSampleKey(urls: Record<string, string>, midi: number): string;
121
- /** The same samples `createSampler` loads, as raw buffers for the glide voice. */
122
- declare function createBuffers(Tone: ToneModule, def: InstrumentDef, soundsBaseUrl: string | undefined, range?: {
123
- lo: number;
124
- hi: number;
125
- }): {
126
- buffers: tone.ToneAudioBuffers;
127
- urls: Record<string, string>;
128
- };
129
- /** One মীড় leg: the pitch to reach and the absolute time to reach it by. */
130
- interface GlideLeg {
131
- midi: number;
132
- /** Seconds on the transport; `legs[0]` is the attack itself. */
133
- at: number;
134
- }
135
- /**
136
- * Sound one মীড় phrase: a single attack on `legs[0]` whose pitch then slides
137
- * through every following leg, ending at `endSec`. Used by both the live
138
- * player and the offline export.
139
- */
140
- declare function triggerGlide(Tone: ToneModule, buffers: InstanceType<ToneModule['ToneAudioBuffers']>, urls: Record<string, string>, dest: InstanceType<ToneModule['Gain']>, legs: readonly GlideLeg[], endSec: number, release?: number, hold?: number): void;
2
+ import { L as Lay, a as LaySpeeds, T as TaalId } from './lay-CWlEhImP.js';
3
+ import * as tone from 'tone';
141
4
 
142
5
  /**
143
6
  * Pure spec-doc → playback timeline. No Tone, no audio — the player turns
@@ -231,6 +94,9 @@ interface ScheduleOptions {
231
94
  * anything grouping events by row rely on; the player and the audio/MIDI
232
95
  * exports turn it on. */
233
96
  repeats?: boolean;
97
+ /** Play only the notes singing these stretches of the song's text (see
98
+ * alignLyrics / excerptVisits). Taken from the order above. */
99
+ excerpt?: Excerpt;
234
100
  }
235
101
  /**
236
102
  * Below-annotation raws that are মীড় arc drawing segments (codec known-raw):
@@ -331,4 +197,172 @@ declare function eventAt(events: PlayEvent[], path: string, near?: number): numb
331
197
  */
332
198
  declare function buildSchedule(doc: Swaralipi, opts?: ScheduleOptions): Schedule;
333
199
 
334
- export { ARC_RAW_RE as A, santoorUrls as B, scheduleLines as C, type DrumVoice as D, subsetUrls as E, tablaBpms as F, GRACE_STEP as G, tablaUrl as H, type InstrumentId as I, triggerGlide as J, type Line as L, MEEND_HOLD as M, type PlayEvent as P, type Schedule as S, type TempoSegment as T, type InstrumentDef as a, DEFAULT_SOUNDS_BASE as b, DRUM_KIT_BASE as c, type GlideLeg as d, INSTRUMENTS as e, SALAMANDER_BASE as f, SAMPLED_TAALS as g, type ScheduleOptions as h, TABLA_BPMS as i, TABLA_VARIATIONS as j, TONEJS_INSTRUMENTS_BASE as k, type ToneModule as l, buildSchedule as m, createBuffers as n, drumPattern as o, eventAt as p, glideTargets as q, graceTouches as r, instrumentSampleUrl as s, isArcRaw as t, meendContinuations as u, nearestSampleKey as v, nearestTablaBpm as w, normalizeBase as x, probeUrl as y, quantizeLoopEnd as z };
200
+ /**
201
+ * Where in the song's text each note sings, and which notes sing a stretch of it.
202
+ *
203
+ * A swaralipi's lyric row is phonetic and split into syllables (আ|বা|র্, চি|ৎ|ত,
204
+ * ৹ for a held syllable), and it often writes a refrain out again. So the
205
+ * notation's letters are aligned to the text by global alignment
206
+ * (Needleman–Wunsch) that may also jump to any word start, the way JumpDTW lets
207
+ * a score re-enter its own repeat blocks (Fremerey, Müller & Clausen, ISMIR
208
+ * 2010). Over gitabitan's 1827 song/notation pairs it aligns 97.9 % of the
209
+ * notation's letters; the rest are songs whose text is only a fragment.
210
+ */
211
+
212
+ /** `part.row.note` → the `[start, end)` UTF-16 offsets of the text it sings. */
213
+ type LyricMap = Map<string, [number, number]>;
214
+ /** The text's lines as the events sing them, each word timed by its first note — an LRC's
215
+ * cues. A line sung again (a repeat) is a new cue. Words are the text's whitespace runs. */
216
+ declare function lyricCues(events: PlayEvent[], map: LyricMap, text: string): {
217
+ beat: number;
218
+ words: {
219
+ beat: number;
220
+ text: string;
221
+ }[];
222
+ }[];
223
+ /** Play only the notes singing these `[start, end)` stretches of the text, in order. */
224
+ interface Excerpt {
225
+ lyrics: LyricMap;
226
+ ranges: [number, number][];
227
+ }
228
+ /** Each note of `doc` that sings a letter of `text`, with the stretch of `text` it sings. */
229
+ declare function alignLyrics(doc: Swaralipi, text: string): LyricMap;
230
+
231
+ /** The dynamically-imported Tone module, typed without importing it. */
232
+ type ToneModule = typeof tone;
233
+ /** A melodic instrument: a Tone.Sampler note→filename map + where to find it. */
234
+ interface InstrumentDef {
235
+ /** Human label for UIs. */
236
+ label: string;
237
+ /** Tone.Sampler `urls`: note name (`C#4`) → filename (`Cs4.mp3`). */
238
+ urls: Record<string, string>;
239
+ /** Sample directory: an absolute URL, or — when `local` — a path segment
240
+ * appended to the player's `soundsBaseUrl`. */
241
+ baseUrl: string;
242
+ /** `baseUrl` is relative to `soundsBaseUrl` (needs it set). */
243
+ local?: boolean;
244
+ /** Sampler release time in seconds. */
245
+ release?: number;
246
+ }
247
+ /** Built-in melody instrument ids (consumers may add their own via the
248
+ * player's `customInstruments`, so the runtime id type stays open). */
249
+ type InstrumentId = string;
250
+ /**
251
+ * Default host for the project's samples (santoor / tabla / tanpura /
252
+ * metronome) — CORS-enabled, so the player works with zero config. Override via
253
+ * the player's `soundsBaseUrl` to self-host. (Melody defaults to the CDN-hosted
254
+ * piano, so it needs no host.) Licences: see THIRD-PARTY.md.
255
+ */
256
+ declare const DEFAULT_SOUNDS_BASE = "https://bitoron.pages.dev/audio/instruments/";
257
+ /** CC-BY Salamander Grand Piano (Tone's de-facto piano), CDN-hosted. */
258
+ declare const SALAMANDER_BASE = "https://tonejs.github.io/audio/salamander/";
259
+ /** CC-BY tonejs-instruments sample CDN (harmonium/violin/flute). */
260
+ declare const TONEJS_INSTRUMENTS_BASE = "https://nbrosowsky.github.io/tonejs-instruments/samples/";
261
+ /** Built-in melody instruments. santoor is local; the rest are CDN-hosted
262
+ * (CC-BY) so they need only network — `pianoBaseUrl`/`customInstruments`
263
+ * override for self-hosting. */
264
+ declare const INSTRUMENTS: Record<string, InstrumentDef>;
265
+ /** Taals with recorded tabla loops (everything else → metronome fallback). */
266
+ declare const SAMPLED_TAALS: ReadonlySet<TaalId>;
267
+ /** Available tabla loop tempos (file suffix `…<bpm>bpm.mp3`). */
268
+ declare const TABLA_BPMS: readonly number[];
269
+ /**
270
+ * Tabla loop variations per taal. Most taals have one unnamed loop at
271
+ * `tabla/<id>/`; an entry here overrides that:
272
+ * - `variations` lists the variation suffixes, **first = default**.
273
+ * A lone named variation (shashthi → `pro`, i.e. `tabla/shashthi-pro/`) IS
274
+ * the default; later entries are premium upsells the player never auto-selects.
275
+ * An empty-string entry (kehrwa → `''`) means the unnamed `tabla/<id>/` loop
276
+ * is the default and a named entry follows it as an upsell.
277
+ * - `skipBpms` are grid tempos this taal's loops were not recorded at.
278
+ * Consumers read this to build a variation/upsell UI; the player itself only
279
+ * ever plays the default (or whatever a doc's `meta.taal.variation` pins).
280
+ */
281
+ declare const TABLA_VARIATIONS: Record<string, {
282
+ variations: string[];
283
+ skipBpms?: number[];
284
+ }>;
285
+ /** Tabla tempos actually available for a taal: the grid minus any it lacks. */
286
+ declare function tablaBpms(taalId: string): readonly number[];
287
+ /** Ensure exactly one trailing slash. */
288
+ declare function normalizeBase(url: string): string;
289
+ /** The 37 santoor samples, as a Tone.Sampler `urls` map (`C4` → `c4.mp3`). */
290
+ declare function santoorUrls(): Record<string, string>;
291
+ /**
292
+ * Restrict a Sampler `urls` map to just the samples needed to cover MIDI
293
+ * `[lo, hi]`: every sample inside the range, plus the nearest one below and
294
+ * above it (so Tone interpolates the edges without extrapolating). Cuts a
295
+ * typical song from ~37 santoor files to a handful — a big win on mobile and
296
+ * never worse on fast links (Tone fetches what's left in parallel). The
297
+ * Sampler pitch-shifts from the nearest sample, so audio is unchanged.
298
+ */
299
+ declare function subsetUrls(urls: Record<string, string>, lo: number, hi: number): Record<string, string>;
300
+ /** Resolve a representative sample URL for an instrument (its first sample),
301
+ * used to probe availability. undefined when a local instrument has no
302
+ * `soundsBaseUrl` or the def has no samples. */
303
+ declare function instrumentSampleUrl(def: InstrumentDef, soundsBaseUrl?: string): string | undefined;
304
+ /**
305
+ * Liveness check for a sample URL: a single tiny ranged GET (one byte), the
306
+ * same CORS-enabled fetch Tone uses to load the buffer — so a pass means Tone
307
+ * can actually load it. Resolves false on any error/timeout/non-2xx, and false
308
+ * (no throw) when `fetch` is unavailable (Node/SSR). `Range: bytes=0-0` is a
309
+ * CORS-safelisted header, so no preflight.
310
+ */
311
+ declare function probeUrl(url: string, timeoutMs?: number): Promise<boolean>;
312
+ /**
313
+ * Snap a tabla loop's end to the nearest whole beat of its measured length so a
314
+ * slightly-mistrimmed file still phase-locks to the melody grid instead of
315
+ * drifting a fraction of a beat each cycle. `spb` = seconds per beat (60/bpm).
316
+ * No-op for correctly trimmed loops (already an integer beat count); never
317
+ * extends past the buffer — a too-short file can't be repaired here.
318
+ *
319
+ * ponytail: belt-and-braces for off-spec audio; the real fix is trimming each
320
+ * loop to exactly `cycles × numBeats × 60/bpm` seconds at production time.
321
+ */
322
+ declare function quantizeLoopEnd(durationSec: number, spb: number): number;
323
+ /** Snap an arbitrary bpm to the nearest available tabla tempo (default grid;
324
+ * pass a taal's `tablaBpms()` so it never snaps to a tempo that taal lacks). */
325
+ declare function nearestTablaBpm(bpm: number, bpms?: readonly number[]): number;
326
+ /** URL of the tabla loop for a taal at a (snapped) bpm, optionally a named
327
+ * variation (defaults to the taal's default variation — see TABLA_VARIATIONS). */
328
+ declare function tablaUrl(base: string, taalId: string, bpm: number, variation?: string): string;
329
+ declare const DRUM_KIT_BASE = "https://tonejs.github.io/audio/drum-samples/acoustic-kit/";
330
+ type DrumVoice = 'kick' | 'snare' | 'hihat' | 'tom1' | 'tom2' | 'tom3';
331
+ /**
332
+ * Per-beat drumset voice for one তাল cycle, following sam/tali/khaali theory:
333
+ * sam (cycle start) → kick, the first beat of each accented (non-khaali)
334
+ * vibhag → snare (the tali clap), the first beat of a khaali vibhag → closed
335
+ * hihat (the khaali "wave off"), every other beat → hihat (fill, keeping the
336
+ * kit's groove going the way a tabla's filler strokes do).
337
+ */
338
+ declare function drumPattern(taal: Pick<Taal, 'numBeats' | 'sam' | 'bhaags' | 'khaali'>): DrumVoice[];
339
+ /**
340
+ * Fraction of the gap between two মীড় notes spent holding the source pitch
341
+ * before the slide begins. 0 = slide the whole way (an alaap-slow meend);
342
+ * 0.5 = hold half the note, then roll into the target.
343
+ */
344
+ declare const MEEND_HOLD = 0.5;
345
+ /** Sampler `urls` key whose pitch is nearest `midi` (the sample to slide). */
346
+ declare function nearestSampleKey(urls: Record<string, string>, midi: number): string;
347
+ /** The same samples `createSampler` loads, as raw buffers for the glide voice. */
348
+ declare function createBuffers(Tone: ToneModule, def: InstrumentDef, soundsBaseUrl: string | undefined, range?: {
349
+ lo: number;
350
+ hi: number;
351
+ }): {
352
+ buffers: tone.ToneAudioBuffers;
353
+ urls: Record<string, string>;
354
+ };
355
+ /** One মীড় leg: the pitch to reach and the absolute time to reach it by. */
356
+ interface GlideLeg {
357
+ midi: number;
358
+ /** Seconds on the transport; `legs[0]` is the attack itself. */
359
+ at: number;
360
+ }
361
+ /**
362
+ * Sound one মীড় phrase: a single attack on `legs[0]` whose pitch then slides
363
+ * through every following leg, ending at `endSec`. Used by both the live
364
+ * player and the offline export.
365
+ */
366
+ declare function triggerGlide(Tone: ToneModule, buffers: InstanceType<ToneModule['ToneAudioBuffers']>, urls: Record<string, string>, dest: InstanceType<ToneModule['Gain']>, legs: readonly GlideLeg[], endSec: number, release?: number, hold?: number): void;
367
+
368
+ export { ARC_RAW_RE as A, normalizeBase as B, probeUrl as C, type DrumVoice as D, type Excerpt as E, quantizeLoopEnd as F, GRACE_STEP as G, santoorUrls as H, type InstrumentId as I, scheduleLines as J, subsetUrls as K, type Line as L, MEEND_HOLD as M, tablaBpms as N, tablaUrl as O, type PlayEvent as P, triggerGlide as Q, type Schedule as S, type TempoSegment as T, type InstrumentDef as a, DEFAULT_SOUNDS_BASE as b, DRUM_KIT_BASE as c, type GlideLeg as d, INSTRUMENTS as e, type LyricMap as f, SALAMANDER_BASE as g, SAMPLED_TAALS as h, type ScheduleOptions as i, TABLA_BPMS as j, TABLA_VARIATIONS as k, TONEJS_INSTRUMENTS_BASE as l, type ToneModule as m, alignLyrics as n, buildSchedule as o, createBuffers as p, drumPattern as q, eventAt as r, glideTargets as s, graceTouches as t, instrumentSampleUrl as u, isArcRaw as v, lyricCues as w, meendContinuations as x, nearestSampleKey as y, nearestTablaBpm as z };