implement proper exponential envelope timings

This commit is contained in:
2022-03-09 23:03:15 +01:00
parent 39ead8220f
commit b626d2609a
4 changed files with 15 additions and 21 deletions

View File

@@ -36,17 +36,16 @@ export fn upd() {
data 80 { data 80 {
i8( i8(
0, 64, 0, 128, 0, 0xe, 0, 64, 0, 128, 0, 0x90,
0, 128, 0, 128, 0, 0xc8, 0, 128, 0, 128, 0, 0x4c,
5, 128, 0, 128, 0, 0xc8, 5, 128, 0, 128, 0, 0x4c,
5, 128, 0, 128, 0, 0xc8, 5, 128, 0, 128, 0, 0x4c,
0xf8, 0x85, 0xf8, 0x85,
0xc1, 0xf1, 0, 110, 0, 80 0x81, 0x81, 0, 105, 0, 80
) )
} }
/* /*
include "../../platform/src/ges.cwa" include "../../platform/src/ges.cwa"
import "env.pow" fn pow(f32, f32) -> f32; 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 { export fn snd(t: i32) -> f32 {
gesSnd(t) gesSnd(t)
} }
*/ */

Binary file not shown.

View File

@@ -34,23 +34,19 @@ export fn gesSnd(t: i32) -> f32 {
channelState?GesChannelState.Trigger = ctrl; channelState?GesChannelState.Trigger = ctrl;
if envState { 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 { if envVol >= 65535 {
envVol = 65535; envVol = 65535;
envState = 0; envState = 0;
} }
} else { } else {
if !envState & ctrl { let inline decay = (channelReg - (ctrl & 1))?5 >> 4;
envVol = envVol - (16 - (channelReg?4 & 15)) * 48; let inline dec = 8 * pow(1.5625, (15 - decay) as f32) as i32;
let sustain = (channelReg?5 >> 4) * 4096; envVol = envVol - ((dec * (envVol + 8192)) >> 16);
if envVol < sustain { let inline sustain = (channelReg?5 & 15) << 12;
envVol = sustain; let lazy targetVol = (ctrl & 1) * sustain;
} if envVol < targetVol {
} else { envVol = targetVol;
envVol = envVol - (16 - (channelReg?5 & 15)) * 48;
if envVol < 0 {
envVol = 0;
}
} }
} }
channelState?GesChannelState.EnvState = envState; channelState?GesChannelState.EnvState = envState;
@@ -129,7 +125,7 @@ export fn gesSnd(t: i32) -> f32 {
let note = i32.load16_u(filter * 2, 0x6c); 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 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 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 low_out = ctrl & 1;
let high_out = (ctrl >> 1) & 1; let high_out = (ctrl >> 1) & 1;
let band_out = (ctrl >> 2) & 1; let band_out = (ctrl >> 2) & 1;

File diff suppressed because one or more lines are too long