code wiki / (root) / nx_audio_fx_test.nx

nx_audio_fx_test.nx source

↩ module page · 59 lines · 2496 B

1// nx_audio_fx_test.nx -- KAT gate for sovereign FX (audio R5): low-pass + delay. 2// expect_exit: 0. 3 4import "nx_syscalls.nx" 5import "nx_audio_mix.nx" 6import "nx_audio_fx.nx" 7 8func w(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 9func wn(v: i64) -> i64 { 10 let b: *u8 = sys_mmap(28); var m: i64 = v 11 if m < 0 { m = 0 - m; sys_write(1, "-" as *u8, 1) } 12 let t: *u8 = sys_mmap(28); var k: i64 = 0 13 if m == 0 { t[0] = 48 as u8; k = 1 } 14 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 15 var i: i64 = 0; while i < k { b[i] = t[k - 1 - i]; i = i + 1 } 16 sys_write(1, b, k); return 0 17} 18func chk(cond: i64, pass: *i64, fail: *i64, label: *u8) -> i64 { 19 if cond == 1 { pass[0] = pass[0] + 1; w(" ok " as *u8); w(label); w("\n" as *u8) } 20 else { fail[0] = fail[0] + 1; w(" XX " as *u8); w(label); w("\n" as *u8) } 21 return 0 22} 23 24func main() -> i64 { 25 let pass: *i64 = (sys_mmap(8)) as *i64 26 let fail: *i64 = (sys_mmap(8)) as *i64 27 pass[0] = 0 28 fail[0] = 0 29 w("=== nx_audio_fx KAT (low-pass + delay, R5) ===\n" as *u8) 30 let b: *i64 = (sys_mmap(128)) as *i64 31 32 // low-pass step response, alpha 0.5 -> [500,750,875,937] 33 b[0] = 1000; b[1] = 1000; b[2] = 1000; b[3] = 1000 34 fx_lowpass(b, 4, 128) 35 chk(b[0] == 500, pass, fail, "lpf[0]=500" as *u8) 36 chk(b[1] == 750, pass, fail, "lpf[1]=750" as *u8) 37 chk(b[2] == 875, pass, fail, "lpf[2]=875" as *u8) 38 chk(b[3] == 937, pass, fail, "lpf[3]=937 (rising toward 1000)" as *u8) 39 40 // low-pass passthrough at alpha 256 -> unchanged 41 b[0] = 100; b[1] = 0 - 50; b[2] = 200 42 fx_lowpass(b, 3, 256) 43 chk(b[0] == 100, pass, fail, "lpf passthrough [0]=100" as *u8) 44 chk(b[1] == (0 - 50), pass, fail, "lpf passthrough [1]=-50" as *u8) 45 chk(b[2] == 200, pass, fail, "lpf passthrough [2]=200" as *u8) 46 47 // delay echo: impulse 1000, delay 2, fb 0.5 -> [1000,0,500,0,250] 48 b[0] = 1000; b[1] = 0; b[2] = 0; b[3] = 0; b[4] = 0 49 fx_delay(b, 5, 2, 128) 50 chk(b[0] == 1000, pass, fail, "delay[0]=1000 (dry)" as *u8) 51 chk(b[1] == 0, pass, fail, "delay[1]=0" as *u8) 52 chk(b[2] == 500, pass, fail, "delay[2]=500 (1st echo)" as *u8) 53 chk(b[3] == 0, pass, fail, "delay[3]=0" as *u8) 54 chk(b[4] == 250, pass, fail, "delay[4]=250 (2nd echo, decaying)" as *u8) 55 56 w("=== VERDICT pass=" as *u8); wn(pass[0]); w(" fail=" as *u8); wn(fail[0]); w(" ===\n" as *u8) 57 if fail[0] == 0 { return 0 } 58 return 1 59}