@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.
- package/CLAUDE.md +335 -0
- package/dist/core.d.ts +33 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +33 -0
- package/dist/core.js.map +1 -0
- package/dist/engine.d.ts +103 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +2 -0
- package/dist/engine.js.map +1 -0
- package/dist/mocks/index.d.ts +46 -0
- package/dist/mocks/index.d.ts.map +1 -0
- package/dist/mocks/index.js +93 -0
- package/dist/mocks/index.js.map +1 -0
- package/dist/player.d.ts +81 -0
- package/dist/player.d.ts.map +1 -0
- package/dist/player.js +209 -0
- package/dist/player.js.map +1 -0
- package/dist/rn/audio/offline-render.d.ts +29 -0
- package/dist/rn/audio/offline-render.d.ts.map +1 -0
- package/dist/rn/audio/offline-render.js +134 -0
- package/dist/rn/audio/offline-render.js.map +1 -0
- package/dist/rn/index.d.ts +50 -0
- package/dist/rn/index.d.ts.map +1 -0
- package/dist/rn/index.js +39 -0
- package/dist/rn/index.js.map +1 -0
- package/dist/rn/playback/audio-api.d.ts +93 -0
- package/dist/rn/playback/audio-api.d.ts.map +1 -0
- package/dist/rn/playback/audio-api.js +24 -0
- package/dist/rn/playback/audio-api.js.map +1 -0
- package/dist/rn/playback/expression-table.d.ts +22 -0
- package/dist/rn/playback/expression-table.d.ts.map +1 -0
- package/dist/rn/playback/expression-table.js +926 -0
- package/dist/rn/playback/expression-table.js.map +1 -0
- package/dist/rn/playback/expression.d.ts +48 -0
- package/dist/rn/playback/expression.d.ts.map +1 -0
- package/dist/rn/playback/expression.js +120 -0
- package/dist/rn/playback/expression.js.map +1 -0
- package/dist/rn/playback/gm-pack-name.d.ts +40 -0
- package/dist/rn/playback/gm-pack-name.d.ts.map +1 -0
- package/dist/rn/playback/gm-pack-name.js +61 -0
- package/dist/rn/playback/gm-pack-name.js.map +1 -0
- package/dist/rn/playback/pack-library.d.ts +44 -0
- package/dist/rn/playback/pack-library.d.ts.map +1 -0
- package/dist/rn/playback/pack-library.js +85 -0
- package/dist/rn/playback/pack-library.js.map +1 -0
- package/dist/rn/playback/pack-names.json +130 -0
- package/dist/rn/playback/sample-engine.d.ts +216 -0
- package/dist/rn/playback/sample-engine.d.ts.map +1 -0
- package/dist/rn/playback/sample-engine.js +669 -0
- package/dist/rn/playback/sample-engine.js.map +1 -0
- package/dist/rn/playback/sample-pack.d.ts +71 -0
- package/dist/rn/playback/sample-pack.d.ts.map +1 -0
- package/dist/rn/playback/sample-pack.js +112 -0
- package/dist/rn/playback/sample-pack.js.map +1 -0
- package/dist/rn/playback/sustain-loop.d.ts +24 -0
- package/dist/rn/playback/sustain-loop.d.ts.map +1 -0
- package/dist/rn/playback/sustain-loop.js +111 -0
- package/dist/rn/playback/sustain-loop.js.map +1 -0
- package/dist/rn/playback/voice-plan.d.ts +60 -0
- package/dist/rn/playback/voice-plan.d.ts.map +1 -0
- package/dist/rn/playback/voice-plan.js +38 -0
- package/dist/rn/playback/voice-plan.js.map +1 -0
- package/dist/shared/bus.d.ts +73 -0
- package/dist/shared/bus.d.ts.map +1 -0
- package/dist/shared/bus.js +83 -0
- package/dist/shared/bus.js.map +1 -0
- package/dist/shared/midi.d.ts +18 -0
- package/dist/shared/midi.d.ts.map +1 -0
- package/dist/shared/midi.js +25 -0
- package/dist/shared/midi.js.map +1 -0
- package/dist/shared/mix.d.ts +75 -0
- package/dist/shared/mix.d.ts.map +1 -0
- package/dist/shared/mix.js +115 -0
- package/dist/shared/mix.js.map +1 -0
- package/dist/shared/note-queue.d.ts +43 -0
- package/dist/shared/note-queue.d.ts.map +1 -0
- package/dist/shared/note-queue.js +54 -0
- package/dist/shared/note-queue.js.map +1 -0
- package/dist/shared/plan.d.ts +34 -0
- package/dist/shared/plan.d.ts.map +1 -0
- package/dist/shared/plan.js +134 -0
- package/dist/shared/plan.js.map +1 -0
- package/dist/shared/pump-window.d.ts +38 -0
- package/dist/shared/pump-window.d.ts.map +1 -0
- package/dist/shared/pump-window.js +13 -0
- package/dist/shared/pump-window.js.map +1 -0
- package/dist/shared/render-events.d.ts +25 -0
- package/dist/shared/render-events.d.ts.map +1 -0
- package/dist/shared/render-events.js +79 -0
- package/dist/shared/render-events.js.map +1 -0
- package/dist/shared/sounding-set.d.ts +45 -0
- package/dist/shared/sounding-set.d.ts.map +1 -0
- package/dist/shared/sounding-set.js +81 -0
- package/dist/shared/sounding-set.js.map +1 -0
- package/dist/shared/test-plan.d.ts +36 -0
- package/dist/shared/test-plan.d.ts.map +1 -0
- package/dist/shared/test-plan.js +83 -0
- package/dist/shared/test-plan.js.map +1 -0
- package/dist/singleton.d.ts +23 -0
- package/dist/singleton.d.ts.map +1 -0
- package/dist/singleton.js +26 -0
- package/dist/singleton.js.map +1 -0
- package/dist/types.d.ts +84 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/web/audio/offline-synth.d.ts +24 -0
- package/dist/web/audio/offline-synth.d.ts.map +1 -0
- package/dist/web/audio/offline-synth.js +92 -0
- package/dist/web/audio/offline-synth.js.map +1 -0
- package/dist/web/audio/soundfont-render.d.ts +31 -0
- package/dist/web/audio/soundfont-render.d.ts.map +1 -0
- package/dist/web/audio/soundfont-render.js +130 -0
- package/dist/web/audio/soundfont-render.js.map +1 -0
- package/dist/web/audio/synth-types.d.ts +24 -0
- package/dist/web/audio/synth-types.d.ts.map +1 -0
- package/dist/web/audio/synth-types.js +2 -0
- package/dist/web/audio/synth-types.js.map +1 -0
- package/dist/web/index.d.ts +40 -0
- package/dist/web/index.d.ts.map +1 -0
- package/dist/web/index.js +59 -0
- package/dist/web/index.js.map +1 -0
- package/dist/web/playback/channel-allocator.d.ts +54 -0
- package/dist/web/playback/channel-allocator.d.ts.map +1 -0
- package/dist/web/playback/channel-allocator.js +72 -0
- package/dist/web/playback/channel-allocator.js.map +1 -0
- package/dist/web/playback/click.d.ts +9 -0
- package/dist/web/playback/click.d.ts.map +1 -0
- package/dist/web/playback/click.js +61 -0
- package/dist/web/playback/click.js.map +1 -0
- package/dist/web/playback/clock.d.ts +36 -0
- package/dist/web/playback/clock.d.ts.map +1 -0
- package/dist/web/playback/clock.js +64 -0
- package/dist/web/playback/clock.js.map +1 -0
- package/dist/web/playback/governor.d.ts +45 -0
- package/dist/web/playback/governor.d.ts.map +1 -0
- package/dist/web/playback/governor.js +33 -0
- package/dist/web/playback/governor.js.map +1 -0
- package/dist/web/playback/quiet-stub-notices.d.ts +55 -0
- package/dist/web/playback/quiet-stub-notices.d.ts.map +1 -0
- package/dist/web/playback/quiet-stub-notices.js +93 -0
- package/dist/web/playback/quiet-stub-notices.js.map +1 -0
- package/dist/web/playback/soundfont-engine.d.ts +281 -0
- package/dist/web/playback/soundfont-engine.d.ts.map +1 -0
- package/dist/web/playback/soundfont-engine.js +735 -0
- package/dist/web/playback/soundfont-engine.js.map +1 -0
- package/dist/web/playback/soundfont-loader.d.ts +30 -0
- package/dist/web/playback/soundfont-loader.d.ts.map +1 -0
- package/dist/web/playback/soundfont-loader.js +68 -0
- package/dist/web/playback/soundfont-loader.js.map +1 -0
- package/dist/web/playback/synth-host.d.ts +142 -0
- package/dist/web/playback/synth-host.d.ts.map +1 -0
- package/dist/web/playback/synth-host.js +293 -0
- package/dist/web/playback/synth-host.js.map +1 -0
- package/package.json +18 -3
- package/dist/index.d.ts +0 -14
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -2
- 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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"}
|