@grame/faustwasm 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/standalone/faustwasm/index.d.ts +17 -5
- package/assets/standalone/faustwasm/index.js +69 -47
- package/assets/standalone/faustwasm/index.js.map +2 -2
- package/dist/cjs/index.d.ts +17 -5
- package/dist/cjs/index.js +69 -47
- package/dist/cjs/index.js.map +2 -2
- package/dist/cjs-bundle/index.d.ts +17 -5
- package/dist/cjs-bundle/index.js +71 -49
- package/dist/cjs-bundle/index.js.map +2 -2
- package/dist/esm/index.d.ts +17 -5
- package/dist/esm/index.js +69 -47
- package/dist/esm/index.js.map +2 -2
- package/dist/esm-bundle/index.d.ts +17 -5
- package/dist/esm-bundle/index.js +71 -49
- package/dist/esm-bundle/index.js.map +2 -2
- package/libfaust-wasm/libfaust-wasm.js +1 -1
- package/libfaust-wasm/libfaust-wasm.wasm +0 -0
- package/package.json +1 -1
- package/src/FaustWasmInstantiator.ts +14 -5
- package/src/FaustWebAudioDsp.ts +97 -46
- package/test/faustlive-wasm/faustwasm/index.d.ts +17 -5
- package/test/faustlive-wasm/faustwasm/index.js +69 -47
- package/test/faustlive-wasm/faustwasm/index.js.map +2 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../node_modules/tslib/tslib.js", "../../node_modules/@aws-crypto/sha256-js/src/constants.ts", "../../node_modules/@aws-crypto/sha256-js/src/RawSha256.ts", "../../node_modules/@aws-sdk/util-utf8-browser/dist-cjs/pureJs.js", "../../node_modules/@aws-sdk/util-utf8-browser/dist-cjs/whatwgEncodingApi.js", "../../node_modules/@aws-sdk/util-utf8-browser/dist-cjs/index.js", "../../node_modules/@aws-crypto/util/src/convertToBuffer.ts", "../../node_modules/@aws-crypto/util/src/isEmptyData.ts", "../../node_modules/@aws-crypto/util/src/numToUint8.ts", "../../node_modules/@aws-crypto/util/src/uint32ArrayFrom.ts", "../../node_modules/@aws-crypto/util/src/index.ts", "../../node_modules/@aws-crypto/sha256-js/src/jsSha256.ts", "../../node_modules/@aws-crypto/sha256-js/src/index.ts", "../../src/instantiateFaustModuleFromFile.ts", "../../src/FaustAudioWorkletProcessor.ts", "../../src/FaustFFTAudioWorkletProcessor.ts", "../../src/FaustCompiler.ts", "../../src/FaustDspInstance.ts", "../../src/FaustWasmInstantiator.ts", "../../src/FaustWebAudioDsp.ts", "../../src/FaustOfflineProcessor.ts", "../../src/FaustSvgDiagrams.ts", "../../src/FaustCmajor.ts", "../../src/LibFaust.ts", "../../src/WavEncoder.ts", "../../src/WavDecoder.ts", "../../src/FaustAudioWorkletNode.ts", "../../src/FaustScriptProcessorNode.ts", "../../src/FaustDspGenerator.ts"],
|
|
4
|
-
"sourcesContent": ["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n\r\n/* global global, define, System, Reflect, Promise */\r\nvar __extends;\r\nvar __assign;\r\nvar __rest;\r\nvar __decorate;\r\nvar __param;\r\nvar __metadata;\r\nvar __awaiter;\r\nvar __generator;\r\nvar __exportStar;\r\nvar __values;\r\nvar __read;\r\nvar __spread;\r\nvar __spreadArrays;\r\nvar __await;\r\nvar __asyncGenerator;\r\nvar __asyncDelegator;\r\nvar __asyncValues;\r\nvar __makeTemplateObject;\r\nvar __importStar;\r\nvar __importDefault;\r\nvar __classPrivateFieldGet;\r\nvar __classPrivateFieldSet;\r\nvar __createBinding;\r\n(function (factory) {\r\n var root = typeof global === \"object\" ? global : typeof self === \"object\" ? self : typeof this === \"object\" ? this : {};\r\n if (typeof define === \"function\" && define.amd) {\r\n define(\"tslib\", [\"exports\"], function (exports) { factory(createExporter(root, createExporter(exports))); });\r\n }\r\n else if (typeof module === \"object\" && typeof module.exports === \"object\") {\r\n factory(createExporter(root, createExporter(module.exports)));\r\n }\r\n else {\r\n factory(createExporter(root));\r\n }\r\n function createExporter(exports, previous) {\r\n if (exports !== root) {\r\n if (typeof Object.create === \"function\") {\r\n Object.defineProperty(exports, \"__esModule\", { value: true });\r\n }\r\n else {\r\n exports.__esModule = true;\r\n }\r\n }\r\n return function (id, v) { return exports[id] = previous ? previous(id, v) : v; };\r\n }\r\n})\r\n(function (exporter) {\r\n var extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n\r\n __extends = function (d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n\r\n __assign = Object.assign || function (t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n\r\n __rest = function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n };\r\n\r\n __decorate = function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n };\r\n\r\n __param = function (paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n };\r\n\r\n __metadata = function (metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n };\r\n\r\n __awaiter = function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n };\r\n\r\n __generator = function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n };\r\n\r\n __createBinding = function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n };\r\n\r\n __exportStar = function (m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n };\r\n\r\n __values = function (o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n };\r\n\r\n __read = function (o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n };\r\n\r\n __spread = function () {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n };\r\n\r\n __spreadArrays = function () {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n };\r\n\r\n __await = function (v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n };\r\n\r\n __asyncGenerator = function (thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n };\r\n\r\n __asyncDelegator = function (o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n };\r\n\r\n __asyncValues = function (o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n };\r\n\r\n __makeTemplateObject = function (cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n };\r\n\r\n __importStar = function (mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result[\"default\"] = mod;\r\n return result;\r\n };\r\n\r\n __importDefault = function (mod) {\r\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\r\n };\r\n\r\n __classPrivateFieldGet = function (receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n };\r\n\r\n __classPrivateFieldSet = function (receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n };\r\n\r\n exporter(\"__extends\", __extends);\r\n exporter(\"__assign\", __assign);\r\n exporter(\"__rest\", __rest);\r\n exporter(\"__decorate\", __decorate);\r\n exporter(\"__param\", __param);\r\n exporter(\"__metadata\", __metadata);\r\n exporter(\"__awaiter\", __awaiter);\r\n exporter(\"__generator\", __generator);\r\n exporter(\"__exportStar\", __exportStar);\r\n exporter(\"__createBinding\", __createBinding);\r\n exporter(\"__values\", __values);\r\n exporter(\"__read\", __read);\r\n exporter(\"__spread\", __spread);\r\n exporter(\"__spreadArrays\", __spreadArrays);\r\n exporter(\"__await\", __await);\r\n exporter(\"__asyncGenerator\", __asyncGenerator);\r\n exporter(\"__asyncDelegator\", __asyncDelegator);\r\n exporter(\"__asyncValues\", __asyncValues);\r\n exporter(\"__makeTemplateObject\", __makeTemplateObject);\r\n exporter(\"__importStar\", __importStar);\r\n exporter(\"__importDefault\", __importDefault);\r\n exporter(\"__classPrivateFieldGet\", __classPrivateFieldGet);\r\n exporter(\"__classPrivateFieldSet\", __classPrivateFieldSet);\r\n});\r\n", null, null, "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toUtf8 = exports.fromUtf8 = void 0;\nconst fromUtf8 = (input) => {\n const bytes = [];\n for (let i = 0, len = input.length; i < len; i++) {\n const value = input.charCodeAt(i);\n if (value < 0x80) {\n bytes.push(value);\n }\n else if (value < 0x800) {\n bytes.push((value >> 6) | 0b11000000, (value & 0b111111) | 0b10000000);\n }\n else if (i + 1 < input.length && (value & 0xfc00) === 0xd800 && (input.charCodeAt(i + 1) & 0xfc00) === 0xdc00) {\n const surrogatePair = 0x10000 + ((value & 0b1111111111) << 10) + (input.charCodeAt(++i) & 0b1111111111);\n bytes.push((surrogatePair >> 18) | 0b11110000, ((surrogatePair >> 12) & 0b111111) | 0b10000000, ((surrogatePair >> 6) & 0b111111) | 0b10000000, (surrogatePair & 0b111111) | 0b10000000);\n }\n else {\n bytes.push((value >> 12) | 0b11100000, ((value >> 6) & 0b111111) | 0b10000000, (value & 0b111111) | 0b10000000);\n }\n }\n return Uint8Array.from(bytes);\n};\nexports.fromUtf8 = fromUtf8;\nconst toUtf8 = (input) => {\n let decoded = \"\";\n for (let i = 0, len = input.length; i < len; i++) {\n const byte = input[i];\n if (byte < 0x80) {\n decoded += String.fromCharCode(byte);\n }\n else if (0b11000000 <= byte && byte < 0b11100000) {\n const nextByte = input[++i];\n decoded += String.fromCharCode(((byte & 0b11111) << 6) | (nextByte & 0b111111));\n }\n else if (0b11110000 <= byte && byte < 0b101101101) {\n const surrogatePair = [byte, input[++i], input[++i], input[++i]];\n const encoded = \"%\" + surrogatePair.map((byteValue) => byteValue.toString(16)).join(\"%\");\n decoded += decodeURIComponent(encoded);\n }\n else {\n decoded += String.fromCharCode(((byte & 0b1111) << 12) | ((input[++i] & 0b111111) << 6) | (input[++i] & 0b111111));\n }\n }\n return decoded;\n};\nexports.toUtf8 = toUtf8;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toUtf8 = exports.fromUtf8 = void 0;\nfunction fromUtf8(input) {\n return new TextEncoder().encode(input);\n}\nexports.fromUtf8 = fromUtf8;\nfunction toUtf8(input) {\n return new TextDecoder(\"utf-8\").decode(input);\n}\nexports.toUtf8 = toUtf8;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toUtf8 = exports.fromUtf8 = void 0;\nconst pureJs_1 = require(\"./pureJs\");\nconst whatwgEncodingApi_1 = require(\"./whatwgEncodingApi\");\nconst fromUtf8 = (input) => typeof TextEncoder === \"function\" ? (0, whatwgEncodingApi_1.fromUtf8)(input) : (0, pureJs_1.fromUtf8)(input);\nexports.fromUtf8 = fromUtf8;\nconst toUtf8 = (input) => typeof TextDecoder === \"function\" ? (0, whatwgEncodingApi_1.toUtf8)(input) : (0, pureJs_1.toUtf8)(input);\nexports.toUtf8 = toUtf8;\n", null, null, null, null, null, null, null, "import type { FaustModuleFactory } from \"./types\";\n\n/**\n * Load libfaust-wasm files, than instantiate libFaust\n * @param jsFile path to `libfaust-wasm.js`\n * @param dataFile path to `libfaust-wasm.data`\n * @param wasmFile path to `libfaust-wasm.wasm`\n */\nconst instantiateFaustModuleFromFile = async (jsFile: string, dataFile = jsFile.replace(/c?js$/, \"data\"), wasmFile = jsFile.replace(/c?js$/, \"wasm\")) => {\n let FaustModule: FaustModuleFactory;\n let dataBinary: ArrayBuffer;\n let wasmBinary: Uint8Array | ArrayBuffer;\n const jsCodeHead = /var (.+) = \\(/;\n if (typeof window === \"object\") {\n let jsCode = await (await fetch(jsFile)).text();\n jsCode = `${jsCode}\nexport default ${jsCode.match(jsCodeHead)?.[1]};\n`;\n const jsFileMod = URL.createObjectURL(new Blob([jsCode], { type: \"text/javascript\" }));\n FaustModule = (await import(/* webpackIgnore: true */jsFileMod)).default;\n dataBinary = await (await fetch(dataFile)).arrayBuffer();\n wasmBinary = new Uint8Array(await (await fetch(wasmFile)).arrayBuffer());\n } else {\n const { promises: fs } = await import(\"fs\");\n const { pathToFileURL } = await import(\"url\");\n let jsCode = (await fs.readFile(jsFile, { encoding: \"utf-8\" }));\n jsCode = `\nimport process from \"process\";\nimport * as path from \"path\";\nimport { createRequire } from \"module\";\nimport { fileURLToPath } from \"url\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst __filename = fileURLToPath(import.meta.url);\nconst require = createRequire(import.meta.url);\n\n${jsCode}\n\nexport default ${jsCode.match(jsCodeHead)?.[1]};\n`;\n const jsFileMod = jsFile.replace(/c?js$/, \"mjs\");\n await fs.writeFile(jsFileMod, jsCode);\n FaustModule = (await import(/* webpackIgnore: true */pathToFileURL(jsFileMod).href)).default;\n await fs.unlink(jsFileMod);\n dataBinary = (await fs.readFile(dataFile)).buffer;\n wasmBinary = (await fs.readFile(wasmFile)).buffer;\n }\n const faustModule = await FaustModule({\n wasmBinary,\n getPreloadedPackage: (remotePackageName: string, remotePackageSize: number) => {\n if (remotePackageName === \"libfaust-wasm.data\") return dataBinary;\n return new ArrayBuffer(0);\n }});\n return faustModule;\n};\n\nexport default instantiateFaustModuleFromFile;\n", "import type FaustWasmInstantiator from \"./FaustWasmInstantiator\";\nimport type { FaustBaseWebAudioDsp, FaustWebAudioDspVoice, FaustMonoWebAudioDsp, FaustPolyWebAudioDsp } from \"./FaustWebAudioDsp\";\nimport type { AudioParamDescriptor, AudioWorkletGlobalScope, LooseFaustDspFactory, FaustDspMeta, FaustUIItem, AudioWorkletProcessor } from \"./types\";\n\n/**\n * Injected in the string to be compiled on AudioWorkletProcessor side\n */\nexport interface FaustData {\n processorName: string;\n dspName: string;\n dspMeta: FaustDspMeta;\n poly: boolean;\n effectMeta?: FaustDspMeta;\n};\nexport interface FaustAudioWorkletProcessorDependencies<Poly extends boolean = false> {\n FaustBaseWebAudioDsp: typeof FaustBaseWebAudioDsp;\n FaustMonoWebAudioDsp: Poly extends true ? undefined : typeof FaustMonoWebAudioDsp;\n FaustPolyWebAudioDsp: Poly extends true ? typeof FaustPolyWebAudioDsp : undefined;\n FaustWebAudioDspVoice: Poly extends true ? typeof FaustWebAudioDspVoice : undefined;\n FaustWasmInstantiator: typeof FaustWasmInstantiator;\n}\nexport interface FaustAudioWorkletNodeOptions<Poly extends boolean = false> extends AudioWorkletNodeOptions {\n processorOptions: Poly extends true ? FaustPolyAudioWorkletProcessorOptions : FaustMonoAudioWorkletProcessorOptions;\n}\nexport interface FaustMonoAudioWorkletNodeOptions extends AudioWorkletNodeOptions {\n processorOptions: FaustMonoAudioWorkletProcessorOptions;\n}\nexport interface FaustPolyAudioWorkletNodeOptions extends AudioWorkletNodeOptions {\n processorOptions: FaustPolyAudioWorkletProcessorOptions;\n}\nexport interface FaustAudioWorkletProcessorOptions {\n name: string;\n sampleSize: number;\n}\nexport interface FaustMonoAudioWorkletProcessorOptions extends FaustAudioWorkletProcessorOptions {\n factory: LooseFaustDspFactory;\n}\nexport interface FaustPolyAudioWorkletProcessorOptions extends FaustAudioWorkletProcessorOptions {\n voiceFactory: LooseFaustDspFactory;\n mixerModule: WebAssembly.Module;\n voices: number;\n effectFactory?: LooseFaustDspFactory;\n}\n\n// Dynamic AudioWorkletProcessor code generator\nconst getFaustAudioWorkletProcessor = <Poly extends boolean = false>(dependencies: FaustAudioWorkletProcessorDependencies<Poly>, faustData: FaustData, register = true): typeof AudioWorkletProcessor => {\n const { registerProcessor, AudioWorkletProcessor, sampleRate } = globalThis as unknown as AudioWorkletGlobalScope;\n\n const {\n FaustBaseWebAudioDsp,\n FaustWasmInstantiator\n } = dependencies;\n\n const {\n processorName,\n dspName,\n dspMeta,\n effectMeta,\n poly\n } = faustData;\n\n // Analyse voice JSON to generate AudioParam parameters\n const analysePolyParameters = (item: FaustUIItem): AudioParamDescriptor | null => {\n const polyKeywords = [\"/gate\", \"/freq\", \"/gain\", \"/key\", \"/vel\", \"/velocity\"];\n const isPolyReserved = \"address\" in item && !!polyKeywords.find(k => item.address.endsWith(k));\n if (poly && isPolyReserved) return null;\n if (item.type === \"vslider\" || item.type === \"hslider\" || item.type === \"nentry\") {\n return { name: item.address, defaultValue: item.init || 0, minValue: item.min || 0, maxValue: item.max || 0 };\n } else if (item.type === \"button\" || item.type === \"checkbox\") {\n return { name: item.address, defaultValue: item.init || 0, minValue: 0, maxValue: 1 };\n }\n return null;\n }\n\n /**\n * Base class for Monophonic and Polyphonic AudioWorkletProcessor\n */\n class FaustAudioWorkletProcessor<Poly extends boolean = false> extends AudioWorkletProcessor {\n\n // Use ! syntax when the field is not defined in the constructor\n protected fDSPCode!: Poly extends true ? FaustPolyWebAudioDsp : FaustMonoWebAudioDsp;\n\n protected paramValuesCache: Record<string, number> = {};\n\n constructor(options: FaustAudioWorkletNodeOptions<Poly>) {\n super(options);\n\n // Setup port message handling\n this.port.onmessage = (e: MessageEvent) => this.handleMessageAux(e);\n\n const { parameterDescriptors } = (this.constructor as typeof AudioWorkletProcessor);\n parameterDescriptors.forEach((pd) => {\n this.paramValuesCache[pd.name] = pd.defaultValue || 0;\n })\n }\n\n static get parameterDescriptors() {\n const params = [] as AudioParamDescriptor[];\n // Analyse voice JSON to generate AudioParam parameters\n const callback = (item: FaustUIItem) => {\n const param = analysePolyParameters(item);\n if (param) params.push(param);\n }\n FaustBaseWebAudioDsp.parseUI(dspMeta.ui, callback);\n // Analyse effect JSON to generate AudioParam parameters\n if (effectMeta) FaustBaseWebAudioDsp.parseUI(effectMeta.ui, callback);\n return params;\n }\n\n process(inputs: Float32Array[][], outputs: Float32Array[][], parameters: { [key: string]: Float32Array }) {\n\n // Update controls (possibly needed for sample accurate control)\n for (const path in parameters) {\n const [paramValue] = parameters[path];\n if (paramValue !== this.paramValuesCache[path]) {\n this.fDSPCode.setParamValue(path, paramValue);\n this.paramValuesCache[path] = paramValue;\n }\n }\n\n return this.fDSPCode.compute(inputs[0], outputs[0]);\n }\n\n protected handleMessageAux(e: MessageEvent) { // use arrow function for binding\n const msg = e.data;\n\n switch (msg.type) {\n // Generic MIDI message\n case \"midi\": this.midiMessage(msg.data); break;\n // Typed MIDI message\n case \"ctrlChange\": this.ctrlChange(msg.data[0], msg.data[1], msg.data[2]); break;\n case \"pitchWheel\": this.pitchWheel(msg.data[0], msg.data[1]); break;\n // Generic data message\n case \"param\": this.setParamValue(msg.data.path, msg.data.value); break;\n // Plot handler set on demand\n case \"setPlotHandler\": {\n if (msg.data) {\n this.fDSPCode.setPlotHandler((output, index, events) => this.port.postMessage({ type: \"plot\", value: output, index, events }));\n } else {\n this.fDSPCode.setPlotHandler(null);\n }\n break;\n }\n case \"start\": {\n this.fDSPCode.start();\n break;\n }\n case \"stop\": {\n this.fDSPCode.stop();\n break;\n }\n case \"destroy\": {\n this.port.close();\n this.fDSPCode.destroy();\n break;\n }\n default:\n break;\n }\n }\n\n protected setParamValue(path: string, value: number) {\n this.fDSPCode.setParamValue(path, value);\n this.paramValuesCache[path] = value;\n }\n\n protected midiMessage(data: number[] | Uint8Array) {\n this.fDSPCode.midiMessage(data);\n }\n\n protected ctrlChange(channel: number, ctrl: number, value: number) {\n this.fDSPCode.ctrlChange(channel, ctrl, value);\n }\n\n protected pitchWheel(channel: number, wheel: number) {\n this.fDSPCode.pitchWheel(channel, wheel);\n }\n }\n\n /**\n * Monophonic AudioWorkletProcessor\n */\n class FaustMonoAudioWorkletProcessor extends FaustAudioWorkletProcessor<false> {\n\n constructor(options: FaustAudioWorkletNodeOptions) {\n super(options);\n const { FaustMonoWebAudioDsp } = dependencies as FaustAudioWorkletProcessorDependencies<false>;\n const { factory, sampleSize } = options.processorOptions;\n\n const instance = FaustWasmInstantiator.createSyncMonoDSPInstance(factory);\n\n // Create Monophonic DSP\n this.fDSPCode = new FaustMonoWebAudioDsp(instance, sampleRate, sampleSize, 128);\n\n // Check for soundfile support\n if (this.fDSPCode.hasSoundfiles()) {\n console.error(\"FaustAudioWorkletProcessor: Soundfile support is not implemented yet, switch to ScriptProcessorNode for now\");\n return;\n }\n\n // Setup output handler\n this.fDSPCode.setOutputParamHandler((path, value) => this.port.postMessage({ path, value, type: \"param\" }));\n\n this.fDSPCode.start();\n }\n }\n\n /**\n * Polyphonic AudioWorkletProcessor\n */\n class FaustPolyAudioWorkletProcessor extends FaustAudioWorkletProcessor<true> {\n\n constructor(options: FaustPolyAudioWorkletNodeOptions) {\n super(options);\n const { FaustPolyWebAudioDsp } = dependencies as FaustAudioWorkletProcessorDependencies<true>;\n\n const { voiceFactory, mixerModule, voices, effectFactory, sampleSize } = options.processorOptions;\n\n const instance = FaustWasmInstantiator.createSyncPolyDSPInstance(voiceFactory, mixerModule, voices, effectFactory);\n\n // Create Polyphonic DSP\n this.fDSPCode = new FaustPolyWebAudioDsp(instance, sampleRate, sampleSize, 128);\n\n // Check for soundfile support\n if (this.fDSPCode.hasSoundfiles()) {\n console.error(\"FaustAudioWorkletProcessor: Soundfile support is not implemented yet, switch to ScriptProcessorNode for now\");\n return;\n }\n\n // Setup port message handling\n this.port.onmessage = (e: MessageEvent) => this.handleMessageAux(e);\n\n // Setup output handler\n this.fDSPCode.setOutputParamHandler((path, value) => this.port.postMessage({ path, value, type: \"param\" }));\n\n this.fDSPCode.start();\n }\n\n protected midiMessage(data: number[] | Uint8Array) {\n const cmd = data[0] >> 4;\n const channel = data[0] & 0xf;\n const data1 = data[1];\n const data2 = data[2];\n if (cmd === 8 || (cmd === 9 && data2 === 0)) this.keyOff(channel, data1, data2);\n else if (cmd === 9) this.keyOn(channel, data1, data2);\n else super.midiMessage(data);\n }\n\n protected handleMessageAux = (e: MessageEvent) => { // use arrow function for binding\n const msg = e.data;\n switch (msg.type) {\n case \"keyOn\": this.keyOn(msg.data[0], msg.data[1], msg.data[2]); break;\n case \"keyOff\": this.keyOff(msg.data[0], msg.data[1], msg.data[2]); break;\n default:\n super.handleMessageAux(e);\n break;\n }\n }\n\n // Public API\n keyOn(channel: number, pitch: number, velocity: number) {\n this.fDSPCode.keyOn(channel, pitch, velocity);\n }\n\n keyOff(channel: number, pitch: number, velocity: number) {\n this.fDSPCode.keyOff(channel, pitch, velocity);\n }\n\n allNotesOff(hard: boolean) {\n this.fDSPCode.allNotesOff(hard);\n }\n }\n\n const Processor = poly ? FaustPolyAudioWorkletProcessor : FaustMonoAudioWorkletProcessor;\n if (register) {\n try {\n registerProcessor(processorName || dspName || (poly ? \"mydsp_poly\" : \"mydsp\"), Processor);\n } catch (error) {\n console.warn(error);\n }\n }\n\n return poly ? FaustPolyAudioWorkletProcessor : FaustMonoAudioWorkletProcessor;\n}\n\nexport default getFaustAudioWorkletProcessor;\n", "import type { FaustMonoDspInstance } from \"./FaustDspInstance\";\r\nimport type FaustWasmInstantiator from \"./FaustWasmInstantiator\";\r\nimport type { FaustBaseWebAudioDsp, FaustMonoWebAudioDsp, PlotHandler } from \"./FaustWebAudioDsp\";\r\nimport type { AudioParamDescriptor, AudioWorkletGlobalScope, LooseFaustDspFactory, FaustDspMeta, FaustUIItem, InterfaceFFT, TWindowFunction, Writeable, TypedArray, FFTUtils } from \"./types\";\r\n\r\nexport interface FaustFFTOptionsData {\r\n fftSize: number;\r\n fftOverlap: number;\r\n noIFFT: boolean;\r\n /** Index number of the default window function, leave undefined or -1 for rectangular (no windowing) */\r\n defaultWindowFunction: number;\r\n}\r\n\r\n/**\r\n * Injected in the string to be compiled on AudioWorkletProcessor side\r\n */\r\nexport interface FaustFFTData {\r\n processorName: string;\r\n dspName: string;\r\n dspMeta: FaustDspMeta;\r\n fftOptions?: Partial<FaustFFTOptionsData>;\r\n};\r\nexport interface FaustFFTAudioWorkletProcessorDependencies {\r\n FaustBaseWebAudioDsp: typeof FaustBaseWebAudioDsp;\r\n FaustMonoWebAudioDsp: typeof FaustMonoWebAudioDsp;\r\n FaustWasmInstantiator: typeof FaustWasmInstantiator;\r\n FFTUtils: typeof FFTUtils;\r\n}\r\nexport interface FaustFFTAudioWorkletNodeOptions extends AudioWorkletNodeOptions {\r\n processorOptions: FaustFFTAudioWorkletProcessorOptions;\r\n}\r\nexport interface FaustFFTAudioWorkletProcessorOptions {\r\n name: string;\r\n sampleSize: number;\r\n factory: LooseFaustDspFactory;\r\n}\r\n\r\n\r\n// Dynamic AudioWorkletProcessor code generator\r\nconst getFaustFFTAudioWorkletProcessor = (dependencies: FaustFFTAudioWorkletProcessorDependencies, faustData: FaustFFTData, register = true): typeof AudioWorkletProcessor => {\r\n const { registerProcessor, AudioWorkletProcessor, sampleRate } = globalThis as unknown as AudioWorkletGlobalScope;\r\n\r\n const {\r\n FaustBaseWebAudioDsp,\r\n FaustWasmInstantiator,\r\n FaustMonoWebAudioDsp,\r\n FFTUtils\r\n } = dependencies;\r\n \r\n const {\r\n processorName,\r\n dspName,\r\n dspMeta,\r\n fftOptions\r\n } = faustData;\r\n\r\n const {\r\n windowFunctions,\r\n getFFT,\r\n fftToSignal,\r\n signalToFFT,\r\n signalToNoFFT\r\n } = FFTUtils;\r\n\r\n /**\r\n * Ceil a number to multiple of another\r\n */\r\n const ceil = (x: number, to: number): number => (Math.abs(to) < 1 ? Math.ceil(x * (1 / to)) / (1 / to) : Math.ceil(x / to) * to);\r\n\r\n /**\r\n * Mod support wrapping with negative numbers\r\n */\r\n const mod = (x: number, y: number): number => (x % y + y) % y;\r\n\r\n const apply = (array: Writeable<ArrayLike<number>>, windowFunction: TWindowFunction) => {\r\n for (let i = 0; i < array.length; i++) {\r\n array[i] *= windowFunction(i, array.length);\r\n }\r\n };\r\n\r\n const fftParamKeywords = [\"/fftSize\", \"/fftHopSize\", \"/fftOverlap\", \"/windowFunction\", \"/noIFFT\"];\r\n\r\n /**\r\n * Copy buffer to another, support negative offset index\r\n */\r\n const setTypedArray = <T extends TypedArray = TypedArray>(to: T, from: T, offsetTo = 0, offsetFrom = 0) => {\r\n const toLength = to.length;\r\n const fromLength = from.length;\r\n const spillLength = Math.min(toLength, fromLength);\r\n let spilled = 0;\r\n let $to = mod(offsetTo, toLength) || 0;\r\n let $from = mod(offsetFrom, fromLength) || 0;\r\n while (spilled < spillLength) {\r\n const $spillLength = Math.min(spillLength - spilled, toLength - $to, fromLength - $from);\r\n const $fromEnd = $from + $spillLength;\r\n if ($from === 0 && $fromEnd === fromLength) to.set(from, $to);\r\n else to.set(from.subarray($from, $fromEnd), $to);\r\n $to = ($to + $spillLength) % toLength;\r\n $from = $fromEnd % fromLength;\r\n spilled += $spillLength;\r\n }\r\n return $to;\r\n };\r\n\r\n // Analyse JSON to generate AudioParam parameters\r\n const analyseParameters = (item: FaustUIItem): AudioParamDescriptor | null => {\r\n const isFFTReserved = \"address\" in item && !!fftParamKeywords.find(k => item.address.endsWith(k));\r\n if (isFFTReserved) return null;\r\n if (item.type === \"vslider\" || item.type === \"hslider\" || item.type === \"nentry\") {\r\n return { name: item.address, defaultValue: item.init || 0, minValue: item.min || 0, maxValue: item.max || 0 };\r\n } else if (item.type === \"button\" || item.type === \"checkbox\") {\r\n return { name: item.address, defaultValue: item.init || 0, minValue: 0, maxValue: 1 };\r\n }\r\n return null;\r\n }\r\n /**\r\n * Class for Faust FFT AudioWorkletProcessor\r\n */\r\n class FaustFFTAudioWorkletProcessor extends AudioWorkletProcessor {\r\n\r\n protected fDSPCode: FaustMonoWebAudioDsp;\r\n\r\n protected paramValuesCache: Record<string, number> = {};\r\n\r\n private dspInstance!: FaustMonoDspInstance;\r\n private sampleSize!: number;\r\n\r\n private destroyed = false;\r\n /** Pointer of next start sample to write of the FFT input window */\r\n private $inputWrite = 0;\r\n /** Pointer of next start sample to read of the FFT input window */\r\n private $inputRead = 0;\r\n /** Pointer of next start sample to write of the FFT output window */\r\n private $outputWrite = 0;\r\n /** Pointer of next start sample to read of the FFT output window */\r\n private $outputRead = 0;\r\n /** Not perform in IFFT when reconstruct the audio signal */\r\n private noIFFT = false;\r\n /** audio data from input, array of channels */\r\n private readonly fftInput: Float32Array[] = [];\r\n /** audio data for output, array of channels */\r\n private readonly fftOutput: Float32Array[] = [];\r\n /** Generated from the current window function */\r\n private window: Float32Array;\r\n /** Generated from the current window's rolling sum square */\r\n private windowSumSquare: Float32Array;\r\n \r\n /** FFT constructor */\r\n private FFT: typeof InterfaceFFT;\r\n /** Real FFT interface */\r\n private rfft: InterfaceFFT;\r\n /** Faust param name of fftHopSize */\r\n private fftHopSizeParam: string | undefined;\r\n /** FFT Overlaps, 1 means no overlap */\r\n private fftOverlap = 0;\r\n private fftHopSize = 0;\r\n private fftSize = 0;\r\n private fftBufferSize = 0;\r\n private fftProcessorZeros: Float32Array;\r\n private noIFFTBuffer: Float32Array;\r\n\r\n private fPlotHandler: PlotHandler | null = null;\r\n private fCachedEvents: { type: string; data: any }[] = [];\r\n private fBufferNum = 0;\r\n get fftProcessorBufferSize() {\r\n return this.fftSize / 2 + 1;\r\n }\r\n private windowFunction: TWindowFunction | null = null;\r\n\r\n constructor(options: FaustFFTAudioWorkletNodeOptions) {\r\n super(options);\r\n\r\n // Setup port message handling\r\n this.port.onmessage = (e: MessageEvent) => this.handleMessageAux(e);\r\n \r\n const { parameterDescriptors } = (this.constructor as typeof AudioWorkletProcessor);\r\n parameterDescriptors.forEach((pd) => {\r\n this.paramValuesCache[pd.name] = pd.defaultValue || 0;\r\n })\r\n\r\n const { factory, sampleSize } = options.processorOptions;\r\n\r\n this.dspInstance = FaustWasmInstantiator.createSyncMonoDSPInstance(factory);\r\n this.sampleSize = sampleSize;\r\n\r\n // Init the FFT constructor and the Faust FFT Processor\r\n this.initFFT();\r\n }\r\n\r\n async initFFT(): Promise<true> {\r\n // Use injected function to instantiate the FFT constructor\r\n this.FFT = await getFFT();\r\n // Init Faust FFT Processor\r\n await this.createFFTProcessor();\r\n return true;\r\n }\r\n\r\n static get parameterDescriptors() {\r\n const params = [] as AudioParamDescriptor[];\r\n // Analyse voice JSON to generate AudioParam parameters\r\n const callback = (item: FaustUIItem) => {\r\n const param = analyseParameters(item);\r\n if (param) params.push(param);\r\n }\r\n FaustBaseWebAudioDsp.parseUI(dspMeta.ui, callback);\r\n // Add to Faust parameters, FFT specified parameters\r\n return [\r\n ...params,\r\n {\r\n defaultValue: fftOptions?.fftSize || 1024,\r\n maxValue: 2 ** 32,\r\n minValue: 2,\r\n name: \"fftSize\"\r\n }, {\r\n defaultValue: fftOptions?.fftOverlap || 2,\r\n maxValue: 32,\r\n minValue: 1,\r\n name: \"fftOverlap\"\r\n }, {\r\n defaultValue: typeof fftOptions?.defaultWindowFunction === \"number\" ? fftOptions.defaultWindowFunction + 1 : 0,\r\n maxValue: windowFunctions?.length || 0,\r\n minValue: 0,\r\n name: \"windowFunction\"\r\n }, {\r\n defaultValue: +!!fftOptions?.noIFFT || 0,\r\n maxValue: 1,\r\n minValue: 0,\r\n name: \"noIFFT\"\r\n }\r\n ];\r\n }\r\n\r\n processFFT() {\r\n // Get the number of samples that need to proceed, from the input r/w pointers\r\n let samplesForFFT = mod(this.$inputWrite - this.$inputRead, this.fftBufferSize) || this.fftBufferSize;\r\n // Start process, until no more enough samples\r\n while (samplesForFFT >= this.fftSize) {\r\n let fftProcessorOutputs: Float32Array[] = [];\r\n // Faust processing, use a callback to avoid extra data copy\r\n this.fDSPCode.compute((inputs) => {\r\n // for each audio input channel, three Faust FFT input buffers can be generated (real, imag, FFT bin index)\r\n for (let i = 0; i < Math.min(this.fftInput.length, Math.ceil(inputs.length / 3)); i++) {\r\n // FFT forward, use a callback to avoid extra data copy\r\n const ffted = this.rfft.forward((fftBuffer) => {\r\n setTypedArray(fftBuffer, this.fftInput[i], 0, this.$inputRead);\r\n // Windowing the input\r\n for (let j = 0; j < fftBuffer.length; j++) {\r\n fftBuffer[j] *= this.window[j];\r\n }\r\n // data for FFT (fftBuffer) is prepared\r\n });\r\n // write FFTed spectral data to three Faust FFT input buffers (real, imag, FFT bin index)\r\n fftToSignal(ffted, inputs[i * 3], inputs[i * 3 + 1], inputs[i * 3 + 2]);\r\n // Faust inputs are prepared\r\n }\r\n // If the Faust DSP has more inputs, fill them (zeros or real/imag, fill FFT bin indexes)\r\n for (let i = this.fftInput.length * 3; i < inputs.length; i++) {\r\n if (i % 3 === 2) inputs[i].forEach((v, j) => inputs[i][j] = j);\r\n else inputs[i].fill(0);\r\n }\r\n }, (outputs) => {\r\n // Get the Faust DSP outputs\r\n fftProcessorOutputs = outputs as Float32Array[];\r\n });\r\n\r\n // Advance FFT input read pointers\r\n this.$inputRead += this.fftHopSize;\r\n this.$inputRead %= this.fftBufferSize;\r\n\r\n samplesForFFT -= this.fftHopSize;\r\n\r\n // Do inverse FFT on the processed data by Faust DSP, and write the reconstructed signal to the output buffer\r\n for (let i = 0; i < this.fftOutput.length; i++) {\r\n let iffted: Float32Array;\r\n // If noIFFT option in enabled, then no need to do inverse IFFT, use the injected function to convert\r\n if (this.noIFFT) {\r\n iffted = this.noIFFTBuffer;\r\n signalToNoFFT(fftProcessorOutputs[i * 2] || this.fftProcessorZeros, fftProcessorOutputs[i * 2 + 1] || this.fftProcessorZeros, iffted);\r\n } else {\r\n // FFT inverse, use a callback to avoid extra data copy\r\n iffted = this.rfft.inverse((ifftBuffer) => {\r\n // Convert the Faust DSP output (real/imag plans) to an array for inverse FFT\r\n signalToFFT(fftProcessorOutputs[i * 2] || this.fftProcessorZeros, fftProcessorOutputs[i * 2 + 1] || this.fftProcessorZeros, ifftBuffer);\r\n // ifftBuffer is prepared\r\n });\r\n }\r\n // Windowing the output\r\n for (let j = 0; j < iffted.length; j++) {\r\n iffted[j] *= this.window[j];\r\n }\r\n // Overlap-add, preparing the windowSumSquare array for reverse the windowing effect when output the audio\r\n let $: number;\r\n // First part, add the part that is overlaped with the previous window\r\n for (let j = 0; j < iffted.length - this.fftHopSize; j++) {\r\n $ = mod(this.$outputWrite + j, this.fftBufferSize);\r\n this.fftOutput[i][$] += iffted[j];\r\n if (i === 0) this.windowSumSquare[$] += this.noIFFT ? this.window[j] : this.window[j] ** 2;\r\n }\r\n // Second part, write directly to the output buffer\r\n for (let j = iffted.length - this.fftHopSize; j < iffted.length; j++) {\r\n $ = mod(this.$outputWrite + j, this.fftBufferSize);\r\n this.fftOutput[i][$] = iffted[j];\r\n if (i === 0) this.windowSumSquare[$] = this.noIFFT ? this.window[j] : this.window[j] ** 2;\r\n }\r\n }\r\n // Advance FFT output write pointers\r\n this.$outputWrite += this.fftHopSize;\r\n this.$outputWrite %= this.fftBufferSize;\r\n }\r\n }\r\n\r\n process(inputs: Float32Array[][], outputs: Float32Array[][], parameters: { [key: string]: Float32Array }) {\r\n\r\n if (this.destroyed) return false;\r\n if (!this.FFT) return true;\r\n const input = inputs[0];\r\n const output = outputs[0];\r\n const inputChannels = input?.length || 0;\r\n const outputChannels = output?.length || 0;\r\n // if (input.length === 0) return true;\r\n \r\n const bufferSize = input?.length ? Math.max(...input.map(c => c.length)) || 128 : 128;\r\n \r\n // Reset FFT and related buffers if necessary (checks in the resetFFT method)\r\n this.noIFFT = !!parameters.noIFFT[0];\r\n this.resetFFT(~~parameters.fftSize[0], ~~parameters.fftOverlap[0], ~~parameters.windowFunction[0], inputChannels, outputChannels, bufferSize);\r\n \r\n if (!this.fDSPCode) return true;\r\n \r\n for (const path in parameters) {\r\n if (!!fftParamKeywords.find(k => `/${path}`.endsWith(k))) continue;\r\n const [paramValue] = parameters[path];\r\n if (paramValue !== this.paramValuesCache[path]) {\r\n this.fDSPCode.setParamValue(path, paramValue);\r\n this.paramValuesCache[path] = paramValue;\r\n }\r\n }\r\n\r\n // Write audio input into fftInput buffer, advance pointers\r\n if (input?.length) {\r\n let $inputWrite = 0;\r\n for (let i = 0; i < input.length; i++) {\r\n const inputWindow = this.fftInput[i];\r\n const channel = input[i].length ? input[i] : new Float32Array(bufferSize);\r\n $inputWrite = setTypedArray(inputWindow, channel, this.$inputWrite);\r\n }\r\n this.$inputWrite = $inputWrite;\r\n } else {\r\n this.$inputWrite += bufferSize;\r\n this.$inputWrite %= this.fftBufferSize;\r\n }\r\n \r\n // Do FFT if necessary\r\n this.processFFT();\r\n \r\n // Read from fftOutput buffer for audio output, applying windowSumSquare to reverse the doubled windowing effect\r\n for (let i = 0; i < output.length; i++) {\r\n setTypedArray(output[i], this.fftOutput[i], 0, this.$outputRead);\r\n // let a = 0;\r\n let div = 0;\r\n for (let j = 0; j < bufferSize; j++) {\r\n div = this.windowSumSquare[mod(this.$outputRead + j, this.fftBufferSize)];\r\n output[i][j] /= div < 1e-8 ? 1 : div;\r\n }\r\n }\r\n // Advance pointers\r\n this.$outputRead += bufferSize;\r\n this.$outputRead %= this.fftBufferSize;\r\n\r\n // plot\r\n if (this.fPlotHandler) {\r\n this.port.postMessage({ type: \"plot\", value: output, index: this.fBufferNum++, events: this.fCachedEvents });\r\n this.fCachedEvents = [];\r\n }\r\n return true;\r\n }\r\n\r\n protected handleMessageAux(e: MessageEvent) { // use arrow function for binding\r\n const msg = e.data;\r\n\r\n switch (msg.type) {\r\n // Generic MIDI message\r\n case \"midi\": this.midiMessage(msg.data); break;\r\n // Typed MIDI message\r\n case \"ctrlChange\": this.ctrlChange(msg.data[0], msg.data[1], msg.data[2]); break;\r\n case \"pitchWheel\": this.pitchWheel(msg.data[0], msg.data[1]); break;\r\n // Generic data message\r\n case \"param\": this.setParamValue(msg.data.path, msg.data.value); break;\r\n // Plot handler set on demand\r\n case \"setPlotHandler\": {\r\n if (msg.data) {\r\n this.fPlotHandler = (output, index, events) => {\r\n if (events) this.fCachedEvents.push(...events);\r\n };\r\n } else {\r\n this.fPlotHandler = null;\r\n }\r\n this.fDSPCode?.setPlotHandler(this.fPlotHandler);\r\n break;\r\n }\r\n case \"start\": {\r\n this.fDSPCode?.start();\r\n break;\r\n }\r\n case \"stop\": {\r\n this.fDSPCode?.stop();\r\n break;\r\n }\r\n case \"destroy\": {\r\n this.port.close();\r\n this.destroy();\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n protected setParamValue(path: string, value: number) {\r\n this.fDSPCode?.setParamValue(path, value);\r\n this.paramValuesCache[path] = value;\r\n }\r\n\r\n protected midiMessage(data: number[] | Uint8Array) {\r\n this.fDSPCode?.midiMessage(data);\r\n }\r\n\r\n protected ctrlChange(channel: number, ctrl: number, value: number) {\r\n this.fDSPCode?.ctrlChange(channel, ctrl, value);\r\n }\r\n\r\n protected pitchWheel(channel: number, wheel: number) {\r\n this.fDSPCode?.pitchWheel(channel, wheel);\r\n }\r\n\r\n resetFFT(sizeIn: number, overlapIn: number, windowFunctionIn: number, inputChannels: number, outputChannels: number, bufferSize: number) {\r\n const fftSize = ~~ceil(Math.max(2, sizeIn || 1024), 2);\r\n const fftOverlap = ~~Math.min(fftSize, Math.max(1, overlapIn));\r\n const fftHopSize = ~~Math.max(1, fftSize / fftOverlap);\r\n const latency = fftSize - Math.min(fftHopSize, bufferSize);\r\n let windowFunction: TWindowFunction | null = null;\r\n \r\n // set the window function from the injected list\r\n if (windowFunctionIn !== 0) {\r\n windowFunction = typeof windowFunctions === \"object\" ? windowFunctions[~~windowFunctionIn - 1] || null : null;\r\n }\r\n const fftSizeChanged = fftSize !== this.fftSize;\r\n\r\n const fftOverlapChanged = fftOverlap !== this.fftOverlap;\r\n // Reset FFT vars if the size is changed\r\n if (fftSizeChanged || fftOverlapChanged) {\r\n this.fftSize = fftSize;\r\n this.fftOverlap = fftOverlap;\r\n this.fftHopSize = fftHopSize;\r\n this.$inputWrite = 0;\r\n this.$inputRead = 0;\r\n this.$outputWrite = 0;\r\n this.$outputRead = -latency;\r\n this.fftBufferSize = Math.max(fftSize * 2 - this.fftHopSize, bufferSize * 2);\r\n if (!fftSizeChanged && this.fftHopSizeParam) this.fDSPCode?.setParamValue(this.fftHopSizeParam, this.fftHopSize);\r\n }\r\n\r\n // Reset the FFT interface and the Faust Processor\r\n if (fftSizeChanged) {\r\n this.rfft?.dispose();\r\n this.rfft = new this.FFT(fftSize);\r\n this.noIFFTBuffer = new Float32Array(this.fftSize);\r\n this.createFFTProcessor();\r\n }\r\n \r\n // Calculate a window from the window function, prepare the windowSumSquare buffer \r\n if (fftSizeChanged || fftOverlapChanged || windowFunction !== this.windowFunction) {\r\n this.windowFunction = windowFunction;\r\n this.window = new Float32Array(fftSize);\r\n this.window.fill(1);\r\n if (windowFunction) apply(this.window, windowFunction);\r\n this.windowSumSquare = new Float32Array(this.fftBufferSize);\r\n }\r\n\r\n // Reset FFT I/O buffers if necessary\r\n if (this.fftInput.length > inputChannels) {\r\n this.fftInput.splice(inputChannels);\r\n }\r\n if (this.fftOutput.length > outputChannels) {\r\n this.fftOutput.splice(outputChannels);\r\n }\r\n if (fftSizeChanged || fftOverlapChanged) {\r\n for (let i = 0; i < inputChannels; i++) {\r\n this.fftInput[i] = new Float32Array(this.fftBufferSize);\r\n }\r\n for (let i = 0; i < outputChannels; i++) {\r\n this.fftOutput[i] = new Float32Array(this.fftBufferSize);\r\n }\r\n } else {\r\n if (this.fftInput.length < inputChannels) {\r\n for (let i = this.fftInput.length; i < inputChannels; i++) {\r\n this.fftInput[i] = new Float32Array(this.fftBufferSize);\r\n }\r\n }\r\n if (this.fftOutput.length < outputChannels) {\r\n for (let i = this.fftOutput.length; i < outputChannels; i++) {\r\n this.fftOutput[i] = new Float32Array(this.fftBufferSize);\r\n }\r\n }\r\n }\r\n }\r\n async createFFTProcessor() {\r\n this.fDSPCode?.stop();\r\n this.fDSPCode?.destroy();\r\n\r\n // Create Monophonic DSP\r\n this.fDSPCode = new FaustMonoWebAudioDsp(this.dspInstance, sampleRate, this.sampleSize, this.fftProcessorBufferSize);\r\n\r\n // Setup output handler\r\n this.fDSPCode.setOutputParamHandler((path, value) => this.port.postMessage({ path, value, type: \"param\" }));\r\n this.fDSPCode.setPlotHandler(this.fPlotHandler);\r\n const params = this.fDSPCode.getParams();\r\n this.fDSPCode.start();\r\n // Write the cached parameters\r\n for (const path in this.paramValuesCache) {\r\n if (!!fftParamKeywords.find(k => `/${path}`.endsWith(k))) continue;\r\n this.fDSPCode.setParamValue(path, this.paramValuesCache[path])\r\n }\r\n // Write the FFT reverved parameters\r\n const fftSizeParam = params.find(s => s.endsWith(\"/fftSize\"));\r\n if (fftSizeParam) this.fDSPCode.setParamValue(fftSizeParam, this.fftSize);\r\n this.fftHopSizeParam = params.find(s => s.endsWith(\"/fftHopSize\"));\r\n if (this.fftHopSizeParam) this.fDSPCode.setParamValue(this.fftHopSizeParam, this.fftHopSize);\r\n // Prepare a array of zeros for furthur usage\r\n this.fftProcessorZeros = new Float32Array(this.fftProcessorBufferSize);\r\n }\r\n destroy() {\r\n this.fDSPCode?.stop();\r\n this.fDSPCode?.destroy();\r\n this.rfft?.dispose();\r\n this.destroyed = true;\r\n }\r\n\r\n }\r\n\r\n const Processor = FaustFFTAudioWorkletProcessor;\r\n if (register) {\r\n try {\r\n registerProcessor(processorName || dspName || \"myfftdsp\", Processor);\r\n } catch (error) {\r\n console.warn(error);\r\n }\r\n }\r\n\r\n return FaustFFTAudioWorkletProcessor;\r\n\r\n};\r\n\r\nexport default getFaustFFTAudioWorkletProcessor;\r\n", "import { Sha256 } from \"@aws-crypto/sha256-js\";\nimport type { ILibFaust } from \"./LibFaust\";\nimport type { FaustDspFactory, IntVector } from \"./types\";\n\nexport const ab2str = (buf: Uint8Array) => String.fromCharCode.apply(null, buf);\n\nexport const str2ab = (str: string) => {\n const buf = new ArrayBuffer(str.length);\n const bufView = new Uint8Array(buf);\n for (let i = 0, strLen = str.length; i < strLen; i++) {\n bufView[i] = str.charCodeAt(i);\n }\n return bufView;\n};\nconst sha256 = async (str: string) => {\n const sha256 = new Sha256();\n sha256.update(str);\n const hashArray = Array.from(await sha256.digest());\n const hashHex = hashArray.map(b => b.toString(16).padStart(2, \"0\")).join(\"\");\n return hashHex;\n};\n\nexport interface IFaustCompiler {\n /**\n * Gives the Faust compiler version.\n * @return a version string\n */\n version(): string;\n\n /**\n * Gives the last compilation error.\n * @return an error string\n */\n getErrorMessage(): string;\n\n /**\n * Create a wasm factory from Faust code i.e. wasm compiled code, to be used to create monophonic instances. \n * This function is running asynchronously.\n *\n * @param name - an arbitrary name for the Faust factory\n * @param code - Faust dsp code\n * @param args - the compiler options\n * @returns returns the wasm factory\n */\n createMonoDSPFactory(name: string, code: string, args: string): Promise<FaustDspFactory | null>;\n\n /**\n * Create a wasm factory from Faust code i.e. wasm compiled code, to be used to create polyphonic instances. \n * This function is running asynchronously.\n *\n * @param name - an arbitrary name for the Faust factory\n * @param code - Faust dsp code\n * @param args - the compiler options\n * @returns returns the wasm factory\n */\n createPolyDSPFactory(name: string, code: string, args: string): Promise<FaustDspFactory | null>;\n\n /**\n * Delete a dsp factory.\n *\n * @param factory - the factory to be deleted\n */\n deleteDSPFactory(factory: FaustDspFactory): void;\n\n /**\n * Expand Faust code i.e. linearize included libraries.\n *\n * @param code - Faust dsp code\n * @param args - the compiler options\n * @returns returns the expanded dsp code\n */\n expandDSP(code: string, args: string): string | null;\n\n /**\n * Generates auxiliary files from Faust code. The output depends on the compiler options.\n *\n * @param name - an arbitrary name for the Faust module\n * @param code - Faust dsp code\n * @param args - the compiler options\n * @returns whether the generation actually succeded\n */\n generateAuxFiles(name: string, code: string, args: string): boolean;\n\n /**\n * Delete all factories.\n */\n deleteAllDSPFactories(): void;\n\n fs(): typeof FS;\n\n getAsyncInternalMixerModule(isDouble?: boolean): Promise<{ mixerBuffer: Uint8Array; mixerModule: WebAssembly.Module }>;\n getSyncInternalMixerModule(isDouble?: boolean): { mixerBuffer: Uint8Array; mixerModule: WebAssembly.Module };\n}\n\nclass FaustCompiler implements IFaustCompiler {\n private fLibFaust: ILibFaust;\n private fErrorMessage: string;\n private static gFactories: Map<string, FaustDspFactory> = new Map<string, FaustDspFactory>();\n private mixer32Buffer!: Uint8Array;\n private mixer64Buffer!: Uint8Array;\n private mixer32Module!: WebAssembly.Module;\n private mixer64Module!: WebAssembly.Module;\n\n /**\n * Get a stringified DSP factories table\n */\n static serializeDSPFactories() {\n const table: Record<string, { code: string, json: any; poly: boolean }> = {};\n this.gFactories.forEach((factory, shaKey) => {\n const { code, json, poly } = factory;\n table[shaKey] = { code: btoa(ab2str(code)), json: JSON.parse(json), poly };\n });\n return table;\n }\n /**\n * Get a stringified DSP factories table as string\n */\n static stringifyDSPFactories() {\n return JSON.stringify(this.serializeDSPFactories());\n }\n /**\n * Import a DSP factories table\n */\n static deserializeDSPFactories(table: Record<string, { code: string, json: any; poly: boolean }>) {\n const awaited: Promise<Map<string, FaustDspFactory>>[] = [];\n for (const shaKey in table) {\n const factory = table[shaKey];\n const { code, json, poly } = factory;\n const ab = str2ab(atob(code))\n awaited.push(WebAssembly.compile(ab).then(module => this.gFactories.set(shaKey, { shaKey, cfactory: 0, code: ab, module, json: JSON.stringify(json), poly })));\n }\n return Promise.all(awaited);\n }\n /**\n * Import a stringified DSP factories table\n */\n static importDSPFactories(tableStr: string) {\n const table: Record<string, { code: string, json: any; poly: boolean }> = JSON.parse(tableStr);\n return this.deserializeDSPFactories(table);\n }\n constructor(libFaust: ILibFaust) {\n this.fLibFaust = libFaust;\n this.fErrorMessage = \"\";\n }\n private intVec2intArray(vec: IntVector) {\n const size = vec.size();\n const ui8Code = new Uint8Array(size);\n for (let i = 0; i < size; i++) {\n ui8Code[i] = vec.get(i);\n }\n return ui8Code;\n }\n private async createDSPFactory(name: string, code: string, args: string, poly: boolean) {\n // Cleanup the cache\n if (FaustCompiler.gFactories.size > 10) {\n FaustCompiler.gFactories.clear();\n }\n\n // If code is already compiled, return the cached factory\n let shaKey = await sha256(name + code + args + (poly ? \"poly\" : \"mono\"));\n if (FaustCompiler.gFactories.has(shaKey)) {\n return FaustCompiler.gFactories.get(shaKey) || null;\n } else {\n try {\n // Can possibly raise a C++ exception catched by the second catch()\n const faustDspWasm = this.fLibFaust.createDSPFactory(name, code, args, !poly);\n const ui8Code = this.intVec2intArray(faustDspWasm.data);\n faustDspWasm.data.delete();\n const module = await WebAssembly.compile(ui8Code);\n const factory: FaustDspFactory = { shaKey, cfactory: faustDspWasm.cfactory, code: ui8Code, module, json: faustDspWasm.json, poly };\n // Factory C++ side can be deallocated immediately\n this.deleteDSPFactory(factory);\n // Keep the compiled factory in the cache\n FaustCompiler.gFactories.set(shaKey, factory);\n return factory;\n } catch (e) {\n this.fErrorMessage = this.fLibFaust.getErrorAfterException();\n // console.error(`=> exception raised while running createDSPFactory: ${this.fErrorMessage}`, e);\n this.fLibFaust.cleanupAfterException();\n throw this.fErrorMessage ? new Error(this.fErrorMessage) : e;\n }\n }\n }\n version() {\n return this.fLibFaust.version();\n }\n getErrorMessage() {\n return this.fErrorMessage;\n }\n async createMonoDSPFactory(name: string, code: string, args: string) {\n return this.createDSPFactory(name, code, args, false);\n }\n async createPolyDSPFactory(name: string, code: string, args: string) {\n return this.createDSPFactory(name, code, args, true);\n }\n deleteDSPFactory(factory: FaustDspFactory) {\n this.fLibFaust.deleteDSPFactory(factory.cfactory);\n factory.cfactory = 0;\n }\n expandDSP(code: string, args: string) {\n try {\n return this.fLibFaust.expandDSP(\"FaustDSP\", code, args);\n } catch (e) {\n this.fErrorMessage = this.fLibFaust.getErrorAfterException();\n // console.error(`=> exception raised while running expandDSP: ${this.fErrorMessage}`);\n this.fLibFaust.cleanupAfterException();\n throw this.fErrorMessage ? new Error(this.fErrorMessage) : e;\n }\n }\n generateAuxFiles(name: string, code: string, args: string) {\n try {\n return this.fLibFaust.generateAuxFiles(name, code, args);\n } catch (e) {\n this.fErrorMessage = this.fLibFaust.getErrorAfterException();\n // console.error(`=> exception raised while running generateAuxFiles: ${this.fErrorMessage}`);\n this.fLibFaust.cleanupAfterException();\n throw this.fErrorMessage ? new Error(this.fErrorMessage) : e;\n }\n }\n deleteAllDSPFactories(): void {\n this.fLibFaust.deleteAllDSPFactories();\n }\n fs() {\n return this.fLibFaust.fs();\n }\n async getAsyncInternalMixerModule(isDouble = false) {\n const bufferKey = isDouble ? \"mixer64Buffer\" : \"mixer32Buffer\";\n const moduleKey = isDouble ? \"mixer64Module\" : \"mixer32Module\";\n if (this[moduleKey]) return { mixerBuffer: this[bufferKey], mixerModule: this[moduleKey] };\n const path = isDouble ? \"/usr/rsrc/mixer64.wasm\" : \"/usr/rsrc/mixer32.wasm\";\n const mixerBuffer = this.fs().readFile(path, { encoding: \"binary\" });\n this[bufferKey] = mixerBuffer;\n // Compile mixer\n const mixerModule = await WebAssembly.compile(mixerBuffer);\n this[moduleKey] = mixerModule;\n return { mixerBuffer, mixerModule };\n }\n getSyncInternalMixerModule(isDouble = false) {\n const bufferKey = isDouble ? \"mixer64Buffer\" : \"mixer32Buffer\";\n const moduleKey = isDouble ? \"mixer64Module\" : \"mixer32Module\";\n if (this[moduleKey]) return { mixerBuffer: this[bufferKey], mixerModule: this[moduleKey] };\n const path = isDouble ? \"/usr/rsrc/mixer64.wasm\" : \"/usr/rsrc/mixer32.wasm\";\n const mixerBuffer = this.fs().readFile(path, { encoding: \"binary\" });\n this[bufferKey] = mixerBuffer;\n // Compile mixer\n const mixerModule = new WebAssembly.Module(mixerBuffer);\n this[moduleKey] = mixerModule;\n return { mixerBuffer, mixerModule };\n }\n}\n\nexport default FaustCompiler;\n", "/**\n * The Faust wasm instance interface.\n */\nexport interface IFaustDspInstance {\n /**\n * The dsp computation, to be called with successive input/output audio buffers.\n *\n * @param $dsp - the DSP pointer\n * @param count - the audio buffer size in frames\n * @param $inputs - the input audio buffer as in index in wasm memory\n * @param $output - the output audio buffer as in index in wasm memory\n */\n compute($dsp: number, count: number, $inputs: number, $output: number): void;\n\n /**\n * Give the number of inputs of a Faust wasm instance.\n * \n * @param $dsp - the DSP pointer\n */\n getNumInputs($dsp: number): number;\n\n /**\n * Give the number of outputs of a Faust wasm instance.\n * \n * @param $dsp - the DSP pointer\n */\n getNumOutputs($dsp: number): number;\n\n /**\n * Give a parameter current value.\n * \n * @param $dsp - the DSP pointer\n * @param index - the parameter index\n * @preturn the parameter value\n */\n getParamValue($dsp: number, index: number): number;\n\n /**\n * Give the Faust wasm instance sample rate.\n * \n * @param $dsp - the DSP pointer\n * @preturn the sample rate\n */\n getSampleRate($dsp: number): number;\n\n /**\n * Global init, calls the following methods:\n * - static class 'classInit': static tables initialization\n * - 'instanceInit': constants and instance state initialization\n *\n * @param $dsp - the DSP pointer\n * @param sampleRate - the sampling rate in Hertz\n */\n init($dsp: number, sampleRate: number): void;\n\n /** Init instance state (delay lines...).\n * \n * @param $dsp - the DSP pointer\n */\n instanceClear($dsp: number): void;\n\n /** Init instance constant state.\n * \n * @param $dsp - the DSP pointer\n * @param sampleRate - the sampling rate in Hertz\n */\n instanceConstants($dsp: number, sampleRate: number): void;\n\n /** Init instance state.\n * \n * @param $dsp - the DSP pointer\n * @param sampleRate - the sampling rate in Hertz\n */\n instanceInit($dsp: number, sampleRate: number): void;\n\n /** Init default control parameters values.\n * \n * @param $dsp - the DSP pointer\n */\n instanceResetUserInterface($dsp: number): void;\n\n /**\n * Set a parameter current value.\n * \n * @param $dsp - the DSP pointer\n * @param index - the parameter index\n * @param value - the parameter value\n */\n setParamValue($dsp: number, index: number, value: number): void;\n}\n\n/**\n * Mixer used in polyphonic mode.\n */\nexport interface IFaustMixerInstance {\n clearOutput(bufferSize: number, chans: number, $outputs: number): void;\n mixCheckVoice(bufferSize: number, chans: number, $inputs: number, $outputs: number): number;\n fadeOut(bufferSize: number, chans: number, $outputs: number): void;\n}\n\n/**\n * Monophonic instance.\n */\nexport interface FaustMonoDspInstance {\n memory: WebAssembly.Memory;\n api: IFaustDspInstance;\n json: string;\n}\n\n/**\n * Polyphonic instance.\n */\nexport interface FaustPolyDspInstance {\n memory: WebAssembly.Memory;\n voices: number;\n voiceAPI: IFaustDspInstance;\n effectAPI?: IFaustDspInstance;\n mixerAPI: IFaustMixerInstance;\n voiceJSON: string;\n effectJSON?: string;\n}\n\nexport class FaustDspInstance implements IFaustDspInstance {\n private readonly fExports: IFaustDspInstance;\n\n constructor(exports: IFaustDspInstance) { this.fExports = exports; }\n\n compute($dsp: number, count: number, $input: number, $output: number) { this.fExports.compute($dsp, count, $input, $output); }\n getNumInputs($dsp: number) { return this.fExports.getNumInputs($dsp); }\n getNumOutputs($dsp: number) { return this.fExports.getNumOutputs($dsp); }\n getParamValue($dsp: number, index: number) { return this.fExports.getParamValue($dsp, index); }\n getSampleRate($dsp: number) { return this.fExports.getSampleRate($dsp); }\n init($dsp: number, sampleRate: number) { this.fExports.init($dsp, sampleRate); }\n instanceClear($dsp: number) { this.fExports.instanceClear($dsp); }\n instanceConstants($dsp: number, sampleRate: number) { this.fExports.instanceConstants($dsp, sampleRate); }\n instanceInit($dsp: number, sampleRate: number) { this.fExports.instanceInit($dsp, sampleRate); }\n instanceResetUserInterface($dsp: number) { this.fExports.instanceResetUserInterface($dsp); }\n setParamValue($dsp: number, index: number, value: number) { this.fExports.setParamValue($dsp, index, value); }\n}\n", "import { FaustDspInstance, FaustMonoDspInstance, FaustPolyDspInstance, IFaustDspInstance, IFaustMixerInstance } from \"./FaustDspInstance\";\nimport type { FaustDspFactory, FaustDspMeta, LooseFaustDspFactory } from \"./types\";\n\nclass FaustWasmInstantiator {\n private static createWasmImport(memory?: WebAssembly.Memory) {\n return {\n env: {\n memory: memory || new WebAssembly.Memory({ initial: 100 }),\n memoryBase: 0,\n tableBase: 0,\n // Integer version\n _abs: Math.abs,\n // Float version\n _acosf: Math.acos, _asinf: Math.asin, _atanf: Math.atan, _atan2f: Math.atan2,\n _ceilf: Math.ceil, _cosf: Math.cos, _expf: Math.exp, _floorf: Math.floor,\n _fmodf: (x: number, y: number) => x % y,\n _logf: Math.log, _log10f: Math.log10, _max_f: Math.max, _min_f: Math.min,\n _remainderf: (x: number, y: number) => x - Math.round(x / y) * y,\n _powf: Math.pow, _roundf: Math.round, _sinf: Math.sin, _sqrtf: Math.sqrt, _tanf: Math.tan,\n _acoshf: Math.acosh, _asinhf: Math.asinh, _atanhf: Math.atanh,\n _coshf: Math.cosh, _sinhf: Math.sinh, _tanhf: Math.tanh,\n _isnanf: Number.isNaN, _isinff: (x: number) => !isFinite(x),\n _copysignf: (x: number, y: number) => (Math.sign(x) === Math.sign(y) ? x : -x),\n\n // Double version\n _acos: Math.acos, _asin: Math.asin, _atan: Math.atan, _atan2: Math.atan2,\n _ceil: Math.ceil, _cos: Math.cos, _exp: Math.exp, _floor: Math.floor,\n _fmod: (x: number, y: number) => x % y,\n _log: Math.log, _log10: Math.log10, _max_: Math.max, _min_: Math.min,\n _remainder: (x: number, y: number) => x - Math.round(x / y) * y,\n _pow: Math.pow, _round: Math.round, _sin: Math.sin, _sqrt: Math.sqrt, _tan: Math.tan,\n _acosh: Math.acosh, _asinh: Math.asinh, _atanh: Math.atanh,\n _cosh: Math.cosh, _sinh: Math.sinh, _tanh: Math.tanh,\n _isnan: Number.isNaN, _isinf: (x: number) => !isFinite(x),\n _copysign: (x: number, y: number) => (Math.sign(x) === Math.sign(y) ? x : -x),\n\n table: new WebAssembly.Table({ initial: 0, element: \"anyfunc\" })\n }\n };\n }\n private static createWasmMemoryPoly(voicesIn: number, sampleSize: number, dspMeta: FaustDspMeta, effectMeta: FaustDspMeta, bufferSize: number) {\n // Hack : at least 4 voices (to avoid weird wasm memory bug?)\n const voices = Math.max(4, voicesIn);\n // Memory allocator\n const ptrSize = sampleSize; // Done on wast/wasm backend side\n const pow2limit = (x: number) => {\n let n = 65536; // Minimum = 64 kB\n while (n < x) { n *= 2; }\n return n;\n };\n const effectSize = effectMeta ? effectMeta.size : 0;\n let memorySize = pow2limit(\n effectSize\n + dspMeta.size * voices\n + (dspMeta.inputs + dspMeta.outputs * 2) // + 2 for effect\n * (ptrSize + bufferSize * sampleSize)\n ) / 65536;\n memorySize = Math.max(2, memorySize); // At least 2\n return new WebAssembly.Memory({ initial: memorySize });\n };\n\n private static createWasmMemoryMono(sampleSize: number, dspMeta: FaustDspMeta, bufferSize: number) {\n // Memory allocator\n const ptrSize = sampleSize; // Done on wast/wasm backend side\n const memorySize = (dspMeta.size + (dspMeta.inputs + dspMeta.outputs) * (ptrSize + bufferSize * sampleSize)) / 65536;\n return new WebAssembly.Memory({ initial: memorySize * 2 }); // Safer to have a bit more memory\n }\n\n private static createMonoDSPInstanceAux(instance: WebAssembly.Instance, json: string, mem: WebAssembly.Memory | null = null) {\n const functions = instance.exports as IFaustDspInstance & WebAssembly.Exports;\n const api = new FaustDspInstance(functions);\n const memory: any = (mem) ? mem : instance.exports.memory;\n return { memory, api, json } as FaustMonoDspInstance;\n }\n\n private static createMemoryMono(monoFactory: LooseFaustDspFactory) {\n // Parse JSON to get 'size' and 'inputs/outputs' infos\n const monoMeta: FaustDspMeta = JSON.parse(monoFactory.json);\n const sampleSize = monoMeta.compile_options.match(\"-double\") ? 8 : 4;\n return this.createWasmMemoryMono(sampleSize, monoMeta, 8192);\n\n }\n private static createMemoryPoly(voices: number, voiceFactory: LooseFaustDspFactory, effectFactory?: LooseFaustDspFactory) {\n // Parse JSON to get 'size' and 'inputs/outputs' infos\n const voiceMeta: FaustDspMeta = JSON.parse(voiceFactory.json);\n const effectMeta: FaustDspMeta = (effectFactory && effectFactory.json) ? JSON.parse(effectFactory.json) : null;\n const sampleSize = voiceMeta.compile_options.match(\"-double\") ? 8 : 4;\n // Memory will be shared by voice, mixer and (possibly) effect instances\n return this.createWasmMemoryPoly(voices, sampleSize, voiceMeta, effectMeta, 8192);\n }\n\n private static createMixerAux(mixerModule: WebAssembly.Module, memory: WebAssembly.Memory) {\n // Create mixer instance\n const mixerImport = {\n imports: { print: console.log },\n memory: { memory }\n };\n const mixerInstance = new WebAssembly.Instance(mixerModule, mixerImport);\n const mixerFunctions = mixerInstance.exports as IFaustMixerInstance & WebAssembly.Exports;\n return mixerFunctions;\n }\n\n // Public API\n static async loadDSPFactory(wasmPath: string, jsonPath: string) {\n const wasmFile = await fetch(wasmPath);\n if (!wasmFile.ok) {\n throw new Error(`=> exception raised while running loadDSPFactory, file not found: ${wasmPath}`);\n }\n try {\n const wasmBuffer = await wasmFile.arrayBuffer();\n const module = await WebAssembly.compile(wasmBuffer);\n const jsonFile = await fetch(jsonPath);\n const json = await jsonFile.text();\n const meta: FaustDspMeta = JSON.parse(json);\n const cOptions = meta.compile_options;\n const poly = cOptions.indexOf('wasm-e') !== -1;\n return { cfactory: 0, code: new Uint8Array(wasmBuffer), module, json, poly } as FaustDspFactory;\n } catch (e) {\n // console.error(`=> exception raised while running loadDSPFactory: ${e}`);\n throw e;\n }\n }\n\n static async loadDSPMixer(mixerPath: string, fs?: typeof FS) {\n try {\n let mixerBuffer = null;\n if (fs) {\n mixerBuffer = fs.readFile(mixerPath, { encoding: \"binary\" });\n } else {\n const mixerFile = await fetch(mixerPath);\n mixerBuffer = await mixerFile.arrayBuffer();\n }\n // Compile mixer\n return WebAssembly.compile(mixerBuffer);\n } catch (e) {\n // console.error(`=> exception raised while running loadMixer: ${e}`);\n throw e;\n }\n }\n\n static async createAsyncMonoDSPInstance(factory: LooseFaustDspFactory) {\n const parsedJson = JSON.parse(factory.json);\n // If the JSON contains a soundfile UI element, we need to create a memory object\n if (Array.isArray(parsedJson.ui) && parsedJson.ui.some((group: { items: any[]; }) => group.items?.some(item => item.type === \"soundfile\"))) {\n const memory = this.createMemoryMono(factory);\n const instance = await WebAssembly.instantiate(factory.module, this.createWasmImport(memory));\n return this.createMonoDSPInstanceAux(instance, factory.json, memory);\n } else {\n // Otherwise, we can create the instance using the wasm internal memory allocated by the wasm module\n const instance = await WebAssembly.instantiate(factory.module, this.createWasmImport());\n return this.createMonoDSPInstanceAux(instance, factory.json);\n }\n }\n\n static createSyncMonoDSPInstance(factory: LooseFaustDspFactory) {\n const parsedJson = JSON.parse(factory.json);\n // If the JSON contains a soundfile UI element, we need to create a memory object\n if (Array.isArray(parsedJson.ui) && parsedJson.ui.some((group: { items: any[]; }) => group.items?.some(item => item.type === \"soundfile\"))) {\n const memory = this.createMemoryMono(factory);\n const instance = new WebAssembly.Instance(factory.module, this.createWasmImport(memory));\n return this.createMonoDSPInstanceAux(instance, factory.json, memory);\n } else {\n // Otherwise, we can create the instance using the wasm internal memory allocated by the wasm module\n const instance = new WebAssembly.Instance(factory.module, this.createWasmImport());\n return this.createMonoDSPInstanceAux(instance, factory.json);\n }\n }\n\n static async createAsyncPolyDSPInstance(voiceFactory: LooseFaustDspFactory, mixerModule: WebAssembly.Module, voices: number, effectFactory?: LooseFaustDspFactory): Promise<FaustPolyDspInstance> {\n const memory = this.createMemoryPoly(voices, voiceFactory, effectFactory);\n // Create voice \n const voiceInstance = await WebAssembly.instantiate(voiceFactory.module, this.createWasmImport(memory));\n const voiceFunctions = voiceInstance.exports as IFaustDspInstance & WebAssembly.Exports;\n const voiceAPI = new FaustDspInstance(voiceFunctions);\n // Create mixer\n const mixerAPI = this.createMixerAux(mixerModule, memory);\n\n // Possibly create effect instance \n if (effectFactory) {\n const effectInstance = await WebAssembly.instantiate(effectFactory.module, this.createWasmImport(memory));\n const effectFunctions = effectInstance.exports as IFaustDspInstance & WebAssembly.Exports;\n const effectAPI = new FaustDspInstance(effectFunctions);\n return {\n memory,\n voices,\n voiceAPI,\n effectAPI,\n mixerAPI,\n voiceJSON: voiceFactory.json,\n effectJSON: effectFactory.json\n } as FaustPolyDspInstance;\n } else {\n return {\n memory,\n voices,\n voiceAPI,\n mixerAPI,\n voiceJSON: voiceFactory.json\n } as FaustPolyDspInstance;\n }\n }\n\n static createSyncPolyDSPInstance(voiceFactory: LooseFaustDspFactory, mixerModule: WebAssembly.Module, voices: number, effectFactory?: LooseFaustDspFactory): FaustPolyDspInstance {\n const memory = this.createMemoryPoly(voices, voiceFactory, effectFactory);\n // Create voice \n const voiceInstance = new WebAssembly.Instance(voiceFactory.module, this.createWasmImport(memory));\n const voiceFunctions = voiceInstance.exports as IFaustDspInstance & WebAssembly.Exports;\n const voiceAPI = new FaustDspInstance(voiceFunctions);\n // Create mixer\n const mixerAPI = this.createMixerAux(mixerModule, memory);\n\n // Possibly create effect instance \n if (effectFactory) {\n const effectInstance = new WebAssembly.Instance(effectFactory.module, this.createWasmImport(memory));\n const effectFunctions = effectInstance.exports as IFaustDspInstance & WebAssembly.Exports;\n const effectAPI = new FaustDspInstance(effectFunctions);\n return {\n memory,\n voices,\n voiceAPI,\n effectAPI,\n mixerAPI,\n voiceJSON: voiceFactory.json,\n effectJSON: effectFactory.json\n } as FaustPolyDspInstance;\n } else {\n return {\n memory,\n voices,\n voiceAPI,\n mixerAPI,\n voiceJSON: voiceFactory.json\n } as FaustPolyDspInstance;\n }\n }\n}\n\nexport default FaustWasmInstantiator;\n", "import type { FaustMonoDspInstance, FaustPolyDspInstance, IFaustDspInstance } from \"./FaustDspInstance\";\nimport type { FaustDspMeta, FaustUIDescriptor, FaustUIGroup, FaustUIInputItem, FaustUIItem } from \"./types\";\n\n// Public API\nexport type OutputParamHandler = (path: string, value: number) => void;\nexport type ComputeHandler = (buffer_size: number) => void;\nexport type PlotHandler = (plotted: Float32Array[] | Float64Array[], index: number, events?: { type: string; data: any }[]) => void;\nexport type MetadataHandler = (key: string, value: string) => void;\n\n// Implementation API\nexport type UIHandler = (item: FaustUIItem) => void;\n\n/**\n * WasmAllocator is a basic memory management class designed to allocate\n * blocks of memory within a WebAssembly.Memory object. It provides a simple\n * alloc method to allocate a contiguous block of memory of a specified size.\n * \n * The allocator operates by keeping a linear progression through the memory,\n * always allocating the next block at the end of the last. This approach does not\n * handle freeing of memory or reuse of memory spaces.\n */\nclass WasmAllocator {\n // The WebAssembly.Memory object this allocator will manage.\n private readonly memory: WebAssembly.Memory;\n // The number of bytes currently allocated. This serves as the \"pointer\" to the\n // next free byte in the memory.\n private allocatedBytes: number;\n\n constructor(memory: WebAssembly.Memory, offset: number) {\n this.memory = memory;\n // Initialize the allocator with offset allocated bytes.\n this.allocatedBytes = offset;\n }\n\n /**\n * Allocates a block of memory of the specified size, returning the pointer to the\n * beginning of the block. The block is allocated at the current offset and the\n * offset is incremented by the size of the block.\n * \n * @param sizeInBytes The size of the block to allocate in bytes.\n * @returns The offset (pointer) to the beginning of the allocated block.\n */\n alloc(sizeInBytes: number): number {\n // Store the current offset as the start of the new block.\n const currentOffset = this.allocatedBytes;\n // Calculate the new offset after allocating the requested block.\n const newOffset = currentOffset + sizeInBytes;\n // Get the total size of the WebAssembly memory in bytes.\n const totalMemoryBytes = this.memory.buffer.byteLength;\n\n // If the new offset exceeds the total size of the memory, grow the memory.\n if (newOffset > totalMemoryBytes) {\n // Calculate the number of WebAssembly pages needed to fit the new allocation.\n // WebAssembly memory pages are 64KiB each.\n const neededPages = Math.ceil((newOffset - totalMemoryBytes) / 65536);\n // Grow the memory by the required number of pages.\n console.log(`GROW: ${neededPages} pages`);\n this.memory.grow(neededPages);\n }\n\n // Update the allocated bytes to the new offset.\n this.allocatedBytes = newOffset;\n // Return the offset at which the allocated block starts.\n return currentOffset;\n }\n\n /**\n * Returns the underlying buffer object.\n * \n * @returns The buffer object.\n */\n getBuffer(): ArrayBuffer {\n return this.memory.buffer;\n }\n\n /**\n * Returns the Int32 view of the underlying buffer object.\n * \n * @returns The view of the memory buffer as Int32Array.\n */\n getInt32Array(): Int32Array {\n return new Int32Array(this.memory.buffer);\n }\n\n /**\n * Returns the Float32 view of the underlying buffer object.\n * \n * @returns The view of the memory buffer as Float32Array.\n */\n getFloat32Array(): Float32Array {\n return new Float32Array(this.memory.buffer);\n }\n\n /**\n * Returns the Float64 view of the underlying buffer object..\n * \n * @returns The view of the memory buffer as Float64Array.\n */\n getFloat64Array(): Float64Array {\n return new Float64Array(this.memory.buffer);\n }\n}\n\n// Maximum number of soundfile parts.\nconst MAX_SOUNDFILE_PARTS = 256;\n\n// Maximum number of channels.\nconst MAX_CHAN = 64;\n\n// Maximum buffer size in frames.\nconst BUFFER_SIZE = 1024;\n\n// Default sample rate.\nconst SAMPLE_RATE = 44100;\n\n// Size of an integer in bytes.\nconst intSize = 4;\n\n/**\n * Soundfile class to handle soundfile data in wasm memory.\n */\nclass Soundfile {\n private readonly fPtr: number; // Pointer to the soundfile structure in wasm memory\n private readonly fBuffers: number;\n private readonly fLength: number;\n private readonly fSR: number;\n private readonly fOffset: number;\n private readonly fSampleSize: number;\n private readonly fPtrSize: number;\n private readonly fAllocator: WasmAllocator;\n\n constructor(allocator: WasmAllocator, ptrSize: number, sampleSize: number, curChan: number, length: number, maxChan: number, totalParts: number) {\n // Keep the soundfile structure parameters\n\n this.fSampleSize = sampleSize;\n this.fPtrSize = ptrSize;\n this.fAllocator = allocator;\n\n // Allocate wasm memory for the soundfile structure\n this.fPtr = allocator.alloc(4 * ptrSize); // 4 ptrSize: fBuffers, fLength, fSR, fOffset\n this.fLength = allocator.alloc(MAX_SOUNDFILE_PARTS * intSize);\n this.fSR = allocator.alloc(MAX_SOUNDFILE_PARTS * intSize);\n this.fOffset = allocator.alloc(MAX_SOUNDFILE_PARTS * intSize);\n this.fBuffers = this.allocBuffers(curChan, length, maxChan);\n\n //this.displayMemory(\"Allocated soundfile structure 1\");\n\n // Set the soundfile structure in wasm memory\n const HEAP32 = this.fAllocator.getInt32Array();\n HEAP32[this.fPtr >> 2] = this.fBuffers;\n HEAP32[(this.fPtr + ptrSize) >> 2] = this.fLength;\n HEAP32[(this.fPtr + 2 * ptrSize) >> 2] = this.fSR;\n HEAP32[(this.fPtr + 3 * ptrSize) >> 2] = this.fOffset;\n\n for (let chan = 0; chan < curChan; chan++) {\n const buffer: number = HEAP32[(this.fBuffers >> 2) + chan];\n console.log(`allocBuffers AFTER: ${chan} - ${buffer}`);\n }\n\n //this.displayMemory(\"Allocated soundfile structure 2\");\n }\n\n private allocBuffers(curChan: number, length: number, maxChan: number): number {\n const buffers = this.fAllocator.alloc(maxChan * this.fPtrSize);\n\n console.log(`allocBuffers buffers: ${buffers}`);\n\n for (let chan = 0; chan < curChan; chan++) {\n const buffer: number = this.fAllocator.alloc(length * this.fSampleSize);\n // HEAP32 is the Int32Array view of the memory buffer which can change after grow in `alloc` method\n // so we need to recompute the buffer address\n const HEAP32 = this.fAllocator.getInt32Array();\n HEAP32[(buffers >> 2) + chan] = buffer;\n }\n //this.displayMemory(\"Allocated soundfile buffers\");\n return buffers;\n }\n\n shareBuffers(curChan: number, maxChan: number) {\n // Share the same buffers for all other channels so that we have maxChan channels available\n const HEAP32 = this.fAllocator.getInt32Array();\n for (let chan = curChan; chan < maxChan; chan++) {\n HEAP32[(this.fBuffers >> 2) + chan] = HEAP32[(this.fBuffers >> 2) + chan % curChan];\n }\n }\n\n copyToOut(part: number, maxChannels: number, offset: number, buffer: AudioBuffer) {\n const HEAP32 = this.fAllocator.getInt32Array();\n HEAP32[(this.fLength >> 2) + part] = buffer.length;\n HEAP32[(this.fSR >> 2) + part] = buffer.sampleRate;\n HEAP32[(this.fOffset >> 2) + part] = offset;\n\n //this.displayMemory(\"IN copyToOut, BEFORE copyToOutReal\", true);\n // Copy the soundfile data to the buffer\n if (this.fSampleSize === 8) {\n this.copyToOutReal64(maxChannels, offset, buffer);\n } else {\n this.copyToOutReal32(maxChannels, offset, buffer);\n }\n //this.displayMemory(\"IN copyToOut, AFTER copyToOutReal\");\n }\n\n copyToOutReal32(maxChannels: number, offset: number, buffer: AudioBuffer) {\n const HEAP32 = this.fAllocator.getInt32Array();\n const HEAPF = this.fAllocator.getFloat32Array();\n for (let chan = 0; chan < buffer.numberOfChannels; chan++) {\n const input: Float32Array = buffer.getChannelData(chan);\n const output: number = HEAP32[(this.fBuffers >> 2) + chan];\n const outputReal: Float32Array = HEAPF.subarray((output + offset * this.fSampleSize) >> Math.log2(this.fSampleSize),\n (output + (offset + input.length) * this.fSampleSize) >> Math.log2(this.fSampleSize));\n for (let sample = 0; sample < input.length; sample++) {\n outputReal[sample] = input[sample];\n }\n }\n }\n\n copyToOutReal64(maxChannels: number, offset: number, buffer: AudioBuffer) {\n const HEAP32 = this.fAllocator.getInt32Array();\n const HEAPF = this.fAllocator.getFloat64Array();\n for (let chan = 0; chan < buffer.numberOfChannels; chan++) {\n const input: Float32Array = buffer.getChannelData(chan);\n const output: number = HEAP32[(this.fBuffers >> 2) + chan];\n const outputReal: Float64Array = HEAPF.subarray((output + offset * this.fSampleSize) >> Math.log2(this.fSampleSize),\n (output + (offset + input.length) * this.fSampleSize) >> Math.log2(this.fSampleSize));\n for (let sample = 0; sample < input.length; sample++) {\n outputReal[sample] = input[sample];\n }\n }\n }\n\n emptyFile(part: number, offset: number): number {\n // Set the soundfile buffer in wasm memory\n const HEAP32 = this.fAllocator.getInt32Array();\n HEAP32[(this.fLength >> 2) + part] = BUFFER_SIZE;\n HEAP32[(this.fSR >> 2) + part] = SAMPLE_RATE;\n HEAP32[(this.fOffset >> 2) + part] = offset;\n\n // Update and return the new offset\n return offset + BUFFER_SIZE;\n }\n\n displayMemory(where: string = \"\", mem: boolean = false) {\n console.log(\"Soundfile memory: \" + where);\n console.log(`fPtr: ${this.fPtr}`);\n console.log(`fBuffers: ${this.fBuffers}`);\n console.log(`fLength: ${this.fLength}`);\n console.log(`fSR: ${this.fSR}`);\n console.log(`fOffset: ${this.fOffset}`);\n const HEAP32 = this.fAllocator.getInt32Array();\n if (mem) console.log(`HEAP32: ${HEAP32}`);\n console.log(`HEAP32[this.fPtr >> 2]: ${HEAP32[this.fPtr >> 2]}`);\n console.log(`HEAP32[(this.fPtr + ptrSize) >> 2]: ${HEAP32[(this.fPtr + this.fPtrSize) >> 2]}`);\n console.log(`HEAP32[(this.fPtr + 2 * ptrSize) >> 2]: ${HEAP32[(this.fPtr + 2 * this.fPtrSize) >> 2]}`);\n console.log(`HEAP32[(this.fPtr + 3 * ptrSize) >> 2]: ${HEAP32[(this.fPtr + 3 * this.fPtrSize) >> 2]}`);\n }\n\n // Return the pointer to the soundfile structure in wasm memory\n getPtr(): number {\n return this.fPtr;\n }\n\n getHEAP32(): Int32Array {\n return this.fAllocator.getInt32Array();\n }\n getHEAPFloat32(): Float32Array {\n return this.fAllocator.getFloat32Array();\n }\n\n getHEAPFloat64(): Float64Array {\n return this.fAllocator.getFloat64Array();\n }\n\n}\n\n// Definition of the AudioBufferItem type\ntype AudioBufferItem = {\n pathName: string;\n audioBuffer: AudioBuffer;\n};\n\n/**\n * SoundfileReader class to read soundfile data and copy it to the soundfile buffer.\n */\nclass SoundfileReader {\n\n private readonly fAllocator: WasmAllocator;\n private readonly fPtrSize: number;\n private readonly fSampleSize: number;\n private readonly fContext;\n private readonly fAudioBuffers: AudioBufferItem[];\n\n constructor(allocator: WasmAllocator, context: BaseAudioContext, ptrSize: number, sampleSize: number) {\n this.fAllocator = allocator;\n this.fPtrSize = ptrSize;\n this.fSampleSize = sampleSize;\n this.fContext = context;\n this.fAudioBuffers = [];\n }\n\n /**\n * Check if the file exists in the given directories.\n * \n * @param directories : the list of directories to search for the file \n * @param fileName : the name of the file to search for \n * @returns : the path of the file if found, otherwise an empty string\n */\n private async checkFile(directories: string[], fileName: string): Promise<string> {\n\n async function checkFileExists(url: string): Promise<boolean> {\n try {\n console.log(`\"checkFileExists\" url: ${url}`);\n const response = await fetch(url, { method: 'HEAD' });\n return response.ok; // Will be true if the status code is 200-299\n } catch (error) {\n console.error('Fetch error:', error);\n return false;\n }\n }\n\n if (await checkFileExists(fileName)) {\n return fileName;\n } else {\n for (let i = 0; i < directories.length; i++) {\n const pathName = directories[i] + \"/\" + fileName;\n if (await checkFileExists(pathName)) {\n return pathName;\n }\n }\n return \"\";\n }\n }\n\n /**\n * Check if all soundfiles exist and return their real path_name.\n * \n * @param directories : the list of directories to search for the file\n * @param fileNameList : the list of file names to search for\n * @returns : the list of path names of the files if found, otherwise an empty string\n */\n async checkFiles(directories: string[], fileNameList: string[]): Promise<string[]> {\n const pathNameList: string[] = [];\n for (let i = 0; i < fileNameList.length; i++) {\n const pathName: string = await this.checkFile(directories, fileNameList[i]);\n console.log(`checkFiles pathName: ${pathName}`);\n // If 'pathName' is not found, it is replaced by an identifier for an empty sound (e.g., silence)\n pathNameList.push(pathName === \"\" ? \"__empty_sound__\" : pathName);\n }\n return pathNameList;\n }\n\n /**\n * Get the channels and length values of the given sound resource.\n * \n * @param pathName : the name of the file, or sound resource identified this way\n * @returns channels and length of the soundfile\n */\n private async getParamsFile(pathName: string): Promise<{ channels: number, length: number }> {\n console.log(`Loading sound file from ${pathName}`);\n\n const item = this.fAudioBuffers.find((element: AudioBufferItem) => element.pathName === pathName);\n if (item) {\n console.log(`getItemByPathName FOUND`);\n return { channels: item.audioBuffer.numberOfChannels, length: item.audioBuffer.length };\n } else {\n const response = await fetch(pathName);\n if (!response.ok) {\n console.log(`Failed to load sound file from ${pathName}: ${response.statusText}`);\n return { channels: 1, length: BUFFER_SIZE };\n } else {\n\n // Decode the audio data\n const arrayBuffer = await response.arrayBuffer();\n const audioBuffer = await this.fContext.decodeAudioData(arrayBuffer);\n const { numberOfChannels, length } = audioBuffer;\n\n // Keep the audio buffer for later use\n this.fAudioBuffers.push({ pathName, audioBuffer });\n\n // Ensure the returned object keys match what's being returned\n return { channels: numberOfChannels, length };\n }\n }\n }\n\n /**\n * Read one sound resource and fill the 'soundfile' structure accordingly\n *\n * @param soundfile - the soundfile to be filled\n * @param pathName - the name of the file, or sound resource identified this way\n * @param part - the part number to be filled in the soundfile\n * @param maxChan - the maximum number of mono channels to fill\n * \n * @returns the offset in the soundfile buffer\n *\n */\n private readFile(soundfile: Soundfile, pathName: string, part: number, offset: number, maxChan: number): number {\n // Read the soundfile\n const item = this.fAudioBuffers.find(entry => entry.pathName === pathName);\n // Copy the soundfile data to the buffer\n if (item) {\n //soundfile.displayMemory(\"BEFORE copyToOut\");\n soundfile.copyToOut(part, maxChan, offset, item.audioBuffer);\n //soundfile.displayMemory(\"AFTER copyToOut\");\n return offset + item.audioBuffer.length;\n } else {\n console.error(`Failed to access sound file from ${pathName}`);\n return offset + BUFFER_SIZE;\n }\n }\n\n /**\n * Crate a soundfile, load all parts and copy audio data to the wasm soundfile buffer.\n * @param pathNameList : list of soundfile paths\n * @param maxChan : maximum number of channels\n * @param isDouble : whether the soundfile will be copied as double\n */\n async createSoundfile(pathNameList: string[], maxChan: number, isDouble: boolean): Promise<Soundfile | null> {\n try {\n let curChan = 1; // At least one channel\n let totalLength = 0;\n\n // Compute total length and channels max of all files\n for (const pathName of pathNameList) {\n let chan: number = 0, len: number = 0;\n if (pathName === \"__empty_sound__\") {\n length = BUFFER_SIZE;\n chan = 1;\n } else {\n const { channels, length } = await this.getParamsFile(pathName);\n chan = channels;\n len = length;\n }\n curChan = Math.max(curChan, chan);\n totalLength += len;\n }\n\n // Complete with empty parts\n totalLength += (MAX_SOUNDFILE_PARTS - pathNameList.length) * BUFFER_SIZE;\n\n // Create the soundfile\n let soundfile = new Soundfile(this.fAllocator, this.fPtrSize, this.fSampleSize, curChan, totalLength, maxChan, pathNameList.length);\n\n //soundfile.displayMemory(\"After soundfile creation\");\n // Init offset\n let offset = 0;\n\n // Read all files\n for (let part = 0; part < pathNameList.length; part++) {\n if (pathNameList[part] === \"__empty_sound__\") {\n // Empty sound\n offset = soundfile.emptyFile(part, offset);\n } else {\n // Read the soundfile and update the offset\n offset = await this.readFile(soundfile, pathNameList[part], part, offset, maxChan);\n }\n }\n\n //soundfile.displayMemory(\"After reading soundfiles\");\n\n // Complete with empty parts\n for (let part = pathNameList.length; part < MAX_SOUNDFILE_PARTS; part++) {\n offset = soundfile.emptyFile(part, offset);\n }\n\n //soundfile.displayMemory(\"After emptyFile\");\n\n // Share the same buffers for all other channels so that we have maxChan channels available\n soundfile.shareBuffers(curChan, maxChan);\n\n //soundfile.displayMemory(\"After shareBuffers\");\n\n return soundfile;\n\n } catch (error) {\n console.error(\"Failed to create soundfile:\", error);\n return null;\n }\n }\n\n getHEAP32(): Int32Array {\n return this.fAllocator.getInt32Array();\n }\n}\n\n/**\n * DSP implementation: mimic the C++ 'dsp' class:\n * - adding MIDI control: metadata are decoded and incoming MIDI messages will control the associated controllers\n * - an output handler can be set to treat produced output controllers (like 'bargraph') \n * - regular controllers are handled using setParamValue/getParamValue\n */\nexport interface IFaustBaseWebAudioDsp {\n /**\n * Set the parameter output handler, to be called in the 'compute' method with output parameters (like bargraph).\n *\n * @param handler - the output handler\n */\n setOutputParamHandler(handler: OutputParamHandler | null): void;\n\n /**\n * Get the parameter output handler.\n *\n * @return the current output handler\n */\n getOutputParamHandler(): OutputParamHandler | null;\n\n /**\n * Set the compute handler, to be called in the 'compute' method with buffer size.\n *\n * @param handler - the compute handler\n */\n setComputeHandler(handler: ComputeHandler | null): void;\n\n /**\n * Get the compute handler.\n *\n * @return the current output handler\n */\n getComputeHandler(): ComputeHandler | null;\n\n /**\n * Set the plot handler, to be called in the 'compute' method with various info (see PlotHandler type).\n *\n * @param handler - the plot handler\n */\n setPlotHandler(handler: PlotHandler | null): void;\n\n /**\n * Get the plot handler.\n *\n * @return the current plot handler\n */\n getPlotHandler(): PlotHandler | null;\n\n /**\n * Return instance number of audio inputs.\n *\n * @return the instance number of audio inputs\n */\n getNumInputs(): number;\n\n /**\n * Return instance number of audio outputs.\n *\n * @return the instance number of audio outputs\n */\n getNumOutputs(): number;\n\n /**\n * DSP instance computation, to be called with successive input/output audio buffers, using their size.\n *\n * @param inputs - the input audio buffers\n * @param outputs - the output audio buffers\n */\n compute(inputs: Float32Array[], outputs: Float32Array[]): boolean;\n\n /**\n * Give a handler to be called on 'declare key value' kind of metadata.\n *\n * @param handler - the handler to be used\n */\n metadata(handler: MetadataHandler): void;\n\n /**\n * Handle untyped MIDI messages.\n *\n * @param data - and arry of MIDI bytes\n */\n midiMessage(data: number[] | Uint8Array): void;\n\n /**\n * Handle MIDI ctrlChange messages.\n *\n * @param channel - the MIDI channel (0..15, not used for now)\n * @param ctrl - the MIDI controller number (0..127)\n * @param value - the MIDI controller value (0..127)\n */\n ctrlChange(chan: number, ctrl: number, value: number): void;\n\n /**\n * Handle MIDI pitchWheel messages.\n *\n * @param channel - the MIDI channel (0..15, not used for now)\n * @param value - the MIDI controller value (0..16383)\n */\n pitchWheel(chan: number, value: number): void;\n\n /**\n * Set parameter value.\n *\n * @param path - the path to the wanted parameter (retrieved using 'getParams' method)\n * @param val - the float value for the wanted control\n */\n setParamValue(path: string, value: number): void;\n\n /**\n * Get parameter value.\n *\n * @param path - the path to the wanted parameter (retrieved using 'getParams' method)\n *\n * @return the float value\n */\n getParamValue(path: string): number;\n\n /**\n * Get the table of all input parameters paths.\n *\n * @return the table of all input parameters paths\n */\n getParams(): string[];\n\n /**\n * Get DSP JSON description with its UI and metadata as object.\n *\n * @return the DSP JSON description as object\n */\n getMeta(): FaustDspMeta;\n\n /**\n * Get DSP JSON description with its UI and metadata.\n *\n * @return the DSP JSON description\n */\n getJSON(): string;\n\n /**\n * Get DSP UI description.\n *\n * @return the DSP UI description\n */\n getUI(): FaustUIDescriptor;\n\n /**\n * Get DSP UI items description.\n *\n * @return the DSP UI items description\n */\n getDescriptors(): FaustUIInputItem[];\n\n /**\n * Start the DSP.\n */\n start(): void;\n\n /**\n * Stop the DSP.\n */\n stop(): void;\n\n /**\n * Destroy the DSP.\n */\n destroy(): void;\n}\n\nexport interface IFaustMonoWebAudioDsp extends IFaustBaseWebAudioDsp { }\nexport interface IFaustMonoWebAudioNode extends IFaustMonoWebAudioDsp, AudioNode { }\n\nexport interface IFaustPolyWebAudioDsp extends IFaustBaseWebAudioDsp {\n /**\n * Handle MIDI keyOn messages.\n *\n * @param channel - the MIDI channel (0..15, not used for now)\n * @param pitch - the MIDI pitch value (0..127)\n * @param velocity - the MIDI velocity value (0..127)\n */\n keyOn(channel: number, pitch: number, velocity: number): void;\n\n /**\n * Handle MIDI keyOff messages.\n *\n * @param channel - the MIDI channel (0..15, not used for now)\n * @param pitch - the MIDI pitch value (0..127)\n * @param velocity - the MIDI velocity value (0..127)\n */\n keyOff(channel: number, pitch: number, velocity: number): void;\n\n /**\n * Stop all playing notes.\n *\n * @param hard - whether to immediately stop notes or put them in release mode\n */\n allNotesOff(hard: boolean): void;\n}\nexport interface IFaustPolyWebAudioNode extends IFaustPolyWebAudioDsp, AudioNode { }\n\n// Definition of the SoundfileItem type\ntype SoundfileItem = {\n name: string; // Name of the soundfile\n url: string; // URL of the soundfile\n index: number; // Index in the DSP struct \n basePtr: number; // Base pointer in wasm memory\n};\n\nexport class FaustBaseWebAudioDsp implements IFaustBaseWebAudioDsp {\n protected fOutputHandler: OutputParamHandler | null;\n protected fComputeHandler: ComputeHandler | null;\n\n // To handle MIDI events plot\n protected fPlotHandler: PlotHandler | null;\n protected fCachedEvents: { type: string; data: any }[];\n protected fBufferNum: number;\n\n protected fInChannels: Float32Array[] | Float64Array[];\n protected fOutChannels: Float32Array[] | Float64Array[];\n\n protected fOutputsTimer: number;\n\n // UI items path\n protected fInputsItems: string[];\n protected fOutputsItems: string[];\n protected fDescriptor: FaustUIInputItem[];\n\n // Soundfile handling\n protected fSoundfiles: SoundfileItem[];\n protected fEndMemory: number; // Keep the end of memory offset before soundfiles\n\n // Buffers in wasm memory\n protected fAudioInputs!: number;\n protected fAudioOutputs!: number;\n\n protected fBufferSize: number;\n protected fPtrSize: number;\n protected fSampleSize: number;\n\n // MIDI handling\n protected fPitchwheelLabel: { path: string; min: number; max: number }[];\n protected fCtrlLabel: { path: string; min: number; max: number }[][];\n protected fPathTable: { [address: string]: number };\n protected fUICallback: UIHandler;\n\n // Audio callback\n protected fProcessing: boolean;\n protected fDestroyed: boolean;\n protected fFirstCall: boolean;\n\n protected fJSONDsp!: FaustDspMeta;\n\n constructor(sampleSize: number, bufferSize: number) {\n this.fOutputHandler = null;\n this.fComputeHandler = null;\n\n // To handle MIDI events plot\n this.fCachedEvents = [];\n this.fBufferNum = 0;\n this.fPlotHandler = null;\n\n this.fBufferSize = bufferSize;\n\n this.fInChannels = [];\n this.fOutChannels = [];\n\n this.fPtrSize = sampleSize; // Done on wast/wasm backend side\n this.fSampleSize = sampleSize;\n\n this.fOutputsTimer = 5;\n this.fInputsItems = [];\n this.fOutputsItems = [];\n this.fDescriptor = [];\n\n this.fSoundfiles = [];\n\n this.fPitchwheelLabel = [];\n this.fCtrlLabel = new Array(128).fill(null).map(() => []);\n this.fPathTable = {};\n\n this.fProcessing = false;\n this.fDestroyed = false;\n this.fFirstCall = true;\n\n this.fUICallback = (item: FaustUIItem) => {\n if (item.type === \"hbargraph\" || item.type === \"vbargraph\") {\n // Keep bargraph adresses\n this.fOutputsItems.push(item.address);\n this.fPathTable[item.address] = item.index;\n } else if (item.type === \"vslider\" || item.type === \"hslider\" || item.type === \"button\" || item.type === \"checkbox\" || item.type === \"nentry\") {\n // Keep inputs adresses\n this.fInputsItems.push(item.address);\n this.fPathTable[item.address] = item.index;\n this.fDescriptor.push(item);\n // Parse 'midi' metadata\n if (!item.meta) return;\n item.meta.forEach((meta) => {\n const { midi } = meta;\n if (!midi) return;\n const strMidi = midi.trim();\n if (strMidi === \"pitchwheel\") {\n this.fPitchwheelLabel.push({ path: item.address, min: item.min as number, max: item.max as number });\n } else {\n const matched = strMidi.match(/^ctrl\\s(\\d+)/);\n if (!matched) return;\n this.fCtrlLabel[parseInt(matched[1])].push({ path: item.address, min: item.min as number, max: item.max as number });\n }\n });\n } else if (item.type === \"soundfile\") {\n this.fSoundfiles.push({ name: item.label, url: item.url, index: item.index, basePtr: -1 });\n }\n }\n }\n\n // Tools\n static remap(v: number, mn0: number, mx0: number, mn1: number, mx1: number) {\n return (v - mn0) / (mx0 - mn0) * (mx1 - mn1) + mn1;\n }\n\n // JSON parsing functions\n static parseUI(ui: FaustUIDescriptor, callback: (item: FaustUIItem) => any) {\n ui.forEach(group => this.parseGroup(group, callback));\n }\n\n static parseGroup(group: FaustUIGroup, callback: (item: FaustUIItem) => any) {\n if (group.items) {\n this.parseItems(group.items, callback);\n }\n }\n static parseItems(items: FaustUIItem[], callback: (item: FaustUIItem) => any) {\n items.forEach(item => this.parseItem(item, callback));\n }\n\n static parseItem(item: FaustUIItem, callback: (item: FaustUIItem) => any) {\n if (item.type === \"vgroup\" || item.type === \"hgroup\" || item.type === \"tgroup\") {\n this.parseItems(item.items, callback);\n } else {\n callback(item);\n }\n }\n\n // Split the soundfile names and return an array of names\n static splitNames(input: string): string[] {\n // Trim off the curly braces at the start and end, if present\n let trimmed = input.replace(/^\\{|\\}$/g, '');\n // Split the string into an array of strings and remove first and last characters\n return trimmed.split(\";\").map(str => str.length <= 2 ? '' : str.substring(1, str.length - 1));\n }\n\n private extractURLsFromJSON(): string[] {\n // Find the entry with the \"soundfiles\" key\n const soundfilesEntry = this.fJSONDsp.meta.find(entry => entry.soundfiles !== undefined);\n // If the entry is found, split the string by semicolon to get the URLs\n if (soundfilesEntry) {\n return soundfilesEntry.soundfiles.split(';').filter(url => url !== '');\n } else {\n return [];\n }\n }\n\n /**\n * Load a soundfile possibly containing several parts in the DSP struct.\n * Soundfile pointers are located at 'index' offset, to be read in the JSON file.\n * The DSP struct is located at baseDSP in the wasm memory, \n * either a monophonic DSP, or a voice in a polyphonic context.\n * \n * @param sfReader : the soundfile reader \n * @param baseDSP : the base DSP in the wasm memory\n * @param name : the name of the soundfile\n * @param url : the url of the soundfile\n */\n private async loadSoundfile(sfReader: SoundfileReader, baseDSP: number, name: string, url: string): Promise<void> {\n\n console.log(`Soundfile ${name} paths: ${url}`);\n\n const sfReaderURLs = this.extractURLsFromJSON();\n console.log(`sfReaderURLs ${sfReaderURLs}`);\n\n const sfDirectories: string[] = [\"\", \".\", \"http://127.0.0.1:8000\"];\n sfDirectories.push(...sfReaderURLs);\n console.log(`sfDirectories ${sfDirectories}`);\n\n // Check if the soundfile exists in the given directories and return the real path\n const sfPathNames: string[] = await sfReader.checkFiles(sfDirectories, FaustBaseWebAudioDsp.splitNames(url));\n\n console.log(`Soundfile ${name} paths: ${sfPathNames}`);\n\n const item = this.fSoundfiles.find((element: SoundfileItem) => element.url === url);\n if (item) {\n // Use the cached Soundfile\n if (item.basePtr !== -1) {\n\n // Update HEAP32 after soundfile creation\n const HEAP32 = sfReader.getHEAP32();\n\n // Fill the soundfile structure in wasm memory, sounfiles are at the beginning of the DSP memory\n console.log(`Soundfile CACHE ${url}} : ${name} loaded at ${item.basePtr} in wasm memory with index ${item.index}`);\n\n // Soundfile is located at 'index' in the DSP struct, to be added with baseDSP in the wasm memory\n HEAP32[(baseDSP + item.index) >> 2] = item.basePtr;\n\n } else {\n\n // Create the soundfiles\n const soundfile = await sfReader.createSoundfile(sfPathNames, MAX_CHAN, this.fSampleSize === 8);\n if (soundfile) {\n\n // Update HEAP32 after soundfile creation\n const HEAP32 = soundfile.getHEAP32();\n\n // Get the soundfile pointer in wasm memory\n item.basePtr = soundfile.getPtr();\n console.log(`Soundfile ${name} loaded at ${item.basePtr} in wasm memory with index ${item.index}`);\n\n // Soundfile is located at 'index' in the DSP struct, to be added with baseDSP in the wasm memory\n HEAP32[(baseDSP + item.index) >> 2] = item.basePtr;\n\n } else {\n console.log(`Soundfile ${name} for ${url} cannot be created !}`);\n }\n }\n } else {\n console.log(`Soundfile with ${url} cannot be found !}`);\n }\n }\n\n /** \n * Init soundfiles memory.\n * \n * @param allocator : the wasm memory allocator\n * @param sfReader : the soundfile reader\n * @param baseDSP : the DSP struct (either a monophonic DSP of polyphonic voice) base DSP in the wasm memory\n */\n protected async initSoundfileMemory(allocator: WasmAllocator, sfReader: SoundfileReader, baseDSP: number): Promise<void> {\n // Create and fill the soundfile structure\n for (const { name, url } of this.fSoundfiles) {\n await this.loadSoundfile(sfReader, baseDSP, name, url);\n };\n }\n\n protected updateOutputs() {\n if (this.fOutputsItems.length > 0 && this.fOutputHandler && this.fOutputsTimer-- === 0) {\n this.fOutputsTimer = 5;\n this.fOutputsItems.forEach(item => this.fOutputHandler?.(item, this.getParamValue(item)));\n }\n }\n\n // Public API\n metadata(handler: MetadataHandler) {\n if (this.fJSONDsp.meta) {\n this.fJSONDsp.meta.forEach(meta => handler(Object.keys(meta)[0], meta[Object.keys(meta)[0]]));\n }\n }\n\n compute(input: Float32Array[], output: Float32Array[]) {\n return false;\n }\n\n setOutputParamHandler(handler: OutputParamHandler | null) {\n this.fOutputHandler = handler;\n }\n getOutputParamHandler() {\n return this.fOutputHandler;\n }\n\n setComputeHandler(handler: ComputeHandler | null) {\n this.fComputeHandler = handler;\n }\n getComputeHandler() {\n return this.fComputeHandler;\n }\n\n setPlotHandler(handler: PlotHandler | null) {\n this.fPlotHandler = handler;\n }\n getPlotHandler() {\n return this.fPlotHandler;\n }\n\n getNumInputs() {\n return -1;\n }\n getNumOutputs() {\n return -1;\n }\n\n midiMessage(data: number[] | Uint8Array) {\n if (this.fPlotHandler) this.fCachedEvents.push({ data, type: \"midi\" });\n const cmd = data[0] >> 4;\n const channel = data[0] & 0xf;\n const data1 = data[1];\n const data2 = data[2];\n if (cmd === 11) return this.ctrlChange(channel, data1, data2);\n if (cmd === 14) return this.pitchWheel(channel, (data2 * 128.0 + data1));\n }\n\n ctrlChange(channel: number, ctrl: number, value: number) {\n if (this.fPlotHandler) this.fCachedEvents.push({ type: \"ctrlChange\", data: [channel, ctrl, value] });\n if (this.fCtrlLabel[ctrl].length) {\n this.fCtrlLabel[ctrl].forEach((ctrl) => {\n const { path } = ctrl;\n this.setParamValue(path, FaustBaseWebAudioDsp.remap(value, 0, 127, ctrl.min, ctrl.max));\n // Typically used to reflect parameter change on GUI\n if (this.fOutputHandler) this.fOutputHandler(path, this.getParamValue(path));\n });\n }\n }\n\n pitchWheel(channel: number, wheel: number) {\n if (this.fPlotHandler) this.fCachedEvents.push({ type: \"pitchWheel\", data: [channel, wheel] });\n this.fPitchwheelLabel.forEach((pw) => {\n this.setParamValue(pw.path, FaustBaseWebAudioDsp.remap(wheel, 0, 16383, pw.min, pw.max));\n // Typically used to reflect parameter change on GUI\n if (this.fOutputHandler) this.fOutputHandler(pw.path, this.getParamValue(pw.path));\n });\n }\n\n setParamValue(path: string, value: number) { }\n getParamValue(path: string) { return 0; }\n\n getParams() { return this.fInputsItems; }\n getMeta() { return this.fJSONDsp; }\n getJSON() { return JSON.stringify(this.getMeta()); }\n getUI() { return this.fJSONDsp.ui; }\n getDescriptors() { return this.fDescriptor; }\n\n hasSoundfiles() { return this.fSoundfiles.length > 0; }\n\n start() {\n this.fProcessing = true;\n }\n\n stop() {\n this.fProcessing = false;\n }\n\n destroy() {\n this.fDestroyed = true;\n this.fOutputHandler = null;\n this.fComputeHandler = null;\n this.fPlotHandler = null;\n }\n}\n\nexport class FaustMonoWebAudioDsp extends FaustBaseWebAudioDsp implements IFaustMonoWebAudioDsp {\n\n private fInstance: FaustMonoDspInstance;\n private fDSP!: number;\n\n constructor(instance: FaustMonoDspInstance, sampleRate: number, sampleSize: number, bufferSize: number) {\n\n super(sampleSize, bufferSize);\n this.fInstance = instance;\n\n // Create JSON object\n this.fJSONDsp = JSON.parse(this.fInstance.json);\n\n // Setup GUI\n FaustBaseWebAudioDsp.parseUI(this.fJSONDsp.ui, this.fUICallback);\n\n // Setup wasm memory\n this.fEndMemory = this.initMemory();\n\n // Init DSP\n this.fInstance.api.init(this.fDSP, sampleRate);\n }\n\n async init(context: BaseAudioContext | null): Promise<void> {\n\n // Init soundfiles memory is needed\n if (this.fSoundfiles.length > 0 && context) {\n\n // Create memory allocator for soundfiles in wasm memory, starting at the end of DSP memory\n const allocator = new WasmAllocator(this.fInstance.memory, this.fEndMemory);\n\n // Create soundfile reader\n const sfReader = new SoundfileReader(allocator, context, this.fPtrSize, this.fSampleSize);\n\n // Init soundfiles memory\n await this.initSoundfileMemory(allocator, sfReader, this.fDSP);\n }\n }\n\n private initMemory(): number {\n\n // Start of DSP memory: Mono DSP is placed first with index 0\n this.fDSP = 0;\n\n // Audio buffer start at the end of DSP\n const $audio = this.fJSONDsp.size;\n\n // Setup audio pointers offset\n this.fAudioInputs = $audio;\n this.fAudioOutputs = this.fAudioInputs + this.getNumInputs() * this.fPtrSize;\n\n // Prepare wasm memory layout\n const $audioInputs = this.fAudioOutputs + this.getNumOutputs() * this.fPtrSize;\n const $audioOutputs = $audioInputs + this.getNumInputs() * this.fBufferSize * this.fSampleSize;\n // Compute memory end in bytes\n const endMemory = $audioOutputs + this.getNumOutputs() * this.fBufferSize * this.fSampleSize;\n\n // Setup Int32 and Real views of the memory\n const HEAP = this.fInstance.memory.buffer;\n const HEAP32 = new Int32Array(HEAP);\n const HEAPF = (this.fSampleSize === 4) ? new Float32Array(HEAP) : new Float64Array(HEAP);\n\n if (this.getNumInputs() > 0) {\n for (let chan = 0; chan < this.getNumInputs(); chan++) {\n HEAP32[(this.fAudioInputs >> 2) + chan] = $audioInputs + this.fBufferSize * this.fSampleSize * chan;\n }\n // Prepare Ins buffer tables\n const dspInChans = HEAP32.subarray(this.fAudioInputs >> 2, (this.fAudioInputs + this.getNumInputs() * this.fPtrSize) >> 2);\n for (let chan = 0; chan < this.getNumInputs(); chan++) {\n this.fInChannels[chan] = HEAPF.subarray(dspInChans[chan] >> Math.log2(this.fSampleSize), (dspInChans[chan] + this.fBufferSize * this.fSampleSize) >> Math.log2(this.fSampleSize));\n }\n }\n if (this.getNumOutputs() > 0) {\n for (let chan = 0; chan < this.getNumOutputs(); chan++) {\n HEAP32[(this.fAudioOutputs >> 2) + chan] = $audioOutputs + this.fBufferSize * this.fSampleSize * chan;\n }\n // Prepare Out buffer tables\n const dspOutChans = HEAP32.subarray(this.fAudioOutputs >> 2, (this.fAudioOutputs + this.getNumOutputs() * this.fPtrSize) >> 2);\n for (let chan = 0; chan < this.getNumOutputs(); chan++) {\n this.fOutChannels[chan] = HEAPF.subarray(dspOutChans[chan] >> Math.log2(this.fSampleSize), (dspOutChans[chan] + this.fBufferSize * this.fSampleSize) >> Math.log2(this.fSampleSize));\n }\n }\n\n return endMemory;\n }\n\n toString() {\n return `============== Mono Memory layout ==============\n this.fBufferSize: ${this.fBufferSize}\n this.fJSONDsp.size: ${this.fJSONDsp.size}\n this.fAudioInputs: ${this.fAudioInputs}\n this.fAudioOutputs: ${this.fAudioOutputs}\n this.fDSP: ${this.fDSP}`;\n }\n\n // Public API\n compute(input: Float32Array[] | ((input: Float32Array[] | Float64Array[]) => any), output: Float32Array[] | ((output: Float32Array[] | Float64Array[]) => any)) {\n\n // Check DSP state\n if (this.fDestroyed) return false;\n\n // Check Processing state: the node returns 'true' to stay in the graph, even if not processing\n if (!this.fProcessing) return true;\n\n // Init memory again on first call (since WebAssembly.memory.grow() may have been called)\n if (this.fFirstCall) {\n this.initMemory();\n this.fFirstCall = false;\n }\n\n if (typeof input === \"function\") {\n // Call input callback to avoid array copy\n input(this.fInChannels);\n } else {\n // Check inputs\n if (this.getNumInputs() > 0 && (!input || !input[0] || input[0].length === 0)) {\n // console.log(\"Process input error\");\n return true;\n }\n\n // Check outputs\n if (this.getNumOutputs() > 0 && typeof output !== \"function\" && (!output || !output[0] || output[0].length === 0)) {\n // console.log(\"Process output error\");\n return true;\n }\n\n // Copy inputs\n if (input !== undefined) {\n for (let chan = 0; chan < Math.min(this.getNumInputs(), input.length); chan++) {\n const dspInput = this.fInChannels[chan];\n dspInput.set(input[chan]);\n }\n }\n }\n // Possibly call an externally given callback (for instance to synchronize playing a MIDIFile...)\n if (this.fComputeHandler) this.fComputeHandler(this.fBufferSize);\n\n // Compute\n this.fInstance.api.compute(this.fDSP, this.fBufferSize, this.fAudioInputs, this.fAudioOutputs);\n\n // Update bargraph\n this.updateOutputs();\n\n let forPlot = this.fOutChannels;\n if (typeof output === \"function\") {\n // Call output callback to avoid array copy\n output(this.fOutChannels);\n } else {\n // Copy outputs\n for (let chan = 0; chan < Math.min(this.getNumOutputs(), output.length); chan++) {\n const dspOutput = this.fOutChannels[chan];\n output[chan].set(dspOutput);\n }\n forPlot = output;\n }\n\n // PlotHandler handling \n if (this.fPlotHandler) {\n this.fPlotHandler(forPlot, this.fBufferNum++, (this.fCachedEvents.length ? this.fCachedEvents : undefined));\n this.fCachedEvents = [];\n }\n\n return true;\n }\n\n metadata(handler: MetadataHandler) { super.metadata(handler); }\n\n getNumInputs() {\n return this.fInstance.api.getNumInputs(this.fDSP);\n }\n getNumOutputs() {\n return this.fInstance.api.getNumOutputs(this.fDSP);\n }\n\n setParamValue(path: string, value: number) {\n if (this.fPlotHandler) this.fCachedEvents.push({ type: \"param\", data: { path, value } });\n this.fInstance.api.setParamValue(this.fDSP, this.fPathTable[path], value);\n }\n getParamValue(path: string) {\n return this.fInstance.api.getParamValue(this.fDSP, this.fPathTable[path]);\n }\n\n getMeta() { return this.fJSONDsp; }\n getJSON() { return this.fInstance.json; }\n getDescriptors() { return this.fDescriptor; }\n getUI() { return this.fJSONDsp.ui; }\n}\n\nexport class FaustWebAudioDspVoice {\n\n static kActiveVoice: number;\n static kFreeVoice: number;\n static kReleaseVoice: number;\n static kLegatoVoice: number;\n static kNoVoice: number;\n static VOICE_STOP_LEVEL: number;\n private fFreqLabel: number[];\n private fGateLabel: number[];\n private fGainLabel: number[];\n private fKeyLabel: number[];\n private fVelLabel: number[];\n private fDSP: number; // Voice DSP location in wasm memory\n private fAPI: IFaustDspInstance; // Voice DSP code\n // Accessed by PolyDSPImp class\n fCurNote: number;\n fNextNote: number;\n fNextVel: number;\n fDate: number;\n fLevel: number;\n fRelease: number;\n\n constructor($dsp: number, api: IFaustDspInstance, inputItems: string[], pathTable: { [address: string]: number }, sampleRate: number) {\n // Voice state\n FaustWebAudioDspVoice.kActiveVoice = 0;\n FaustWebAudioDspVoice.kFreeVoice = -1;\n FaustWebAudioDspVoice.kReleaseVoice = -2;\n FaustWebAudioDspVoice.kLegatoVoice = -3;\n FaustWebAudioDspVoice.kNoVoice = -4;\n FaustWebAudioDspVoice.VOICE_STOP_LEVEL = 0.0005;\n\n this.fCurNote = FaustWebAudioDspVoice.kFreeVoice;\n this.fNextNote = this.fNextVel = -1;\n this.fLevel = 0;\n this.fDate = this.fRelease = 0;\n this.fDSP = $dsp;\n this.fAPI = api;\n this.fGateLabel = [];\n this.fGainLabel = [];\n this.fFreqLabel = [];\n this.fKeyLabel = [];\n this.fVelLabel = [];\n this.fAPI.init(this.fDSP, sampleRate);\n this.extractPaths(inputItems, pathTable);\n }\n\n static midiToFreq(note: number) { return 440.0 * 2 ** ((note - 69) / 12); }\n\n static normalizeVelocity(velocity: number) { return velocity / 127.0; }\n\n private extractPaths(inputItems: string[], pathTable: { [address: string]: number }) {\n inputItems.forEach((item) => {\n if (item.endsWith(\"/gate\")) {\n this.fGateLabel.push(pathTable[item]);\n } else if (item.endsWith(\"/freq\")) {\n this.fFreqLabel.push(pathTable[item]);\n } else if (item.endsWith(\"/key\")) {\n this.fKeyLabel.push(pathTable[item]);\n } else if (item.endsWith(\"/gain\")) {\n this.fGainLabel.push(pathTable[item]);\n } else if (item.endsWith(\"/vel\") && item.endsWith(\"/velocity\")) {\n this.fVelLabel.push(pathTable[item]);\n }\n });\n }\n\n // Public API\n keyOn(pitch: number, velocity: number, legato: boolean = false) {\n if (legato) {\n this.fNextNote = pitch;\n this.fNextVel = velocity;\n } else {\n this.fFreqLabel.forEach(index => this.fAPI.setParamValue(this.fDSP, index, FaustWebAudioDspVoice.midiToFreq(pitch)));\n this.fGateLabel.forEach(index => this.fAPI.setParamValue(this.fDSP, index, 1));\n this.fGainLabel.forEach(index => this.fAPI.setParamValue(this.fDSP, index, FaustWebAudioDspVoice.normalizeVelocity(velocity)));\n this.fKeyLabel.forEach(index => this.fAPI.setParamValue(this.fDSP, index, pitch));\n this.fVelLabel.forEach(index => this.fAPI.setParamValue(this.fDSP, index, velocity));\n // Keep pitch\n this.fCurNote = pitch;\n }\n }\n\n keyOff(hard: boolean = false) {\n this.fGateLabel.forEach(index => this.fAPI.setParamValue(this.fDSP, index, 0));\n if (hard) {\n this.fCurNote = FaustWebAudioDspVoice.kFreeVoice;\n } else {\n this.fRelease = this.fAPI.getSampleRate(this.fDSP) / 2;\n this.fCurNote = FaustWebAudioDspVoice.kReleaseVoice;\n }\n }\n\n computeLegato(bufferSize: number, $inputs: number, $outputZero: number, $outputsHalf: number) {\n\n let size = bufferSize / 2;\n\n // Reset envelops\n this.fGateLabel.forEach(index => this.fAPI.setParamValue(this.fDSP, index, 0));\n\n // Compute current voice on half buffer\n this.fAPI.compute(this.fDSP, size, $inputs, $outputZero);\n\n // Start next keyOn\n this.keyOn(this.fNextNote, this.fNextVel);\n\n // Compute on second half buffer\n this.fAPI.compute(this.fDSP, size, $inputs, $outputsHalf);\n }\n\n compute(bufferSize: number, $inputs: number, $outputs: number) {\n this.fAPI.compute(this.fDSP, bufferSize, $inputs, $outputs);\n }\n\n setParamValue(index: number, value: number) {\n this.fAPI.setParamValue(this.fDSP, index, value);\n }\n getParamValue(index: number) {\n return this.fAPI.getParamValue(this.fDSP, index);\n }\n}\n\nexport class FaustPolyWebAudioDsp extends FaustBaseWebAudioDsp implements IFaustPolyWebAudioDsp {\n\n private fInstance: FaustPolyDspInstance;\n private fEffect!: number;\n private fJSONEffect: FaustDspMeta | null;\n private fAudioMixing!: number;\n private fAudioMixingHalf!: number;\n private fVoiceTable: FaustWebAudioDspVoice[];\n\n constructor(instance: FaustPolyDspInstance, sampleRate: number, sampleSize: number, bufferSize: number) {\n super(sampleSize, bufferSize);\n this.fInstance = instance;\n\n // Create JSON for voice\n this.fJSONDsp = JSON.parse(this.fInstance.voiceJSON);\n\n // Create JSON for effect\n this.fJSONEffect = (this.fInstance.effectAPI && this.fInstance.effectJSON) ? JSON.parse(this.fInstance.effectJSON) : null;\n\n // Setup GUI\n FaustBaseWebAudioDsp.parseUI(this.fJSONDsp.ui, this.fUICallback);\n if (this.fJSONEffect) FaustBaseWebAudioDsp.parseUI(this.fJSONEffect.ui, this.fUICallback);\n\n // Setup wasm memory\n this.fEndMemory = this.initMemory();\n\n // Init DSP voices\n this.fVoiceTable = [];\n for (let voice = 0; voice < this.fInstance.voices; voice++) {\n this.fVoiceTable.push(new FaustWebAudioDspVoice(\n this.fJSONDsp.size * voice,\n this.fInstance.voiceAPI,\n this.fInputsItems,\n this.fPathTable,\n sampleRate\n ));\n }\n\n // Init effect\n if (this.fInstance.effectAPI) this.fInstance.effectAPI.init(this.fEffect, sampleRate);\n }\n\n async init(context: BaseAudioContext | null): Promise<void> {\n\n // Init soundfiles memory is needed\n if (this.fSoundfiles.length > 0 && context) {\n\n // Create memory allocator for soundfiles in wasm memory, starting at the end of DSP memory\n const allocator = new WasmAllocator(this.fInstance.memory, this.fEndMemory);\n\n // Create soundfile reader\n const sfReader = new SoundfileReader(allocator, context, this.fPtrSize, this.fSampleSize);\n\n // Init soundfiles memory for all voices\n for (let voice = 0; voice < this.fInstance.voices; voice++) {\n await this.initSoundfileMemory(allocator, sfReader, this.fJSONDsp.size * voice);\n }\n }\n }\n\n private initMemory() {\n\n // Effet start at the end of all DSP voices\n this.fEffect = this.fJSONDsp.size * this.fInstance.voices;\n\n // Audio buffer start at the end of effect\n const $audio = this.fEffect + (this.fJSONEffect ? this.fJSONEffect.size : 0);\n\n // Setup audio pointers offset\n this.fAudioInputs = $audio;\n this.fAudioOutputs = this.fAudioInputs + this.getNumInputs() * this.fPtrSize;\n this.fAudioMixing = this.fAudioOutputs + this.getNumOutputs() * this.fPtrSize;\n this.fAudioMixingHalf = this.fAudioMixing + this.getNumOutputs() * this.fPtrSize;\n\n // Prepare wasm memory layout\n const $audioInputs = this.fAudioMixingHalf + this.getNumOutputs() * this.fPtrSize;\n const $audioOutputs = $audioInputs + this.getNumInputs() * this.fBufferSize * this.fSampleSize;\n const $audioMixing = $audioOutputs + this.getNumOutputs() * this.fBufferSize * this.fSampleSize;\n\n // Compute memory end in bytes\n const endMemory = $audioMixing + this.getNumOutputs() * this.fBufferSize * this.fSampleSize;\n\n // Setup Int32 and Real views of the memory\n const HEAP = this.fInstance.memory.buffer;\n const HEAP32 = new Int32Array(HEAP);\n const HEAPF = (this.fSampleSize === 4) ? new Float32Array(HEAP) : new Float64Array(HEAP);\n\n if (this.getNumInputs() > 0) {\n for (let chan = 0; chan < this.getNumInputs(); chan++) {\n HEAP32[(this.fAudioInputs >> 2) + chan] = $audioInputs + this.fBufferSize * this.fSampleSize * chan;\n }\n // Prepare Ins buffer tables\n const dspInChans = HEAP32.subarray(this.fAudioInputs >> 2, (this.fAudioInputs + this.getNumInputs() * this.fPtrSize) >> 2);\n for (let chan = 0; chan < this.getNumInputs(); chan++) {\n this.fInChannels[chan] = HEAPF.subarray(dspInChans[chan] >> Math.log2(this.fSampleSize), (dspInChans[chan] + this.fBufferSize * this.fSampleSize) >> Math.log2(this.fSampleSize));\n }\n }\n if (this.getNumOutputs() > 0) {\n for (let chan = 0; chan < this.getNumOutputs(); chan++) {\n HEAP32[(this.fAudioOutputs >> 2) + chan] = $audioOutputs + this.fBufferSize * this.fSampleSize * chan;\n HEAP32[(this.fAudioMixing >> 2) + chan] = $audioMixing + this.fBufferSize * this.fSampleSize * chan;\n HEAP32[(this.fAudioMixingHalf >> 2) + chan] = $audioMixing + this.fBufferSize * this.fSampleSize * chan + this.fBufferSize / 2 * this.fSampleSize;\n }\n // Prepare Out buffer tables\n const dspOutChans = HEAP32.subarray(this.fAudioOutputs >> 2, (this.fAudioOutputs + this.getNumOutputs() * this.fPtrSize) >> 2);\n for (let chan = 0; chan < this.getNumOutputs(); chan++) {\n this.fOutChannels[chan] = HEAPF.subarray(dspOutChans[chan] >> Math.log2(this.fSampleSize), (dspOutChans[chan] + this.fBufferSize * this.fSampleSize) >> Math.log2(this.fSampleSize));\n }\n }\n\n return endMemory;\n }\n\n toString() {\n return `============== Poly Memory layout ==============\n this.fBufferSize: ${this.fBufferSize}\n this.fJSONDsp.size: ${this.fJSONDsp.size}\n this.fAudioInputs: ${this.fAudioInputs}\n this.fAudioOutputs: ${this.fAudioOutputs}\n this.fAudioMixing: ${this.fAudioMixing}\n this.fAudioMixingHalf: ${this.fAudioMixingHalf}`;\n }\n\n private allocVoice(voice: number, type: number) {\n this.fVoiceTable[voice].fDate++;\n this.fVoiceTable[voice].fCurNote = type;\n return voice;\n }\n\n private getPlayingVoice(pitch: number) {\n let voicePlaying = FaustWebAudioDspVoice.kNoVoice;\n let oldestDatePlaying = Number.MAX_VALUE;\n\n for (let voice = 0; voice < this.fInstance.voices; voice++) {\n if (this.fVoiceTable[voice].fCurNote === pitch) {\n // Keeps oldest playing voice\n if (this.fVoiceTable[voice].fDate < oldestDatePlaying) {\n oldestDatePlaying = this.fVoiceTable[voice].fDate;\n voicePlaying = voice;\n }\n }\n }\n return voicePlaying;\n }\n\n private getFreeVoice() {\n for (let voice = 0; voice < this.fInstance.voices; voice++) {\n if (this.fVoiceTable[voice].fCurNote === FaustWebAudioDspVoice.kFreeVoice) {\n return this.allocVoice(voice, FaustWebAudioDspVoice.kActiveVoice);\n }\n }\n\n let voiceRelease = FaustWebAudioDspVoice.kNoVoice;\n let voicePlaying = FaustWebAudioDspVoice.kNoVoice;\n let oldestDateRelease = Number.MAX_VALUE;\n let oldestDatePlaying = Number.MAX_VALUE;\n\n for (let voice = 0; voice < this.fInstance.voices; voice++) { // Scan all voices\n // Try to steal a voice in DspVoice.kReleaseVoice mode...\n if (this.fVoiceTable[voice].fCurNote === FaustWebAudioDspVoice.kReleaseVoice) {\n // Keeps oldest release voice\n if (this.fVoiceTable[voice].fDate < oldestDateRelease) {\n oldestDateRelease = this.fVoiceTable[voice].fDate;\n voiceRelease = voice;\n }\n } else if (this.fVoiceTable[voice].fDate < oldestDatePlaying) {\n oldestDatePlaying = this.fVoiceTable[voice].fDate;\n voicePlaying = voice;\n }\n }\n // Then decide which one to steal\n if (oldestDateRelease !== Number.MAX_VALUE) {\n console.log(`Steal release voice : voice_date = ${this.fVoiceTable[voiceRelease].fDate} voice = ${voiceRelease}`);\n return this.allocVoice(voiceRelease, FaustWebAudioDspVoice.kLegatoVoice);\n }\n if (oldestDatePlaying !== Number.MAX_VALUE) {\n console.log(`Steal playing voice : voice_date = ${this.fVoiceTable[voicePlaying].fDate} voice = ${voicePlaying}`);\n return this.allocVoice(voicePlaying, FaustWebAudioDspVoice.kLegatoVoice);\n }\n return FaustWebAudioDspVoice.kNoVoice;\n }\n\n // Public API\n compute(input: Float32Array[], output: Float32Array[]) {\n\n // Check DSP state\n if (this.fDestroyed) return false;\n\n // Init memory again on first call (since WebAssembly.memory.grow() may have been called)\n if (this.fFirstCall) {\n this.initMemory();\n this.fFirstCall = false;\n }\n\n // Check Processing state: the node returns 'true' to stay in the graph, even if not processing\n if (!this.fProcessing) return true;\n\n // Check inputs\n if (this.getNumInputs() > 0 && (!input || !input[0] || input[0].length === 0)) {\n // console.log(\"Process input error\");\n return true;\n }\n\n // Check outputs\n if (this.getNumOutputs() > 0 && (!output || !output[0] || output[0].length === 0)) {\n // console.log(\"Process output error\");\n return true;\n }\n\n // Copy inputs\n if (input !== undefined) {\n for (let chan = 0; chan < Math.min(this.getNumInputs(), input.length); ++chan) {\n const dspInput = this.fInChannels[chan];\n dspInput.set(input[chan]);\n }\n }\n\n // Possibly call an externally given callback (for instance to synchronize playing a MIDIFile...)\n if (this.fComputeHandler) this.fComputeHandler(this.fBufferSize);\n\n // Compute\n this.fInstance.mixerAPI.clearOutput(this.fBufferSize, this.getNumOutputs(), this.fAudioOutputs);\n this.fVoiceTable.forEach((voice) => {\n if (voice.fCurNote === FaustWebAudioDspVoice.kLegatoVoice) {\n // Play from current note and next note\n voice.computeLegato(this.fBufferSize, this.fAudioInputs, this.fAudioMixing, this.fAudioMixingHalf);\n // FadeOut on first half buffer\n this.fInstance.mixerAPI.fadeOut(this.fBufferSize / 2, this.getNumOutputs(), this.fAudioMixing);\n // Mix it in result\n voice.fLevel = this.fInstance.mixerAPI.mixCheckVoice(this.fBufferSize, this.getNumOutputs(), this.fAudioMixing, this.fAudioOutputs);\n } else if (voice.fCurNote !== FaustWebAudioDspVoice.kFreeVoice) {\n // Compute current note\n voice.compute(this.fBufferSize, this.fAudioInputs, this.fAudioMixing);\n // Mix it in result\n voice.fLevel = this.fInstance.mixerAPI.mixCheckVoice(this.fBufferSize, this.getNumOutputs(), this.fAudioMixing, this.fAudioOutputs);\n // Check the level to possibly set the voice in kFreeVoice again\n voice.fRelease -= this.fBufferSize;\n if ((voice.fCurNote == FaustWebAudioDspVoice.kReleaseVoice) && ((voice.fLevel < FaustWebAudioDspVoice.VOICE_STOP_LEVEL) && (voice.fRelease < 0))) {\n voice.fCurNote = FaustWebAudioDspVoice.kFreeVoice;\n }\n }\n });\n if (this.fInstance.effectAPI) this.fInstance.effectAPI.compute(this.fEffect, this.fBufferSize, this.fAudioOutputs, this.fAudioOutputs);\n\n // Update bargraph\n this.updateOutputs();\n\n if (output !== undefined) {\n // Copy outputs\n for (let chan = 0; chan < Math.min(this.getNumOutputs(), output.length); chan++) {\n const dspOutput = this.fOutChannels[chan];\n output[chan].set(dspOutput);\n }\n\n // PlotHandler handling \n if (this.fPlotHandler) {\n this.fPlotHandler(output, this.fBufferNum++, (this.fCachedEvents.length ? this.fCachedEvents : undefined));\n this.fCachedEvents = [];\n }\n }\n\n return true;\n }\n\n getNumInputs() {\n return this.fInstance.voiceAPI.getNumInputs(0);\n }\n getNumOutputs() {\n return this.fInstance.voiceAPI.getNumOutputs(0);\n }\n\n private static findPath(o: any, p: string) {\n if (typeof o !== \"object\") {\n return false;\n } else if (o.address) {\n return (o.address === p);\n } else {\n for (const k in o) {\n if (FaustPolyWebAudioDsp.findPath(o[k], p)) return true;\n }\n return false;\n }\n }\n\n setParamValue(path: string, value: number) {\n if (this.fPlotHandler) this.fCachedEvents.push({ type: \"param\", data: { path, value } });\n if (this.fJSONEffect && FaustPolyWebAudioDsp.findPath(this.fJSONEffect.ui, path) && this.fInstance.effectAPI) {\n this.fInstance.effectAPI.setParamValue(this.fEffect, this.fPathTable[path], value);\n } else {\n this.fVoiceTable.forEach(voice => voice.setParamValue(this.fPathTable[path], value));\n }\n }\n getParamValue(path: string) {\n if (this.fJSONEffect && FaustPolyWebAudioDsp.findPath(this.fJSONEffect.ui, path) && this.fInstance.effectAPI) {\n return this.fInstance.effectAPI.getParamValue(this.fEffect, this.fPathTable[path]);\n } else {\n return this.fVoiceTable[0].getParamValue(this.fPathTable[path]);\n }\n }\n\n getMeta() {\n const o = this.fJSONDsp;\n const e = this.fJSONEffect;\n const r = { ...o };\n if (e) {\n r.ui = [{\n type: \"tgroup\", label: \"Sequencer\", items: [\n { type: \"vgroup\", label: \"Instrument\", items: o.ui },\n { type: \"vgroup\", label: \"Effect\", items: e.ui }\n ]\n }];\n } else {\n r.ui = [{\n type: \"tgroup\", label: \"Polyphonic\", items: [\n { type: \"vgroup\", label: \"Voices\", items: o.ui }\n ]\n }];\n }\n return r as FaustDspMeta;\n }\n\n getJSON() {\n return JSON.stringify(this.getMeta());\n }\n\n getUI() {\n return this.getMeta().ui;\n }\n\n getDescriptors() { return this.fDescriptor; }\n\n midiMessage(data: number[] | Uint8Array) {\n const cmd = data[0] >> 4;\n const channel = data[0] & 0xf;\n const data1 = data[1];\n const data2 = data[2];\n if (cmd === 8 || (cmd === 9 && data2 === 0)) return this.keyOff(channel, data1, data2);\n else if (cmd === 9) return this.keyOn(channel, data1, data2);\n else super.midiMessage(data);\n };\n\n ctrlChange(channel: number, ctrl: number, value: number) {\n if (ctrl === 123 || ctrl === 120) {\n this.allNotesOff(true);\n } else {\n super.ctrlChange(channel, ctrl, value);\n }\n }\n\n keyOn(channel: number, pitch: number, velocity: number) {\n if (this.fPlotHandler) this.fCachedEvents.push({ type: \"keyOn\", data: [channel, pitch, velocity] });\n const voice = this.getFreeVoice();\n this.fVoiceTable[voice].keyOn(pitch, velocity, this.fVoiceTable[voice].fCurNote == FaustWebAudioDspVoice.kLegatoVoice);\n }\n\n keyOff(channel: number, pitch: number, velocity: number) {\n if (this.fPlotHandler) this.fCachedEvents.push({ type: \"keyOff\", data: [channel, pitch, velocity] });\n const voice = this.getPlayingVoice(pitch);\n if (voice !== FaustWebAudioDspVoice.kNoVoice) {\n this.fVoiceTable[voice].keyOff();\n } else {\n console.log(\"Playing pitch = %d not found\\n\", pitch);\n }\n }\n\n allNotesOff(hard: boolean = true) {\n this.fCachedEvents.push({ type: \"ctrlChange\", data: [0, 123, 0] });\n this.fVoiceTable.forEach(voice => voice.keyOff(hard));\n }\n}\n", "import { ComputeHandler, FaustBaseWebAudioDsp, FaustMonoWebAudioDsp, FaustPolyWebAudioDsp, IFaustBaseWebAudioDsp, IFaustMonoWebAudioDsp, IFaustPolyWebAudioDsp, MetadataHandler, OutputParamHandler, PlotHandler } from \"./FaustWebAudioDsp\";\nimport { AudioParamDescriptor, FaustUIItem } from \"./types\";\n\n/**\n * For offline rendering.\n */\nexport interface IFaustOfflineProcessor extends IFaustBaseWebAudioDsp {\n render(inputs?: Float32Array[], length?: number, onUpdate?: (sample: number) => any): Float32Array[];\n}\n\nexport interface IFaustMonoOfflineProcessor extends IFaustOfflineProcessor, IFaustMonoWebAudioDsp {}\nexport interface IFaustPolyOfflineProcessor extends IFaustOfflineProcessor, IFaustPolyWebAudioDsp {}\n\nexport class FaustOfflineProcessor<Poly extends boolean = false> {\n protected fDSPCode!: Poly extends true ? FaustPolyWebAudioDsp : FaustMonoWebAudioDsp;\n\n protected fBufferSize: number;\n protected fInputs: Float32Array[];\n protected fOutputs: Float32Array[];\n\n constructor(instance: Poly extends true ? FaustPolyWebAudioDsp : FaustMonoWebAudioDsp, bufferSize: number) {\n this.fDSPCode = instance;\n this.fBufferSize = bufferSize;\n this.fInputs = new Array(this.fDSPCode.getNumInputs()).fill(null).map(() => new Float32Array(bufferSize));\n this.fOutputs = new Array(this.fDSPCode.getNumOutputs()).fill(null).map(() => new Float32Array(bufferSize));\n }\n\n // Public API\n\n getParameterDescriptors() {\n const params = [] as AudioParamDescriptor[];\n // Analyse voice JSON to generate AudioParam parameters\n const callback = (item: FaustUIItem) => {\n let param: AudioParamDescriptor | null = null;\n const polyKeywords = [\"/gate\", \"/freq\", \"/gain\", \"/key\", \"/vel\", \"/velocity\"];\n const isPolyReserved = \"address\" in item && !!polyKeywords.find(k => item.address.endsWith(k));\n if (this.fDSPCode instanceof FaustMonoWebAudioDsp || !isPolyReserved) {\n if (item.type === \"vslider\" || item.type === \"hslider\" || item.type === \"nentry\") {\n param = { name: item.address, defaultValue: item.init || 0, minValue: item.min || 0, maxValue: item.max || 0 };\n } else if (item.type === \"button\" || item.type === \"checkbox\") {\n param = { name: item.address, defaultValue: item.init || 0, minValue: 0, maxValue: 1 };\n }\n }\n if (param) params.push(param);\n }\n FaustBaseWebAudioDsp.parseUI(this.fDSPCode.getUI(), callback);\n return params;\n }\n compute(input: Float32Array[], output: Float32Array[]) { return this.fDSPCode.compute(input, output); }\n\n setOutputParamHandler(handler: OutputParamHandler) { this.fDSPCode.setOutputParamHandler(handler); }\n getOutputParamHandler() { return this.fDSPCode.getOutputParamHandler(); }\n\n setComputeHandler(handler: ComputeHandler) { this.fDSPCode.setComputeHandler(handler); }\n getComputeHandler() { return this.fDSPCode.getComputeHandler(); }\n\n setPlotHandler(handler: PlotHandler) { this.fDSPCode.setPlotHandler(handler); }\n getPlotHandler() { return this.fDSPCode.getPlotHandler(); }\n\n getNumInputs() { return this.fDSPCode.getNumInputs(); }\n getNumOutputs() { return this.fDSPCode.getNumOutputs(); }\n\n metadata(handler: MetadataHandler) { }\n\n midiMessage(data: number[] | Uint8Array) { this.fDSPCode.midiMessage(data); }\n\n ctrlChange(chan: number, ctrl: number, value: number) { this.fDSPCode.ctrlChange(chan, ctrl, value); }\n pitchWheel(chan: number, value: number) { this.fDSPCode.pitchWheel(chan, value); }\n\n setParamValue(path: string, value: number) { this.fDSPCode.setParamValue(path, value); }\n getParamValue(path: string) { return this.fDSPCode.getParamValue(path); }\n getParams() { return this.fDSPCode.getParams(); }\n\n getMeta() { return this.fDSPCode.getMeta(); }\n getJSON() { return this.fDSPCode.getJSON(); }\n getDescriptors() { return this.fDSPCode.getDescriptors(); }\n getUI() { return this.fDSPCode.getUI(); }\n\n start() { this.fDSPCode.start(); }\n stop() { this.fDSPCode.stop(); }\n\n destroy() { this.fDSPCode.destroy(); }\n\n /**\n * Render frames in an array.\n *\n * @param inputs - input signal\n * @param length - the number of frames to render (default: bufferSize)\n * @param onUpdate - a callback after each buffer calculated, with an argument \"current sample\"\n * @return an array of Float32Array with the rendered frames\n */\n render(inputs: Float32Array[] = [], length = this.fBufferSize, onUpdate?: (sample: number) => any): Float32Array[] {\n let l = 0;\n const outputs = new Array(this.fDSPCode.getNumOutputs()).fill(null).map(() => new Float32Array(length));\n // The node has to be started before rendering\n this.fDSPCode.start();\n while (l < length) {\n const sliceLength = Math.min(length - l, this.fBufferSize);\n for (let i = 0; i < this.fDSPCode.getNumInputs(); i++) {\n let input: Float32Array;\n if (inputs[i]) {\n if (inputs[i].length <= l) {\n input = new Float32Array(sliceLength);\n } else if (inputs[i].length > l + sliceLength) {\n input = inputs[i].subarray(l, l + sliceLength);\n } else {\n input = inputs[i].subarray(l, inputs[i].length);\n }\n } else {\n input = new Float32Array(sliceLength);\n }\n this.fInputs[i] = input;\n }\n this.fDSPCode.compute(this.fInputs, this.fOutputs);\n for (let i = 0; i < this.fDSPCode.getNumOutputs(); i++) {\n const output = this.fOutputs[i];\n if (sliceLength < this.fBufferSize) {\n outputs[i].set(output.subarray(0, sliceLength), l);\n } else {\n outputs[i].set(output, l);\n }\n }\n l += this.fBufferSize;\n onUpdate?.(l);\n }\n // The node can be stopped after rendering\n this.fDSPCode.stop();\n return outputs;\n }\n}\n\nexport class FaustMonoOfflineProcessor extends FaustOfflineProcessor<false> implements IFaustMonoWebAudioDsp {\n}\n\nexport class FaustPolyOfflineProcessor extends FaustOfflineProcessor<true> implements IFaustPolyWebAudioDsp {\n keyOn(channel: number, pitch: number, velocity: number) { this.fDSPCode.keyOn(channel, pitch, velocity); }\n keyOff(channel: number, pitch: number, velocity: number) { this.fDSPCode.keyOff(channel, pitch, velocity); }\n allNotesOff(hard: boolean) { this.fDSPCode.allNotesOff(hard); }\n}\n\nexport default FaustOfflineProcessor;\n", "import type FaustCompiler from \"./FaustCompiler\";\n\ninterface IFaustSvgDiagrams {\n /**\n * Generates auxiliary files from Faust code. The output depends on the compiler options.\n *\n * @param name - the DSP's name\n * @param code - Faust code\n * @param args - compilation args\n * @returns the svg diagrams as a filename - svg string map\n */\n from(name: string, code: string, args: string): Record<string, string>;\n}\n\nclass FaustSvgDiagrams implements IFaustSvgDiagrams {\n private compiler: FaustCompiler;\n\n constructor(compiler: FaustCompiler) {\n this.compiler = compiler;\n }\n\n from(name: string, code: string, args: string) {\n const fs = this.compiler.fs();\n try {\n const files: string[] = fs.readdir(`/${name}-svg/`);\n files.filter(file => file !== \".\" && file !== \"..\").forEach(file => fs.unlink(`/${name}-svg/${file}`));\n } catch { }\n const success = this.compiler.generateAuxFiles(name, code, `-lang wasm -o binary -svg ${args}`);\n if (!success) throw new Error(this.compiler.getErrorMessage());\n const svgs: Record<string, string> = {};\n const files: string[] = fs.readdir(`/${name}-svg/`);\n files.filter(file => file !== \".\" && file !== \"..\").forEach(file => svgs[file] = fs.readFile(`/${name}-svg/${file}`, { encoding: \"utf8\" }) as string);\n return svgs;\n }\n}\n\nexport default FaustSvgDiagrams;\n", "import type LibFaust from \"./LibFaust\";\n\ninterface IFaustCmajor {\n /**\n * Generates auxiliary files from Faust code. The output depends on the compiler options.\n *\n * @param name - the DSP's name\n * @param code - Faust code\n * @param args - compilation args\n * @returns the Cmajor compiled string\n */\n compile(name: string, code: string, args: string): string;\n}\n\nclass FaustCmajor implements IFaustCmajor {\n private fLibFaust: LibFaust;\n\n constructor(libfaust: LibFaust) {\n this.fLibFaust = libfaust;\n }\n\n compile(name: string, code: string, args: string) {\n const fs = this.fLibFaust.fs();\n const success = this.fLibFaust.generateAuxFiles(name, code, `-lang cmajor-hybrid -cn ${name} -o ${name}.cmajor`);\n return (success) ? fs.readFile(`${name}.cmajor`, { encoding: \"utf8\" }) as string : \"\";\n }\n}\n\nexport default FaustCmajor;\n", "import type { FaustModule, LibFaustWasm, FaustInfoType } from \"./types\";\n\nexport interface ILibFaust extends LibFaustWasm {\n module(): FaustModule;\n fs(): typeof FS;\n}\n\nclass LibFaust implements ILibFaust {\n private fModule: FaustModule;\n private fCompiler: LibFaustWasm;\n private fFileSystem: typeof FS;\n\n constructor(module: FaustModule) {\n this.fModule = module;\n this.fCompiler = new module.libFaustWasm();\n this.fFileSystem = this.fModule.FS;\n }\n module() {\n return this.fModule;\n }\n fs() {\n return this.fFileSystem;\n }\n version() {\n return this.fCompiler.version();\n }\n createDSPFactory(name: string, code: string, args: string, useInternalMemory: boolean) {\n return this.fCompiler.createDSPFactory(name, code, args, useInternalMemory);\n }\n deleteDSPFactory(cFactory: number) {\n return this.fCompiler.deleteDSPFactory(cFactory);\n }\n expandDSP(name: string, code: string, args: string) {\n return this.fCompiler.expandDSP(name, code, args);\n }\n generateAuxFiles(name: string, code: string, args: string) {\n return this.fCompiler.generateAuxFiles(name, code, args);\n }\n deleteAllDSPFactories() {\n return this.fCompiler.deleteAllDSPFactories();\n }\n getErrorAfterException() {\n return this.fCompiler.getErrorAfterException();\n }\n cleanupAfterException() {\n return this.fCompiler.cleanupAfterException();\n }\n getInfos(what: FaustInfoType) {\n return this.fCompiler.getInfos(what);\n }\n toString() {\n return `LibFaust module: ${this.fModule}, compiler: ${this.fCompiler}`;\n }\n\n}\n\nexport default LibFaust;\n", "export interface WavEncoderOptions {\n bitDepth: number;\n float?: boolean;\n symmetric?: boolean;\n shared?: boolean;\n sampleRate: number;\n}\ninterface Format {\n formatId: number;\n float: boolean;\n symmetric: boolean;\n numberOfChannels: number;\n sampleRate: number;\n length: number;\n bitDepth: number;\n byteDepth: number;\n}\n\n/**\n * Code from https://github.com/mohayonao/wav-encoder\n */\nclass WavEncoder {\n static encode(audioBuffer: Float32Array[], options: WavEncoderOptions) {\n const numberOfChannels = audioBuffer.length;\n const length = audioBuffer[0].length;\n const { shared, float } = options;\n const bitDepth = float ? 32 : ((options.bitDepth | 0) || 16);\n const byteDepth = bitDepth >> 3;\n const byteLength = length * numberOfChannels * byteDepth;\n // eslint-disable-next-line no-undef\n const AB = shared ? (globalThis.SharedArrayBuffer || globalThis.ArrayBuffer) : globalThis.ArrayBuffer;\n const ab = new AB((44 + byteLength) * Uint8Array.BYTES_PER_ELEMENT);\n const dataView = new DataView(ab);\n const writer = new Writer(dataView);\n const format: Format = {\n formatId: float ? 0x0003 : 0x0001,\n float: !!float,\n numberOfChannels,\n sampleRate: options.sampleRate,\n symmetric: !!options.symmetric,\n length,\n bitDepth,\n byteDepth\n };\n this.writeHeader(writer, format);\n this.writeData(writer, audioBuffer, format);\n return ab;\n }\n private static writeHeader(writer: Writer, format: Format) {\n const { formatId, sampleRate, bitDepth, numberOfChannels, length, byteDepth } = format;\n writer.string(\"RIFF\");\n writer.uint32(writer.dataView.byteLength - 8);\n writer.string(\"WAVE\");\n writer.string(\"fmt \");\n writer.uint32(16);\n writer.uint16(formatId);\n writer.uint16(numberOfChannels);\n writer.uint32(sampleRate);\n writer.uint32(sampleRate * numberOfChannels * byteDepth);\n writer.uint16(numberOfChannels * byteDepth);\n writer.uint16(bitDepth);\n writer.string(\"data\");\n writer.uint32(length * numberOfChannels * byteDepth);\n return writer.pos;\n }\n private static writeData(writer: Writer, audioBuffer: Float32Array[], format: Format) {\n const { bitDepth, float, length, numberOfChannels, symmetric } = format;\n if (bitDepth === 32 && float) {\n const { dataView, pos } = writer;\n const ab = dataView.buffer;\n const f32View = new Float32Array(ab, pos);\n if (numberOfChannels === 1) {\n f32View.set(audioBuffer[0]);\n return;\n }\n for (let ch = 0; ch < numberOfChannels; ch++) {\n const channel = audioBuffer[ch];\n for (let i = 0; i < length; i++) {\n f32View[i * numberOfChannels + ch] = channel[i];\n }\n }\n return;\n }\n const encoderOption = float ? \"f\" : symmetric ? \"s\" : \"\";\n const methodName = \"pcm\" + bitDepth + encoderOption;\n\n if (!(writer as any)[methodName]) {\n throw new TypeError(\"Not supported bit depth: \" + bitDepth);\n }\n\n const write: (value: number) => void = (writer as any)[methodName].bind(writer);\n\n for (let i = 0; i < length; i++) {\n for (let j = 0; j < numberOfChannels; j++) {\n write(audioBuffer[j][i]);\n }\n }\n }\n}\n\nclass Writer {\n pos = 0;\n dataView: DataView;\n constructor(dataView: DataView) {\n this.dataView = dataView;\n }\n int16(value: number) {\n this.dataView.setInt16(this.pos, value, true);\n this.pos += 2;\n }\n uint16(value: number) {\n this.dataView.setUint16(this.pos, value, true);\n this.pos += 2;\n }\n uint32(value: number) {\n this.dataView.setUint32(this.pos, value, true);\n this.pos += 4;\n }\n string(value: string) {\n for (let i = 0, imax = value.length; i < imax; i++) {\n this.dataView.setUint8(this.pos++, value.charCodeAt(i));\n }\n }\n pcm8(valueIn: number) {\n let value = valueIn;\n value = Math.max(-1, Math.min(value, +1));\n value = (value * 0.5 + 0.5) * 255;\n value = Math.round(value) | 0;\n this.dataView.setUint8(this.pos, value/* , true*/);\n this.pos += 1;\n }\n pcm8s(valueIn: number) {\n let value = valueIn;\n value = Math.round(value * 128) + 128;\n value = Math.max(0, Math.min(value, 255));\n this.dataView.setUint8(this.pos, value/* , true*/);\n this.pos += 1;\n }\n pcm16(valueIn: number) {\n let value = valueIn;\n value = Math.max(-1, Math.min(value, +1));\n value = value < 0 ? value * 32768 : value * 32767;\n value = Math.round(value) | 0;\n this.dataView.setInt16(this.pos, value, true);\n this.pos += 2;\n }\n pcm16s(valueIn: number) {\n let value = valueIn;\n value = Math.round(value * 32768);\n value = Math.max(-32768, Math.min(value, 32767));\n this.dataView.setInt16(this.pos, value, true);\n this.pos += 2;\n }\n pcm24(valueIn: number) {\n let value = valueIn;\n value = Math.max(-1, Math.min(value, +1));\n value = value < 0 ? 0x1000000 + value * 8388608 : value * 8388607;\n value = Math.round(value) | 0;\n\n const x0 = (value >> 0) & 0xFF;\n const x1 = (value >> 8) & 0xFF;\n const x2 = (value >> 16) & 0xFF;\n\n this.dataView.setUint8(this.pos + 0, x0);\n this.dataView.setUint8(this.pos + 1, x1);\n this.dataView.setUint8(this.pos + 2, x2);\n this.pos += 3;\n }\n pcm24s(valueIn: number) {\n let value = valueIn;\n value = Math.round(value * 8388608);\n value = Math.max(-8388608, Math.min(value, 8388607));\n\n const x0 = (value >> 0) & 0xFF;\n const x1 = (value >> 8) & 0xFF;\n const x2 = (value >> 16) & 0xFF;\n\n this.dataView.setUint8(this.pos + 0, x0);\n this.dataView.setUint8(this.pos + 1, x1);\n this.dataView.setUint8(this.pos + 2, x2);\n this.pos += 3;\n }\n pcm32(valueIn: number) {\n let value = valueIn;\n value = Math.max(-1, Math.min(value, +1));\n value = value < 0 ? value * 2147483648 : value * 2147483647;\n value = Math.round(value) | 0;\n this.dataView.setInt32(this.pos, value, true);\n this.pos += 4;\n }\n pcm32s(valueIn: number) {\n let value = valueIn;\n value = Math.round(value * 2147483648);\n value = Math.max(-2147483648, Math.min(value, +2147483647));\n this.dataView.setInt32(this.pos, value, true);\n this.pos += 4;\n }\n pcm32f(value: number) {\n this.dataView.setFloat32(this.pos, value, true);\n this.pos += 4;\n }\n}\n\nexport default WavEncoder;\n", "export interface WavDecoderOptions {\n symmetric?: boolean;\n shared?: boolean;\n}\ninterface Format {\n formatId: number;\n float: boolean;\n numberOfChannels: number;\n sampleRate: number;\n byteRate: number;\n blockSize: number;\n bitDepth: number;\n}\n\n/**\n * Code from https://github.com/mohayonao/wav-decoder\n */\nclass WavDecoder {\n static decode(buffer: ArrayBuffer, options?: WavDecoderOptions) {\n const dataView = new DataView(buffer);\n const reader = new Reader(dataView);\n if (reader.string(4) !== \"RIFF\") {\n throw new TypeError(\"Invalid WAV file\");\n }\n reader.uint32(); // skip file length\n if (reader.string(4) !== \"WAVE\") {\n throw new TypeError(\"Invalid WAV file\");\n }\n let format: Format | null = null;\n let audioData: {\n numberOfChannels: number;\n length: number;\n sampleRate: number;\n channelData: Float32Array[];\n } | null = null;\n do {\n const chunkType = reader.string(4);\n const chunkSize = reader.uint32();\n if (chunkType === \"fmt \") {\n format = this.decodeFormat(reader, chunkSize);\n } else if (chunkType === \"data\") {\n audioData = this.decodeData(reader, chunkSize, format as Format, options || {});\n } else {\n reader.skip(chunkSize);\n }\n } while (audioData === null);\n return audioData;\n }\n private static decodeFormat(reader: Reader, chunkSize: number) {\n const formats = {\n 0x0001: \"lpcm\",\n 0x0003: \"lpcm\"\n };\n const formatId = reader.uint16();\n if (!formats.hasOwnProperty(formatId)) {\n throw new TypeError(\"Unsupported format in WAV file: 0x\" + formatId.toString(16));\n }\n const format: Format = {\n formatId: formatId,\n float: formatId === 0x0003,\n numberOfChannels: reader.uint16(),\n sampleRate: reader.uint32(),\n byteRate: reader.uint32(),\n blockSize: reader.uint16(),\n bitDepth: reader.uint16()\n };\n reader.skip(chunkSize - 16);\n return format;\n }\n private static decodeData(reader: Reader, chunkSizeIn: number, format: Format, options: WavDecoderOptions) {\n const chunkSize = Math.min(chunkSizeIn, reader.remain());\n const length = Math.floor(chunkSize / format.blockSize);\n const numberOfChannels = format.numberOfChannels;\n const sampleRate = format.sampleRate;\n const channelData: Float32Array[] = new Array(numberOfChannels);\n for (let ch = 0; ch < numberOfChannels; ch++) {\n const AB = options.shared ? (globalThis.SharedArrayBuffer || globalThis.ArrayBuffer) : globalThis.ArrayBuffer;\n const ab = new AB(length * Float32Array.BYTES_PER_ELEMENT);\n channelData[ch] = new Float32Array(ab);\n }\n this.readPCM(reader, channelData, length, format, options);\n return {\n numberOfChannels,\n length,\n sampleRate,\n channelData\n };\n }\n private static readPCM(reader: Reader, channelData: Float32Array[], length: number, format: Format, options: WavDecoderOptions) {\n const bitDepth = format.bitDepth;\n const decoderOption = format.float ? \"f\" : options.symmetric ? \"s\" : \"\";\n const methodName = \"pcm\" + bitDepth + decoderOption as `pcm${8 | 16 | 32}${\"f\" | \"s\" | \"\"}`;\n if (!(reader as any)[methodName]) {\n throw new TypeError(\"Not supported bit depth: \" + format.bitDepth);\n }\n const read: () => number = (reader as any)[methodName].bind(reader);\n const numberOfChannels = format.numberOfChannels;\n for (let i = 0; i < length; i++) {\n for (let ch = 0; ch < numberOfChannels; ch++) {\n channelData[ch][i] = read();\n }\n }\n }\n}\n\nclass Reader {\n pos = 0;\n dataView: DataView;\n constructor(dataView: DataView) {\n this.dataView = dataView;\n }\n remain() {\n return this.dataView.byteLength - this.pos;\n }\n skip(n: number) {\n this.pos += n;\n }\n uint8() {\n const data = this.dataView.getUint8(this.pos);\n this.pos += 1;\n return data;\n }\n int16() {\n const data = this.dataView.getInt16(this.pos, true);\n this.pos += 2;\n return data;\n }\n uint16() {\n const data = this.dataView.getUint16(this.pos, true);\n this.pos += 2;\n return data;\n }\n uint32() {\n const data = this.dataView.getUint32(this.pos, true);\n this.pos += 4;\n return data;\n }\n string(n: number) {\n let data = \"\";\n for (let i = 0; i < n; i++) {\n data += String.fromCharCode(this.uint8());\n }\n return data;\n }\n pcm8() {\n const data = this.dataView.getUint8(this.pos) - 128;\n this.pos += 1;\n return data < 0 ? data / 128 : data / 127;\n }\n pcm8s() {\n const data = this.dataView.getUint8(this.pos) - 127.5;\n this.pos += 1;\n return data / 127.5;\n }\n pcm16() {\n const data = this.dataView.getInt16(this.pos, true);\n this.pos += 2;\n return data < 0 ? data / 32768 : data / 32767;\n }\n pcm16s() {\n const data = this.dataView.getInt16(this.pos, true);\n this.pos += 2;\n return data / 32768;\n }\n pcm24() {\n const x0 = this.dataView.getUint8(this.pos + 0);\n const x1 = this.dataView.getUint8(this.pos + 1);\n const x2 = this.dataView.getUint8(this.pos + 2);\n const xx = (x0 + (x1 << 8) + (x2 << 16));\n\n const data = xx > 0x800000 ? xx - 0x1000000 : xx;\n this.pos += 3;\n return data < 0 ? data / 8388608 : data / 8388607;\n }\n pcm24s() {\n const x0 = this.dataView.getUint8(this.pos + 0);\n const x1 = this.dataView.getUint8(this.pos + 1);\n const x2 = this.dataView.getUint8(this.pos + 2);\n const xx = (x0 + (x1 << 8) + (x2 << 16));\n\n const data = xx > 0x800000 ? xx - 0x1000000 : xx;\n this.pos += 3;\n return data / 8388608;\n }\n pcm32() {\n const data = this.dataView.getInt32(this.pos, true);\n this.pos += 4;\n return data < 0 ? data / 2147483648 : data / 2147483647;\n }\n pcm32s() {\n const data = this.dataView.getInt32(this.pos, true);\n this.pos += 4;\n return data / 2147483648;\n }\n pcm32f() {\n const data = this.dataView.getFloat32(this.pos, true);\n this.pos += 4;\n return data;\n }\n pcm64f() {\n const data = this.dataView.getFloat64(this.pos, true);\n this.pos += 8;\n return data;\n }\n}\n\nexport default WavDecoder;\n", "import { OutputParamHandler, ComputeHandler, PlotHandler, UIHandler, MetadataHandler, FaustBaseWebAudioDsp, IFaustMonoWebAudioDsp, IFaustPolyWebAudioDsp } from \"./FaustWebAudioDsp\";\nimport type { FaustAudioWorkletNodeOptions } from \"./FaustAudioWorkletProcessor\";\nimport type { LooseFaustDspFactory, FaustDspMeta, FaustUIInputItem, FaustUIItem } from \"./types\";\n\n/**\n * Base class for Monophonic and Polyphonic AudioWorkletNode\n */\nexport class FaustAudioWorkletNode<Poly extends boolean = false> extends (globalThis.AudioWorkletNode || null) {\n\n protected fJSONDsp: FaustDspMeta;\n protected fJSON: string;\n protected fInputsItems: string[];\n protected fOutputHandler: OutputParamHandler | null;\n protected fComputeHandler: ComputeHandler | null;\n protected fPlotHandler: PlotHandler | null;\n protected fUICallback: UIHandler;\n protected fDescriptor: FaustUIInputItem[];\n\n constructor(context: BaseAudioContext, name: string, factory: LooseFaustDspFactory, options: FaustAudioWorkletNodeOptions<Poly>[\"processorOptions\"], nodeOptions: Partial<FaustAudioWorkletNodeOptions> = {}) {\n\n // Create JSON object\n const JSONObj: FaustDspMeta = JSON.parse(factory.json);\n\n // Create proxy FaustAudioWorkletProcessor\n super(context, name, {\n numberOfInputs: JSONObj.inputs > 0 ? 1 : 0,\n numberOfOutputs: JSONObj.outputs > 0 ? 1 : 0,\n channelCount: Math.max(1, JSONObj.inputs),\n outputChannelCount: [JSONObj.outputs],\n channelCountMode: \"explicit\",\n channelInterpretation: \"speakers\",\n processorOptions: options,\n ...nodeOptions\n });\n\n this.fJSONDsp = JSONObj;\n this.fJSON = factory.json;\n this.fOutputHandler = null;\n this.fComputeHandler = null;\n this.fPlotHandler = null;\n this.fDescriptor = [];\n\n // Parse UI\n this.fInputsItems = [];\n this.fUICallback = (item: FaustUIItem) => {\n if (item.type === \"vslider\" || item.type === \"hslider\" || item.type === \"button\" || item.type === \"checkbox\" || item.type === \"nentry\") {\n // Keep inputs adresses\n this.fInputsItems.push(item.address);\n this.fDescriptor.push(item);\n }\n }\n FaustBaseWebAudioDsp.parseUI(this.fJSONDsp.ui, this.fUICallback);\n\n // Patch it with additional functions\n this.port.onmessage = (e: MessageEvent) => {\n if (e.data.type === \"param\" && this.fOutputHandler) {\n this.fOutputHandler(e.data.path, e.data.value);\n } else if (e.data.type === \"plot\" && this.fPlotHandler) {\n this.fPlotHandler(e.data.value, e.data.index, e.data.events);\n }\n };\n }\n\n // Public API\n setOutputParamHandler(handler: OutputParamHandler | null) {\n this.fOutputHandler = handler;\n }\n getOutputParamHandler() {\n return this.fOutputHandler;\n }\n\n setComputeHandler(handler: ComputeHandler | null) {\n this.fComputeHandler = handler;\n }\n getComputeHandler(): ComputeHandler | null {\n return this.fComputeHandler;\n }\n\n setPlotHandler(handler: PlotHandler | null) {\n this.fPlotHandler = handler;\n // Set PlotHandler on processor side\n if (this.fPlotHandler) {\n this.port.postMessage({ type: \"setPlotHandler\", data: true });\n } else {\n this.port.postMessage({ type: \"setPlotHandler\", data: false });\n }\n }\n getPlotHandler(): PlotHandler | null {\n return this.fPlotHandler;\n }\n\n getNumInputs() {\n return this.fJSONDsp.inputs;\n }\n getNumOutputs() {\n return this.fJSONDsp.outputs;\n }\n\n // Implemented in subclasses\n compute(inputs: Float32Array[], outputs: Float32Array[]) {\n return false;\n }\n\n metadata(handler: MetadataHandler) {\n if (this.fJSONDsp.meta) {\n this.fJSONDsp.meta.forEach(meta => handler(Object.keys(meta)[0], meta[Object.keys(meta)[0]]));\n }\n }\n\n midiMessage(data: number[] | Uint8Array): void {\n const cmd = data[0] >> 4;\n const channel = data[0] & 0xf;\n const data1 = data[1];\n const data2 = data[2];\n if (cmd === 11) this.ctrlChange(channel, data1, data2);\n else if (cmd === 14) this.pitchWheel(channel, data2 * 128.0 + data1);\n else this.port.postMessage({ type: \"midi\", data: data });\n }\n\n ctrlChange(channel: number, ctrl: number, value: number) {\n const e = { type: \"ctrlChange\", data: [channel, ctrl, value] };\n this.port.postMessage(e);\n }\n pitchWheel(channel: number, wheel: number) {\n const e = { type: \"pitchWheel\", data: [channel, wheel] };\n this.port.postMessage(e);\n }\n\n setParamValue(path: string, value: number) {\n const e = { type: \"param\", data: { path, value } };\n this.port.postMessage(e);\n // Set value on AudioParam (but this is not used on Processor side for now)\n const param = this.parameters.get(path);\n if (param) param.setValueAtTime(value, this.context.currentTime);\n\n }\n getParamValue(path: string) {\n // Get value of AudioParam\n const param = this.parameters.get(path);\n return (param) ? param.value : 0;\n }\n\n getParams() { return this.fInputsItems; }\n getMeta() { return this.fJSONDsp; }\n getJSON() { return JSON.stringify(this.getMeta()); }\n getUI() { return this.fJSONDsp.ui; }\n getDescriptors() { return this.fDescriptor; }\n\n start() {\n this.port.postMessage({ type: \"start\" });\n }\n\n stop() {\n this.port.postMessage({ type: \"stop\" });\n }\n\n destroy() {\n this.port.postMessage({ type: \"destroy\" });\n this.port.close();\n }\n}\n\n/**\n * Monophonic AudioWorkletNode\n */\nexport class FaustMonoAudioWorkletNode extends FaustAudioWorkletNode<false> implements IFaustMonoWebAudioDsp {\n\n onprocessorerror = (e: Event) => {\n // console.error(\"Error from \" + this.fJSONDsp.name + \" FaustMonoAudioWorkletNode\");\n throw e;\n }\n\n constructor(context: BaseAudioContext, name: string, factory: LooseFaustDspFactory, sampleSize: number, nodeOptions: Partial<FaustAudioWorkletNodeOptions> = {}) {\n super(context, name, factory, { name, factory, sampleSize }, nodeOptions);\n }\n}\n\n/**\n * Polyphonic AudioWorkletNode\n */\nexport class FaustPolyAudioWorkletNode extends FaustAudioWorkletNode<true> implements IFaustPolyWebAudioDsp {\n\n private fJSONEffect: FaustDspMeta | null;\n\n onprocessorerror = (e: Event) => {\n // console.error(\"Error from \" + this.fJSONDsp.name + \" FaustPolyAudioWorkletNode\");\n throw e;\n }\n\n constructor(context: BaseAudioContext,\n name: string,\n voiceFactory: LooseFaustDspFactory,\n mixerModule: WebAssembly.Module,\n voices: number,\n sampleSize: number,\n effectFactory?: LooseFaustDspFactory, nodeOptions: Partial<FaustAudioWorkletNodeOptions> = {}) {\n\n super(\n context,\n name,\n voiceFactory,\n {\n name,\n voiceFactory,\n mixerModule,\n voices,\n sampleSize,\n effectFactory\n },\n nodeOptions\n );\n\n this.fJSONEffect = effectFactory ? JSON.parse(effectFactory.json) : null;\n\n if (this.fJSONEffect) {\n FaustBaseWebAudioDsp.parseUI(this.fJSONEffect.ui, this.fUICallback);\n }\n }\n\n // Public API\n keyOn(channel: number, pitch: number, velocity: number) {\n const e = { type: \"keyOn\", data: [channel, pitch, velocity] };\n this.port.postMessage(e);\n }\n\n keyOff(channel: number, pitch: number, velocity: number) {\n const e = { type: \"keyOff\", data: [channel, pitch, velocity] };\n this.port.postMessage(e);\n }\n\n allNotesOff(hard: boolean) {\n const e = { type: \"ctrlChange\", data: [0, 123, 0] };\n this.port.postMessage(e);\n }\n\n getMeta() {\n const o = this.fJSONDsp;\n const e = this.fJSONEffect;\n const r = { ...o };\n if (e) {\n r.ui = [{\n type: \"tgroup\", label: \"Sequencer\", items: [\n { type: \"vgroup\", label: \"Instrument\", items: o.ui },\n { type: \"vgroup\", label: \"Effect\", items: e.ui }\n ]\n }];\n } else {\n r.ui = [{\n type: \"tgroup\", label: \"Polyphonic\", items: [\n { type: \"vgroup\", label: \"Voices\", items: o.ui }\n ]\n }];\n }\n return r as FaustDspMeta;\n }\n\n getJSON() {\n return JSON.stringify(this.getMeta());\n }\n\n getUI() {\n return this.getMeta().ui;\n }\n}\n", "import type { ComputeHandler, FaustMonoWebAudioDsp, FaustPolyWebAudioDsp, IFaustMonoWebAudioDsp, IFaustPolyWebAudioDsp, MetadataHandler, OutputParamHandler, PlotHandler } from \"./FaustWebAudioDsp\";\n\n/**\n * Base class for Monophonic and Polyphonic ScriptProcessorNode\n */\nexport class FaustScriptProcessorNode<Poly extends boolean = false> extends (globalThis.ScriptProcessorNode || null) {\n protected fDSPCode!: Poly extends true ? FaustPolyWebAudioDsp : FaustMonoWebAudioDsp;\n\n // Needed for ScriptProcessorNode\n protected fInputs!: Float32Array[];\n protected fOutputs!: Float32Array[];\n\n init(instance: Poly extends true ? FaustPolyWebAudioDsp : FaustMonoWebAudioDsp) {\n this.fDSPCode = instance;\n\n this.fInputs = new Array(this.fDSPCode.getNumInputs());\n this.fOutputs = new Array(this.fDSPCode.getNumOutputs());\n\n this.onaudioprocess = (e) => {\n\n // Read inputs\n for (let chan = 0; chan < this.fDSPCode.getNumInputs(); chan++) {\n this.fInputs[chan] = e.inputBuffer.getChannelData(chan);\n }\n\n // Read outputs\n for (let chan = 0; chan < this.fDSPCode.getNumOutputs(); chan++) {\n this.fOutputs[chan] = e.outputBuffer.getChannelData(chan);\n }\n\n return this.fDSPCode.compute(this.fInputs, this.fOutputs);\n }\n\n this.start();\n }\n // Public API\n compute(input: Float32Array[], output: Float32Array[]) { return this.fDSPCode.compute(input, output); }\n\n setOutputParamHandler(handler: OutputParamHandler) { this.fDSPCode.setOutputParamHandler(handler); }\n getOutputParamHandler() { return this.fDSPCode.getOutputParamHandler(); }\n\n setComputeHandler(handler: ComputeHandler) { this.fDSPCode.setComputeHandler(handler); }\n getComputeHandler() { return this.fDSPCode.getComputeHandler(); }\n\n setPlotHandler(handler: PlotHandler) { this.fDSPCode.setPlotHandler(handler); }\n getPlotHandler() { return this.fDSPCode.getPlotHandler(); }\n\n getNumInputs() { return this.fDSPCode.getNumInputs(); }\n getNumOutputs() { return this.fDSPCode.getNumOutputs(); }\n\n metadata(handler: MetadataHandler) { }\n\n midiMessage(data: number[] | Uint8Array) { this.fDSPCode.midiMessage(data); }\n\n ctrlChange(chan: number, ctrl: number, value: number) { this.fDSPCode.ctrlChange(chan, ctrl, value); }\n pitchWheel(chan: number, value: number) { this.fDSPCode.pitchWheel(chan, value); }\n\n setParamValue(path: string, value: number) { this.fDSPCode.setParamValue(path, value); }\n getParamValue(path: string) { return this.fDSPCode.getParamValue(path); }\n getParams() { return this.fDSPCode.getParams(); }\n\n getMeta() { return this.fDSPCode.getMeta(); }\n getJSON() { return this.fDSPCode.getJSON(); }\n getDescriptors() { return this.fDSPCode.getDescriptors(); }\n getUI() { return this.fDSPCode.getUI(); }\n\n start() { this.fDSPCode.start(); }\n stop() { this.fDSPCode.stop(); }\n\n destroy() { this.fDSPCode.destroy(); }\n}\n\nexport class FaustMonoScriptProcessorNode extends FaustScriptProcessorNode<false> implements IFaustMonoWebAudioDsp {\n}\n\nexport class FaustPolyScriptProcessorNode extends FaustScriptProcessorNode<true> implements IFaustPolyWebAudioDsp {\n keyOn(channel: number, pitch: number, velocity: number) { this.fDSPCode.keyOn(channel, pitch, velocity); }\n keyOff(channel: number, pitch: number, velocity: number) { this.fDSPCode.keyOff(channel, pitch, velocity); }\n allNotesOff(hard: boolean) { this.fDSPCode.allNotesOff(hard); }\n}\n", "import { FaustMonoAudioWorkletNode, FaustPolyAudioWorkletNode } from \"./FaustAudioWorkletNode\";\nimport getFaustAudioWorkletProcessor, { FaustData } from \"./FaustAudioWorkletProcessor\";\nimport getFaustFFTAudioWorkletProcessor, { FaustFFTData, FaustFFTOptionsData } from \"./FaustFFTAudioWorkletProcessor\";\nimport { FaustDspInstance } from \"./FaustDspInstance\";\nimport FaustWasmInstantiator from \"./FaustWasmInstantiator\";\nimport { FaustMonoOfflineProcessor, FaustPolyOfflineProcessor, IFaustMonoOfflineProcessor, IFaustPolyOfflineProcessor } from \"./FaustOfflineProcessor\";\nimport { FaustMonoScriptProcessorNode, FaustPolyScriptProcessorNode } from \"./FaustScriptProcessorNode\";\nimport { FaustBaseWebAudioDsp, FaustMonoWebAudioDsp, FaustPolyWebAudioDsp, FaustWebAudioDspVoice, IFaustMonoWebAudioNode, IFaustPolyWebAudioNode } from \"./FaustWebAudioDsp\";\nimport type { IFaustCompiler } from \"./FaustCompiler\";\nimport type { FaustDspFactory, FaustUIDescriptor, FaustDspMeta, FFTUtils, LooseFaustDspFactory } from \"./types\";\n\nexport interface IFaustMonoDspGenerator {\n /**\n * Compile a monophonic DSP factory from given code.\n * \n * @param compiler - the Faust compiler\n * @param name - the DSP name\n * @param code - the DSP code\n * @param args - the compilation parameters\n * @returns the compiled factory or 'null' if failure\n */\n compile(compiler: IFaustCompiler, name: string, code: string, args: string): Promise<{\n factory: FaustDspFactory | null;\n name?: string;\n meta?: FaustDspMeta;\n } | null>;\n\n /**\n * Create a monophonic WebAudio node (either ScriptProcessorNode or AudioWorkletNode).\n *\n * @param context - the WebAudio context\n * @param name - DSP name, can be used for processorName\n * @param factory - default is the compiled factory\n * @param sp - whether to compile a ScriptProcessorNode or an AudioWorkletNode\n * @param bufferSize - the buffer size in frames to be used in ScriptProcessorNode only, since AudioWorkletNode always uses 128 frames\n * @param processorName - AudioWorklet Processor name\n * @returns the compiled WebAudio node or 'null' if failure\n */\n createNode(\n context: BaseAudioContext,\n name?: string,\n factory?: LooseFaustDspFactory,\n sp?: boolean,\n bufferSize?: number,\n processorName?: string\n ): Promise<IFaustMonoWebAudioNode | null>;\n\n /**\n * Create a monophonic WebAudio node (either ScriptProcessorNode or AudioWorkletNode).\n *\n * @param context - the WebAudio context\n * @param fftUtils - should be an anonymous class with static methods, without any import from outside\n * @param name - DSP name, can be used for processorName\n * @param factory - default is the compiled factory\n * @param fftOptions - initial FFT options\n * @param processorName - AudioWorklet Processor name\n * @returns the compiled WebAudio node or 'null' if failure\n */\n createFFTNode(\n context: BaseAudioContext,\n fftUtils: typeof FFTUtils,\n name?: string,\n factory?: LooseFaustDspFactory,\n fftOptions?: Partial<FaustFFTOptionsData>,\n processorName?: string\n ): Promise<FaustMonoAudioWorkletNode | null>;\n\n /**\n * Create a monophonic Offline processor.\n *\n * @param sampleRate - the sample rate in Hz\n * @param bufferSize - the buffer size in frames\n * @param factory - default is the compiled factory\n * @returns the compiled processor or 'null' if failure\n */\n createOfflineProcessor(sampleRate: number, bufferSize: number, factory?: LooseFaustDspFactory, meta?: FaustDspMeta): Promise<IFaustMonoOfflineProcessor | null>;\n\n /**\n * Get DSP JSON description with its UI and metadata as object.\n *\n * @return the DSP JSON description as object\n */\n getMeta(): FaustDspMeta;\n\n /**\n * Get DSP JSON description with its UI and metadata.\n *\n * @return the DSP JSON description\n */\n getJSON(): string;\n\n /**\n * Get DSP UI description.\n *\n * @return the DSP UI description\n */\n getUI(): FaustUIDescriptor;\n}\n\nexport interface IFaustPolyDspGenerator {\n /**\n * Compile a monophonic DSP factory from given code.\n * \n * @param compiler - the Faust compiler\n * @param name - the DSP name\n * @param dspCode - the DSP code ('dspCode' can possibly contain an integrated effect)\n * @param args - the compilation parameters\n * @param effectCode - optional effect DSP code\n * @returns the compiled factory or 'null' if failure\n */\n compile(compiler: IFaustCompiler, name: string, dspCode: string, args: string, effectCode?: string): Promise<{\n voiceFactory: FaustDspFactory | null;\n effectFactory?: FaustDspFactory | null;\n } | null>;\n\n /**\n * Create a polyphonic WebAudio node (either ScriptProcessorNode or AudioWorkletNode).\n *\n * @param context the WebAudio context\n * @param voices - the number of voices\n * @param name - AudioWorklet Processor name\n * @param voiceFactory - the Faust factory for voices, either obtained with a compiler (createDSPFactory) or loaded from files (loadDSPFactory)\n * @param mixerModule - the wasm Mixer module (loaded from 'mixer32.wasm' or 'mixer64.wasm' files located in the 'faustwasm' package)\n * @param effectFactory - the Faust factory for the effect, either obtained with a compiler (createDSPFactory) or loaded from files (loadDSPFactory)\n * @param sp - whether to compile a ScriptProcessorNode or an AudioWorkletNode\n * @param bufferSize - the buffer size in frames to be used in ScriptProcessorNode only, since AudioWorkletNode always uses 128 frames\n * @returns the compiled WebAudio node or 'null' if failure\n */\n createNode(\n context: BaseAudioContext,\n voices: number,\n name?: string,\n voiceFactory?: LooseFaustDspFactory,\n mixerModule?: WebAssembly.Module,\n effectFactory?: LooseFaustDspFactory | null,\n sp?: boolean,\n bufferSize?: number\n ): Promise<IFaustPolyWebAudioNode | null>;\n\n /**\n * Create a monophonic Offline processor.\n *\n * @param sampleRate - the sample rate in Hz\n * @param bufferSize - the buffer size in frames\n * @param voiceFactory - the Faust factory for voices, either obtained with a compiler (createDSPFactory) or loaded from files (loadDSPFactory)\n * @param mixerModule - the wasm Mixer module (loaded from 'mixer32.wasm' or 'mixer64.wasm' files)\n * @param effectFactory - the Faust factory for the effect, either obtained with a compiler (createDSPFactory) or loaded from files (loadDSPFactory)\n * @returns the compiled processor or 'null' if failure\n */\n createOfflineProcessor(\n sampleRate: number,\n bufferSize: number,\n voices: number,\n voiceFactory?: LooseFaustDspFactory,\n mixerModule?: WebAssembly.Module,\n effectFactory?: LooseFaustDspFactory | null\n ): Promise<IFaustPolyOfflineProcessor | null>;\n\n /**\n * Get DSP JSON description with its UI and metadata as object.\n *\n * @return the DSP JSON description as object\n */\n getMeta(): FaustDspMeta;\n\n /**\n * Get DSP JSON description with its UI and metadata.\n *\n * @return the DSP JSON description\n */\n getJSON(): string;\n\n /**\n * Get DSP UI description.\n *\n * @return the DSP UI description\n */\n getUI(): FaustUIDescriptor;\n}\n\nexport class FaustMonoDspGenerator implements IFaustMonoDspGenerator {\n // Set of all created WorkletProcessors, each of them has to be unique\n private static gWorkletProcessors: Map<BaseAudioContext, Set<string>> = new Map();\n\n name: string;\n factory!: FaustDspFactory | null;\n\n constructor() {\n this.factory = null;\n }\n async compile(compiler: IFaustCompiler, name: string, code: string, args: string) {\n this.factory = await compiler.createMonoDSPFactory(name, code, args);\n if (this.factory) {\n this.name = name;\n return this;\n } else {\n return null;\n }\n }\n\n async createNode<SP extends boolean = false>(\n context: BaseAudioContext,\n name = this.name,\n factory = this.factory as LooseFaustDspFactory,\n sp = false as SP,\n bufferSize = 1024,\n processorName = factory?.shaKey || name\n ): Promise<SP extends true ? FaustMonoScriptProcessorNode | null : FaustMonoAudioWorkletNode | null> {\n if (!factory) throw new Error(\"Code is not compiled, please define the factory or call `await this.compile()` first.\");\n\n const meta = JSON.parse(factory.json);\n const sampleSize = meta.compile_options.match(\"-double\") ? 8 : 4;\n if (sp) {\n const instance = await FaustWasmInstantiator.createAsyncMonoDSPInstance(factory);\n const monoDsp = new FaustMonoWebAudioDsp(instance, context.sampleRate, sampleSize, bufferSize);\n // Initialize the DSP instance, possibly loading soundfiles\n await monoDsp.init(context);\n const sp = context.createScriptProcessor(bufferSize, monoDsp.getNumInputs(), monoDsp.getNumOutputs()) as FaustMonoScriptProcessorNode;\n Object.setPrototypeOf(sp, FaustMonoScriptProcessorNode.prototype);\n sp.init(monoDsp);\n return sp as SP extends true ? FaustMonoScriptProcessorNode : FaustMonoAudioWorkletNode;\n } else {\n // Dynamically create AudioWorkletProcessor if code not yet created\n if (!FaustMonoDspGenerator.gWorkletProcessors.has(context)) FaustMonoDspGenerator.gWorkletProcessors.set(context, new Set());\n if (!FaustMonoDspGenerator.gWorkletProcessors.get(context)?.has(processorName)) {\n try {\n const processorCode = `\n// DSP name and JSON string for DSP are generated\nconst faustData = ${JSON.stringify({\n processorName,\n dspName: name,\n dspMeta: meta,\n poly: false\n } as FaustData)};\n// Implementation needed classes of functions\nconst ${FaustDspInstance.name} = ${FaustDspInstance.toString()}\nconst ${FaustBaseWebAudioDsp.name} = ${FaustBaseWebAudioDsp.toString()}\nconst ${FaustMonoWebAudioDsp.name} = ${FaustMonoWebAudioDsp.toString()}\nconst ${FaustWasmInstantiator.name} = ${FaustWasmInstantiator.toString()}\n// Put them in dependencies\nconst dependencies = {\n FaustBaseWebAudioDsp: ${FaustBaseWebAudioDsp.name},\n FaustMonoWebAudioDsp: ${FaustMonoWebAudioDsp.name},\n FaustWasmInstantiator: ${FaustWasmInstantiator.name}\n};\n// Generate the actual AudioWorkletProcessor code\n(${getFaustAudioWorkletProcessor.toString()})(dependencies, faustData);\n`;\n const url = URL.createObjectURL(new Blob([processorCode], { type: \"text/javascript\" }));\n await context.audioWorklet.addModule(url);\n // Keep the DSP name\n FaustMonoDspGenerator.gWorkletProcessors.get(context)?.add(processorName);\n } catch (e) {\n // console.error(`=> exception raised while running createMonoNode: ${e}`);\n // console.error(`=> check that your page is served using https.${e}`);\n throw e;\n }\n }\n // Create the AWN\n const node = new FaustMonoAudioWorkletNode(context, processorName, factory, sampleSize)\n return node as SP extends true ? FaustMonoScriptProcessorNode : FaustMonoAudioWorkletNode;\n }\n }\n\n async createFFTNode(\n context: BaseAudioContext,\n fftUtils: typeof FFTUtils,\n name = this.name,\n factory = this.factory as LooseFaustDspFactory,\n fftOptions: Partial<FaustFFTOptionsData> = {},\n processorName = factory?.shaKey ? `${factory.shaKey}_fft` : name\n ): Promise<FaustMonoAudioWorkletNode | null> {\n if (!factory) throw new Error(\"Code is not compiled, please define the factory or call `await this.compile()` first.\");\n\n const meta: FaustDspMeta = JSON.parse(factory.json);\n const sampleSize = meta.compile_options.match(\"-double\") ? 8 : 4;\n // Dynamically create AudioWorkletProcessor if code not yet created\n if (!FaustMonoDspGenerator.gWorkletProcessors.has(context)) FaustMonoDspGenerator.gWorkletProcessors.set(context, new Set());\n if (!FaustMonoDspGenerator.gWorkletProcessors.get(context)?.has(processorName)) {\n try {\n const processorCode = `\n// DSP name and JSON string for DSP are generated\nconst faustData = ${JSON.stringify({\n processorName,\n dspName: name,\n dspMeta: meta,\n fftOptions\n } as FaustFFTData)};\n// Implementation needed classes of functions\nconst ${FaustDspInstance.name} = ${FaustDspInstance.toString()}\nconst ${FaustBaseWebAudioDsp.name} = ${FaustBaseWebAudioDsp.toString()}\nconst ${FaustMonoWebAudioDsp.name} = ${FaustMonoWebAudioDsp.toString()}\nconst ${FaustWasmInstantiator.name} = ${FaustWasmInstantiator.toString()}\nconst FFTUtils = ${fftUtils.toString()}\n// Put them in dependencies\nconst dependencies = {\n FaustBaseWebAudioDsp: ${FaustBaseWebAudioDsp.name},\n FaustMonoWebAudioDsp: ${FaustMonoWebAudioDsp.name},\n FaustWasmInstantiator: ${FaustWasmInstantiator.name},\n FFTUtils\n};\n// Generate the actual AudioWorkletProcessor code\n(${getFaustFFTAudioWorkletProcessor.toString()})(dependencies, faustData);\n`;\n const url = URL.createObjectURL(new Blob([processorCode], { type: \"text/javascript\" }));\n await context.audioWorklet.addModule(url);\n // Keep the DSP name\n FaustMonoDspGenerator.gWorkletProcessors.get(context)?.add(processorName);\n } catch (e) {\n // console.error(`=> exception raised while running createMonoNode: ${e}`);\n // console.error(`=> check that your page is served using https.${e}`);\n throw e;\n }\n }\n // Create the AWN\n const node = new FaustMonoAudioWorkletNode(context, processorName, factory, sampleSize, { channelCount: Math.max(1, Math.ceil(meta.inputs / 3)), outputChannelCount: [Math.ceil(meta.outputs / 2)] });\n if (fftOptions.fftSize) {\n const param = node.parameters.get(\"fftSize\");\n if (param) param.value = fftOptions.fftSize;\n }\n if (fftOptions.fftOverlap) {\n const param = node.parameters.get(\"fftOverlap\");\n if (param) param.value = fftOptions.fftOverlap;\n }\n if (typeof fftOptions.defaultWindowFunction === \"number\") {\n const param = node.parameters.get(\"windowFunction\");\n if (param) param.value = fftOptions.defaultWindowFunction + 1;\n }\n if (typeof fftOptions.noIFFT === \"boolean\") {\n const param = node.parameters.get(\"noIFFT\");\n if (param) param.value = +fftOptions.noIFFT;\n }\n return node;\n }\n\n async createAudioWorkletProcessor(\n name = this.name,\n factory = this.factory as LooseFaustDspFactory,\n processorName = factory?.shaKey || name\n ) {\n if (!factory) throw new Error(\"Code is not compiled, please define the factory or call `await this.compile()` first.\");\n\n const meta = JSON.parse(factory.json);\n const dependencies = {\n FaustBaseWebAudioDsp,\n FaustMonoWebAudioDsp,\n FaustWasmInstantiator,\n FaustPolyWebAudioDsp: undefined,\n FaustWebAudioDspVoice: undefined,\n }\n // const sampleSize = meta.compile_options.match(\"-double\") ? 8 : 4;\n // Dynamically create AudioWorkletProcessor if code not yet created\n try {\n // DSP name and JSON string for DSP are generated\n const faustData = {\n processorName,\n dspName: name,\n dspMeta: meta,\n poly: false\n } as FaustData;\n // Generate the actual AudioWorkletProcessor code\n const Processor = getFaustAudioWorkletProcessor(dependencies, faustData);\n return Processor;\n } catch (e) {\n // console.error(`=> exception raised while running createMonoNode: ${e}`);\n // console.error(`=> check that your page is served using https.${e}`);\n throw e;\n }\n }\n\n async createOfflineProcessor(\n sampleRate: number,\n bufferSize: number,\n factory = this.factory as LooseFaustDspFactory,\n ) {\n if (!factory) throw new Error(\"Code is not compiled, please define the factory or call `await this.compile()` first.\");\n\n const meta = JSON.parse(factory.json);\n const instance = await FaustWasmInstantiator.createAsyncMonoDSPInstance(factory);\n const sampleSize = meta.compile_options.match(\"-double\") ? 8 : 4;\n const monoDsp = new FaustMonoWebAudioDsp(instance, sampleRate, sampleSize, bufferSize);\n // Initialize the DSP instance, no soundfiles loading for now (TODO ?)\n await monoDsp.init(null);\n return new FaustMonoOfflineProcessor(monoDsp, bufferSize);\n }\n\n getMeta() { return JSON.parse(this.factory!.json); }\n getJSON() { return JSON.stringify(this.getMeta()); }\n getUI() { return this.getMeta().ui; }\n}\n\nexport class FaustPolyDspGenerator implements IFaustPolyDspGenerator {\n // Set of all created WorkletProcessors, each of them has to be unique\n private static gWorkletProcessors: Map<BaseAudioContext, Set<string>> = new Map();\n\n name: string;\n voiceFactory!: FaustDspFactory | null;\n effectFactory!: FaustDspFactory | null;\n mixerBuffer!: Uint8Array;\n mixerModule!: WebAssembly.Module;\n\n constructor() {\n this.voiceFactory = null;\n this.effectFactory = null;\n }\n async compile(\n compiler: IFaustCompiler,\n name: string,\n dspCodeAux: string,\n args: string,\n // The ${dspCode} has to be added with wrapping new lines to make it properly formatted and ready to compile \n effectCodeAux = `dsp_code = environment{\n ${dspCodeAux}\n };\n process = dsp_code.effect;`\n ) {\n // Try to compile effect, possibly failing\n try {\n this.effectFactory = await compiler.createPolyDSPFactory(name, effectCodeAux, args);\n // Since the effect is processing the same buffers for inputs and outputs (in place processing), \n // the voice and effect are adapted, possibly clearing buffers\n if (this.effectFactory) {\n const effectJSON = JSON.parse(this.effectFactory.json);\n const dspCode = `\n // Voice output is forced to 2, when DSP is stereo or effect has 2 ins or 2 outs,\n // so that the effect can process the 2 channels of the voice\n adaptOut(1,1,1) = _;\n adaptOut(1,1,2) = _ <: _,0; // The left channel only is kept\n adaptOut(1,2,1) = _ <: _,_;\n adaptOut(1,2,2) = _ <: _,_;\n adaptOut(2,1,1) = _,_;\n adaptOut(2,1,2) = _,_;\n adaptOut(2,2,1) = _,_;\n adaptOut(2,2,2) = _,_;\n adaptor(F) = adaptOut(outputs(F),${effectJSON.inputs},${effectJSON.outputs});\n dsp_code = environment{\n ${dspCodeAux}\n };\n process = dsp_code.process : adaptor(dsp_code.process);`\n const effectCode = `\n // Inputs\n adaptIn(1,1,1) = _;\n adaptIn(1,1,2) = _,_ :> _; \n adaptIn(1,2,1) = _,_;\n adaptIn(1,2,2) = _,_;\n adaptIn(2,1,1) = _,_ :> _;\n adaptIn(2,1,2) = _,_ :> _;\n adaptIn(2,2,1) = _,_;\n adaptIn(2,2,2) = _,_;\n // Outputs\n adaptOut(1,1) = _ <: _,0; // The left channel only is kept\n adaptOut(1,2) = _,_;\n adaptOut(2,1) = _ <: _,0; // The left channel only is kept\n adaptOut(2,2) = _,_;\n adaptorIns(F) = adaptIn(outputs(F),${effectJSON.inputs},${effectJSON.outputs});\n adaptorOuts = adaptOut(${effectJSON.inputs},${effectJSON.outputs});\n dsp_code = environment{\n ${dspCodeAux}\n };\n process = adaptorIns(dsp_code.process) : dsp_code.effect : adaptorOuts;`\n this.voiceFactory = await compiler.createPolyDSPFactory(name, dspCode, args);\n try {\n // Effect is processing same buffers for inputs and outputs, so has to use -inpl option\n this.effectFactory = await compiler.createPolyDSPFactory(name, effectCode, args + \" -inpl\");\n } catch (e) {\n console.warn(e);\n }\n }\n } catch (e) {\n console.warn(e);\n this.voiceFactory = await compiler.createPolyDSPFactory(name, dspCodeAux, args);\n }\n\n if (this.voiceFactory) {\n this.name = name;\n const voiceMeta = JSON.parse(this.voiceFactory.json);\n const isDouble = voiceMeta.compile_options.match(\"-double\");\n const { mixerBuffer, mixerModule } = await compiler.getAsyncInternalMixerModule(!!isDouble);\n this.mixerBuffer = mixerBuffer;\n this.mixerModule = mixerModule;\n return this;\n } else {\n return null;\n }\n }\n\n async createNode<SP extends boolean = false>(\n context: BaseAudioContext,\n voices: number,\n name = this.name,\n voiceFactory = this.voiceFactory as LooseFaustDspFactory,\n mixerModule = this.mixerModule,\n effectFactory = this.effectFactory as LooseFaustDspFactory | null,\n sp = false as SP,\n bufferSize = 1024,\n processorName = ((voiceFactory?.shaKey || \"\") + (effectFactory?.shaKey || \"\")) || `${name}_poly`\n ): Promise<SP extends true ? FaustPolyScriptProcessorNode | null : FaustPolyAudioWorkletNode | null> {\n if (!voiceFactory) throw new Error(\"Code is not compiled, please define the factory or call `await this.compile()` first.\");\n\n const voiceMeta = JSON.parse(voiceFactory.json);\n const effectMeta = effectFactory ? JSON.parse(effectFactory.json) : undefined;\n const sampleSize = voiceMeta.compile_options.match(\"-double\") ? 8 : 4;\n if (sp) {\n const instance = await FaustWasmInstantiator.createAsyncPolyDSPInstance(voiceFactory, mixerModule, voices, effectFactory || undefined);\n const polyDsp = new FaustPolyWebAudioDsp(instance, context.sampleRate, sampleSize, bufferSize);\n // Initialize the DSP instance, possibly loading soundfiles\n await polyDsp.init(context);\n const sp = context.createScriptProcessor(bufferSize, polyDsp.getNumInputs(), polyDsp.getNumOutputs()) as FaustPolyScriptProcessorNode;\n Object.setPrototypeOf(sp, FaustPolyScriptProcessorNode.prototype);\n sp.init(polyDsp);\n return sp as SP extends true ? FaustPolyScriptProcessorNode : FaustPolyAudioWorkletNode;\n } else {\n // Dynamically create AudioWorkletProcessor if code not yet created\n if (!FaustPolyDspGenerator.gWorkletProcessors.has(context)) FaustPolyDspGenerator.gWorkletProcessors.set(context, new Set());\n if (!FaustPolyDspGenerator.gWorkletProcessors.get(context)?.has(processorName)) {\n try {\n const processorCode = `\n// DSP name and JSON string for DSP are generated\nconst faustData = ${JSON.stringify({\n processorName,\n dspName: name,\n dspMeta: voiceMeta,\n poly: true,\n effectMeta\n } as FaustData)};\n// Implementation needed classes of functions\nconst ${FaustDspInstance.name} = ${FaustDspInstance.toString()}\nconst ${FaustBaseWebAudioDsp.name} = ${FaustBaseWebAudioDsp.toString()}\nconst ${FaustPolyWebAudioDsp.name} = ${FaustPolyWebAudioDsp.toString()}\nconst ${FaustWebAudioDspVoice.name} = ${FaustWebAudioDspVoice.toString()}\nconst ${FaustWasmInstantiator.name} = ${FaustWasmInstantiator.toString()}\n// Put them in dependencies\nconst dependencies = {\n FaustBaseWebAudioDsp: ${FaustBaseWebAudioDsp.name},\n FaustPolyWebAudioDsp: ${FaustPolyWebAudioDsp.name},\n FaustWasmInstantiator: ${FaustWasmInstantiator.name}\n};\n// Generate the actual AudioWorkletProcessor code\n(${getFaustAudioWorkletProcessor.toString()})(dependencies, faustData);\n`;\n const url = URL.createObjectURL(new Blob([processorCode], { type: \"text/javascript\" }));\n await context.audioWorklet.addModule(url);\n // Keep the DSP name\n FaustPolyDspGenerator.gWorkletProcessors.get(context)?.add(processorName);\n } catch (e) {\n // console.error(`=> exception raised while running createPolyNode: ${e}`);\n // console.error(`=> check that your page is served using https.${e}`);\n throw e;\n }\n }\n // Create the AWN\n const node = new FaustPolyAudioWorkletNode(context, processorName, voiceFactory, mixerModule, voices, sampleSize, effectFactory || undefined);\n return node as SP extends true ? FaustPolyScriptProcessorNode : FaustPolyAudioWorkletNode;\n }\n }\n\n async createAudioWorkletProcessor(\n name = this.name,\n voiceFactory = this.voiceFactory as LooseFaustDspFactory,\n effectFactory = this.effectFactory as LooseFaustDspFactory | null,\n processorName = ((voiceFactory?.shaKey || \"\") + (effectFactory?.shaKey || \"\")) || `${name}_poly`\n ) {\n if (!voiceFactory) throw new Error(\"Code is not compiled, please define the factory or call `await this.compile()` first.\");\n\n const voiceMeta = JSON.parse(voiceFactory.json);\n const effectMeta = effectFactory ? JSON.parse(effectFactory.json) : undefined;\n const sampleSize = voiceMeta.compile_options.match(\"-double\") ? 8 : 4;\n // Dynamically create AudioWorkletProcessor if code not yet created\n try {\n const dependencies = {\n FaustBaseWebAudioDsp,\n FaustMonoWebAudioDsp: undefined,\n FaustWasmInstantiator,\n FaustPolyWebAudioDsp,\n FaustWebAudioDspVoice,\n };\n // DSP name and JSON string for DSP are generated\n const faustData = {\n processorName,\n dspName: name,\n dspMeta: voiceMeta,\n poly: true,\n effectMeta\n } as FaustData;\n // Generate the actual AudioWorkletProcessor code\n const Processor = getFaustAudioWorkletProcessor<true>(dependencies, faustData);\n return Processor;\n } catch (e) {\n // console.error(`=> exception raised while running createPolyNode: ${e}`);\n // console.error(`=> check that your page is served using https.${e}`);\n throw e;\n }\n }\n\n async createOfflineProcessor(\n sampleRate: number,\n bufferSize: number,\n voices: number,\n voiceFactory = this.voiceFactory as LooseFaustDspFactory,\n mixerModule = this.mixerModule,\n effectFactory = this.effectFactory as LooseFaustDspFactory | null\n ) {\n if (!voiceFactory) throw new Error(\"Code is not compiled, please define the factory or call `await this.compile()` first.\");\n\n const voiceMeta = JSON.parse(voiceFactory.json);\n const effectMeta = effectFactory ? JSON.parse(effectFactory.json) : undefined;\n const instance = await FaustWasmInstantiator.createAsyncPolyDSPInstance(voiceFactory, mixerModule, voices, effectFactory || undefined);\n const sampleSize = voiceMeta.compile_options.match(\"-double\") ? 8 : 4;\n const polyDsp = new FaustPolyWebAudioDsp(instance, sampleRate, sampleSize, bufferSize);\n return new FaustPolyOfflineProcessor(polyDsp, bufferSize);\n }\n\n getMeta() {\n const o = (this.voiceFactory) ? JSON.parse(this.voiceFactory.json) : null;\n const e = (this.effectFactory) ? JSON.parse(this.effectFactory.json) : null;\n const r = { ...o };\n if (e) {\n r.ui = [{\n type: \"tgroup\", label: \"Sequencer\", items: [\n { type: \"vgroup\", label: \"Instrument\", items: o.ui },\n { type: \"vgroup\", label: \"Effect\", items: e.ui }\n ]\n }];\n } else {\n r.ui = [{\n type: \"tgroup\", label: \"Polyphonic\", items: [\n { type: \"vgroup\", label: \"Voices\", items: o.ui }\n ]\n }];\n }\n return r as FaustDspMeta;\n }\n\n getJSON() {\n return JSON.stringify(this.getMeta());\n }\n\n getUI() {\n return this.getMeta().ui;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n\r\n/* global global, define, System, Reflect, Promise */\r\nvar __extends;\r\nvar __assign;\r\nvar __rest;\r\nvar __decorate;\r\nvar __param;\r\nvar __metadata;\r\nvar __awaiter;\r\nvar __generator;\r\nvar __exportStar;\r\nvar __values;\r\nvar __read;\r\nvar __spread;\r\nvar __spreadArrays;\r\nvar __await;\r\nvar __asyncGenerator;\r\nvar __asyncDelegator;\r\nvar __asyncValues;\r\nvar __makeTemplateObject;\r\nvar __importStar;\r\nvar __importDefault;\r\nvar __classPrivateFieldGet;\r\nvar __classPrivateFieldSet;\r\nvar __createBinding;\r\n(function (factory) {\r\n var root = typeof global === \"object\" ? global : typeof self === \"object\" ? self : typeof this === \"object\" ? this : {};\r\n if (typeof define === \"function\" && define.amd) {\r\n define(\"tslib\", [\"exports\"], function (exports) { factory(createExporter(root, createExporter(exports))); });\r\n }\r\n else if (typeof module === \"object\" && typeof module.exports === \"object\") {\r\n factory(createExporter(root, createExporter(module.exports)));\r\n }\r\n else {\r\n factory(createExporter(root));\r\n }\r\n function createExporter(exports, previous) {\r\n if (exports !== root) {\r\n if (typeof Object.create === \"function\") {\r\n Object.defineProperty(exports, \"__esModule\", { value: true });\r\n }\r\n else {\r\n exports.__esModule = true;\r\n }\r\n }\r\n return function (id, v) { return exports[id] = previous ? previous(id, v) : v; };\r\n }\r\n})\r\n(function (exporter) {\r\n var extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n\r\n __extends = function (d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n\r\n __assign = Object.assign || function (t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n\r\n __rest = function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n };\r\n\r\n __decorate = function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n };\r\n\r\n __param = function (paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n };\r\n\r\n __metadata = function (metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n };\r\n\r\n __awaiter = function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n };\r\n\r\n __generator = function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n };\r\n\r\n __createBinding = function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n };\r\n\r\n __exportStar = function (m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n };\r\n\r\n __values = function (o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n };\r\n\r\n __read = function (o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n };\r\n\r\n __spread = function () {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n };\r\n\r\n __spreadArrays = function () {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n };\r\n\r\n __await = function (v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n };\r\n\r\n __asyncGenerator = function (thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n };\r\n\r\n __asyncDelegator = function (o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n };\r\n\r\n __asyncValues = function (o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n };\r\n\r\n __makeTemplateObject = function (cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n };\r\n\r\n __importStar = function (mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result[\"default\"] = mod;\r\n return result;\r\n };\r\n\r\n __importDefault = function (mod) {\r\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\r\n };\r\n\r\n __classPrivateFieldGet = function (receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n };\r\n\r\n __classPrivateFieldSet = function (receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n };\r\n\r\n exporter(\"__extends\", __extends);\r\n exporter(\"__assign\", __assign);\r\n exporter(\"__rest\", __rest);\r\n exporter(\"__decorate\", __decorate);\r\n exporter(\"__param\", __param);\r\n exporter(\"__metadata\", __metadata);\r\n exporter(\"__awaiter\", __awaiter);\r\n exporter(\"__generator\", __generator);\r\n exporter(\"__exportStar\", __exportStar);\r\n exporter(\"__createBinding\", __createBinding);\r\n exporter(\"__values\", __values);\r\n exporter(\"__read\", __read);\r\n exporter(\"__spread\", __spread);\r\n exporter(\"__spreadArrays\", __spreadArrays);\r\n exporter(\"__await\", __await);\r\n exporter(\"__asyncGenerator\", __asyncGenerator);\r\n exporter(\"__asyncDelegator\", __asyncDelegator);\r\n exporter(\"__asyncValues\", __asyncValues);\r\n exporter(\"__makeTemplateObject\", __makeTemplateObject);\r\n exporter(\"__importStar\", __importStar);\r\n exporter(\"__importDefault\", __importDefault);\r\n exporter(\"__classPrivateFieldGet\", __classPrivateFieldGet);\r\n exporter(\"__classPrivateFieldSet\", __classPrivateFieldSet);\r\n});\r\n", null, null, "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toUtf8 = exports.fromUtf8 = void 0;\nconst fromUtf8 = (input) => {\n const bytes = [];\n for (let i = 0, len = input.length; i < len; i++) {\n const value = input.charCodeAt(i);\n if (value < 0x80) {\n bytes.push(value);\n }\n else if (value < 0x800) {\n bytes.push((value >> 6) | 0b11000000, (value & 0b111111) | 0b10000000);\n }\n else if (i + 1 < input.length && (value & 0xfc00) === 0xd800 && (input.charCodeAt(i + 1) & 0xfc00) === 0xdc00) {\n const surrogatePair = 0x10000 + ((value & 0b1111111111) << 10) + (input.charCodeAt(++i) & 0b1111111111);\n bytes.push((surrogatePair >> 18) | 0b11110000, ((surrogatePair >> 12) & 0b111111) | 0b10000000, ((surrogatePair >> 6) & 0b111111) | 0b10000000, (surrogatePair & 0b111111) | 0b10000000);\n }\n else {\n bytes.push((value >> 12) | 0b11100000, ((value >> 6) & 0b111111) | 0b10000000, (value & 0b111111) | 0b10000000);\n }\n }\n return Uint8Array.from(bytes);\n};\nexports.fromUtf8 = fromUtf8;\nconst toUtf8 = (input) => {\n let decoded = \"\";\n for (let i = 0, len = input.length; i < len; i++) {\n const byte = input[i];\n if (byte < 0x80) {\n decoded += String.fromCharCode(byte);\n }\n else if (0b11000000 <= byte && byte < 0b11100000) {\n const nextByte = input[++i];\n decoded += String.fromCharCode(((byte & 0b11111) << 6) | (nextByte & 0b111111));\n }\n else if (0b11110000 <= byte && byte < 0b101101101) {\n const surrogatePair = [byte, input[++i], input[++i], input[++i]];\n const encoded = \"%\" + surrogatePair.map((byteValue) => byteValue.toString(16)).join(\"%\");\n decoded += decodeURIComponent(encoded);\n }\n else {\n decoded += String.fromCharCode(((byte & 0b1111) << 12) | ((input[++i] & 0b111111) << 6) | (input[++i] & 0b111111));\n }\n }\n return decoded;\n};\nexports.toUtf8 = toUtf8;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toUtf8 = exports.fromUtf8 = void 0;\nfunction fromUtf8(input) {\n return new TextEncoder().encode(input);\n}\nexports.fromUtf8 = fromUtf8;\nfunction toUtf8(input) {\n return new TextDecoder(\"utf-8\").decode(input);\n}\nexports.toUtf8 = toUtf8;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toUtf8 = exports.fromUtf8 = void 0;\nconst pureJs_1 = require(\"./pureJs\");\nconst whatwgEncodingApi_1 = require(\"./whatwgEncodingApi\");\nconst fromUtf8 = (input) => typeof TextEncoder === \"function\" ? (0, whatwgEncodingApi_1.fromUtf8)(input) : (0, pureJs_1.fromUtf8)(input);\nexports.fromUtf8 = fromUtf8;\nconst toUtf8 = (input) => typeof TextDecoder === \"function\" ? (0, whatwgEncodingApi_1.toUtf8)(input) : (0, pureJs_1.toUtf8)(input);\nexports.toUtf8 = toUtf8;\n", null, null, null, null, null, null, null, "import type { FaustModuleFactory } from \"./types\";\n\n/**\n * Load libfaust-wasm files, than instantiate libFaust\n * @param jsFile path to `libfaust-wasm.js`\n * @param dataFile path to `libfaust-wasm.data`\n * @param wasmFile path to `libfaust-wasm.wasm`\n */\nconst instantiateFaustModuleFromFile = async (jsFile: string, dataFile = jsFile.replace(/c?js$/, \"data\"), wasmFile = jsFile.replace(/c?js$/, \"wasm\")) => {\n let FaustModule: FaustModuleFactory;\n let dataBinary: ArrayBuffer;\n let wasmBinary: Uint8Array | ArrayBuffer;\n const jsCodeHead = /var (.+) = \\(/;\n if (typeof window === \"object\") {\n let jsCode = await (await fetch(jsFile)).text();\n jsCode = `${jsCode}\nexport default ${jsCode.match(jsCodeHead)?.[1]};\n`;\n const jsFileMod = URL.createObjectURL(new Blob([jsCode], { type: \"text/javascript\" }));\n FaustModule = (await import(/* webpackIgnore: true */jsFileMod)).default;\n dataBinary = await (await fetch(dataFile)).arrayBuffer();\n wasmBinary = new Uint8Array(await (await fetch(wasmFile)).arrayBuffer());\n } else {\n const { promises: fs } = await import(\"fs\");\n const { pathToFileURL } = await import(\"url\");\n let jsCode = (await fs.readFile(jsFile, { encoding: \"utf-8\" }));\n jsCode = `\nimport process from \"process\";\nimport * as path from \"path\";\nimport { createRequire } from \"module\";\nimport { fileURLToPath } from \"url\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst __filename = fileURLToPath(import.meta.url);\nconst require = createRequire(import.meta.url);\n\n${jsCode}\n\nexport default ${jsCode.match(jsCodeHead)?.[1]};\n`;\n const jsFileMod = jsFile.replace(/c?js$/, \"mjs\");\n await fs.writeFile(jsFileMod, jsCode);\n FaustModule = (await import(/* webpackIgnore: true */pathToFileURL(jsFileMod).href)).default;\n await fs.unlink(jsFileMod);\n dataBinary = (await fs.readFile(dataFile)).buffer;\n wasmBinary = (await fs.readFile(wasmFile)).buffer;\n }\n const faustModule = await FaustModule({\n wasmBinary,\n getPreloadedPackage: (remotePackageName: string, remotePackageSize: number) => {\n if (remotePackageName === \"libfaust-wasm.data\") return dataBinary;\n return new ArrayBuffer(0);\n }});\n return faustModule;\n};\n\nexport default instantiateFaustModuleFromFile;\n", "import type FaustWasmInstantiator from \"./FaustWasmInstantiator\";\nimport type { FaustBaseWebAudioDsp, FaustWebAudioDspVoice, FaustMonoWebAudioDsp, FaustPolyWebAudioDsp } from \"./FaustWebAudioDsp\";\nimport type { AudioParamDescriptor, AudioWorkletGlobalScope, LooseFaustDspFactory, FaustDspMeta, FaustUIItem, AudioWorkletProcessor } from \"./types\";\n\n/**\n * Injected in the string to be compiled on AudioWorkletProcessor side\n */\nexport interface FaustData {\n processorName: string;\n dspName: string;\n dspMeta: FaustDspMeta;\n poly: boolean;\n effectMeta?: FaustDspMeta;\n};\nexport interface FaustAudioWorkletProcessorDependencies<Poly extends boolean = false> {\n FaustBaseWebAudioDsp: typeof FaustBaseWebAudioDsp;\n FaustMonoWebAudioDsp: Poly extends true ? undefined : typeof FaustMonoWebAudioDsp;\n FaustPolyWebAudioDsp: Poly extends true ? typeof FaustPolyWebAudioDsp : undefined;\n FaustWebAudioDspVoice: Poly extends true ? typeof FaustWebAudioDspVoice : undefined;\n FaustWasmInstantiator: typeof FaustWasmInstantiator;\n}\nexport interface FaustAudioWorkletNodeOptions<Poly extends boolean = false> extends AudioWorkletNodeOptions {\n processorOptions: Poly extends true ? FaustPolyAudioWorkletProcessorOptions : FaustMonoAudioWorkletProcessorOptions;\n}\nexport interface FaustMonoAudioWorkletNodeOptions extends AudioWorkletNodeOptions {\n processorOptions: FaustMonoAudioWorkletProcessorOptions;\n}\nexport interface FaustPolyAudioWorkletNodeOptions extends AudioWorkletNodeOptions {\n processorOptions: FaustPolyAudioWorkletProcessorOptions;\n}\nexport interface FaustAudioWorkletProcessorOptions {\n name: string;\n sampleSize: number;\n}\nexport interface FaustMonoAudioWorkletProcessorOptions extends FaustAudioWorkletProcessorOptions {\n factory: LooseFaustDspFactory;\n}\nexport interface FaustPolyAudioWorkletProcessorOptions extends FaustAudioWorkletProcessorOptions {\n voiceFactory: LooseFaustDspFactory;\n mixerModule: WebAssembly.Module;\n voices: number;\n effectFactory?: LooseFaustDspFactory;\n}\n\n// Dynamic AudioWorkletProcessor code generator\nconst getFaustAudioWorkletProcessor = <Poly extends boolean = false>(dependencies: FaustAudioWorkletProcessorDependencies<Poly>, faustData: FaustData, register = true): typeof AudioWorkletProcessor => {\n const { registerProcessor, AudioWorkletProcessor, sampleRate } = globalThis as unknown as AudioWorkletGlobalScope;\n\n const {\n FaustBaseWebAudioDsp,\n FaustWasmInstantiator\n } = dependencies;\n\n const {\n processorName,\n dspName,\n dspMeta,\n effectMeta,\n poly\n } = faustData;\n\n // Analyse voice JSON to generate AudioParam parameters\n const analysePolyParameters = (item: FaustUIItem): AudioParamDescriptor | null => {\n const polyKeywords = [\"/gate\", \"/freq\", \"/gain\", \"/key\", \"/vel\", \"/velocity\"];\n const isPolyReserved = \"address\" in item && !!polyKeywords.find(k => item.address.endsWith(k));\n if (poly && isPolyReserved) return null;\n if (item.type === \"vslider\" || item.type === \"hslider\" || item.type === \"nentry\") {\n return { name: item.address, defaultValue: item.init || 0, minValue: item.min || 0, maxValue: item.max || 0 };\n } else if (item.type === \"button\" || item.type === \"checkbox\") {\n return { name: item.address, defaultValue: item.init || 0, minValue: 0, maxValue: 1 };\n }\n return null;\n }\n\n /**\n * Base class for Monophonic and Polyphonic AudioWorkletProcessor\n */\n class FaustAudioWorkletProcessor<Poly extends boolean = false> extends AudioWorkletProcessor {\n\n // Use ! syntax when the field is not defined in the constructor\n protected fDSPCode!: Poly extends true ? FaustPolyWebAudioDsp : FaustMonoWebAudioDsp;\n\n protected paramValuesCache: Record<string, number> = {};\n\n constructor(options: FaustAudioWorkletNodeOptions<Poly>) {\n super(options);\n\n // Setup port message handling\n this.port.onmessage = (e: MessageEvent) => this.handleMessageAux(e);\n\n const { parameterDescriptors } = (this.constructor as typeof AudioWorkletProcessor);\n parameterDescriptors.forEach((pd) => {\n this.paramValuesCache[pd.name] = pd.defaultValue || 0;\n })\n }\n\n static get parameterDescriptors() {\n const params = [] as AudioParamDescriptor[];\n // Analyse voice JSON to generate AudioParam parameters\n const callback = (item: FaustUIItem) => {\n const param = analysePolyParameters(item);\n if (param) params.push(param);\n }\n FaustBaseWebAudioDsp.parseUI(dspMeta.ui, callback);\n // Analyse effect JSON to generate AudioParam parameters\n if (effectMeta) FaustBaseWebAudioDsp.parseUI(effectMeta.ui, callback);\n return params;\n }\n\n process(inputs: Float32Array[][], outputs: Float32Array[][], parameters: { [key: string]: Float32Array }) {\n\n // Update controls (possibly needed for sample accurate control)\n for (const path in parameters) {\n const [paramValue] = parameters[path];\n if (paramValue !== this.paramValuesCache[path]) {\n this.fDSPCode.setParamValue(path, paramValue);\n this.paramValuesCache[path] = paramValue;\n }\n }\n\n return this.fDSPCode.compute(inputs[0], outputs[0]);\n }\n\n protected handleMessageAux(e: MessageEvent) { // use arrow function for binding\n const msg = e.data;\n\n switch (msg.type) {\n // Generic MIDI message\n case \"midi\": this.midiMessage(msg.data); break;\n // Typed MIDI message\n case \"ctrlChange\": this.ctrlChange(msg.data[0], msg.data[1], msg.data[2]); break;\n case \"pitchWheel\": this.pitchWheel(msg.data[0], msg.data[1]); break;\n // Generic data message\n case \"param\": this.setParamValue(msg.data.path, msg.data.value); break;\n // Plot handler set on demand\n case \"setPlotHandler\": {\n if (msg.data) {\n this.fDSPCode.setPlotHandler((output, index, events) => this.port.postMessage({ type: \"plot\", value: output, index, events }));\n } else {\n this.fDSPCode.setPlotHandler(null);\n }\n break;\n }\n case \"start\": {\n this.fDSPCode.start();\n break;\n }\n case \"stop\": {\n this.fDSPCode.stop();\n break;\n }\n case \"destroy\": {\n this.port.close();\n this.fDSPCode.destroy();\n break;\n }\n default:\n break;\n }\n }\n\n protected setParamValue(path: string, value: number) {\n this.fDSPCode.setParamValue(path, value);\n this.paramValuesCache[path] = value;\n }\n\n protected midiMessage(data: number[] | Uint8Array) {\n this.fDSPCode.midiMessage(data);\n }\n\n protected ctrlChange(channel: number, ctrl: number, value: number) {\n this.fDSPCode.ctrlChange(channel, ctrl, value);\n }\n\n protected pitchWheel(channel: number, wheel: number) {\n this.fDSPCode.pitchWheel(channel, wheel);\n }\n }\n\n /**\n * Monophonic AudioWorkletProcessor\n */\n class FaustMonoAudioWorkletProcessor extends FaustAudioWorkletProcessor<false> {\n\n constructor(options: FaustAudioWorkletNodeOptions) {\n super(options);\n const { FaustMonoWebAudioDsp } = dependencies as FaustAudioWorkletProcessorDependencies<false>;\n const { factory, sampleSize } = options.processorOptions;\n\n const instance = FaustWasmInstantiator.createSyncMonoDSPInstance(factory);\n\n // Create Monophonic DSP\n this.fDSPCode = new FaustMonoWebAudioDsp(instance, sampleRate, sampleSize, 128);\n\n // Check for soundfile support\n if (this.fDSPCode.hasSoundfiles()) {\n console.error(\"FaustAudioWorkletProcessor: Soundfile support is not implemented yet, switch to ScriptProcessorNode for now\");\n return;\n }\n\n // Setup output handler\n this.fDSPCode.setOutputParamHandler((path, value) => this.port.postMessage({ path, value, type: \"param\" }));\n\n this.fDSPCode.start();\n }\n }\n\n /**\n * Polyphonic AudioWorkletProcessor\n */\n class FaustPolyAudioWorkletProcessor extends FaustAudioWorkletProcessor<true> {\n\n constructor(options: FaustPolyAudioWorkletNodeOptions) {\n super(options);\n const { FaustPolyWebAudioDsp } = dependencies as FaustAudioWorkletProcessorDependencies<true>;\n\n const { voiceFactory, mixerModule, voices, effectFactory, sampleSize } = options.processorOptions;\n\n const instance = FaustWasmInstantiator.createSyncPolyDSPInstance(voiceFactory, mixerModule, voices, effectFactory);\n\n // Create Polyphonic DSP\n this.fDSPCode = new FaustPolyWebAudioDsp(instance, sampleRate, sampleSize, 128);\n\n // Check for soundfile support\n if (this.fDSPCode.hasSoundfiles()) {\n console.error(\"FaustAudioWorkletProcessor: Soundfile support is not implemented yet, switch to ScriptProcessorNode for now\");\n return;\n }\n\n // Setup port message handling\n this.port.onmessage = (e: MessageEvent) => this.handleMessageAux(e);\n\n // Setup output handler\n this.fDSPCode.setOutputParamHandler((path, value) => this.port.postMessage({ path, value, type: \"param\" }));\n\n this.fDSPCode.start();\n }\n\n protected midiMessage(data: number[] | Uint8Array) {\n const cmd = data[0] >> 4;\n const channel = data[0] & 0xf;\n const data1 = data[1];\n const data2 = data[2];\n if (cmd === 8 || (cmd === 9 && data2 === 0)) this.keyOff(channel, data1, data2);\n else if (cmd === 9) this.keyOn(channel, data1, data2);\n else super.midiMessage(data);\n }\n\n protected handleMessageAux = (e: MessageEvent) => { // use arrow function for binding\n const msg = e.data;\n switch (msg.type) {\n case \"keyOn\": this.keyOn(msg.data[0], msg.data[1], msg.data[2]); break;\n case \"keyOff\": this.keyOff(msg.data[0], msg.data[1], msg.data[2]); break;\n default:\n super.handleMessageAux(e);\n break;\n }\n }\n\n // Public API\n keyOn(channel: number, pitch: number, velocity: number) {\n this.fDSPCode.keyOn(channel, pitch, velocity);\n }\n\n keyOff(channel: number, pitch: number, velocity: number) {\n this.fDSPCode.keyOff(channel, pitch, velocity);\n }\n\n allNotesOff(hard: boolean) {\n this.fDSPCode.allNotesOff(hard);\n }\n }\n\n const Processor = poly ? FaustPolyAudioWorkletProcessor : FaustMonoAudioWorkletProcessor;\n if (register) {\n try {\n registerProcessor(processorName || dspName || (poly ? \"mydsp_poly\" : \"mydsp\"), Processor);\n } catch (error) {\n console.warn(error);\n }\n }\n\n return poly ? FaustPolyAudioWorkletProcessor : FaustMonoAudioWorkletProcessor;\n}\n\nexport default getFaustAudioWorkletProcessor;\n", "import type { FaustMonoDspInstance } from \"./FaustDspInstance\";\r\nimport type FaustWasmInstantiator from \"./FaustWasmInstantiator\";\r\nimport type { FaustBaseWebAudioDsp, FaustMonoWebAudioDsp, PlotHandler } from \"./FaustWebAudioDsp\";\r\nimport type { AudioParamDescriptor, AudioWorkletGlobalScope, LooseFaustDspFactory, FaustDspMeta, FaustUIItem, InterfaceFFT, TWindowFunction, Writeable, TypedArray, FFTUtils } from \"./types\";\r\n\r\nexport interface FaustFFTOptionsData {\r\n fftSize: number;\r\n fftOverlap: number;\r\n noIFFT: boolean;\r\n /** Index number of the default window function, leave undefined or -1 for rectangular (no windowing) */\r\n defaultWindowFunction: number;\r\n}\r\n\r\n/**\r\n * Injected in the string to be compiled on AudioWorkletProcessor side\r\n */\r\nexport interface FaustFFTData {\r\n processorName: string;\r\n dspName: string;\r\n dspMeta: FaustDspMeta;\r\n fftOptions?: Partial<FaustFFTOptionsData>;\r\n};\r\nexport interface FaustFFTAudioWorkletProcessorDependencies {\r\n FaustBaseWebAudioDsp: typeof FaustBaseWebAudioDsp;\r\n FaustMonoWebAudioDsp: typeof FaustMonoWebAudioDsp;\r\n FaustWasmInstantiator: typeof FaustWasmInstantiator;\r\n FFTUtils: typeof FFTUtils;\r\n}\r\nexport interface FaustFFTAudioWorkletNodeOptions extends AudioWorkletNodeOptions {\r\n processorOptions: FaustFFTAudioWorkletProcessorOptions;\r\n}\r\nexport interface FaustFFTAudioWorkletProcessorOptions {\r\n name: string;\r\n sampleSize: number;\r\n factory: LooseFaustDspFactory;\r\n}\r\n\r\n\r\n// Dynamic AudioWorkletProcessor code generator\r\nconst getFaustFFTAudioWorkletProcessor = (dependencies: FaustFFTAudioWorkletProcessorDependencies, faustData: FaustFFTData, register = true): typeof AudioWorkletProcessor => {\r\n const { registerProcessor, AudioWorkletProcessor, sampleRate } = globalThis as unknown as AudioWorkletGlobalScope;\r\n\r\n const {\r\n FaustBaseWebAudioDsp,\r\n FaustWasmInstantiator,\r\n FaustMonoWebAudioDsp,\r\n FFTUtils\r\n } = dependencies;\r\n \r\n const {\r\n processorName,\r\n dspName,\r\n dspMeta,\r\n fftOptions\r\n } = faustData;\r\n\r\n const {\r\n windowFunctions,\r\n getFFT,\r\n fftToSignal,\r\n signalToFFT,\r\n signalToNoFFT\r\n } = FFTUtils;\r\n\r\n /**\r\n * Ceil a number to multiple of another\r\n */\r\n const ceil = (x: number, to: number): number => (Math.abs(to) < 1 ? Math.ceil(x * (1 / to)) / (1 / to) : Math.ceil(x / to) * to);\r\n\r\n /**\r\n * Mod support wrapping with negative numbers\r\n */\r\n const mod = (x: number, y: number): number => (x % y + y) % y;\r\n\r\n const apply = (array: Writeable<ArrayLike<number>>, windowFunction: TWindowFunction) => {\r\n for (let i = 0; i < array.length; i++) {\r\n array[i] *= windowFunction(i, array.length);\r\n }\r\n };\r\n\r\n const fftParamKeywords = [\"/fftSize\", \"/fftHopSize\", \"/fftOverlap\", \"/windowFunction\", \"/noIFFT\"];\r\n\r\n /**\r\n * Copy buffer to another, support negative offset index\r\n */\r\n const setTypedArray = <T extends TypedArray = TypedArray>(to: T, from: T, offsetTo = 0, offsetFrom = 0) => {\r\n const toLength = to.length;\r\n const fromLength = from.length;\r\n const spillLength = Math.min(toLength, fromLength);\r\n let spilled = 0;\r\n let $to = mod(offsetTo, toLength) || 0;\r\n let $from = mod(offsetFrom, fromLength) || 0;\r\n while (spilled < spillLength) {\r\n const $spillLength = Math.min(spillLength - spilled, toLength - $to, fromLength - $from);\r\n const $fromEnd = $from + $spillLength;\r\n if ($from === 0 && $fromEnd === fromLength) to.set(from, $to);\r\n else to.set(from.subarray($from, $fromEnd), $to);\r\n $to = ($to + $spillLength) % toLength;\r\n $from = $fromEnd % fromLength;\r\n spilled += $spillLength;\r\n }\r\n return $to;\r\n };\r\n\r\n // Analyse JSON to generate AudioParam parameters\r\n const analyseParameters = (item: FaustUIItem): AudioParamDescriptor | null => {\r\n const isFFTReserved = \"address\" in item && !!fftParamKeywords.find(k => item.address.endsWith(k));\r\n if (isFFTReserved) return null;\r\n if (item.type === \"vslider\" || item.type === \"hslider\" || item.type === \"nentry\") {\r\n return { name: item.address, defaultValue: item.init || 0, minValue: item.min || 0, maxValue: item.max || 0 };\r\n } else if (item.type === \"button\" || item.type === \"checkbox\") {\r\n return { name: item.address, defaultValue: item.init || 0, minValue: 0, maxValue: 1 };\r\n }\r\n return null;\r\n }\r\n /**\r\n * Class for Faust FFT AudioWorkletProcessor\r\n */\r\n class FaustFFTAudioWorkletProcessor extends AudioWorkletProcessor {\r\n\r\n protected fDSPCode: FaustMonoWebAudioDsp;\r\n\r\n protected paramValuesCache: Record<string, number> = {};\r\n\r\n private dspInstance!: FaustMonoDspInstance;\r\n private sampleSize!: number;\r\n\r\n private destroyed = false;\r\n /** Pointer of next start sample to write of the FFT input window */\r\n private $inputWrite = 0;\r\n /** Pointer of next start sample to read of the FFT input window */\r\n private $inputRead = 0;\r\n /** Pointer of next start sample to write of the FFT output window */\r\n private $outputWrite = 0;\r\n /** Pointer of next start sample to read of the FFT output window */\r\n private $outputRead = 0;\r\n /** Not perform in IFFT when reconstruct the audio signal */\r\n private noIFFT = false;\r\n /** audio data from input, array of channels */\r\n private readonly fftInput: Float32Array[] = [];\r\n /** audio data for output, array of channels */\r\n private readonly fftOutput: Float32Array[] = [];\r\n /** Generated from the current window function */\r\n private window: Float32Array;\r\n /** Generated from the current window's rolling sum square */\r\n private windowSumSquare: Float32Array;\r\n \r\n /** FFT constructor */\r\n private FFT: typeof InterfaceFFT;\r\n /** Real FFT interface */\r\n private rfft: InterfaceFFT;\r\n /** Faust param name of fftHopSize */\r\n private fftHopSizeParam: string | undefined;\r\n /** FFT Overlaps, 1 means no overlap */\r\n private fftOverlap = 0;\r\n private fftHopSize = 0;\r\n private fftSize = 0;\r\n private fftBufferSize = 0;\r\n private fftProcessorZeros: Float32Array;\r\n private noIFFTBuffer: Float32Array;\r\n\r\n private fPlotHandler: PlotHandler | null = null;\r\n private fCachedEvents: { type: string; data: any }[] = [];\r\n private fBufferNum = 0;\r\n get fftProcessorBufferSize() {\r\n return this.fftSize / 2 + 1;\r\n }\r\n private windowFunction: TWindowFunction | null = null;\r\n\r\n constructor(options: FaustFFTAudioWorkletNodeOptions) {\r\n super(options);\r\n\r\n // Setup port message handling\r\n this.port.onmessage = (e: MessageEvent) => this.handleMessageAux(e);\r\n \r\n const { parameterDescriptors } = (this.constructor as typeof AudioWorkletProcessor);\r\n parameterDescriptors.forEach((pd) => {\r\n this.paramValuesCache[pd.name] = pd.defaultValue || 0;\r\n })\r\n\r\n const { factory, sampleSize } = options.processorOptions;\r\n\r\n this.dspInstance = FaustWasmInstantiator.createSyncMonoDSPInstance(factory);\r\n this.sampleSize = sampleSize;\r\n\r\n // Init the FFT constructor and the Faust FFT Processor\r\n this.initFFT();\r\n }\r\n\r\n async initFFT(): Promise<true> {\r\n // Use injected function to instantiate the FFT constructor\r\n this.FFT = await getFFT();\r\n // Init Faust FFT Processor\r\n await this.createFFTProcessor();\r\n return true;\r\n }\r\n\r\n static get parameterDescriptors() {\r\n const params = [] as AudioParamDescriptor[];\r\n // Analyse voice JSON to generate AudioParam parameters\r\n const callback = (item: FaustUIItem) => {\r\n const param = analyseParameters(item);\r\n if (param) params.push(param);\r\n }\r\n FaustBaseWebAudioDsp.parseUI(dspMeta.ui, callback);\r\n // Add to Faust parameters, FFT specified parameters\r\n return [\r\n ...params,\r\n {\r\n defaultValue: fftOptions?.fftSize || 1024,\r\n maxValue: 2 ** 32,\r\n minValue: 2,\r\n name: \"fftSize\"\r\n }, {\r\n defaultValue: fftOptions?.fftOverlap || 2,\r\n maxValue: 32,\r\n minValue: 1,\r\n name: \"fftOverlap\"\r\n }, {\r\n defaultValue: typeof fftOptions?.defaultWindowFunction === \"number\" ? fftOptions.defaultWindowFunction + 1 : 0,\r\n maxValue: windowFunctions?.length || 0,\r\n minValue: 0,\r\n name: \"windowFunction\"\r\n }, {\r\n defaultValue: +!!fftOptions?.noIFFT || 0,\r\n maxValue: 1,\r\n minValue: 0,\r\n name: \"noIFFT\"\r\n }\r\n ];\r\n }\r\n\r\n processFFT() {\r\n // Get the number of samples that need to proceed, from the input r/w pointers\r\n let samplesForFFT = mod(this.$inputWrite - this.$inputRead, this.fftBufferSize) || this.fftBufferSize;\r\n // Start process, until no more enough samples\r\n while (samplesForFFT >= this.fftSize) {\r\n let fftProcessorOutputs: Float32Array[] = [];\r\n // Faust processing, use a callback to avoid extra data copy\r\n this.fDSPCode.compute((inputs) => {\r\n // for each audio input channel, three Faust FFT input buffers can be generated (real, imag, FFT bin index)\r\n for (let i = 0; i < Math.min(this.fftInput.length, Math.ceil(inputs.length / 3)); i++) {\r\n // FFT forward, use a callback to avoid extra data copy\r\n const ffted = this.rfft.forward((fftBuffer) => {\r\n setTypedArray(fftBuffer, this.fftInput[i], 0, this.$inputRead);\r\n // Windowing the input\r\n for (let j = 0; j < fftBuffer.length; j++) {\r\n fftBuffer[j] *= this.window[j];\r\n }\r\n // data for FFT (fftBuffer) is prepared\r\n });\r\n // write FFTed spectral data to three Faust FFT input buffers (real, imag, FFT bin index)\r\n fftToSignal(ffted, inputs[i * 3], inputs[i * 3 + 1], inputs[i * 3 + 2]);\r\n // Faust inputs are prepared\r\n }\r\n // If the Faust DSP has more inputs, fill them (zeros or real/imag, fill FFT bin indexes)\r\n for (let i = this.fftInput.length * 3; i < inputs.length; i++) {\r\n if (i % 3 === 2) inputs[i].forEach((v, j) => inputs[i][j] = j);\r\n else inputs[i].fill(0);\r\n }\r\n }, (outputs) => {\r\n // Get the Faust DSP outputs\r\n fftProcessorOutputs = outputs as Float32Array[];\r\n });\r\n\r\n // Advance FFT input read pointers\r\n this.$inputRead += this.fftHopSize;\r\n this.$inputRead %= this.fftBufferSize;\r\n\r\n samplesForFFT -= this.fftHopSize;\r\n\r\n // Do inverse FFT on the processed data by Faust DSP, and write the reconstructed signal to the output buffer\r\n for (let i = 0; i < this.fftOutput.length; i++) {\r\n let iffted: Float32Array;\r\n // If noIFFT option in enabled, then no need to do inverse IFFT, use the injected function to convert\r\n if (this.noIFFT) {\r\n iffted = this.noIFFTBuffer;\r\n signalToNoFFT(fftProcessorOutputs[i * 2] || this.fftProcessorZeros, fftProcessorOutputs[i * 2 + 1] || this.fftProcessorZeros, iffted);\r\n } else {\r\n // FFT inverse, use a callback to avoid extra data copy\r\n iffted = this.rfft.inverse((ifftBuffer) => {\r\n // Convert the Faust DSP output (real/imag plans) to an array for inverse FFT\r\n signalToFFT(fftProcessorOutputs[i * 2] || this.fftProcessorZeros, fftProcessorOutputs[i * 2 + 1] || this.fftProcessorZeros, ifftBuffer);\r\n // ifftBuffer is prepared\r\n });\r\n }\r\n // Windowing the output\r\n for (let j = 0; j < iffted.length; j++) {\r\n iffted[j] *= this.window[j];\r\n }\r\n // Overlap-add, preparing the windowSumSquare array for reverse the windowing effect when output the audio\r\n let $: number;\r\n // First part, add the part that is overlaped with the previous window\r\n for (let j = 0; j < iffted.length - this.fftHopSize; j++) {\r\n $ = mod(this.$outputWrite + j, this.fftBufferSize);\r\n this.fftOutput[i][$] += iffted[j];\r\n if (i === 0) this.windowSumSquare[$] += this.noIFFT ? this.window[j] : this.window[j] ** 2;\r\n }\r\n // Second part, write directly to the output buffer\r\n for (let j = iffted.length - this.fftHopSize; j < iffted.length; j++) {\r\n $ = mod(this.$outputWrite + j, this.fftBufferSize);\r\n this.fftOutput[i][$] = iffted[j];\r\n if (i === 0) this.windowSumSquare[$] = this.noIFFT ? this.window[j] : this.window[j] ** 2;\r\n }\r\n }\r\n // Advance FFT output write pointers\r\n this.$outputWrite += this.fftHopSize;\r\n this.$outputWrite %= this.fftBufferSize;\r\n }\r\n }\r\n\r\n process(inputs: Float32Array[][], outputs: Float32Array[][], parameters: { [key: string]: Float32Array }) {\r\n\r\n if (this.destroyed) return false;\r\n if (!this.FFT) return true;\r\n const input = inputs[0];\r\n const output = outputs[0];\r\n const inputChannels = input?.length || 0;\r\n const outputChannels = output?.length || 0;\r\n // if (input.length === 0) return true;\r\n \r\n const bufferSize = input?.length ? Math.max(...input.map(c => c.length)) || 128 : 128;\r\n \r\n // Reset FFT and related buffers if necessary (checks in the resetFFT method)\r\n this.noIFFT = !!parameters.noIFFT[0];\r\n this.resetFFT(~~parameters.fftSize[0], ~~parameters.fftOverlap[0], ~~parameters.windowFunction[0], inputChannels, outputChannels, bufferSize);\r\n \r\n if (!this.fDSPCode) return true;\r\n \r\n for (const path in parameters) {\r\n if (!!fftParamKeywords.find(k => `/${path}`.endsWith(k))) continue;\r\n const [paramValue] = parameters[path];\r\n if (paramValue !== this.paramValuesCache[path]) {\r\n this.fDSPCode.setParamValue(path, paramValue);\r\n this.paramValuesCache[path] = paramValue;\r\n }\r\n }\r\n\r\n // Write audio input into fftInput buffer, advance pointers\r\n if (input?.length) {\r\n let $inputWrite = 0;\r\n for (let i = 0; i < input.length; i++) {\r\n const inputWindow = this.fftInput[i];\r\n const channel = input[i].length ? input[i] : new Float32Array(bufferSize);\r\n $inputWrite = setTypedArray(inputWindow, channel, this.$inputWrite);\r\n }\r\n this.$inputWrite = $inputWrite;\r\n } else {\r\n this.$inputWrite += bufferSize;\r\n this.$inputWrite %= this.fftBufferSize;\r\n }\r\n \r\n // Do FFT if necessary\r\n this.processFFT();\r\n \r\n // Read from fftOutput buffer for audio output, applying windowSumSquare to reverse the doubled windowing effect\r\n for (let i = 0; i < output.length; i++) {\r\n setTypedArray(output[i], this.fftOutput[i], 0, this.$outputRead);\r\n // let a = 0;\r\n let div = 0;\r\n for (let j = 0; j < bufferSize; j++) {\r\n div = this.windowSumSquare[mod(this.$outputRead + j, this.fftBufferSize)];\r\n output[i][j] /= div < 1e-8 ? 1 : div;\r\n }\r\n }\r\n // Advance pointers\r\n this.$outputRead += bufferSize;\r\n this.$outputRead %= this.fftBufferSize;\r\n\r\n // plot\r\n if (this.fPlotHandler) {\r\n this.port.postMessage({ type: \"plot\", value: output, index: this.fBufferNum++, events: this.fCachedEvents });\r\n this.fCachedEvents = [];\r\n }\r\n return true;\r\n }\r\n\r\n protected handleMessageAux(e: MessageEvent) { // use arrow function for binding\r\n const msg = e.data;\r\n\r\n switch (msg.type) {\r\n // Generic MIDI message\r\n case \"midi\": this.midiMessage(msg.data); break;\r\n // Typed MIDI message\r\n case \"ctrlChange\": this.ctrlChange(msg.data[0], msg.data[1], msg.data[2]); break;\r\n case \"pitchWheel\": this.pitchWheel(msg.data[0], msg.data[1]); break;\r\n // Generic data message\r\n case \"param\": this.setParamValue(msg.data.path, msg.data.value); break;\r\n // Plot handler set on demand\r\n case \"setPlotHandler\": {\r\n if (msg.data) {\r\n this.fPlotHandler = (output, index, events) => {\r\n if (events) this.fCachedEvents.push(...events);\r\n };\r\n } else {\r\n this.fPlotHandler = null;\r\n }\r\n this.fDSPCode?.setPlotHandler(this.fPlotHandler);\r\n break;\r\n }\r\n case \"start\": {\r\n this.fDSPCode?.start();\r\n break;\r\n }\r\n case \"stop\": {\r\n this.fDSPCode?.stop();\r\n break;\r\n }\r\n case \"destroy\": {\r\n this.port.close();\r\n this.destroy();\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n protected setParamValue(path: string, value: number) {\r\n this.fDSPCode?.setParamValue(path, value);\r\n this.paramValuesCache[path] = value;\r\n }\r\n\r\n protected midiMessage(data: number[] | Uint8Array) {\r\n this.fDSPCode?.midiMessage(data);\r\n }\r\n\r\n protected ctrlChange(channel: number, ctrl: number, value: number) {\r\n this.fDSPCode?.ctrlChange(channel, ctrl, value);\r\n }\r\n\r\n protected pitchWheel(channel: number, wheel: number) {\r\n this.fDSPCode?.pitchWheel(channel, wheel);\r\n }\r\n\r\n resetFFT(sizeIn: number, overlapIn: number, windowFunctionIn: number, inputChannels: number, outputChannels: number, bufferSize: number) {\r\n const fftSize = ~~ceil(Math.max(2, sizeIn || 1024), 2);\r\n const fftOverlap = ~~Math.min(fftSize, Math.max(1, overlapIn));\r\n const fftHopSize = ~~Math.max(1, fftSize / fftOverlap);\r\n const latency = fftSize - Math.min(fftHopSize, bufferSize);\r\n let windowFunction: TWindowFunction | null = null;\r\n \r\n // set the window function from the injected list\r\n if (windowFunctionIn !== 0) {\r\n windowFunction = typeof windowFunctions === \"object\" ? windowFunctions[~~windowFunctionIn - 1] || null : null;\r\n }\r\n const fftSizeChanged = fftSize !== this.fftSize;\r\n\r\n const fftOverlapChanged = fftOverlap !== this.fftOverlap;\r\n // Reset FFT vars if the size is changed\r\n if (fftSizeChanged || fftOverlapChanged) {\r\n this.fftSize = fftSize;\r\n this.fftOverlap = fftOverlap;\r\n this.fftHopSize = fftHopSize;\r\n this.$inputWrite = 0;\r\n this.$inputRead = 0;\r\n this.$outputWrite = 0;\r\n this.$outputRead = -latency;\r\n this.fftBufferSize = Math.max(fftSize * 2 - this.fftHopSize, bufferSize * 2);\r\n if (!fftSizeChanged && this.fftHopSizeParam) this.fDSPCode?.setParamValue(this.fftHopSizeParam, this.fftHopSize);\r\n }\r\n\r\n // Reset the FFT interface and the Faust Processor\r\n if (fftSizeChanged) {\r\n this.rfft?.dispose();\r\n this.rfft = new this.FFT(fftSize);\r\n this.noIFFTBuffer = new Float32Array(this.fftSize);\r\n this.createFFTProcessor();\r\n }\r\n \r\n // Calculate a window from the window function, prepare the windowSumSquare buffer \r\n if (fftSizeChanged || fftOverlapChanged || windowFunction !== this.windowFunction) {\r\n this.windowFunction = windowFunction;\r\n this.window = new Float32Array(fftSize);\r\n this.window.fill(1);\r\n if (windowFunction) apply(this.window, windowFunction);\r\n this.windowSumSquare = new Float32Array(this.fftBufferSize);\r\n }\r\n\r\n // Reset FFT I/O buffers if necessary\r\n if (this.fftInput.length > inputChannels) {\r\n this.fftInput.splice(inputChannels);\r\n }\r\n if (this.fftOutput.length > outputChannels) {\r\n this.fftOutput.splice(outputChannels);\r\n }\r\n if (fftSizeChanged || fftOverlapChanged) {\r\n for (let i = 0; i < inputChannels; i++) {\r\n this.fftInput[i] = new Float32Array(this.fftBufferSize);\r\n }\r\n for (let i = 0; i < outputChannels; i++) {\r\n this.fftOutput[i] = new Float32Array(this.fftBufferSize);\r\n }\r\n } else {\r\n if (this.fftInput.length < inputChannels) {\r\n for (let i = this.fftInput.length; i < inputChannels; i++) {\r\n this.fftInput[i] = new Float32Array(this.fftBufferSize);\r\n }\r\n }\r\n if (this.fftOutput.length < outputChannels) {\r\n for (let i = this.fftOutput.length; i < outputChannels; i++) {\r\n this.fftOutput[i] = new Float32Array(this.fftBufferSize);\r\n }\r\n }\r\n }\r\n }\r\n async createFFTProcessor() {\r\n this.fDSPCode?.stop();\r\n this.fDSPCode?.destroy();\r\n\r\n // Create Monophonic DSP\r\n this.fDSPCode = new FaustMonoWebAudioDsp(this.dspInstance, sampleRate, this.sampleSize, this.fftProcessorBufferSize);\r\n\r\n // Setup output handler\r\n this.fDSPCode.setOutputParamHandler((path, value) => this.port.postMessage({ path, value, type: \"param\" }));\r\n this.fDSPCode.setPlotHandler(this.fPlotHandler);\r\n const params = this.fDSPCode.getParams();\r\n this.fDSPCode.start();\r\n // Write the cached parameters\r\n for (const path in this.paramValuesCache) {\r\n if (!!fftParamKeywords.find(k => `/${path}`.endsWith(k))) continue;\r\n this.fDSPCode.setParamValue(path, this.paramValuesCache[path])\r\n }\r\n // Write the FFT reverved parameters\r\n const fftSizeParam = params.find(s => s.endsWith(\"/fftSize\"));\r\n if (fftSizeParam) this.fDSPCode.setParamValue(fftSizeParam, this.fftSize);\r\n this.fftHopSizeParam = params.find(s => s.endsWith(\"/fftHopSize\"));\r\n if (this.fftHopSizeParam) this.fDSPCode.setParamValue(this.fftHopSizeParam, this.fftHopSize);\r\n // Prepare a array of zeros for furthur usage\r\n this.fftProcessorZeros = new Float32Array(this.fftProcessorBufferSize);\r\n }\r\n destroy() {\r\n this.fDSPCode?.stop();\r\n this.fDSPCode?.destroy();\r\n this.rfft?.dispose();\r\n this.destroyed = true;\r\n }\r\n\r\n }\r\n\r\n const Processor = FaustFFTAudioWorkletProcessor;\r\n if (register) {\r\n try {\r\n registerProcessor(processorName || dspName || \"myfftdsp\", Processor);\r\n } catch (error) {\r\n console.warn(error);\r\n }\r\n }\r\n\r\n return FaustFFTAudioWorkletProcessor;\r\n\r\n};\r\n\r\nexport default getFaustFFTAudioWorkletProcessor;\r\n", "import { Sha256 } from \"@aws-crypto/sha256-js\";\nimport type { ILibFaust } from \"./LibFaust\";\nimport type { FaustDspFactory, IntVector } from \"./types\";\n\nexport const ab2str = (buf: Uint8Array) => String.fromCharCode.apply(null, buf);\n\nexport const str2ab = (str: string) => {\n const buf = new ArrayBuffer(str.length);\n const bufView = new Uint8Array(buf);\n for (let i = 0, strLen = str.length; i < strLen; i++) {\n bufView[i] = str.charCodeAt(i);\n }\n return bufView;\n};\nconst sha256 = async (str: string) => {\n const sha256 = new Sha256();\n sha256.update(str);\n const hashArray = Array.from(await sha256.digest());\n const hashHex = hashArray.map(b => b.toString(16).padStart(2, \"0\")).join(\"\");\n return hashHex;\n};\n\nexport interface IFaustCompiler {\n /**\n * Gives the Faust compiler version.\n * @return a version string\n */\n version(): string;\n\n /**\n * Gives the last compilation error.\n * @return an error string\n */\n getErrorMessage(): string;\n\n /**\n * Create a wasm factory from Faust code i.e. wasm compiled code, to be used to create monophonic instances. \n * This function is running asynchronously.\n *\n * @param name - an arbitrary name for the Faust factory\n * @param code - Faust dsp code\n * @param args - the compiler options\n * @returns returns the wasm factory\n */\n createMonoDSPFactory(name: string, code: string, args: string): Promise<FaustDspFactory | null>;\n\n /**\n * Create a wasm factory from Faust code i.e. wasm compiled code, to be used to create polyphonic instances. \n * This function is running asynchronously.\n *\n * @param name - an arbitrary name for the Faust factory\n * @param code - Faust dsp code\n * @param args - the compiler options\n * @returns returns the wasm factory\n */\n createPolyDSPFactory(name: string, code: string, args: string): Promise<FaustDspFactory | null>;\n\n /**\n * Delete a dsp factory.\n *\n * @param factory - the factory to be deleted\n */\n deleteDSPFactory(factory: FaustDspFactory): void;\n\n /**\n * Expand Faust code i.e. linearize included libraries.\n *\n * @param code - Faust dsp code\n * @param args - the compiler options\n * @returns returns the expanded dsp code\n */\n expandDSP(code: string, args: string): string | null;\n\n /**\n * Generates auxiliary files from Faust code. The output depends on the compiler options.\n *\n * @param name - an arbitrary name for the Faust module\n * @param code - Faust dsp code\n * @param args - the compiler options\n * @returns whether the generation actually succeded\n */\n generateAuxFiles(name: string, code: string, args: string): boolean;\n\n /**\n * Delete all factories.\n */\n deleteAllDSPFactories(): void;\n\n fs(): typeof FS;\n\n getAsyncInternalMixerModule(isDouble?: boolean): Promise<{ mixerBuffer: Uint8Array; mixerModule: WebAssembly.Module }>;\n getSyncInternalMixerModule(isDouble?: boolean): { mixerBuffer: Uint8Array; mixerModule: WebAssembly.Module };\n}\n\nclass FaustCompiler implements IFaustCompiler {\n private fLibFaust: ILibFaust;\n private fErrorMessage: string;\n private static gFactories: Map<string, FaustDspFactory> = new Map<string, FaustDspFactory>();\n private mixer32Buffer!: Uint8Array;\n private mixer64Buffer!: Uint8Array;\n private mixer32Module!: WebAssembly.Module;\n private mixer64Module!: WebAssembly.Module;\n\n /**\n * Get a stringified DSP factories table\n */\n static serializeDSPFactories() {\n const table: Record<string, { code: string, json: any; poly: boolean }> = {};\n this.gFactories.forEach((factory, shaKey) => {\n const { code, json, poly } = factory;\n table[shaKey] = { code: btoa(ab2str(code)), json: JSON.parse(json), poly };\n });\n return table;\n }\n /**\n * Get a stringified DSP factories table as string\n */\n static stringifyDSPFactories() {\n return JSON.stringify(this.serializeDSPFactories());\n }\n /**\n * Import a DSP factories table\n */\n static deserializeDSPFactories(table: Record<string, { code: string, json: any; poly: boolean }>) {\n const awaited: Promise<Map<string, FaustDspFactory>>[] = [];\n for (const shaKey in table) {\n const factory = table[shaKey];\n const { code, json, poly } = factory;\n const ab = str2ab(atob(code))\n awaited.push(WebAssembly.compile(ab).then(module => this.gFactories.set(shaKey, { shaKey, cfactory: 0, code: ab, module, json: JSON.stringify(json), poly })));\n }\n return Promise.all(awaited);\n }\n /**\n * Import a stringified DSP factories table\n */\n static importDSPFactories(tableStr: string) {\n const table: Record<string, { code: string, json: any; poly: boolean }> = JSON.parse(tableStr);\n return this.deserializeDSPFactories(table);\n }\n constructor(libFaust: ILibFaust) {\n this.fLibFaust = libFaust;\n this.fErrorMessage = \"\";\n }\n private intVec2intArray(vec: IntVector) {\n const size = vec.size();\n const ui8Code = new Uint8Array(size);\n for (let i = 0; i < size; i++) {\n ui8Code[i] = vec.get(i);\n }\n return ui8Code;\n }\n private async createDSPFactory(name: string, code: string, args: string, poly: boolean) {\n // Cleanup the cache\n if (FaustCompiler.gFactories.size > 10) {\n FaustCompiler.gFactories.clear();\n }\n\n // If code is already compiled, return the cached factory\n let shaKey = await sha256(name + code + args + (poly ? \"poly\" : \"mono\"));\n if (FaustCompiler.gFactories.has(shaKey)) {\n return FaustCompiler.gFactories.get(shaKey) || null;\n } else {\n try {\n // Can possibly raise a C++ exception catched by the second catch()\n const faustDspWasm = this.fLibFaust.createDSPFactory(name, code, args, !poly);\n const ui8Code = this.intVec2intArray(faustDspWasm.data);\n faustDspWasm.data.delete();\n const module = await WebAssembly.compile(ui8Code);\n const factory: FaustDspFactory = { shaKey, cfactory: faustDspWasm.cfactory, code: ui8Code, module, json: faustDspWasm.json, poly };\n // Factory C++ side can be deallocated immediately\n this.deleteDSPFactory(factory);\n // Keep the compiled factory in the cache\n FaustCompiler.gFactories.set(shaKey, factory);\n return factory;\n } catch (e) {\n this.fErrorMessage = this.fLibFaust.getErrorAfterException();\n // console.error(`=> exception raised while running createDSPFactory: ${this.fErrorMessage}`, e);\n this.fLibFaust.cleanupAfterException();\n throw this.fErrorMessage ? new Error(this.fErrorMessage) : e;\n }\n }\n }\n version() {\n return this.fLibFaust.version();\n }\n getErrorMessage() {\n return this.fErrorMessage;\n }\n async createMonoDSPFactory(name: string, code: string, args: string) {\n return this.createDSPFactory(name, code, args, false);\n }\n async createPolyDSPFactory(name: string, code: string, args: string) {\n return this.createDSPFactory(name, code, args, true);\n }\n deleteDSPFactory(factory: FaustDspFactory) {\n this.fLibFaust.deleteDSPFactory(factory.cfactory);\n factory.cfactory = 0;\n }\n expandDSP(code: string, args: string) {\n try {\n return this.fLibFaust.expandDSP(\"FaustDSP\", code, args);\n } catch (e) {\n this.fErrorMessage = this.fLibFaust.getErrorAfterException();\n // console.error(`=> exception raised while running expandDSP: ${this.fErrorMessage}`);\n this.fLibFaust.cleanupAfterException();\n throw this.fErrorMessage ? new Error(this.fErrorMessage) : e;\n }\n }\n generateAuxFiles(name: string, code: string, args: string) {\n try {\n return this.fLibFaust.generateAuxFiles(name, code, args);\n } catch (e) {\n this.fErrorMessage = this.fLibFaust.getErrorAfterException();\n // console.error(`=> exception raised while running generateAuxFiles: ${this.fErrorMessage}`);\n this.fLibFaust.cleanupAfterException();\n throw this.fErrorMessage ? new Error(this.fErrorMessage) : e;\n }\n }\n deleteAllDSPFactories(): void {\n this.fLibFaust.deleteAllDSPFactories();\n }\n fs() {\n return this.fLibFaust.fs();\n }\n async getAsyncInternalMixerModule(isDouble = false) {\n const bufferKey = isDouble ? \"mixer64Buffer\" : \"mixer32Buffer\";\n const moduleKey = isDouble ? \"mixer64Module\" : \"mixer32Module\";\n if (this[moduleKey]) return { mixerBuffer: this[bufferKey], mixerModule: this[moduleKey] };\n const path = isDouble ? \"/usr/rsrc/mixer64.wasm\" : \"/usr/rsrc/mixer32.wasm\";\n const mixerBuffer = this.fs().readFile(path, { encoding: \"binary\" });\n this[bufferKey] = mixerBuffer;\n // Compile mixer\n const mixerModule = await WebAssembly.compile(mixerBuffer);\n this[moduleKey] = mixerModule;\n return { mixerBuffer, mixerModule };\n }\n getSyncInternalMixerModule(isDouble = false) {\n const bufferKey = isDouble ? \"mixer64Buffer\" : \"mixer32Buffer\";\n const moduleKey = isDouble ? \"mixer64Module\" : \"mixer32Module\";\n if (this[moduleKey]) return { mixerBuffer: this[bufferKey], mixerModule: this[moduleKey] };\n const path = isDouble ? \"/usr/rsrc/mixer64.wasm\" : \"/usr/rsrc/mixer32.wasm\";\n const mixerBuffer = this.fs().readFile(path, { encoding: \"binary\" });\n this[bufferKey] = mixerBuffer;\n // Compile mixer\n const mixerModule = new WebAssembly.Module(mixerBuffer);\n this[moduleKey] = mixerModule;\n return { mixerBuffer, mixerModule };\n }\n}\n\nexport default FaustCompiler;\n", "/**\n * The Faust wasm instance interface.\n */\nexport interface IFaustDspInstance {\n /**\n * The dsp computation, to be called with successive input/output audio buffers.\n *\n * @param $dsp - the DSP pointer\n * @param count - the audio buffer size in frames\n * @param $inputs - the input audio buffer as in index in wasm memory\n * @param $output - the output audio buffer as in index in wasm memory\n */\n compute($dsp: number, count: number, $inputs: number, $output: number): void;\n\n /**\n * Give the number of inputs of a Faust wasm instance.\n * \n * @param $dsp - the DSP pointer\n */\n getNumInputs($dsp: number): number;\n\n /**\n * Give the number of outputs of a Faust wasm instance.\n * \n * @param $dsp - the DSP pointer\n */\n getNumOutputs($dsp: number): number;\n\n /**\n * Give a parameter current value.\n * \n * @param $dsp - the DSP pointer\n * @param index - the parameter index\n * @preturn the parameter value\n */\n getParamValue($dsp: number, index: number): number;\n\n /**\n * Give the Faust wasm instance sample rate.\n * \n * @param $dsp - the DSP pointer\n * @preturn the sample rate\n */\n getSampleRate($dsp: number): number;\n\n /**\n * Global init, calls the following methods:\n * - static class 'classInit': static tables initialization\n * - 'instanceInit': constants and instance state initialization\n *\n * @param $dsp - the DSP pointer\n * @param sampleRate - the sampling rate in Hertz\n */\n init($dsp: number, sampleRate: number): void;\n\n /** Init instance state (delay lines...).\n * \n * @param $dsp - the DSP pointer\n */\n instanceClear($dsp: number): void;\n\n /** Init instance constant state.\n * \n * @param $dsp - the DSP pointer\n * @param sampleRate - the sampling rate in Hertz\n */\n instanceConstants($dsp: number, sampleRate: number): void;\n\n /** Init instance state.\n * \n * @param $dsp - the DSP pointer\n * @param sampleRate - the sampling rate in Hertz\n */\n instanceInit($dsp: number, sampleRate: number): void;\n\n /** Init default control parameters values.\n * \n * @param $dsp - the DSP pointer\n */\n instanceResetUserInterface($dsp: number): void;\n\n /**\n * Set a parameter current value.\n * \n * @param $dsp - the DSP pointer\n * @param index - the parameter index\n * @param value - the parameter value\n */\n setParamValue($dsp: number, index: number, value: number): void;\n}\n\n/**\n * Mixer used in polyphonic mode.\n */\nexport interface IFaustMixerInstance {\n clearOutput(bufferSize: number, chans: number, $outputs: number): void;\n mixCheckVoice(bufferSize: number, chans: number, $inputs: number, $outputs: number): number;\n fadeOut(bufferSize: number, chans: number, $outputs: number): void;\n}\n\n/**\n * Monophonic instance.\n */\nexport interface FaustMonoDspInstance {\n memory: WebAssembly.Memory;\n api: IFaustDspInstance;\n json: string;\n}\n\n/**\n * Polyphonic instance.\n */\nexport interface FaustPolyDspInstance {\n memory: WebAssembly.Memory;\n voices: number;\n voiceAPI: IFaustDspInstance;\n effectAPI?: IFaustDspInstance;\n mixerAPI: IFaustMixerInstance;\n voiceJSON: string;\n effectJSON?: string;\n}\n\nexport class FaustDspInstance implements IFaustDspInstance {\n private readonly fExports: IFaustDspInstance;\n\n constructor(exports: IFaustDspInstance) { this.fExports = exports; }\n\n compute($dsp: number, count: number, $input: number, $output: number) { this.fExports.compute($dsp, count, $input, $output); }\n getNumInputs($dsp: number) { return this.fExports.getNumInputs($dsp); }\n getNumOutputs($dsp: number) { return this.fExports.getNumOutputs($dsp); }\n getParamValue($dsp: number, index: number) { return this.fExports.getParamValue($dsp, index); }\n getSampleRate($dsp: number) { return this.fExports.getSampleRate($dsp); }\n init($dsp: number, sampleRate: number) { this.fExports.init($dsp, sampleRate); }\n instanceClear($dsp: number) { this.fExports.instanceClear($dsp); }\n instanceConstants($dsp: number, sampleRate: number) { this.fExports.instanceConstants($dsp, sampleRate); }\n instanceInit($dsp: number, sampleRate: number) { this.fExports.instanceInit($dsp, sampleRate); }\n instanceResetUserInterface($dsp: number) { this.fExports.instanceResetUserInterface($dsp); }\n setParamValue($dsp: number, index: number, value: number) { this.fExports.setParamValue($dsp, index, value); }\n}\n", "import { FaustDspInstance, FaustMonoDspInstance, FaustPolyDspInstance, IFaustDspInstance, IFaustMixerInstance } from \"./FaustDspInstance\";\nimport type { FaustDspFactory, FaustDspMeta, LooseFaustDspFactory } from \"./types\";\n\nclass FaustWasmInstantiator {\n private static createWasmImport(memory?: WebAssembly.Memory) {\n return {\n env: {\n memory: memory || new WebAssembly.Memory({ initial: 100 }),\n memoryBase: 0,\n tableBase: 0,\n // Integer version\n _abs: Math.abs,\n // Float version\n _acosf: Math.acos, _asinf: Math.asin, _atanf: Math.atan, _atan2f: Math.atan2,\n _ceilf: Math.ceil, _cosf: Math.cos, _expf: Math.exp, _floorf: Math.floor,\n _fmodf: (x: number, y: number) => x % y,\n _logf: Math.log, _log10f: Math.log10, _max_f: Math.max, _min_f: Math.min,\n _remainderf: (x: number, y: number) => x - Math.round(x / y) * y,\n _powf: Math.pow, _roundf: Math.round, _sinf: Math.sin, _sqrtf: Math.sqrt, _tanf: Math.tan,\n _acoshf: Math.acosh, _asinhf: Math.asinh, _atanhf: Math.atanh,\n _coshf: Math.cosh, _sinhf: Math.sinh, _tanhf: Math.tanh,\n _isnanf: Number.isNaN, _isinff: (x: number) => !isFinite(x),\n _copysignf: (x: number, y: number) => (Math.sign(x) === Math.sign(y) ? x : -x),\n\n // Double version\n _acos: Math.acos, _asin: Math.asin, _atan: Math.atan, _atan2: Math.atan2,\n _ceil: Math.ceil, _cos: Math.cos, _exp: Math.exp, _floor: Math.floor,\n _fmod: (x: number, y: number) => x % y,\n _log: Math.log, _log10: Math.log10, _max_: Math.max, _min_: Math.min,\n _remainder: (x: number, y: number) => x - Math.round(x / y) * y,\n _pow: Math.pow, _round: Math.round, _sin: Math.sin, _sqrt: Math.sqrt, _tan: Math.tan,\n _acosh: Math.acosh, _asinh: Math.asinh, _atanh: Math.atanh,\n _cosh: Math.cosh, _sinh: Math.sinh, _tanh: Math.tanh,\n _isnan: Number.isNaN, _isinf: (x: number) => !isFinite(x),\n _copysign: (x: number, y: number) => (Math.sign(x) === Math.sign(y) ? x : -x),\n\n table: new WebAssembly.Table({ initial: 0, element: \"anyfunc\" })\n }\n };\n }\n private static createWasmMemoryPoly(voicesIn: number, sampleSize: number, dspMeta: FaustDspMeta, effectMeta: FaustDspMeta, bufferSize: number) {\n // Hack : at least 4 voices (to avoid weird wasm memory bug?)\n const voices = Math.max(4, voicesIn);\n // Memory allocator\n const ptrSize = sampleSize; // Done on wast/wasm backend side\n const pow2limit = (x: number) => {\n let n = 65536; // Minimum = 64 kB\n while (n < x) { n *= 2; }\n return n;\n };\n const effectSize = effectMeta ? effectMeta.size : 0;\n let memorySize = pow2limit(\n effectSize\n + dspMeta.size * voices\n + (dspMeta.inputs + dspMeta.outputs * 2) // + 2 for effect\n * (ptrSize + bufferSize * sampleSize)\n ) / 65536;\n memorySize = Math.max(2, memorySize); // At least 2\n return new WebAssembly.Memory({ initial: memorySize });\n };\n\n private static createWasmMemoryMono(sampleSize: number, dspMeta: FaustDspMeta, bufferSize: number) {\n // Memory allocator\n const ptrSize = sampleSize; // Done on wast/wasm backend side\n const memorySize = (dspMeta.size + (dspMeta.inputs + dspMeta.outputs) * (ptrSize + bufferSize * sampleSize)) / 65536;\n return new WebAssembly.Memory({ initial: memorySize * 2 }); // Safer to have a bit more memory\n }\n\n private static createMonoDSPInstanceAux(instance: WebAssembly.Instance, json: string, mem: WebAssembly.Memory | null = null) {\n const functions = instance.exports as IFaustDspInstance & WebAssembly.Exports;\n const api = new FaustDspInstance(functions);\n const memory: any = (mem) ? mem : instance.exports.memory;\n return { memory, api, json } as FaustMonoDspInstance;\n }\n\n private static createMemoryMono(monoFactory: LooseFaustDspFactory) {\n // Parse JSON to get 'size' and 'inputs/outputs' infos\n const monoMeta: FaustDspMeta = JSON.parse(monoFactory.json);\n const sampleSize = monoMeta.compile_options.match(\"-double\") ? 8 : 4;\n return this.createWasmMemoryMono(sampleSize, monoMeta, 8192);\n\n }\n private static createMemoryPoly(voices: number, voiceFactory: LooseFaustDspFactory, effectFactory?: LooseFaustDspFactory) {\n // Parse JSON to get 'size' and 'inputs/outputs' infos\n const voiceMeta: FaustDspMeta = JSON.parse(voiceFactory.json);\n const effectMeta: FaustDspMeta = (effectFactory && effectFactory.json) ? JSON.parse(effectFactory.json) : null;\n const sampleSize = voiceMeta.compile_options.match(\"-double\") ? 8 : 4;\n // Memory will be shared by voice, mixer and (possibly) effect instances\n return this.createWasmMemoryPoly(voices, sampleSize, voiceMeta, effectMeta, 8192);\n }\n\n private static createMixerAux(mixerModule: WebAssembly.Module, memory: WebAssembly.Memory) {\n // Create mixer instance\n const mixerImport = {\n imports: { print: console.log },\n memory: { memory }\n };\n const mixerInstance = new WebAssembly.Instance(mixerModule, mixerImport);\n const mixerFunctions = mixerInstance.exports as IFaustMixerInstance & WebAssembly.Exports;\n return mixerFunctions;\n }\n\n // Public API\n static async loadDSPFactory(wasmPath: string, jsonPath: string) {\n const wasmFile = await fetch(wasmPath);\n if (!wasmFile.ok) {\n throw new Error(`=> exception raised while running loadDSPFactory, file not found: ${wasmPath}`);\n }\n try {\n const wasmBuffer = await wasmFile.arrayBuffer();\n const module = await WebAssembly.compile(wasmBuffer);\n const jsonFile = await fetch(jsonPath);\n const json = await jsonFile.text();\n const meta: FaustDspMeta = JSON.parse(json);\n const cOptions = meta.compile_options;\n const poly = cOptions.indexOf('wasm-e') !== -1;\n return { cfactory: 0, code: new Uint8Array(wasmBuffer), module, json, poly } as FaustDspFactory;\n } catch (e) {\n // console.error(`=> exception raised while running loadDSPFactory: ${e}`);\n throw e;\n }\n }\n\n static async loadDSPMixer(mixerPath: string, fs?: typeof FS) {\n try {\n let mixerBuffer = null;\n if (fs) {\n mixerBuffer = fs.readFile(mixerPath, { encoding: \"binary\" });\n } else {\n const mixerFile = await fetch(mixerPath);\n mixerBuffer = await mixerFile.arrayBuffer();\n }\n // Compile mixer\n return WebAssembly.compile(mixerBuffer);\n } catch (e) {\n // console.error(`=> exception raised while running loadMixer: ${e}`);\n throw e;\n }\n }\n\n static async createAsyncMonoDSPInstance(factory: LooseFaustDspFactory) {\n\n // Regular expression to match the 'type: soundfile' pattern\n const pattern = /\"type\":\\s*\"soundfile\"/;\n // Check if the pattern exists in the JSON string\n const isDetected = pattern.test(factory.json);\n\n if (isDetected) {\n const memory = this.createMemoryMono(factory);\n const instance = await WebAssembly.instantiate(factory.module, this.createWasmImport(memory));\n return this.createMonoDSPInstanceAux(instance, factory.json, memory);\n } else {\n // Otherwise, we can create the instance using the wasm internal memory allocated by the wasm module\n const instance = await WebAssembly.instantiate(factory.module, this.createWasmImport());\n return this.createMonoDSPInstanceAux(instance, factory.json);\n }\n }\n\n static createSyncMonoDSPInstance(factory: LooseFaustDspFactory) {\n\n // Regular expression to match the 'type: soundfile' pattern\n const pattern = /\"type\":\\s*\"soundfile\"/;\n // Check if the pattern exists in the JSON string\n const isDetected = pattern.test(factory.json);\n\n // If the JSON contains a soundfile UI element, we need to create a memory object\n if (isDetected) {\n const memory = this.createMemoryMono(factory);\n const instance = new WebAssembly.Instance(factory.module, this.createWasmImport(memory));\n return this.createMonoDSPInstanceAux(instance, factory.json, memory);\n } else {\n // Otherwise, we can create the instance using the wasm internal memory allocated by the wasm module\n const instance = new WebAssembly.Instance(factory.module, this.createWasmImport());\n return this.createMonoDSPInstanceAux(instance, factory.json);\n }\n }\n\n static async createAsyncPolyDSPInstance(voiceFactory: LooseFaustDspFactory, mixerModule: WebAssembly.Module, voices: number, effectFactory?: LooseFaustDspFactory): Promise<FaustPolyDspInstance> {\n const memory = this.createMemoryPoly(voices, voiceFactory, effectFactory);\n // Create voice \n const voiceInstance = await WebAssembly.instantiate(voiceFactory.module, this.createWasmImport(memory));\n const voiceFunctions = voiceInstance.exports as IFaustDspInstance & WebAssembly.Exports;\n const voiceAPI = new FaustDspInstance(voiceFunctions);\n // Create mixer\n const mixerAPI = this.createMixerAux(mixerModule, memory);\n\n // Possibly create effect instance \n if (effectFactory) {\n const effectInstance = await WebAssembly.instantiate(effectFactory.module, this.createWasmImport(memory));\n const effectFunctions = effectInstance.exports as IFaustDspInstance & WebAssembly.Exports;\n const effectAPI = new FaustDspInstance(effectFunctions);\n return {\n memory,\n voices,\n voiceAPI,\n effectAPI,\n mixerAPI,\n voiceJSON: voiceFactory.json,\n effectJSON: effectFactory.json\n } as FaustPolyDspInstance;\n } else {\n return {\n memory,\n voices,\n voiceAPI,\n mixerAPI,\n voiceJSON: voiceFactory.json\n } as FaustPolyDspInstance;\n }\n }\n\n static createSyncPolyDSPInstance(voiceFactory: LooseFaustDspFactory, mixerModule: WebAssembly.Module, voices: number, effectFactory?: LooseFaustDspFactory): FaustPolyDspInstance {\n const memory = this.createMemoryPoly(voices, voiceFactory, effectFactory);\n // Create voice \n const voiceInstance = new WebAssembly.Instance(voiceFactory.module, this.createWasmImport(memory));\n const voiceFunctions = voiceInstance.exports as IFaustDspInstance & WebAssembly.Exports;\n const voiceAPI = new FaustDspInstance(voiceFunctions);\n // Create mixer\n const mixerAPI = this.createMixerAux(mixerModule, memory);\n\n // Possibly create effect instance \n if (effectFactory) {\n const effectInstance = new WebAssembly.Instance(effectFactory.module, this.createWasmImport(memory));\n const effectFunctions = effectInstance.exports as IFaustDspInstance & WebAssembly.Exports;\n const effectAPI = new FaustDspInstance(effectFunctions);\n return {\n memory,\n voices,\n voiceAPI,\n effectAPI,\n mixerAPI,\n voiceJSON: voiceFactory.json,\n effectJSON: effectFactory.json\n } as FaustPolyDspInstance;\n } else {\n return {\n memory,\n voices,\n voiceAPI,\n mixerAPI,\n voiceJSON: voiceFactory.json\n } as FaustPolyDspInstance;\n }\n }\n}\n\nexport default FaustWasmInstantiator;\n", "import type { FaustMonoDspInstance, FaustPolyDspInstance, IFaustDspInstance } from \"./FaustDspInstance\";\nimport type { FaustDspMeta, FaustUIDescriptor, FaustUIGroup, FaustUIInputItem, FaustUIItem } from \"./types\";\n\n// Public API\nexport type OutputParamHandler = (path: string, value: number) => void;\nexport type ComputeHandler = (buffer_size: number) => void;\nexport type PlotHandler = (plotted: Float32Array[] | Float64Array[], index: number, events?: { type: string; data: any }[]) => void;\nexport type MetadataHandler = (key: string, value: string) => void;\n\n// Implementation API\nexport type UIHandler = (item: FaustUIItem) => void;\n\n/**\n * WasmAllocator is a basic memory management class designed to allocate\n * blocks of memory within a WebAssembly.Memory object. It provides a simple\n * alloc method to allocate a contiguous block of memory of a specified size.\n * \n * The allocator operates by keeping a linear progression through the memory,\n * always allocating the next block at the end of the last. This approach does not\n * handle freeing of memory or reuse of memory spaces.\n */\nclass WasmAllocator {\n // The WebAssembly.Memory object this allocator will manage.\n private readonly memory: WebAssembly.Memory;\n // The number of bytes currently allocated. This serves as the \"pointer\" to the\n // next free byte in the memory.\n private allocatedBytes: number;\n\n constructor(memory: WebAssembly.Memory, offset: number) {\n this.memory = memory;\n // Initialize the allocator with offset allocated bytes.\n this.allocatedBytes = offset;\n }\n\n /**\n * Allocates a block of memory of the specified size, returning the pointer to the\n * beginning of the block. The block is allocated at the current offset and the\n * offset is incremented by the size of the block.\n * \n * @param sizeInBytes The size of the block to allocate in bytes.\n * @returns The offset (pointer) to the beginning of the allocated block.\n */\n alloc(sizeInBytes: number): number {\n // Store the current offset as the start of the new block.\n const currentOffset = this.allocatedBytes;\n // Calculate the new offset after allocating the requested block.\n const newOffset = currentOffset + sizeInBytes;\n // Get the total size of the WebAssembly memory in bytes.\n const totalMemoryBytes = this.memory.buffer.byteLength;\n\n // If the new offset exceeds the total size of the memory, grow the memory.\n if (newOffset > totalMemoryBytes) {\n // Calculate the number of WebAssembly pages needed to fit the new allocation.\n // WebAssembly memory pages are 64KiB each.\n const neededPages = Math.ceil((newOffset - totalMemoryBytes) / 65536);\n // Grow the memory by the required number of pages.\n console.log(`GROW: ${neededPages} pages`);\n this.memory.grow(neededPages);\n }\n\n // Update the allocated bytes to the new offset.\n this.allocatedBytes = newOffset;\n // Return the offset at which the allocated block starts.\n return currentOffset;\n }\n\n /**\n * Returns the underlying buffer object.\n * \n * @returns The buffer object.\n */\n getBuffer(): ArrayBuffer {\n return this.memory.buffer;\n }\n\n /**\n * Returns the Int32 view of the underlying buffer object.\n * \n * @returns The view of the memory buffer as Int32Array.\n */\n getInt32Array(): Int32Array {\n return new Int32Array(this.memory.buffer);\n }\n\n /**\n * Returns the Int64 view of the underlying buffer object.\n * \n * @returns The view of the memory buffer as BigInt64Array.\n */\n getInt64Array(): BigInt64Array {\n return new BigInt64Array(this.memory.buffer);\n }\n\n /**\n * Returns the Float32 view of the underlying buffer object.\n * \n * @returns The view of the memory buffer as Float32Array.\n */\n getFloat32Array(): Float32Array {\n return new Float32Array(this.memory.buffer);\n }\n\n /**\n * Returns the Float64 view of the underlying buffer object..\n * \n * @returns The view of the memory buffer as Float64Array.\n */\n getFloat64Array(): Float64Array {\n return new Float64Array(this.memory.buffer);\n }\n}\n\n// Maximum number of soundfile parts.\nconst MAX_SOUNDFILE_PARTS = 256;\n\n// Maximum number of channels.\nconst MAX_CHAN = 64;\n\n// Maximum buffer size in frames.\nconst BUFFER_SIZE = 1024;\n\n// Default sample rate.\nconst SAMPLE_RATE = 44100;\n\n/**\n * Soundfile class to handle soundfile data in wasm memory.\n */\nclass Soundfile {\n private readonly fPtr: number; // Pointer to the soundfile structure in wasm memory\n private readonly fBuffers: number;\n private readonly fLength: number;\n private readonly fSR: number;\n private readonly fOffset: number;\n private readonly fSampleSize: number;\n private readonly fPtrSize: number;\n private readonly fIntSize: number;\n private readonly fAllocator: WasmAllocator;\n\n constructor(allocator: WasmAllocator, sampleSize: number, curChan: number, length: number, maxChan: number, totalParts: number) {\n\n this.fSampleSize = sampleSize;\n\n // To be coherent with the code generated by the wast/wasm backends:\n // - that uses 4 bytes for int when float is used\n // - that uses 8 bytes for int when double is used (to simplify the code generation)\n this.fIntSize = this.fSampleSize;\n\n this.fPtrSize = 4; // Not related to float/double choice, so always 4\n\n this.fAllocator = allocator;\n\n console.log(`Soundfile constructor: curChan: ${curChan}, length: ${length}, maxChan: ${maxChan}, totalParts: ${totalParts}`);\n\n // Allocate wasm memory for the soundfile structure\n this.fPtr = allocator.alloc(4 * this.fPtrSize); // 4 fPtrSize: fBuffers, fLength, fSR, fOffset\n\n // Use the 4 or 8 bytes size for int. The access are then adapted in copyToOut and emptyFile methods\n this.fLength = allocator.alloc(MAX_SOUNDFILE_PARTS * this.fIntSize);\n this.fSR = allocator.alloc(MAX_SOUNDFILE_PARTS * this.fIntSize);\n this.fOffset = allocator.alloc(MAX_SOUNDFILE_PARTS * this.fIntSize);\n\n this.fBuffers = this.allocBuffers(curChan, length, maxChan);\n\n //this.displayMemory(\"Allocated soundfile structure 1\");\n\n // Set the soundfile structure in wasm memory\n const HEAP32 = this.fAllocator.getInt32Array();\n HEAP32[this.fPtr >> 2] = this.fBuffers;\n HEAP32[(this.fPtr + this.fPtrSize) >> 2] = this.fLength;\n HEAP32[(this.fPtr + (2 * this.fPtrSize)) >> 2] = this.fSR;\n HEAP32[(this.fPtr + (3 * this.fPtrSize)) >> 2] = this.fOffset;\n\n for (let chan = 0; chan < curChan; chan++) {\n const buffer: number = HEAP32[(this.fBuffers >> 2) + chan];\n console.log(`allocBuffers AFTER: ${chan} - ${buffer}`);\n }\n\n //this.displayMemory(\"Allocated soundfile structure 2\");\n }\n\n private allocBuffers(curChan: number, length: number, maxChan: number): number {\n const buffers = this.fAllocator.alloc(maxChan * this.fPtrSize);\n\n console.log(`allocBuffers buffers: ${buffers}`);\n\n for (let chan = 0; chan < curChan; chan++) {\n const buffer: number = this.fAllocator.alloc(length * this.fSampleSize);\n // HEAP32 is the Int32Array view of the memory buffer which can change after grow in `alloc` method\n // so we need to recompute the buffer address\n const HEAP32 = this.fAllocator.getInt32Array();\n HEAP32[(buffers >> 2) + chan] = buffer;\n }\n //this.displayMemory(\"Allocated soundfile buffers\");\n return buffers;\n }\n\n shareBuffers(curChan: number, maxChan: number) {\n // Share the same buffers for all other channels so that we have maxChan channels available\n const HEAP32 = this.fAllocator.getInt32Array();\n for (let chan = curChan; chan < maxChan; chan++) {\n HEAP32[(this.fBuffers >> 2) + chan] = HEAP32[(this.fBuffers >> 2) + chan % curChan];\n }\n }\n\n copyToOut(part: number, maxChannels: number, offset: number, buffer: AudioBuffer) {\n\n // Set the soundfile fields in wasm memory\n if (this.fIntSize === 4) {\n const HEAP32 = this.fAllocator.getInt32Array();\n HEAP32[(this.fLength >> Math.log2(this.fIntSize)) + part] = buffer.length;\n HEAP32[(this.fSR >> Math.log2(this.fIntSize)) + part] = buffer.sampleRate;\n HEAP32[(this.fOffset >> Math.log2(this.fIntSize)) + part] = offset;\n } else {\n const HEAP64 = this.fAllocator.getInt64Array();\n HEAP64[(this.fLength >> Math.log2(this.fIntSize)) + part] = BigInt(buffer.length);\n HEAP64[(this.fSR >> Math.log2(this.fIntSize)) + part] = BigInt(buffer.sampleRate);\n HEAP64[(this.fOffset >> Math.log2(this.fIntSize)) + part] = BigInt(offset);\n }\n\n console.log(`copyToOut: part: ${part}, maxChannels: ${maxChannels}, offset: ${offset}, buffer: ${buffer}`);\n\n //this.displayMemory(\"IN copyToOut, BEFORE copyToOutReal\", true);\n // Copy the soundfile data to the buffer\n if (this.fSampleSize === 8) {\n this.copyToOutReal64(maxChannels, offset, buffer);\n } else {\n this.copyToOutReal32(maxChannels, offset, buffer);\n }\n //this.displayMemory(\"IN copyToOut, AFTER copyToOutReal\");\n }\n\n copyToOutReal32(maxChannels: number, offset: number, buffer: AudioBuffer) {\n const HEAP32 = this.fAllocator.getInt32Array();\n const HEAPF = this.fAllocator.getFloat32Array();\n for (let chan = 0; chan < buffer.numberOfChannels; chan++) {\n const input: Float32Array = buffer.getChannelData(chan);\n const output: number = HEAP32[(this.fBuffers >> 2) + chan];\n const begin: number = (output + (offset * this.fSampleSize)) >> Math.log2(this.fSampleSize);\n const end: number = (output + (offset + input.length) * this.fSampleSize) >> Math.log2(this.fSampleSize);\n console.log(`copyToOutReal32 begin: ${begin}, end: ${end}, delta: ${end - begin}`);\n const outputReal: Float32Array = HEAPF.subarray((output + (offset * this.fSampleSize)) >> Math.log2(this.fSampleSize),\n (output + (offset + input.length) * this.fSampleSize) >> Math.log2(this.fSampleSize));\n for (let sample = 0; sample < input.length; sample++) {\n outputReal[sample] = input[sample];\n }\n }\n }\n\n copyToOutReal64(maxChannels: number, offset: number, buffer: AudioBuffer) {\n const HEAP32 = this.fAllocator.getInt32Array();\n const HEAPF = this.fAllocator.getFloat64Array();\n for (let chan = 0; chan < buffer.numberOfChannels; chan++) {\n const input: Float32Array = buffer.getChannelData(chan);\n const output: number = HEAP32[(this.fBuffers >> 2) + chan];\n const begin: number = (output + (offset * this.fSampleSize)) >> Math.log2(this.fSampleSize);\n const end: number = (output + (offset + input.length) * this.fSampleSize) >> Math.log2(this.fSampleSize);\n console.log(`copyToOutReal64 begin: ${begin}, end: ${end}, delta: ${end - begin}`);\n const outputReal: Float64Array = HEAPF.subarray((output + (offset * this.fSampleSize)) >> Math.log2(this.fSampleSize),\n (output + (offset + input.length) * this.fSampleSize) >> Math.log2(this.fSampleSize));\n for (let sample = 0; sample < input.length; sample++) {\n outputReal[sample] = input[sample];\n }\n }\n }\n\n emptyFile(part: number, offset: number): number {\n\n // Set the soundfile fields in wasm memory\n if (this.fIntSize === 4) {\n const HEAP32 = this.fAllocator.getInt32Array();\n HEAP32[(this.fLength >> Math.log2(this.fIntSize)) + part] = BUFFER_SIZE;\n HEAP32[(this.fSR >> Math.log2(this.fIntSize)) + part] = SAMPLE_RATE;\n HEAP32[(this.fOffset >> Math.log2(this.fIntSize)) + part] = offset;\n } else {\n const HEAP64 = this.fAllocator.getInt64Array();\n HEAP64[(this.fLength >> Math.log2(this.fIntSize)) + part] = BigInt(BUFFER_SIZE);\n HEAP64[(this.fSR >> Math.log2(this.fIntSize)) + part] = BigInt(SAMPLE_RATE);\n HEAP64[(this.fOffset >> Math.log2(this.fIntSize)) + part] = BigInt(offset);\n }\n\n // Update and return the new offset\n return offset + BUFFER_SIZE;\n }\n\n displayMemory(where: string = \"\", mem: boolean = false) {\n console.log(\"Soundfile memory: \" + where);\n console.log(`fPtr: ${this.fPtr}`);\n console.log(`fBuffers: ${this.fBuffers}`);\n console.log(`fLength: ${this.fLength}`);\n console.log(`fSR: ${this.fSR}`);\n console.log(`fOffset: ${this.fOffset}`);\n const HEAP32 = this.fAllocator.getInt32Array();\n if (mem) console.log(`HEAP32: ${HEAP32}`);\n console.log(`HEAP32[this.fPtr >> 2]: ${HEAP32[this.fPtr >> 2]}`);\n console.log(`HEAP32[(this.fPtr + ptrSize) >> 2]: ${HEAP32[(this.fPtr + this.fPtrSize) >> 2]}`);\n console.log(`HEAP32[(this.fPtr + 2 * ptrSize) >> 2]: ${HEAP32[(this.fPtr + 2 * this.fPtrSize) >> 2]}`);\n console.log(`HEAP32[(this.fPtr + 3 * ptrSize) >> 2]: ${HEAP32[(this.fPtr + 3 * this.fPtrSize) >> 2]}`);\n }\n\n // Return the pointer to the soundfile structure in wasm memory\n getPtr(): number {\n return this.fPtr;\n }\n\n getHEAP32(): Int32Array {\n return this.fAllocator.getInt32Array();\n }\n getHEAPFloat32(): Float32Array {\n return this.fAllocator.getFloat32Array();\n }\n\n getHEAPFloat64(): Float64Array {\n return this.fAllocator.getFloat64Array();\n }\n\n}\n\n// Definition of the AudioBufferItem type\ntype AudioBufferItem = {\n pathName: string;\n audioBuffer: AudioBuffer;\n};\n\n/**\n * SoundfileReader class to read soundfile data and copy it to the soundfile buffer.\n */\nclass SoundfileReader {\n\n private readonly fAllocator: WasmAllocator;\n private readonly fSampleSize: number;\n private readonly fContext;\n private readonly fAudioBuffers: AudioBufferItem[];\n\n constructor(allocator: WasmAllocator, context: BaseAudioContext, sampleSize: number) {\n this.fAllocator = allocator;\n this.fSampleSize = sampleSize;\n this.fContext = context;\n this.fAudioBuffers = [];\n }\n\n /**\n * Check if the file exists.\n * \n * @param url : the url of the file to check\n * @returns : true if the file exists, otherwise false\n */\n private async checkFileExists(url: string): Promise<boolean> {\n try {\n console.log(`\"checkFileExists\" url: ${url}`);\n const response = await fetch(url, { method: 'HEAD' });\n return response.ok; // Will be true if the status code is 200-299\n } catch (error) {\n console.error('Fetch error:', error);\n return false;\n }\n }\n\n /**\n * Check if the file exists in the given directories.\n * \n * @param directories : the list of directories to search for the file \n * @param fileName : the name of the file to search for \n * @returns : the path of the file if found, otherwise an empty string\n */\n private async checkFile(directories: string[], fileName: string): Promise<string> {\n\n if (await this.checkFileExists(fileName)) {\n return fileName;\n } else {\n for (let i = 0; i < directories.length; i++) {\n const pathName = directories[i] + \"/\" + fileName;\n if (await this.checkFileExists(pathName)) {\n return pathName;\n }\n }\n return \"\";\n }\n }\n\n /**\n * Check if all soundfiles exist and return their real path_name.\n * \n * @param directories : the list of directories to search for the file\n * @param fileNameList : the list of file names to search for\n * @returns : the list of path names of the files if found, otherwise an empty string\n */\n async checkFiles(directories: string[], fileNameList: string[]): Promise<string[]> {\n const pathNameList: string[] = [];\n for (let i = 0; i < fileNameList.length; i++) {\n const pathName: string = await this.checkFile(directories, fileNameList[i]);\n console.log(`checkFiles pathName: ${pathName}`);\n // If 'pathName' is not found, it is replaced by an identifier for an empty sound (e.g., silence)\n pathNameList.push(pathName === \"\" ? \"__empty_sound__\" : pathName);\n }\n return pathNameList;\n }\n\n /**\n * Get the channels and length values of the given sound resource.\n * \n * @param pathName : the name of the file, or sound resource identified this way\n * @returns channels and length of the soundfile\n */\n private async getParamsFile(pathName: string): Promise<{ channels: number, length: number }> {\n console.log(`Loading sound file from ${pathName}`);\n\n const item = this.fAudioBuffers.find((element: AudioBufferItem) => element.pathName === pathName);\n if (item) {\n console.log(`getItemByPathName FOUND`);\n return { channels: item.audioBuffer.numberOfChannels, length: item.audioBuffer.length };\n } else {\n const response = await fetch(pathName);\n if (!response.ok) {\n console.log(`Failed to load sound file from ${pathName}: ${response.statusText}`);\n return { channels: 1, length: BUFFER_SIZE };\n } else {\n\n // Decode the audio data\n const arrayBuffer = await response.arrayBuffer();\n const audioBuffer = await this.fContext.decodeAudioData(arrayBuffer);\n const { numberOfChannels, length } = audioBuffer;\n\n // Keep the audio buffer for later use\n this.fAudioBuffers.push({ pathName, audioBuffer });\n\n // Ensure the returned object keys match what's being returned\n return { channels: numberOfChannels, length };\n }\n }\n }\n\n /**\n * Read one sound resource and fill the 'soundfile' structure accordingly\n *\n * @param soundfile - the soundfile to be filled\n * @param pathName - the name of the file, or sound resource identified this way\n * @param part - the part number to be filled in the soundfile\n * @param maxChan - the maximum number of mono channels to fill\n * \n * @returns the offset in the soundfile buffer\n *\n */\n private readFile(soundfile: Soundfile, pathName: string, part: number, offset: number, maxChan: number): number {\n // Read the soundfile\n const item = this.fAudioBuffers.find(entry => entry.pathName === pathName);\n // Copy the soundfile data to the buffer\n if (item) {\n //soundfile.displayMemory(\"BEFORE copyToOut\");\n soundfile.copyToOut(part, maxChan, offset, item.audioBuffer);\n //soundfile.displayMemory(\"AFTER copyToOut\");\n return offset + item.audioBuffer.length;\n } else {\n console.error(`Failed to access sound file from ${pathName}`);\n return offset + BUFFER_SIZE;\n }\n }\n\n /**\n * Crate a soundfile, load all parts and copy audio data to the wasm soundfile buffer.\n * @param pathNameList : list of soundfile paths\n * @param maxChan : maximum number of channels\n */\n async createSoundfile(pathNameList: string[], maxChan: number): Promise<Soundfile | null> {\n try {\n let curChan = 1; // At least one channel\n let totalLength = 0;\n\n // Compute total length and channels max of all files\n for (const pathName of pathNameList) {\n let chan: number = 0, len: number = 0;\n if (pathName === \"__empty_sound__\") {\n length = BUFFER_SIZE;\n chan = 1;\n } else {\n const { channels, length } = await this.getParamsFile(pathName);\n chan = channels;\n len = length;\n }\n curChan = Math.max(curChan, chan);\n totalLength += len;\n }\n\n // Complete with empty parts\n totalLength += (MAX_SOUNDFILE_PARTS - pathNameList.length) * BUFFER_SIZE;\n\n // Create the soundfile\n let soundfile = new Soundfile(this.fAllocator, this.fSampleSize, curChan, totalLength, maxChan, pathNameList.length);\n\n //soundfile.displayMemory(\"After soundfile creation\");\n // Init offset\n let offset = 0;\n\n // Read all files\n for (let part = 0; part < pathNameList.length; part++) {\n if (pathNameList[part] === \"__empty_sound__\") {\n // Empty sound\n offset = soundfile.emptyFile(part, offset);\n } else {\n // Read the soundfile and update the offset\n offset = await this.readFile(soundfile, pathNameList[part], part, offset, maxChan);\n }\n }\n\n //soundfile.displayMemory(\"After reading soundfiles\");\n\n // Complete with empty parts\n for (let part = pathNameList.length; part < MAX_SOUNDFILE_PARTS; part++) {\n offset = soundfile.emptyFile(part, offset);\n }\n\n //soundfile.displayMemory(\"After emptyFile\");\n\n // Share the same buffers for all other channels so that we have maxChan channels available\n soundfile.shareBuffers(curChan, maxChan);\n\n //soundfile.displayMemory(\"After shareBuffers\");\n\n return soundfile;\n\n } catch (error) {\n console.error(\"Failed to create soundfile:\", error);\n return null;\n }\n }\n\n getHEAP32(): Int32Array {\n return this.fAllocator.getInt32Array();\n }\n}\n\n/**\n * DSP implementation: mimic the C++ 'dsp' class:\n * - adding MIDI control: metadata are decoded and incoming MIDI messages will control the associated controllers\n * - an output handler can be set to treat produced output controllers (like 'bargraph') \n * - regular controllers are handled using setParamValue/getParamValue\n */\nexport interface IFaustBaseWebAudioDsp {\n /**\n * Set the parameter output handler, to be called in the 'compute' method with output parameters (like bargraph).\n *\n * @param handler - the output handler\n */\n setOutputParamHandler(handler: OutputParamHandler | null): void;\n\n /**\n * Get the parameter output handler.\n *\n * @return the current output handler\n */\n getOutputParamHandler(): OutputParamHandler | null;\n\n /**\n * Set the compute handler, to be called in the 'compute' method with buffer size.\n *\n * @param handler - the compute handler\n */\n setComputeHandler(handler: ComputeHandler | null): void;\n\n /**\n * Get the compute handler.\n *\n * @return the current output handler\n */\n getComputeHandler(): ComputeHandler | null;\n\n /**\n * Set the plot handler, to be called in the 'compute' method with various info (see PlotHandler type).\n *\n * @param handler - the plot handler\n */\n setPlotHandler(handler: PlotHandler | null): void;\n\n /**\n * Get the plot handler.\n *\n * @return the current plot handler\n */\n getPlotHandler(): PlotHandler | null;\n\n /**\n * Return instance number of audio inputs.\n *\n * @return the instance number of audio inputs\n */\n getNumInputs(): number;\n\n /**\n * Return instance number of audio outputs.\n *\n * @return the instance number of audio outputs\n */\n getNumOutputs(): number;\n\n /**\n * DSP instance computation, to be called with successive input/output audio buffers, using their size.\n *\n * @param inputs - the input audio buffers\n * @param outputs - the output audio buffers\n */\n compute(inputs: Float32Array[], outputs: Float32Array[]): boolean;\n\n /**\n * Give a handler to be called on 'declare key value' kind of metadata.\n *\n * @param handler - the handler to be used\n */\n metadata(handler: MetadataHandler): void;\n\n /**\n * Handle untyped MIDI messages.\n *\n * @param data - and arry of MIDI bytes\n */\n midiMessage(data: number[] | Uint8Array): void;\n\n /**\n * Handle MIDI ctrlChange messages.\n *\n * @param channel - the MIDI channel (0..15, not used for now)\n * @param ctrl - the MIDI controller number (0..127)\n * @param value - the MIDI controller value (0..127)\n */\n ctrlChange(chan: number, ctrl: number, value: number): void;\n\n /**\n * Handle MIDI pitchWheel messages.\n *\n * @param channel - the MIDI channel (0..15, not used for now)\n * @param value - the MIDI controller value (0..16383)\n */\n pitchWheel(chan: number, value: number): void;\n\n /**\n * Set parameter value.\n *\n * @param path - the path to the wanted parameter (retrieved using 'getParams' method)\n * @param val - the float value for the wanted control\n */\n setParamValue(path: string, value: number): void;\n\n /**\n * Get parameter value.\n *\n * @param path - the path to the wanted parameter (retrieved using 'getParams' method)\n *\n * @return the float value\n */\n getParamValue(path: string): number;\n\n /**\n * Get the table of all input parameters paths.\n *\n * @return the table of all input parameters paths\n */\n getParams(): string[];\n\n /**\n * Get DSP JSON description with its UI and metadata as object.\n *\n * @return the DSP JSON description as object\n */\n getMeta(): FaustDspMeta;\n\n /**\n * Get DSP JSON description with its UI and metadata.\n *\n * @return the DSP JSON description\n */\n getJSON(): string;\n\n /**\n * Get DSP UI description.\n *\n * @return the DSP UI description\n */\n getUI(): FaustUIDescriptor;\n\n /**\n * Get DSP UI items description.\n *\n * @return the DSP UI items description\n */\n getDescriptors(): FaustUIInputItem[];\n\n /**\n * Start the DSP.\n */\n start(): void;\n\n /**\n * Stop the DSP.\n */\n stop(): void;\n\n /**\n * Destroy the DSP.\n */\n destroy(): void;\n}\n\nexport interface IFaustMonoWebAudioDsp extends IFaustBaseWebAudioDsp { }\nexport interface IFaustMonoWebAudioNode extends IFaustMonoWebAudioDsp, AudioNode { }\n\nexport interface IFaustPolyWebAudioDsp extends IFaustBaseWebAudioDsp {\n /**\n * Handle MIDI keyOn messages.\n *\n * @param channel - the MIDI channel (0..15, not used for now)\n * @param pitch - the MIDI pitch value (0..127)\n * @param velocity - the MIDI velocity value (0..127)\n */\n keyOn(channel: number, pitch: number, velocity: number): void;\n\n /**\n * Handle MIDI keyOff messages.\n *\n * @param channel - the MIDI channel (0..15, not used for now)\n * @param pitch - the MIDI pitch value (0..127)\n * @param velocity - the MIDI velocity value (0..127)\n */\n keyOff(channel: number, pitch: number, velocity: number): void;\n\n /**\n * Stop all playing notes.\n *\n * @param hard - whether to immediately stop notes or put them in release mode\n */\n allNotesOff(hard: boolean): void;\n}\nexport interface IFaustPolyWebAudioNode extends IFaustPolyWebAudioDsp, AudioNode { }\n\n// Definition of the SoundfileItem type\ntype SoundfileItem = {\n name: string; // Name of the soundfile\n url: string; // URL of the soundfile\n index: number; // Index in the DSP struct \n basePtr: number; // Base pointer in wasm memory\n};\n\nexport class FaustBaseWebAudioDsp implements IFaustBaseWebAudioDsp {\n protected fOutputHandler: OutputParamHandler | null;\n protected fComputeHandler: ComputeHandler | null;\n\n // To handle MIDI events plot\n protected fPlotHandler: PlotHandler | null;\n protected fCachedEvents: { type: string; data: any }[];\n protected fBufferNum: number;\n\n protected fInChannels: Float32Array[] | Float64Array[];\n protected fOutChannels: Float32Array[] | Float64Array[];\n\n protected fOutputsTimer: number;\n\n // UI items path\n protected fInputsItems: string[];\n protected fOutputsItems: string[];\n protected fDescriptor: FaustUIInputItem[];\n\n // Soundfile handling\n protected fSoundfiles: SoundfileItem[];\n protected fEndMemory: number; // Keep the end of memory offset before soundfiles\n\n // Buffers in wasm memory\n protected fAudioInputs!: number;\n protected fAudioOutputs!: number;\n\n protected fBufferSize: number;\n protected fPtrSize: number;\n protected fSampleSize: number;\n\n // MIDI handling\n protected fPitchwheelLabel: { path: string; min: number; max: number }[];\n protected fCtrlLabel: { path: string; min: number; max: number }[][];\n protected fPathTable: { [address: string]: number };\n protected fUICallback: UIHandler;\n\n // Audio callback\n protected fProcessing: boolean;\n protected fDestroyed: boolean;\n protected fFirstCall: boolean;\n\n protected fJSONDsp!: FaustDspMeta;\n\n constructor(sampleSize: number, bufferSize: number) {\n this.fOutputHandler = null;\n this.fComputeHandler = null;\n\n // To handle MIDI events plot\n this.fCachedEvents = [];\n this.fBufferNum = 0;\n this.fPlotHandler = null;\n\n this.fBufferSize = bufferSize;\n\n this.fInChannels = [];\n this.fOutChannels = [];\n\n this.fPtrSize = sampleSize; // Done on wast/wasm backend side\n this.fSampleSize = sampleSize;\n\n this.fOutputsTimer = 5;\n this.fInputsItems = [];\n this.fOutputsItems = [];\n this.fDescriptor = [];\n\n this.fSoundfiles = [];\n\n this.fPitchwheelLabel = [];\n this.fCtrlLabel = new Array(128).fill(null).map(() => []);\n this.fPathTable = {};\n\n this.fProcessing = false;\n this.fDestroyed = false;\n this.fFirstCall = true;\n\n this.fUICallback = (item: FaustUIItem) => {\n if (item.type === \"hbargraph\" || item.type === \"vbargraph\") {\n // Keep bargraph adresses\n this.fOutputsItems.push(item.address);\n this.fPathTable[item.address] = item.index;\n } else if (item.type === \"vslider\" || item.type === \"hslider\" || item.type === \"button\" || item.type === \"checkbox\" || item.type === \"nentry\") {\n // Keep inputs adresses\n this.fInputsItems.push(item.address);\n this.fPathTable[item.address] = item.index;\n this.fDescriptor.push(item);\n // Parse 'midi' metadata\n if (!item.meta) return;\n item.meta.forEach((meta) => {\n const { midi } = meta;\n if (!midi) return;\n const strMidi = midi.trim();\n if (strMidi === \"pitchwheel\") {\n this.fPitchwheelLabel.push({ path: item.address, min: item.min as number, max: item.max as number });\n } else {\n const matched = strMidi.match(/^ctrl\\s(\\d+)/);\n if (!matched) return;\n this.fCtrlLabel[parseInt(matched[1])].push({ path: item.address, min: item.min as number, max: item.max as number });\n }\n });\n } else if (item.type === \"soundfile\") {\n this.fSoundfiles.push({ name: item.label, url: item.url, index: item.index, basePtr: -1 });\n }\n }\n }\n\n // Tools\n static remap(v: number, mn0: number, mx0: number, mn1: number, mx1: number) {\n return (v - mn0) / (mx0 - mn0) * (mx1 - mn1) + mn1;\n }\n\n // JSON parsing functions\n static parseUI(ui: FaustUIDescriptor, callback: (item: FaustUIItem) => any) {\n ui.forEach(group => this.parseGroup(group, callback));\n }\n\n static parseGroup(group: FaustUIGroup, callback: (item: FaustUIItem) => any) {\n if (group.items) {\n this.parseItems(group.items, callback);\n }\n }\n static parseItems(items: FaustUIItem[], callback: (item: FaustUIItem) => any) {\n items.forEach(item => this.parseItem(item, callback));\n }\n\n static parseItem(item: FaustUIItem, callback: (item: FaustUIItem) => any) {\n if (item.type === \"vgroup\" || item.type === \"hgroup\" || item.type === \"tgroup\") {\n this.parseItems(item.items, callback);\n } else {\n callback(item);\n }\n }\n\n // Split the soundfile names and return an array of names\n static splitNames(input: string): string[] {\n // Trim off the curly braces at the start and end, if present\n let trimmed = input.replace(/^\\{|\\}$/g, '');\n // Split the string into an array of strings and remove first and last characters\n return trimmed.split(\";\").map(str => str.length <= 2 ? '' : str.substring(1, str.length - 1));\n }\n\n private extractURLsFromJSON(): string[] {\n // Find the entry with the \"soundfiles\" key\n const soundfilesEntry = this.fJSONDsp.meta.find(entry => entry.soundfiles !== undefined);\n // If the entry is found, split the string by semicolon to get the URLs\n if (soundfilesEntry) {\n return soundfilesEntry.soundfiles.split(';').filter(url => url !== '');\n } else {\n return [];\n }\n }\n\n /**\n * Load a soundfile possibly containing several parts in the DSP struct.\n * Soundfile pointers are located at 'index' offset, to be read in the JSON file.\n * The DSP struct is located at baseDSP in the wasm memory, \n * either a monophonic DSP, or a voice in a polyphonic context.\n * \n * @param sfReader : the soundfile reader \n * @param baseDSP : the base DSP in the wasm memory\n * @param name : the name of the soundfile\n * @param url : the url of the soundfile\n */\n private async loadSoundfile(sfReader: SoundfileReader, baseDSP: number, name: string, url: string): Promise<void> {\n\n console.log(`Soundfile ${name} paths: ${url}`);\n\n const sfReaderURLs = this.extractURLsFromJSON();\n console.log(`sfReaderURLs ${sfReaderURLs}`);\n\n const sfDirectories: string[] = [\"\", \".\", \"http://127.0.0.1:8000\"];\n sfDirectories.push(...sfReaderURLs);\n console.log(`sfDirectories ${sfDirectories}`);\n\n // Check if the soundfile exists in the given directories and return the real path\n const sfPathNames: string[] = await sfReader.checkFiles(sfDirectories, FaustBaseWebAudioDsp.splitNames(url));\n\n console.log(`Soundfile ${name} paths: ${sfPathNames}`);\n\n const item = this.fSoundfiles.find((element: SoundfileItem) => element.url === url);\n if (item) {\n // Use the cached Soundfile\n if (item.basePtr !== -1) {\n\n // Update HEAP32 after soundfile creation\n const HEAP32 = sfReader.getHEAP32();\n\n // Fill the soundfile structure in wasm memory, sounfiles are at the beginning of the DSP memory\n console.log(`Soundfile CACHE ${url}} : ${name} loaded at ${item.basePtr} in wasm memory with index ${item.index}`);\n\n // Soundfile is located at 'index' in the DSP struct, to be added with baseDSP in the wasm memory\n HEAP32[(baseDSP + item.index) >> 2] = item.basePtr;\n\n } else {\n\n // Create the soundfiles\n const soundfile = await sfReader.createSoundfile(sfPathNames, MAX_CHAN);\n if (soundfile) {\n\n // Update HEAP32 after soundfile creation\n const HEAP32 = soundfile.getHEAP32();\n\n // Get the soundfile pointer in wasm memory\n item.basePtr = soundfile.getPtr();\n console.log(`Soundfile ${name} loaded at ${item.basePtr} in wasm memory with index ${item.index}`);\n\n // Soundfile is located at 'index' in the DSP struct, to be added with baseDSP in the wasm memory\n HEAP32[(baseDSP + item.index) >> 2] = item.basePtr;\n\n } else {\n console.log(`Soundfile ${name} for ${url} cannot be created !}`);\n }\n }\n } else {\n console.log(`Soundfile with ${url} cannot be found !}`);\n }\n }\n\n /** \n * Init soundfiles memory.\n * \n * @param allocator : the wasm memory allocator\n * @param sfReader : the soundfile reader\n * @param baseDSP : the DSP struct (either a monophonic DSP of polyphonic voice) base DSP in the wasm memory\n */\n protected async initSoundfileMemory(allocator: WasmAllocator, sfReader: SoundfileReader, baseDSP: number): Promise<void> {\n // Create and fill the soundfile structure\n for (const { name, url } of this.fSoundfiles) {\n await this.loadSoundfile(sfReader, baseDSP, name, url);\n };\n }\n\n protected updateOutputs() {\n if (this.fOutputsItems.length > 0 && this.fOutputHandler && this.fOutputsTimer-- === 0) {\n this.fOutputsTimer = 5;\n this.fOutputsItems.forEach(item => this.fOutputHandler?.(item, this.getParamValue(item)));\n }\n }\n\n // Public API\n metadata(handler: MetadataHandler) {\n if (this.fJSONDsp.meta) {\n this.fJSONDsp.meta.forEach(meta => handler(Object.keys(meta)[0], meta[Object.keys(meta)[0]]));\n }\n }\n\n compute(input: Float32Array[], output: Float32Array[]) {\n return false;\n }\n\n setOutputParamHandler(handler: OutputParamHandler | null) {\n this.fOutputHandler = handler;\n }\n getOutputParamHandler() {\n return this.fOutputHandler;\n }\n\n setComputeHandler(handler: ComputeHandler | null) {\n this.fComputeHandler = handler;\n }\n getComputeHandler() {\n return this.fComputeHandler;\n }\n\n setPlotHandler(handler: PlotHandler | null) {\n this.fPlotHandler = handler;\n }\n getPlotHandler() {\n return this.fPlotHandler;\n }\n\n getNumInputs() {\n return -1;\n }\n getNumOutputs() {\n return -1;\n }\n\n midiMessage(data: number[] | Uint8Array) {\n if (this.fPlotHandler) this.fCachedEvents.push({ data, type: \"midi\" });\n const cmd = data[0] >> 4;\n const channel = data[0] & 0xf;\n const data1 = data[1];\n const data2 = data[2];\n if (cmd === 11) return this.ctrlChange(channel, data1, data2);\n if (cmd === 14) return this.pitchWheel(channel, (data2 * 128.0 + data1));\n }\n\n ctrlChange(channel: number, ctrl: number, value: number) {\n if (this.fPlotHandler) this.fCachedEvents.push({ type: \"ctrlChange\", data: [channel, ctrl, value] });\n if (this.fCtrlLabel[ctrl].length) {\n this.fCtrlLabel[ctrl].forEach((ctrl) => {\n const { path } = ctrl;\n this.setParamValue(path, FaustBaseWebAudioDsp.remap(value, 0, 127, ctrl.min, ctrl.max));\n // Typically used to reflect parameter change on GUI\n if (this.fOutputHandler) this.fOutputHandler(path, this.getParamValue(path));\n });\n }\n }\n\n pitchWheel(channel: number, wheel: number) {\n if (this.fPlotHandler) this.fCachedEvents.push({ type: \"pitchWheel\", data: [channel, wheel] });\n this.fPitchwheelLabel.forEach((pw) => {\n this.setParamValue(pw.path, FaustBaseWebAudioDsp.remap(wheel, 0, 16383, pw.min, pw.max));\n // Typically used to reflect parameter change on GUI\n if (this.fOutputHandler) this.fOutputHandler(pw.path, this.getParamValue(pw.path));\n });\n }\n\n setParamValue(path: string, value: number) { }\n getParamValue(path: string) { return 0; }\n\n getParams() { return this.fInputsItems; }\n getMeta() { return this.fJSONDsp; }\n getJSON() { return JSON.stringify(this.getMeta()); }\n getUI() { return this.fJSONDsp.ui; }\n getDescriptors() { return this.fDescriptor; }\n\n hasSoundfiles() { return this.fSoundfiles.length > 0; }\n\n start() {\n this.fProcessing = true;\n }\n\n stop() {\n this.fProcessing = false;\n }\n\n destroy() {\n this.fDestroyed = true;\n this.fOutputHandler = null;\n this.fComputeHandler = null;\n this.fPlotHandler = null;\n }\n}\n\nexport class FaustMonoWebAudioDsp extends FaustBaseWebAudioDsp implements IFaustMonoWebAudioDsp {\n\n private fInstance: FaustMonoDspInstance;\n private fDSP!: number;\n\n constructor(instance: FaustMonoDspInstance, sampleRate: number, sampleSize: number, bufferSize: number) {\n\n super(sampleSize, bufferSize);\n this.fInstance = instance;\n\n console.log(\"sampleSize: \" + sampleSize + \" bufferSize: \" + bufferSize);\n\n // Create JSON object\n this.fJSONDsp = JSON.parse(this.fInstance.json);\n\n // Setup GUI\n FaustBaseWebAudioDsp.parseUI(this.fJSONDsp.ui, this.fUICallback);\n\n // Setup wasm memory\n this.fEndMemory = this.initMemory();\n\n // Init DSP\n this.fInstance.api.init(this.fDSP, sampleRate);\n }\n\n async init(context: BaseAudioContext | null): Promise<void> {\n\n // Init soundfiles memory is needed\n if (this.fSoundfiles.length > 0 && context) {\n\n // Create memory allocator for soundfiles in wasm memory, starting at the end of DSP memory\n const allocator = new WasmAllocator(this.fInstance.memory, this.fEndMemory);\n\n // Create soundfile reader\n const sfReader = new SoundfileReader(allocator, context, this.fSampleSize);\n\n // Init soundfiles memory\n await this.initSoundfileMemory(allocator, sfReader, this.fDSP);\n }\n }\n\n private initMemory(): number {\n\n // Start of DSP memory: Mono DSP is placed first with index 0\n this.fDSP = 0;\n\n // Audio buffer start at the end of DSP\n const $audio = this.fJSONDsp.size;\n\n // Setup audio pointers offset\n this.fAudioInputs = $audio;\n this.fAudioOutputs = this.fAudioInputs + this.getNumInputs() * this.fPtrSize;\n\n // Prepare wasm memory layout\n const $audioInputs = this.fAudioOutputs + this.getNumOutputs() * this.fPtrSize;\n const $audioOutputs = $audioInputs + this.getNumInputs() * this.fBufferSize * this.fSampleSize;\n // Compute memory end in bytes\n const endMemory = $audioOutputs + this.getNumOutputs() * this.fBufferSize * this.fSampleSize;\n\n // Setup Int32 and Real views of the memory\n const HEAP = this.fInstance.memory.buffer;\n const HEAP32 = new Int32Array(HEAP);\n const HEAPF = (this.fSampleSize === 4) ? new Float32Array(HEAP) : new Float64Array(HEAP);\n\n if (this.getNumInputs() > 0) {\n for (let chan = 0; chan < this.getNumInputs(); chan++) {\n HEAP32[(this.fAudioInputs >> 2) + chan] = $audioInputs + this.fBufferSize * this.fSampleSize * chan;\n }\n // Prepare Ins buffer tables\n const dspInChans = HEAP32.subarray(this.fAudioInputs >> 2, (this.fAudioInputs + this.getNumInputs() * this.fPtrSize) >> 2);\n for (let chan = 0; chan < this.getNumInputs(); chan++) {\n this.fInChannels[chan] = HEAPF.subarray(dspInChans[chan] >> Math.log2(this.fSampleSize), (dspInChans[chan] + this.fBufferSize * this.fSampleSize) >> Math.log2(this.fSampleSize));\n }\n }\n if (this.getNumOutputs() > 0) {\n for (let chan = 0; chan < this.getNumOutputs(); chan++) {\n HEAP32[(this.fAudioOutputs >> 2) + chan] = $audioOutputs + this.fBufferSize * this.fSampleSize * chan;\n }\n // Prepare Out buffer tables\n const dspOutChans = HEAP32.subarray(this.fAudioOutputs >> 2, (this.fAudioOutputs + this.getNumOutputs() * this.fPtrSize) >> 2);\n for (let chan = 0; chan < this.getNumOutputs(); chan++) {\n this.fOutChannels[chan] = HEAPF.subarray(dspOutChans[chan] >> Math.log2(this.fSampleSize), (dspOutChans[chan] + this.fBufferSize * this.fSampleSize) >> Math.log2(this.fSampleSize));\n }\n }\n\n return endMemory;\n }\n\n toString() {\n return `============== Mono Memory layout ==============\n this.fBufferSize: ${this.fBufferSize}\n this.fJSONDsp.size: ${this.fJSONDsp.size}\n this.fAudioInputs: ${this.fAudioInputs}\n this.fAudioOutputs: ${this.fAudioOutputs}\n this.fDSP: ${this.fDSP}`;\n }\n\n // Public API\n compute(input: Float32Array[] | ((input: Float32Array[] | Float64Array[]) => any), output: Float32Array[] | ((output: Float32Array[] | Float64Array[]) => any)) {\n\n // Check DSP state\n if (this.fDestroyed) return false;\n\n // Check Processing state: the node returns 'true' to stay in the graph, even if not processing\n if (!this.fProcessing) return true;\n\n // Init memory again on first call (since WebAssembly.memory.grow() may have been called)\n if (this.fFirstCall) {\n this.initMemory();\n this.fFirstCall = false;\n }\n\n if (typeof input === \"function\") {\n // Call input callback to avoid array copy\n input(this.fInChannels);\n } else {\n // Check inputs\n if (this.getNumInputs() > 0 && (!input || !input[0] || input[0].length === 0)) {\n // console.log(\"Process input error\");\n return true;\n }\n\n // Check outputs\n if (this.getNumOutputs() > 0 && typeof output !== \"function\" && (!output || !output[0] || output[0].length === 0)) {\n // console.log(\"Process output error\");\n return true;\n }\n\n // Copy inputs\n if (input !== undefined) {\n for (let chan = 0; chan < Math.min(this.getNumInputs(), input.length); chan++) {\n const dspInput = this.fInChannels[chan];\n dspInput.set(input[chan]);\n }\n }\n }\n // Possibly call an externally given callback (for instance to synchronize playing a MIDIFile...)\n if (this.fComputeHandler) this.fComputeHandler(this.fBufferSize);\n\n // Compute\n this.fInstance.api.compute(this.fDSP, this.fBufferSize, this.fAudioInputs, this.fAudioOutputs);\n\n // Update bargraph\n this.updateOutputs();\n\n let forPlot = this.fOutChannels;\n if (typeof output === \"function\") {\n // Call output callback to avoid array copy\n output(this.fOutChannels);\n } else {\n // Copy outputs\n for (let chan = 0; chan < Math.min(this.getNumOutputs(), output.length); chan++) {\n const dspOutput = this.fOutChannels[chan];\n output[chan].set(dspOutput);\n // console.log(\"chan: \" + chan + \" output: \" + dspOutput[0]);\n }\n forPlot = output;\n }\n\n // PlotHandler handling \n if (this.fPlotHandler) {\n this.fPlotHandler(forPlot, this.fBufferNum++, (this.fCachedEvents.length ? this.fCachedEvents : undefined));\n this.fCachedEvents = [];\n }\n\n return true;\n }\n\n metadata(handler: MetadataHandler) { super.metadata(handler); }\n\n getNumInputs() {\n return this.fInstance.api.getNumInputs(this.fDSP);\n }\n getNumOutputs() {\n return this.fInstance.api.getNumOutputs(this.fDSP);\n }\n\n setParamValue(path: string, value: number) {\n if (this.fPlotHandler) this.fCachedEvents.push({ type: \"param\", data: { path, value } });\n this.fInstance.api.setParamValue(this.fDSP, this.fPathTable[path], value);\n }\n getParamValue(path: string) {\n return this.fInstance.api.getParamValue(this.fDSP, this.fPathTable[path]);\n }\n\n getMeta() { return this.fJSONDsp; }\n getJSON() { return this.fInstance.json; }\n getDescriptors() { return this.fDescriptor; }\n getUI() { return this.fJSONDsp.ui; }\n}\n\nexport class FaustWebAudioDspVoice {\n\n static kActiveVoice: number;\n static kFreeVoice: number;\n static kReleaseVoice: number;\n static kLegatoVoice: number;\n static kNoVoice: number;\n static VOICE_STOP_LEVEL: number;\n private fFreqLabel: number[];\n private fGateLabel: number[];\n private fGainLabel: number[];\n private fKeyLabel: number[];\n private fVelLabel: number[];\n private fDSP: number; // Voice DSP location in wasm memory\n private fAPI: IFaustDspInstance; // Voice DSP code\n // Accessed by PolyDSPImp class\n fCurNote: number;\n fNextNote: number;\n fNextVel: number;\n fDate: number;\n fLevel: number;\n fRelease: number;\n\n constructor($dsp: number, api: IFaustDspInstance, inputItems: string[], pathTable: { [address: string]: number }, sampleRate: number) {\n // Voice state\n FaustWebAudioDspVoice.kActiveVoice = 0;\n FaustWebAudioDspVoice.kFreeVoice = -1;\n FaustWebAudioDspVoice.kReleaseVoice = -2;\n FaustWebAudioDspVoice.kLegatoVoice = -3;\n FaustWebAudioDspVoice.kNoVoice = -4;\n FaustWebAudioDspVoice.VOICE_STOP_LEVEL = 0.0005;\n\n this.fCurNote = FaustWebAudioDspVoice.kFreeVoice;\n this.fNextNote = this.fNextVel = -1;\n this.fLevel = 0;\n this.fDate = this.fRelease = 0;\n this.fDSP = $dsp;\n this.fAPI = api;\n this.fGateLabel = [];\n this.fGainLabel = [];\n this.fFreqLabel = [];\n this.fKeyLabel = [];\n this.fVelLabel = [];\n this.fAPI.init(this.fDSP, sampleRate);\n this.extractPaths(inputItems, pathTable);\n }\n\n static midiToFreq(note: number) { return 440.0 * 2 ** ((note - 69) / 12); }\n\n static normalizeVelocity(velocity: number) { return velocity / 127.0; }\n\n private extractPaths(inputItems: string[], pathTable: { [address: string]: number }) {\n inputItems.forEach((item) => {\n if (item.endsWith(\"/gate\")) {\n this.fGateLabel.push(pathTable[item]);\n } else if (item.endsWith(\"/freq\")) {\n this.fFreqLabel.push(pathTable[item]);\n } else if (item.endsWith(\"/key\")) {\n this.fKeyLabel.push(pathTable[item]);\n } else if (item.endsWith(\"/gain\")) {\n this.fGainLabel.push(pathTable[item]);\n } else if (item.endsWith(\"/vel\") && item.endsWith(\"/velocity\")) {\n this.fVelLabel.push(pathTable[item]);\n }\n });\n }\n\n // Public API\n keyOn(pitch: number, velocity: number, legato: boolean = false) {\n if (legato) {\n this.fNextNote = pitch;\n this.fNextVel = velocity;\n } else {\n this.fFreqLabel.forEach(index => this.fAPI.setParamValue(this.fDSP, index, FaustWebAudioDspVoice.midiToFreq(pitch)));\n this.fGateLabel.forEach(index => this.fAPI.setParamValue(this.fDSP, index, 1));\n this.fGainLabel.forEach(index => this.fAPI.setParamValue(this.fDSP, index, FaustWebAudioDspVoice.normalizeVelocity(velocity)));\n this.fKeyLabel.forEach(index => this.fAPI.setParamValue(this.fDSP, index, pitch));\n this.fVelLabel.forEach(index => this.fAPI.setParamValue(this.fDSP, index, velocity));\n // Keep pitch\n this.fCurNote = pitch;\n }\n }\n\n keyOff(hard: boolean = false) {\n this.fGateLabel.forEach(index => this.fAPI.setParamValue(this.fDSP, index, 0));\n if (hard) {\n this.fCurNote = FaustWebAudioDspVoice.kFreeVoice;\n } else {\n this.fRelease = this.fAPI.getSampleRate(this.fDSP) / 2;\n this.fCurNote = FaustWebAudioDspVoice.kReleaseVoice;\n }\n }\n\n computeLegato(bufferSize: number, $inputs: number, $outputZero: number, $outputsHalf: number) {\n\n let size = bufferSize / 2;\n\n // Reset envelops\n this.fGateLabel.forEach(index => this.fAPI.setParamValue(this.fDSP, index, 0));\n\n // Compute current voice on half buffer\n this.fAPI.compute(this.fDSP, size, $inputs, $outputZero);\n\n // Start next keyOn\n this.keyOn(this.fNextNote, this.fNextVel);\n\n // Compute on second half buffer\n this.fAPI.compute(this.fDSP, size, $inputs, $outputsHalf);\n }\n\n compute(bufferSize: number, $inputs: number, $outputs: number) {\n this.fAPI.compute(this.fDSP, bufferSize, $inputs, $outputs);\n }\n\n setParamValue(index: number, value: number) {\n this.fAPI.setParamValue(this.fDSP, index, value);\n }\n getParamValue(index: number) {\n return this.fAPI.getParamValue(this.fDSP, index);\n }\n}\n\nexport class FaustPolyWebAudioDsp extends FaustBaseWebAudioDsp implements IFaustPolyWebAudioDsp {\n\n private fInstance: FaustPolyDspInstance;\n private fEffect!: number;\n private fJSONEffect: FaustDspMeta | null;\n private fAudioMixing!: number;\n private fAudioMixingHalf!: number;\n private fVoiceTable: FaustWebAudioDspVoice[];\n\n constructor(instance: FaustPolyDspInstance, sampleRate: number, sampleSize: number, bufferSize: number) {\n super(sampleSize, bufferSize);\n this.fInstance = instance;\n\n console.log(\"sampleSize: \" + sampleSize + \" bufferSize: \" + bufferSize);\n\n // Create JSON for voice\n this.fJSONDsp = JSON.parse(this.fInstance.voiceJSON);\n\n // Create JSON for effect\n this.fJSONEffect = (this.fInstance.effectAPI && this.fInstance.effectJSON) ? JSON.parse(this.fInstance.effectJSON) : null;\n\n // Setup GUI\n FaustBaseWebAudioDsp.parseUI(this.fJSONDsp.ui, this.fUICallback);\n if (this.fJSONEffect) FaustBaseWebAudioDsp.parseUI(this.fJSONEffect.ui, this.fUICallback);\n\n // Setup wasm memory\n this.fEndMemory = this.initMemory();\n\n // Init DSP voices\n this.fVoiceTable = [];\n for (let voice = 0; voice < this.fInstance.voices; voice++) {\n this.fVoiceTable.push(new FaustWebAudioDspVoice(\n this.fJSONDsp.size * voice,\n this.fInstance.voiceAPI,\n this.fInputsItems,\n this.fPathTable,\n sampleRate\n ));\n }\n\n // Init effect\n if (this.fInstance.effectAPI) this.fInstance.effectAPI.init(this.fEffect, sampleRate);\n }\n\n async init(context: BaseAudioContext | null): Promise<void> {\n\n // Init soundfiles memory is needed\n if (this.fSoundfiles.length > 0 && context) {\n\n // Create memory allocator for soundfiles in wasm memory, starting at the end of DSP memory\n const allocator = new WasmAllocator(this.fInstance.memory, this.fEndMemory);\n\n // Create soundfile reader\n const sfReader = new SoundfileReader(allocator, context, this.fSampleSize);\n\n // Init soundfiles memory for all voices\n for (let voice = 0; voice < this.fInstance.voices; voice++) {\n await this.initSoundfileMemory(allocator, sfReader, this.fJSONDsp.size * voice);\n }\n }\n }\n\n private initMemory() {\n\n // Effet start at the end of all DSP voices\n this.fEffect = this.fJSONDsp.size * this.fInstance.voices;\n\n // Audio buffer start at the end of effect\n const $audio = this.fEffect + (this.fJSONEffect ? this.fJSONEffect.size : 0);\n\n // Setup audio pointers offset\n this.fAudioInputs = $audio;\n this.fAudioOutputs = this.fAudioInputs + this.getNumInputs() * this.fPtrSize;\n this.fAudioMixing = this.fAudioOutputs + this.getNumOutputs() * this.fPtrSize;\n this.fAudioMixingHalf = this.fAudioMixing + this.getNumOutputs() * this.fPtrSize;\n\n // Prepare wasm memory layout\n const $audioInputs = this.fAudioMixingHalf + this.getNumOutputs() * this.fPtrSize;\n const $audioOutputs = $audioInputs + this.getNumInputs() * this.fBufferSize * this.fSampleSize;\n const $audioMixing = $audioOutputs + this.getNumOutputs() * this.fBufferSize * this.fSampleSize;\n\n // Compute memory end in bytes\n const endMemory = $audioMixing + this.getNumOutputs() * this.fBufferSize * this.fSampleSize;\n\n // Setup Int32 and Real views of the memory\n const HEAP = this.fInstance.memory.buffer;\n const HEAP32 = new Int32Array(HEAP);\n const HEAPF = (this.fSampleSize === 4) ? new Float32Array(HEAP) : new Float64Array(HEAP);\n\n if (this.getNumInputs() > 0) {\n for (let chan = 0; chan < this.getNumInputs(); chan++) {\n HEAP32[(this.fAudioInputs >> 2) + chan] = $audioInputs + this.fBufferSize * this.fSampleSize * chan;\n }\n // Prepare Ins buffer tables\n const dspInChans = HEAP32.subarray(this.fAudioInputs >> 2, (this.fAudioInputs + this.getNumInputs() * this.fPtrSize) >> 2);\n for (let chan = 0; chan < this.getNumInputs(); chan++) {\n this.fInChannels[chan] = HEAPF.subarray(dspInChans[chan] >> Math.log2(this.fSampleSize), (dspInChans[chan] + this.fBufferSize * this.fSampleSize) >> Math.log2(this.fSampleSize));\n }\n }\n if (this.getNumOutputs() > 0) {\n for (let chan = 0; chan < this.getNumOutputs(); chan++) {\n HEAP32[(this.fAudioOutputs >> 2) + chan] = $audioOutputs + this.fBufferSize * this.fSampleSize * chan;\n HEAP32[(this.fAudioMixing >> 2) + chan] = $audioMixing + this.fBufferSize * this.fSampleSize * chan;\n HEAP32[(this.fAudioMixingHalf >> 2) + chan] = $audioMixing + this.fBufferSize * this.fSampleSize * chan + this.fBufferSize / 2 * this.fSampleSize;\n }\n // Prepare Out buffer tables\n const dspOutChans = HEAP32.subarray(this.fAudioOutputs >> 2, (this.fAudioOutputs + this.getNumOutputs() * this.fPtrSize) >> 2);\n for (let chan = 0; chan < this.getNumOutputs(); chan++) {\n this.fOutChannels[chan] = HEAPF.subarray(dspOutChans[chan] >> Math.log2(this.fSampleSize), (dspOutChans[chan] + this.fBufferSize * this.fSampleSize) >> Math.log2(this.fSampleSize));\n }\n }\n\n return endMemory;\n }\n\n toString() {\n return `============== Poly Memory layout ==============\n this.fBufferSize: ${this.fBufferSize}\n this.fJSONDsp.size: ${this.fJSONDsp.size}\n this.fAudioInputs: ${this.fAudioInputs}\n this.fAudioOutputs: ${this.fAudioOutputs}\n this.fAudioMixing: ${this.fAudioMixing}\n this.fAudioMixingHalf: ${this.fAudioMixingHalf}`;\n }\n\n private allocVoice(voice: number, type: number) {\n this.fVoiceTable[voice].fDate++;\n this.fVoiceTable[voice].fCurNote = type;\n return voice;\n }\n\n private getPlayingVoice(pitch: number) {\n let voicePlaying = FaustWebAudioDspVoice.kNoVoice;\n let oldestDatePlaying = Number.MAX_VALUE;\n\n for (let voice = 0; voice < this.fInstance.voices; voice++) {\n if (this.fVoiceTable[voice].fCurNote === pitch) {\n // Keeps oldest playing voice\n if (this.fVoiceTable[voice].fDate < oldestDatePlaying) {\n oldestDatePlaying = this.fVoiceTable[voice].fDate;\n voicePlaying = voice;\n }\n }\n }\n return voicePlaying;\n }\n\n private getFreeVoice() {\n for (let voice = 0; voice < this.fInstance.voices; voice++) {\n if (this.fVoiceTable[voice].fCurNote === FaustWebAudioDspVoice.kFreeVoice) {\n return this.allocVoice(voice, FaustWebAudioDspVoice.kActiveVoice);\n }\n }\n\n let voiceRelease = FaustWebAudioDspVoice.kNoVoice;\n let voicePlaying = FaustWebAudioDspVoice.kNoVoice;\n let oldestDateRelease = Number.MAX_VALUE;\n let oldestDatePlaying = Number.MAX_VALUE;\n\n for (let voice = 0; voice < this.fInstance.voices; voice++) { // Scan all voices\n // Try to steal a voice in DspVoice.kReleaseVoice mode...\n if (this.fVoiceTable[voice].fCurNote === FaustWebAudioDspVoice.kReleaseVoice) {\n // Keeps oldest release voice\n if (this.fVoiceTable[voice].fDate < oldestDateRelease) {\n oldestDateRelease = this.fVoiceTable[voice].fDate;\n voiceRelease = voice;\n }\n } else if (this.fVoiceTable[voice].fDate < oldestDatePlaying) {\n oldestDatePlaying = this.fVoiceTable[voice].fDate;\n voicePlaying = voice;\n }\n }\n // Then decide which one to steal\n if (oldestDateRelease !== Number.MAX_VALUE) {\n console.log(`Steal release voice : voice_date = ${this.fVoiceTable[voiceRelease].fDate} voice = ${voiceRelease}`);\n return this.allocVoice(voiceRelease, FaustWebAudioDspVoice.kLegatoVoice);\n }\n if (oldestDatePlaying !== Number.MAX_VALUE) {\n console.log(`Steal playing voice : voice_date = ${this.fVoiceTable[voicePlaying].fDate} voice = ${voicePlaying}`);\n return this.allocVoice(voicePlaying, FaustWebAudioDspVoice.kLegatoVoice);\n }\n return FaustWebAudioDspVoice.kNoVoice;\n }\n\n // Public API\n compute(input: Float32Array[], output: Float32Array[]) {\n\n // Check DSP state\n if (this.fDestroyed) return false;\n\n // Init memory again on first call (since WebAssembly.memory.grow() may have been called)\n if (this.fFirstCall) {\n this.initMemory();\n this.fFirstCall = false;\n }\n\n // Check Processing state: the node returns 'true' to stay in the graph, even if not processing\n if (!this.fProcessing) return true;\n\n // Check inputs\n if (this.getNumInputs() > 0 && (!input || !input[0] || input[0].length === 0)) {\n // console.log(\"Process input error\");\n return true;\n }\n\n // Check outputs\n if (this.getNumOutputs() > 0 && (!output || !output[0] || output[0].length === 0)) {\n // console.log(\"Process output error\");\n return true;\n }\n\n // Copy inputs\n if (input !== undefined) {\n for (let chan = 0; chan < Math.min(this.getNumInputs(), input.length); ++chan) {\n const dspInput = this.fInChannels[chan];\n dspInput.set(input[chan]);\n }\n }\n\n // Possibly call an externally given callback (for instance to synchronize playing a MIDIFile...)\n if (this.fComputeHandler) this.fComputeHandler(this.fBufferSize);\n\n // Compute\n this.fInstance.mixerAPI.clearOutput(this.fBufferSize, this.getNumOutputs(), this.fAudioOutputs);\n this.fVoiceTable.forEach((voice) => {\n if (voice.fCurNote === FaustWebAudioDspVoice.kLegatoVoice) {\n // Play from current note and next note\n voice.computeLegato(this.fBufferSize, this.fAudioInputs, this.fAudioMixing, this.fAudioMixingHalf);\n // FadeOut on first half buffer\n this.fInstance.mixerAPI.fadeOut(this.fBufferSize / 2, this.getNumOutputs(), this.fAudioMixing);\n // Mix it in result\n voice.fLevel = this.fInstance.mixerAPI.mixCheckVoice(this.fBufferSize, this.getNumOutputs(), this.fAudioMixing, this.fAudioOutputs);\n } else if (voice.fCurNote !== FaustWebAudioDspVoice.kFreeVoice) {\n // Compute current note\n voice.compute(this.fBufferSize, this.fAudioInputs, this.fAudioMixing);\n // Mix it in result\n voice.fLevel = this.fInstance.mixerAPI.mixCheckVoice(this.fBufferSize, this.getNumOutputs(), this.fAudioMixing, this.fAudioOutputs);\n // Check the level to possibly set the voice in kFreeVoice again\n voice.fRelease -= this.fBufferSize;\n if ((voice.fCurNote == FaustWebAudioDspVoice.kReleaseVoice) && ((voice.fLevel < FaustWebAudioDspVoice.VOICE_STOP_LEVEL) && (voice.fRelease < 0))) {\n voice.fCurNote = FaustWebAudioDspVoice.kFreeVoice;\n }\n }\n });\n if (this.fInstance.effectAPI) this.fInstance.effectAPI.compute(this.fEffect, this.fBufferSize, this.fAudioOutputs, this.fAudioOutputs);\n\n // Update bargraph\n this.updateOutputs();\n\n if (output !== undefined) {\n // Copy outputs\n for (let chan = 0; chan < Math.min(this.getNumOutputs(), output.length); chan++) {\n const dspOutput = this.fOutChannels[chan];\n output[chan].set(dspOutput);\n }\n\n // PlotHandler handling \n if (this.fPlotHandler) {\n this.fPlotHandler(output, this.fBufferNum++, (this.fCachedEvents.length ? this.fCachedEvents : undefined));\n this.fCachedEvents = [];\n }\n }\n\n return true;\n }\n\n getNumInputs() {\n return this.fInstance.voiceAPI.getNumInputs(0);\n }\n getNumOutputs() {\n return this.fInstance.voiceAPI.getNumOutputs(0);\n }\n\n private static findPath(o: any, p: string) {\n if (typeof o !== \"object\") {\n return false;\n } else if (o.address) {\n return (o.address === p);\n } else {\n for (const k in o) {\n if (FaustPolyWebAudioDsp.findPath(o[k], p)) return true;\n }\n return false;\n }\n }\n\n setParamValue(path: string, value: number) {\n if (this.fPlotHandler) this.fCachedEvents.push({ type: \"param\", data: { path, value } });\n if (this.fJSONEffect && FaustPolyWebAudioDsp.findPath(this.fJSONEffect.ui, path) && this.fInstance.effectAPI) {\n this.fInstance.effectAPI.setParamValue(this.fEffect, this.fPathTable[path], value);\n } else {\n this.fVoiceTable.forEach(voice => voice.setParamValue(this.fPathTable[path], value));\n }\n }\n getParamValue(path: string) {\n if (this.fJSONEffect && FaustPolyWebAudioDsp.findPath(this.fJSONEffect.ui, path) && this.fInstance.effectAPI) {\n return this.fInstance.effectAPI.getParamValue(this.fEffect, this.fPathTable[path]);\n } else {\n return this.fVoiceTable[0].getParamValue(this.fPathTable[path]);\n }\n }\n\n getMeta() {\n const o = this.fJSONDsp;\n const e = this.fJSONEffect;\n const r = { ...o };\n if (e) {\n r.ui = [{\n type: \"tgroup\", label: \"Sequencer\", items: [\n { type: \"vgroup\", label: \"Instrument\", items: o.ui },\n { type: \"vgroup\", label: \"Effect\", items: e.ui }\n ]\n }];\n } else {\n r.ui = [{\n type: \"tgroup\", label: \"Polyphonic\", items: [\n { type: \"vgroup\", label: \"Voices\", items: o.ui }\n ]\n }];\n }\n return r as FaustDspMeta;\n }\n\n getJSON() {\n return JSON.stringify(this.getMeta());\n }\n\n getUI() {\n return this.getMeta().ui;\n }\n\n getDescriptors() { return this.fDescriptor; }\n\n midiMessage(data: number[] | Uint8Array) {\n const cmd = data[0] >> 4;\n const channel = data[0] & 0xf;\n const data1 = data[1];\n const data2 = data[2];\n if (cmd === 8 || (cmd === 9 && data2 === 0)) return this.keyOff(channel, data1, data2);\n else if (cmd === 9) return this.keyOn(channel, data1, data2);\n else super.midiMessage(data);\n };\n\n ctrlChange(channel: number, ctrl: number, value: number) {\n if (ctrl === 123 || ctrl === 120) {\n this.allNotesOff(true);\n } else {\n super.ctrlChange(channel, ctrl, value);\n }\n }\n\n keyOn(channel: number, pitch: number, velocity: number) {\n if (this.fPlotHandler) this.fCachedEvents.push({ type: \"keyOn\", data: [channel, pitch, velocity] });\n const voice = this.getFreeVoice();\n this.fVoiceTable[voice].keyOn(pitch, velocity, this.fVoiceTable[voice].fCurNote == FaustWebAudioDspVoice.kLegatoVoice);\n }\n\n keyOff(channel: number, pitch: number, velocity: number) {\n if (this.fPlotHandler) this.fCachedEvents.push({ type: \"keyOff\", data: [channel, pitch, velocity] });\n const voice = this.getPlayingVoice(pitch);\n if (voice !== FaustWebAudioDspVoice.kNoVoice) {\n this.fVoiceTable[voice].keyOff();\n } else {\n console.log(\"Playing pitch = %d not found\\n\", pitch);\n }\n }\n\n allNotesOff(hard: boolean = true) {\n this.fCachedEvents.push({ type: \"ctrlChange\", data: [0, 123, 0] });\n this.fVoiceTable.forEach(voice => voice.keyOff(hard));\n }\n}\n", "import { ComputeHandler, FaustBaseWebAudioDsp, FaustMonoWebAudioDsp, FaustPolyWebAudioDsp, IFaustBaseWebAudioDsp, IFaustMonoWebAudioDsp, IFaustPolyWebAudioDsp, MetadataHandler, OutputParamHandler, PlotHandler } from \"./FaustWebAudioDsp\";\nimport { AudioParamDescriptor, FaustUIItem } from \"./types\";\n\n/**\n * For offline rendering.\n */\nexport interface IFaustOfflineProcessor extends IFaustBaseWebAudioDsp {\n render(inputs?: Float32Array[], length?: number, onUpdate?: (sample: number) => any): Float32Array[];\n}\n\nexport interface IFaustMonoOfflineProcessor extends IFaustOfflineProcessor, IFaustMonoWebAudioDsp {}\nexport interface IFaustPolyOfflineProcessor extends IFaustOfflineProcessor, IFaustPolyWebAudioDsp {}\n\nexport class FaustOfflineProcessor<Poly extends boolean = false> {\n protected fDSPCode!: Poly extends true ? FaustPolyWebAudioDsp : FaustMonoWebAudioDsp;\n\n protected fBufferSize: number;\n protected fInputs: Float32Array[];\n protected fOutputs: Float32Array[];\n\n constructor(instance: Poly extends true ? FaustPolyWebAudioDsp : FaustMonoWebAudioDsp, bufferSize: number) {\n this.fDSPCode = instance;\n this.fBufferSize = bufferSize;\n this.fInputs = new Array(this.fDSPCode.getNumInputs()).fill(null).map(() => new Float32Array(bufferSize));\n this.fOutputs = new Array(this.fDSPCode.getNumOutputs()).fill(null).map(() => new Float32Array(bufferSize));\n }\n\n // Public API\n\n getParameterDescriptors() {\n const params = [] as AudioParamDescriptor[];\n // Analyse voice JSON to generate AudioParam parameters\n const callback = (item: FaustUIItem) => {\n let param: AudioParamDescriptor | null = null;\n const polyKeywords = [\"/gate\", \"/freq\", \"/gain\", \"/key\", \"/vel\", \"/velocity\"];\n const isPolyReserved = \"address\" in item && !!polyKeywords.find(k => item.address.endsWith(k));\n if (this.fDSPCode instanceof FaustMonoWebAudioDsp || !isPolyReserved) {\n if (item.type === \"vslider\" || item.type === \"hslider\" || item.type === \"nentry\") {\n param = { name: item.address, defaultValue: item.init || 0, minValue: item.min || 0, maxValue: item.max || 0 };\n } else if (item.type === \"button\" || item.type === \"checkbox\") {\n param = { name: item.address, defaultValue: item.init || 0, minValue: 0, maxValue: 1 };\n }\n }\n if (param) params.push(param);\n }\n FaustBaseWebAudioDsp.parseUI(this.fDSPCode.getUI(), callback);\n return params;\n }\n compute(input: Float32Array[], output: Float32Array[]) { return this.fDSPCode.compute(input, output); }\n\n setOutputParamHandler(handler: OutputParamHandler) { this.fDSPCode.setOutputParamHandler(handler); }\n getOutputParamHandler() { return this.fDSPCode.getOutputParamHandler(); }\n\n setComputeHandler(handler: ComputeHandler) { this.fDSPCode.setComputeHandler(handler); }\n getComputeHandler() { return this.fDSPCode.getComputeHandler(); }\n\n setPlotHandler(handler: PlotHandler) { this.fDSPCode.setPlotHandler(handler); }\n getPlotHandler() { return this.fDSPCode.getPlotHandler(); }\n\n getNumInputs() { return this.fDSPCode.getNumInputs(); }\n getNumOutputs() { return this.fDSPCode.getNumOutputs(); }\n\n metadata(handler: MetadataHandler) { }\n\n midiMessage(data: number[] | Uint8Array) { this.fDSPCode.midiMessage(data); }\n\n ctrlChange(chan: number, ctrl: number, value: number) { this.fDSPCode.ctrlChange(chan, ctrl, value); }\n pitchWheel(chan: number, value: number) { this.fDSPCode.pitchWheel(chan, value); }\n\n setParamValue(path: string, value: number) { this.fDSPCode.setParamValue(path, value); }\n getParamValue(path: string) { return this.fDSPCode.getParamValue(path); }\n getParams() { return this.fDSPCode.getParams(); }\n\n getMeta() { return this.fDSPCode.getMeta(); }\n getJSON() { return this.fDSPCode.getJSON(); }\n getDescriptors() { return this.fDSPCode.getDescriptors(); }\n getUI() { return this.fDSPCode.getUI(); }\n\n start() { this.fDSPCode.start(); }\n stop() { this.fDSPCode.stop(); }\n\n destroy() { this.fDSPCode.destroy(); }\n\n /**\n * Render frames in an array.\n *\n * @param inputs - input signal\n * @param length - the number of frames to render (default: bufferSize)\n * @param onUpdate - a callback after each buffer calculated, with an argument \"current sample\"\n * @return an array of Float32Array with the rendered frames\n */\n render(inputs: Float32Array[] = [], length = this.fBufferSize, onUpdate?: (sample: number) => any): Float32Array[] {\n let l = 0;\n const outputs = new Array(this.fDSPCode.getNumOutputs()).fill(null).map(() => new Float32Array(length));\n // The node has to be started before rendering\n this.fDSPCode.start();\n while (l < length) {\n const sliceLength = Math.min(length - l, this.fBufferSize);\n for (let i = 0; i < this.fDSPCode.getNumInputs(); i++) {\n let input: Float32Array;\n if (inputs[i]) {\n if (inputs[i].length <= l) {\n input = new Float32Array(sliceLength);\n } else if (inputs[i].length > l + sliceLength) {\n input = inputs[i].subarray(l, l + sliceLength);\n } else {\n input = inputs[i].subarray(l, inputs[i].length);\n }\n } else {\n input = new Float32Array(sliceLength);\n }\n this.fInputs[i] = input;\n }\n this.fDSPCode.compute(this.fInputs, this.fOutputs);\n for (let i = 0; i < this.fDSPCode.getNumOutputs(); i++) {\n const output = this.fOutputs[i];\n if (sliceLength < this.fBufferSize) {\n outputs[i].set(output.subarray(0, sliceLength), l);\n } else {\n outputs[i].set(output, l);\n }\n }\n l += this.fBufferSize;\n onUpdate?.(l);\n }\n // The node can be stopped after rendering\n this.fDSPCode.stop();\n return outputs;\n }\n}\n\nexport class FaustMonoOfflineProcessor extends FaustOfflineProcessor<false> implements IFaustMonoWebAudioDsp {\n}\n\nexport class FaustPolyOfflineProcessor extends FaustOfflineProcessor<true> implements IFaustPolyWebAudioDsp {\n keyOn(channel: number, pitch: number, velocity: number) { this.fDSPCode.keyOn(channel, pitch, velocity); }\n keyOff(channel: number, pitch: number, velocity: number) { this.fDSPCode.keyOff(channel, pitch, velocity); }\n allNotesOff(hard: boolean) { this.fDSPCode.allNotesOff(hard); }\n}\n\nexport default FaustOfflineProcessor;\n", "import type FaustCompiler from \"./FaustCompiler\";\n\ninterface IFaustSvgDiagrams {\n /**\n * Generates auxiliary files from Faust code. The output depends on the compiler options.\n *\n * @param name - the DSP's name\n * @param code - Faust code\n * @param args - compilation args\n * @returns the svg diagrams as a filename - svg string map\n */\n from(name: string, code: string, args: string): Record<string, string>;\n}\n\nclass FaustSvgDiagrams implements IFaustSvgDiagrams {\n private compiler: FaustCompiler;\n\n constructor(compiler: FaustCompiler) {\n this.compiler = compiler;\n }\n\n from(name: string, code: string, args: string) {\n const fs = this.compiler.fs();\n try {\n const files: string[] = fs.readdir(`/${name}-svg/`);\n files.filter(file => file !== \".\" && file !== \"..\").forEach(file => fs.unlink(`/${name}-svg/${file}`));\n } catch { }\n const success = this.compiler.generateAuxFiles(name, code, `-lang wasm -o binary -svg ${args}`);\n if (!success) throw new Error(this.compiler.getErrorMessage());\n const svgs: Record<string, string> = {};\n const files: string[] = fs.readdir(`/${name}-svg/`);\n files.filter(file => file !== \".\" && file !== \"..\").forEach(file => svgs[file] = fs.readFile(`/${name}-svg/${file}`, { encoding: \"utf8\" }) as string);\n return svgs;\n }\n}\n\nexport default FaustSvgDiagrams;\n", "import type LibFaust from \"./LibFaust\";\n\ninterface IFaustCmajor {\n /**\n * Generates auxiliary files from Faust code. The output depends on the compiler options.\n *\n * @param name - the DSP's name\n * @param code - Faust code\n * @param args - compilation args\n * @returns the Cmajor compiled string\n */\n compile(name: string, code: string, args: string): string;\n}\n\nclass FaustCmajor implements IFaustCmajor {\n private fLibFaust: LibFaust;\n\n constructor(libfaust: LibFaust) {\n this.fLibFaust = libfaust;\n }\n\n compile(name: string, code: string, args: string) {\n const fs = this.fLibFaust.fs();\n const success = this.fLibFaust.generateAuxFiles(name, code, `-lang cmajor-hybrid -cn ${name} -o ${name}.cmajor`);\n return (success) ? fs.readFile(`${name}.cmajor`, { encoding: \"utf8\" }) as string : \"\";\n }\n}\n\nexport default FaustCmajor;\n", "import type { FaustModule, LibFaustWasm, FaustInfoType } from \"./types\";\n\nexport interface ILibFaust extends LibFaustWasm {\n module(): FaustModule;\n fs(): typeof FS;\n}\n\nclass LibFaust implements ILibFaust {\n private fModule: FaustModule;\n private fCompiler: LibFaustWasm;\n private fFileSystem: typeof FS;\n\n constructor(module: FaustModule) {\n this.fModule = module;\n this.fCompiler = new module.libFaustWasm();\n this.fFileSystem = this.fModule.FS;\n }\n module() {\n return this.fModule;\n }\n fs() {\n return this.fFileSystem;\n }\n version() {\n return this.fCompiler.version();\n }\n createDSPFactory(name: string, code: string, args: string, useInternalMemory: boolean) {\n return this.fCompiler.createDSPFactory(name, code, args, useInternalMemory);\n }\n deleteDSPFactory(cFactory: number) {\n return this.fCompiler.deleteDSPFactory(cFactory);\n }\n expandDSP(name: string, code: string, args: string) {\n return this.fCompiler.expandDSP(name, code, args);\n }\n generateAuxFiles(name: string, code: string, args: string) {\n return this.fCompiler.generateAuxFiles(name, code, args);\n }\n deleteAllDSPFactories() {\n return this.fCompiler.deleteAllDSPFactories();\n }\n getErrorAfterException() {\n return this.fCompiler.getErrorAfterException();\n }\n cleanupAfterException() {\n return this.fCompiler.cleanupAfterException();\n }\n getInfos(what: FaustInfoType) {\n return this.fCompiler.getInfos(what);\n }\n toString() {\n return `LibFaust module: ${this.fModule}, compiler: ${this.fCompiler}`;\n }\n\n}\n\nexport default LibFaust;\n", "export interface WavEncoderOptions {\n bitDepth: number;\n float?: boolean;\n symmetric?: boolean;\n shared?: boolean;\n sampleRate: number;\n}\ninterface Format {\n formatId: number;\n float: boolean;\n symmetric: boolean;\n numberOfChannels: number;\n sampleRate: number;\n length: number;\n bitDepth: number;\n byteDepth: number;\n}\n\n/**\n * Code from https://github.com/mohayonao/wav-encoder\n */\nclass WavEncoder {\n static encode(audioBuffer: Float32Array[], options: WavEncoderOptions) {\n const numberOfChannels = audioBuffer.length;\n const length = audioBuffer[0].length;\n const { shared, float } = options;\n const bitDepth = float ? 32 : ((options.bitDepth | 0) || 16);\n const byteDepth = bitDepth >> 3;\n const byteLength = length * numberOfChannels * byteDepth;\n // eslint-disable-next-line no-undef\n const AB = shared ? (globalThis.SharedArrayBuffer || globalThis.ArrayBuffer) : globalThis.ArrayBuffer;\n const ab = new AB((44 + byteLength) * Uint8Array.BYTES_PER_ELEMENT);\n const dataView = new DataView(ab);\n const writer = new Writer(dataView);\n const format: Format = {\n formatId: float ? 0x0003 : 0x0001,\n float: !!float,\n numberOfChannels,\n sampleRate: options.sampleRate,\n symmetric: !!options.symmetric,\n length,\n bitDepth,\n byteDepth\n };\n this.writeHeader(writer, format);\n this.writeData(writer, audioBuffer, format);\n return ab;\n }\n private static writeHeader(writer: Writer, format: Format) {\n const { formatId, sampleRate, bitDepth, numberOfChannels, length, byteDepth } = format;\n writer.string(\"RIFF\");\n writer.uint32(writer.dataView.byteLength - 8);\n writer.string(\"WAVE\");\n writer.string(\"fmt \");\n writer.uint32(16);\n writer.uint16(formatId);\n writer.uint16(numberOfChannels);\n writer.uint32(sampleRate);\n writer.uint32(sampleRate * numberOfChannels * byteDepth);\n writer.uint16(numberOfChannels * byteDepth);\n writer.uint16(bitDepth);\n writer.string(\"data\");\n writer.uint32(length * numberOfChannels * byteDepth);\n return writer.pos;\n }\n private static writeData(writer: Writer, audioBuffer: Float32Array[], format: Format) {\n const { bitDepth, float, length, numberOfChannels, symmetric } = format;\n if (bitDepth === 32 && float) {\n const { dataView, pos } = writer;\n const ab = dataView.buffer;\n const f32View = new Float32Array(ab, pos);\n if (numberOfChannels === 1) {\n f32View.set(audioBuffer[0]);\n return;\n }\n for (let ch = 0; ch < numberOfChannels; ch++) {\n const channel = audioBuffer[ch];\n for (let i = 0; i < length; i++) {\n f32View[i * numberOfChannels + ch] = channel[i];\n }\n }\n return;\n }\n const encoderOption = float ? \"f\" : symmetric ? \"s\" : \"\";\n const methodName = \"pcm\" + bitDepth + encoderOption;\n\n if (!(writer as any)[methodName]) {\n throw new TypeError(\"Not supported bit depth: \" + bitDepth);\n }\n\n const write: (value: number) => void = (writer as any)[methodName].bind(writer);\n\n for (let i = 0; i < length; i++) {\n for (let j = 0; j < numberOfChannels; j++) {\n write(audioBuffer[j][i]);\n }\n }\n }\n}\n\nclass Writer {\n pos = 0;\n dataView: DataView;\n constructor(dataView: DataView) {\n this.dataView = dataView;\n }\n int16(value: number) {\n this.dataView.setInt16(this.pos, value, true);\n this.pos += 2;\n }\n uint16(value: number) {\n this.dataView.setUint16(this.pos, value, true);\n this.pos += 2;\n }\n uint32(value: number) {\n this.dataView.setUint32(this.pos, value, true);\n this.pos += 4;\n }\n string(value: string) {\n for (let i = 0, imax = value.length; i < imax; i++) {\n this.dataView.setUint8(this.pos++, value.charCodeAt(i));\n }\n }\n pcm8(valueIn: number) {\n let value = valueIn;\n value = Math.max(-1, Math.min(value, +1));\n value = (value * 0.5 + 0.5) * 255;\n value = Math.round(value) | 0;\n this.dataView.setUint8(this.pos, value/* , true*/);\n this.pos += 1;\n }\n pcm8s(valueIn: number) {\n let value = valueIn;\n value = Math.round(value * 128) + 128;\n value = Math.max(0, Math.min(value, 255));\n this.dataView.setUint8(this.pos, value/* , true*/);\n this.pos += 1;\n }\n pcm16(valueIn: number) {\n let value = valueIn;\n value = Math.max(-1, Math.min(value, +1));\n value = value < 0 ? value * 32768 : value * 32767;\n value = Math.round(value) | 0;\n this.dataView.setInt16(this.pos, value, true);\n this.pos += 2;\n }\n pcm16s(valueIn: number) {\n let value = valueIn;\n value = Math.round(value * 32768);\n value = Math.max(-32768, Math.min(value, 32767));\n this.dataView.setInt16(this.pos, value, true);\n this.pos += 2;\n }\n pcm24(valueIn: number) {\n let value = valueIn;\n value = Math.max(-1, Math.min(value, +1));\n value = value < 0 ? 0x1000000 + value * 8388608 : value * 8388607;\n value = Math.round(value) | 0;\n\n const x0 = (value >> 0) & 0xFF;\n const x1 = (value >> 8) & 0xFF;\n const x2 = (value >> 16) & 0xFF;\n\n this.dataView.setUint8(this.pos + 0, x0);\n this.dataView.setUint8(this.pos + 1, x1);\n this.dataView.setUint8(this.pos + 2, x2);\n this.pos += 3;\n }\n pcm24s(valueIn: number) {\n let value = valueIn;\n value = Math.round(value * 8388608);\n value = Math.max(-8388608, Math.min(value, 8388607));\n\n const x0 = (value >> 0) & 0xFF;\n const x1 = (value >> 8) & 0xFF;\n const x2 = (value >> 16) & 0xFF;\n\n this.dataView.setUint8(this.pos + 0, x0);\n this.dataView.setUint8(this.pos + 1, x1);\n this.dataView.setUint8(this.pos + 2, x2);\n this.pos += 3;\n }\n pcm32(valueIn: number) {\n let value = valueIn;\n value = Math.max(-1, Math.min(value, +1));\n value = value < 0 ? value * 2147483648 : value * 2147483647;\n value = Math.round(value) | 0;\n this.dataView.setInt32(this.pos, value, true);\n this.pos += 4;\n }\n pcm32s(valueIn: number) {\n let value = valueIn;\n value = Math.round(value * 2147483648);\n value = Math.max(-2147483648, Math.min(value, +2147483647));\n this.dataView.setInt32(this.pos, value, true);\n this.pos += 4;\n }\n pcm32f(value: number) {\n this.dataView.setFloat32(this.pos, value, true);\n this.pos += 4;\n }\n}\n\nexport default WavEncoder;\n", "export interface WavDecoderOptions {\n symmetric?: boolean;\n shared?: boolean;\n}\ninterface Format {\n formatId: number;\n float: boolean;\n numberOfChannels: number;\n sampleRate: number;\n byteRate: number;\n blockSize: number;\n bitDepth: number;\n}\n\n/**\n * Code from https://github.com/mohayonao/wav-decoder\n */\nclass WavDecoder {\n static decode(buffer: ArrayBuffer, options?: WavDecoderOptions) {\n const dataView = new DataView(buffer);\n const reader = new Reader(dataView);\n if (reader.string(4) !== \"RIFF\") {\n throw new TypeError(\"Invalid WAV file\");\n }\n reader.uint32(); // skip file length\n if (reader.string(4) !== \"WAVE\") {\n throw new TypeError(\"Invalid WAV file\");\n }\n let format: Format | null = null;\n let audioData: {\n numberOfChannels: number;\n length: number;\n sampleRate: number;\n channelData: Float32Array[];\n } | null = null;\n do {\n const chunkType = reader.string(4);\n const chunkSize = reader.uint32();\n if (chunkType === \"fmt \") {\n format = this.decodeFormat(reader, chunkSize);\n } else if (chunkType === \"data\") {\n audioData = this.decodeData(reader, chunkSize, format as Format, options || {});\n } else {\n reader.skip(chunkSize);\n }\n } while (audioData === null);\n return audioData;\n }\n private static decodeFormat(reader: Reader, chunkSize: number) {\n const formats = {\n 0x0001: \"lpcm\",\n 0x0003: \"lpcm\"\n };\n const formatId = reader.uint16();\n if (!formats.hasOwnProperty(formatId)) {\n throw new TypeError(\"Unsupported format in WAV file: 0x\" + formatId.toString(16));\n }\n const format: Format = {\n formatId: formatId,\n float: formatId === 0x0003,\n numberOfChannels: reader.uint16(),\n sampleRate: reader.uint32(),\n byteRate: reader.uint32(),\n blockSize: reader.uint16(),\n bitDepth: reader.uint16()\n };\n reader.skip(chunkSize - 16);\n return format;\n }\n private static decodeData(reader: Reader, chunkSizeIn: number, format: Format, options: WavDecoderOptions) {\n const chunkSize = Math.min(chunkSizeIn, reader.remain());\n const length = Math.floor(chunkSize / format.blockSize);\n const numberOfChannels = format.numberOfChannels;\n const sampleRate = format.sampleRate;\n const channelData: Float32Array[] = new Array(numberOfChannels);\n for (let ch = 0; ch < numberOfChannels; ch++) {\n const AB = options.shared ? (globalThis.SharedArrayBuffer || globalThis.ArrayBuffer) : globalThis.ArrayBuffer;\n const ab = new AB(length * Float32Array.BYTES_PER_ELEMENT);\n channelData[ch] = new Float32Array(ab);\n }\n this.readPCM(reader, channelData, length, format, options);\n return {\n numberOfChannels,\n length,\n sampleRate,\n channelData\n };\n }\n private static readPCM(reader: Reader, channelData: Float32Array[], length: number, format: Format, options: WavDecoderOptions) {\n const bitDepth = format.bitDepth;\n const decoderOption = format.float ? \"f\" : options.symmetric ? \"s\" : \"\";\n const methodName = \"pcm\" + bitDepth + decoderOption as `pcm${8 | 16 | 32}${\"f\" | \"s\" | \"\"}`;\n if (!(reader as any)[methodName]) {\n throw new TypeError(\"Not supported bit depth: \" + format.bitDepth);\n }\n const read: () => number = (reader as any)[methodName].bind(reader);\n const numberOfChannels = format.numberOfChannels;\n for (let i = 0; i < length; i++) {\n for (let ch = 0; ch < numberOfChannels; ch++) {\n channelData[ch][i] = read();\n }\n }\n }\n}\n\nclass Reader {\n pos = 0;\n dataView: DataView;\n constructor(dataView: DataView) {\n this.dataView = dataView;\n }\n remain() {\n return this.dataView.byteLength - this.pos;\n }\n skip(n: number) {\n this.pos += n;\n }\n uint8() {\n const data = this.dataView.getUint8(this.pos);\n this.pos += 1;\n return data;\n }\n int16() {\n const data = this.dataView.getInt16(this.pos, true);\n this.pos += 2;\n return data;\n }\n uint16() {\n const data = this.dataView.getUint16(this.pos, true);\n this.pos += 2;\n return data;\n }\n uint32() {\n const data = this.dataView.getUint32(this.pos, true);\n this.pos += 4;\n return data;\n }\n string(n: number) {\n let data = \"\";\n for (let i = 0; i < n; i++) {\n data += String.fromCharCode(this.uint8());\n }\n return data;\n }\n pcm8() {\n const data = this.dataView.getUint8(this.pos) - 128;\n this.pos += 1;\n return data < 0 ? data / 128 : data / 127;\n }\n pcm8s() {\n const data = this.dataView.getUint8(this.pos) - 127.5;\n this.pos += 1;\n return data / 127.5;\n }\n pcm16() {\n const data = this.dataView.getInt16(this.pos, true);\n this.pos += 2;\n return data < 0 ? data / 32768 : data / 32767;\n }\n pcm16s() {\n const data = this.dataView.getInt16(this.pos, true);\n this.pos += 2;\n return data / 32768;\n }\n pcm24() {\n const x0 = this.dataView.getUint8(this.pos + 0);\n const x1 = this.dataView.getUint8(this.pos + 1);\n const x2 = this.dataView.getUint8(this.pos + 2);\n const xx = (x0 + (x1 << 8) + (x2 << 16));\n\n const data = xx > 0x800000 ? xx - 0x1000000 : xx;\n this.pos += 3;\n return data < 0 ? data / 8388608 : data / 8388607;\n }\n pcm24s() {\n const x0 = this.dataView.getUint8(this.pos + 0);\n const x1 = this.dataView.getUint8(this.pos + 1);\n const x2 = this.dataView.getUint8(this.pos + 2);\n const xx = (x0 + (x1 << 8) + (x2 << 16));\n\n const data = xx > 0x800000 ? xx - 0x1000000 : xx;\n this.pos += 3;\n return data / 8388608;\n }\n pcm32() {\n const data = this.dataView.getInt32(this.pos, true);\n this.pos += 4;\n return data < 0 ? data / 2147483648 : data / 2147483647;\n }\n pcm32s() {\n const data = this.dataView.getInt32(this.pos, true);\n this.pos += 4;\n return data / 2147483648;\n }\n pcm32f() {\n const data = this.dataView.getFloat32(this.pos, true);\n this.pos += 4;\n return data;\n }\n pcm64f() {\n const data = this.dataView.getFloat64(this.pos, true);\n this.pos += 8;\n return data;\n }\n}\n\nexport default WavDecoder;\n", "import { OutputParamHandler, ComputeHandler, PlotHandler, UIHandler, MetadataHandler, FaustBaseWebAudioDsp, IFaustMonoWebAudioDsp, IFaustPolyWebAudioDsp } from \"./FaustWebAudioDsp\";\nimport type { FaustAudioWorkletNodeOptions } from \"./FaustAudioWorkletProcessor\";\nimport type { LooseFaustDspFactory, FaustDspMeta, FaustUIInputItem, FaustUIItem } from \"./types\";\n\n/**\n * Base class for Monophonic and Polyphonic AudioWorkletNode\n */\nexport class FaustAudioWorkletNode<Poly extends boolean = false> extends (globalThis.AudioWorkletNode || null) {\n\n protected fJSONDsp: FaustDspMeta;\n protected fJSON: string;\n protected fInputsItems: string[];\n protected fOutputHandler: OutputParamHandler | null;\n protected fComputeHandler: ComputeHandler | null;\n protected fPlotHandler: PlotHandler | null;\n protected fUICallback: UIHandler;\n protected fDescriptor: FaustUIInputItem[];\n\n constructor(context: BaseAudioContext, name: string, factory: LooseFaustDspFactory, options: FaustAudioWorkletNodeOptions<Poly>[\"processorOptions\"], nodeOptions: Partial<FaustAudioWorkletNodeOptions> = {}) {\n\n // Create JSON object\n const JSONObj: FaustDspMeta = JSON.parse(factory.json);\n\n // Create proxy FaustAudioWorkletProcessor\n super(context, name, {\n numberOfInputs: JSONObj.inputs > 0 ? 1 : 0,\n numberOfOutputs: JSONObj.outputs > 0 ? 1 : 0,\n channelCount: Math.max(1, JSONObj.inputs),\n outputChannelCount: [JSONObj.outputs],\n channelCountMode: \"explicit\",\n channelInterpretation: \"speakers\",\n processorOptions: options,\n ...nodeOptions\n });\n\n this.fJSONDsp = JSONObj;\n this.fJSON = factory.json;\n this.fOutputHandler = null;\n this.fComputeHandler = null;\n this.fPlotHandler = null;\n this.fDescriptor = [];\n\n // Parse UI\n this.fInputsItems = [];\n this.fUICallback = (item: FaustUIItem) => {\n if (item.type === \"vslider\" || item.type === \"hslider\" || item.type === \"button\" || item.type === \"checkbox\" || item.type === \"nentry\") {\n // Keep inputs adresses\n this.fInputsItems.push(item.address);\n this.fDescriptor.push(item);\n }\n }\n FaustBaseWebAudioDsp.parseUI(this.fJSONDsp.ui, this.fUICallback);\n\n // Patch it with additional functions\n this.port.onmessage = (e: MessageEvent) => {\n if (e.data.type === \"param\" && this.fOutputHandler) {\n this.fOutputHandler(e.data.path, e.data.value);\n } else if (e.data.type === \"plot\" && this.fPlotHandler) {\n this.fPlotHandler(e.data.value, e.data.index, e.data.events);\n }\n };\n }\n\n // Public API\n setOutputParamHandler(handler: OutputParamHandler | null) {\n this.fOutputHandler = handler;\n }\n getOutputParamHandler() {\n return this.fOutputHandler;\n }\n\n setComputeHandler(handler: ComputeHandler | null) {\n this.fComputeHandler = handler;\n }\n getComputeHandler(): ComputeHandler | null {\n return this.fComputeHandler;\n }\n\n setPlotHandler(handler: PlotHandler | null) {\n this.fPlotHandler = handler;\n // Set PlotHandler on processor side\n if (this.fPlotHandler) {\n this.port.postMessage({ type: \"setPlotHandler\", data: true });\n } else {\n this.port.postMessage({ type: \"setPlotHandler\", data: false });\n }\n }\n getPlotHandler(): PlotHandler | null {\n return this.fPlotHandler;\n }\n\n getNumInputs() {\n return this.fJSONDsp.inputs;\n }\n getNumOutputs() {\n return this.fJSONDsp.outputs;\n }\n\n // Implemented in subclasses\n compute(inputs: Float32Array[], outputs: Float32Array[]) {\n return false;\n }\n\n metadata(handler: MetadataHandler) {\n if (this.fJSONDsp.meta) {\n this.fJSONDsp.meta.forEach(meta => handler(Object.keys(meta)[0], meta[Object.keys(meta)[0]]));\n }\n }\n\n midiMessage(data: number[] | Uint8Array): void {\n const cmd = data[0] >> 4;\n const channel = data[0] & 0xf;\n const data1 = data[1];\n const data2 = data[2];\n if (cmd === 11) this.ctrlChange(channel, data1, data2);\n else if (cmd === 14) this.pitchWheel(channel, data2 * 128.0 + data1);\n else this.port.postMessage({ type: \"midi\", data: data });\n }\n\n ctrlChange(channel: number, ctrl: number, value: number) {\n const e = { type: \"ctrlChange\", data: [channel, ctrl, value] };\n this.port.postMessage(e);\n }\n pitchWheel(channel: number, wheel: number) {\n const e = { type: \"pitchWheel\", data: [channel, wheel] };\n this.port.postMessage(e);\n }\n\n setParamValue(path: string, value: number) {\n const e = { type: \"param\", data: { path, value } };\n this.port.postMessage(e);\n // Set value on AudioParam (but this is not used on Processor side for now)\n const param = this.parameters.get(path);\n if (param) param.setValueAtTime(value, this.context.currentTime);\n\n }\n getParamValue(path: string) {\n // Get value of AudioParam\n const param = this.parameters.get(path);\n return (param) ? param.value : 0;\n }\n\n getParams() { return this.fInputsItems; }\n getMeta() { return this.fJSONDsp; }\n getJSON() { return JSON.stringify(this.getMeta()); }\n getUI() { return this.fJSONDsp.ui; }\n getDescriptors() { return this.fDescriptor; }\n\n start() {\n this.port.postMessage({ type: \"start\" });\n }\n\n stop() {\n this.port.postMessage({ type: \"stop\" });\n }\n\n destroy() {\n this.port.postMessage({ type: \"destroy\" });\n this.port.close();\n }\n}\n\n/**\n * Monophonic AudioWorkletNode\n */\nexport class FaustMonoAudioWorkletNode extends FaustAudioWorkletNode<false> implements IFaustMonoWebAudioDsp {\n\n onprocessorerror = (e: Event) => {\n // console.error(\"Error from \" + this.fJSONDsp.name + \" FaustMonoAudioWorkletNode\");\n throw e;\n }\n\n constructor(context: BaseAudioContext, name: string, factory: LooseFaustDspFactory, sampleSize: number, nodeOptions: Partial<FaustAudioWorkletNodeOptions> = {}) {\n super(context, name, factory, { name, factory, sampleSize }, nodeOptions);\n }\n}\n\n/**\n * Polyphonic AudioWorkletNode\n */\nexport class FaustPolyAudioWorkletNode extends FaustAudioWorkletNode<true> implements IFaustPolyWebAudioDsp {\n\n private fJSONEffect: FaustDspMeta | null;\n\n onprocessorerror = (e: Event) => {\n // console.error(\"Error from \" + this.fJSONDsp.name + \" FaustPolyAudioWorkletNode\");\n throw e;\n }\n\n constructor(context: BaseAudioContext,\n name: string,\n voiceFactory: LooseFaustDspFactory,\n mixerModule: WebAssembly.Module,\n voices: number,\n sampleSize: number,\n effectFactory?: LooseFaustDspFactory, nodeOptions: Partial<FaustAudioWorkletNodeOptions> = {}) {\n\n super(\n context,\n name,\n voiceFactory,\n {\n name,\n voiceFactory,\n mixerModule,\n voices,\n sampleSize,\n effectFactory\n },\n nodeOptions\n );\n\n this.fJSONEffect = effectFactory ? JSON.parse(effectFactory.json) : null;\n\n if (this.fJSONEffect) {\n FaustBaseWebAudioDsp.parseUI(this.fJSONEffect.ui, this.fUICallback);\n }\n }\n\n // Public API\n keyOn(channel: number, pitch: number, velocity: number) {\n const e = { type: \"keyOn\", data: [channel, pitch, velocity] };\n this.port.postMessage(e);\n }\n\n keyOff(channel: number, pitch: number, velocity: number) {\n const e = { type: \"keyOff\", data: [channel, pitch, velocity] };\n this.port.postMessage(e);\n }\n\n allNotesOff(hard: boolean) {\n const e = { type: \"ctrlChange\", data: [0, 123, 0] };\n this.port.postMessage(e);\n }\n\n getMeta() {\n const o = this.fJSONDsp;\n const e = this.fJSONEffect;\n const r = { ...o };\n if (e) {\n r.ui = [{\n type: \"tgroup\", label: \"Sequencer\", items: [\n { type: \"vgroup\", label: \"Instrument\", items: o.ui },\n { type: \"vgroup\", label: \"Effect\", items: e.ui }\n ]\n }];\n } else {\n r.ui = [{\n type: \"tgroup\", label: \"Polyphonic\", items: [\n { type: \"vgroup\", label: \"Voices\", items: o.ui }\n ]\n }];\n }\n return r as FaustDspMeta;\n }\n\n getJSON() {\n return JSON.stringify(this.getMeta());\n }\n\n getUI() {\n return this.getMeta().ui;\n }\n}\n", "import type { ComputeHandler, FaustMonoWebAudioDsp, FaustPolyWebAudioDsp, IFaustMonoWebAudioDsp, IFaustPolyWebAudioDsp, MetadataHandler, OutputParamHandler, PlotHandler } from \"./FaustWebAudioDsp\";\n\n/**\n * Base class for Monophonic and Polyphonic ScriptProcessorNode\n */\nexport class FaustScriptProcessorNode<Poly extends boolean = false> extends (globalThis.ScriptProcessorNode || null) {\n protected fDSPCode!: Poly extends true ? FaustPolyWebAudioDsp : FaustMonoWebAudioDsp;\n\n // Needed for ScriptProcessorNode\n protected fInputs!: Float32Array[];\n protected fOutputs!: Float32Array[];\n\n init(instance: Poly extends true ? FaustPolyWebAudioDsp : FaustMonoWebAudioDsp) {\n this.fDSPCode = instance;\n\n this.fInputs = new Array(this.fDSPCode.getNumInputs());\n this.fOutputs = new Array(this.fDSPCode.getNumOutputs());\n\n this.onaudioprocess = (e) => {\n\n // Read inputs\n for (let chan = 0; chan < this.fDSPCode.getNumInputs(); chan++) {\n this.fInputs[chan] = e.inputBuffer.getChannelData(chan);\n }\n\n // Read outputs\n for (let chan = 0; chan < this.fDSPCode.getNumOutputs(); chan++) {\n this.fOutputs[chan] = e.outputBuffer.getChannelData(chan);\n }\n\n return this.fDSPCode.compute(this.fInputs, this.fOutputs);\n }\n\n this.start();\n }\n // Public API\n compute(input: Float32Array[], output: Float32Array[]) { return this.fDSPCode.compute(input, output); }\n\n setOutputParamHandler(handler: OutputParamHandler) { this.fDSPCode.setOutputParamHandler(handler); }\n getOutputParamHandler() { return this.fDSPCode.getOutputParamHandler(); }\n\n setComputeHandler(handler: ComputeHandler) { this.fDSPCode.setComputeHandler(handler); }\n getComputeHandler() { return this.fDSPCode.getComputeHandler(); }\n\n setPlotHandler(handler: PlotHandler) { this.fDSPCode.setPlotHandler(handler); }\n getPlotHandler() { return this.fDSPCode.getPlotHandler(); }\n\n getNumInputs() { return this.fDSPCode.getNumInputs(); }\n getNumOutputs() { return this.fDSPCode.getNumOutputs(); }\n\n metadata(handler: MetadataHandler) { }\n\n midiMessage(data: number[] | Uint8Array) { this.fDSPCode.midiMessage(data); }\n\n ctrlChange(chan: number, ctrl: number, value: number) { this.fDSPCode.ctrlChange(chan, ctrl, value); }\n pitchWheel(chan: number, value: number) { this.fDSPCode.pitchWheel(chan, value); }\n\n setParamValue(path: string, value: number) { this.fDSPCode.setParamValue(path, value); }\n getParamValue(path: string) { return this.fDSPCode.getParamValue(path); }\n getParams() { return this.fDSPCode.getParams(); }\n\n getMeta() { return this.fDSPCode.getMeta(); }\n getJSON() { return this.fDSPCode.getJSON(); }\n getDescriptors() { return this.fDSPCode.getDescriptors(); }\n getUI() { return this.fDSPCode.getUI(); }\n\n start() { this.fDSPCode.start(); }\n stop() { this.fDSPCode.stop(); }\n\n destroy() { this.fDSPCode.destroy(); }\n}\n\nexport class FaustMonoScriptProcessorNode extends FaustScriptProcessorNode<false> implements IFaustMonoWebAudioDsp {\n}\n\nexport class FaustPolyScriptProcessorNode extends FaustScriptProcessorNode<true> implements IFaustPolyWebAudioDsp {\n keyOn(channel: number, pitch: number, velocity: number) { this.fDSPCode.keyOn(channel, pitch, velocity); }\n keyOff(channel: number, pitch: number, velocity: number) { this.fDSPCode.keyOff(channel, pitch, velocity); }\n allNotesOff(hard: boolean) { this.fDSPCode.allNotesOff(hard); }\n}\n", "import { FaustMonoAudioWorkletNode, FaustPolyAudioWorkletNode } from \"./FaustAudioWorkletNode\";\nimport getFaustAudioWorkletProcessor, { FaustData } from \"./FaustAudioWorkletProcessor\";\nimport getFaustFFTAudioWorkletProcessor, { FaustFFTData, FaustFFTOptionsData } from \"./FaustFFTAudioWorkletProcessor\";\nimport { FaustDspInstance } from \"./FaustDspInstance\";\nimport FaustWasmInstantiator from \"./FaustWasmInstantiator\";\nimport { FaustMonoOfflineProcessor, FaustPolyOfflineProcessor, IFaustMonoOfflineProcessor, IFaustPolyOfflineProcessor } from \"./FaustOfflineProcessor\";\nimport { FaustMonoScriptProcessorNode, FaustPolyScriptProcessorNode } from \"./FaustScriptProcessorNode\";\nimport { FaustBaseWebAudioDsp, FaustMonoWebAudioDsp, FaustPolyWebAudioDsp, FaustWebAudioDspVoice, IFaustMonoWebAudioNode, IFaustPolyWebAudioNode } from \"./FaustWebAudioDsp\";\nimport type { IFaustCompiler } from \"./FaustCompiler\";\nimport type { FaustDspFactory, FaustUIDescriptor, FaustDspMeta, FFTUtils, LooseFaustDspFactory } from \"./types\";\n\nexport interface IFaustMonoDspGenerator {\n /**\n * Compile a monophonic DSP factory from given code.\n * \n * @param compiler - the Faust compiler\n * @param name - the DSP name\n * @param code - the DSP code\n * @param args - the compilation parameters\n * @returns the compiled factory or 'null' if failure\n */\n compile(compiler: IFaustCompiler, name: string, code: string, args: string): Promise<{\n factory: FaustDspFactory | null;\n name?: string;\n meta?: FaustDspMeta;\n } | null>;\n\n /**\n * Create a monophonic WebAudio node (either ScriptProcessorNode or AudioWorkletNode).\n *\n * @param context - the WebAudio context\n * @param name - DSP name, can be used for processorName\n * @param factory - default is the compiled factory\n * @param sp - whether to compile a ScriptProcessorNode or an AudioWorkletNode\n * @param bufferSize - the buffer size in frames to be used in ScriptProcessorNode only, since AudioWorkletNode always uses 128 frames\n * @param processorName - AudioWorklet Processor name\n * @returns the compiled WebAudio node or 'null' if failure\n */\n createNode(\n context: BaseAudioContext,\n name?: string,\n factory?: LooseFaustDspFactory,\n sp?: boolean,\n bufferSize?: number,\n processorName?: string\n ): Promise<IFaustMonoWebAudioNode | null>;\n\n /**\n * Create a monophonic WebAudio node (either ScriptProcessorNode or AudioWorkletNode).\n *\n * @param context - the WebAudio context\n * @param fftUtils - should be an anonymous class with static methods, without any import from outside\n * @param name - DSP name, can be used for processorName\n * @param factory - default is the compiled factory\n * @param fftOptions - initial FFT options\n * @param processorName - AudioWorklet Processor name\n * @returns the compiled WebAudio node or 'null' if failure\n */\n createFFTNode(\n context: BaseAudioContext,\n fftUtils: typeof FFTUtils,\n name?: string,\n factory?: LooseFaustDspFactory,\n fftOptions?: Partial<FaustFFTOptionsData>,\n processorName?: string\n ): Promise<FaustMonoAudioWorkletNode | null>;\n\n /**\n * Create a monophonic Offline processor.\n *\n * @param sampleRate - the sample rate in Hz\n * @param bufferSize - the buffer size in frames\n * @param factory - default is the compiled factory\n * @returns the compiled processor or 'null' if failure\n */\n createOfflineProcessor(sampleRate: number, bufferSize: number, factory?: LooseFaustDspFactory, meta?: FaustDspMeta): Promise<IFaustMonoOfflineProcessor | null>;\n\n /**\n * Get DSP JSON description with its UI and metadata as object.\n *\n * @return the DSP JSON description as object\n */\n getMeta(): FaustDspMeta;\n\n /**\n * Get DSP JSON description with its UI and metadata.\n *\n * @return the DSP JSON description\n */\n getJSON(): string;\n\n /**\n * Get DSP UI description.\n *\n * @return the DSP UI description\n */\n getUI(): FaustUIDescriptor;\n}\n\nexport interface IFaustPolyDspGenerator {\n /**\n * Compile a monophonic DSP factory from given code.\n * \n * @param compiler - the Faust compiler\n * @param name - the DSP name\n * @param dspCode - the DSP code ('dspCode' can possibly contain an integrated effect)\n * @param args - the compilation parameters\n * @param effectCode - optional effect DSP code\n * @returns the compiled factory or 'null' if failure\n */\n compile(compiler: IFaustCompiler, name: string, dspCode: string, args: string, effectCode?: string): Promise<{\n voiceFactory: FaustDspFactory | null;\n effectFactory?: FaustDspFactory | null;\n } | null>;\n\n /**\n * Create a polyphonic WebAudio node (either ScriptProcessorNode or AudioWorkletNode).\n *\n * @param context the WebAudio context\n * @param voices - the number of voices\n * @param name - AudioWorklet Processor name\n * @param voiceFactory - the Faust factory for voices, either obtained with a compiler (createDSPFactory) or loaded from files (loadDSPFactory)\n * @param mixerModule - the wasm Mixer module (loaded from 'mixer32.wasm' or 'mixer64.wasm' files located in the 'faustwasm' package)\n * @param effectFactory - the Faust factory for the effect, either obtained with a compiler (createDSPFactory) or loaded from files (loadDSPFactory)\n * @param sp - whether to compile a ScriptProcessorNode or an AudioWorkletNode\n * @param bufferSize - the buffer size in frames to be used in ScriptProcessorNode only, since AudioWorkletNode always uses 128 frames\n * @returns the compiled WebAudio node or 'null' if failure\n */\n createNode(\n context: BaseAudioContext,\n voices: number,\n name?: string,\n voiceFactory?: LooseFaustDspFactory,\n mixerModule?: WebAssembly.Module,\n effectFactory?: LooseFaustDspFactory | null,\n sp?: boolean,\n bufferSize?: number\n ): Promise<IFaustPolyWebAudioNode | null>;\n\n /**\n * Create a monophonic Offline processor.\n *\n * @param sampleRate - the sample rate in Hz\n * @param bufferSize - the buffer size in frames\n * @param voiceFactory - the Faust factory for voices, either obtained with a compiler (createDSPFactory) or loaded from files (loadDSPFactory)\n * @param mixerModule - the wasm Mixer module (loaded from 'mixer32.wasm' or 'mixer64.wasm' files)\n * @param effectFactory - the Faust factory for the effect, either obtained with a compiler (createDSPFactory) or loaded from files (loadDSPFactory)\n * @returns the compiled processor or 'null' if failure\n */\n createOfflineProcessor(\n sampleRate: number,\n bufferSize: number,\n voices: number,\n voiceFactory?: LooseFaustDspFactory,\n mixerModule?: WebAssembly.Module,\n effectFactory?: LooseFaustDspFactory | null\n ): Promise<IFaustPolyOfflineProcessor | null>;\n\n /**\n * Get DSP JSON description with its UI and metadata as object.\n *\n * @return the DSP JSON description as object\n */\n getMeta(): FaustDspMeta;\n\n /**\n * Get DSP JSON description with its UI and metadata.\n *\n * @return the DSP JSON description\n */\n getJSON(): string;\n\n /**\n * Get DSP UI description.\n *\n * @return the DSP UI description\n */\n getUI(): FaustUIDescriptor;\n}\n\nexport class FaustMonoDspGenerator implements IFaustMonoDspGenerator {\n // Set of all created WorkletProcessors, each of them has to be unique\n private static gWorkletProcessors: Map<BaseAudioContext, Set<string>> = new Map();\n\n name: string;\n factory!: FaustDspFactory | null;\n\n constructor() {\n this.factory = null;\n }\n async compile(compiler: IFaustCompiler, name: string, code: string, args: string) {\n this.factory = await compiler.createMonoDSPFactory(name, code, args);\n if (this.factory) {\n this.name = name;\n return this;\n } else {\n return null;\n }\n }\n\n async createNode<SP extends boolean = false>(\n context: BaseAudioContext,\n name = this.name,\n factory = this.factory as LooseFaustDspFactory,\n sp = false as SP,\n bufferSize = 1024,\n processorName = factory?.shaKey || name\n ): Promise<SP extends true ? FaustMonoScriptProcessorNode | null : FaustMonoAudioWorkletNode | null> {\n if (!factory) throw new Error(\"Code is not compiled, please define the factory or call `await this.compile()` first.\");\n\n const meta = JSON.parse(factory.json);\n const sampleSize = meta.compile_options.match(\"-double\") ? 8 : 4;\n if (sp) {\n const instance = await FaustWasmInstantiator.createAsyncMonoDSPInstance(factory);\n const monoDsp = new FaustMonoWebAudioDsp(instance, context.sampleRate, sampleSize, bufferSize);\n // Initialize the DSP instance, possibly loading soundfiles\n await monoDsp.init(context);\n const sp = context.createScriptProcessor(bufferSize, monoDsp.getNumInputs(), monoDsp.getNumOutputs()) as FaustMonoScriptProcessorNode;\n Object.setPrototypeOf(sp, FaustMonoScriptProcessorNode.prototype);\n sp.init(monoDsp);\n return sp as SP extends true ? FaustMonoScriptProcessorNode : FaustMonoAudioWorkletNode;\n } else {\n // Dynamically create AudioWorkletProcessor if code not yet created\n if (!FaustMonoDspGenerator.gWorkletProcessors.has(context)) FaustMonoDspGenerator.gWorkletProcessors.set(context, new Set());\n if (!FaustMonoDspGenerator.gWorkletProcessors.get(context)?.has(processorName)) {\n try {\n const processorCode = `\n// DSP name and JSON string for DSP are generated\nconst faustData = ${JSON.stringify({\n processorName,\n dspName: name,\n dspMeta: meta,\n poly: false\n } as FaustData)};\n// Implementation needed classes of functions\nconst ${FaustDspInstance.name} = ${FaustDspInstance.toString()}\nconst ${FaustBaseWebAudioDsp.name} = ${FaustBaseWebAudioDsp.toString()}\nconst ${FaustMonoWebAudioDsp.name} = ${FaustMonoWebAudioDsp.toString()}\nconst ${FaustWasmInstantiator.name} = ${FaustWasmInstantiator.toString()}\n// Put them in dependencies\nconst dependencies = {\n FaustBaseWebAudioDsp: ${FaustBaseWebAudioDsp.name},\n FaustMonoWebAudioDsp: ${FaustMonoWebAudioDsp.name},\n FaustWasmInstantiator: ${FaustWasmInstantiator.name}\n};\n// Generate the actual AudioWorkletProcessor code\n(${getFaustAudioWorkletProcessor.toString()})(dependencies, faustData);\n`;\n const url = URL.createObjectURL(new Blob([processorCode], { type: \"text/javascript\" }));\n await context.audioWorklet.addModule(url);\n // Keep the DSP name\n FaustMonoDspGenerator.gWorkletProcessors.get(context)?.add(processorName);\n } catch (e) {\n // console.error(`=> exception raised while running createMonoNode: ${e}`);\n // console.error(`=> check that your page is served using https.${e}`);\n throw e;\n }\n }\n // Create the AWN\n const node = new FaustMonoAudioWorkletNode(context, processorName, factory, sampleSize)\n return node as SP extends true ? FaustMonoScriptProcessorNode : FaustMonoAudioWorkletNode;\n }\n }\n\n async createFFTNode(\n context: BaseAudioContext,\n fftUtils: typeof FFTUtils,\n name = this.name,\n factory = this.factory as LooseFaustDspFactory,\n fftOptions: Partial<FaustFFTOptionsData> = {},\n processorName = factory?.shaKey ? `${factory.shaKey}_fft` : name\n ): Promise<FaustMonoAudioWorkletNode | null> {\n if (!factory) throw new Error(\"Code is not compiled, please define the factory or call `await this.compile()` first.\");\n\n const meta: FaustDspMeta = JSON.parse(factory.json);\n const sampleSize = meta.compile_options.match(\"-double\") ? 8 : 4;\n // Dynamically create AudioWorkletProcessor if code not yet created\n if (!FaustMonoDspGenerator.gWorkletProcessors.has(context)) FaustMonoDspGenerator.gWorkletProcessors.set(context, new Set());\n if (!FaustMonoDspGenerator.gWorkletProcessors.get(context)?.has(processorName)) {\n try {\n const processorCode = `\n// DSP name and JSON string for DSP are generated\nconst faustData = ${JSON.stringify({\n processorName,\n dspName: name,\n dspMeta: meta,\n fftOptions\n } as FaustFFTData)};\n// Implementation needed classes of functions\nconst ${FaustDspInstance.name} = ${FaustDspInstance.toString()}\nconst ${FaustBaseWebAudioDsp.name} = ${FaustBaseWebAudioDsp.toString()}\nconst ${FaustMonoWebAudioDsp.name} = ${FaustMonoWebAudioDsp.toString()}\nconst ${FaustWasmInstantiator.name} = ${FaustWasmInstantiator.toString()}\nconst FFTUtils = ${fftUtils.toString()}\n// Put them in dependencies\nconst dependencies = {\n FaustBaseWebAudioDsp: ${FaustBaseWebAudioDsp.name},\n FaustMonoWebAudioDsp: ${FaustMonoWebAudioDsp.name},\n FaustWasmInstantiator: ${FaustWasmInstantiator.name},\n FFTUtils\n};\n// Generate the actual AudioWorkletProcessor code\n(${getFaustFFTAudioWorkletProcessor.toString()})(dependencies, faustData);\n`;\n const url = URL.createObjectURL(new Blob([processorCode], { type: \"text/javascript\" }));\n await context.audioWorklet.addModule(url);\n // Keep the DSP name\n FaustMonoDspGenerator.gWorkletProcessors.get(context)?.add(processorName);\n } catch (e) {\n // console.error(`=> exception raised while running createMonoNode: ${e}`);\n // console.error(`=> check that your page is served using https.${e}`);\n throw e;\n }\n }\n // Create the AWN\n const node = new FaustMonoAudioWorkletNode(context, processorName, factory, sampleSize, { channelCount: Math.max(1, Math.ceil(meta.inputs / 3)), outputChannelCount: [Math.ceil(meta.outputs / 2)] });\n if (fftOptions.fftSize) {\n const param = node.parameters.get(\"fftSize\");\n if (param) param.value = fftOptions.fftSize;\n }\n if (fftOptions.fftOverlap) {\n const param = node.parameters.get(\"fftOverlap\");\n if (param) param.value = fftOptions.fftOverlap;\n }\n if (typeof fftOptions.defaultWindowFunction === \"number\") {\n const param = node.parameters.get(\"windowFunction\");\n if (param) param.value = fftOptions.defaultWindowFunction + 1;\n }\n if (typeof fftOptions.noIFFT === \"boolean\") {\n const param = node.parameters.get(\"noIFFT\");\n if (param) param.value = +fftOptions.noIFFT;\n }\n return node;\n }\n\n async createAudioWorkletProcessor(\n name = this.name,\n factory = this.factory as LooseFaustDspFactory,\n processorName = factory?.shaKey || name\n ) {\n if (!factory) throw new Error(\"Code is not compiled, please define the factory or call `await this.compile()` first.\");\n\n const meta = JSON.parse(factory.json);\n const dependencies = {\n FaustBaseWebAudioDsp,\n FaustMonoWebAudioDsp,\n FaustWasmInstantiator,\n FaustPolyWebAudioDsp: undefined,\n FaustWebAudioDspVoice: undefined,\n }\n // const sampleSize = meta.compile_options.match(\"-double\") ? 8 : 4;\n // Dynamically create AudioWorkletProcessor if code not yet created\n try {\n // DSP name and JSON string for DSP are generated\n const faustData = {\n processorName,\n dspName: name,\n dspMeta: meta,\n poly: false\n } as FaustData;\n // Generate the actual AudioWorkletProcessor code\n const Processor = getFaustAudioWorkletProcessor(dependencies, faustData);\n return Processor;\n } catch (e) {\n // console.error(`=> exception raised while running createMonoNode: ${e}`);\n // console.error(`=> check that your page is served using https.${e}`);\n throw e;\n }\n }\n\n async createOfflineProcessor(\n sampleRate: number,\n bufferSize: number,\n factory = this.factory as LooseFaustDspFactory,\n ) {\n if (!factory) throw new Error(\"Code is not compiled, please define the factory or call `await this.compile()` first.\");\n\n const meta = JSON.parse(factory.json);\n const instance = await FaustWasmInstantiator.createAsyncMonoDSPInstance(factory);\n const sampleSize = meta.compile_options.match(\"-double\") ? 8 : 4;\n const monoDsp = new FaustMonoWebAudioDsp(instance, sampleRate, sampleSize, bufferSize);\n // Initialize the DSP instance, no soundfiles loading for now (TODO ?)\n await monoDsp.init(null);\n return new FaustMonoOfflineProcessor(monoDsp, bufferSize);\n }\n\n getMeta() { return JSON.parse(this.factory!.json); }\n getJSON() { return JSON.stringify(this.getMeta()); }\n getUI() { return this.getMeta().ui; }\n}\n\nexport class FaustPolyDspGenerator implements IFaustPolyDspGenerator {\n // Set of all created WorkletProcessors, each of them has to be unique\n private static gWorkletProcessors: Map<BaseAudioContext, Set<string>> = new Map();\n\n name: string;\n voiceFactory!: FaustDspFactory | null;\n effectFactory!: FaustDspFactory | null;\n mixerBuffer!: Uint8Array;\n mixerModule!: WebAssembly.Module;\n\n constructor() {\n this.voiceFactory = null;\n this.effectFactory = null;\n }\n async compile(\n compiler: IFaustCompiler,\n name: string,\n dspCodeAux: string,\n args: string,\n // The ${dspCode} has to be added with wrapping new lines to make it properly formatted and ready to compile \n effectCodeAux = `dsp_code = environment{\n ${dspCodeAux}\n };\n process = dsp_code.effect;`\n ) {\n // Try to compile effect, possibly failing\n try {\n this.effectFactory = await compiler.createPolyDSPFactory(name, effectCodeAux, args);\n // Since the effect is processing the same buffers for inputs and outputs (in place processing), \n // the voice and effect are adapted, possibly clearing buffers\n if (this.effectFactory) {\n const effectJSON = JSON.parse(this.effectFactory.json);\n const dspCode = `\n // Voice output is forced to 2, when DSP is stereo or effect has 2 ins or 2 outs,\n // so that the effect can process the 2 channels of the voice\n adaptOut(1,1,1) = _;\n adaptOut(1,1,2) = _ <: _,0; // The left channel only is kept\n adaptOut(1,2,1) = _ <: _,_;\n adaptOut(1,2,2) = _ <: _,_;\n adaptOut(2,1,1) = _,_;\n adaptOut(2,1,2) = _,_;\n adaptOut(2,2,1) = _,_;\n adaptOut(2,2,2) = _,_;\n adaptor(F) = adaptOut(outputs(F),${effectJSON.inputs},${effectJSON.outputs});\n dsp_code = environment{\n ${dspCodeAux}\n };\n process = dsp_code.process : adaptor(dsp_code.process);`\n const effectCode = `\n // Inputs\n adaptIn(1,1,1) = _;\n adaptIn(1,1,2) = _,_ :> _; \n adaptIn(1,2,1) = _,_;\n adaptIn(1,2,2) = _,_;\n adaptIn(2,1,1) = _,_ :> _;\n adaptIn(2,1,2) = _,_ :> _;\n adaptIn(2,2,1) = _,_;\n adaptIn(2,2,2) = _,_;\n // Outputs\n adaptOut(1,1) = _ <: _,0; // The left channel only is kept\n adaptOut(1,2) = _,_;\n adaptOut(2,1) = _ <: _,0; // The left channel only is kept\n adaptOut(2,2) = _,_;\n adaptorIns(F) = adaptIn(outputs(F),${effectJSON.inputs},${effectJSON.outputs});\n adaptorOuts = adaptOut(${effectJSON.inputs},${effectJSON.outputs});\n dsp_code = environment{\n ${dspCodeAux}\n };\n process = adaptorIns(dsp_code.process) : dsp_code.effect : adaptorOuts;`\n this.voiceFactory = await compiler.createPolyDSPFactory(name, dspCode, args);\n try {\n // Effect is processing same buffers for inputs and outputs, so has to use -inpl option\n this.effectFactory = await compiler.createPolyDSPFactory(name, effectCode, args + \" -inpl\");\n } catch (e) {\n console.warn(e);\n }\n }\n } catch (e) {\n console.warn(e);\n this.voiceFactory = await compiler.createPolyDSPFactory(name, dspCodeAux, args);\n }\n\n if (this.voiceFactory) {\n this.name = name;\n const voiceMeta = JSON.parse(this.voiceFactory.json);\n const isDouble = voiceMeta.compile_options.match(\"-double\");\n const { mixerBuffer, mixerModule } = await compiler.getAsyncInternalMixerModule(!!isDouble);\n this.mixerBuffer = mixerBuffer;\n this.mixerModule = mixerModule;\n return this;\n } else {\n return null;\n }\n }\n\n async createNode<SP extends boolean = false>(\n context: BaseAudioContext,\n voices: number,\n name = this.name,\n voiceFactory = this.voiceFactory as LooseFaustDspFactory,\n mixerModule = this.mixerModule,\n effectFactory = this.effectFactory as LooseFaustDspFactory | null,\n sp = false as SP,\n bufferSize = 1024,\n processorName = ((voiceFactory?.shaKey || \"\") + (effectFactory?.shaKey || \"\")) || `${name}_poly`\n ): Promise<SP extends true ? FaustPolyScriptProcessorNode | null : FaustPolyAudioWorkletNode | null> {\n if (!voiceFactory) throw new Error(\"Code is not compiled, please define the factory or call `await this.compile()` first.\");\n\n const voiceMeta = JSON.parse(voiceFactory.json);\n const effectMeta = effectFactory ? JSON.parse(effectFactory.json) : undefined;\n const sampleSize = voiceMeta.compile_options.match(\"-double\") ? 8 : 4;\n if (sp) {\n const instance = await FaustWasmInstantiator.createAsyncPolyDSPInstance(voiceFactory, mixerModule, voices, effectFactory || undefined);\n const polyDsp = new FaustPolyWebAudioDsp(instance, context.sampleRate, sampleSize, bufferSize);\n // Initialize the DSP instance, possibly loading soundfiles\n await polyDsp.init(context);\n const sp = context.createScriptProcessor(bufferSize, polyDsp.getNumInputs(), polyDsp.getNumOutputs()) as FaustPolyScriptProcessorNode;\n Object.setPrototypeOf(sp, FaustPolyScriptProcessorNode.prototype);\n sp.init(polyDsp);\n return sp as SP extends true ? FaustPolyScriptProcessorNode : FaustPolyAudioWorkletNode;\n } else {\n // Dynamically create AudioWorkletProcessor if code not yet created\n if (!FaustPolyDspGenerator.gWorkletProcessors.has(context)) FaustPolyDspGenerator.gWorkletProcessors.set(context, new Set());\n if (!FaustPolyDspGenerator.gWorkletProcessors.get(context)?.has(processorName)) {\n try {\n const processorCode = `\n// DSP name and JSON string for DSP are generated\nconst faustData = ${JSON.stringify({\n processorName,\n dspName: name,\n dspMeta: voiceMeta,\n poly: true,\n effectMeta\n } as FaustData)};\n// Implementation needed classes of functions\nconst ${FaustDspInstance.name} = ${FaustDspInstance.toString()}\nconst ${FaustBaseWebAudioDsp.name} = ${FaustBaseWebAudioDsp.toString()}\nconst ${FaustPolyWebAudioDsp.name} = ${FaustPolyWebAudioDsp.toString()}\nconst ${FaustWebAudioDspVoice.name} = ${FaustWebAudioDspVoice.toString()}\nconst ${FaustWasmInstantiator.name} = ${FaustWasmInstantiator.toString()}\n// Put them in dependencies\nconst dependencies = {\n FaustBaseWebAudioDsp: ${FaustBaseWebAudioDsp.name},\n FaustPolyWebAudioDsp: ${FaustPolyWebAudioDsp.name},\n FaustWasmInstantiator: ${FaustWasmInstantiator.name}\n};\n// Generate the actual AudioWorkletProcessor code\n(${getFaustAudioWorkletProcessor.toString()})(dependencies, faustData);\n`;\n const url = URL.createObjectURL(new Blob([processorCode], { type: \"text/javascript\" }));\n await context.audioWorklet.addModule(url);\n // Keep the DSP name\n FaustPolyDspGenerator.gWorkletProcessors.get(context)?.add(processorName);\n } catch (e) {\n // console.error(`=> exception raised while running createPolyNode: ${e}`);\n // console.error(`=> check that your page is served using https.${e}`);\n throw e;\n }\n }\n // Create the AWN\n const node = new FaustPolyAudioWorkletNode(context, processorName, voiceFactory, mixerModule, voices, sampleSize, effectFactory || undefined);\n return node as SP extends true ? FaustPolyScriptProcessorNode : FaustPolyAudioWorkletNode;\n }\n }\n\n async createAudioWorkletProcessor(\n name = this.name,\n voiceFactory = this.voiceFactory as LooseFaustDspFactory,\n effectFactory = this.effectFactory as LooseFaustDspFactory | null,\n processorName = ((voiceFactory?.shaKey || \"\") + (effectFactory?.shaKey || \"\")) || `${name}_poly`\n ) {\n if (!voiceFactory) throw new Error(\"Code is not compiled, please define the factory or call `await this.compile()` first.\");\n\n const voiceMeta = JSON.parse(voiceFactory.json);\n const effectMeta = effectFactory ? JSON.parse(effectFactory.json) : undefined;\n const sampleSize = voiceMeta.compile_options.match(\"-double\") ? 8 : 4;\n // Dynamically create AudioWorkletProcessor if code not yet created\n try {\n const dependencies = {\n FaustBaseWebAudioDsp,\n FaustMonoWebAudioDsp: undefined,\n FaustWasmInstantiator,\n FaustPolyWebAudioDsp,\n FaustWebAudioDspVoice,\n };\n // DSP name and JSON string for DSP are generated\n const faustData = {\n processorName,\n dspName: name,\n dspMeta: voiceMeta,\n poly: true,\n effectMeta\n } as FaustData;\n // Generate the actual AudioWorkletProcessor code\n const Processor = getFaustAudioWorkletProcessor<true>(dependencies, faustData);\n return Processor;\n } catch (e) {\n // console.error(`=> exception raised while running createPolyNode: ${e}`);\n // console.error(`=> check that your page is served using https.${e}`);\n throw e;\n }\n }\n\n async createOfflineProcessor(\n sampleRate: number,\n bufferSize: number,\n voices: number,\n voiceFactory = this.voiceFactory as LooseFaustDspFactory,\n mixerModule = this.mixerModule,\n effectFactory = this.effectFactory as LooseFaustDspFactory | null\n ) {\n if (!voiceFactory) throw new Error(\"Code is not compiled, please define the factory or call `await this.compile()` first.\");\n\n const voiceMeta = JSON.parse(voiceFactory.json);\n const effectMeta = effectFactory ? JSON.parse(effectFactory.json) : undefined;\n const instance = await FaustWasmInstantiator.createAsyncPolyDSPInstance(voiceFactory, mixerModule, voices, effectFactory || undefined);\n const sampleSize = voiceMeta.compile_options.match(\"-double\") ? 8 : 4;\n const polyDsp = new FaustPolyWebAudioDsp(instance, sampleRate, sampleSize, bufferSize);\n return new FaustPolyOfflineProcessor(polyDsp, bufferSize);\n }\n\n getMeta() {\n const o = (this.voiceFactory) ? JSON.parse(this.voiceFactory.json) : null;\n const e = (this.effectFactory) ? JSON.parse(this.effectFactory.json) : null;\n const r = { ...o };\n if (e) {\n r.ui = [{\n type: \"tgroup\", label: \"Sequencer\", items: [\n { type: \"vgroup\", label: \"Instrument\", items: o.ui },\n { type: \"vgroup\", label: \"Effect\", items: e.ui }\n ]\n }];\n } else {\n r.ui = [{\n type: \"tgroup\", label: \"Polyphonic\", items: [\n { type: \"vgroup\", label: \"Voices\", items: o.ui }\n ]\n }];\n }\n return r as FaustDspMeta;\n }\n\n getJSON() {\n return JSON.stringify(this.getMeta());\n }\n\n getUI() {\n return this.getMeta().ui;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["exports", "v", "RawSha256", "Sha256", "FaustBaseWebAudioDsp", "FaustWasmInstantiator", "FaustMonoWebAudioDsp", "FaustPolyWebAudioDsp", "FaustBaseWebAudioDsp", "FaustWasmInstantiator", "FaustMonoWebAudioDsp", "sha256", "length", "ctrl", "length", "files", "length", "length", "sp"]
|
|
7
7
|
}
|