From 4ca6e7c6add027a3332a6d9a42f55819bc87c612 Mon Sep 17 00:00:00 2001 From: 3dtours Date: Mon, 27 Jul 2026 15:02:27 +0700 Subject: [PATCH] =?UTF-8?q?fix:=20th=C3=AAm=20logging=20debug=20cho=20note?= =?UTF-8?q?On=20+=20render=20+=20gain=20explicit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - _fluid_synth_set_gain(1.0) sau khi tạo synth (đảm bảo gain > 0) - Log noteOn(ch, pitch, vel) mỗi lần play - Log peak frame đầu tiên khi render > 0.001 - Error log trong catch pushFrame - Sửa _playNoteFluid: dùng usedBank để xác định ch khi undefined --- app/static/js/services/soundfontPlayer.js | 28 +++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/app/static/js/services/soundfontPlayer.js b/app/static/js/services/soundfontPlayer.js index e1d5839..30190df 100644 --- a/app/static/js/services/soundfontPlayer.js +++ b/app/static/js/services/soundfontPlayer.js @@ -102,6 +102,7 @@ _synthPtr = _fluidModule._new_fluid_synth(_settingsPtr); if (!_synthPtr) throw new Error("Failed to create FluidSynth synthesizer"); + _fluidModule._fluid_synth_set_gain(_synthPtr, 1.0); try { _fluidModule.FS.mkdir('/soundfonts'); } catch (e) {} @@ -300,19 +301,27 @@ typeof velocity === 'number' ? (velocity > 1 ? velocity : velocity * 127) : 100 ))); var ch = channel; + var usedBank = 0, usedProg = 0; if (synthEngine) { if (ch === undefined) { ch = synthEngine.soundfont_bank === 128 ? 9 : 0; } + usedBank = synthEngine.soundfont_bank || 0; + usedProg = synthEngine.soundfont_program || 0; try { - _fluidModule._fluid_synth_bank_select(_synthPtr, ch, synthEngine.soundfont_bank || 0); + _fluidModule._fluid_synth_bank_select(_synthPtr, ch, usedBank); } catch (e) {} try { - _fluidModule._fluid_synth_program_change(_synthPtr, ch, synthEngine.soundfont_program || 0); + _fluidModule._fluid_synth_program_change(_synthPtr, ch, usedProg); } catch (e) {} if (channel === undefined) channel = ch; + } else if (program !== undefined) { + usedProg = program; + try { + _fluidModule._fluid_synth_program_change(_synthPtr, ch || 0, usedProg); + } catch (e) {} } - if (ch === undefined) ch = 0; + if (ch === undefined) ch = (usedBank === 128 ? 9 : 0); var ctx = getCtx(); var now = ctx.currentTime; var delay = (typeof startTime === 'number' && startTime > now) ? (startTime - now) : 0; @@ -321,6 +330,7 @@ var self = this; var doNote = function () { try { + console.log("[SonicSF] noteOn ch:", ch, "pitch:", midiPitch, "vel:", midiVel); _fluidModule._fluid_synth_noteon(_synthPtr, ch, midiPitch, midiVel); if (delay > 0) { scheduledNote.off = setTimeout(function () { @@ -443,15 +453,25 @@ var queueDepth = 0; var maxQueue = QUEUE_TARGET; + var _dbgPeak = 0; function pushFrame() { if (!Module || !synth || !node) return; try { Module._fluid_synth_write_float(synth, block, leftPtr, 0, 1, rightPtr, 0, 1); var leftArr = new Float32Array(Module.HEAPF32.subarray(leftPtr >> 2, (leftPtr >> 2) + block)); var rightArr = new Float32Array(Module.HEAPF32.subarray(rightPtr >> 2, (rightPtr >> 2) + block)); + var peak = 0; + for (var si = 0; si < leftArr.length; si++) { + var abs = leftArr[si] > 0 ? leftArr[si] : -leftArr[si]; + if (abs > peak) peak = abs; + } + if (peak > 0.001 && !_dbgPeak) { + _dbgPeak = 1; + console.log("[SonicSF] FIRST AUDIO FRAME peak:", peak); + } node.port.postMessage({ type: 'PCM', L: leftArr, R: rightArr }, [leftArr.buffer, rightArr.buffer]); queueDepth++; - } catch (e) {} + } catch (e) { console.warn("[SonicSF] pushFrame error:", e); } } function fillLoop() {