@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
package/dist/rn/index.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The React Native player: a sample-based FluidR3 engine.
|
|
3
|
+
*
|
|
4
|
+
* Playback is samples rather than the web's libfluidsynth-in-an-AudioWorklet —
|
|
5
|
+
* React Native has neither WebAssembly nor `addModule`, so that engine cannot
|
|
6
|
+
* be ported, only replaced. It is replaced with the *same font*, pre-rendered
|
|
7
|
+
* per note, so a phone plays the recordings a browser plays. See
|
|
8
|
+
* `playback/sample-engine.ts`.
|
|
9
|
+
*/
|
|
10
|
+
import { RNSamplePlaybackEngine } from './playback/sample-engine.js';
|
|
11
|
+
import { createRNSoundfontRenderer } from './audio/offline-render.js';
|
|
12
|
+
import { MusicPlayer } from '../player.js';
|
|
13
|
+
export * from '../types.js';
|
|
14
|
+
export * from '../singleton.js';
|
|
15
|
+
export { MusicPlayer, RNSamplePlaybackEngine, createRNSoundfontRenderer };
|
|
16
|
+
export { renderEvents } from '../shared/render-events.js';
|
|
17
|
+
export { playbackPlan, playbackTracks, resolveVoice } from '../shared/plan.js';
|
|
18
|
+
/** The React Native player, built fresh. Hand it to `initializeMusicPlayer`. */
|
|
19
|
+
export function createMusicPlayer(options = {}) {
|
|
20
|
+
return new MusicPlayer(new RNSamplePlaybackEngine({
|
|
21
|
+
packBase: options.packBase,
|
|
22
|
+
percussionBase: options.percussionBase,
|
|
23
|
+
}));
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Renders a plan to PCM, faster than realtime.
|
|
27
|
+
*
|
|
28
|
+
* Scheduled up front against an `OfflineAudioContext` rather than in real time.
|
|
29
|
+
* Sharing `PackLibrary` and `planVoice` with the engine is what keeps the file
|
|
30
|
+
* a recording of what was heard. The caller encodes and saves; this package
|
|
31
|
+
* does not touch files.
|
|
32
|
+
*/
|
|
33
|
+
export function renderSamples(options = {}) {
|
|
34
|
+
return createRNSoundfontRenderer({
|
|
35
|
+
packBase: options.packBase,
|
|
36
|
+
percussionBase: options.percussionBase,
|
|
37
|
+
}).render;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rn/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAwB/E,gFAAgF;AAChF,MAAM,UAAU,iBAAiB,CAC/B,UAAgC,EAAE;IAElC,OAAO,IAAI,WAAW,CACpB,IAAI,sBAAsB,CAAC;QACzB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,cAAc,EAAE,OAAO,CAAC,cAAc;KACvC,CAAC,CACH,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,UAAgC,EAAE;IAC9D,OAAO,yBAAyB,CAAC;QAC/B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,cAAc,EAAE,OAAO,CAAC,cAAc;KACvC,CAAC,CAAC,MAAM,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The slice of `react-native-audio-api` this engine uses.
|
|
3
|
+
*
|
|
4
|
+
* Declared structurally rather than imported so the engine can be constructed
|
|
5
|
+
* and driven in a test with a fake, and so this package's own dev tree does not
|
|
6
|
+
* need React Native — the library requires it at import time and cannot run
|
|
7
|
+
* outside a device anyway.
|
|
8
|
+
*
|
|
9
|
+
* Deliberately narrow. Widening it to the library's full surface would invite
|
|
10
|
+
* use of nodes that have not been thought about on this side of the boundary,
|
|
11
|
+
* which is the same reason `rn/types.d.ts` stays minimal.
|
|
12
|
+
*/
|
|
13
|
+
export type RNAudioBuffer = {
|
|
14
|
+
readonly length: number;
|
|
15
|
+
readonly numberOfChannels: number;
|
|
16
|
+
readonly sampleRate: number;
|
|
17
|
+
readonly duration: number;
|
|
18
|
+
getChannelData(channel: number): Float32Array;
|
|
19
|
+
};
|
|
20
|
+
export type RNAudioParam = {
|
|
21
|
+
value: number;
|
|
22
|
+
setValueAtTime(value: number, startTime: number): unknown;
|
|
23
|
+
linearRampToValueAtTime(value: number, endTime: number): unknown;
|
|
24
|
+
cancelScheduledValues(cancelTime: number): unknown;
|
|
25
|
+
};
|
|
26
|
+
export type RNAudioNode = {
|
|
27
|
+
connect(destination: RNAudioNode): unknown;
|
|
28
|
+
disconnect(): unknown;
|
|
29
|
+
};
|
|
30
|
+
export type RNGainNode = RNAudioNode & {
|
|
31
|
+
readonly gain: RNAudioParam;
|
|
32
|
+
};
|
|
33
|
+
export type RNBufferSource = RNAudioNode & {
|
|
34
|
+
buffer: RNAudioBuffer | null;
|
|
35
|
+
loop: boolean;
|
|
36
|
+
loopStart: number;
|
|
37
|
+
loopEnd: number;
|
|
38
|
+
readonly playbackRate: RNAudioParam;
|
|
39
|
+
readonly detune: RNAudioParam;
|
|
40
|
+
start(when?: number, offset?: number, duration?: number): void;
|
|
41
|
+
stop(when?: number): void;
|
|
42
|
+
onEnded?: (() => void) | null;
|
|
43
|
+
};
|
|
44
|
+
export type RNOscillator = RNAudioNode & {
|
|
45
|
+
readonly frequency: RNAudioParam;
|
|
46
|
+
type: string;
|
|
47
|
+
start(when?: number): void;
|
|
48
|
+
stop(when?: number): void;
|
|
49
|
+
};
|
|
50
|
+
export type RNStereoPanner = RNAudioNode & {
|
|
51
|
+
readonly pan: RNAudioParam;
|
|
52
|
+
};
|
|
53
|
+
export type RNBiquadFilter = RNAudioNode & {
|
|
54
|
+
type: string;
|
|
55
|
+
readonly frequency: RNAudioParam;
|
|
56
|
+
readonly Q: RNAudioParam;
|
|
57
|
+
};
|
|
58
|
+
/** The offline context, for export. Same node factories, plus `startRendering`. */
|
|
59
|
+
export type RNOfflineAudioContext = {
|
|
60
|
+
readonly destination: RNAudioNode;
|
|
61
|
+
readonly sampleRate: number;
|
|
62
|
+
createGain(): RNGainNode;
|
|
63
|
+
createBufferSource(): RNBufferSource;
|
|
64
|
+
createStereoPanner(): RNStereoPanner;
|
|
65
|
+
createBiquadFilter(): RNBiquadFilter;
|
|
66
|
+
startRendering(): Promise<RNAudioBuffer>;
|
|
67
|
+
};
|
|
68
|
+
export type RNAudioContext = {
|
|
69
|
+
readonly currentTime: number;
|
|
70
|
+
readonly destination: RNAudioNode;
|
|
71
|
+
readonly sampleRate: number;
|
|
72
|
+
createGain(): RNGainNode;
|
|
73
|
+
createBufferSource(): RNBufferSource;
|
|
74
|
+
createOscillator(): RNOscillator;
|
|
75
|
+
createStereoPanner(): RNStereoPanner;
|
|
76
|
+
createBiquadFilter(): RNBiquadFilter;
|
|
77
|
+
resume(): Promise<void>;
|
|
78
|
+
close(): Promise<void> | void;
|
|
79
|
+
};
|
|
80
|
+
/** What `rn/playback/sample-engine.ts` needs from the module, and nothing else. */
|
|
81
|
+
export type AudioApi = {
|
|
82
|
+
AudioContext: new () => RNAudioContext;
|
|
83
|
+
decodeAudioData(input: ArrayBuffer, sampleRate?: number): Promise<RNAudioBuffer>;
|
|
84
|
+
/** Absent before 0.13; `createRNSoundfontRenderer` says so rather than failing obscurely. */
|
|
85
|
+
OfflineAudioContext?: new (options: {
|
|
86
|
+
numberOfChannels: number;
|
|
87
|
+
length: number;
|
|
88
|
+
sampleRate: number;
|
|
89
|
+
}) => RNOfflineAudioContext;
|
|
90
|
+
};
|
|
91
|
+
/** Loads the real module. Lazy, so importing this package without it present does not throw. */
|
|
92
|
+
export declare function loadAudioApi(): Promise<AudioApi>;
|
|
93
|
+
//# sourceMappingURL=audio-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio-api.d.ts","sourceRoot":"","sources":["../../../src/rn/playback/audio-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1D,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IACjE,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;CACpD,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC;IAC3C,UAAU,IAAI,OAAO,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC;AAEvE,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG;IACzC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/D,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG;IACvC,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG;IAAE,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAA;CAAE,CAAC;AAE1E,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC;IACjC,QAAQ,CAAC,CAAC,EAAE,YAAY,CAAC;CAC1B,CAAC;AAEF,mFAAmF;AACnF,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,UAAU,IAAI,UAAU,CAAC;IACzB,kBAAkB,IAAI,cAAc,CAAC;IACrC,kBAAkB,IAAI,cAAc,CAAC;IACrC,kBAAkB,IAAI,cAAc,CAAC;IACrC,cAAc,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,UAAU,IAAI,UAAU,CAAC;IACzB,kBAAkB,IAAI,cAAc,CAAC;IACrC,gBAAgB,IAAI,YAAY,CAAC;IACjC,kBAAkB,IAAI,cAAc,CAAC;IACrC,kBAAkB,IAAI,cAAc,CAAC;IACrC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC/B,CAAC;AAEF,mFAAmF;AACnF,MAAM,MAAM,QAAQ,GAAG;IACrB,YAAY,EAAE,UAAU,cAAc,CAAC;IACvC,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACjF,6FAA6F;IAC7F,mBAAmB,CAAC,EAAE,KAAK,OAAO,EAAE;QAClC,gBAAgB,EAAE,MAAM,CAAC;QACzB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;KACpB,KAAK,qBAAqB,CAAC;CAC7B,CAAC;AAEF,gGAAgG;AAChG,wBAAsB,YAAY,IAAI,OAAO,CAAC,QAAQ,CAAC,CAatD"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The slice of `react-native-audio-api` this engine uses.
|
|
3
|
+
*
|
|
4
|
+
* Declared structurally rather than imported so the engine can be constructed
|
|
5
|
+
* and driven in a test with a fake, and so this package's own dev tree does not
|
|
6
|
+
* need React Native — the library requires it at import time and cannot run
|
|
7
|
+
* outside a device anyway.
|
|
8
|
+
*
|
|
9
|
+
* Deliberately narrow. Widening it to the library's full surface would invite
|
|
10
|
+
* use of nodes that have not been thought about on this side of the boundary,
|
|
11
|
+
* which is the same reason `rn/types.d.ts` stays minimal.
|
|
12
|
+
*/
|
|
13
|
+
/** Loads the real module. Lazy, so importing this package without it present does not throw. */
|
|
14
|
+
export async function loadAudioApi() {
|
|
15
|
+
const mod = (await import('react-native-audio-api'));
|
|
16
|
+
const AudioContext = mod.AudioContext ?? mod.default?.AudioContext;
|
|
17
|
+
const decodeAudioData = mod.decodeAudioData ?? mod.default?.decodeAudioData;
|
|
18
|
+
const OfflineAudioContext = mod.OfflineAudioContext ?? mod.default?.OfflineAudioContext;
|
|
19
|
+
if (!AudioContext || !decodeAudioData) {
|
|
20
|
+
throw new Error('react-native-audio-api is missing AudioContext or decodeAudioData; playback needs >=0.13.');
|
|
21
|
+
}
|
|
22
|
+
return { AudioContext, decodeAudioData, OfflineAudioContext };
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=audio-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio-api.js","sourceRoot":"","sources":["../../../src/rn/playback/audio-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAuFH,gGAAgG;AAChG,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAElD,CAAC;IACF,MAAM,YAAY,GAAG,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC;IACnE,MAAM,eAAe,GAAG,GAAG,CAAC,eAAe,IAAI,GAAG,CAAC,OAAO,EAAE,eAAe,CAAC;IAC5E,MAAM,mBAAmB,GAAG,GAAG,CAAC,mBAAmB,IAAI,GAAG,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACxF,IAAI,CAAC,YAAY,IAAI,CAAC,eAAe,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CACb,2FAA2F,CAC5F,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAc,CAAC;AAC5E,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated by `scripts/measure-expression.mjs` — do not edit.
|
|
3
|
+
*
|
|
4
|
+
* Per GM program: the low-pass corner at each probed velocity, the measured
|
|
5
|
+
* release, and whether the instrument holds its level while held.
|
|
6
|
+
* See `rn/playback/expression.ts` for what applies it.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* SHA-256 of the soundfont these numbers were measured from.
|
|
10
|
+
*
|
|
11
|
+
* Swap the font and every cutoff, release and sustain flag here describes an
|
|
12
|
+
* instrument that is no longer being played — silently, because nothing about a
|
|
13
|
+
* stale table throws. music_app owns the font, so music_app asserts the match.
|
|
14
|
+
*/
|
|
15
|
+
export declare const MEASURED_FROM_SHA256 = "2aacd036d7058d40a371846ef2f5dc5f130d648ab3837fe2626591ba49a71254";
|
|
16
|
+
export type ExpressionEntry = {
|
|
17
|
+
cutoffs: Record<string, number>;
|
|
18
|
+
releaseSec: number | null;
|
|
19
|
+
sustains: boolean;
|
|
20
|
+
};
|
|
21
|
+
export declare const EXPRESSION_TABLE: Record<string, ExpressionEntry>;
|
|
22
|
+
//# sourceMappingURL=expression-table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expression-table.d.ts","sourceRoot":"","sources":["../../../src/rn/playback/expression-table.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,qEAAqE,CAAC;AAEvG,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CA64B5D,CAAC"}
|