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}