@ugfoundation/swaralipi-js 0.9.2 → 0.10.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 (39) hide show
  1. package/README.md +17 -0
  2. package/dist/{batch-IHEXFEGC.js → batch-3PHPNX2P.js} +4 -4
  3. package/dist/{batch-IHEXFEGC.js.map → batch-3PHPNX2P.js.map} +1 -1
  4. package/dist/{chunk-TZBDIRIA.js → chunk-FGMULPL2.js} +3 -3
  5. package/dist/{chunk-TZBDIRIA.js.map → chunk-FGMULPL2.js.map} +1 -1
  6. package/dist/{chunk-F23LZMIU.js → chunk-I5GJWSD2.js} +3 -3
  7. package/dist/{chunk-F23LZMIU.js.map → chunk-I5GJWSD2.js.map} +1 -1
  8. package/dist/{chunk-SEN266BY.js → chunk-JEJYMKKZ.js} +26 -3
  9. package/dist/chunk-JEJYMKKZ.js.map +1 -0
  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/player/index.cjs +436 -50
  20. package/dist/player/index.cjs.map +1 -1
  21. package/dist/player/index.d.cts +76 -11
  22. package/dist/player/index.d.ts +76 -11
  23. package/dist/player/index.js +412 -51
  24. package/dist/player/index.js.map +1 -1
  25. package/dist/{schedule-BaovCtmf.d.ts → schedule-BUopqmWm.d.ts} +27 -1
  26. package/dist/{schedule-CU-VECDH.d.cts → schedule-IBu8lr-3.d.cts} +27 -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 +145 -6
  33. package/dist/viewer/index.cjs.map +1 -1
  34. package/dist/viewer/index.d.cts +21 -4
  35. package/dist/viewer/index.d.ts +21 -4
  36. package/dist/viewer/index.js +145 -7
  37. package/dist/viewer/index.js.map +1 -1
  38. package/package.json +1 -1
  39. package/dist/chunk-SEN266BY.js.map +0 -1
@@ -1,13 +1,25 @@
1
1
  import { S as Swaralipi, T as Taal, O as Octave, a as SvaraLetter, N as Note } from '../schema-Cf_epUIC.cjs';
2
2
  import { a as LaySpeeds, T as TaalId } from '../lay-CfDlPhH2.cjs';
3
3
  export { b as LAYS, c as LAY_SPEEDS, L as Lay, p as printedLay, r as resolveLaySpeeds, d as rowLay } from '../lay-CfDlPhH2.cjs';
4
- import { I as InstrumentId, a as InstrumentDef, S as Schedule, D as DrumVoice, T as TempoSegment } from '../schedule-CU-VECDH.cjs';
5
- export { A as ARC_RAW_RE, b as DEFAULT_SOUNDS_BASE, c as DRUM_KIT_BASE, G as GRACE_STEP, d as GlideLeg, e as INSTRUMENTS, M as MEEND_HOLD, P as PlayEvent, f as SALAMANDER_BASE, g as SAMPLED_TAALS, h as ScheduleOptions, i as TABLA_BPMS, j as TABLA_VARIATIONS, k as TONEJS_INSTRUMENTS_BASE, l as ToneModule, m as buildSchedule, n as createBuffers, o as drumPattern, p as glideTargets, q as graceTouches, r as instrumentSampleUrl, s as isArcRaw, t as meendContinuations, u as nearestSampleKey, v as nearestTablaBpm, w as normalizeBase, x as probeUrl, y as quantizeLoopEnd, z as santoorUrls, B as subsetUrls, C as tablaBpms, E as tablaUrl, F as triggerGlide } from '../schedule-CU-VECDH.cjs';
4
+ import { I as InstrumentId, a as InstrumentDef, S as Schedule, D as DrumVoice, T as TempoSegment } from '../schedule-IBu8lr-3.cjs';
5
+ export { A as ARC_RAW_RE, b as DEFAULT_SOUNDS_BASE, c as DRUM_KIT_BASE, G as GRACE_STEP, d as GlideLeg, e as INSTRUMENTS, L as Line, M as MEEND_HOLD, P as PlayEvent, f as SALAMANDER_BASE, g as SAMPLED_TAALS, h as ScheduleOptions, i as TABLA_BPMS, j as TABLA_VARIATIONS, k as TONEJS_INSTRUMENTS_BASE, l as ToneModule, m as buildSchedule, n as createBuffers, o as drumPattern, p as eventAt, q as glideTargets, r as graceTouches, s as instrumentSampleUrl, t as isArcRaw, u as meendContinuations, v as nearestSampleKey, w as nearestTablaBpm, x as normalizeBase, y as probeUrl, z as quantizeLoopEnd, B as santoorUrls, C as scheduleLines, E as subsetUrls, F as tablaBpms, H as tablaUrl, J as triggerGlide } from '../schedule-IBu8lr-3.cjs';
6
6
  import 'zod';
