From 2b04b32ea86ee3667e75c37ecc2114ecabfbed65 Mon Sep 17 00:00:00 2001 From: 3dtours Date: Mon, 27 Jul 2026 16:08:54 +0700 Subject: [PATCH] =?UTF-8?q?fix:=20d=C3=B9ng=20fluid=5Fsynth=5Fprogram=5Fse?= =?UTF-8?q?lect=20thay=20v=C3=AC=20bank=5Fselect+program=5Fchange?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- app/static/js/services/soundfontPlayer.js | 30 ++++++++++++++--------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/app/static/js/services/soundfontPlayer.js b/app/static/js/services/soundfontPlayer.js index e236623..08812bb 100644 --- a/app/static/js/services/soundfontPlayer.js +++ b/app/static/js/services/soundfontPlayer.js @@ -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;