fix: dùng fluid_synth_program_select thay vì bank_select+program_change

Khi load SF2, preset lookup của program_change dùng search order
(lần lượt qua các SF đã load). Track 1 load SF2→SF2 presets override
SF1 trên tất cả channel, track 2 chọn nhầm preset của SF2.
Fix: program_select(synth, ch, sfHandle, bank, prog) chỉ định rõ
SoundFont ID, không phụ thuộc search order.
This commit is contained in:
2026-07-27 16:08:54 +07:00
parent 15ec35d8d9
commit 2b04b32ea8
+14 -8
View File
@@ -239,12 +239,15 @@
} else { } else {
channel = _engineChMap[engKey]; channel = _engineChMap[engKey];
} }
var sfHandle = _sfHandleMap.get(sfId);
if (sfHandle !== undefined) {
try { try {
_fluidModule._fluid_synth_bank_select(_synthPtr, channel, bank); _fluidModule._fluid_synth_program_select(_synthPtr, channel, sfHandle, bank, program);
} catch (e) {}
try {
_fluidModule._fluid_synth_program_change(_synthPtr, channel, program);
} catch (e) {} } catch (e) {}
} else {
try { _fluidModule._fluid_synth_bank_select(_synthPtr, channel, bank); } catch (e) {}
try { _fluidModule._fluid_synth_program_change(_synthPtr, channel, program); } catch (e) {}
}
_channels[channel].bank = bank; _channels[channel].bank = bank;
_channels[channel].program = program; _channels[channel].program = program;
_channels[channel].isPercussion = (bank === 128); _channels[channel].isPercussion = (bank === 128);
@@ -368,12 +371,15 @@
ch = usedBank === 128 ? 9 : 0; ch = usedBank === 128 ? 9 : 0;
} }
if (ch === undefined) ch = (usedBank === 128 ? 9 : 0); if (ch === undefined) ch = (usedBank === 128 ? 9 : 0);
var sfHandle = synthEngine.soundfont_id ? _sfHandleMap.get(synthEngine.soundfont_id) : undefined;
if (sfHandle !== undefined) {
try { try {
_fluidModule._fluid_synth_bank_select(_synthPtr, ch, usedBank); _fluidModule._fluid_synth_program_select(_synthPtr, ch, sfHandle, usedBank, usedProg);
} catch (e) {}
try {
_fluidModule._fluid_synth_program_change(_synthPtr, ch, usedProg);
} catch (e) {} } catch (e) {}
} else {
try { _fluidModule._fluid_synth_bank_select(_synthPtr, ch, usedBank); } catch (e) {}
try { _fluidModule._fluid_synth_program_change(_synthPtr, ch, usedProg); } catch (e) {}
}
} else if (program !== undefined) { } else if (program !== undefined) {
usedProg = program; usedProg = program;
if (ch === undefined) ch = 0; if (ch === undefined) ch = 0;