7
7
  import 'tone';
8
8
 
9
9
  type PlayerState = 'idle' | 'loading' | 'ready' | 'playing' | 'paused';
10
10
  type RhythmMode = 'tabla' | 'drums' | 'metronome' | 'none';
11
+ /** Repeated lines, as `part.row` paths (the viewer's `data-row`), inclusive. */
12
+ interface LineRange {
13
+ from: string;
14
+ to: string;
15
+ }
16
+ /** What the practice controls show: the repeated lines, whether the learner
17
+ * sings each pass back, and whether the pass now sounding is theirs. */
18
+ interface PracticeState {
19
+ loop: LineRange | null;
20
+ echo: boolean;
21
+ yourTurn: boolean;
22
+ }
11
23
  interface PlayerOptions {
12
24
  /** Base URL for the project's samples (santoor/tabla/tanpura/metronome).
13
25
  * Defaults to `DEFAULT_SOUNDS_BASE` (the project's CORS-enabled CDN), so the
@@ -52,8 +64,12 @@ interface PlayerOptions {
52
64
  /** Called when the preview cap stops playback (so the consumer can show an
53
65
  * upsell). Not called on a normal stop()/end. */
54
66
  onLimit?: () => void;
55
- /** Called with the active note's `part.row.note` path, or null when idle. */
56
- onHighlight?: (path: string | null) => void;
67
+ /** Called with the active note's `part.row.note` path, or null when idle.
68
+ * `yourTurn` is true while the melody is silent for the learner to sing
69
+ * (see `setEcho`): the note is where they should be, not what is sounding. */
70
+ onHighlight?: (path: string | null, yourTurn?: boolean) => void;
71
+ /** Called whenever the repeat, the sing-back or the learner's turn changes. */
72
+ onLoop?: (state: PracticeState) => void;
57
73
  /** The same path, but fired on the AUDIO clock — Tone's worker ticker, the one
58
74
  * that fires the notes themselves — so it keeps arriving while the page is
59
75
  * hidden. `onHighlight` cannot: it runs on Tone.Draw, i.e.
@@ -74,8 +90,10 @@ interface PlayerOptions {
74
90
  * dependency on the viewer module). `highlight` returns the highlighted node
75
91
  * (or null) so bindSheet can optionally scroll it into view. */
76
92
  interface HighlightTarget {
77
- highlight(path: string): HTMLElement | null;
93
+ highlight(path: string, yourTurn?: boolean): HTMLElement | null;
78
94
  clearHighlights(): void;
95
+ /** Shade the repeated lines, and mark the learner's turn on them. */
96
+ markLoop?(loop: LineRange | null, yourTurn: boolean): void;
79
97
  }
80
98
  interface BindSheetOptions {
81
99
  /** Keep the active note visible while playing by calling `scrollIntoView`
@@ -112,6 +130,12 @@ declare class SwaralipiPlayer {
112
130
  /** Seconds played so far, off the Transport's own clock — so it holds while
113
131
  * paused, and reads 0 before the first play and after stop(). */
114
132
  get positionSec(): number;
133
+ /** The note last played or sought (`part.row.note`), or null. */
134
+ get cursor(): string | null;
135
+ /** The repeated lines, or null. */
136
+ get loop(): LineRange | null;
137
+ /** Whether each repeat is followed by a silent pass for the learner. */
138
+ get echo(): boolean;
115
139
  /** Set the document to play. Stops any current playback. */
116
140
  load(doc: Swaralipi): void;
117
141
  /**
@@ -123,11 +147,42 @@ declare class SwaralipiPlayer {
123
147
  * `variation` picks a tabla loop variation. Stops any current playback.
124
148
  */
125
149
  loadTaal(taal: Taal): void;
126
- /** Start (or resume) playback. Must be triggered from a user gesture so the
127
- * browser permits `AudioContext` resume. */
128
- play(): Promise<void>;
150
+ /** Start (or resume) playback — from `from` (`part.row.note`, or `part.row`
151
+ * for a line's start) when given, which also jumps there mid-play. Must be
152
+ * triggered from a user gesture so the browser permits `AudioContext`
153
+ * resume. */
154
+ play(from?: string): Promise<void>;
129
155
  /** Pause; `play()` resumes from the same position. */
130
156
  pause(): void;
157
+ /**
158
+ * Move the playhead to `path` (`part.row.note`, or `part.row` for a line's
159
+ * start). Playing, it jumps and keeps playing; paused or stopped, the next
160
+ * `play()` starts there. A repeat follows the playhead: seeking outside the
161
+ * repeated lines moves the repeat to the new line.
162
+ */
163
+ seek(path: string): void;
164
+ /**
165
+ * Repeat lines `from`..`to` (`part.row`, either order, inclusive; `to`
166
+ * defaults to `from`). With no argument, the line under the playhead.
167
+ * `null` stops repeating, and ends the sing-back with it. A playhead
168
+ * outside the new repeat moves to its start; live while playing.
169
+ */
170
+ setLoop(from?: string | null, to?: string): void;
171
+ /**
172
+ * Follow every pass of the repeat with a silent one: the tabla and tanpura
173
+ * keep time and the highlight keeps moving, but the melody rests so the
174
+ * learner can sing the line back — the teacher sings, the student answers.
175
+ * Turning it on with nothing repeating repeats the current line.
176
+ */
177
+ setEcho(on: boolean): void;
178
+ /**
179
+ * Move by whole lines. Like a player's previous-track button, a step back
180
+ * from more than a matra into the line restarts that line first.
181
+ * `±Infinity` goes to the first / last line.
182
+ */
183
+ stepLine(delta: number): void;
184
+ /** Move by single notes (rests and holds included — each is a column). */
185
+ stepNote(delta: number): void;
131
186
  /**
132
187
  * Stop and rewind to the start. When sounding, the accompaniment (tabla /
133
188
  * metronome / tanpura, which otherwise loop) is gently faded out over
@@ -144,8 +199,18 @@ declare class SwaralipiPlayer {
144
199
  setTanpura(on: boolean): void;
145
200
  /** Override the taal (null restores auto-detection from `meta.taal`). */
146
201
  setTaal(id: TaalId | null): void;
147
- /** Wire highlight output to a `<swaralipi-sheet>` (or any highlight target).
148
- * Pass `{ autoScroll }` to keep the active note in view while playing. */
202
+ /**
203
+ * Wire highlight output to a `<swaralipi-sheet>` (or any highlight target).
204
+ * Pass `{ autoScroll }` to keep the active note in view while playing.
205
+ *
206
+ * A sheet element also becomes the practice surface: a tap on a line plays
207
+ * from the note under it (Shift stretches the repeat to that line), and
208
+ * while it has focus — only then, so no key is taken from the page — Space
209
+ * plays/pauses, ↑/↓ move by line, ←/→ by note, Home/End jump to the first /
210
+ * last line, R repeats the line, T turns sing-back on/off, Esc stops the
211
+ * repeat and Shift+↑/↓ stretch it. To gate a tap-to-play (a play quota, say),
212
+ * `preventDefault()` its `swaralipi-seek` event in a capturing listener.
213
+ */
149
214
  bindSheet(target: HighlightTarget, opts?: BindSheetOptions): void;
150
215
  /**
151
216
  * Check whether an instrument's samples are reachable (its CDN is up / the
@@ -342,4 +407,4 @@ declare function sampleFileName(midi: number): string;
342
407
  */
343
408
  declare function sCurve(x: number, steepness?: number): number;
344
409
 
345
- export { type AudioExportOptions, type AudioExportResult, type AudioFormat, type BindSheetOptions, DrumVoice, InstrumentDef, InstrumentId, LaySpeeds, type MidiExportOptions, type MidiExportResult, OCTAVE_OFFSET, type PlayerOptions, type PlayerState, type RhythmMode, SHUDDHA, Schedule, SwaralipiPlayer, TempoSegment, encodeMidi, encodeMp3, encodeWav, exportAudio, exportMidi, midiToSampleName, parseTonic, sCurve, sampleFileName, svaraSemitone, svaraToMidi };
410
+ export { type AudioExportOptions, type AudioExportResult, type AudioFormat, type BindSheetOptions, DrumVoice, InstrumentDef, InstrumentId, LaySpeeds, type LineRange, type MidiExportOptions, type MidiExportResult, OCTAVE_OFFSET, type PlayerOptions, type PlayerState, type PracticeState, type RhythmMode, SHUDDHA, Schedule, SwaralipiPlayer, TempoSegment, encodeMidi, encodeMp3, encodeWav, exportAudio, exportMidi, midiToSampleName, parseTonic, sCurve, sampleFileName, svaraSemitone, svaraToMidi };
@@ -1,13 +1,25 @@
1
1
  import { S as Swaralipi, T as Taal, O as Octave, a as SvaraLetter, N as Note } from '../schema-Cf_epUIC.js';
2
2
  import { a as LaySpeeds, T as TaalId } from '../lay-CZIzR9cM.js';
3
3
  export { b as LAYS, c as LAY_SPEEDS, L as Lay, p as printedLay, r as resolveLaySpeeds, d as rowLay } from '../lay-CZIzR9cM.js';
4
- import { I as InstrumentId, a as InstrumentDef, S as Schedule, D as DrumVoice, T as TempoSegment } from '../schedule-BaovCtmf.js';
5
- export { A as ARC_RAW_RE, b as DEFAULT_SOUNDS_BASE, c as DRUM_KIT_BASE, G as GRACE_STEP, d as GlideLeg, e as INSTRUMENTS, M as MEEND_HOLD, P as PlayEvent, f as SALAMANDER_BASE, g as SAMPLED_TAALS, h as ScheduleOptions, i as TABLA_BPMS, j as TABLA_VARIATIONS, k as TONEJS_INSTRUMENTS_BASE, l as ToneModule, m as buildSchedule, n as createBuffers, o as drumPattern, p as glideTargets, q as graceTouches, r as instrumentSampleUrl, s as isArcRaw, t as meendContinuations, u as nearestSampleKey, v as nearestTablaBpm, w as normalizeBase, x as probeUrl, y as quantizeLoopEnd, z as santoorUrls, B as subsetUrls, C as tablaBpms, E as tablaUrl, F as triggerGlide } from '../schedule-BaovCtmf.js';
4
+ import { I as InstrumentId, a as InstrumentDef, S as Schedule, D as DrumVoice, T as TempoSegment } from '../schedule-BUopqmWm.js';
5
+ export { A as ARC_RAW_RE, b as DEFAULT_SOUNDS_BASE, c as DRUM_KIT_BASE, G as GRACE_STEP, d as GlideLeg, e as INSTRUMENTS, L as Line, M as MEEND_HOLD, P as PlayEvent, f as SALAMANDER_BASE, g as SAMPLED_TAALS, h as ScheduleOptions, i as TABLA_BPMS, j as TABLA_VARIATIONS, k as TONEJS_INSTRUMENTS_BASE, l as ToneModule, m as buildSchedule, n as createBuffers, o as drumPattern, p as eventAt, q as glideTargets, r as graceTouches, s as instrumentSampleUrl, t as isArcRaw, u as meendContinuations, v as nearestSampleKey, w as nearestTablaBpm, x as normalizeBase, y as probeUrl, z as quantizeLoopEnd, B as santoorUrls, C as scheduleLines, E as subsetUrls, F as tablaBpms, H as tablaUrl, J as triggerGlide } from '../schedule-BUopqmWm.js';
6
6
  import 'zod';
7
7
  import 'tone';
8
8
 
9
9
  type PlayerState = 'idle' | 'loading' | 'ready' | 'playing' | 'paused';
10
10
  type RhythmMode = 'tabla' | 'drums' | 'metronome' | 'none';
11
+ /** Repeated lines, as `part.row` paths (the viewer's `data-row`), inclusive. */
12
+ interface LineRange {
13
+ from: string;
14
+ to: string;
15
+ }
16
+ /** What the practice controls show: the repeated lines, whether the learner
17
+ * sings each pass back, and whether the pass now sounding is theirs. */
18
+ interface PracticeState {
19
+ loop: LineRange | null;
20
+ echo: boolean;
21
+ yourTurn: boolean;
22
+ }
11
23
  interface PlayerOptions {
12
24
  /** Base URL for the project's samples (santoor/tabla/tanpura/metronome).
13
25
  * Defaults to `DEFAULT_SOUNDS_BASE` (the project's CORS-enabled CDN), so the
@@ -52,8 +64,12 @@ interface PlayerOptions {
52
64
  /** Called when the preview cap stops playback (so the consumer can show an
53
65
  * upsell). Not called on a normal stop()/end. */
54
66
  onLimit?: () => void;
55
- /** Called with the active note's `part.row.note` path, or null when idle. */
56
- onHighlight?: (path: string | null) => void;
67
+ /** Called with the active note's `part.row.note` path, or null when idle.
68
+ * `yourTurn` is true while the melody is silent for the learner to sing
69
+ * (see `setEcho`): the note is where they should be, not what is sounding. */
70
+ onHighlight?: (path: string | null, yourTurn?: boolean) => void;
71
+ /** Called whenever the repeat, the sing-back or the learner's turn changes. */
72
+ onLoop?: (state: PracticeState) => void;
57
73
  /** The same path, but fired on the AUDIO clock — Tone's worker ticker, the one
58
74
  * that fires the notes themselves — so it keeps arriving while the page is
59
75
  * hidden. `onHighlight` cannot: it runs on Tone.Draw, i.e.
@@ -74,8 +90,10 @@ interface PlayerOptions {
74
90
  * dependency on the viewer module). `highlight` returns the highlighted node
75
91
  * (or null) so bindSheet can optionally scroll it into view. */
76
92
  interface HighlightTarget {
77
- highlight(path: string): HTMLElement | null;
93
+ highlight(path: string, yourTurn?: boolean): HTMLElement | null;
78
94
  clearHighlights(): void;
95
+ /** Shade the repeated lines, and mark the learner's turn on them. */
96
+ markLoop?(loop: LineRange | null, yourTurn: boolean): void;
79
97
  }
80
98
  interface BindSheetOptions {
81
99
  /** Keep the active note visible while playing by calling `scrollIntoView`
@@ -112,6 +130,12 @@ declare class SwaralipiPlayer {
112
130
  /** Seconds played so far, off the Transport's own clock — so it holds while
113
131
  * paused, and reads 0 before the first play and after stop(). */
114
132
  get positionSec(): number;
133
+ /** The note last played or sought (`part.row.note`), or null. */
134
+ get cursor(): string | null;
135
+ /** The repeated lines, or null. */
136
+ get loop(): LineRange | null;
137
+ /** Whether each repeat is followed by a silent pass for the learner. */
138
+ get echo(): boolean;
115
139
  /** Set the document to play. Stops any current playback. */
116
140
  load(doc: Swaralipi): void;
117
141
  /**
@@ -123,11 +147,42 @@ declare class SwaralipiPlayer {
123
147
  * `variation` picks a tabla loop variation. Stops any current playback.
124
148
  */
125
149
  loadTaal(taal: Taal): void;
126
- /** Start (or resume) playback. Must be triggered from a user gesture so the
127
- * browser permits `AudioContext` resume. */
128
- play(): Promise<void>;
150
+ /** Start (or resume) playback — from `from` (`part.row.note`, or `part.row`
151
+ * for a line's start) when given, which also jumps there mid-play. Must be
152
+ * triggered from a user gesture so the browser permits `AudioContext`
153
+ * resume. */
154
+ play(from?: string): Promise<void>;
129
155
  /** Pause; `play()` resumes from the same position. */
130
156
  pause(): void;
157
+ /**
158
+ * Move the playhead to `path` (`part.row.note`, or `part.row` for a line's
159
+ * start). Playing, it jumps and keeps playing; paused or stopped, the next
160
+ * `play()` starts there. A repeat follows the playhead: seeking outside the
161
+ * repeated lines moves the repeat to the new line.
162
+ */
163
+ seek(path: string): void;
164
+ /**
165
+ * Repeat lines `from`..`to` (`part.row`, either order, inclusive; `to`
166
+ * defaults to `from`). With no argument, the line under the playhead.
167
+ * `null` stops repeating, and ends the sing-back with it. A playhead
168
+ * outside the new repeat moves to its start; live while playing.
169
+ */
170
+ setLoop(from?: string | null, to?: string): void;
171
+ /**
172
+ * Follow every pass of the repeat with a silent one: the tabla and tanpura
173
+ * keep time and the highlight keeps moving, but the melody rests so the
174
+ * learner can sing the line back — the teacher sings, the student answers.
175
+ * Turning it on with nothing repeating repeats the current line.
176
+ */
177
+ setEcho(on: boolean): void;
178
+ /**
179
+ * Move by whole lines. Like a player's previous-track button, a step back
180
+ * from more than a matra into the line restarts that line first.
181
+ * `±Infinity` goes to the first / last line.
182
+ */
183
+ stepLine(delta: number): void;
184
+ /** Move by single notes (rests and holds included — each is a column). */
185
+ stepNote(delta: number): void;
131
186
  /**
132
187
  * Stop and rewind to the start. When sounding, the accompaniment (tabla /
133
188
  * metronome / tanpura, which otherwise loop) is gently faded out over
@@ -144,8 +199,18 @@ declare class SwaralipiPlayer {
144
199
  setTanpura(on: boolean): void;
145
200
  /** Override the taal (null restores auto-detection from `meta.taal`). */
146
201
  setTaal(id: TaalId | null): void;
147
- /** Wire highlight output to a `<swaralipi-sheet>` (or any highlight target).
148
- * Pass `{ autoScroll }` to keep the active note in view while playing. */
202
+ /**
203
+ * Wire highlight output to a `<swaralipi-sheet>` (or any highlight target).
204
+ * Pass `{ autoScroll }` to keep the active note in view while playing.
205
+ *
206
+ * A sheet element also becomes the practice surface: a tap on a line plays
207
+ * from the note under it (Shift stretches the repeat to that line), and
208
+ * while it has focus — only then, so no key is taken from the page — Space
209
+ * plays/pauses, ↑/↓ move by line, ←/→ by note, Home/End jump to the first /
210
+ * last line, R repeats the line, T turns sing-back on/off, Esc stops the
211
+ * repeat and Shift+↑/↓ stretch it. To gate a tap-to-play (a play quota, say),
212
+ * `preventDefault()` its `swaralipi-seek` event in a capturing listener.
213
+ */
149
214
  bindSheet(target: HighlightTarget, opts?: BindSheetOptions): void;
150
215
  /**
151
216
  * Check whether an instrument's samples are reachable (its CDN is up / the
@@ -342,4 +407,4 @@ declare function sampleFileName(midi: number): string;
342
407
  */
343
408
  declare function sCurve(x: number, steepness?: number): number;
344
409
 
345
- export { type AudioExportOptions, type AudioExportResult, type AudioFormat, type BindSheetOptions, DrumVoice, InstrumentDef, InstrumentId, LaySpeeds, type MidiExportOptions, type MidiExportResult, OCTAVE_OFFSET, type PlayerOptions, type PlayerState, type RhythmMode, SHUDDHA, Schedule, SwaralipiPlayer, TempoSegment, encodeMidi, encodeMp3, encodeWav, exportAudio, exportMidi, midiToSampleName, parseTonic, sCurve, sampleFileName, svaraSemitone, svaraToMidi };
410
+ export { type AudioExportOptions, type AudioExportResult, type AudioFormat, type BindSheetOptions, DrumVoice, InstrumentDef, InstrumentId, LaySpeeds, type LineRange, type MidiExportOptions, type MidiExportResult, OCTAVE_OFFSET, type PlayerOptions, type PlayerState, type PracticeState, type RhythmMode, SHUDDHA, Schedule, SwaralipiPlayer, TempoSegment, encodeMidi, encodeMp3, encodeWav, exportAudio, exportMidi, midiToSampleName, parseTonic, sCurve, sampleFileName, svaraSemitone, svaraToMidi };