code wiki / (root) / nx_audio_spatial_test.nx

nx_audio_spatial_test.nx source

↩ module page · 65 lines · 2683 B

1// nx_audio_spatial_test.nx -- KAT gate for sovereign isqrt + 3D positional audio. 2// expect_exit: 0. 3 4import "nx_syscalls.nx" 5import "nx_audio_mix.nx" 6import "nx_isqrt.nx" 7import "nx_audio_spatial.nx" 8 9func w(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 10func wn(v: i64) -> i64 { 11 let b: *u8 = sys_mmap(28); var m: i64 = v 12 if m < 0 { m = 0 - m; sys_write(1, "-" as *u8, 1) } 13 let t: *u8 = sys_mmap(28); var k: i64 = 0 14 if m == 0 { t[0] = 48 as u8; k = 1 } 15 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 16 var i: i64 = 0; while i < k { b[i] = t[k - 1 - i]; i = i + 1 } 17 sys_write(1, b, k); return 0 18} 19func chk(cond: i64, pass: *i64, fail: *i64, label: *u8) -> i64 { 20 if cond == 1 { pass[0] = pass[0] + 1; w(" ok " as *u8); w(label); w("\n" as *u8) } 21 else { fail[0] = fail[0] + 1; w(" XX " as *u8); w(label); w("\n" as *u8) } 22 return 0 23} 24 25func main() -> i64 { 26 let pass: *i64 = (sys_mmap(8)) as *i64 27 let fail: *i64 = (sys_mmap(8)) as *i64 28 pass[0] = 0 29 fail[0] = 0 30 w("=== nx_audio_spatial KAT (isqrt + 3D positional, R6) ===\n" as *u8) 31 32 // ---- isqrt ---- 33 chk(nx_isqrt(0) == 0, pass, fail, "isqrt(0)=0" as *u8) 34 chk(nx_isqrt(4) == 2, pass, fail, "isqrt(4)=2" as *u8) 35 chk(nx_isqrt(9) == 3, pass, fail, "isqrt(9)=3" as *u8) 36 chk(nx_isqrt(10) == 3, pass, fail, "isqrt(10)=3 (floor)" as *u8) 37 chk(nx_isqrt(10000) == 100, pass, fail, "isqrt(10000)=100" as *u8) 38 39 let mono: *i64 = (sys_mmap(16)) as *i64 40 let oL: *i64 = (sys_mmap(16)) as *i64 41 let oR: *i64 = (sys_mmap(16)) as *i64 42 43 // ---- centered in front (0,10), max 100: equal L/R, attenuated ---- 44 mono[0] = 1000; oL[0] = 0; oR[0] = 0 45 spatial_place(mono, 1, 0, 10, 100, oL, oR) 46 chk(oL[0] == oR[0], pass, fail, "front: L == R (centered)" as *u8) 47 chk(oL[0] > 0, pass, fail, "front: audible" as *u8) 48 chk(oL[0] < 1000, pass, fail, "front: attenuated by distance" as *u8) 49 50 // ---- hard right (100,0), max 200: all energy in R ---- 51 mono[0] = 1000; oL[0] = 0; oR[0] = 0 52 spatial_place(mono, 1, 100, 0, 200, oL, oR) 53 chk(oL[0] == 0, pass, fail, "right: L = 0" as *u8) 54 chk(oR[0] == 500, pass, fail, "right: R = 500 (atten 0.5)" as *u8) 55 56 // ---- out of range (0,200), max 100: silent ---- 57 mono[0] = 1000; oL[0] = 0; oR[0] = 0 58 spatial_place(mono, 1, 0, 200, 100, oL, oR) 59 chk(oL[0] == 0, pass, fail, "far: L silent" as *u8) 60 chk(oR[0] == 0, pass, fail, "far: R silent" as *u8) 61 62 w("=== VERDICT pass=" as *u8); wn(pass[0]); w(" fail=" as *u8); wn(fail[0]); w(" ===\n" as *u8) 63 if fail[0] == 0 { return 0 } 64 return 1 65}