nx_audio_synth_test.nx source
↩ module page · 54 lines · 2324 B
1// nx_audio_synth_test.nx -- KAT gate for sine + ADSR (audio R3b).
2// sine hits 0/peak/0/trough exactly; ADSR ramps attack->decay->sustain->release.
3// expect_exit: 0.
4
5import "nx_syscalls.nx"
6import "nx_audio_mix.nx"
7import "nx_audio_synth.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_synth KAT (sine + ADSR, R3b) ===\n" as *u8)
31 let o: *i64 = (sys_mmap(128)) as *i64
32
33 // sine: freq 1, rate 4, amp 100 -> [0, +100(peak), 0, -100(trough)]
34 osc_sine(o, 4, 1, 4, 100)
35 chk(o[0] == 0, pass, fail, "sine[0]=0" as *u8)
36 chk(o[1] == 100, pass, fail, "sine[1]=+100 (peak @ pi/2)" as *u8)
37 chk(o[2] == 0, pass, fail, "sine[2]=0 (@ pi)" as *u8)
38 chk(o[3] == (0 - 100), pass, fail, "sine[3]=-100 (trough @ 3pi/2)" as *u8)
39
40 // ADSR on a flat 1000 buffer: a=4,d=4,sustain=128,slen=4,r=4 (16 samples)
41 let buf: *i64 = (sys_mmap(256)) as *i64
42 var j: i64 = 0
43 while j < 16 { buf[j] = 1000; j = j + 1 }
44 adsr_apply(buf, 16, 4, 4, 128, 4, 4)
45 chk(buf[0] == 0, pass, fail, "adsr[0]=0 (attack start)" as *u8)
46 chk(buf[2] == 500, pass, fail, "adsr[2]=500 (mid-attack)" as *u8)
47 chk(buf[4] == 1000, pass, fail, "adsr[4]=1000 (peak)" as *u8)
48 chk(buf[8] == 500, pass, fail, "adsr[8]=500 (sustain 0.5)" as *u8)
49 chk(buf[14] == 250, pass, fail, "adsr[14]=250 (release)" as *u8)
50
51 w("=== VERDICT pass=" as *u8); wn(pass[0]); w(" fail=" as *u8); wn(fail[0]); w(" ===\n" as *u8)
52 if fail[0] == 0 { return 0 }
53 return 1
54}