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 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 { MusicXmlConverter, loadMusicXml, PlaybackManager } from 'audio-mixer-engine';
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
- // Load MusicXML or MXL file (auto-detects format)
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
- // Convert to parsedData and load into PlaybackManager
76
- const converter = new MusicXmlConverter();
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, metadata, instrumentMap);
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