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).
1 line
No EOL
38 KiB
JSON
1 line
No EOL
38 KiB
JSON
{"name": "additive","filename": "additive.dsp","version": "2.79.3","compile_options": "-lang wasm -ct 1 -cn additive -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/envelopes.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/oscillators.lib","/nix/store/yjqpc2a6b2m08zwwrgsdlqsi40m5wnpp-faust-2.79.3/share/faust/basics.lib","/nix/store/yjqpc2a6b2m08zwwrgsdlqsi40m5wnpp-faust-2.79.3/share/faust/noises.lib","/nix/store/yjqpc2a6b2m08zwwrgsdlqsi40m5wnpp-faust-2.79.3/share/faust/filters.lib","/nix/store/yjqpc2a6b2m08zwwrgsdlqsi40m5wnpp-faust-2.79.3/share/faust/signals.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": 264068,"code": "Ly8gYWRkaXRpdmUuZHNwIOKAlCBGdWxsIDQ4LXBhcmFtZXRlciBhZGRpdGl2ZSBzeW50aGVzaXNlciBmb3IgTUVNTE5hdXQgTklTUFMgcGxheWdyb3VuZAovLwovLyA2NCBoYXJtb25pYyBzaW5lIGJhbmtzIHdpdGggc3BlY3RyYWwtZGVzY3JpcHRvciBwYXJhbWV0cmlzYXRpb24uCi8vIEFsbCA0OCBwYXJhbXMgYXJlIGRlc2lnbmVkIGZvciBjb250aW51b3VzIE1MIGV4cGxvcmF0aW9uIHZpYSBOSVNQUy4KLy8KLy8gUGFyYW1ldGVyIG9yZGVyIG1hdGNoZXMgTklTUFMgb3V0cHV0IGluZGljZXMgMOKAkzQ3OgovLyAgIEdyb3VwIDEg4oCUIFNwZWN0cmFsIFNoYXBlICgw4oCTMTMpOiAgaGFybW9uaWMgYmFuayArIHRpbHQgKyBpbmhhcm1vbmljaXR5ICsgb2RkL2V2ZW4KLy8gICBHcm91cCAyIOKAlCBUZW1wb3JhbCAgICAgICAoMTTigJMyMyk6IGdsb2JhbCBBRFNSICsgYnJpZ2h0bmVzcyBBRFNSICsgc3BlY3RyYWwgZmx1eAovLyAgIEdyb3VwIDMg4oCUIFBoYXNlICAgICAgICAgICgyNOKAkzMxKTogcGhhc2UgcmFuZG9taXNhdGlvbiwgYmVhdGluZywgc3RlcmVvLCBub2lzZSwgc3ViCi8vICAgR3JvdXAgNCDigJQgTW9kdWxhdGlvbiAgICAgKDMy4oCTNDEpOiB2aWJyYXRvLCB0cmVtb2xvLCBkcmlmdCwgZm9ybWFudHMKLy8gICBHcm91cCA1IOKAlCBNYXN0ZXIgICAgICAgICAoNDLigJM0Nyk6IGxldmVsLCB2ZWxvY2l0eSwgZ2xpZGUsIHNhdHVyYXRpb24sIGZpbmUtdHVuZQovLwovLyBHcm91cHMgYXJlIHByZWZpeGVkICIxXyIsICIyXyIgZXRjLiwgYW5kIGVhY2ggcGFyYW1ldGVyIGlzIHByZWZpeGVkICIwMF8iLAovLyAiMDFfIiBldGMuLCBzbyB0aGF0IEZhdXN0J3MgYWxwaGFiZXRpY2FsIEpTT04gb3JkZXJpbmcgbWF0Y2hlcyB0aGUgc3BlYy4KLy8gVGhlIGZhdXN0SnNvblRvUGFyYW1NZXRhIHBhcnNlciBzdHJpcHMgbnVtZXJpYyBwcmVmaXhlcyBhbmQgIlsuLi5dIiBtZXRhZGF0YQovLyBmcm9tIGxhYmVscyB0byBwcm9kdWNlIGNsZWFuIG5hbWVzLgovLwovLyBIaWRkZW4gY29udHJvbHMgKG5vdCBpbiBwYXJhbU1ldGEg4oCUIHdvcmtsZXQgZHJpdmVzIHRoZW0gZGlyZWN0bHkpOgovLyAgIGZyZXEgIOKAlCBmdW5kYW1lbnRhbCBmcmVxdWVuY3kgSHogKG5vdGVPbikKLy8gICBnYXRlICDigJQgZ2F0ZSBzaWduYWwgMC8xICAgICAgICAgIChub3RlT24vbm90ZU9mZikKLy8KLy8gQnVpbGQ6Ci8vICAgZmF1c3QgLWxhbmcgd2FzbSAtY24gYWRkaXRpdmUgLWUgYWRkaXRpdmUuZHNwIC1vIGFkZGl0aXZlLndhc20KLy8gICBmYXVzdCAtanNvbiBhZGRpdGl2ZS5kc3AgLW8gL2Rldi9udWxsICAocHJvZHVjZXMgYWRkaXRpdmUuZHNwLmpzb24pCi8vCmltcG9ydCgic3RkZmF1c3QubGliIik7CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gSGlkZGVuIGNvbnRyb2xzCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpmcmVxID0gaHNsaWRlcigiMF9IaWRkZW4vZnJlcVtoaWRkZW46MV1bdW5pdDpIel0iLCAyMjAsIDIwLCA0MDAwLCAwLjAxKTsKZ2F0ZSA9IGJ1dHRvbigiMF9IaWRkZW4vZ2F0ZVtoaWRkZW46MV0iKTsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBHcm91cCAxIOKAlCBTcGVjdHJhbCBTaGFwZSAocGFyYW1zIDDigJMxMykKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmgxX2FtcCAgICAgICAgPSBoc2xpZGVyKCIxX1NwZWN0cmFsIFNoYXBlLzAwX2gxX2FtcFt0b29sdGlwOkgxIGFtcGxpdHVkZV0iLCAgICAgICAgMC44LCAgIDAsICAgIDEsICAgICAwLjAwMSk7CmgyX2FtcCAgICAgICAgPSBoc2xpZGVyKCIxX1NwZWN0cmFsIFNoYXBlLzAxX2gyX2FtcFt0b29sdGlwOkgyIGFtcGxpdHVkZV0iLCAgICAgICAgMC41LCAgIDAsICAgIDEsICAgICAwLjAwMSk7CmgzX2FtcCAgICAgICAgPSBoc2xpZGVyKCIxX1NwZWN0cmFsIFNoYXBlLzAyX2gzX2FtcFt0b29sdGlwOkgzIGFtcGxpdHVkZV0iLCAgICAgICAgMC4zNSwgIDAsICAgIDEsICAgICAwLjAwMSk7Cmg0X2FtcCAgICAgICAgPSBoc2xpZGVyKCIxX1NwZWN0cmFsIFNoYXBlLzAzX2g0X2FtcFt0b29sdGlwOkg0IGFtcGxpdHVkZV0iLCAgICAgICAgMC4yNSwgIDAsICAgIDEsICAgICAwLjAwMSk7Cmg1X2FtcCAgICAgICAgPSBoc2xpZGVyKCIxX1NwZWN0cmFsIFNoYXBlLzA0X2g1X2FtcFt0b29sdGlwOkg1IGFtcGxpdHVkZV0iLCAgICAgICAgMC4xOCwgIDAsICAgIDEsICAgICAwLjAwMSk7Cmg2X2FtcCAgICAgICAgPSBoc2xpZGVyKCIxX1NwZWN0cmFsIFNoYXBlLzA1X2g2X2FtcFt0b29sdGlwOkg2IGFtcGxpdHVkZV0iLCAgICAgICAgMC4xMiwgIDAsICAgIDEsICAgICAwLjAwMSk7Cmg3X2FtcCAgICAgICAgPSBoc2xpZGVyKCIxX1NwZWN0cmFsIFNoYXBlLzA2X2g3X2FtcFt0b29sdGlwOkg3IGFtcGxpdHVkZV0iLCAgICAgICAgMC4wOCwgIDAsICAgIDEsICAgICAwLjAwMSk7Cmg4X2FtcCAgICAgICAgPSBoc2xpZGVyKCIxX1NwZWN0cmFsIFNoYXBlLzA3X2g4X2FtcFt0b29sdGlwOkg4IGFtcGxpdHVkZV0iLCAgICAgICAgMC4wNiwgIDAsICAgIDEsICAgICAwLjAwMSk7Cmg5XzE2X2FtcCAgICAgPSBoc2xpZGVyKCIxX1NwZWN0cmFsIFNoYXBlLzA4X2g5XzE2X2FtcFt0b29sdGlwOkg5LTE2IGdyb3VwIGFtcF0iLCAgMC4wNSwgIDAsICAgIDEsICAgICAwLjAwMSk7CmgxN18zMl9hbXAgICAgPSBoc2xpZGVyKCIxX1NwZWN0cmFsIFNoYXBlLzA5X2gxN18zMl9hbXBbdG9vbHRpcDpIMTctMzIgZ3JvdXAgYW1wXSIsMC4wMjUsIDAsICAgIDEsICAgICAwLjAwMSk7CmgzM182NF9hbXAgICAgPSBoc2xpZGVyKCIxX1NwZWN0cmFsIFNoYXBlLzEwX2gzM182NF9hbXBbdG9vbHRpcDpIMzMtNjQgZ3JvdXAgYW1wXSIsMC4wMSwgIDAsICAgIDEsICAgICAwLjAwMSk7CnNwZWN0cmFsX3RpbHQgPSBoc2xpZGVyKCIxX1NwZWN0cmFsIFNoYXBlLzExX3NwZWN0cmFsX3RpbHRbdG9vbHRpcDpHbG9iYWwgdGlsdF0iLCAgMCwgICAgLTEsICAgIDEsICAgICAwLjAwMSk7CmluaGFybW9uaWNpdHkgPSBoc2xpZGVyKCIxX1NwZWN0cmFsIFNoYXBlLzEyX2luaGFybW9uaWNpdHlbdG9vbHRpcDpJbmhhcm1vbmljaXR5XSIsIDAsICAgIDAsICAgIDAuMTUsICAwLjAwMDEpOwpvZGRfZXZlbiAgICAgID0gaHNsaWRlcigiMV9TcGVjdHJhbCBTaGFwZS8xM19vZGRfZXZlblt0b29sdGlwOk9kZC9ldmVuIGJhbGFuY2VdIiwgIDAuNSwgICAwLCAgICAxLCAgICAgMC4wMDEpOwoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEdyb3VwIDIg4oCUIFRlbXBvcmFsIChwYXJhbXMgMTTigJMyMykKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmF0dGFjayAgICAgICAgICAgICA9IGhzbGlkZXIoIjJfVGVtcG9yYWwvMDBfYXR0YWNrW3NjYWxlOmxvZ11bdG9vbHRpcDpBdHRhY2tdIiwgICAgICAgICAgICAgMC4wMSwgIDAuMDAxLCA1LCAgIDAuMDAxKTsKZGVjYXkgICAgICAgICAgICAgID0gaHNsaWRlcigiMl9UZW1wb3JhbC8wMV9kZWNheVt0b29sdGlwOkRlY2F5XSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zLCAgIDAuMDAxLCAxMCwgIDAuMDAxKTsKc3VzdGFpbiAgICAgICAgICAgID0gaHNsaWRlcigiMl9UZW1wb3JhbC8wMl9zdXN0YWluW3Rvb2x0aXA6U3VzdGFpbl0iLCAgICAgICAgICAgICAgICAgICAgICAgMC43LCAgIDAsICAgICAxLCAgIDAuMDAxKTsKcmVsZWFzZSAgICAgICAgICAgID0gaHNsaWRlcigiMl9UZW1wb3JhbC8wM19yZWxlYXNlW3Rvb2x0aXA6UmVsZWFzZV0iLCAgICAgICAgICAgICAgICAgICAgICAgMC41LCAgIDAuMDEsICAxMCwgIDAuMDAxKTsKYnJpZ2h0bmVzc19hdHRhY2sgID0gaHNsaWRlcigiMl9UZW1wb3JhbC8wNF9icmlnaHRuZXNzX2F0dGFja1tzY2FsZTpsb2ddW3Rvb2x0aXA6QnJpZ2h0IEFdIiwgMC4wMDUsIDAuMDAxLCA1LCAgIDAuMDAxKTsKYnJpZ2h0bmVzc19kZWNheSAgID0gaHNsaWRlcigiMl9UZW1wb3JhbC8wNV9icmlnaHRuZXNzX2RlY2F5W3Rvb2x0aXA6QnJpZ2h0IERdIiwgICAgICAgICAgICAgMC4xNSwgIDAuMDAxLCA1LCAgIDAuMDAxKTsKYnJpZ2h0bmVzc19zdXN0YWluID0gaHNsaWRlcigiMl9UZW1wb3JhbC8wNl9icmlnaHRuZXNzX3N1c3RhaW5bdG9vbHRpcDpCcmlnaHQgU10iLCAgICAgICAgICAgMC40LCAgIDAsICAgICAxLCAgIDAuMDAxKTsKYnJpZ2h0bmVzc19yZWxlYXNlID0gaHNsaWRlcigiMl9UZW1wb3JhbC8wN19icmlnaHRuZXNzX3JlbGVhc2VbdG9vbHRpcDpCcmlnaHQgUl0iLCAgICAgICAgICAgMC4zLCAgIDAuMDEsICA1LCAgIDAuMDAxKTsKc3BlY3RyYWxfZmx1eF9yYXRlID0gaHNsaWRlcigiMl9UZW1wb3JhbC8wOF9zcGVjdHJhbF9mbHV4X3JhdGVbdG9vbHRpcDpGbHV4IHJhdGVdIiwgICAgICAgICAgMC41LCAgIDAsICAgICAxMCwgIDAuMDEpOwpzcGVjdHJhbF9mbHV4X2RlcHRoPSBoc2xpZGVyKCIyX1RlbXBvcmFsLzA5X3NwZWN0cmFsX2ZsdXhfZGVwdGhbdG9vbHRpcDpGbHV4IGRlcHRoXSIsICAgICAgICAwLjEsICAgMCwgICAgIDEsICAgMC4wMDEpOwoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEdyb3VwIDMg4oCUIFBoYXNlICYgQ29oZXJlbmNlIChwYXJhbXMgMjTigJMzMSkKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnBoYXNlX3JhbmRvbSAgICAgICA9IGhzbGlkZXIoIjNfUGhhc2UvMDBfcGhhc2VfcmFuZG9tW3Rvb2x0aXA6UGhhc2UgcmFuZG9taXNhdGlvbl0iLCAgICAgIDAsICAgMCwgICAgMSwgICAgMC4wMDEpOwpwaGFzZV93YWxrX3JhdGUgICAgPSBoc2xpZGVyKCIzX1BoYXNlLzAxX3BoYXNlX3dhbGtfcmF0ZVt0b29sdGlwOlBoYXNlIHdhbGsgcmF0ZV0iLCAgICAgICAgMCwgICAwLCAgICA1LCAgICAwLjAwMSk7CmJlYXRpbmdfZGVwdGggICAgICA9IGhzbGlkZXIoIjNfUGhhc2UvMDJfYmVhdGluZ19kZXB0aFt0b29sdGlwOkJlYXRpbmcgZGVwdGhdIiwgICAgICAgICAgICAwLCAgIDAsICAgIDAuMDIsIDAuMDAwMSk7CmJlYXRpbmdfcmF0ZSAgICAgICA9IGhzbGlkZXIoIjNfUGhhc2UvMDNfYmVhdGluZ19yYXRlW3Rvb2x0aXA6QmVhdGluZyByYXRlXSIsICAgICAgICAgICAgICAxLCAgIDAsICAgIDEwLCAgIDAuMDEpOwpzdGVyZW9fcGhhc2Vfc3ByZWFkPSBoc2xpZGVyKCIzX1BoYXNlLzA0X3N0ZXJlb19waGFzZV9zcHJlYWRbdG9vbHRpcDpTdGVyZW8gc3ByZWFkXSIsICAgICAgMC4xLCAwLCAgICAxLCAgICAwLjAwMSk7Cm5vaXNlX2Zsb29yICAgICAgICA9IGhzbGlkZXIoIjNfUGhhc2UvMDVfbm9pc2VfZmxvb3JbdG9vbHRpcDpOb2lzZSBmbG9vcl0iLCAgICAgICAgICAgICAgICAwLCAgIDAsICAgIDAuMiwgIDAuMDAxKTsKbm9pc2VfY29sb3IgICAgICAgID0gaHNsaWRlcigiM19QaGFzZS8wNl9ub2lzZV9jb2xvclt0b29sdGlwOk5vaXNlIGNvbG91cl0iLCAgICAgICAgICAgICAgIDAuNSwgMCwgICAgMSwgICAgMC4wMDEpOwpzdWJfaGFybW9uaWMgICAgICAgPSBoc2xpZGVyKCIzX1BoYXNlLzA3X3N1Yl9oYXJtb25pY1t0b29sdGlwOlN1Yi1oYXJtb25pY10iLCAgICAgICAgICAgICAgMCwgICAwLCAgICAxLCAgICAwLjAwMSk7CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gR3JvdXAgNCDigJQgTW9kdWxhdGlvbiAocGFyYW1zIDMy4oCTNDEpCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2aWJyYXRvX3JhdGUgID0gaHNsaWRlcigiNF9Nb2R1bGF0aW9uLzAwX3ZpYnJhdG9fcmF0ZVt0b29sdGlwOlZpYnJhdG8gcmF0ZV0iLCAgIDUsICAgMCwgIDEwLCAgIDAuMDEpOwp2aWJyYXRvX2RlcHRoID0gaHNsaWRlcigiNF9Nb2R1bGF0aW9uLzAxX3ZpYnJhdG9fZGVwdGhbdG9vbHRpcDpWaWJyYXRvIGRlcHRoXSIsIDAsICAgMCwgIDAuMDUsIDAuMDAwMSk7CnZpYnJhdG9fZGVsYXkgPSBoc2xpZGVyKCI0X01vZHVsYXRpb24vMDJfdmlicmF0b19kZWxheVt0b29sdGlwOlZpYnJhdG8gZGVsYXldIiwgMC4zLCAwLCAgMiwgICAgMC4wMDEpOwp0cmVtb2xvX3JhdGUgID0gaHNsaWRlcigiNF9Nb2R1bGF0aW9uLzAzX3RyZW1vbG9fcmF0ZVt0b29sdGlwOlRyZW1vbG8gcmF0ZV0iLCAgIDQsICAgMCwgIDIwLCAgIDAuMDEpOwp0cmVtb2xvX2RlcHRoID0gaHNsaWRlcigiNF9Nb2R1bGF0aW9uLzA0X3RyZW1vbG9fZGVwdGhbdG9vbHRpcDpUcmVtb2xvIGRlcHRoXSIsIDAsICAgMCwgIDEsICAgIDAuMDAxKTsKZHJpZnRfcmF0ZSAgICA9IGhzbGlkZXIoIjRfTW9kdWxhdGlvbi8wNV9kcmlmdF9yYXRlW3Rvb2x0aXA6RHJpZnQgcmF0ZV0iLCAgICAgICAwLCAgIDAsICAyLCAgICAwLjAwMSk7CmRyaWZ0X2RlcHRoICAgPSBoc2xpZGVyKCI0X01vZHVsYXRpb24vMDZfZHJpZnRfZGVwdGhbdG9vbHRpcDpEcmlmdCBkZXB0aF0iLCAgICAgMCwgICAwLCAgMC4zLCAgMC4wMDEpOwpmb3JtYW50MV9mcmVxID0gaHNsaWRlcigiNF9Nb2R1bGF0aW9uLzA3X2Zvcm1hbnQxX2ZyZXFbdG9vbHRpcDpGb3JtYW50IDEgZnJlcV0iLDMsICAgMSwgIDE2LCAgIDAuMDEpOwpmb3JtYW50Ml9mcmVxID0gaHNsaWRlcigiNF9Nb2R1bGF0aW9uLzA4X2Zvcm1hbnQyX2ZyZXFbdG9vbHRpcDpGb3JtYW50IDIgZnJlcV0iLDYsICAgMSwgIDE2LCAgIDAuMDEpOwpmb3JtYW50X2RlcHRoID0gaHNsaWRlcigiNF9Nb2R1bGF0aW9uLzA5X2Zvcm1hbnRfZGVwdGhbdG9vbHRpcDpGb3JtYW50IGRlcHRoXSIsIDAsICAgMCwgIDEsICAgIDAuMDAxKTsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBHcm91cCA1IOKAlCBNYXN0ZXIgKHBhcmFtcyA0MuKAkzQ3KQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KbGV2ZWwgICAgICA9IGhzbGlkZXIoIjVfTWFzdGVyLzAwX2xldmVsW3Rvb2x0aXA6T3V0cHV0IGxldmVsXSIsICAgICAgIDAuNywgIDAsICAgMSwgICAwLjAwMSk7CnZlbF9zZW5zICAgPSBoc2xpZGVyKCI1X01hc3Rlci8wMV92ZWxfc2Vuc1t0b29sdGlwOlZlbG9jaXR5IHNlbnNdIiwgICAwLjUsICAwLCAgIDEsICAgMC4wMDEpOwp2ZWxfYnJpZ2h0ID0gaHNsaWRlcigiNV9NYXN0ZXIvMDJfdmVsX2JyaWdodG5lc3NbdG9vbHRpcDpWZWwgYnJpZ2h0XSIsMC4zLCAgMCwgICAxLCAgIDAuMDAxKTsKcGl0Y2hfZ2xpZGU9IGhzbGlkZXIoIjVfTWFzdGVyLzAzX3BpdGNoX2dsaWRlW3Rvb2x0aXA6UG9ydGFtZW50b10iLCAgIDAsICAgIDAsICAgMTAsICAwLjAxKTsKc2F0dXJhdGlvbiA9IGhzbGlkZXIoIjVfTWFzdGVyLzA0X3NhdHVyYXRpb25bdG9vbHRpcDpTYXR1cmF0aW9uXSIsICAgIDAsICAgIDAsICAgMSwgICAwLjAwMSk7CmZpbmVfdHVuZSAgPSBoc2xpZGVyKCI1X01hc3Rlci8wNV9maW5lX3R1bmVbdW5pdDpjdF1bdG9vbHRpcDpDZW50c10iLCAwLCAgIC01MCwgIDUwLCAgMC4xKTsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBJbnRlcm5hbCBjb25zdGFudHMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCk4gID0gNjQ7ClBJID0gbWEuUEk7CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gUGl0Y2gg4oCUIHBvcnRhbWVudG8gKyBmaW5lIHR1bmUKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmdsaWRlX3RhdSAgID0gMC4wMDAxICsgcGl0Y2hfZ2xpZGUgKiAwLjI7CmZpbmVfcmF0aW8gID0gcG93KDIuMCwgZmluZV90dW5lIC8gMTIwMC4wKTsKZnJlcV9zbW9vdGggPSBmcmVxICogZmluZV9yYXRpbyA6IHNpLnNtb290aChiYS50YXUycG9sZShnbGlkZV90YXUpKTsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBWaWJyYXRvIExGTyDigJQgZGVsYXllZCBvbnNldCB2aWEgc2xvdy1hdHRhY2sgZW52ZWxvcGUKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnZpYnJhdG9fZW52ID0gZW4uYWRzcih2aWJyYXRvX2RlbGF5LCAwLjAxLCAxLjAsIDAuNSwgZ2F0ZSk7CnZpYnJhdG9fbGZvID0gb3Mub3NjKHZpYnJhdG9fcmF0ZSkgKiB2aWJyYXRvX2RlcHRoICogdmlicmF0b19lbnY7CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gVHJlbW9sbyBMRk8KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnRyZW1vbG9fbGZvID0gMS4wIC0gdHJlbW9sb19kZXB0aCAqIDAuNSAqICgxLjAgKyBvcy5vc2ModHJlbW9sb19yYXRlKSk7CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gR2xvYmFsIGFtcGxpdHVkZSBBRFNSCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQphbXBfZW52ID0gZW4uYWRzcihhdHRhY2ssIGRlY2F5LCBzdXN0YWluLCByZWxlYXNlLCBnYXRlKTsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBCcmlnaHRuZXNzIGVudmVsb3BlIOKAlCBjb250cm9scyBoaWdoIGhhcm1vbmljIGFtcGxpdHVkZSBvdmVyIHRpbWUKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmJyaWdodF9lbnYgICA9IGVuLmFkc3IoYnJpZ2h0bmVzc19hdHRhY2ssIGJyaWdodG5lc3NfZGVjYXksCiAgICAgICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3Nfc3VzdGFpbiwgYnJpZ2h0bmVzc19yZWxlYXNlLCBnYXRlKTsKYnJpZ2h0X2JsZW5kKGspID0gZmxvYXQoayAtIDEpIC8gZmxvYXQoTiAtIDEpOwpicmlnaHRfZmFjdG9yKGspID0gMS4wIC0gYnJpZ2h0X2JsZW5kKGspICsgYnJpZ2h0X2JsZW5kKGspICogYnJpZ2h0X2VudjsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBTcGVjdHJhbCBmbHV4IOKAlCBzbG93IExGTyBvbiB1cHBlciBoYXJtb25pYyBhbXBsaXR1ZGVzCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpmbHV4X2xmbyA9IG9zLm9zYyhzcGVjdHJhbF9mbHV4X3JhdGUpOwpmbHV4X2ZhY3RvcihrKSA9IGJhLmlmKGsgPiA4LAogICAgICAgICAgICAgICAgICAgMS4wICsgc3BlY3RyYWxfZmx1eF9kZXB0aCAqIGZsdXhfbGZvICogYnJpZ2h0X2JsZW5kKGspLAogICAgICAgICAgICAgICAgICAgMS4wKTsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBEcmlmdCDigJQgc2xvdyByYW5kb20gd2FsayBvbiBwZXItcGFydGlhbCBhbXBsaXR1ZGVzCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkcmlmdF9sZm8oaykgPSBuby5ub2lzZSAqIChmbG9hdChrICUgNyArIDEpIC8gNy4wKQogICAgICAgICAgICAgICA6IGZpLmxvd3Bhc3MoMSwgbWF4KDAuMSwgZHJpZnRfcmF0ZSAqIDIuMCkpCiAgICAgICAgICAgICAgIDogKihkcmlmdF9kZXB0aCk7CmRyaWZ0X2ZhY3RvcihrKSA9IDEuMCArIGRyaWZ0X2xmbyhrKTsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBQZXItaGFybW9uaWMgYmFzZSBhbXBsaXR1ZGUgZnJvbSBncm91cCBzbGlkZXJzCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpncm91cF9hbXAoaykgPQogIGJhLmlmKGsgPT0gMSwgaDFfYW1wLAogIGJhLmlmKGsgPT0gMiwgaDJfYW1wLAogIGJhLmlmKGsgPT0gMywgaDNfYW1wLAogIGJhLmlmKGsgPT0gNCwgaDRfYW1wLAogIGJhLmlmKGsgPT0gNSwgaDVfYW1wLAogIGJhLmlmKGsgPT0gNiwgaDZfYW1wLAogIGJhLmlmKGsgPT0gNywgaDdfYW1wLAogIGJhLmlmKGsgPT0gOCwgaDhfYW1wLAogIGJhLmlmKGsgPD0gMTYsIGg5XzE2X2FtcCwKICBiYS5pZihrIDw9IDMyLCBoMTdfMzJfYW1wLAogICAgICAgICAgICAgICAgIGgzM182NF9hbXApKSkpKSkpKSkpOwoKLy8gU3BlY3RyYWwgdGlsdDogYW1wICo9IGtedGlsdCAoaz0xIGlzIGFsd2F5cyB1bml0eSkKdGlsdF9mYWN0b3IoaykgPSBwb3coZmxvYXQoayksIHNwZWN0cmFsX3RpbHQpOwoKLy8gT2RkL2V2ZW4gYmFsYW5jZTogw5cyIHNvIHVuaXR5IGdhaW4gYXQgb2RkX2V2ZW49MC41Cm9kZF93ZWlnaHQgID0gKDEuMCAtIG9kZF9ldmVuKSAqIDIuMDsKZXZlbl93ZWlnaHQgPSBvZGRfZXZlbiAqIDIuMDsKb2RkX2V2ZW5fZmFjdG9yKGspID0gYmEuaWYoayAlIDIgPT0gMCwgZXZlbl93ZWlnaHQsIG9kZF93ZWlnaHQpOwoKLy8gQ29tYmluZWQgcmF3IGFtcGxpdHVkZQpoYXJtX2FtcF9yYXcoaykgPSBncm91cF9hbXAoaykgKiB0aWx0X2ZhY3RvcihrKSAqIG9kZF9ldmVuX2ZhY3RvcihrKTsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBGb3JtYW50IHNoYXBpbmcg4oCUIHR3byBHYXVzc2lhbiBidW1wcyBpbiBoYXJtb25pYy1pbmRleCBzcGFjZQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc2lnbWFfc3EgPSAxLjUgKiAxLjU7CmZvcm1hbnRfYnVtcChrLCBjdHIpID0gZXhwKC0wLjUgKiAoZmxvYXQoaykgLSBjdHIpICogKGZsb2F0KGspIC0gY3RyKSAvIHNpZ21hX3NxKTsKZm9ybWFudF9mYWN0b3IoaykgPQogIDEuMCArIGZvcm1hbnRfZGVwdGggKiAoZm9ybWFudF9idW1wKGssIGZvcm1hbnQxX2ZyZXEpICsgZm9ybWFudF9idW1wKGssIGZvcm1hbnQyX2ZyZXEpKTsKCmhhcm1fYW1wKGspID0gaGFybV9hbXBfcmF3KGspICogZm9ybWFudF9mYWN0b3Ioayk7CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gSW5oYXJtb25pYyBwYXJ0aWFsIGZyZXF1ZW5jeTogZnJlcV9rID0gaypmMCooMSArIEIqKGteMiAtIDEpKQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaGFybV9mcmVxKGspID0gZnJlcV9zbW9vdGggKiBmbG9hdChrKQogICAgICAgICAgICAgICAqICgxLjAgKyBpbmhhcm1vbmljaXR5ICogKGZsb2F0KGspICogZmxvYXQoaykgLSAxLjApKTsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBQaGFzZSByYW5kb21pc2F0aW9uIOKAlCBhZGRzIHBlci1oYXJtb25pYyBub2lzZSB0byB0aGUgb3NjaWxsYXRvciBmcmVxdWVuY3ksCi8vIGdyYWR1YWxseSBkZXBoYXNpbmcgcGFydGlhbHMgKHBoYXNlX3JhbmRvbT0wOiBwaGFzZS1sb2NrZWQsID0xOiByYW5kb20pCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpwaGFzZV9yYW5kX2xmbyhrKSA9IG5vLm5vaXNlICogKGZsb2F0KChrICogMTcgKyAzKSAlIDMxICsgMSkgLyAzMS4wKQogICAgICAgICAgICAgICAgICAgIDogc2kuc21vb3RoKGJhLnRhdTJwb2xlKDAuMDUpKQogICAgICAgICAgICAgICAgICAgIDogKihwaGFzZV9yYW5kb20gKiBoYXJtX2ZyZXEoaykgKiAwLjAxKTsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBQaGFzZSByYW5kb20gd2FsayDigJQgc2xvd2VyIGluZGVwZW5kZW50IGRyaWZ0IHBlciBwYXJ0aWFsCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpwaGFzZV93YWxrKGspID0gbm8ubm9pc2UgKiAoZmxvYXQoayAlIDcgKyAxKSAvIDcuMCkKICAgICAgICAgICAgICAgIDogc2kuc21vb3RoKGJhLnRhdTJwb2xlKDAuMSkpCiAgICAgICAgICAgICAgICA6ICoocGhhc2Vfd2Fsa19yYXRlKTsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBJbnRlci1wYXJ0aWFsIGJlYXRpbmcg4oCUIHNpbnVzb2lkYWwgZGV0dW5pbmcgc3RhZ2dlcgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KYmVhdGluZ19vZmZzZXQoaykgPSBiZWF0aW5nX2RlcHRoCiAgICAgICAgICAgICAgICAgICAgKiBvcy5vc2MoYmVhdGluZ19yYXRlICogZmxvYXQoayAlIDMgKyAxKSAqIDAuNykKICAgICAgICAgICAgICAgICAgICAqIGhhcm1fZnJlcShrKTsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBTdGVyZW8gc3ByZWFkIOKAlCBSIGNoYW5uZWwgZ2V0cyBhIHNtYWxsIHBlci1oYXJtb25pYyBwaXRjaCBvZmZzZXQKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0ZXJlb19zcHJlYWRfZnJlcShrKSA9IHN0ZXJlb19waGFzZV9zcHJlYWQgKiBmbG9hdChrKSAqIDAuMDE7CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gQWRkaXRpdmUgb3NjaWxsYXRvciBzdW1zIOKAlCBMIGFuZCBSCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQphZGRpdGl2ZV9MID0gc3VtKGssIE4sCiAgaGFybV9hbXAoaysxKSAqIGJyaWdodF9mYWN0b3IoaysxKSAqIGZsdXhfZmFjdG9yKGsrMSkgKiBkcmlmdF9mYWN0b3IoaysxKSAqCiAgb3Mub3NjKCAgaGFybV9mcmVxKGsrMSkgKiAoMS4wICsgdmlicmF0b19sZm8pCiAgICAgICAgICsgYmVhdGluZ19vZmZzZXQoaysxKQogICAgICAgICArIHBoYXNlX3JhbmRfbGZvKGsrMSkKICAgICAgICAgKyBwaGFzZV93YWxrKGsrMSkKICApCik7CgphZGRpdGl2ZV9SID0gc3VtKGssIE4sCiAgaGFybV9hbXAoaysxKSAqIGJyaWdodF9mYWN0b3IoaysxKSAqIGZsdXhfZmFjdG9yKGsrMSkgKiBkcmlmdF9mYWN0b3IoaysxKSAqCiAgb3Mub3NjKCAgaGFybV9mcmVxKGsrMSkgKiAoMS4wICsgdmlicmF0b19sZm8gKyBzdGVyZW9fc3ByZWFkX2ZyZXEoaysxKSkKICAgICAgICAgKyBiZWF0aW5nX29mZnNldChrKzEpCiAgICAgICAgICsgcGhhc2VfcmFuZF9sZm8oaysxKQogICAgICAgICArIHBoYXNlX3dhbGsoaysxKQogICkKKTsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBTdWItaGFybW9uaWMgKDAuNcOXIGZ1bmRhbWVudGFsKQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViX29zYyA9IHN1Yl9oYXJtb25pYyAqIG9zLm9zYyhmcmVxX3Ntb290aCAqIDAuNSk7CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gTm9pc2UgZmxvb3Ig4oCUIGNvbG91cmVkIHZpYSBvbmUtcG9sZSBMUCAobm9pc2VfY29sb3I9MOKGkndoaXRlLCA9MeKGkmRhcmspCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpub2lzZV9scF9jdXRvZmYgPSAyMDAuMCArICgxLjAgLSBub2lzZV9jb2xvcikgKiAxOTgwMC4wOwpub2lzZV9zaWduYWwgICAgPSBuby5ub2lzZSA6IGZpLmxvd3Bhc3MoMSwgbm9pc2VfbHBfY3V0b2ZmKTsKbm9pc2Vfb3V0ICAgICAgID0gbm9pc2VfZmxvb3IgKiBub2lzZV9zaWduYWw7CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gU29mdC1jbGlwIHNhdHVyYXRpb24g4oCUIHRhbmggd2F2ZXNoYXBlcgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZHJpdmUgICAgICAgPSAxLjAgKyBzYXR1cmF0aW9uICogOS4wOwpzb2Z0Y2xpcCh4KSA9IG1hLnRhbmgoeCAqIGRyaXZlKSAvIGRyaXZlOwoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIE91dHB1dCBnYWluCi8vIHZlbF9icmlnaHQgbW9kdWxhdGVzIGhvdyBtdWNoIHRoZSBicmlnaHRuZXNzIGVudmVsb3BlIGJvb3N0cyB0aGUgb3ZlcmFsbAovLyBsZXZlbCBkdXJpbmcgbm90ZSBvbnNldCAoY291cGxlcyB2ZWxvY2l0eSBzZW5zaXRpdml0eSB0byBicmlnaHRuZXNzKS4KLy8gSGVyZSBpdCBhY3RzIGFzIGEgc3VidGxlIG1pZC10ZXJtIGdhaW4gc2hhcGVyIHZpYSB0aGUgYnJpZ2h0X2VudiBzaWduYWwuCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2ZWxfYnJpZ2h0X2Jvb3N0ID0gMS4wICsgdmVsX2JyaWdodCAqIGJyaWdodF9lbnYgKiAwLjM7Cm91dF9nYWluID0gbGV2ZWwgKiAoMS4wIC0gdmVsX3NlbnMgKiAwLjMpICogdmVsX2JyaWdodF9ib29zdDsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBGaW5hbCBhc3NlbWJseQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc2lnbmFsX0wgPSAoYWRkaXRpdmVfTCArIHN1Yl9vc2MgKyBub2lzZV9vdXQpICogYW1wX2VudiAqIHRyZW1vbG9fbGZvICogb3V0X2dhaW47CnNpZ25hbF9SID0gKGFkZGl0aXZlX1IgKyBzdWJfb3NjICsgbm9pc2Vfb3V0KSAqIGFtcF9lbnYgKiB0cmVtb2xvX2xmbyAqIG91dF9nYWluOwoKcHJvY2VzcyA9IHNvZnRjbGlwKHNpZ25hbF9MKSwgc29mdGNsaXAoc2lnbmFsX1IpOwo=","inputs": 0,"outputs": 2,"meta": [ { "basics.lib/name": "Faust Basic Element Library" },{ "basics.lib/version": "1.21.0" },{ "compile_options": "-lang wasm -ct 1 -cn additive -es 1 -mcd 16 -mdd 1024 -mdy 33 -single -ftz 0" },{ "envelopes.lib/adsr:author": "Yann Orlarey and Andrey Bundin" },{ "envelopes.lib/author": "GRAME" },{ "envelopes.lib/copyright": "GRAME" },{ "envelopes.lib/license": "LGPL with exception" },{ "envelopes.lib/name": "Faust Envelope Library" },{ "envelopes.lib/version": "1.3.0" },{ "filename": "additive.dsp" },{ "filters.lib/lowpass0_highpass1": "MIT-style STK-4.3 license" },{ "filters.lib/lowpass0_highpass1:author": "Julius O. Smith III" },{ "filters.lib/lowpass:author": "Julius O. Smith III" },{ "filters.lib/lowpass:copyright": "Copyright (C) 2003-2019 by Julius O. Smith III <jos@ccrma.stanford.edu>" },{ "filters.lib/lowpass:license": "MIT-style STK-4.3 license" },{ "filters.lib/name": "Faust Filters Library" },{ "filters.lib/tf1:author": "Julius O. Smith III" },{ "filters.lib/tf1:copyright": "Copyright (C) 2003-2019 by Julius O. Smith III <jos@ccrma.stanford.edu>" },{ "filters.lib/tf1:license": "MIT-style STK-4.3 license" },{ "filters.lib/tf1s:author": "Julius O. Smith III" },{ "filters.lib/tf1s:copyright": "Copyright (C) 2003-2019 by Julius O. Smith III <jos@ccrma.stanford.edu>" },{ "filters.lib/tf1s:license": "MIT-style STK-4.3 license" },{ "filters.lib/version": "1.7.1" },{ "maths.lib/author": "GRAME" },{ "maths.lib/copyright": "GRAME" },{ "maths.lib/license": "LGPL with exception" },{ "maths.lib/name": "Faust Math Library" },{ "maths.lib/version": "2.8.1" },{ "name": "additive" },{ "noises.lib/name": "Faust Noise Generator Library" },{ "noises.lib/version": "1.4.1" },{ "oscillators.lib/name": "Faust Oscillator Library" },{ "oscillators.lib/version": "1.6.0" },{ "platform.lib/name": "Generic Platform Library" },{ "platform.lib/version": "1.3.0" },{ "signals.lib/name": "Faust Signal Routing Library" },{ "signals.lib/version": "1.6.0" }],"ui": [ {"type": "vgroup","label": "additive","items": [ {"type": "hslider","label": "0_Hidden/freq","varname": "fHslider19","shortname": "0_Hidden_freq","address": "/additive/0_Hidden_freq","index": 262336,"meta": [{ "hidden": "1" },{ "unit": "Hz" }],"init": 220,"min": 20,"max": 4000,"step": 0.01},{"type": "button","label": "0_Hidden/gate","varname": "fButton0","shortname": "0_Hidden_gate","address": "/additive/0_Hidden_gate","index": 262152,"meta": [{ "hidden": "1" }]},{"type": "hslider","label": "1_Spectral Shape/00_h1_amp","varname": "fHslider41","shortname": "1_Spectral_Shape_00_h1_amp","address": "/additive/1_Spectral_Shape_00_h1_amp","index": 263488,"meta": [{ "tooltip": "H1 amplitude" }],"init": 0.8,"min": 0,"max": 1,"step": 0.001},{"type": "hslider","label": "1_Spectral Shape/01_h2_amp","varname": "fHslider40","shortname": "1_Spectral_Shape_01_h2_amp","address": "/additive/1_Spectral_Shape_01_h2_amp","index": 263476,"meta": [{ "tooltip": "H2 amplitude" }],"init": 0.5,"min": 0,"max": 1,"step": 0.001},{"type": "hslider","label": "1_Spectral Shape/02_h3_amp","varname": "fHslider39","shortname": "1_Spectral_Shape_02_h3_amp","address": "/additive/1_Spectral_Shape_02_h3_amp","index": 263464,"meta": [{ "tooltip": "H3 amplitude" }],"init": 0.35,"min": 0,"max": 1,"step": 0.001},{"type": "hslider","label": "1_Spectral Shape/03_h4_amp","varname": "fHslider38","shortname": "1_Spectral_Shape_03_h4_amp","address": "/additive/1_Spectral_Shape_03_h4_amp","index": 263452,"meta": [{ "tooltip": "H4 amplitude" }],"init": 0.25,"min": 0,"max": 1,"step": 0.001},{"type": "hslider","label": "1_Spectral Shape/04_h5_amp","varname": "fHslider37","shortname": "1_Spectral_Shape_04_h5_amp","address": "/additive/1_Spectral_Shape_04_h5_amp","index": 263440,"meta": [{ "tooltip": "H5 amplitude" }],"init": 0.18,"min": 0,"max": 1,"step": 0.001},{"type": "hslider","label": "1_Spectral Shape/05_h6_amp","varname": "fHslider36","shortname": "1_Spectral_Shape_05_h6_amp","address": "/additive/1_Spectral_Shape_05_h6_amp","index": 263428,"meta": [{ "tooltip": "H6 amplitude" }],"init": 0.12,"min": 0,"max": 1,"step": 0.001},{"type": "hslider","label": "1_Spectral Shape/06_h7_amp","varname": "fHslider35","shortname": "1_Spectral_Shape_06_h7_amp","address": "/additive/1_Spectral_Shape_06_h7_amp","index": 263416,"meta": [{ "tooltip": "H7 amplitude" }],"init": 0.08,"min": 0,"max": 1,"step": 0.001},{"type": "hslider","label": "1_Spectral Shape/07_h8_amp","varname": "fHslider34","shortname": "1_Spectral_Shape_07_h8_amp","address": "/additive/1_Spectral_Shape_07_h8_amp","index": 263404,"meta": [{ "tooltip": "H8 amplitude" }],"init": 0.06,"min": 0,"max": 1,"step": 0.001},{"type": "hslider","label": "1_Spectral Shape/08_h9_16_amp","varname": "fHslider33","shortname": "1_Spectral_Shape_08_h9_16_amp","address": "/additive/1_Spectral_Shape_08_h9_16_amp","index": 263336,"meta": [{ "tooltip": "H9-16 group amp" }],"init": 0.05,"min": 0,"max": 1,"step": 0.001},{"type": "hslider","label": "1_Spectral Shape/09_h17_32_amp","varname": "fHslider32","shortname": "1_Spectral_Shape_09_h17_32_amp","address": "/additive/1_Spectral_Shape_09_h17_32_amp","index": 263204,"meta": [{ "tooltip": "H17-32 group amp" }],"init": 0.025,"min": 0,"max": 1,"step": 0.001},{"type": "hslider","label": "1_Spectral Shape/10_h33_64_amp","varname": "fHslider30","shortname": "1_Spectral_Shape_10_h33_64_amp","address": "/additive/1_Spectral_Shape_10_h33_64_amp","index": 262436,"meta": [{ "tooltip": "H33-64 group amp" }],"init": 0.01,"min": 0,"max": 1,"step": 0.001},{"type": "hslider","label": "1_Spectral Shape/11_spectral_tilt","varname": "fHslider29","shortname": "1_Spectral_Shape_11_spectral_tilt","address": "/additive/1_Spectral_Shape_11_spectral_tilt","index": 262432,"meta": [{ "tooltip": "Global tilt" }],"init": 0,"min": -1,"max": 1,"step": 0.001},{"type": "hslider","label": "1_Spectral Shape/12_inharmonicity","varname": "fHslider20","shortname": "1_Spectral_Shape_12_inharmonicity","address": "/additive/1_Spectral_Shape_12_inharmonicity","index": 262348,"meta": [{ "tooltip": "Inharmonicity" }],"init": 0,"min": 0,"max": 0.15,"step": 0.0001},{"type": "hslider","label": "1_Spectral Shape/13_odd_even","varname": "fHslider31","shortname": "1_Spectral_Shape_13_odd_even","address": "/additive/1_Spectral_Shape_13_odd_even","index": 262440,"meta": [{ "tooltip": "Odd/even balance" }],"init": 0.5,"min": 0,"max": 1,"step": 0.001},{"type": "hslider","label": "2_Temporal/00_attack","varname": "fHslider8","shortname": "2_Temporal_00_attack","address": "/additive/2_Temporal_00_attack","index": 262232,"meta": [{ "scale": "log" },{ "tooltip": "Attack" }],"init": 0.01,"min": 0.001,"max": 5,"step": 0.001},{"type": "hslider","label": "2_Temporal/01_decay","varname": "fHslider9","shortname": "2_Temporal_01_decay","address": "/additive/2_Temporal_01_decay","index": 262236,"meta": [{ "tooltip": "Decay" }],"init": 0.3,"min": 0.001,"max": 10,"step": 0.001},{"type": "hslider","label": "2_Temporal/02_sustain","varname": "fHslider10","shortname": "2_Temporal_02_sustain","address": "/additive/2_Temporal_02_sustain","index": 262240,"meta": [{ "tooltip": "Sustain" }],"init": 0.7,"min": 0,"max": 1,"step": 0.001},{"type": "hslider","label": "2_Temporal/03_release","varname": "fHslider7","shortname": "2_Temporal_03_release","address": "/additive/2_Temporal_03_release","index": 262228,"meta": [{ "tooltip": "Release" }],"init": 0.5,"min": 0.01,"max": 10,"step": 0.001},{"type": "hslider","label": "2_Temporal/04_brightness_attack","varname": "fHslider1","shortname": "2_Temporal_04_brightness_attack","address": "/additive/2_Temporal_04_brightness_attack","index": 262192,"meta": [{ "scale": "log" },{ "tooltip": "Bright A" }],"init": 0.005,"min": 0.001,"max": 5,"step": 0.001},{"type": "hslider","label": "2_Temporal/05_brightness_decay","varname": "fHslider2","shortname": "2_Temporal_05_brightness_decay","address": "/additive/2_Temporal_05_brightness_decay","index": 262196,"meta": [{ "tooltip": "Bright D" }],"init": 0.15,"min": 0.001,"max": 5,"step": 0.001},{"type": "hslider","label": "2_Temporal/06_brightness_sustain","varname": "fHslider3","shortname": "2_Temporal_06_brightness_sustain","address": "/additive/2_Temporal_06_brightness_sustain","index": 262200,"meta": [{ "tooltip": "Bright S" }],"init": 0.4,"min": 0,"max": 1,"step": 0.001},{"type": "hslider","label": "2_Temporal/07_brightness_release","varname": "fHslider0","shortname": "2_Temporal_07_brightness_release","address": "/additive/2_Temporal_07_brightness_release","index": 262172,"meta": [{ "tooltip": "Bright R" }],"init": 0.3,"min": 0.01,"max": 5,"step": 0.001},{"type": "hslider","label": "2_Temporal/08_spectral_flux_rate","varname": "fHslider22","shortname": "2_Temporal_08_spectral_flux_rate","address": "/additive/2_Temporal_08_spectral_flux_rate","index": 262384,"meta": [{ "tooltip": "Flux rate" }],"init": 0.5,"min": 0,"max": 10,"step": 0.01},{"type": "hslider","label": "2_Temporal/09_spectral_flux_depth","varname": "fHslider23","shortname": "2_Temporal_09_spectral_flux_depth","address": "/additive/2_Temporal_09_spectral_flux_depth","index": 262396,"meta": [{ "tooltip": "Flux depth" }],"init": 0.1,"min": 0,"max": 1,"step": 0.001},{"type": "hslider","label": "3_Phase/00_phase_random","varname": "fHslider11","shortname": "3_Phase_00_phase_random","address": "/additive/3_Phase_00_phase_random","index": 262280,"meta": [{ "tooltip": "Phase randomisation" }],"init": 0,"min": 0,"max": 1,"step": 0.001},{"type": "hslider","label": "3_Phase/01_phase_walk_rate","varname": "fHslider21","shortname": "3_Phase_01_phase_walk_rate","address": "/additive/3_Phase_01_phase_walk_rate","index": 262372,"meta": [{ "tooltip": "Phase walk rate" }],"init": 0,"min": 0,"max": 5,"step": 0.001},{"type": "hslider","label": "3_Phase/02_beating_depth","varname": "fHslider13","shortname": "3_Phase_02_beating_depth","address": "/additive/3_Phase_02_beating_depth","index": 262300,"meta": [{ "tooltip": "Beating depth" }],"init": 0,"min": 0,"max": 0.02,"step": 0.0001},{"type": "hslider","label": "3_Phase/03_beating_rate","varname": "fHslider12","shortname": "3_Phase_03_beating_rate","address": "/additive/3_Phase_03_beating_rate","index": 262284,"meta": [{ "tooltip": "Beating rate" }],"init": 1,"min": 0,"max": 10,"step": 0.01},{"type": "hslider","label": "3_Phase/04_stereo_phase_spread","varname": "fHslider48","shortname": "3_Phase_04_stereo_phase_spread","address": "/additive/3_Phase_04_stereo_phase_spread","index": 263536,"meta": [{ "tooltip": "Stereo spread" }],"init": 0.1,"min": 0,"max": 1,"step": 0.001},{"type": "hslider","label": "3_Phase/05_noise_floor","varname": "fHslider43","shortname": "3_Phase_05_noise_floor","address": "/additive/3_Phase_05_noise_floor","index": 263504,"meta": [{ "tooltip": "Noise floor" }],"init": 0,"min": 0,"max": 0.2,"step": 0.001},{"type": "hslider","label": "3_Phase/06_noise_color","varname": "fHslider42","shortname": "3_Phase_06_noise_color","address": "/additive/3_Phase_06_noise_color","index": 263492,"meta": [{ "tooltip": "Noise colour" }],"init": 0.5,"min": 0,"max": 1,"step": 0.001},{"type": "hslider","label": "3_Phase/07_sub_harmonic","varname": "fHslider44","shortname": "3_Phase_07_sub_harmonic","address": "/additive/3_Phase_07_sub_harmonic","index": 263520,"meta": [{ "tooltip": "Sub-harmonic" }],"init": 0,"min": 0,"max": 1,"step": 0.001},{"type": "hslider","label": "4_Modulation/00_vibrato_rate","varname": "fHslider15","shortname": "4_Modulation_00_vibrato_rate","address": "/additive/4_Modulation_00_vibrato_rate","index": 262312,"meta": [{ "tooltip": "Vibrato rate" }],"init": 5,"min": 0,"max": 10,"step": 0.01},{"type": "hslider","label": "4_Modulation/01_vibrato_depth","varname": "fHslider16","shortname": "4_Modulation_01_vibrato_depth","address": "/additive/4_Modulation_01_vibrato_depth","index": 262324,"meta": [{ "tooltip": "Vibrato depth" }],"init": 0,"min": 0,"max": 0.05,"step": 0.0001},{"type": "hslider","label": "4_Modulation/02_vibrato_delay","varname": "fHslider14","shortname": "4_Modulation_02_vibrato_delay","address": "/additive/4_Modulation_02_vibrato_delay","index": 262308,"meta": [{ "tooltip": "Vibrato delay" }],"init": 0.3,"min": 0,"max": 2,"step": 0.001},{"type": "hslider","label": "4_Modulation/03_tremolo_rate","varname": "fHslider5","shortname": "4_Modulation_03_tremolo_rate","address": "/additive/4_Modulation_03_tremolo_rate","index": 262208,"meta": [{ "tooltip": "Tremolo rate" }],"init": 4,"min": 0,"max": 20,"step": 0.01},{"type": "hslider","label": "4_Modulation/04_tremolo_depth","varname": "fHslider6","shortname": "4_Modulation_04_tremolo_depth","address": "/additive/4_Modulation_04_tremolo_depth","index": 262224,"meta": [{ "tooltip": "Tremolo depth" }],"init": 0,"min": 0,"max": 1,"step": 0.001},{"type": "hslider","label": "4_Modulation/05_drift_rate","varname": "fHslider24","shortname": "4_Modulation_05_drift_rate","address": "/additive/4_Modulation_05_drift_rate","index": 262400,"meta": [{ "tooltip": "Drift rate" }],"init": 0,"min": 0,"max": 2,"step": 0.001},{"type": "hslider","label": "4_Modulation/06_drift_depth","varname": "fHslider25","shortname": "4_Modulation_06_drift_depth","address": "/additive/4_Modulation_06_drift_depth","index": 262416,"meta": [{ "tooltip": "Drift depth" }],"init": 0,"min": 0,"max": 0.3,"step": 0.001},{"type": "hslider","label": "4_Modulation/07_formant1_freq","varname": "fHslider27","shortname": "4_Modulation_07_formant1_freq","address": "/additive/4_Modulation_07_formant1_freq","index": 262424,"meta": [{ "tooltip": "Formant 1 freq" }],"init": 3,"min": 1,"max": 16,"step": 0.01},{"type": "hslider","label": "4_Modulation/08_formant2_freq","varname": "fHslider26","shortname": "4_Modulation_08_formant2_freq","address": "/additive/4_Modulation_08_formant2_freq","index": 262420,"meta": [{ "tooltip": "Formant 2 freq" }],"init": 6,"min": 1,"max": 16,"step": 0.01},{"type": "hslider","label": "4_Modulation/09_formant_depth","varname": "fHslider28","shortname": "4_Modulation_09_formant_depth","address": "/additive/4_Modulation_09_formant_depth","index": 262428,"meta": [{ "tooltip": "Formant depth" }],"init": 0,"min": 0,"max": 1,"step": 0.001},{"type": "hslider","label": "5_Master/00_level","varname": "fHslider47","shortname": "5_Master_00_level","address": "/additive/5_Master_00_level","index": 263532,"meta": [{ "tooltip": "Output level" }],"init": 0.7,"min": 0,"max": 1,"step": 0.001},{"type": "hslider","label": "5_Master/01_vel_sens","varname": "fHslider46","shortname": "5_Master_01_vel_sens","address": "/additive/5_Master_01_vel_sens","index": 263528,"meta": [{ "tooltip": "Velocity sens" }],"init": 0.5,"min": 0,"max": 1,"step": 0.001},{"type": "hslider","label": "5_Master/02_vel_brightness","varname": "fHslider4","shortname": "5_Master_02_vel_brightness","address": "/additive/5_Master_02_vel_brightness","index": 262204,"meta": [{ "tooltip": "Vel bright" }],"init": 0.3,"min": 0,"max": 1,"step": 0.001},{"type": "hslider","label": "5_Master/03_pitch_glide","varname": "fHslider17","shortname": "5_Master_03_pitch_glide","address": "/additive/5_Master_03_pitch_glide","index": 262328,"meta": [{ "tooltip": "Portamento" }],"init": 0,"min": 0,"max": 10,"step": 0.01},{"type": "hslider","label": "5_Master/04_saturation","varname": "fHslider45","shortname": "5_Master_04_saturation","address": "/additive/5_Master_04_saturation","index": 263524,"meta": [{ "tooltip": "Saturation" }],"init": 0,"min": 0,"max": 1,"step": 0.001},{"type": "hslider","label": "5_Master/05_fine_tune","varname": "fHslider18","shortname": "5_Master_05_fine_tune","address": "/additive/5_Master_05_fine_tune","index": 262332,"meta": [{ "tooltip": "Cents" },{ "unit": "ct" }],"init": 0,"min": -50,"max": 50,"step": 0.1}]}]} |