memlnaut-nisps/playground/faust/eoc-reverb.json

1 line
7.3 KiB
JSON
Raw Normal View History

feat(playground): add Modular audio mode with shared mod pool New "Modular" engine in a-immersive with three hot-swappable Faust sub-engines (subtractive/additive/fm) sharing a common modulation pool: 16 ADSR slots + 32 LFO slots (single-knob sine->tri->square->saw wavemorph) routed through a 48-source x 10-destination matrix per engine. Per-connection scalar amounts in [-1, 1], summed at each destination. Default MLP output count is 512 (32 mod-source params + 480 matrix cells); model reinits on sub-engine swap, count change, or engine-param exposure toggle. Faust layer: - mod-pool.lib: shared ADSR/LFO/source-bus library - gen-modular-dsp.py: byte-reproducible generator (source of truth) - modular-subtractive: faithful Minimoog (3 osc, ladder filter, no envs) - modular-additive: 64-partial, spectral shape + formants, no envs/LFOs - modular-fm: 4-op matrix + self-feedback, no envs - All three share d08=amp, d09=pan conventions - MODULAR_DESTINATIONS.md: authoritative destination table JS layer: - ModularEngine: self-contained SynthEngine with getState/setState, setSubEngine, setModSourceCount, setExposeEngineParam - modular-ui: drawer with sub-engine toggle, ADSR/LFO count steppers, per-slot enable switches, matrix grid editor (tap-cycle, long-press precise, right-click menu, negative amounts), preset overlay - modular-presets: 6 named presets (Slow pad, Plucky bass, Crystal, DX bell, Morphing drone + default) - a-app.js: Modular mode registered, paramMeta:change -> resizeMLP, modular DSP state persisted under modularDspState, window.__nisps debug hooks for programmatic control Tests: tests/e2e/modular-mode.spec.js (11 Playwright tests, all passing including DSP state survives reload, sub-engine swap keeps paramCount, preset apply verification). Also fixes a pre-existing build.sh bug where the -e flag caused faust to overwrite .wasm outputs with expanded DSP source text, leaving additive/fm-matrix/eoc-* committed as invalid WebAssembly. Rebuilt all affected engines with the corrected script. Added an early-message buffer to faust-worklet-processor.js so setParam calls arriving before wasm instantiation are queued rather than dropped (needed when the user configures modular state before clicking Start Audio).
2026-04-11 07:34:41 +02:00
{"name": "eoc-reverb","filename": "eoc-reverb.dsp","version": "2.79.3","compile_options": "-lang wasm -ct 1 -cn eoc_reverb -es 1 -mcd 16 -mdd 1024 -mdy 33 -single -ftz 0","library_list": ["/nix/store/yjqpc2a6b2m08zwwrgsdlqsi40m5wnpp-faust-2.79.3/share/faust/stdfaust.lib","/nix/store/yjqpc2a6b2m08zwwrgsdlqsi40m5wnpp-faust-2.79.3/share/faust/maths.lib","/nix/store/yjqpc2a6b2m08zwwrgsdlqsi40m5wnpp-faust-2.79.3/share/faust/platform.lib","/nix/store/yjqpc2a6b2m08zwwrgsdlqsi40m5wnpp-faust-2.79.3/share/faust/reverbs.lib","/nix/store/yjqpc2a6b2m08zwwrgsdlqsi40m5wnpp-faust-2.79.3/share/faust/delays.lib","/nix/store/yjqpc2a6b2m08zwwrgsdlqsi40m5wnpp-faust-2.79.3/share/faust/basics.lib","/nix/store/yjqpc2a6b2m08zwwrgsdlqsi40m5wnpp-faust-2.79.3/share/faust/signals.lib","/nix/store/yjqpc2a6b2m08zwwrgsdlqsi40m5wnpp-faust-2.79.3/share/faust/filters.lib","/nix/store/yjqpc2a6b2m08zwwrgsdlqsi40m5wnpp-faust-2.79.3/share/faust/routes.lib"],"include_pathnames": ["/nix/store/yjqpc2a6b2m08zwwrgsdlqsi40m5wnpp-faust-2.79.3/share/faust","/usr/local/share/faust","/usr/share/faust",".","/home/w1n5t0n/src/MEMLNaut-NISPS/playground/faust"],"size": 2048504,"code": "Ly8gZW9jLXJldmVyYi5kc3Ag4oCUIFN0ZXJlbyByZXZlcmIgZm9yIE1FTUxOYXV0IEVPQyBjaGFpbgovLwovLyA5IHBhcmFtczogcHJlZGVsYXksIHNpemUsIGRpZmZ1c2lvbiwgaGlfZGFtcCwgbG9fZGFtcCwgZGVjYXksIG1peCwgd2lkdGgsIG1vZF9yYXRlCi8vCi8vIFVzZXMgcmUueml0YV9yZXYxX3N0ZXJlbyBmb3IgdGhlIGNvcmUgcmV2ZXJiIGFsZ29yaXRobS4KLy8KLy8gQ29tcGlsZToKLy8gICBmYXVzdCAtbGFuZyB3YXNtIC1jbiBlb2NfcmV2ZXJiIC1qc29uIGVvYy1yZXZlcmIuZHNwIC1vIGVvYy1yZXZlcmIud2FzbQoKaW1wb3J0KCJzdGRmYXVzdC5saWIiKTsKCnByZWRlbGF5ID0gaHNsaWRlcigicHJlZGVsYXlbdW5pdDptc10iLCAgMC4wLCAgIDAuMCwgIDEwMC4wLCAgMC41KTsKc2l6ZSAgICAgPSBoc2xpZGVyKCJzaXplIiwgICAgICAgICAgICAgIDAuNSwgICAwLjAsICAgIDEuMCwgIDAuMDAxKTsKZGlmZnVzaW9uPSBoc2xpZGVyKCJkaWZmdXNpb24iLCAgICAgICAgIDAuNywgICAwLjAsICAgIDEuMCwgIDAuMDAxKTsKaGlfZGFtcCAgPSBoc2xpZGVyKCJoaV9kYW1wIiwgICAgICAgICAgIDAuNSwgICAwLjAsICAgIDEuMCwgIDAuMDAxKTsKbG9fZGFtcCAgPSBoc2xpZGVyKCJsb19kYW1wIiwgICAgICAgICAgIDAuMCwgICAwLjAsICAgIDEuMCwgIDAuMDAxKTsKZGVjYXkgICAgPSBoc2xpZGVyKCJkZWNheVt1bml0OnNdIiwgICAgICAzLjAsICAgMC4xLCAgIDIwLjAsICAwLjEpOwptaXggICAgICA9IGhzbGlkZXIoIm1peCIsICAgICAgICAgICAgICAgMC4yLCAgIDAuMCwgICAgMS4wLCAgMC4wMDEpOwp3aWR0aCAgICA9IGhzbGlkZXIoIndpZHRoIiwgICAgICAgICAgICAgMC44LCAgIDAuMCwgICAgMS4wLCAgMC4wMDEpOwptb2RfcmF0ZSA9IGhzbGlkZXIoIm1vZF9yYXRlW3VuaXQ6SHpdIiwgMC41LCAgIDAuMCwgICAgNS4wLCAgMC4wMSk7CgovLyBQcmUtZGVsYXkgaW4gc2FtcGxlcyAobWluaW11bSAxKQpwZFNhbXBzID0gbWF4KDEsIGludChwcmVkZWxheSAvIDEwMDAuMCAqIG1hLlNSKSk7CgovLyBGcmVxdWVuY3kgY3Jvc3NvdmVycyBmb3Igeml0YQpmMSAgID0gMjAwLjAgKyBsb19kYW1wICogMTgwMC4wOwpmMiAgID0gMjAwMDAuMCAtIGhpX2RhbXAgKiAxODAwMC4wOwoKLy8gUmV2ZXJiIGRlY2F5IHRpbWVzIHNjYWxlZCBieSBzaXplCnQ2MGRjID0gZGVjYXkgKiAoMS4wICsgc2l6ZSAqIDAuNSk7CnQ2MG0gID0gZGVjYXk7CgovLyBQcmUtZGVsYXk6IHNpbmdsZSBjaGFubmVsCnByZWRlbGF5TGluZSA9IF8gQCBwZFNhbXBzOwoKLy8gV2lkdGggcHJvY2Vzc2luZzogTS9TIGVuY29kZS1zY2FsZS1kZWNvZGUKLy8gTCBSIOKGkiBMJyBSJyB3aGVyZSBzaWRlIGNoYW5uZWxzIHNjYWxlZCBieSB3aWR0aAp3aWR0aEwobCwgcikgPSAobCArIHIpICogMC41ICsgKGwgLSByKSAqIDAuNSAqIHdpZHRoOwp3aWR0aFIobCwgcikgPSAobCArIHIpICogMC41IC0gKGwgLSByKSAqIDAuNSAqIHdpZHRoOwoKLy8gV2V0IHNpZ25hbCB0aHJvdWdoIHByZWRlbGF5LCBkaWZmdXNpb24gc2NhbGUsIGFuZCB6aXRhIHJldmVyYgp3ZXRMKGluTCwgaW5SKSA9IChyZS56aXRhX3JldjFfc3RlcmVvKDAuMCwgZjEsIGYyLCB0NjBkYywgdDYwbSwgMTkyMDAwLjAsCiAgICAgICAgICAgICAgICAgICAgaW5MICogZGlmZnVzaW9uIEAgcGRTYW1wcywKICAgICAgICAgICAgICAgICAgICBpblIgKiBkaWZmdXNpb24gQCBwZFNhbXBzKSkgOiB3aWR0aEw7Cgp3ZXRSKGluTCwgaW5SKSA9IChyZS56aXRhX3JldjFfc3RlcmVvKDAuMCwgZjEsIGYyLCB0NjBkYywgdDYwbSwgMTkyMDAwLjAsCiAgICAgICAgICAgICAgICAgICAgaW5MICogZGlmZnVzaW9uIEAgcGRTYW1wcywKICAgICAgICAgICAgICAgICAgICBpblIgKiBkaWZmdXNpb24gQCBwZFNhbXBzKSkgOiB3aWR0aFI7Cgpwcm9jZXNzKGluTCwgaW5SKSA9CiAgICBpbkwgKiAoMS4wIC0gbWl4KSArIHdldEwoaW5MLCBpblIpICogbWl4LAogICAgaW5SICogKDEuMCAtIG1peCkgKyB3ZXRSKGluTCwgaW5SKSAqIG1peDsK","inputs": 2,"outputs": 2,"meta": [ { "basics.lib/name": "Faust Basic Element Library" },{ "basics.lib/version": "1.21.0" },{ "compile_options": "-lang wasm -ct 1 -cn eoc_reverb -es 1 -mcd 16 -mdd 1024 -mdy 33 -single -ftz 0" },{ "delays.