fix: thêm logging debug cho noteOn + render + gain explicit

- _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
This commit is contained in:
2026-07-27 15:02:27 +07:00
parent 2c012e3348
commit 4ca6e7c6ad
+24 -4
View File
@@ -102,6 +102,7 @@
_synthPtr = _fluidModule._new_fluid_synth(_settingsPtr); _synthPtr = _fluidModule._new_fluid_synth(_settingsPtr);
if (!_synthPtr) throw new Error("Failed to create FluidSynth synthesizer"); 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) {} try { _fluidModule.FS.mkdir('/soundfonts'); } catch (e) {}
@@ -300,19 +301,27 @@
typeof velocity === 'number' ? (velocity > 1 ? velocity : velocity * 127) : 100 typeof velocity === 'number' ? (velocity > 1 ? velocity : velocity * 127) : 100
))); )));
var ch = channel; var ch = channel;
var usedBank = 0, usedProg = 0;
if (synthEngine) { if (synthEngine) {
if (ch === undefined) { if (ch === undefined) {
ch = synthEngine.soundfont_bank === 128 ? 9 : 0; ch = synthEngine.soundfont_bank === 128 ? 9 : 0;
} }
usedBank = synthEngine.soundfont_bank || 0;
usedProg = synthEngine.soundfont_program || 0;
try { try {
_fluidModule._fluid_synth_bank_select(_synthPtr, ch, synthEngine.soundfont_bank || 0); _fluidModule._fluid_synth_bank_select(_synthPtr, ch, usedBank);
} catch (e) {} } catch (e) {}
try { try {
_fluidModule._fluid_synth_program_change(_synthPtr, ch, synthEngine.soundfont_program || 0); _fluidModule._fluid_synth_program_change(_synthPtr, ch, usedProg);
} catch (e) {} } catch (e) {}
if (channel === undefined) channel = ch; 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 ctx = getCtx();
var now = ctx.currentTime; var now = ctx.currentTime;
var delay = (typeof startTime === 'number' && startTime > now) ? (startTime - now) : 0; var delay = (typeof startTime === 'number' && startTime > now) ? (startTime - now) : 0;
@@ -321,6 +330,7 @@
var self = this; var self = this;
var doNote = function () { var doNote = function () {
try { try {
console.log("[SonicSF] noteOn ch:", ch, "pitch:", midiPitch, "vel:", midiVel);
_fluidModule._fluid_synth_noteon(_synthPtr, ch, midiPitch, midiVel); _fluidModule._fluid_synth_noteon(_synthPtr, ch, midiPitch, midiVel);
if (delay > 0) { if (delay > 0) {
scheduledNote.off = setTimeout(function () { scheduledNote.off = setTimeout(function () {
@@ -443,15 +453,25 @@
var queueDepth = 0; var queueDepth = 0;
var maxQueue = QUEUE_TARGET; var maxQueue = QUEUE_TARGET;
var _dbgPeak = 0;
function pushFrame() { function pushFrame() {
if (!Module || !synth || !node) return; if (!Module || !synth || !node) return;
try { try {
Module._fluid_synth_write_float(synth, block, leftPtr, 0, 1, rightPtr, 0, 1); 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 leftArr = new Float32Array(Module.HEAPF32.subarray(leftPtr >> 2, (leftPtr >> 2) + block));
var rightArr = new Float32Array(Module.HEAPF32.subarray(rightPtr >> 2, (rightPtr >> 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]); node.port.postMessage({ type: 'PCM', L: leftArr, R: rightArr }, [leftArr.buffer, rightArr.buffer]);
queueDepth++; queueDepth++;
} catch (e) {} } catch (e) { console.warn("[SonicSF] pushFrame error:", e); }
} }
function fillLoop() { function fillLoop() {