code wiki / (root) / nx_audio_osc_test.nx

nx_audio_osc_test.nx source

↩ module page · 56 lines · 2341 B

1// nx_audio_osc_test.nx -- KAT gate for sovereign oscillators (audio R3). 2// square (1 cycle / 8 samples), saw (1/4), triangle (1/4) -- exact integer values. 3// expect_exit: 0. 4 5import "nx_syscalls.nx" 6import "nx_audio_osc.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_osc KAT (sovereign oscillators, R3) ===\n" as *u8) 30 let o: *i64 = (sys_mmap(128)) as *i64 31 32 // square: freq 1, rate 8, amp 100 -> 4x +100 then 4x -100 33 osc_square(o, 8, 1, 8, 100) 34 chk(o[0] == 100, pass, fail, "square[0]=+100" as *u8) 35 chk(o[3] == 100, pass, fail, "square[3]=+100" as *u8) 36 chk(o[4] == (0 - 100), pass, fail, "square[4]=-100" as *u8) 37 chk(o[7] == (0 - 100), pass, fail, "square[7]=-100" as *u8) 38 39 // saw: freq 1, rate 4, amp 100 -> [-100,-50,0,50] 40 osc_saw(o, 4, 1, 4, 100) 41 chk(o[0] == (0 - 100), pass, fail, "saw[0]=-100" as *u8) 42 chk(o[1] == (0 - 50), pass, fail, "saw[1]=-50" as *u8) 43 chk(o[2] == 0, pass, fail, "saw[2]=0" as *u8) 44 chk(o[3] == 50, pass, fail, "saw[3]=50" as *u8) 45 46 // triangle: freq 1, rate 4, amp 100 -> [-100,0,100,0] 47 osc_triangle(o, 4, 1, 4, 100) 48 chk(o[0] == (0 - 100), pass, fail, "tri[0]=-100" as *u8) 49 chk(o[1] == 0, pass, fail, "tri[1]=0" as *u8) 50 chk(o[2] == 100, pass, fail, "tri[2]=+100 (peak)" as *u8) 51 chk(o[3] == 0, pass, fail, "tri[3]=0" as *u8) 52 53 w("=== VERDICT pass=" as *u8); wn(pass[0]); w(" fail=" as *u8); wn(fail[0]); w(" ===\n" as *u8) 54 if fail[0] == 0 { return 0 } 55 return 1 56}