audio-mixer-engine 1.2.0 → 1.3.1
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/README.md +42 -9
- package/dist/audio-mixer-engine.cjs.js +1 -1
- package/dist/audio-mixer-engine.es.js +629 -571
- package/package.json +1 -1
- package/src/index.js +3 -0
- package/src/lib/metadata-utils.js +140 -0
- package/src/lib/midi-parser.js +6 -113
- package/src/lib/musicxml-converter.js +78 -2
- package/src/lib/playback-manager.js +47 -10
package/README.md
CHANGED
|
@@ -66,21 +66,36 @@ await manager.play({ leadIn: true, metronome: true });
|
|
|
66
66
|
|
|
67
67
|
### Loading MusicXML Files
|
|
68
68
|
|
|
69
|
+
PlaybackManager auto-detects MusicXML strings and MXL/ZIP ArrayBuffers:
|
|
70
|
+
|
|
69
71
|
```javascript
|
|
70
|
-
import {
|
|
72
|
+
import { loadMusicXml } from 'audio-mixer-engine';
|
|
73
|
+
|
|
74
|
+
// MXL file (ArrayBuffer) — auto-detected from ZIP magic bytes
|
|
75
|
+
await manager.load(mxlArrayBuffer);
|
|
71
76
|
|
|
72
|
-
//
|
|
77
|
+
// MusicXML string — auto-detected from <?xml or <score-partwise> prefix
|
|
73
78
|
const xmlString = await loadMusicXml(fileArrayBuffer);
|
|
79
|
+
await manager.load(xmlString);
|
|
74
80
|
|
|
75
|
-
//
|
|
76
|
-
|
|
77
|
-
const parsedData = converter.convert(xmlString);
|
|
78
|
-
await manager.load(parsedData);
|
|
81
|
+
// With metadata overrides (title, composer, per-part instrument mapping)
|
|
82
|
+
await manager.load(xmlString, metadataOverrides);
|
|
79
83
|
|
|
80
84
|
// From here on, playback works exactly the same as MIDI
|
|
81
85
|
await manager.play({ leadIn: true, metronome: true });
|
|
82
86
|
```
|
|
83
87
|
|
|
88
|
+
You can also convert manually for more control:
|
|
89
|
+
|
|
90
|
+
```javascript
|
|
91
|
+
import { MusicXmlConverter, loadMusicXml } from 'audio-mixer-engine';
|
|
92
|
+
|
|
93
|
+
const xmlString = await loadMusicXml(fileArrayBuffer);
|
|
94
|
+
const converter = new MusicXmlConverter();
|
|
95
|
+
const parsedData = converter.convert(xmlString, { defaultTempo: 120 }, metadataOverrides);
|
|
96
|
+
await manager.load(parsedData);
|
|
97
|
+
```
|
|
98
|
+
|
|
84
99
|
## Key Concepts
|
|
85
100
|
|
|
86
101
|
**Part-centric design**: Each musical part gets an independent `ChannelHandle` with its own `AudioNode` output. Your application connects these outputs to gain controls, analyzers, and effects.
|
|
@@ -98,8 +113,12 @@ await manager.play({ leadIn: true, metronome: true });
|
|
|
98
113
|
### PlaybackManager
|
|
99
114
|
|
|
100
115
|
```javascript
|
|
101
|
-
// Lifecycle
|
|
102
|
-
await manager.load(midiArrayBuffer
|
|
116
|
+
// Lifecycle — load() auto-detects input type
|
|
117
|
+
await manager.load(midiArrayBuffer); // MIDI ArrayBuffer
|
|
118
|
+
await manager.load(mxlArrayBuffer); // MXL/ZIP ArrayBuffer (auto-detected)
|
|
119
|
+
await manager.load(musicXmlString); // MusicXML string (auto-detected)
|
|
120
|
+
await manager.load(parsedData); // Pre-parsed data object
|
|
121
|
+
await manager.load(input, metadata, instrumentMap); // With optional overrides
|
|
103
122
|
manager.reset();
|
|
104
123
|
|
|
105
124
|
// Transport
|
|
@@ -232,12 +251,26 @@ const converter = new MusicXmlConverter();
|
|
|
232
251
|
const parsedData = converter.convert(xmlString, {
|
|
233
252
|
defaultTempo: 120, // Fallback tempo if none in score
|
|
234
253
|
defaultVelocity: 80 // Fallback note velocity
|
|
235
|
-
});
|
|
254
|
+
}, metadataOverrides); // Optional: override title, composer, per-part instruments
|
|
236
255
|
|
|
237
256
|
// parsedData includes parts, barStructure, metadata, and structureMetadata
|
|
238
257
|
// Use with PlaybackManager or MidiPlayer just like MIDI-parsed data
|
|
239
258
|
```
|
|
240
259
|
|
|
260
|
+
### Metadata Utilities
|
|
261
|
+
|
|
262
|
+
```javascript
|
|
263
|
+
import { resolveInstrument, normalizeLegacyMetadata } from 'audio-mixer-engine';
|
|
264
|
+
|
|
265
|
+
// Map instrument names/numbers to MIDI program numbers
|
|
266
|
+
resolveInstrument('piano'); // 0
|
|
267
|
+
resolveInstrument('choir_aahs'); // 52
|
|
268
|
+
resolveInstrument(40); // 40
|
|
269
|
+
|
|
270
|
+
// Normalize legacy v1 metadata format to v2
|
|
271
|
+
const normalized = normalizeLegacyMetadata(legacyMetadata);
|
|
272
|
+
```
|
|
273
|
+
|
|
241
274
|
## Mixer Example
|
|
242
275
|
|
|
243
276
|
```javascript
|