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;
}