diff --git a/app/static/js/services/soundfontPlayer.js b/app/static/js/services/soundfontPlayer.js index f040c13..1e28d13 100644 --- a/app/static/js/services/soundfontPlayer.js +++ b/app/static/js/services/soundfontPlayer.js @@ -73,13 +73,15 @@ } console.log("[SonicSF] Initializing FluidSynth WASM Engine..."); + var TOTAL_MEMORY = 256 * 1024 * 1024; _fluidModule = await window.__FluidSynthModuleFactory({ locateFile: function (path) { if (path.endsWith('.wasm')) { return window.__FluidSynthLocateWasm ? window.__FluidSynthLocateWasm() : path; } return path; - } + }, + TOTAL_MEMORY: TOTAL_MEMORY }); if (!_fluidModule || !_fluidModule._new_fluid_settings) { @@ -135,12 +137,31 @@ buf = await resp.arrayBuffer(); if (cache) await cache.saveBuffer(sfId, buf); } - var virtualPath = '/soundfonts/' + sfId + '.sf3'; + var ext = '.sf3'; + var virtualPath = '/soundfonts/' + sfId + ext; + console.log("[SonicSF] Writing to MEMFS:", virtualPath, (buf.byteLength / 1024 / 1024).toFixed(2) + 'MB'); + try { _fluidModule.FS.unlink(virtualPath); } catch (e) {} _fluidModule.FS.writeFile(virtualPath, new Uint8Array(buf)); + var fsSize = 0; + try { fsSize = _fluidModule.FS.stat(virtualPath).size; } catch (e) {} + console.log("[SonicSF] MEMFS stat:", fsSize, "bytes"); var sfHandle = _fluidModule._fluid_synth_sfload(_synthPtr, virtualPath, 1); if (sfHandle === -1) { - console.error("[SonicSF] FluidSynth failed to parse:", sfId); - return false; + var errPtr = _fluidModule._fluid_synth_error(_synthPtr); + var errMsg = errPtr ? _fluidModule.UTF8ToString(errPtr) : "unknown"; + console.warn("[SonicSF] sfload failed for", sfId, "as", ext, "error:", errMsg); + try { _fluidModule.FS.unlink(virtualPath); } catch (e) {} + ext = '.sf2'; + virtualPath = '/soundfonts/' + sfId + ext; + _fluidModule.FS.writeFile(virtualPath, new Uint8Array(buf)); + sfHandle = _fluidModule._fluid_synth_sfload(_synthPtr, virtualPath, 1); + if (sfHandle === -1) { + var errPtr2 = _fluidModule._fluid_synth_error(_synthPtr); + var errMsg2 = errPtr2 ? _fluidModule.UTF8ToString(errPtr2) : "unknown"; + console.error("[SonicSF] FluidSynth failed to parse", sfId, "even as .sf2:", errMsg2); + return false; + } + console.log("[SonicSF] Loaded", sfId, "as .sf2 fallback, handle:", sfHandle); } _sfHandleMap.set(sfId, sfHandle); _currentSfId = sfId;