audio-mixer-engine 0.3.4 → 0.4.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/dist/audio-mixer-engine.cjs.js +1 -1
- package/dist/audio-mixer-engine.es.js +209 -132
- package/package.json +1 -1
- package/src/lib/audio-engine.js +578 -578
- package/src/lib/midi-player.js +3 -1
- package/src/lib/spessasynth-audio-engine.js +90 -78
- package/src/lib/spessasynth-channel-handle.js +83 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const k = "data:audio/mpeg;base64,//uUxAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAAMAAAPMAA4ODg4ODg4OFRUVFRUVFRUcHBwcHBwcHCFhYWFhYWFhYWampqampqamq+vr6+vr6+vwMDAwMDAwMDA0tLS0tLS0tLj4+Pj4+Pj4/Hx8fHx8fHx8fj4+Pj4+Pj4//////////8AAABQTEFNRTMuMTAwBLkAAAAAAAAAABUgJAUlgQAB4AAADzAG7EJ1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//vUxAAAB8yXcfQRgCTRMao/N8IA//33eENEAAA5gAAAExtwAAs/d3f/0L3f/ru+gGBu//6IiIifERERAADAxYPvg+/4IOBA5//B9/9QIHP+CAIbvhMg0ABgBgbgwBgMCA4THDABiyOOAIyLXxAJy0ZEmVGAjFKQBZVE0qDGwhixQCXAsRTGBiXyXhbK54CI5jskGIl3DEwYJEDsqHgQXmYQQYoEJhYFkQihZYAZiIFggAiwFKruMCAg2GVhQomOy0IxsYNEBEFmAv8YJFTGnqgyVmWBsaBgZrU5GORgJG8xacCqBgEL39aZAcWBIAXYXJZI7kGGTxAYxIRhsIkgBBgKBgFMdjB90yWHTdFSx1Q6XwmWVpRNBYnmBwKFA6VgYLgwwAJV/AYBP7Kqsdl0agG/AEglN+lf1/eFgFgAJGAgSKAB9G7MDdRngsBqz/WZdV3Z+5TW26xqXZU1W3TVlgU0pFEcoBa7ktGEQDSaxmrOscNVqazjZ1Uv/l37XN/3L9cpvuZ9yurvz9eHADQAATuLOjghGNVi2IU3dAKvVQ2yyFiC/YchuMyaalVxHtT06h0ql40AYmX79VsWPcQiimFwkw7qpt1o6fi8hjgOxWHlzKW68u9XWOKsTUMMUzPTs/NZm3UgdV1n/2n2+drk1tMH3OayKicnqnAsgKJt0X+X+/iY80KKk4TGPyM339rK5gQDlHwFvBZkpVTBwU7Ac1XKzIfSlaCxaJsIp3dqvtGXM6I0RfowMcsYUsYotwtKHNVG+dQszceCGtoxC5DUfL6ucGKAwJxfM/ZJJJSzMpdOENZj902PYbEqU+5TrltYnCZnpB3Sm4Wp9wtjdtf2NdGs1raSRh6BdJyVmWQyCcW2eajL0u9LKvH3aerMv/52Y2NxySuz+IBxZNiNlxIe073/2kcyAAAAqQZXKhaREJBYtEoYhNYcSCYugxC2p0dXB0MtaLUJq2fbgw2DME9zpfPGaLhyhVa1yzGcnTKTa+pmeEhKreJo8rQxc1wMk+xh//uUxLwAkIzxS/2GAAqOLmi9h5o4oXAtSr+a7i7gLoxpwiEAkmR1jrx6IduaWMKFWDk/Rpvh4q8cTdfMbym2w7vXibplG1Umre8cXXMVsnO3bWqaUWlZ87IbPX73O7oQAKUWGoaHXEY4/EBVECJsoQR5DmpauWGl2ww9kNSlIlCvVUm776renOJ8rFPGeVUx0K6KiFaKSLmeJfCUI1tZNLT9gUCSP0xCcGmP04jgjsZ6ML9cO0R1U2d+IhYbc+y0UXvuHsaHbnh2HcItRtW1RCyLMOGy77OK1kK9vei3qe1wkTLnVOyJfLVxHT6dcufdDLqT2GzJFc//2GdSAAAAmYIQAdliFzLkWITYAPA5goSqFtIoSQ6jqXWJzCgq1PZc9ajTro9y6HootT1exIMSOpjnKM7zyNTMrzTNDleq6GaxGmsoidnaAUiETlCXW5qhlGGRLwMxgoe1tJlrJ3HpkE0KNtGvmRnlyt8qZZUSOXKz5nRjJkM8tqKa/WYulfLX//uUxN2AkrVlQ+w9D8purOf9h6H5qt82fnN1MIxHYGKO3+6mhTEgAAO4QkEYAaOGEeE8WeuAwwqKpguNTFycDIPWd03MyQvJBvmGyOTeqCgiMjlRqW4Ukr5cukYXFTqpFJSaG8Z09tzUx/FvFfF3XYbAtggIV03o1SxSRsYFJCylJ223DJ//UqTstcLr+vnyF7BTYZ9uMWLrzi+8usuWwh547YzYfrEu2LiHTc89IP/7JPXwvf/4aFEAAAC6Bgo8xHAZISjAQVLFXp0I9UaLqtq76Z52tN1keJNpU97z5m22r7AhyuW6Uh5UijTSrYWGQYx1TzOTpczJ2Vcwj+cEUxENH+hEeO8XHa4qtjtr9X0BQVQXYzPsfF5ykaJDwLMWncn5W4zU8tSO00uzX2go18zvnVhTVDN6UcslEP7V393xNKZFXAuOqgbno0vI0tzIESecHJeagCqzqlBCBtp+V1xYW/Z2boS4u0NIGLTX7uLmUKHUBeyige59gwKFwWIJ//t0xPoAEpFlQeekfIJOJeg9h6W52oHw1MF/9fD9BwEkILkxDXu8+XtNcyQNQNrG+Yg91Dz0zdw5kvFUa5do08tLdnvNSnXnTLCovSrf7/dpZCAAASsT5JRkyqbjxQzCFAVi7bi0almdGh7rhHKomMXG8esDTE0K2G8gSRoGn8qdOXKroz0jbb4ry+4J+qkoW1g4LoAtqFGiYaRkEQ3B64ErSP3H+G3K5we04QkyN7EOi70bUKNvvHYz9993nkd/jl/PkPvq83JNAAuPcKmyr2bh7+5CN/e64l0MvcACwlwC2czJosTOjjiLcO4YRJlOciHFDaIj0sW6LPDFl+sIhwVQz1HF7aeChAQuQ1Gm1WkKqpJIACuDpZcya/f01nmz//t0xOuAkT0rP+w8z8nmJCh9hhm4IEMX8zv+3mXKaFEDvrN78sVDZyREi+FlmbmKNfT533489jNfOdCzRlBllNW87PlZYgIABd4ABxGIlKypIVp07bUXJg3Gzs912YemVCpxgRiGXzz1CAoJLETOVLWdKOVPyFiIXRJ9ZmZduRF0hQpIqgJXbfu4wRPEQjEopCjoH6J2lWaLCpQLj1s73jhx660sRjGa5Vlpxzr7etHVCsMiUBjTA96dV/3d+TSMYBAClAZUxiVBAU3GIhRW4XKF6LxZVVBgjGo8uAhUeZufnKxYySN74/yagYKoRSRTYqHnleA06IgFQ6AwJ8YqeRTkGktNQldxPbe7P/zaJIrZes+Pufv/SizcmXbXfUec//t0xO8AkQktRew9LeHXpSh89JpgRinDcZZ7+8ks5NztuO3u7qt2REAFWgBYJ6LC9LCq4q7SB8BxOYzSdKoHHAO8aA8PgMyQxhFoqcbI5KzufVSbQLFyQ6LU1/P1ZqSjC1Tzal+NOgqTlLZCqq/vas/e25whJwqLj7sZ87TkPq6ue9sdB2qHkwKTmXdEv7az//m3l5tW6GUAU5QBogd37Q3RYlVer0JJubgtMFJIdIwIA0g2bElbes0jHpOtq5YxfHwUPClC/fqd7DFWWg1lisEpZqfUgRooOjJEMCpxu7vh915wDqGZBZsRiL5+ulGDG7p9qpJef+cSbz0/HvOVzLu8q5RKQCnYA5it6KbwTkrpbb1sN0X9R0Lkmz9XtTIf//tkxPUADz0nP+wlD8nIIOh9hJm9DI3TzVtBc4DGNBDkJcX2xmGfVDTx4CHXDVulbzSnBRI8P0zZmUt1VDZZh+pJVt5/utJZxyRA4Eao7vTZMgTam9eXjJeGKYOiJbN9c7nq2vblF/Uq3iLmYY4yFdQEQPUXMycbr8XZxZRbUbC1TXD4RuTllZVl/5SgWq5K5rtUg0XDJyDA6aGn/XGCEdVU4cwzMcbI1HugVXSMw9mGNUmyg4TIgqbB0hdw8JzxX1B1hmZWh4NmQC6AArERB9M/HZVkQQMonteOGjOOFQyeuOtIlkCHrGcdzseUSPoZ//tkxOyADf0FQeekzamyHCd89Jn1Vx8NwzhqChURamo6SpeqhhYpZpr+uPtREDq0NWE45VlRSVPgBrbU0hKgAAmsV5xS2t/u0Kowu7ditIiITgvkduU1Y2sBpslEystqWeX/kzrBCIAs+kVrJokVOZi0ZFXVY+3CWeVyWWFKTEFNRTMuMTAwqqqqqqoABCLUAAjU+fDy5CxIs3PKhgCQ01VU5Ua0B4HTWquTjmf+6mhFLDUVRj54FRE9b1fQ/6n/aqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//tkxOuADokHN+w8x+lqGiY89iGgqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//tUxPGACfjjJ+exB8kWl+R0wCRRqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sUxPUDxqiDESChMMAAAD/AAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sUxNoDwAAB/gAAACAAADSAAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", C = "data:audio/mpeg;base64,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qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//tkxPIADij5M+wwzYmAm6X9hJmwqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//s0xPaAClDTI6OxLwCwkeLoEJkoqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sUxNoDwAAB/gAAACAAADSAAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq";
|
|
1
|
+
const _ = "data:audio/mpeg;base64,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", k = "data:audio/mpeg;base64,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qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//tkxPIADij5M+wwzYmAm6X9hJmwqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//s0xPaAClDTI6OxLwCwkeLoEJkoqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sUxNoDwAAB/gAAACAAADSAAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq";
|
|
2
2
|
class p {
|
|
3
3
|
/**
|
|
4
4
|
* Create a new AudioEngine instance
|
|
@@ -79,8 +79,8 @@ class p {
|
|
|
79
79
|
try {
|
|
80
80
|
if (typeof fetch < "u") {
|
|
81
81
|
const [t, e] = await Promise.all([
|
|
82
|
-
fetch(
|
|
83
|
-
fetch(
|
|
82
|
+
fetch(_),
|
|
83
|
+
fetch(k)
|
|
84
84
|
]), [i, s] = await Promise.all([
|
|
85
85
|
t.arrayBuffer(),
|
|
86
86
|
e.arrayBuffer()
|
|
@@ -189,12 +189,12 @@ class g {
|
|
|
189
189
|
}
|
|
190
190
|
if (q <= 0)
|
|
191
191
|
return a;
|
|
192
|
-
const o = Math.max(0, (r - n) * 1e3),
|
|
192
|
+
const o = Math.max(0, (r - n) * 1e3), h = setTimeout(() => {
|
|
193
193
|
this.noteOn(e, i), this.scheduledEvents.delete(`${a}_on`);
|
|
194
|
-
}, o),
|
|
194
|
+
}, o), l = o + q * 1e3, c = setTimeout(() => {
|
|
195
195
|
this.noteOff(e), this.scheduledEvents.delete(`${a}_off`);
|
|
196
|
-
},
|
|
197
|
-
return this.scheduledEvents.set(`${a}_on`,
|
|
196
|
+
}, l);
|
|
197
|
+
return this.scheduledEvents.set(`${a}_on`, h), this.scheduledEvents.set(`${a}_off`, c), a;
|
|
198
198
|
}
|
|
199
199
|
/**
|
|
200
200
|
* Stop all notes on this channel
|
|
@@ -288,7 +288,7 @@ class g {
|
|
|
288
288
|
throw new Error("AudioEngine is not initialized");
|
|
289
289
|
}
|
|
290
290
|
}
|
|
291
|
-
const
|
|
291
|
+
const y = {
|
|
292
292
|
// Piano family (0-7)
|
|
293
293
|
piano: 0,
|
|
294
294
|
bright_piano: 1,
|
|
@@ -438,8 +438,8 @@ const T = {
|
|
|
438
438
|
helicopter: 125,
|
|
439
439
|
applause: 126,
|
|
440
440
|
gunshot: 127
|
|
441
|
-
},
|
|
442
|
-
class
|
|
441
|
+
}, C = Object.entries(y).reduce((m, [t, e]) => (m[e] = t, m), {});
|
|
442
|
+
class x {
|
|
443
443
|
/**
|
|
444
444
|
* Map common instrument names to MIDI program numbers
|
|
445
445
|
* @param {string|number} instrument - Instrument name or program number
|
|
@@ -447,7 +447,7 @@ class w {
|
|
|
447
447
|
*/
|
|
448
448
|
static getInstrumentProgram(t) {
|
|
449
449
|
if (typeof t == "number") return t;
|
|
450
|
-
const e =
|
|
450
|
+
const e = y[t.toLowerCase()];
|
|
451
451
|
return e !== void 0 ? e : 0;
|
|
452
452
|
}
|
|
453
453
|
/**
|
|
@@ -456,7 +456,7 @@ class w {
|
|
|
456
456
|
* @returns {string} Instrument name or fallback
|
|
457
457
|
*/
|
|
458
458
|
static getProgramName(t) {
|
|
459
|
-
return
|
|
459
|
+
return C[t] || `Program ${t}`;
|
|
460
460
|
}
|
|
461
461
|
/**
|
|
462
462
|
* Generate a unique note ID
|
|
@@ -500,7 +500,7 @@ class v extends g {
|
|
|
500
500
|
}
|
|
501
501
|
async setInstrument(t) {
|
|
502
502
|
this._validateActive();
|
|
503
|
-
const e =
|
|
503
|
+
const e = x.getInstrumentProgram(t);
|
|
504
504
|
this.currentInstrument = t;
|
|
505
505
|
const i = this.engine._getSynthesizer();
|
|
506
506
|
i && i.programChange ? i.programChange(this.midiChannel, e) : console.warn("Cannot set instrument: synthesizer not available or no programChange method");
|
|
@@ -530,6 +530,69 @@ class v extends g {
|
|
|
530
530
|
getActiveNoteCount() {
|
|
531
531
|
return this.activeNotes.size;
|
|
532
532
|
}
|
|
533
|
+
/**
|
|
534
|
+
* Override playNote to use SpessaSynth's precise sample-accurate scheduling
|
|
535
|
+
* @param {number} startTime - Absolute audio context time when note should start
|
|
536
|
+
* @param {number} pitch - MIDI pitch (0-127)
|
|
537
|
+
* @param {number} velocity - Note velocity (0-127)
|
|
538
|
+
* @param {number} duration - Note duration in seconds
|
|
539
|
+
* @returns {string} Event ID for compatibility
|
|
540
|
+
*/
|
|
541
|
+
playNote(t, e, i, s) {
|
|
542
|
+
this._validateActive();
|
|
543
|
+
const n = `${this.partId}_${t}_${e}_${Date.now()}`, a = this.engine._getSynthesizer();
|
|
544
|
+
if (a && a.post) {
|
|
545
|
+
const r = Math.round(i * this.currentVolume);
|
|
546
|
+
a.post({
|
|
547
|
+
channelNumber: this.midiChannel,
|
|
548
|
+
type: "midiMessage",
|
|
549
|
+
data: {
|
|
550
|
+
messageData: [144 | this.midiChannel, e, r],
|
|
551
|
+
channelOffset: 0,
|
|
552
|
+
force: !1,
|
|
553
|
+
options: {
|
|
554
|
+
time: t
|
|
555
|
+
// SpessaSynth will schedule this precisely!
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
}), a.post({
|
|
559
|
+
channelNumber: this.midiChannel,
|
|
560
|
+
type: "midiMessage",
|
|
561
|
+
data: {
|
|
562
|
+
messageData: [128 | this.midiChannel, e, 0],
|
|
563
|
+
channelOffset: 0,
|
|
564
|
+
force: !1,
|
|
565
|
+
options: {
|
|
566
|
+
time: t + s
|
|
567
|
+
// Precise note-off timing!
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
});
|
|
571
|
+
} else
|
|
572
|
+
return super.playNote(t, e, i, s);
|
|
573
|
+
return n;
|
|
574
|
+
}
|
|
575
|
+
/**
|
|
576
|
+
* Override allNotesOff to use SpessaSynth messaging system
|
|
577
|
+
*/
|
|
578
|
+
allNotesOff() {
|
|
579
|
+
this._validateActive();
|
|
580
|
+
const t = this.engine._getSynthesizer();
|
|
581
|
+
t && t.post ? t.post({
|
|
582
|
+
channelNumber: this.midiChannel,
|
|
583
|
+
type: "midiMessage",
|
|
584
|
+
data: {
|
|
585
|
+
messageData: [176 | this.midiChannel, 123, 0],
|
|
586
|
+
// Control Change: All Notes Off
|
|
587
|
+
channelOffset: 0,
|
|
588
|
+
force: !1,
|
|
589
|
+
options: {
|
|
590
|
+
time: this.engine.audioContext.currentTime
|
|
591
|
+
// Execute immediately
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
}) : super.allNotesOff();
|
|
595
|
+
}
|
|
533
596
|
destroy() {
|
|
534
597
|
if (!this.isDestroyed) {
|
|
535
598
|
const t = this.engine._getIndividualOutput(this.midiChannel);
|
|
@@ -552,19 +615,15 @@ class M extends p {
|
|
|
552
615
|
super(t, e), this.synthesizer = null, this.soundfont = null, this.channelCounter = 0, this.partToMidiChannel = /* @__PURE__ */ new Map(), this.midiChannelToPart = /* @__PURE__ */ new Map(), this.individualOutputs = [];
|
|
553
616
|
}
|
|
554
617
|
async initialize(t) {
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
await this._loadAudioWorkletSafely(), this._setupIndividualOutputs(), this.dummyTarget = this.audioContext.createGain(), await new Promise((s) => setTimeout(s, 50)), this.synthesizer = new e(this.audioContext), await this.synthesizer.soundBankManager.addSoundBank(i, "main"), await this.synthesizer.isReady, this._connectIndividualOutputs(), this._initializeMetronomeChannel(), this.isInitialized = !0;
|
|
565
|
-
} catch (e) {
|
|
566
|
-
throw console.error("Failed to initialize SpessaSynthAudioEngine:", e), e;
|
|
567
|
-
}
|
|
618
|
+
const { WorkletSynthesizer: e } = await import("spessasynth_lib");
|
|
619
|
+
let i;
|
|
620
|
+
if (typeof t == "string")
|
|
621
|
+
i = await this._loadSoundfontFromPath(t);
|
|
622
|
+
else if (t instanceof ArrayBuffer)
|
|
623
|
+
i = t;
|
|
624
|
+
else
|
|
625
|
+
throw new Error("Invalid soundfont data type. Expected string path or ArrayBuffer.");
|
|
626
|
+
await this._loadAudioWorkletSafely(), this._setupIndividualOutputs(), this.dummyTarget = this.audioContext.createGain(), await new Promise((s) => setTimeout(s, 50)), this.synthesizer = new e(this.audioContext), await this.synthesizer.soundBankManager.addSoundBank(i, "main"), await this.synthesizer.isReady, this._connectIndividualOutputs(), this._initializeMetronomeChannel(), this.isInitialized = !0;
|
|
568
627
|
}
|
|
569
628
|
createChannel(t, e = {}) {
|
|
570
629
|
if (this._validateInitialized(), this.partToMidiChannel.has(t))
|
|
@@ -659,15 +718,10 @@ class M extends p {
|
|
|
659
718
|
* @private
|
|
660
719
|
*/
|
|
661
720
|
async _loadSoundfontFromPath(t) {
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
return await e.arrayBuffer();
|
|
667
|
-
} else {
|
|
668
|
-
const e = await Promise.resolve().then(() => y), i = await Promise.resolve().then(() => y), s = i.isAbsolute(t) ? t : i.resolve(process.cwd(), t);
|
|
669
|
-
return e.readFileSync(s).buffer;
|
|
670
|
-
}
|
|
721
|
+
const e = await fetch(t);
|
|
722
|
+
if (!e.ok)
|
|
723
|
+
throw new Error(`Failed to load soundfont: ${e.status} ${e.statusText}`);
|
|
724
|
+
return await e.arrayBuffer();
|
|
671
725
|
}
|
|
672
726
|
/**
|
|
673
727
|
* Load AudioWorklet
|
|
@@ -715,8 +769,32 @@ class M extends p {
|
|
|
715
769
|
const s = this.getMetronomeChannel(), n = this._getSynthesizer();
|
|
716
770
|
if (!s || !n)
|
|
717
771
|
return super.playMetronomeTick(t, e, i);
|
|
718
|
-
const a = 15, r = e ? 86 : 60, o = Math.round(Math.min(127, Math.max(0, i * (e ? 127 : 100)))),
|
|
719
|
-
|
|
772
|
+
const a = 15, r = e ? 86 : 60, o = Math.round(Math.min(127, Math.max(0, i * (e ? 127 : 100)))), h = this.audioContext.currentTime, l = Math.max(t, h), c = l - h;
|
|
773
|
+
n.post ? (n.post({
|
|
774
|
+
channelNumber: a,
|
|
775
|
+
type: "midiMessage",
|
|
776
|
+
data: {
|
|
777
|
+
messageData: [144 | a, r, o],
|
|
778
|
+
channelOffset: 0,
|
|
779
|
+
force: !1,
|
|
780
|
+
options: {
|
|
781
|
+
time: l
|
|
782
|
+
// Sample-accurate metronome timing!
|
|
783
|
+
}
|
|
784
|
+
}
|
|
785
|
+
}), n.post({
|
|
786
|
+
channelNumber: a,
|
|
787
|
+
type: "midiMessage",
|
|
788
|
+
data: {
|
|
789
|
+
messageData: [128 | a, r, 0],
|
|
790
|
+
channelOffset: 0,
|
|
791
|
+
force: !1,
|
|
792
|
+
options: {
|
|
793
|
+
time: l + 0.1
|
|
794
|
+
// Precise tick duration!
|
|
795
|
+
}
|
|
796
|
+
}
|
|
797
|
+
})) : c <= 0.01 ? (n.noteOn && n.noteOn(a, r, o), setTimeout(() => {
|
|
720
798
|
n.noteOff && n.noteOff(a, r);
|
|
721
799
|
}, 100)) : setTimeout(() => {
|
|
722
800
|
n.noteOn && n.noteOn(a, r, o), setTimeout(() => {
|
|
@@ -735,7 +813,7 @@ class M extends p {
|
|
|
735
813
|
return !this.individualOutputs || this.individualOutputs.length < 16 ? null : this.individualOutputs[15];
|
|
736
814
|
}
|
|
737
815
|
}
|
|
738
|
-
class
|
|
816
|
+
class E {
|
|
739
817
|
constructor() {
|
|
740
818
|
this.partNames = [
|
|
741
819
|
"soprano",
|
|
@@ -787,10 +865,10 @@ class S {
|
|
|
787
865
|
duration: 0
|
|
788
866
|
};
|
|
789
867
|
let o = 8 + i;
|
|
790
|
-
for (let
|
|
868
|
+
for (let h = 0; h < n; h++)
|
|
791
869
|
if (e[o] === 77 && e[o + 1] === 84 && e[o + 2] === 114 && e[o + 3] === 107) {
|
|
792
|
-
const
|
|
793
|
-
q.tracks.push(A), o += 8 +
|
|
870
|
+
const l = this._bytesToNumber(e.slice(o + 4, o + 8)), c = e.slice(o + 8, o + 8 + l), A = this._parseTrack(c);
|
|
871
|
+
q.tracks.push(A), o += 8 + l;
|
|
794
872
|
} else
|
|
795
873
|
throw new Error(`Invalid track header at position ${o}`);
|
|
796
874
|
return q;
|
|
@@ -822,28 +900,28 @@ class S {
|
|
|
822
900
|
} else
|
|
823
901
|
n = q;
|
|
824
902
|
if (q === 255) {
|
|
825
|
-
const o = t[i++],
|
|
826
|
-
i +=
|
|
827
|
-
const
|
|
828
|
-
switch (i +=
|
|
903
|
+
const o = t[i++], h = this._readVariableLengthValue(t, i);
|
|
904
|
+
i += h.bytesRead;
|
|
905
|
+
const l = t.slice(i, i + h.value);
|
|
906
|
+
switch (i += h.value, o) {
|
|
829
907
|
case 3:
|
|
830
|
-
e.name = this._bytesToString(
|
|
908
|
+
e.name = this._bytesToString(l);
|
|
831
909
|
break;
|
|
832
910
|
case 1:
|
|
833
911
|
e.events.push({
|
|
834
912
|
type: "text",
|
|
835
|
-
text: this._bytesToString(
|
|
913
|
+
text: this._bytesToString(l),
|
|
836
914
|
tick: s
|
|
837
915
|
});
|
|
838
916
|
break;
|
|
839
917
|
case 5:
|
|
840
918
|
e.lyrics.push({
|
|
841
|
-
text: this._bytesToString(
|
|
919
|
+
text: this._bytesToString(l),
|
|
842
920
|
tick: s
|
|
843
921
|
});
|
|
844
922
|
break;
|
|
845
923
|
case 81:
|
|
846
|
-
const c = this._bytesToNumber(
|
|
924
|
+
const c = this._bytesToNumber(l), A = Math.round(6e7 / c);
|
|
847
925
|
e.events.push({
|
|
848
926
|
type: "tempo",
|
|
849
927
|
bpm: A,
|
|
@@ -853,8 +931,8 @@ class S {
|
|
|
853
931
|
case 88:
|
|
854
932
|
e.events.push({
|
|
855
933
|
type: "timeSignature",
|
|
856
|
-
numerator:
|
|
857
|
-
denominator: Math.pow(2,
|
|
934
|
+
numerator: l[0],
|
|
935
|
+
denominator: Math.pow(2, l[1]),
|
|
858
936
|
tick: s
|
|
859
937
|
});
|
|
860
938
|
break;
|
|
@@ -863,24 +941,24 @@ class S {
|
|
|
863
941
|
break;
|
|
864
942
|
}
|
|
865
943
|
} else if ((q & 240) === 144) {
|
|
866
|
-
const o = q & 15,
|
|
867
|
-
|
|
944
|
+
const o = q & 15, h = t[i++], l = t[i++];
|
|
945
|
+
l > 0 ? e.notes.push({
|
|
868
946
|
type: "noteOn",
|
|
869
|
-
noteNumber:
|
|
870
|
-
velocity:
|
|
947
|
+
noteNumber: h,
|
|
948
|
+
velocity: l,
|
|
871
949
|
tick: s,
|
|
872
950
|
channel: o
|
|
873
951
|
}) : e.notes.push({
|
|
874
952
|
type: "noteOff",
|
|
875
|
-
noteNumber:
|
|
953
|
+
noteNumber: h,
|
|
876
954
|
tick: s,
|
|
877
955
|
channel: o
|
|
878
956
|
});
|
|
879
957
|
} else if ((q & 240) === 128) {
|
|
880
|
-
const o = q & 15,
|
|
958
|
+
const o = q & 15, h = t[i++];
|
|
881
959
|
t[i++], e.notes.push({
|
|
882
960
|
type: "noteOff",
|
|
883
|
-
noteNumber:
|
|
961
|
+
noteNumber: h,
|
|
884
962
|
tick: s,
|
|
885
963
|
channel: o
|
|
886
964
|
});
|
|
@@ -888,32 +966,32 @@ class S {
|
|
|
888
966
|
const o = this._readVariableLengthValue(t, i);
|
|
889
967
|
i += o.bytesRead + o.value;
|
|
890
968
|
} else if ((q & 240) === 176) {
|
|
891
|
-
const o = q & 15,
|
|
969
|
+
const o = q & 15, h = t[i++], l = t[i++];
|
|
892
970
|
e.events.push({
|
|
893
971
|
type: "controller",
|
|
894
|
-
controllerNumber:
|
|
895
|
-
value:
|
|
972
|
+
controllerNumber: h,
|
|
973
|
+
value: l,
|
|
896
974
|
channel: o,
|
|
897
975
|
tick: s
|
|
898
976
|
});
|
|
899
977
|
} else if ((q & 240) === 192) {
|
|
900
|
-
const o = q & 15,
|
|
978
|
+
const o = q & 15, h = t[i++];
|
|
901
979
|
e.events.push({
|
|
902
980
|
type: "programChange",
|
|
903
|
-
programNumber:
|
|
981
|
+
programNumber: h,
|
|
904
982
|
channel: o,
|
|
905
983
|
tick: s
|
|
906
984
|
});
|
|
907
985
|
} else if ((q & 240) === 208) {
|
|
908
|
-
const o = q & 15,
|
|
986
|
+
const o = q & 15, h = t[i++];
|
|
909
987
|
e.events.push({
|
|
910
988
|
type: "channelAftertouch",
|
|
911
|
-
pressure:
|
|
989
|
+
pressure: h,
|
|
912
990
|
channel: o,
|
|
913
991
|
tick: s
|
|
914
992
|
});
|
|
915
993
|
} else if ((q & 240) === 224) {
|
|
916
|
-
const o = q & 15,
|
|
994
|
+
const o = q & 15, h = t[i++], c = (t[i++] << 7 | h) - 8192;
|
|
917
995
|
e.events.push({
|
|
918
996
|
type: "pitchBend",
|
|
919
997
|
value: c,
|
|
@@ -921,11 +999,11 @@ class S {
|
|
|
921
999
|
tick: s
|
|
922
1000
|
});
|
|
923
1001
|
} else if ((q & 240) === 160) {
|
|
924
|
-
const o = q & 15,
|
|
1002
|
+
const o = q & 15, h = t[i++], l = t[i++];
|
|
925
1003
|
e.events.push({
|
|
926
1004
|
type: "noteAftertouch",
|
|
927
|
-
noteNumber:
|
|
928
|
-
pressure:
|
|
1005
|
+
noteNumber: h,
|
|
1006
|
+
pressure: l,
|
|
929
1007
|
channel: o,
|
|
930
1008
|
tick: s
|
|
931
1009
|
});
|
|
@@ -970,35 +1048,35 @@ class S {
|
|
|
970
1048
|
*/
|
|
971
1049
|
_extractBarStructure(t) {
|
|
972
1050
|
const e = t.ticksPerBeat || 480, i = [];
|
|
973
|
-
t.tracks.forEach((
|
|
974
|
-
|
|
975
|
-
(
|
|
1051
|
+
t.tracks.forEach((h) => {
|
|
1052
|
+
h.events.forEach((l) => {
|
|
1053
|
+
(l.type === "timeSignature" || l.type === "tempo") && i.push(l);
|
|
976
1054
|
});
|
|
977
|
-
}), i.sort((
|
|
1055
|
+
}), i.sort((h, l) => h.tick - l.tick);
|
|
978
1056
|
let s = 0;
|
|
979
|
-
t.tracks.forEach((
|
|
980
|
-
|
|
981
|
-
|
|
1057
|
+
t.tracks.forEach((h) => {
|
|
1058
|
+
h.notes && h.notes.forEach((l) => {
|
|
1059
|
+
l.type === "noteOff" && l.tick > s && (s = l.tick);
|
|
982
1060
|
});
|
|
983
1061
|
}), s === 0 && (s = e * 8);
|
|
984
|
-
const n = [], a = i.filter((
|
|
1062
|
+
const n = [], a = i.filter((h) => h.type === "timeSignature").sort((h, l) => h.tick - l.tick);
|
|
985
1063
|
let r = { numerator: 4, denominator: 4 }, q = 0, o = 0;
|
|
986
1064
|
for (; q < s; ) {
|
|
987
1065
|
for (; o < a.length && a[o].tick <= q; )
|
|
988
1066
|
r = a[o], o++;
|
|
989
|
-
let
|
|
990
|
-
|
|
991
|
-
(u) => u.type === "tempo" && u.tick >= q && u.tick <
|
|
1067
|
+
let h;
|
|
1068
|
+
h = q + e * 4 * r.numerator / r.denominator, i.filter(
|
|
1069
|
+
(u) => u.type === "tempo" && u.tick >= q && u.tick < h
|
|
992
1070
|
);
|
|
993
|
-
const
|
|
994
|
-
for (let u = 0; u <
|
|
1071
|
+
const l = r.numerator, c = [], A = e * (4 / r.denominator);
|
|
1072
|
+
for (let u = 0; u < l; u++) {
|
|
995
1073
|
const d = q + u * A, f = this._ticksToTime(d, t);
|
|
996
1074
|
c.push(f);
|
|
997
1075
|
}
|
|
998
1076
|
n.push({
|
|
999
1077
|
sig: [r.numerator, r.denominator],
|
|
1000
1078
|
beats: c
|
|
1001
|
-
}), q =
|
|
1079
|
+
}), q = h;
|
|
1002
1080
|
}
|
|
1003
1081
|
this.parsedData.barStructure = n;
|
|
1004
1082
|
}
|
|
@@ -1029,15 +1107,15 @@ class S {
|
|
|
1029
1107
|
for (; e[r]; )
|
|
1030
1108
|
r = `${a} ${q}`, q++;
|
|
1031
1109
|
a = r;
|
|
1032
|
-
const o = [],
|
|
1110
|
+
const o = [], h = {};
|
|
1033
1111
|
s.notes.forEach((u) => {
|
|
1034
1112
|
if (u.type === "noteOn")
|
|
1035
|
-
|
|
1113
|
+
h[u.noteNumber] = {
|
|
1036
1114
|
tick: u.tick,
|
|
1037
1115
|
velocity: u.velocity
|
|
1038
1116
|
};
|
|
1039
|
-
else if (u.type === "noteOff" &&
|
|
1040
|
-
const d =
|
|
1117
|
+
else if (u.type === "noteOff" && h[u.noteNumber]) {
|
|
1118
|
+
const d = h[u.noteNumber], f = u.tick - d.tick;
|
|
1041
1119
|
o.push({
|
|
1042
1120
|
pitch: u.noteNumber,
|
|
1043
1121
|
name: this._midiNoteToName(u.noteNumber),
|
|
@@ -1048,10 +1126,10 @@ class S {
|
|
|
1048
1126
|
startTime: this._ticksToTime(d.tick, t),
|
|
1049
1127
|
endTime: this._ticksToTime(u.tick, t),
|
|
1050
1128
|
velocity: d.velocity
|
|
1051
|
-
}), delete
|
|
1129
|
+
}), delete h[u.noteNumber];
|
|
1052
1130
|
}
|
|
1053
1131
|
});
|
|
1054
|
-
const
|
|
1132
|
+
const l = s.lyrics.map((u) => ({
|
|
1055
1133
|
text: u.text,
|
|
1056
1134
|
tick: u.tick,
|
|
1057
1135
|
time: u.tick / i
|
|
@@ -1065,7 +1143,7 @@ class S {
|
|
|
1065
1143
|
})).sort((u, d) => u.tick - d.tick), A = c.length > 0 ? c[0].programNumber : 0;
|
|
1066
1144
|
e[a] = {
|
|
1067
1145
|
notes: o,
|
|
1068
|
-
lyrics:
|
|
1146
|
+
lyrics: l,
|
|
1069
1147
|
trackIndex: n,
|
|
1070
1148
|
programChanges: c,
|
|
1071
1149
|
defaultInstrument: A
|
|
@@ -1123,8 +1201,8 @@ class S {
|
|
|
1123
1201
|
for (const q of s) {
|
|
1124
1202
|
if (q.tick > t) break;
|
|
1125
1203
|
if (q.tick > a) {
|
|
1126
|
-
const
|
|
1127
|
-
n +=
|
|
1204
|
+
const h = (q.tick - a) / i * (60 / r);
|
|
1205
|
+
n += h, a = q.tick;
|
|
1128
1206
|
}
|
|
1129
1207
|
r = q.bpm;
|
|
1130
1208
|
}
|
|
@@ -1135,7 +1213,7 @@ class S {
|
|
|
1135
1213
|
return n;
|
|
1136
1214
|
}
|
|
1137
1215
|
}
|
|
1138
|
-
class
|
|
1216
|
+
class w {
|
|
1139
1217
|
constructor() {
|
|
1140
1218
|
this.barOrder = [], this.beatTable = [];
|
|
1141
1219
|
}
|
|
@@ -1166,13 +1244,13 @@ class E {
|
|
|
1166
1244
|
throw new Error(`Invalid section index: ${n.section}`);
|
|
1167
1245
|
const r = n.section;
|
|
1168
1246
|
s[r] || (s[r] = 0), s[r]++;
|
|
1169
|
-
const q = s[r], o = n.from !== void 0 ? n.from : this._getSectionStartBar(t, n.section),
|
|
1170
|
-
for (let c = o; c <=
|
|
1171
|
-
this._shouldPlayBar(a, c,
|
|
1247
|
+
const q = s[r], o = n.from !== void 0 ? n.from : this._getSectionStartBar(t, n.section), h = n.to !== void 0 ? n.to : a.to, l = n.as || 1;
|
|
1248
|
+
for (let c = o; c <= h; c++)
|
|
1249
|
+
this._shouldPlayBar(a, c, l) && i.push({
|
|
1172
1250
|
barNumber: c,
|
|
1173
1251
|
repeat: q,
|
|
1174
1252
|
sectionIndex: n.section,
|
|
1175
|
-
voltaTime:
|
|
1253
|
+
voltaTime: l
|
|
1176
1254
|
});
|
|
1177
1255
|
}
|
|
1178
1256
|
return i;
|
|
@@ -1196,34 +1274,34 @@ class E {
|
|
|
1196
1274
|
throw new Error(`Invalid MIDI bar structure at index ${n}`);
|
|
1197
1275
|
s[o] = A.sig[0];
|
|
1198
1276
|
}
|
|
1199
|
-
const
|
|
1200
|
-
let
|
|
1201
|
-
for (; c <
|
|
1277
|
+
const h = s[o];
|
|
1278
|
+
let l = r[n], c = l.sig[0];
|
|
1279
|
+
for (; c < h && n + 1 < r.length; ) {
|
|
1202
1280
|
const A = r[n + 1], u = [
|
|
1203
|
-
|
|
1281
|
+
l.sig[0] + A.sig[0],
|
|
1204
1282
|
// Total beats
|
|
1205
|
-
|
|
1283
|
+
l.sig[1]
|
|
1206
1284
|
// Keep original note value
|
|
1207
1285
|
], d = [
|
|
1208
|
-
...
|
|
1286
|
+
...l.beats || [],
|
|
1209
1287
|
...A.beats || []
|
|
1210
1288
|
];
|
|
1211
|
-
|
|
1289
|
+
l = {
|
|
1212
1290
|
sig: u,
|
|
1213
1291
|
beats: d
|
|
1214
|
-
}, r[n] =
|
|
1292
|
+
}, r[n] = l, r.splice(n + 1, 1), c = u[0];
|
|
1215
1293
|
}
|
|
1216
|
-
if (c >
|
|
1217
|
-
const A =
|
|
1218
|
-
sig: [A,
|
|
1294
|
+
if (c > h) {
|
|
1295
|
+
const A = h, u = c - h, d = l.beats ? l.beats.slice(0, A) : [], f = l.beats ? l.beats.slice(A) : [], b = {
|
|
1296
|
+
sig: [A, l.sig[1]],
|
|
1219
1297
|
beats: d
|
|
1220
1298
|
}, I = {
|
|
1221
|
-
sig: [u,
|
|
1299
|
+
sig: [u, l.sig[1]],
|
|
1222
1300
|
beats: f
|
|
1223
1301
|
};
|
|
1224
|
-
r[n] = b, r.splice(n + 1, 0, I),
|
|
1302
|
+
r[n] = b, r.splice(n + 1, 0, I), l = b;
|
|
1225
1303
|
}
|
|
1226
|
-
this._generateBeatsForBar(i, q,
|
|
1304
|
+
this._generateBeatsForBar(i, q, l, h), n++, a++;
|
|
1227
1305
|
}
|
|
1228
1306
|
if (a < t.length)
|
|
1229
1307
|
throw new Error(`Ran out of MIDI bars before completing score. Score bar ${a}/${t.length}, MIDI bar ${n}/${r.length}`);
|
|
@@ -1267,7 +1345,7 @@ class E {
|
|
|
1267
1345
|
return s === -1 ? !0 : s + 1 === i;
|
|
1268
1346
|
}
|
|
1269
1347
|
}
|
|
1270
|
-
function
|
|
1348
|
+
function T(m) {
|
|
1271
1349
|
return { all: m = m || /* @__PURE__ */ new Map(), on: function(t, e) {
|
|
1272
1350
|
var i = m.get(t);
|
|
1273
1351
|
i ? i.push(e) : m.set(t, [e]);
|
|
@@ -1283,7 +1361,7 @@ function _(m) {
|
|
|
1283
1361
|
});
|
|
1284
1362
|
} };
|
|
1285
1363
|
}
|
|
1286
|
-
class
|
|
1364
|
+
class S {
|
|
1287
1365
|
/**
|
|
1288
1366
|
* Create a new MidiPlayer instance
|
|
1289
1367
|
* @param {AudioEngine} audioEngine - Initialized audio engine instance
|
|
@@ -1296,7 +1374,7 @@ class B {
|
|
|
1296
1374
|
throw new Error("Initialized AudioEngine is required");
|
|
1297
1375
|
if (!e)
|
|
1298
1376
|
throw new Error("Parsed MIDI data is required");
|
|
1299
|
-
this.audioEngine = t, this.instrumentMap = i || {}, this.parsedData = e, this._isPlaying = !1, this._currentTime = 0, this._totalDuration = 0, this.playbackSpeed = 1, this.partChannels = /* @__PURE__ */ new Map(), this.partOutputs = /* @__PURE__ */ new Map(), this.playbackStartTime = 0, this.lookAheadTime = 0.05, this.scheduleInterval = null, this.partNotePointers = /* @__PURE__ */ new Map(), this.partProgramPointers = /* @__PURE__ */ new Map(), this.eventBus =
|
|
1377
|
+
this.audioEngine = t, this.instrumentMap = i || {}, this.parsedData = e, this._isPlaying = !1, this._currentTime = 0, this._totalDuration = 0, this.playbackSpeed = 1, this.partChannels = /* @__PURE__ */ new Map(), this.partOutputs = /* @__PURE__ */ new Map(), this.playbackStartTime = 0, this.lookAheadTime = 0.05, this.scheduleInterval = null, this.partNotePointers = /* @__PURE__ */ new Map(), this.partProgramPointers = /* @__PURE__ */ new Map(), this.eventBus = T(), this.beatMapper = new w(), this.beats = [], this._setupPartChannels(), this._calculateTotalDuration(), this._resetNotePointers(), this._resetProgramPointers();
|
|
1300
1378
|
const n = s || this._createDefaultStructureMetadata();
|
|
1301
1379
|
this.beats = this.beatMapper.mapBeats(e, n);
|
|
1302
1380
|
}
|
|
@@ -1346,7 +1424,9 @@ class B {
|
|
|
1346
1424
|
if (t <= 0)
|
|
1347
1425
|
throw new Error("Playback speed must be greater than 0");
|
|
1348
1426
|
const i = e && this._isPlaying;
|
|
1349
|
-
i && this.pause()
|
|
1427
|
+
i && this.pause();
|
|
1428
|
+
const s = (this.audioEngine.audioContext.currentTime - this.playbackStartTime) * this.playbackSpeed;
|
|
1429
|
+
this.playbackSpeed = t, i ? this.play() : this.playbackStartTime = this.audioEngine.audioContext.currentTime - s / this.playbackSpeed;
|
|
1350
1430
|
}
|
|
1351
1431
|
/**
|
|
1352
1432
|
* Navigate to a specific bar position
|
|
@@ -1521,8 +1601,8 @@ class B {
|
|
|
1521
1601
|
for (; r < q.length && q[r].startTime <= i; ) {
|
|
1522
1602
|
const o = q[r];
|
|
1523
1603
|
if (o.endTime - o.startTime >= 0.01) {
|
|
1524
|
-
const
|
|
1525
|
-
n.playNote(
|
|
1604
|
+
const h = this.playbackStartTime + o.startTime / this.playbackSpeed, l = (o.endTime - o.startTime) / this.playbackSpeed;
|
|
1605
|
+
n.playNote(h, o.pitch, o.velocity, l);
|
|
1526
1606
|
}
|
|
1527
1607
|
r++;
|
|
1528
1608
|
}
|
|
@@ -1637,7 +1717,7 @@ class B {
|
|
|
1637
1717
|
}), this.partOutputs.clear(), this.partNotePointers.clear(), this.partProgramPointers.clear(), this.eventBus.all.clear();
|
|
1638
1718
|
}
|
|
1639
1719
|
}
|
|
1640
|
-
class
|
|
1720
|
+
class B {
|
|
1641
1721
|
/**
|
|
1642
1722
|
* Create a new PlaybackManager instance
|
|
1643
1723
|
* @param {MidiPlayer} midiPlayer - Initialized MidiPlayer instance
|
|
@@ -1656,7 +1736,7 @@ class P {
|
|
|
1656
1736
|
constructor(t, e = {}) {
|
|
1657
1737
|
if (!t)
|
|
1658
1738
|
throw new Error("MidiPlayer is required");
|
|
1659
|
-
this.midiPlayer = t, this.audioEngine = t.audioEngine, this.eventBus =
|
|
1739
|
+
this.midiPlayer = t, this.audioEngine = t.audioEngine, this.eventBus = T(), this.metronomeConfig = {
|
|
1660
1740
|
enabled: !1,
|
|
1661
1741
|
tickInstrument: 115,
|
|
1662
1742
|
// woodblock
|
|
@@ -1996,12 +2076,12 @@ class P {
|
|
|
1996
2076
|
for (; t[s].time > e; ) s--;
|
|
1997
2077
|
const a = t[s], r = t[s + 1];
|
|
1998
2078
|
r ? n = r.time - a.time : s > 0 && (n = a.time - t[s - 1].time);
|
|
1999
|
-
const q = this.midiPlayer.playbackSpeed || 1, o = n / q,
|
|
2079
|
+
const q = this.midiPlayer.playbackSpeed || 1, o = n / q, h = a.timeSig === 1, l = h && r ? r.timeSig : a.timeSig, c = h ? l - 1 : a.beat > 1 ? a.beat - 1 : 0, A = i * l + c;
|
|
2000
2080
|
return {
|
|
2001
2081
|
totalBeats: A,
|
|
2002
2082
|
duration: A * o,
|
|
2003
|
-
beatSequence: this._generateBeatSequence(A, o,
|
|
2004
|
-
beatsPerBar:
|
|
2083
|
+
beatSequence: this._generateBeatSequence(A, o, l),
|
|
2084
|
+
beatsPerBar: l,
|
|
2005
2085
|
startBeat: a
|
|
2006
2086
|
};
|
|
2007
2087
|
}
|
|
@@ -2168,8 +2248,8 @@ class P {
|
|
|
2168
2248
|
if (n.time > s)
|
|
2169
2249
|
break;
|
|
2170
2250
|
if (a >= -0.025 && a <= 0.15) {
|
|
2171
|
-
const r = this.audioEngine.audioContext.currentTime + 5e-3, q = this.audioEngine.audioContext.currentTime + Math.max(a, 5e-3), o = Math.max(r, q),
|
|
2172
|
-
this._scheduleTickAtTime(o,
|
|
2251
|
+
const r = this.audioEngine.audioContext.currentTime + 5e-3, q = this.audioEngine.audioContext.currentTime + Math.max(a, 5e-3), o = Math.max(r, q), h = n.beat === 1;
|
|
2252
|
+
this._scheduleTickAtTime(o, h);
|
|
2173
2253
|
}
|
|
2174
2254
|
this.nextBeatIndex++;
|
|
2175
2255
|
}
|
|
@@ -2274,17 +2354,14 @@ class P {
|
|
|
2274
2354
|
this.stop(), this._stopLeadIn(), this._stopMetronome(), this._stopTimeUpdateLoop(), this.eventBus.all.clear();
|
|
2275
2355
|
}
|
|
2276
2356
|
}
|
|
2277
|
-
const y = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
2278
|
-
__proto__: null
|
|
2279
|
-
}, Symbol.toStringTag, { value: "Module" }));
|
|
2280
2357
|
export {
|
|
2281
2358
|
p as AudioEngine,
|
|
2282
|
-
|
|
2283
|
-
|
|
2359
|
+
x as AudioEngineUtils,
|
|
2360
|
+
w as BeatMapper,
|
|
2284
2361
|
g as ChannelHandle,
|
|
2285
|
-
|
|
2286
|
-
|
|
2287
|
-
|
|
2362
|
+
E as MidiParser,
|
|
2363
|
+
S as MidiPlayer,
|
|
2364
|
+
B as PlaybackManager,
|
|
2288
2365
|
M as SpessaSynthAudioEngine,
|
|
2289
2366
|
v as SpessaSynthChannelHandle
|
|
2290
2367
|
};
|