nx_audio_web.nx source
↩ module page · 57 lines · 2356 B
1// nx_audio_web.nx -- AUDIO ENGINE -> WEB bridge: emit an HTML page that PLAYS a
2// sovereign-generated tone in a browser via a base64 data: URI. The live-testable
3// loop for audio -- the engine's output becomes a clickable, audible web page.
4// Composes synth(R3b) + wav(R4) + the existing sovereign b64_encode (DRY).
5// license_tier: ORIGINAL.
6
7import "nx_syscalls.nx"
8import "nx_audio_mix.nx"
9import "nx_audio_synth.nx"
10import "nx_audio_wav.nx"
11import "nx_base64.nx"
12const K_MAGIC_8000: i64 = 8000
13const K_MAGIC_2400: i64 = 2400
14const K_MAGIC_9000: i64 = 9000
15const K_MAGIC_1400: i64 = 1400
16const K_MAGIC_65536: i64 = 65536
17
18func aw_app(out: *u8, off: *i64, s: *u8) -> i64 {
19 var i: i64 = 0
20 while s[i] != (0 as u8) { out[off[0]] = s[i]; off[0] = off[0] + 1; i = i + 1 }
21 return 0
22}
23
24// build into out an HTML page playing a 440Hz sine+ADSR tone; returns HTML length
25func nx_audio_web_page(out: *u8, out_cap: i64) -> i64 {
26 let rate: i64 = K_MAGIC_8000
27 let n: i64 = K_MAGIC_2400
28 let tone: *i64 = (sys_mmap(n * 8 + 64)) as *i64
29 osc_sine(tone, n, 440, rate, K_MAGIC_9000)
30 adsr_apply(tone, n, 200, 400, 180, K_MAGIC_1400, 400)
31 let wavbuf: *u8 = sys_mmap(n * 4 + 128)
32 let wb: i64 = wav_render_stereo(tone, tone, n, rate, wavbuf)
33 let b64: *u8 = sys_mmap(wb * 2 + 64)
34 let bn: i64 = b64_encode(wavbuf, wb, b64)
35
36 let off: *i64 = (sys_mmap(8)) as *i64
37 off[0] = 0
38 aw_app(out, off, "<!doctype html><html><head><meta charset=\"utf-8\"><title>Sovereign Audio</title></head><body>" as *u8)
39 aw_app(out, off, "<h1>Sovereign Audio Engine</h1><p>440Hz sine + ADSR, generated entirely in NishiLang. No FMOD, no library.</p>" as *u8)
40 aw_app(out, off, "<audio controls src=\"data:audio/wav;base64," as *u8)
41 var i: i64 = 0
42 while i < bn { if off[0] < out_cap - 64 { out[off[0]] = b64[i]; off[0] = off[0] + 1 } i = i + 1 }
43 aw_app(out, off, "\"></audio></body></html>\n" as *u8)
44 out[off[0]] = 0 as u8
45 return off[0]
46}
47
48func nx_audio_web_save(path: *u8) -> i64 {
49 let out: *u8 = sys_mmap(K_MAGIC_65536)
50 let len: i64 = nx_audio_web_page(out, K_MAGIC_65536)
51 let fd: i64 = sys_openat_wr(path, 420)
52 if fd < 0 { return 0 - 1 }
53 var wr: i64 = 0
54 while wr < len { let c: i64 = sys_write(fd, out + wr, len - wr); if c <= 0 { break } wr = wr + c }
55 sys_close(fd)
56 return wr
57}