From 780caf965a7b126f714f31dee2b3a4818bb8bf9b Mon Sep 17 00:00:00 2001 From: Dennis Ranke Date: Mon, 7 Mar 2022 09:35:11 +0100 Subject: [PATCH] sync sound registers to sound thread --- examples/curlywas/tim_ges.cwa | 45 +++++++++++++++++++++++++++++++++++ src/run-web.html | 2 +- web/src/audiolet.js | 9 ++++++- web/src/microw8.js | 10 +++++--- 4 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 examples/curlywas/tim_ges.cwa diff --git a/examples/curlywas/tim_ges.cwa b/examples/curlywas/tim_ges.cwa new file mode 100644 index 0000000..0f033ec --- /dev/null +++ b/examples/curlywas/tim_ges.cwa @@ -0,0 +1,45 @@ +include "../include/microw8-api.cwa" + +export fn upd() { + let T = 32!32 / 120; + + let inline riff_pos = abs(((T&31) - 16) as f32) as i32; + let lazy shift = ((1-((T>>5)&3))%2-1) * 2; + + let inline note_count = 5 - (T >= 512); + let inline octave = (riff_pos/5) * 12; + let inline riff_note = 5514 >> (riff_pos % note_count * 4) & 15; + let inline melody_note = shift + octave - riff_note; + + 80?1 = melody_note + 64; +} + +export fn snd(t: i32) -> f32 { + gesSample(t) +} + +const gesStateOffset = 112; +const gesBufferOffset = 120; + +fn gesSample(t: i32) -> f32 { + if !(t & 127) { + let i: i32; + loop clearLoop { + i!gesBufferOffset = 0; + branch_if (i := i + 4) < 128*4: clearLoop; + } + + let phase = 0!gesStateOffset; + let inline note = 80?1; + let inline freq = 440 as f32 * pow(2.0, (note - 69) as f32 / 12 as f32); + let phaseInc = (freq * (65536.0 / 88200.0)) as i32; + i = 0; + loop osciLoop { + i!gesBufferOffset = (phase & 65535) - 32768; + phase = phase + phaseInc; + branch_if (i := i + 4) < 128*4: osciLoop; + } + 0!gesStateOffset = phase; + } + (((t & 127) * 4)!gesBufferOffset) as f32 / 32768 as f32 +} diff --git a/src/run-web.html b/src/run-web.html index dfb35a2..83088b8 100644 --- a/src/run-web.html +++ b/src/run-web.html @@ -1 +1 @@ -uw8-run
\ No newline at end of file +uw8-run
\ No newline at end of file diff --git a/web/src/audiolet.js b/web/src/audiolet.js index 4bd2af9..ec5a949 100644 --- a/web/src/audiolet.js +++ b/web/src/audiolet.js @@ -1,9 +1,14 @@ +let U8 = (...a) => new Uint8Array(...a); class APU extends AudioWorkletProcessor { constructor() { super(); this.sampleIndex = 0; this.port.onmessage = (ev) => { - this.load(ev.data[0], ev.data[1]); + if(this.memory) { + U8(this.memory.buffer, 80, 32).set(U8(ev.data)); + } else { + this.load(ev.data[0], ev.data[1]); + } }; } @@ -38,6 +43,8 @@ class APU extends AudioWorkletProcessor { let instance = await instantiate(data); + this.memory = memory; + this.snd = instance.exports.snd; this.port.postMessage(2); diff --git a/web/src/microw8.js b/web/src/microw8.js index 24df187..6070a6d 100644 --- a/web/src/microw8.js +++ b/web/src/microw8.js @@ -8,8 +8,8 @@ class AudioNode extends AudioWorkletNode { } } -let U8 = (d) => new Uint8Array(d); -let U32 = (d) => new Uint32Array(d); +let U8 = (...a) => new Uint8Array(...a); +let U32 = (...a) => new Uint32Array(...a); export default function MicroW8(screen, config = {}) { if(!config.setMessage) { @@ -272,8 +272,12 @@ export default function MicroW8(screen, config = {}) { instance.exports.upd(); } platform_instance.exports.endFrame(); + + let soundRegisters = new ArrayBuffer(32); + U8(soundRegisters).set(U8(memory.buffer, 80, 32)); + audioNode.port.postMessage(soundRegisters, [soundRegisters]); - let palette = U32(memory.buffer.slice(0x13000, 0x13000 + 1024)); + let palette = U32(memory.buffer, 0x13000, 1024); for (let i = 0; i < 320 * 240; ++i) { buffer[i] = palette[memU8[i + 120]] | 0xff000000; }