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:
@@ -239,12 +239,15 @@
|
||||
} else {
|
||||
channel = _engineChMap[engKey];
|
||||
}
|
||||
try {
|
||||
_fluidModule._fluid_synth_bank_select(_synthPtr, channel, bank);
|
||||
} catch (e) {}
|
||||
try {
|
||||
_fluidModule._fluid_synth_program_change(_synthPtr, channel, program);
|
||||
} catch (e) {}
|
||||
var sfHandle = _sfHandleMap.get(sfId);
|
||||
if (sfHandle !== undefined) {
|
||||
try {
|
||||
_fluidModule._fluid_synth_program_select(_synthPtr, channel, sfHandle, bank, program);
|
||||
} 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].program = program;
|
||||
_channels[channel].isPercussion = (bank === 128);
|
||||
@@ -368,12 +371,15 @@
|
||||
ch = usedBank === 128 ? 9 : 0;
|
||||
}
|
||||
if (ch === undefined) ch = (usedBank === 128 ? 9 : 0);
|
||||
try {
|
||||
_fluidModule._fluid_synth_bank_select(_synthPtr, ch, usedBank);
|
||||
} catch (e) {}
|
||||
try {
|
||||
_fluidModule._fluid_synth_program_change(_synthPtr, ch, usedProg);
|
||||
} catch (e) {}
|
||||
var sfHandle = synthEngine.soundfont_id ? _sfHandleMap.get(synthEngine.soundfont_id) : undefined;
|
||||
if (sfHandle !== undefined) {
|
||||
try {
|
||||
_fluidModule._fluid_synth_program_select(_synthPtr, ch, sfHandle, usedBank, usedProg);
|
||||
} 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) {
|
||||
usedProg = program;
|
||||
if (ch === undefined) ch = 0;
|
||||
|
||||
Reference in New Issue
Block a user