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