@sudobility/music_player 0.1.0 → 0.1.2

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 (159) hide show
  1. package/CLAUDE.md +335 -0
  2. package/dist/core.d.ts +33 -0
  3. package/dist/core.d.ts.map +1 -0
  4. package/dist/core.js +33 -0
  5. package/dist/core.js.map +1 -0
  6. package/dist/engine.d.ts +103 -0
  7. package/dist/engine.d.ts.map +1 -0
  8. package/dist/engine.js +2 -0
  9. package/dist/engine.js.map +1 -0
  10. package/dist/mocks/index.d.ts +46 -0
  11. package/dist/mocks/index.d.ts.map +1 -0
  12. package/dist/mocks/index.js +93 -0
  13. package/dist/mocks/index.js.map +1 -0
  14. package/dist/player.d.ts +81 -0
  15. package/dist/player.d.ts.map +1 -0
  16. package/dist/player.js +209 -0
  17. package/dist/player.js.map +1 -0
  18. package/dist/rn/audio/offline-render.d.ts +29 -0
  19. package/dist/rn/audio/offline-render.d.ts.map +1 -0
  20. package/dist/rn/audio/offline-render.js +134 -0
  21. package/dist/rn/audio/offline-render.js.map +1 -0
  22. package/dist/rn/index.d.ts +50 -0
  23. package/dist/rn/index.d.ts.map +1 -0
  24. package/dist/rn/index.js +39 -0
  25. package/dist/rn/index.js.map +1 -0
  26. package/dist/rn/playback/audio-api.d.ts +93 -0
  27. package/dist/rn/playback/audio-api.d.ts.map +1 -0
  28. package/dist/rn/playback/audio-api.js +24 -0
  29. package/dist/rn/playback/audio-api.js.map +1 -0
  30. package/dist/rn/playback/expression-table.d.ts +22 -0
  31. package/dist/rn/playback/expression-table.d.ts.map +1 -0
  32. package/dist/rn/playback/expression-table.js +926 -0
  33. package/dist/rn/playback/expression-table.js.map +1 -0
  34. package/dist/rn/playback/expression.d.ts +48 -0
  35. package/dist/rn/playback/expression.d.ts.map +1 -0
  36. package/dist/rn/playback/expression.js +120 -0
  37. package/dist/rn/playback/expression.js.map +1 -0
  38. package/dist/rn/playback/gm-pack-name.d.ts +40 -0
  39. package/dist/rn/playback/gm-pack-name.d.ts.map +1 -0
  40. package/dist/rn/playback/gm-pack-name.js +61 -0
  41. package/dist/rn/playback/gm-pack-name.js.map +1 -0
  42. package/dist/rn/playback/pack-library.d.ts +44 -0
  43. package/dist/rn/playback/pack-library.d.ts.map +1 -0
  44. package/dist/rn/playback/pack-library.js +85 -0
  45. package/dist/rn/playback/pack-library.js.map +1 -0
  46. package/dist/rn/playback/pack-names.json +130 -0
  47. package/dist/rn/playback/sample-engine.d.ts +216 -0
  48. package/dist/rn/playback/sample-engine.d.ts.map +1 -0
  49. package/dist/rn/playback/sample-engine.js +669 -0
  50. package/dist/rn/playback/sample-engine.js.map +1 -0
  51. package/dist/rn/playback/sample-pack.d.ts +71 -0
  52. package/dist/rn/playback/sample-pack.d.ts.map +1 -0
  53. package/dist/rn/playback/sample-pack.js +112 -0
  54. package/dist/rn/playback/sample-pack.js.map +1 -0
  55. package/dist/rn/playback/sustain-loop.d.ts +24 -0
  56. package/dist/rn/playback/sustain-loop.d.ts.map +1 -0
  57. package/dist/rn/playback/sustain-loop.js +111 -0
  58. package/dist/rn/playback/sustain-loop.js.map +1 -0
  59. package/dist/rn/playback/voice-plan.d.ts +60 -0
  60. package/dist/rn/playback/voice-plan.d.ts.map +1 -0
  61. package/dist/rn/playback/voice-plan.js +38 -0
  62. package/dist/rn/playback/voice-plan.js.map +1 -0
  63. package/dist/shared/bus.d.ts +73 -0
  64. package/dist/shared/bus.d.ts.map +1 -0
  65. package/dist/shared/bus.js +83 -0
  66. package/dist/shared/bus.js.map +1 -0
  67. package/dist/shared/midi.d.ts +18 -0
  68. package/dist/shared/midi.d.ts.map +1 -0
  69. package/dist/shared/midi.js +25 -0
  70. package/dist/shared/midi.js.map +1 -0
  71. package/dist/shared/mix.d.ts +75 -0
  72. package/dist/shared/mix.d.ts.map +1 -0
  73. package/dist/shared/mix.js +115 -0
  74. package/dist/shared/mix.js.map +1 -0
  75. package/dist/shared/note-queue.d.ts +43 -0
  76. package/dist/shared/note-queue.d.ts.map +1 -0
  77. package/dist/shared/note-queue.js +54 -0
  78. package/dist/shared/note-queue.js.map +1 -0
  79. package/dist/shared/plan.d.ts +34 -0
  80. package/dist/shared/plan.d.ts.map +1 -0
  81. package/dist/shared/plan.js +134 -0
  82. package/dist/shared/plan.js.map +1 -0
  83. package/dist/shared/pump-window.d.ts +38 -0
  84. package/dist/shared/pump-window.d.ts.map +1 -0
  85. package/dist/shared/pump-window.js +13 -0
  86. package/dist/shared/pump-window.js.map +1 -0
  87. package/dist/shared/render-events.d.ts +25 -0
  88. package/dist/shared/render-events.d.ts.map +1 -0
  89. package/dist/shared/render-events.js +79 -0
  90. package/dist/shared/render-events.js.map +1 -0
  91. package/dist/shared/sounding-set.d.ts +45 -0
  92. package/dist/shared/sounding-set.d.ts.map +1 -0
  93. package/dist/shared/sounding-set.js +81 -0
  94. package/dist/shared/sounding-set.js.map +1 -0
  95. package/dist/shared/test-plan.d.ts +36 -0
  96. package/dist/shared/test-plan.d.ts.map +1 -0
  97. package/dist/shared/test-plan.js +83 -0
  98. package/dist/shared/test-plan.js.map +1 -0
  99. package/dist/singleton.d.ts +23 -0
  100. package/dist/singleton.d.ts.map +1 -0
  101. package/dist/singleton.js +26 -0
  102. package/dist/singleton.js.map +1 -0
  103. package/dist/types.d.ts +84 -0
  104. package/dist/types.d.ts.map +1 -0
  105. package/dist/types.js +2 -0
  106. package/dist/types.js.map +1 -0
  107. package/dist/web/audio/offline-synth.d.ts +24 -0
  108. package/dist/web/audio/offline-synth.d.ts.map +1 -0
  109. package/dist/web/audio/offline-synth.js +92 -0
  110. package/dist/web/audio/offline-synth.js.map +1 -0
  111. package/dist/web/audio/soundfont-render.d.ts +31 -0
  112. package/dist/web/audio/soundfont-render.d.ts.map +1 -0
  113. package/dist/web/audio/soundfont-render.js +130 -0
  114. package/dist/web/audio/soundfont-render.js.map +1 -0
  115. package/dist/web/audio/synth-types.d.ts +24 -0
  116. package/dist/web/audio/synth-types.d.ts.map +1 -0
  117. package/dist/web/audio/synth-types.js +2 -0
  118. package/dist/web/audio/synth-types.js.map +1 -0
  119. package/dist/web/index.d.ts +40 -0
  120. package/dist/web/index.d.ts.map +1 -0
  121. package/dist/web/index.js +59 -0
  122. package/dist/web/index.js.map +1 -0
  123. package/dist/web/playback/channel-allocator.d.ts +54 -0
  124. package/dist/web/playback/channel-allocator.d.ts.map +1 -0
  125. package/dist/web/playback/channel-allocator.js +72 -0
  126. package/dist/web/playback/channel-allocator.js.map +1 -0
  127. package/dist/web/playback/click.d.ts +9 -0
  128. package/dist/web/playback/click.d.ts.map +1 -0
  129. package/dist/web/playback/click.js +61 -0
  130. package/dist/web/playback/click.js.map +1 -0
  131. package/dist/web/playback/clock.d.ts +36 -0
  132. package/dist/web/playback/clock.d.ts.map +1 -0
  133. package/dist/web/playback/clock.js +64 -0
  134. package/dist/web/playback/clock.js.map +1 -0
  135. package/dist/web/playback/governor.d.ts +45 -0
  136. package/dist/web/playback/governor.d.ts.map +1 -0
  137. package/dist/web/playback/governor.js +33 -0
  138. package/dist/web/playback/governor.js.map +1 -0
  139. package/dist/web/playback/quiet-stub-notices.d.ts +55 -0
  140. package/dist/web/playback/quiet-stub-notices.d.ts.map +1 -0
  141. package/dist/web/playback/quiet-stub-notices.js +93 -0
  142. package/dist/web/playback/quiet-stub-notices.js.map +1 -0
  143. package/dist/web/playback/soundfont-engine.d.ts +281 -0
  144. package/dist/web/playback/soundfont-engine.d.ts.map +1 -0
  145. package/dist/web/playback/soundfont-engine.js +735 -0
  146. package/dist/web/playback/soundfont-engine.js.map +1 -0
  147. package/dist/web/playback/soundfont-loader.d.ts +30 -0
  148. package/dist/web/playback/soundfont-loader.d.ts.map +1 -0
  149. package/dist/web/playback/soundfont-loader.js +68 -0
  150. package/dist/web/playback/soundfont-loader.js.map +1 -0
  151. package/dist/web/playback/synth-host.d.ts +142 -0
  152. package/dist/web/playback/synth-host.d.ts.map +1 -0
  153. package/dist/web/playback/synth-host.js +293 -0
  154. package/dist/web/playback/synth-host.js.map +1 -0
  155. package/package.json +18 -3
  156. package/dist/index.d.ts +0 -14
  157. package/dist/index.d.ts.map +0 -1
  158. package/dist/index.js +0 -2
  159. package/dist/index.js.map +0 -1
