Files
microw8/examples/curlywas/tim_ges.cwa

46 lines
1.2 KiB
Plaintext

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
}