From b626d2609aa15fe8cfbe2725eb85c9b1552d4bee Mon Sep 17 00:00:00 2001 From: Dennis Ranke Date: Wed, 9 Mar 2022 23:03:15 +0100 Subject: [PATCH] implement proper exponential envelope timings --- examples/curlywas/tim_ges.cwa | 12 +++++------- platform/bin/platform.uw8 | Bin 3338 -> 3341 bytes platform/src/ges.cwa | 22 +++++++++------------- src/run-web.html | 2 +- 4 files changed, 15 insertions(+), 21 deletions(-) diff --git a/examples/curlywas/tim_ges.cwa b/examples/curlywas/tim_ges.cwa index 4d74c2e..db2d325 100644 --- a/examples/curlywas/tim_ges.cwa +++ b/examples/curlywas/tim_ges.cwa @@ -36,17 +36,16 @@ export fn upd() { data 80 { i8( - 0, 64, 0, 128, 0, 0xe, - 0, 128, 0, 128, 0, 0xc8, - 5, 128, 0, 128, 0, 0xc8, - 5, 128, 0, 128, 0, 0xc8, + 0, 64, 0, 128, 0, 0x90, + 0, 128, 0, 128, 0, 0x4c, + 5, 128, 0, 128, 0, 0x4c, + 5, 128, 0, 128, 0, 0x4c, 0xf8, 0x85, - 0xc1, 0xf1, 0, 110, 0, 80 + 0x81, 0x81, 0, 105, 0, 80 ) } /* - include "../../platform/src/ges.cwa" import "env.pow" fn pow(f32, f32) -> f32; @@ -55,5 +54,4 @@ import "env.sin" fn sin(f32) -> f32; export fn snd(t: i32) -> f32 { gesSnd(t) } - */ \ No newline at end of file diff --git a/platform/bin/platform.uw8 b/platform/bin/platform.uw8 index 9276f19f1bd76f3eae4e0f07571de1db7f2f1714..92c9afd48bc1949346520cdd577850d0bbabb714 100644 GIT binary patch literal 3341 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 Xckhh373}bKx0!$VOxeS|g0UJI)FgpA literal 3338 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 f32 { channelState?GesChannelState.Trigger = ctrl; if envState { - envVol = envVol + (16384 / ((channelReg?4 >> 4) + 1)); + envVol = envVol + 8 * pow(1.5625, (15 - channelReg?4 & 15) as f32) as i32; if envVol >= 65535 { envVol = 65535; envState = 0; } } else { - if !envState & ctrl { - envVol = envVol - (16 - (channelReg?4 & 15)) * 48; - let sustain = (channelReg?5 >> 4) * 4096; - if envVol < sustain { - envVol = sustain; - } - } else { - envVol = envVol - (16 - (channelReg?5 & 15)) * 48; - if envVol < 0 { - envVol = 0; - } + let inline decay = (channelReg - (ctrl & 1))?5 >> 4; + let inline dec = 8 * pow(1.5625, (15 - decay) as f32) as i32; + envVol = envVol - ((dec * (envVol + 8192)) >> 16); + let inline sustain = (channelReg?5 & 15) << 12; + let lazy targetVol = (ctrl & 1) * sustain; + if envVol < targetVol { + envVol = targetVol; } } channelState?GesChannelState.EnvState = envState; @@ -129,7 +125,7 @@ export fn gesSnd(t: i32) -> f32 { 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 = 7000 - ctrl * (6000/255); + let Q = 7350 - ctrl * (6530/255); 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 7631b88..9f127c7 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