code wiki / (root) / nx_audio_web.nx

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}