diff --git a/packages/zig/README.md b/packages/zig/README.md index 66e38cf1b..759945eb6 100644 --- a/packages/zig/README.md +++ b/packages/zig/README.md @@ -3,8 +3,8 @@ ```sh -# (re)compile add.zig -zig build-lib add.zig -target wasm32-freestanding -dynamic -rdynamic +# (re)compile dsp.zig +zig build-lib dsp.zig -target wasm32-freestanding -dynamic -rdynamic # run server npx http-server -o ``` diff --git a/packages/zig/add.wasm b/packages/zig/add.wasm deleted file mode 100755 index ad6f38d4b..000000000 Binary files a/packages/zig/add.wasm and /dev/null differ diff --git a/packages/zig/add.zig b/packages/zig/add.zig deleted file mode 100644 index a04ec1544..000000000 --- a/packages/zig/add.zig +++ /dev/null @@ -1,3 +0,0 @@ -export fn add(a: i32, b: i32) i32 { - return a + b; -} diff --git a/packages/zig/dsp.wasm b/packages/zig/dsp.wasm new file mode 100755 index 000000000..67e9a5c2d Binary files /dev/null and b/packages/zig/dsp.wasm differ diff --git a/packages/zig/dsp.zig b/packages/zig/dsp.zig new file mode 100644 index 000000000..74a946cbb --- /dev/null +++ b/packages/zig/dsp.zig @@ -0,0 +1,5 @@ +const std = @import("std"); + +export fn saw(t: f64) f64 { + return ((@mod(110.0 * t, 1.0)) - 0.5) * 2.0; +} diff --git a/packages/zig/index.html b/packages/zig/index.html index 0f3d67c36..d9af426e5 100644 --- a/packages/zig/index.html +++ b/packages/zig/index.html @@ -4,7 +4,7 @@ ZIG / WASM Demo -

check the console

+ diff --git a/packages/zig/main.js b/packages/zig/main.js index 7540c86c0..fda63ac84 100644 --- a/packages/zig/main.js +++ b/packages/zig/main.js @@ -1,11 +1,17 @@ -async function run() { - let res = await fetch('./add.wasm'); - res = await res.arrayBuffer(); - res = await WebAssembly.instantiate(res, { - env: {}, - }); - const { add } = res.instance.exports; - console.log(add(3, 5)); -} +let ac; +document.getElementById('play').addEventListener('click', async () => { + ac = ac || new AudioContext(); + await ac.resume(); + await ac.audioWorklet.addModule('./worklet.js'); + const node = new AudioWorkletNode(ac, 'saw-processor'); -run(); + let res = await fetch('./dsp.wasm'); + const buffer = await res.arrayBuffer(); + node.port.onmessage = (e) => { + if (e.data === 'OK') { + console.log('worklet ready'); + } + }; + node.port.postMessage({ webassembly: buffer }); + node.connect(ac.destination); +}); diff --git a/packages/zig/worklet.js b/packages/zig/worklet.js new file mode 100644 index 000000000..3470d23b0 --- /dev/null +++ b/packages/zig/worklet.js @@ -0,0 +1,37 @@ +class SawProcessor extends AudioWorkletProcessor { + constructor() { + super(); + this.t = 0; // samples passed + this.port.onmessage = (e) => { + const key = Object.keys(e.data)[0]; + const value = e.data[key]; + switch (key) { + case 'webassembly': + WebAssembly.instantiate(value, this.importObject).then((result) => { + const exports = result.instance.exports; + this.api = result.instance.exports; + this.saw = exports.saw; + this.port.postMessage('OK'); + }); + break; + } + }; + } + + process(inputs, outputs, parameters) { + if (this.api) { + const output = outputs[0]; + for (let i = 0; i < output[0].length; i++) { + let t = this.t; + let out = 0; + out = this.api.saw(t / 44100, 220); + output.forEach((channel) => { + channel[i] = out; + }); + this.t++; + } + } + return true; + } +} +registerProcessor('saw-processor', SawProcessor);