feat(engine): fix SF2 path resolution, add synth_engine struct and fallback chain

- Fix SF2 path: search upload dir, system dir, static dir (backward compat)
- Add synth_engine struct parsing with flat field fallback
- Add 3-level fallback: selected SF -> default SF -> oscillator synth
- Write synth_engine in setTrackInstrument UI setters
- Pass synth_engine context to client SoundFontPlayer and AI gateway
This commit is contained in:
2026-07-26 16:49:40 +07:00
parent 2ab989132b
commit d48262d468
5 changed files with 99 additions and 22 deletions
+15 -2
View File
@@ -57,7 +57,11 @@
return ch;
},
applyAITrackInstrument: function (bank, program) {
applyAITrackInstrument: function (bank, program, synthEngine) {
if (synthEngine) {
bank = bank !== undefined ? bank : (synthEngine.soundfont_bank || 0);
program = program !== undefined ? program : (synthEngine.soundfont_program || 0);
}
const channel = this.allocateChannel(bank);
this.controllerChange(channel, 0, bank);
this.programChange(channel, program);
@@ -79,11 +83,20 @@
return buffer;
},
playNote: function (note, velocity, durationMs, startTime, program, destinationNode, channel) {
playNote: function (note, velocity, durationMs, startTime, program, destinationNode, channel, synthEngine) {
const ctx = getCtx();
const freq = 440 * Math.pow(2, (note - 69) / 12);
if (freq <= 0 || isNaN(freq)) return null;
// Apply synth_engine state if provided
if (synthEngine) {
const ch = channel !== undefined ? channel : (synthEngine.soundfont_bank === 128 ? 9 : 0);
this.controllerChange(ch, 0, synthEngine.soundfont_bank || 0);
this.programChange(ch, synthEngine.soundfont_program || 0);
if (channel === undefined) channel = ch;
if (program === undefined) program = synthEngine.soundfont_program;
}
const osc = ctx.createOscillator();
const noteGain = ctx.createGain();