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}