{"version":3,"file":"audio-processor.mjs","sources":["../src/audio-processor.mjs"],"sourcesContent":["class audioProcessor extends AudioWorkletProcessor {\n\tconstructor(...args) {\n\t\tsuper(...args);\n\t\tthis.audioSample = 0;\n\t\tthis.byteSample = 0;\n\t\tthis.drawMode = 'Points';\n\t\tthis.errorDisplayed = true;\n\t\tthis.func = null;\n\t\tthis.getValues = null;\n\t\tthis.isFuncbeat = false;\n\t\tthis.isPlaying = false;\n\t\tthis.lastByteValue = [null, null];\n\t\tthis.lastFuncValue = [null, null];\n\t\tthis.lastTime = -1;\n\t\tthis.outValue = [0, 0];\n\t\tthis.playbackSpeed = 1;\n\t\tthis.sampleRate = 8000;\n\t\tthis.sampleRatio = 1;\n\t\tthis.srDivisor = 1;\n\t\tObject.seal(this);\n\t\taudioProcessor.deleteGlobals();\n\t\taudioProcessor.freezeGlobals();\n\t\tthis.port.addEventListener('message', e => this.receiveData(e.data));\n\t\tthis.port.start();\n\t}\n\tstatic deleteGlobals() {\n\t\t// Delete single letter variables to prevent persistent variable errors (covers a good enough range)\n\t\tfor(let i = 0; i < 26; ++i) {\n\t\t\tdelete globalThis[String.fromCharCode(65 + i)];\n\t\t\tdelete globalThis[String.fromCharCode(97 + i)];\n\t\t}\n\t\t// Delete global variables\n\t\tfor(const name in globalThis) {\n\t\t\tif(Object.prototype.hasOwnProperty.call(globalThis, name)) {\n\t\t\t\tdelete globalThis[name];\n\t\t\t}\n\t\t}\n\t}\n\tstatic freezeGlobals() {\n\t\tObject.getOwnPropertyNames(globalThis).forEach(name => {\n\t\t\tconst prop = globalThis[name];\n\t\t\tconst type = typeof prop;\n\t\t\tif((type === 'object' || type === 'function') && name !== 'globalThis') {\n\t\t\t\tObject.freeze(prop);\n\t\t\t}\n\t\t\tif(type === 'function' && Object.prototype.hasOwnProperty.call(prop, 'prototype')) {\n\t\t\t\tObject.freeze(prop.prototype);\n\t\t\t}\n\t\t\tObject.defineProperty(globalThis, name, { writable: false, configurable: false });\n\t\t});\n\t}\n\tstatic getErrorMessage(err, time) {\n\t\tconst when = time === null ? 'compilation' : 't=' + time;\n\t\tif(!(err instanceof Error)) {\n\t\t\treturn `${ when } thrown: ${ typeof err === 'string' ? err : JSON.stringify(err) }`;\n\t\t}\n\t\tconst { message, lineNumber, columnNumber } = err;\n\t\treturn `${ when } error: ${ typeof message === 'string' ? message : JSON.stringify(message) }${\n\t\t\ttypeof lineNumber === 'number' && typeof columnNumber === 'number' ?\n\t\t\t\t` (at line ${ lineNumber - 3 }, character ${ +columnNumber })` : '' }`;\n\t}\n\tprocess(inputs, [chData]) {\n\t\tconst chDataLen = chData[0].length;\n\t\tif(!chDataLen || !this.isPlaying) {\n\t\t\treturn true;\n\t\t}\n\t\tlet time = this.sampleRatio * this.audioSample;\n\t\tlet { byteSample } = this;\n\t\tconst drawBuffer = [];\n\t\tconst isDiagram = this.drawMode === 'Combined' || this.drawMode === 'Diagram';\n\t\tfor(let i = 0; i < chDataLen; ++i) {\n\t\t\ttime += this.sampleRatio;\n\t\t\tconst currentTime = Math.floor(time / this.srDivisor) * this.srDivisor;\n\t\t\tif(this.lastTime !== currentTime) {\n\t\t\t\tlet funcValue;\n\t\t\t\tconst currentSample = Math.floor(byteSample / this.srDivisor) * this.srDivisor;\n\t\t\t\ttry {\n\t\t\t\t\tif(this.isFuncbeat) {\n\t\t\t\t\t\tfuncValue = this.func(currentSample / this.sampleRate, this.sampleRate);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfuncValue = this.func(currentSample);\n\t\t\t\t\t}\n\t\t\t\t} catch(err) {\n\t\t\t\t\tif(this.errorDisplayed) {\n\t\t\t\t\t\tthis.errorDisplayed = false;\n\t\t\t\t\t\tthis.sendData({\n\t\t\t\t\t\t\terror: {\n\t\t\t\t\t\t\t\tmessage: audioProcessor.getErrorMessage(err, currentSample),\n\t\t\t\t\t\t\t\tisRuntime: true\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tfuncValue = NaN;\n\t\t\t\t}\n\t\t\t\tfuncValue = Array.isArray(funcValue) ? [funcValue[0], funcValue[1]] : [funcValue, funcValue];\n\t\t\t\tlet hasValue = false;\n\t\t\t\tlet ch = 2;\n\t\t\t\twhile(ch--) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfuncValue[ch] = +funcValue[ch];\n\t\t\t\t\t} catch(err) {\n\t\t\t\t\t\tfuncValue[ch] = NaN;\n\t\t\t\t\t}\n\t\t\t\t\tif(isDiagram) {\n\t\t\t\t\t\tif(!isNaN(funcValue[ch])) {\n\t\t\t\t\t\t\tthis.outValue[ch] = this.getValues(funcValue[ch], ch);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.lastByteValue[ch] = NaN;\n\t\t\t\t\t\t}\n\t\t\t\t\t\thasValue = true;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif(funcValue[ch] === this.lastFuncValue[ch]) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else if(!isNaN(funcValue[ch])) {\n\t\t\t\t\t\tthis.outValue[ch] = this.getValues(funcValue[ch], ch);\n\t\t\t\t\t\thasValue = true;\n\t\t\t\t\t} else if(!isNaN(this.lastFuncValue[ch])) {\n\t\t\t\t\t\tthis.lastByteValue[ch] = NaN;\n\t\t\t\t\t\thasValue = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(hasValue) {\n\t\t\t\t\tdrawBuffer.push({ t: currentSample, value: [...this.lastByteValue] });\n\t\t\t\t}\n\t\t\t\tbyteSample += currentTime - this.lastTime;\n\t\t\t\tthis.lastFuncValue = funcValue;\n\t\t\t\tthis.lastTime = currentTime;\n\t\t\t}\n\t\t\tchData[0][i] = this.outValue[0];\n\t\t\tchData[1][i] = this.outValue[1];\n\t\t}\n\t\tif(Math.abs(byteSample) > Number.MAX_SAFE_INTEGER) {\n\t\t\tthis.resetTime();\n\t\t\treturn true;\n\t\t}\n\t\tthis.audioSample += chDataLen;\n\t\tlet isSend = false;\n\t\tconst data = {};\n\t\tif(byteSample !== this.byteSample) {\n\t\t\tisSend = true;\n\t\t\tdata.byteSample = this.byteSample = byteSample;\n\t\t}\n\t\tif(drawBuffer.length) {\n\t\t\tisSend = true;\n\t\t\tdata.drawBuffer = drawBuffer;\n\t\t}\n\t\tif(isSend) {\n\t\t\tthis.sendData(data);\n\t\t}\n\t\treturn true;\n\t}\n\treceiveData(data) {\n\t\tif(data.byteSample !== undefined) {\n\t\t\tthis.byteSample = +data.byteSample || 0;\n\t\t\tthis.resetValues();\n\t\t}\n\t\tif(data.errorDisplayed === true) {\n\t\t\tthis.errorDisplayed = true;\n\t\t}\n\t\tif(data.isPlaying !== undefined) {\n\t\t\tthis.isPlaying = data.isPlaying;\n\t\t}\n\t\tif(data.srDivisor !== undefined) {\n\t\t\tthis.srDivisor = data.srDivisor;\n\t\t}\n\t\tif(data.playbackSpeed !== undefined) {\n\t\t\tconst sampleRatio = this.sampleRatio / this.playbackSpeed;\n\t\t\tthis.playbackSpeed = data.playbackSpeed;\n\t\t\tthis.setSampleRatio(sampleRatio);\n\t\t}\n\t\tif(data.mode !== undefined) {\n\t\t\tthis.isFuncbeat = data.mode === 'Funcbeat';\n\t\t\tswitch(data.mode) {\n\t\t\tcase 'Bytebeat':\n\t\t\t\tthis.getValues = (funcValue, ch) => (this.lastByteValue[ch] = funcValue & 255) / 127.5 - 1;\n\t\t\t\tbreak;\n\t\t\tcase 'Signed Bytebeat':\n\t\t\t\tthis.getValues = (funcValue, ch) =>\n\t\t\t\t\t(this.lastByteValue[ch] = (funcValue + 128) & 255) / 127.5 - 1;\n\t\t\t\tbreak;\n\t\t\tcase 'Floatbeat':\n\t\t\tcase 'Funcbeat':\n\t\t\t\tthis.getValues = (funcValue, ch) => {\n\t\t\t\t\tconst outValue = Math.max(Math.min(funcValue, 1), -1);\n\t\t\t\t\tthis.lastByteValue[ch] = Math.round((outValue + 1) * 127.5);\n\t\t\t\t\treturn outValue;\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t\tdefault: this.getValues = (funcValue, ch) => (this.lastByteValue[ch] = NaN);\n\t\t\t}\n\t\t}\n\t\tif(data.drawMode !== undefined) {\n\t\t\tthis.drawMode = data.drawMode;\n\t\t}\n\t\tif(data.setFunction !== undefined) {\n\t\t\tthis.setFunction(data.setFunction);\n\t\t}\n\t\tif(data.resetTime === true) {\n\t\t\tthis.resetTime();\n\t\t}\n\t\tif(data.sampleRate !== undefined) {\n\t\t\tthis.sampleRate = data.sampleRate;\n\t\t}\n\t\tif(data.sampleRatio !== undefined) {\n\t\t\tthis.setSampleRatio(data.sampleRatio);\n\t\t}\n\t}\n\tsendData(data) {\n\t\tthis.port.postMessage(data);\n\t}\n\tresetTime() {\n\t\tthis.byteSample = 0;\n\t\tthis.resetValues();\n\t\tthis.sendData({ byteSample: 0 });\n\t}\n\tresetValues() {\n\t\tthis.audioSample = 0;\n\t\tthis.lastByteValue = this.lastFuncValue = [null, null];\n\t\tthis.lastTime = -1;\n\t\tthis.outValue = [0, 0];\n\t}\n\tsetFunction(codeText) {\n\t\t// Create shortened Math functions\n\t\tconst params = Object.getOwnPropertyNames(Math);\n\t\tconst values = params.map(k => Math[k]);\n\t\tparams.push('int', 'window');\n\t\tvalues.push(Math.floor, globalThis);\n\t\taudioProcessor.deleteGlobals();\n\t\t// Code testing\n\t\tlet isCompiled = false;\n\t\tconst oldFunc = this.func;\n\t\ttry {\n\t\t\tif(this.isFuncbeat) {\n\t\t\t\tthis.func = new Function(...params, codeText).bind(globalThis, ...values);\n\t\t\t} else {\n\t\t\t\t// Optimize code like eval(unescape(escape`XXXX`.replace(/u(..)/g,\"$1%\")))\n\t\t\t\tcodeText = codeText.trim().replace(\n\t\t\t\t\t/^eval\\(unescape\\(escape(?:`|\\('|\\(\"|\\(`)(.*?)(?:`|'\\)|\"\\)|`\\)).replace\\(\\/u\\(\\.\\.\\)\\/g,[\"'`]\\$1%[\"'`]\\)\\)\\)$/,\n\t\t\t\t\t(match, m1) => unescape(escape(m1).replace(/u(..)/g, '$1%')));\n\t\t\t\tthis.func = new Function(...params, 't', `return 0,\\n${ codeText || 0 };`)\n\t\t\t\t\t.bind(globalThis, ...values);\n\t\t\t}\n\t\t\tisCompiled = true;\n\t\t\tif(this.isFuncbeat) {\n\t\t\t\tthis.func = this.func();\n\t\t\t\tthis.func(0, this.sampleRate);\n\t\t\t} else {\n\t\t\t\tthis.func(0);\n\t\t\t}\n\t\t} catch(err) {\n\t\t\tif(!isCompiled) {\n\t\t\t\tthis.func = oldFunc;\n\t\t\t}\n\t\t\tthis.errorDisplayed = false;\n\t\t\tthis.sendData({\n\t\t\t\terror: { message: audioProcessor.getErrorMessage(err, isCompiled ? 0 : null), isCompiled },\n\t\t\t\tupdateUrl: isCompiled\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tthis.errorDisplayed = false;\n\t\tthis.sendData({ error: { message: '', isCompiled }, updateUrl: true });\n\t}\n\tsetSampleRatio(sampleRatio) {\n\t\tconst timeOffset = Math.floor(this.sampleRatio * this.audioSample) - this.lastTime;\n\t\tthis.sampleRatio = sampleRatio * this.playbackSpeed;\n\t\tthis.lastTime = Math.floor(this.sampleRatio * this.audioSample) - timeOffset;\n\t}\n}\n\nregisterProcessor('audioProcessor', audioProcessor);\n"],"names":["audioProcessor","AudioWorkletProcessor","constructor","args","super","this","audioSample","byteSample","drawMode","errorDisplayed","func","getValues","isFuncbeat","isPlaying","lastByteValue","lastFuncValue","lastTime","outValue","playbackSpeed","sampleRate","sampleRatio","srDivisor","Object","seal","deleteGlobals","freezeGlobals","port","addEventListener","e","receiveData","data","start","i","globalThis","String","fromCharCode","name","prototype","hasOwnProperty","call","getOwnPropertyNames","forEach","prop","type","freeze","defineProperty","writable","configurable","getErrorMessage","err","time","when","Error","JSON","stringify","message","lineNumber","columnNumber","process","inputs","chData","chDataLen","length","drawBuffer","isDiagram","currentTime","Math","floor","funcValue","currentSample","sendData","error","isRuntime","NaN","Array","isArray","hasValue","ch","isNaN","push","t","value","abs","Number","MAX_SAFE_INTEGER","resetTime","isSend","undefined","resetValues","setSampleRatio","mode","max","min","round","setFunction","postMessage","codeText","params","values","map","k","isCompiled","oldFunc","Function","bind","trim","replace","match","m1","unescape","escape","updateUrl","timeOffset","registerProcessor"],"mappings":"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"}