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:
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user