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);
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() {