@datamoc/mw_games 0.17.1 → 0.19.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.
- package/CHANGELOG.md +27 -0
- package/dist/audio/Channels.d.ts +198 -0
- package/dist/audio/Channels.d.ts.map +1 -0
- package/dist/audio/Channels.js +456 -0
- package/dist/audio/Channels.js.map +1 -0
- package/dist/audio/Midi.d.ts +71 -9
- package/dist/audio/Midi.d.ts.map +1 -1
- package/dist/audio/Midi.js +107 -15
- package/dist/audio/Midi.js.map +1 -1
- package/dist/audio/MidiRender.d.ts +57 -0
- package/dist/audio/MidiRender.d.ts.map +1 -0
- package/dist/audio/MidiRender.js +261 -0
- package/dist/audio/MidiRender.js.map +1 -0
- package/dist/audio/SoundFont.d.ts +98 -0
- package/dist/audio/SoundFont.d.ts.map +1 -0
- package/dist/audio/SoundFont.js +578 -0
- package/dist/audio/SoundFont.js.map +1 -0
- package/dist/audio/index.d.ts +9 -2
- package/dist/audio/index.d.ts.map +1 -1
- package/dist/audio/index.js +4 -1
- package/dist/audio/index.js.map +1 -1
- package/dist/mw_games.global.js +52 -52
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/sbom.cdx.json +6 -6
|
@@ -0,0 +1,578 @@
|
|
|
1
|
+
import { scheduleMidi } from './Midi.js';
|
|
2
|
+
/**
|
|
3
|
+
* A SoundFont 2 reader: presets to instruments to sample zones, enough to play
|
|
4
|
+
* General MIDI music with real samples. Supported: key and velocity ranges, root key
|
|
5
|
+
* and tuning, sample loop modes, the volume envelope (attack, hold, decay, sustain,
|
|
6
|
+
* release), pan and attenuation, with the global-zone and preset-plus-instrument
|
|
7
|
+
* layering rules. Not supported: modulators, filters and LFOs, 24-bit samples, or
|
|
8
|
+
* stereo-linked sample pairs beyond playing each side as its own mono voice.
|
|
9
|
+
*
|
|
10
|
+
* A SoundFont file is only data (recorded samples plus preset tables), so reading one
|
|
11
|
+
* is ordinary format engineering; the licence that matters is the font's own, checked
|
|
12
|
+
* before it ships, never here.
|
|
13
|
+
*
|
|
14
|
+
* `subsetSoundFont` answers the shipping side: a game that plays five instruments
|
|
15
|
+
* should not carry all 128. It takes the programs the game's MIDI files actually use
|
|
16
|
+
* (see `collectSoundFontUsage`) and writes a smaller, valid SoundFont 2 file with the
|
|
17
|
+
* same voices for those programs: zones, ranges, tuning, envelopes and sample loops
|
|
18
|
+
* survive byte-identical, while unused presets, instruments and samples are gone and
|
|
19
|
+
* the library, genre and morphology metadata is zeroed.
|
|
20
|
+
*/
|
|
21
|
+
const GENERATORS = {
|
|
22
|
+
keyRange: 43,
|
|
23
|
+
velRange: 44,
|
|
24
|
+
instrument: 41,
|
|
25
|
+
sampleId: 53,
|
|
26
|
+
rootKey: 58,
|
|
27
|
+
coarseTune: 51,
|
|
28
|
+
fineTune: 52,
|
|
29
|
+
sampleModes: 54,
|
|
30
|
+
attenuation: 48,
|
|
31
|
+
pan: 17,
|
|
32
|
+
attack: 34,
|
|
33
|
+
hold: 35,
|
|
34
|
+
decay: 36,
|
|
35
|
+
sustain: 37,
|
|
36
|
+
release: 38,
|
|
37
|
+
};
|
|
38
|
+
/** seconds for a SoundFont timecents value */
|
|
39
|
+
function timecents(value) {
|
|
40
|
+
return 2 ** (value / 1200);
|
|
41
|
+
}
|
|
42
|
+
function toBytes(data) {
|
|
43
|
+
return data instanceof ArrayBuffer
|
|
44
|
+
? new Uint8Array(data)
|
|
45
|
+
: new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
|
|
46
|
+
}
|
|
47
|
+
function decodeName(bytes, at) {
|
|
48
|
+
let name = '';
|
|
49
|
+
for (let i = 0; i < 20; i++) {
|
|
50
|
+
const code = bytes[at + i];
|
|
51
|
+
if (code === 0)
|
|
52
|
+
break;
|
|
53
|
+
name += String.fromCharCode(code);
|
|
54
|
+
}
|
|
55
|
+
return name;
|
|
56
|
+
}
|
|
57
|
+
function readTables(bytes) {
|
|
58
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
59
|
+
const fourcc = (at) => String.fromCharCode(bytes[at], bytes[at + 1], bytes[at + 2], bytes[at + 3]);
|
|
60
|
+
if (fourcc(0) !== 'RIFF' || fourcc(8) !== 'sfbk')
|
|
61
|
+
throw new Error('not a SoundFont 2 file');
|
|
62
|
+
const chunks = new Map();
|
|
63
|
+
const lists = new Map();
|
|
64
|
+
const walk = (start, end) => {
|
|
65
|
+
let at = start;
|
|
66
|
+
while (at + 8 <= end) {
|
|
67
|
+
const id = fourcc(at);
|
|
68
|
+
const size = view.getUint32(at + 4, true);
|
|
69
|
+
if (id === 'LIST') {
|
|
70
|
+
lists.set(fourcc(at + 8), { at, size });
|
|
71
|
+
walk(at + 12, at + 8 + size);
|
|
72
|
+
}
|
|
73
|
+
else
|
|
74
|
+
chunks.set(id, { at: at + 8, size });
|
|
75
|
+
at += 8 + size + (size & 1);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
walk(12, bytes.length);
|
|
79
|
+
for (const required of ['phdr', 'pbag', 'pgen', 'inst', 'ibag', 'igen', 'shdr', 'smpl']) {
|
|
80
|
+
if (!chunks.has(required))
|
|
81
|
+
throw new Error(`SoundFont is missing "${required}"`);
|
|
82
|
+
}
|
|
83
|
+
const records = (name, size, read) => {
|
|
84
|
+
const chunk = chunks.get(name);
|
|
85
|
+
const out = [];
|
|
86
|
+
for (let at = chunk.at; at + size <= chunk.at + chunk.size; at += size)
|
|
87
|
+
out.push(read(at));
|
|
88
|
+
return out;
|
|
89
|
+
};
|
|
90
|
+
const generators = (name) => records(name, 4, (at) => ({
|
|
91
|
+
oper: view.getUint16(at, true),
|
|
92
|
+
lo: bytes[at + 2],
|
|
93
|
+
hi: bytes[at + 3],
|
|
94
|
+
amount: view.getInt16(at + 2, true),
|
|
95
|
+
}));
|
|
96
|
+
const bags = (name) => records(name, 4, (at) => view.getUint16(at, true));
|
|
97
|
+
const presets = records('phdr', 38, (at) => ({
|
|
98
|
+
name: decodeName(bytes, at),
|
|
99
|
+
preset: view.getUint16(at + 20, true),
|
|
100
|
+
bank: view.getUint16(at + 22, true),
|
|
101
|
+
bag: view.getUint16(at + 24, true),
|
|
102
|
+
}));
|
|
103
|
+
const instruments = records('inst', 22, (at) => ({
|
|
104
|
+
name: decodeName(bytes, at),
|
|
105
|
+
bag: view.getUint16(at + 20, true),
|
|
106
|
+
}));
|
|
107
|
+
const samples = records('shdr', 46, (at) => ({
|
|
108
|
+
name: decodeName(bytes, at),
|
|
109
|
+
start: view.getUint32(at + 20, true),
|
|
110
|
+
end: view.getUint32(at + 24, true),
|
|
111
|
+
loopStart: view.getUint32(at + 28, true),
|
|
112
|
+
loopEnd: view.getUint32(at + 32, true),
|
|
113
|
+
rate: view.getUint32(at + 36, true),
|
|
114
|
+
rootKey: bytes[at + 40],
|
|
115
|
+
correction: view.getInt8(at + 41),
|
|
116
|
+
link: view.getUint16(at + 42, true),
|
|
117
|
+
type: view.getUint16(at + 44, true),
|
|
118
|
+
}));
|
|
119
|
+
const smplChunk = chunks.get('smpl');
|
|
120
|
+
const smpl = new Int16Array(bytes.buffer.slice(bytes.byteOffset + smplChunk.at, bytes.byteOffset + smplChunk.at + smplChunk.size - (smplChunk.size & 1)));
|
|
121
|
+
const info = lists.get('INFO') ?? null;
|
|
122
|
+
return {
|
|
123
|
+
bytes,
|
|
124
|
+
presets,
|
|
125
|
+
presetBags: bags('pbag'),
|
|
126
|
+
presetGens: generators('pgen'),
|
|
127
|
+
instruments,
|
|
128
|
+
instBags: bags('ibag'),
|
|
129
|
+
instGens: generators('igen'),
|
|
130
|
+
samples,
|
|
131
|
+
smpl,
|
|
132
|
+
info: info ? bytes.slice(info.at, info.at + 8 + info.size + (info.size & 1)) : null,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
/** the generators of one bag, in file order */
|
|
136
|
+
function bagGens(bagList, gens, bag) {
|
|
137
|
+
return gens.slice(bagList[bag], bagList[bag + 1] ?? gens.length);
|
|
138
|
+
}
|
|
139
|
+
//Zones of one header entry: [{ gens: Map(oper -> generator) }...]; a first zone lacking the terminal generator is global.
|
|
140
|
+
function zonesOf(headers, bagList, gens, index, terminal) {
|
|
141
|
+
const first = headers[index].bag;
|
|
142
|
+
const last = headers[index + 1]?.bag ?? bagList.length - 1;
|
|
143
|
+
const zones = [];
|
|
144
|
+
let global = null;
|
|
145
|
+
for (let bag = first; bag < last; bag++) {
|
|
146
|
+
const slice = bagGens(bagList, gens, bag);
|
|
147
|
+
const map = new Map();
|
|
148
|
+
for (const generator of slice)
|
|
149
|
+
map.set(generator.oper, generator);
|
|
150
|
+
if (!map.has(terminal)) {
|
|
151
|
+
if (bag === first)
|
|
152
|
+
global = map;
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
zones.push({ gens: map, global });
|
|
156
|
+
}
|
|
157
|
+
return zones;
|
|
158
|
+
}
|
|
159
|
+
function generatorOf(zone, oper) {
|
|
160
|
+
return zone.gens.get(oper) ?? zone.global?.get(oper) ?? null;
|
|
161
|
+
}
|
|
162
|
+
function presetIndexOf(presets, bank, program) {
|
|
163
|
+
return (presets.get(`${bank}:${program}`) ??
|
|
164
|
+
presets.get(`0:${program}`) ??
|
|
165
|
+
(bank === 128 ? presets.get('128:0') : undefined) ??
|
|
166
|
+
presets.get('0:0'));
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Reads SoundFont 2 bytes into layered preset voices.
|
|
170
|
+
*
|
|
171
|
+
* @example
|
|
172
|
+
* ```ts
|
|
173
|
+
* import { parseSoundFont, parseMidi, renderMidiToBuffer } from '@datamoc/mw_games/audio';
|
|
174
|
+
*
|
|
175
|
+
* declare const soundfontBytes: ArrayBuffer;
|
|
176
|
+
* declare const midiBytes: ArrayBuffer;
|
|
177
|
+
*
|
|
178
|
+
* const font = parseSoundFont(soundfontBytes);
|
|
179
|
+
* const rendered = renderMidiToBuffer(parseMidi(midiBytes), { soundfont: font });
|
|
180
|
+
* console.log(font.presetCount, rendered.duration);
|
|
181
|
+
* ```
|
|
182
|
+
*/
|
|
183
|
+
export function parseSoundFont(data) {
|
|
184
|
+
const tables = readTables(toBytes(data));
|
|
185
|
+
const sampleCache = new Map();
|
|
186
|
+
const tuning = new Map();
|
|
187
|
+
const sampleOf = (id) => {
|
|
188
|
+
if (sampleCache.has(id))
|
|
189
|
+
return sampleCache.get(id);
|
|
190
|
+
const header = tables.samples[id];
|
|
191
|
+
if (!header || header.end <= header.start || header.type & 0x8000) {
|
|
192
|
+
sampleCache.set(id, null); //ROM samples live outside the file and cannot play
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
const frames = new Float32Array(header.end - header.start);
|
|
196
|
+
for (let index = 0; index < frames.length; index++) {
|
|
197
|
+
frames[index] = tables.smpl[header.start + index] / 32768;
|
|
198
|
+
}
|
|
199
|
+
const sample = {
|
|
200
|
+
data: frames,
|
|
201
|
+
rate: header.rate || 22050,
|
|
202
|
+
loopStart: header.loopStart - header.start,
|
|
203
|
+
loopEnd: header.loopEnd - header.start,
|
|
204
|
+
};
|
|
205
|
+
sampleCache.set(id, sample);
|
|
206
|
+
tuning.set(id, {
|
|
207
|
+
rootKey: header.rootKey === 255 ? 60 : header.rootKey,
|
|
208
|
+
correction: header.correction,
|
|
209
|
+
});
|
|
210
|
+
return sample;
|
|
211
|
+
};
|
|
212
|
+
const presets = new Map();
|
|
213
|
+
for (let index = 0; index < tables.presets.length - 1; index++) {
|
|
214
|
+
presets.set(`${tables.presets[index].bank}:${tables.presets[index].preset}`, index);
|
|
215
|
+
}
|
|
216
|
+
//Zones that sound for (bank, program, key, velocity), each with the resolved playback recipe.
|
|
217
|
+
function voices(bank, program, key, velocity) {
|
|
218
|
+
const presetIndex = presetIndexOf(presets, bank, program);
|
|
219
|
+
if (presetIndex === undefined)
|
|
220
|
+
return [];
|
|
221
|
+
const out = [];
|
|
222
|
+
const within = (zone, oper, value) => {
|
|
223
|
+
const generator = generatorOf(zone, oper);
|
|
224
|
+
return !generator || (value >= generator.lo && value <= generator.hi);
|
|
225
|
+
};
|
|
226
|
+
for (const presetZone of zonesOf(tables.presets, tables.presetBags, tables.presetGens, presetIndex, GENERATORS.instrument)) {
|
|
227
|
+
if (!within(presetZone, GENERATORS.keyRange, key) || !within(presetZone, GENERATORS.velRange, velocity)) {
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
const instrument = generatorOf(presetZone, GENERATORS.instrument).amount;
|
|
231
|
+
if (!tables.instruments[instrument + 1])
|
|
232
|
+
continue;
|
|
233
|
+
for (const zone of zonesOf(tables.instruments, tables.instBags, tables.instGens, instrument, GENERATORS.sampleId)) {
|
|
234
|
+
if (!within(zone, GENERATORS.keyRange, key) || !within(zone, GENERATORS.velRange, velocity)) {
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
const sampleId = generatorOf(zone, GENERATORS.sampleId).amount;
|
|
238
|
+
const sample = sampleOf(sampleId);
|
|
239
|
+
if (!sample)
|
|
240
|
+
continue;
|
|
241
|
+
const both = (oper, fallback = 0) => (generatorOf(zone, oper)?.amount ?? fallback) + (generatorOf(presetZone, oper)?.amount ?? 0);
|
|
242
|
+
const root = generatorOf(zone, GENERATORS.rootKey)?.amount;
|
|
243
|
+
const modes = generatorOf(zone, GENERATORS.sampleModes)?.amount ?? 0;
|
|
244
|
+
const native = tuning.get(sampleId);
|
|
245
|
+
out.push({
|
|
246
|
+
sample,
|
|
247
|
+
rootKey: root !== undefined && root >= 0 ? root : native.rootKey,
|
|
248
|
+
cents: both(GENERATORS.coarseTune) * 100 + both(GENERATORS.fineTune) + native.correction,
|
|
249
|
+
loop: (modes & 3) === 1 || (modes & 3) === 3,
|
|
250
|
+
gain: 10 ** (-Math.max(0, both(GENERATORS.attenuation)) / 200),
|
|
251
|
+
pan: Math.max(-1, Math.min(1, both(GENERATORS.pan) / 500)),
|
|
252
|
+
attack: timecents(both(GENERATORS.attack, -12000)),
|
|
253
|
+
hold: timecents(both(GENERATORS.hold, -12000)),
|
|
254
|
+
decay: timecents(both(GENERATORS.decay, -12000)),
|
|
255
|
+
sustain: 10 ** (-Math.max(0, both(GENERATORS.sustain)) / 200),
|
|
256
|
+
release: timecents(both(GENERATORS.release, -12000)),
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return out;
|
|
261
|
+
}
|
|
262
|
+
return {
|
|
263
|
+
voices,
|
|
264
|
+
hasPreset: (bank, program) => presets.has(`${bank}:${program}`) || presets.has(`0:${program}`),
|
|
265
|
+
presetCount: presets.size,
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Every sampled voice the given MIDI files can request, as (bank, program) pairs:
|
|
270
|
+
* the channel voice in effect at each scheduled note, with drums mapped to bank 128
|
|
271
|
+
* the same way the renderer maps them. A game's compile step feeds this straight
|
|
272
|
+
* into `subsetSoundFont` so the shipped font carries only these programs.
|
|
273
|
+
*
|
|
274
|
+
* @example
|
|
275
|
+
* ```ts
|
|
276
|
+
* import { parseMidi, collectSoundFontUsage } from '@datamoc/mw_games/audio';
|
|
277
|
+
*
|
|
278
|
+
* declare const midiBytes: ArrayBuffer;
|
|
279
|
+
*
|
|
280
|
+
* const usage = collectSoundFontUsage([parseMidi(midiBytes)]);
|
|
281
|
+
* console.log(usage.length);
|
|
282
|
+
* ```
|
|
283
|
+
*/
|
|
284
|
+
export function collectSoundFontUsage(files) {
|
|
285
|
+
const seen = new Set();
|
|
286
|
+
const out = [];
|
|
287
|
+
for (const file of files) {
|
|
288
|
+
for (const note of scheduleMidi(file)) {
|
|
289
|
+
const bank = note.channel === 9 ? 128 : note.bank;
|
|
290
|
+
const key = `${bank}:${note.program}`;
|
|
291
|
+
if (!seen.has(key)) {
|
|
292
|
+
seen.add(key);
|
|
293
|
+
out.push({ bank, program: note.program });
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
return out;
|
|
298
|
+
}
|
|
299
|
+
function u16le(value) {
|
|
300
|
+
return [value & 0xff, (value >> 8) & 0xff];
|
|
301
|
+
}
|
|
302
|
+
function u32le(value) {
|
|
303
|
+
return [value & 0xff, (value >> 8) & 0xff, (value >> 16) & 0xff, (value >> 24) & 0xff];
|
|
304
|
+
}
|
|
305
|
+
function encodeName(name) {
|
|
306
|
+
const codes = [...name].map((char) => char.charCodeAt(0) & 0xff).slice(0, 20);
|
|
307
|
+
return [...codes, ...new Array(20 - codes.length).fill(0)];
|
|
308
|
+
}
|
|
309
|
+
function asciiBytes(text) {
|
|
310
|
+
return [...text].map((char) => char.charCodeAt(0));
|
|
311
|
+
}
|
|
312
|
+
/** one chunk as bytes: kept samples run to megabytes, so this allocates instead of spreading */
|
|
313
|
+
function chunkBytes(id, payload) {
|
|
314
|
+
const out = new Uint8Array(8 + payload.length + (payload.length & 1));
|
|
315
|
+
out.set(asciiBytes(id), 0);
|
|
316
|
+
new DataView(out.buffer).setUint32(4, payload.length, true);
|
|
317
|
+
out.set(payload, 8);
|
|
318
|
+
return out;
|
|
319
|
+
}
|
|
320
|
+
function concat(parts) {
|
|
321
|
+
let length = 0;
|
|
322
|
+
for (const part of parts)
|
|
323
|
+
length += part.length;
|
|
324
|
+
const out = new Uint8Array(length);
|
|
325
|
+
let at = 0;
|
|
326
|
+
for (const part of parts) {
|
|
327
|
+
out.set(part, at);
|
|
328
|
+
at += part.length;
|
|
329
|
+
}
|
|
330
|
+
return out;
|
|
331
|
+
}
|
|
332
|
+
function listBytes(type, subs) {
|
|
333
|
+
const body = concat([new Uint8Array(asciiBytes(type)), ...subs]);
|
|
334
|
+
return concat([new Uint8Array(asciiBytes('LIST')), new Uint8Array(u32le(body.length)), body]);
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Writes a smaller, valid SoundFont 2 file carrying only the used programs: their
|
|
338
|
+
* presets (names kept), instruments and samples, with zones, ranges, tuning,
|
|
339
|
+
* envelopes and sample loops copied verbatim and every index remapped. Zones that
|
|
340
|
+
* reference samples missing from the file (ROM samples) are dropped, matching what
|
|
341
|
+
* the reader voices for the full font; the library, genre and morphology metadata
|
|
342
|
+
* is zeroed and the INFO list, when present, rides along untouched. Modulator lists
|
|
343
|
+
* are emptied and 24-bit upper bits are dropped: the reader voices neither, so what
|
|
344
|
+
* it plays is unchanged, while a third-party player would miss those.
|
|
345
|
+
*
|
|
346
|
+
* @example
|
|
347
|
+
* ```ts
|
|
348
|
+
* import { parseMidi, collectSoundFontUsage, subsetSoundFont } from '@datamoc/mw_games/audio';
|
|
349
|
+
*
|
|
350
|
+
* declare const midiBytes: ArrayBuffer;
|
|
351
|
+
* declare const soundfontBytes: ArrayBuffer;
|
|
352
|
+
*
|
|
353
|
+
* const usage = collectSoundFontUsage([parseMidi(midiBytes)]);
|
|
354
|
+
* const pruned = subsetSoundFont(soundfontBytes, usage);
|
|
355
|
+
* console.log(usage.length, pruned.byteLength);
|
|
356
|
+
* ```
|
|
357
|
+
*/
|
|
358
|
+
export function subsetSoundFont(data, usage) {
|
|
359
|
+
const tables = readTables(toBytes(data));
|
|
360
|
+
const presetIndex = new Map();
|
|
361
|
+
for (let index = 0; index < tables.presets.length - 1; index++) {
|
|
362
|
+
presetIndex.set(`${tables.presets[index].bank}:${tables.presets[index].preset}`, index);
|
|
363
|
+
}
|
|
364
|
+
//Used presets in file order, resolved through the same fallback the reader voices.
|
|
365
|
+
const seenPresets = new Set();
|
|
366
|
+
const usedPresets = [];
|
|
367
|
+
for (const { bank, program } of usage) {
|
|
368
|
+
const index = presetIndexOf(presetIndex, bank, program);
|
|
369
|
+
if (index !== undefined && !seenPresets.has(index)) {
|
|
370
|
+
seenPresets.add(index);
|
|
371
|
+
usedPresets.push(index);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
usedPresets.sort((a, b) => a - b);
|
|
375
|
+
const usableSample = (id) => {
|
|
376
|
+
const header = tables.samples[id];
|
|
377
|
+
return !!header && header.end > header.start && !(header.type & 0x8000);
|
|
378
|
+
};
|
|
379
|
+
//A bag's generators verbatim, except instrument and sample ids are remapped.
|
|
380
|
+
const remapIds = (gens, oper, ids) => gens.map((generator) => generator.oper === oper
|
|
381
|
+
? {
|
|
382
|
+
oper,
|
|
383
|
+
lo: ids.get(generator.amount) & 0xff,
|
|
384
|
+
hi: (ids.get(generator.amount) >> 8) & 0xff,
|
|
385
|
+
amount: ids.get(generator.amount),
|
|
386
|
+
}
|
|
387
|
+
: generator);
|
|
388
|
+
//Instruments in first-use order, with zones that lost their sample dropped.
|
|
389
|
+
const instrumentOrder = [];
|
|
390
|
+
const instrumentZones = new Map();
|
|
391
|
+
{
|
|
392
|
+
const seen = new Set();
|
|
393
|
+
for (const preset of usedPresets) {
|
|
394
|
+
const first = tables.presets[preset].bag;
|
|
395
|
+
const last = tables.presets[preset + 1]?.bag ?? tables.presetBags.length - 1;
|
|
396
|
+
for (let bag = first; bag < last; bag++) {
|
|
397
|
+
const gens = bagGens(tables.presetBags, tables.presetGens, bag);
|
|
398
|
+
if (!gens.some((generator) => generator.oper === GENERATORS.instrument))
|
|
399
|
+
continue;
|
|
400
|
+
const instrument = gens.find((generator) => generator.oper === GENERATORS.instrument).amount;
|
|
401
|
+
if (!tables.instruments[instrument + 1])
|
|
402
|
+
continue; // same guard the reader voices with
|
|
403
|
+
if (!seen.has(instrument)) {
|
|
404
|
+
seen.add(instrument);
|
|
405
|
+
instrumentOrder.push(instrument);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
const instrumentNew = new Map(instrumentOrder.map((old, index) => [old, index]));
|
|
411
|
+
for (const instrument of instrumentOrder) {
|
|
412
|
+
const first = tables.instruments[instrument].bag;
|
|
413
|
+
const last = tables.instruments[instrument + 1]?.bag ?? tables.instBags.length - 1;
|
|
414
|
+
const zones = [];
|
|
415
|
+
for (let bag = first; bag < last; bag++) {
|
|
416
|
+
const gens = bagGens(tables.instBags, tables.instGens, bag);
|
|
417
|
+
if (!gens.some((generator) => generator.oper === GENERATORS.sampleId))
|
|
418
|
+
continue;
|
|
419
|
+
const sample = gens.find((generator) => generator.oper === GENERATORS.sampleId).amount;
|
|
420
|
+
if (!usableSample(sample))
|
|
421
|
+
continue;
|
|
422
|
+
zones.push(gens);
|
|
423
|
+
}
|
|
424
|
+
instrumentZones.set(instrument, zones);
|
|
425
|
+
}
|
|
426
|
+
//Samples in first-use order, chasing stereo links one hop so none dangles.
|
|
427
|
+
const sampleOrder = [];
|
|
428
|
+
{
|
|
429
|
+
const seen = new Set();
|
|
430
|
+
const keep = (id) => {
|
|
431
|
+
if (seen.has(id) || !usableSample(id))
|
|
432
|
+
return;
|
|
433
|
+
seen.add(id);
|
|
434
|
+
sampleOrder.push(id);
|
|
435
|
+
const link = tables.samples[id].link;
|
|
436
|
+
if (link !== id)
|
|
437
|
+
keep(link);
|
|
438
|
+
};
|
|
439
|
+
for (const instrument of instrumentOrder) {
|
|
440
|
+
for (const zone of instrumentZones.get(instrument)) {
|
|
441
|
+
keep(zone.find((generator) => generator.oper === GENERATORS.sampleId).amount);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
const sampleNew = new Map(sampleOrder.map((old, index) => [old, index]));
|
|
446
|
+
const genRecord = (generator) => [...u16le(generator.oper), generator.lo, generator.hi];
|
|
447
|
+
const bagRecord = (genIndex) => [...u16le(genIndex), ...u16le(0)];
|
|
448
|
+
//Presets: global zone first when the source has one, then its instrument zones.
|
|
449
|
+
const newPresetBags = [];
|
|
450
|
+
const newPresetGens = [];
|
|
451
|
+
const newPresets = [];
|
|
452
|
+
for (const preset of usedPresets) {
|
|
453
|
+
const source = tables.presets[preset];
|
|
454
|
+
const bagStart = newPresetBags.length;
|
|
455
|
+
const first = source.bag;
|
|
456
|
+
const last = tables.presets[preset + 1]?.bag ?? tables.presetBags.length - 1;
|
|
457
|
+
for (let bag = first; bag < last; bag++) {
|
|
458
|
+
const gens = bagGens(tables.presetBags, tables.presetGens, bag);
|
|
459
|
+
const isGlobal = bag === first && !gens.some((generator) => generator.oper === GENERATORS.instrument);
|
|
460
|
+
if (!isGlobal && !gens.some((generator) => generator.oper === GENERATORS.instrument))
|
|
461
|
+
continue;
|
|
462
|
+
newPresetBags.push(newPresetGens.length);
|
|
463
|
+
newPresetGens.push(...remapIds(gens, GENERATORS.instrument, instrumentNew));
|
|
464
|
+
}
|
|
465
|
+
newPresets.push({ name: source.name, preset: source.preset, bank: source.bank, bag: bagStart });
|
|
466
|
+
}
|
|
467
|
+
newPresetBags.push(newPresetGens.length);
|
|
468
|
+
//Instruments: same shape, sample ids remapped, sample zones already pruned above.
|
|
469
|
+
const newInstBags = [];
|
|
470
|
+
const newInstGens = [];
|
|
471
|
+
const newInstruments = [];
|
|
472
|
+
for (const instrument of instrumentOrder) {
|
|
473
|
+
const bagStart = newInstBags.length;
|
|
474
|
+
const zones = instrumentZones.get(instrument);
|
|
475
|
+
//An instrument whose zones all lost their samples keeps its header with no
|
|
476
|
+
//bags: it voices nothing, exactly like the full font did.
|
|
477
|
+
//A global zone (first bag without a sample id) rides along when present.
|
|
478
|
+
const first = tables.instruments[instrument].bag;
|
|
479
|
+
const last = tables.instruments[instrument + 1]?.bag ?? tables.instBags.length - 1;
|
|
480
|
+
for (let bag = first; bag < last; bag++) {
|
|
481
|
+
const gens = bagGens(tables.instBags, tables.instGens, bag);
|
|
482
|
+
if (bag === first && !gens.some((generator) => generator.oper === GENERATORS.sampleId)) {
|
|
483
|
+
newInstBags.push(newInstGens.length);
|
|
484
|
+
newInstGens.push(...gens);
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
for (const zone of zones) {
|
|
488
|
+
newInstBags.push(newInstGens.length);
|
|
489
|
+
newInstGens.push(...remapIds(zone, GENERATORS.sampleId, sampleNew));
|
|
490
|
+
}
|
|
491
|
+
newInstruments.push({ name: tables.instruments[instrument].name, bag: bagStart });
|
|
492
|
+
}
|
|
493
|
+
newInstBags.push(newInstGens.length);
|
|
494
|
+
//Samples: data concatenated, offsets and links remapped, headers otherwise intact.
|
|
495
|
+
const newSamples = [];
|
|
496
|
+
const sampleData = [];
|
|
497
|
+
for (const old of sampleOrder) {
|
|
498
|
+
const header = tables.samples[old];
|
|
499
|
+
const start = sampleData.length / 2;
|
|
500
|
+
for (let index = header.start; index < header.end; index++) {
|
|
501
|
+
const word = tables.smpl[index];
|
|
502
|
+
sampleData.push(word & 0xff, (word >> 8) & 0xff);
|
|
503
|
+
}
|
|
504
|
+
const self = sampleNew.get(old);
|
|
505
|
+
newSamples.push({
|
|
506
|
+
...header,
|
|
507
|
+
start,
|
|
508
|
+
end: start + (header.end - header.start),
|
|
509
|
+
loopStart: start + (header.loopStart - header.start),
|
|
510
|
+
loopEnd: start + (header.loopEnd - header.start),
|
|
511
|
+
link: sampleNew.get(header.link) ?? self,
|
|
512
|
+
});
|
|
513
|
+
}
|
|
514
|
+
const presetRecords = (entry) => [
|
|
515
|
+
...encodeName(entry.name),
|
|
516
|
+
...u16le(entry.preset),
|
|
517
|
+
...u16le(entry.bank),
|
|
518
|
+
...u16le(entry.bag),
|
|
519
|
+
...new Array(12).fill(0),
|
|
520
|
+
];
|
|
521
|
+
const terminalPreset = tables.presets[tables.presets.length - 1];
|
|
522
|
+
const phdr = chunkBytes('phdr', [
|
|
523
|
+
...newPresets.flatMap(presetRecords),
|
|
524
|
+
...presetRecords({
|
|
525
|
+
name: terminalPreset?.name ?? 'EOS',
|
|
526
|
+
preset: 0,
|
|
527
|
+
bank: 0,
|
|
528
|
+
bag: newPresetBags.length - 1,
|
|
529
|
+
}),
|
|
530
|
+
]);
|
|
531
|
+
const pbag = chunkBytes('pbag', newPresetBags.flatMap(bagRecord));
|
|
532
|
+
const pgen = chunkBytes('pgen', newPresetGens.flatMap(genRecord));
|
|
533
|
+
const pmod = chunkBytes('pmod', new Array(10).fill(0));
|
|
534
|
+
const instRecords = (entry) => [
|
|
535
|
+
...encodeName(entry.name),
|
|
536
|
+
...u16le(entry.bag),
|
|
537
|
+
];
|
|
538
|
+
const terminalInst = tables.instruments[tables.instruments.length - 1];
|
|
539
|
+
const inst = chunkBytes('inst', [
|
|
540
|
+
...newInstruments.flatMap(instRecords),
|
|
541
|
+
...instRecords({ name: terminalInst?.name ?? 'EOS', bag: newInstBags.length - 1 }),
|
|
542
|
+
]);
|
|
543
|
+
const ibag = chunkBytes('ibag', newInstBags.flatMap(bagRecord));
|
|
544
|
+
const igen = chunkBytes('igen', newInstGens.flatMap(genRecord));
|
|
545
|
+
const imod = chunkBytes('imod', new Array(10).fill(0));
|
|
546
|
+
const sampleRecords = (header) => [
|
|
547
|
+
...encodeName(header.name),
|
|
548
|
+
...u32le(header.start),
|
|
549
|
+
...u32le(header.end),
|
|
550
|
+
...u32le(header.loopStart),
|
|
551
|
+
...u32le(header.loopEnd),
|
|
552
|
+
...u32le(header.rate),
|
|
553
|
+
header.rootKey,
|
|
554
|
+
header.correction & 0xff,
|
|
555
|
+
...u16le(header.link),
|
|
556
|
+
...u16le(header.type),
|
|
557
|
+
];
|
|
558
|
+
const terminalSample = {
|
|
559
|
+
name: '',
|
|
560
|
+
start: 0,
|
|
561
|
+
end: 0,
|
|
562
|
+
loopStart: 0,
|
|
563
|
+
loopEnd: 0,
|
|
564
|
+
rate: 0,
|
|
565
|
+
rootKey: 0,
|
|
566
|
+
correction: 0,
|
|
567
|
+
link: 0,
|
|
568
|
+
type: 0,
|
|
569
|
+
};
|
|
570
|
+
const shdr = chunkBytes('shdr', [...newSamples.flatMap(sampleRecords), ...sampleRecords(terminalSample)]);
|
|
571
|
+
const smpl = chunkBytes('smpl', sampleData);
|
|
572
|
+
const sdta = listBytes('sdta', [smpl]);
|
|
573
|
+
const pdta = listBytes('pdta', [phdr, pbag, pmod, pgen, inst, ibag, imod, igen, shdr]);
|
|
574
|
+
const body = concat([new Uint8Array(asciiBytes('sfbk')), ...(tables.info ? [tables.info] : []), sdta, pdta]);
|
|
575
|
+
const bytes = concat([new Uint8Array(asciiBytes('RIFF')), new Uint8Array(u32le(body.length)), body]);
|
|
576
|
+
return bytes.buffer;
|
|
577
|
+
}
|
|
578
|
+
//# sourceMappingURL=SoundFont.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SoundFont.js","sourceRoot":"","sources":["../../src/audio/SoundFont.ts"],"names":[],"mappings":"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"}
|
package/dist/audio/index.d.ts
CHANGED
|
@@ -10,8 +10,15 @@ export { Orchestrator } from './Orchestrator.ts';
|
|
|
10
10
|
export type { OrchestratorState } from './Orchestrator.ts';
|
|
11
11
|
export { synthesizeTone, playTone } from './Synth.ts';
|
|
12
12
|
export type { Waveform, ToneOptions } from './Synth.ts';
|
|
13
|
-
export { parseMidi, scheduleMidi, noteToFrequency, MidiPlayer } from './Midi.ts';
|
|
14
|
-
export type { MidiFile, MidiEvent, MidiNoteEvent, MidiTempoEvent, ScheduledNote, MidiPlayerOptions } from './Midi.ts';
|
|
13
|
+
export { parseMidi, scheduleMidi, noteToFrequency, midiLoopStart, MidiPlayer } from './Midi.ts';
|
|
14
|
+
export type { MidiFile, MidiEvent, MidiNoteEvent, MidiTempoEvent, MidiProgramEvent, MidiControlEvent, MidiPitchBendEvent, MidiVoice, ScheduledNote, MidiPlayerOptions, } from './Midi.ts';
|
|
15
|
+
export { renderMidiToBuffer } from './MidiRender.ts';
|
|
16
|
+
export type { RenderMidiOptions, RenderedMidi } from './MidiRender.ts';
|
|
17
|
+
export { collectSoundFontUsage, parseSoundFont, subsetSoundFont } from './SoundFont.ts';
|
|
18
|
+
export type { SoundFont, SoundFontProgram, SoundFontSample, SoundFontVoice } from './SoundFont.ts';
|
|
19
|
+
export { Channel, AudioBus } from './Channels.ts';
|
|
20
|
+
export type { LoopRegion, ChannelPlayOptions, ChannelState } from './Channels.ts';
|
|
21
|
+
export type { BusKind, BusTrack, SavedBusTrack, LoadedTrack, BusLoader, BusSnapshot, AudioBusOptions, } from './Channels.ts';
|
|
15
22
|
export { AudioListener, SoundSource, audioGain, audioPan } from './Positional.ts';
|
|
16
23
|
export type { AudioPoint, AudioFalloff, SoundSourceOptions } from './Positional.ts';
|
|
17
24
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/audio/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtD,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/audio/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtD,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAChG,YAAY,EACX,QAAQ,EACR,SAAS,EACT,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,SAAS,EACT,aAAa,EACb,iBAAiB,GACjB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACxF,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACnG,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAClD,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClF,YAAY,EACX,OAAO,EACP,QAAQ,EACR,aAAa,EACb,WAAW,EACX,SAAS,EACT,WAAW,EACX,eAAe,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAClF,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/audio/index.js
CHANGED
|
@@ -4,6 +4,9 @@ export { Music } from './Music.js';
|
|
|
4
4
|
export { createAudio } from './Playable.js';
|
|
5
5
|
export { Orchestrator } from './Orchestrator.js';
|
|
6
6
|
export { synthesizeTone, playTone } from './Synth.js';
|
|
7
|
-
export { parseMidi, scheduleMidi, noteToFrequency, MidiPlayer } from './Midi.js';
|
|
7
|
+
export { parseMidi, scheduleMidi, noteToFrequency, midiLoopStart, MidiPlayer } from './Midi.js';
|
|
8
|
+
export { renderMidiToBuffer } from './MidiRender.js';
|
|
9
|
+
export { collectSoundFontUsage, parseSoundFont, subsetSoundFont } from './SoundFont.js';
|
|
10
|
+
export { Channel, AudioBus } from './Channels.js';
|
|
8
11
|
export { AudioListener, SoundSource, audioGain, audioPan } from './Positional.js';
|
|
9
12
|
//# sourceMappingURL=index.js.map
|