diff --git a/native_bridge/src/NativeInstrumentEngine.cpp b/native_bridge/src/NativeInstrumentEngine.cpp index e438bbf..8eefa3a 100644 --- a/native_bridge/src/NativeInstrumentEngine.cpp +++ b/native_bridge/src/NativeInstrumentEngine.cpp @@ -69,16 +69,27 @@ bool FluidSynthInstrument::init(double sampleRate, uint32_t maxBlockSize) { return synth != nullptr; } +// SF2 fallback: nhieu soundfont khong co bank 128 (GM drum) hoac thieu preset +// GM (vd Cajon.sf2 chi co it preset, khong co violin 40 / contrabass 44) — +// neu select fail thi lui dan (bank,program) -> (0,program) -> (0,0) de khong +// cam (fluidsynth giu preset cu -> sai am) hay silent (log error preset 40/44). +static void selectPresetFallback(fluid_synth_t* synth, int sfontId, uint32_t channel, + uint32_t& bank, uint32_t& program) { + if (fluid_synth_program_select(synth, channel, sfontId, bank, program) == FLUID_OK) return; + if (bank != 0 && fluid_synth_program_select(synth, channel, sfontId, 0, program) == FLUID_OK) { + bank = 0; + return; + } + bank = 0; + program = 0; + fluid_synth_program_select(synth, channel, sfontId, 0, 0); +} + void FluidSynthInstrument::selectProgram(uint32_t channel, uint32_t bank, uint32_t program) { if (!synth || channel >= 16) return; bank_[channel] = bank; program_[channel] = program; - // SF2 fallback: nhieu soundfont khong co bank 128 (GM drum) — neu select - // fail, thu lai bank 0 de khong cam (fluidsynth giu preset cu -> sai am). - if (fluid_synth_program_select(FS_SYNTH, channel, sfontId, bank, program) != FLUID_OK && bank != 0) { - bank_[channel] = 0; - fluid_synth_program_select(FS_SYNTH, channel, sfontId, 0, program); - } + selectPresetFallback(FS_SYNTH, sfontId, channel, bank_[channel], program_[channel]); } void FluidSynthInstrument::noteOn(uint32_t channel, uint32_t pitch, float velocity, uint32_t sampleOffset) { @@ -105,10 +116,7 @@ void FluidSynthInstrument::programChange(uint32_t channel, uint32_t program) { // Dung bank da nhan tu CC0/CC32 — bank hardcode 0 lam preset o bank != 0 // khong duoc chon (fluid giu preset cu -> ra piano sai). program_[channel] = program; - if (fluid_synth_program_select(FS_SYNTH, channel, sfontId, bank_[channel], program) != FLUID_OK && bank_[channel] != 0) { - bank_[channel] = 0; - fluid_synth_program_select(FS_SYNTH, channel, sfontId, 0, program); - } + selectPresetFallback(FS_SYNTH, sfontId, channel, bank_[channel], program_[channel]); } void FluidSynthInstrument::pitchBend(uint32_t channel, uint32_t bend14) { diff --git a/src-tauri/binaries/daw_vst_bridge-x86_64-pc-windows-msvc.exe b/src-tauri/binaries/daw_vst_bridge-x86_64-pc-windows-msvc.exe index eaa9fd4..5224122 100644 Binary files a/src-tauri/binaries/daw_vst_bridge-x86_64-pc-windows-msvc.exe and b/src-tauri/binaries/daw_vst_bridge-x86_64-pc-windows-msvc.exe differ diff --git a/src-tauri/binaries/daw_vst_bridge.exe b/src-tauri/binaries/daw_vst_bridge.exe index eaa9fd4..5224122 100644 Binary files a/src-tauri/binaries/daw_vst_bridge.exe and b/src-tauri/binaries/daw_vst_bridge.exe differ