@@ -0,0 +1,216 @@
1
+ /**
2
+ * React Native playback: FluidR3, played from samples.
3
+ *
4
+ * The web engine runs libfluidsynth (WebAssembly) inside an `AudioWorklet`.
5
+ * React Native has neither — `react-native-audio-api` exposes no `addModule`
6
+ * and Hermes has no WebAssembly — so that engine cannot be ported, only
7
+ * replaced. See `spikes/rn-sample-playback.md`.
8
+ *
9
+ * What it is replaced with is **the same soundfont**, pre-rendered. Benjamin
10
+ * Gleitzman's packs are per-note recordings taken from `FluidR3_GM.sf2`, the
11
+ * font the web engine plays as `FluidR3Mono_GM.sf3`. Every one of the 128 GM
12
+ * programs is covered, at every key from A0 to C8, so a note here is the same
13
+ * recording the browser plays rather than an approximation of it. That
14
+ * distinction is the whole reason this engine exists: the RN engine that was
15
+ * deleted synthesised its own instruments from oscillators and could never
16
+ * match the web, and a wrong sound is worse than a clear error.
17
+ *
18
+ * What is *not* reproduced is SF2's per-zone filtering, LFOs and modulator
19
+ * envelopes — fluidsynth applies those live and a pre-rendered sample cannot.
20
+ * In practice that costs some expressive variation, not the instrument's
21
+ * identity.
22
+ *
23
+ * The transport half — flattening a score, the note cursor, the dispatch
24
+ * window, the master trim — is `shared/playback/`, the same code the web
25
+ * engine runs. This file is only the part that turns a due note into sound.
26
+ *
27
+ * It deliberately does *not* reuse `SoundfontPlaybackEngine`'s pump by
28
+ * refactoring it behind a synth port. That engine is verified on real devices
29
+ * and this one cannot be until it runs on a phone; destabilising the working
30
+ * one to serve the unproven one is the wrong order. Once this is device-tested,
31
+ * merging the two transports is the obvious follow-up.
32
+ */
33
+ import type { PlaybackPlan, PlaybackTrack, ScoreRange } from '@sudobility/music_types';
34
+ import type { AuditionVoice, PlaybackEngine, PlaybackObserver } from '../../engine.js';
35
+ export { base64ToBytes } from './pack-library.js';
36
+ import type { AudioApi } from './audio-api.js';
37
+ export type SampleEngineDeps = {
38
+ /** Overridable so tests can drive the engine with a fake audio graph. */
39
+ loadAudioApi?: () => Promise<AudioApi>;
40
+ /** Fetches a pack body. Overridable for tests and for self-hosting. */
41
+ fetchPack?: (url: string) => Promise<string>;
42
+ /** Base URL for the melodic packs. An app may host its own copy; they are CC-BY 3.0. */
43
+ packBase?: string;
44
+ /**
45
+ * Base URL for the drum-kit packs.
46
+ *
47
+ * No default, because there is nowhere to default *to*: no CDN publishes
48
+ * pre-rendered GM percussion under a usable licence, so these are rendered
49
+ * by `scripts/build-percussion-packs.mjs` and hosted by the app alongside
50
+ * its other audio assets. An app with percussion in its scores must set this.
51
+ */
52
+ percussionBase?: string;
53
+ /** Overridable so tests can step the pump by hand instead of waiting. */
54
+ startPump?: (tick: () => void, intervalMs: number) => () => void;
55
+ };
56
+ export declare class RNSamplePlaybackEngine implements PlaybackEngine {
57
+ private readonly deps;
58
+ private api;
59
+ private ctx;
60
+ private master;
61
+ private plan;
62
+ private tempo;
63
+ private readonly queue;
64
+ private clicks;
65
+ private clickCursor;
66
+ private library;
67
+ private observer;
68
+ private state;
69
+ private loadState;
70
+ private stopPump;
71
+ private stopPositionTimer;
72
+ /** Context time corresponding to `originTick`. */
73
+ private originContextTime;
74
+ private originTick;
75
+ private positionTick;
76
+ private tempoMultiplier;
77
+ private loop;
78
+ private masterVolume;
79
+ private metronomeOn;
80
+ private headroom;
81
+ private readonly muted;
82
+ private readonly soloed;
83
+ /**
84
+ * Volume and pan per track, held apart from `plan` because `applyMix` is
85
+ * allowed to change them without the plan being rebuilt — that is the whole
86
+ * reason it exists.
87
+ */
88
+ private readonly mix;
89
+ private readonly strips;
90
+ private readonly voices;
91
+ /** Clicks already on the graph, so pause and stop can take them back. */
92
+ private readonly pendingClicks;
93
+ private readonly auditioned;
94
+ /**
95
+ * What is sounding, read off the clock rather than off the voice list.
96
+ *
97
+ * Deriving it from the voices lit every note the moment it was *scheduled* —
98
+ * a lookahead early — and held it lit through the release tail, so the
99
+ * notation ran ahead of the sound and lagged behind its end. The web engine
100
+ * has always used this; sharing it is what stops the two drifting.
101
+ */
102
+ private readonly sounding;
103
+ private activeNotes;
104
+ constructor(deps?: SampleEngineDeps);
105
+ initialize(): Promise<void>;
106
+ load(plan: PlaybackPlan): Promise<void>;
107
+ /** The pack name for a track, honouring the percussion/kit distinction. */
108
+ private packNameForTrack;
109
+ /** Loads every pack the score needs, reporting progress across all of them. */
110
+ private ensureScorePacks;
111
+ private reportLoad;
112
+ /**
113
+ * Reports `playing` only once a note can actually sound.
114
+ *
115
+ * The same rule the web engine follows, and for the same reason: the caret
116
+ * dead-reckons from elapsed real time between position reports, so announcing
117
+ * `playing` before the packs are decoded would glide it silently through
118
+ * several bars and snap it back when the music finally started.
119
+ */
120
+ play(fromTick?: number): Promise<void>;
121
+ pause(): void;
122
+ stop(): void;
123
+ seek(tick: number): void;
124
+ private haltPump;
125
+ private setState;
126
+ /** Score tick at the context's current time, from the tempo map and speed. */
127
+ private currentTick;
128
+ private secondsForTick;
129
+ private reportPosition;
130
+ /** The lit set, at the clock's position, and only when it has changed. */
131
+ private reportSounding;
132
+ private pump;
133
+ private drainThrough;
134
+ private tickAtContextTime;
135
+ /** Mute/solo, with solo winning: any solo means everything unsoloed is silent. */
136
+ private audibleTrack;
137
+ private startNote;
138
+ /**
139
+ * The track's gain-and-pan pair, built on first use.
140
+ *
141
+ * Lazily, because a plan can be loaded before there is an audio context to
142
+ * build nodes in — `load` does not await `initialize`.
143
+ */
144
+ private stripFor;
145
+ /** Volume, pan, mute and solo, resolved onto one track's strip. */
146
+ private applyStrip;
147
+ /** Pushes the whole mix, for a fader move or a mute that must land at once. */
148
+ private applyAllStrips;
149
+ private releaseStrips;
150
+ private applyMasterGain;
151
+ /**
152
+ * One voice: source -> [low-pass] -> gain -> master.
153
+ *
154
+ * The filter is only built when this velocity actually calls for one (71 of
155
+ * the 128 instruments never do), because a node per voice is real cost in a
156
+ * dense passage.
157
+ */
158
+ private buildVoiceFromPlan;
159
+ /** The flat-envelope form, for the metronome and for auditioning a key. */
160
+ private buildVoice;
161
+ /**
162
+ * Drops voices whose release has finished.
163
+ *
164
+ * Nothing about the *lit* set any more — that comes off the clock. A voice
165
+ * outlives its written note by the instrument's release, which is exactly
166
+ * the discrepancy that made deriving the lit set from here wrong.
167
+ */
168
+ private reapVoices;
169
+ private setActiveNotes;
170
+ private stopAllVoices;
171
+ /**
172
+ * Takes back clicks already placed on the graph.
173
+ *
174
+ * An oscillator started with `start(at)` sounds at that moment whatever the
175
+ * transport does next, and a click goes nowhere near a voice — so without
176
+ * this, pausing kept ticking for the length of the lookahead.
177
+ */
178
+ private cancelPendingClicks;
179
+ private scheduleClicks;
180
+ /**
181
+ * A short sine blip. Synthesised rather than sampled because the packs are
182
+ * instruments and carry no click, and a metronome is one of the few sounds
183
+ * where a plain tone is what is wanted anyway.
184
+ */
185
+ private scheduleClick;
186
+ setTempoMultiplier(multiplier: number): void;
187
+ setLoop(range: ScoreRange | null): void;
188
+ setTrackMute(trackId: string, muted: boolean): void;
189
+ setTrackSolo(trackId: string, solo: boolean): void;
190
+ /**
191
+ * Re-reads the mix off the tracks it is handed, scheduling nothing.
192
+ *
193
+ * All four properties, as the interface promises. Volume and pan used to be
194
+ * missing here — the engine had no per-track node to put them on, so a fader
195
+ * moved during playback moved the fader and not the sound, exactly the bug
196
+ * `applyMix` exists to fix on the web side. They land on the track's strip,
197
+ * so they reach notes that are already sounding.
198
+ *
199
+ * A track the engine does not know is still recorded: `load` builds its strip
200
+ * later, reading the level from here.
201
+ */
202
+ applyMix(tracks: readonly PlaybackTrack[]): void;
203
+ setMetronome(enabled: boolean): void;
204
+ setMasterVolume(volume: number): void;
205
+ /**
206
+ * Sounds a pitch now and holds it, touching no transport state — no seek, no
207
+ * state change, no active-note report. Fire-and-forget: the caller is a
208
+ * keypress handler and cannot await a pack download.
209
+ */
210
+ noteOn(midi: number, auditionVoice: AuditionVoice): void;
211
+ private auditionNote;
212
+ noteOff(midi: number): void;
213
+ setObserver(observer: PlaybackObserver | null): void;
214
+ dispose(): void;
215
+ }
216
+ //# sourceMappingURL=sample-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sample-engine.d.ts","sourceRoot":"","sources":["../../../src/rn/playback/sample-engine.ts"],"names":[],"mappings":"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"}