From 29186c806fecefd95b650a6787cf9765703bc7b2 Mon Sep 17 00:00:00 2001 From: Dennis Ranke Date: Thu, 10 Mar 2022 23:05:07 +0100 Subject: [PATCH] add pulse width support to other wave types --- examples/curlywas/tim_ges.cwa | 2 +- platform/bin/platform.uw8 | Bin 3341 -> 3426 bytes platform/src/ges.cwa | 23 +++++++++---- src/run-web.html | 2 +- tests/plot_ges.cwa | 59 ++++++++++++++++++++++++++++++++++ 5 files changed, 78 insertions(+), 8 deletions(-) create mode 100644 tests/plot_ges.cwa diff --git a/examples/curlywas/tim_ges.cwa b/examples/curlywas/tim_ges.cwa index db2d325..7619079 100644 --- a/examples/curlywas/tim_ges.cwa +++ b/examples/curlywas/tim_ges.cwa @@ -37,7 +37,7 @@ export fn upd() { data 80 { i8( 0, 64, 0, 128, 0, 0x90, - 0, 128, 0, 128, 0, 0x4c, + 0, 64, 0, 128, 0, 0x4c, 5, 128, 0, 128, 0, 0x4c, 5, 128, 0, 128, 0, 0x4c, 0xf8, 0x85, diff --git a/platform/bin/platform.uw8 b/platform/bin/platform.uw8 index 92c9afd48bc1949346520cdd577850d0bbabb714..22136eea47013af4c63eae049021c269f96890cb 100644 GIT binary patch literal 3426 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 Xckhh373}bKx0!$VOxeS|g0UJI)FgpA diff --git a/platform/src/ges.cwa b/platform/src/ges.cwa index a99d1ce..37ec73f 100644 --- a/platform/src/ges.cwa +++ b/platform/src/ges.cwa @@ -67,7 +67,10 @@ export fn gesSnd(t: i32) -> f32 { if wave < 2 { if wave { loop sawLoop { - i!(GesBufferOffset + 128*4) = (phase & 65535) - 32768; + let p = (phase ^ 32768) << 16; + p = ((p ^ (p >> 31)) >> 15) + phaseShift; + p = (p < 0 | p > 65535) * 65535; + i!(GesBufferOffset + 128*4) = (phase ^ p & 65535) - 32768; phase = phase + phaseInc; branch_if (i := i + 4) < 64*4: sawLoop; } @@ -83,9 +86,12 @@ export fn gesSnd(t: i32) -> f32 { } } else { if wave == 2 { + let scale = pulseWidth + 256; loop triLoop { let s = phase << 16; - s = s ^ (s >> 31); + s = (s ^ (s >> 31)); + s = (s >> 8) * scale; + s = (s ^ (s >> 31)); i!(GesBufferOffset + 128*4) = (s >> 15) - 32768; phase = phase + phaseInc; branch_if (i := i + 4) < 64*4: triLoop; @@ -93,9 +99,10 @@ export fn gesSnd(t: i32) -> f32 { } else { loop noiseLoop { let s = (phase >> 12) & 4095; + let pulse = ((phase >> 8) & 255) >= pulseWidth; s = s * 0x6746ba73; - s = s ^ (s >> 15); - i!(GesBufferOffset + 128*4) = (s * 0x83567a92) >> 16; + s = s ^ (s >> 15) * pulse; + i!(GesBufferOffset + 128*4) = (s * 0x83567a92 + (phase << 16)) >> 16; phase = phase + phaseInc; branch_if (i := i + 4) < 64*4: noiseLoop; } @@ -124,8 +131,12 @@ export fn gesSnd(t: i32) -> f32 { let ctrl = filter?0x6a; let note = i32.load16_u(filter * 2, 0x6c); let inline freq = 440 as f32 * pow(2.0, (note - 69*256) as f32 / (12*256) as f32); - let F = min(4096 as f32, 8192 as f32 * sin(freq * (3.1415 / 44100.0))) as i32; - let Q = 7350 - ctrl * (6530/255); + let F = (8192 as f32 * sin(min(0.25, freq / 44100 as f32) * 3.1415)) as i32; + let Q = 8192 - (ctrl >> 4) * (7000/15); + let Qlimit = (8192*4096/F - F/2) * 3 / 4; + if Q > Qlimit { + Q = Qlimit; + } let low_out = ctrl & 1; let high_out = (ctrl >> 1) & 1; let band_out = (ctrl >> 2) & 1; diff --git a/src/run-web.html b/src/run-web.html index 9f127c7..8d674ce 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/tests/plot_ges.cwa b/tests/plot_ges.cwa new file mode 100644 index 0000000..333af9a --- /dev/null +++ b/tests/plot_ges.cwa @@ -0,0 +1,59 @@ +include "../examples/include/microw8-api.cwa" + +export fn upd() { + 80?0 = (32!32 >> 11 << 6) | 5; + 80?1 = (sin(time() * 6 as f32) * 95 as f32) as i32 + 128; + plotGes(); +} + +data 80 { i8 ( + 1, 128, 0, 69, 0, 15, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0xff, 0xff, + 0xc1, 0, 0, 110, 0, 0 +) } + +//import "env.gesSnd" fn gesSnd(i32) -> f32; + +include "../platform/src/ges.cwa" + +export fn snd(t: i32) -> f32 { + gesSnd(t) +} + +global mut samplePos: i32 = 0; + +const SoundBuffer = 0x30000; + +fn plotGes() { + rectangle(0 as f32, 10 as f32, 320 as f32, 320 as f32, 0); + let count = (time() * 44100 as f32) as i32 * 2 - samplePos; + let i: i32; + loop genLoop { + (i*4)$SoundBuffer = gesSnd(samplePos + i); + branch_if (i := i + 1) < count: genLoop; + } + samplePos = samplePos + count; + + let ch: i32; + loop channelLoop { + let offset = 159; + i = 0; + + loop searchLoop { + offset = offset + 1; + branch_if (offset * 8 + ch - 8)$SoundBuffer < 0 as f32 | (offset * 8 + ch)$SoundBuffer >= 0 as f32 & offset + 160 < count: searchLoop; + } + + offset = ch + (offset - 160) * 8; + i = 0; + loop plotLoop { + setPixel(i, floor((i * 8 + offset)$SoundBuffer * 127 as f32) as i32 + 60 + ch * (120/8), 15); + branch_if (i := i + 1) < 320: plotLoop; + } + + branch_if (ch := ch + 8) < 16: channelLoop; + } +} \ No newline at end of file