// wav.mbt
//
// 16-bit PCM WAV 序列化:把解码出的 Float PCM(约 [-1,1])写成标准 WAV 文件字节。
// 纯函数,不涉及文件 I/O,CLI 与 WASM demo 共用。
///|
/// 把多声道 Float PCM 序列化为 16-bit PCM WAV 字节(样本按声道交错)。
/// 样本超出 [-1,1] 时截断,再四舍五入到 16 位有符号整数。
pub fn wav_encode_pcm16(pcm : Array[Array[Float]], sample_rate : Int) -> Bytes {
let channels = pcm.length()
let frames = if channels == 0 { 0 } else { pcm[0].length() }
let data_size = frames * channels * 2
let buf = @buffer.Buffer()
// RIFF 头
buf.write_bytes(b"RIFF")
buf.write_uint_le((36 + data_size).reinterpret_as_uint())
buf.write_bytes(b"WAVE")
// fmt chunk
buf.write_bytes(b"fmt ")
buf.write_uint_le(16U)
buf.write_uint16_le((1).to_uint16()) // PCM
buf.write_uint16_le(channels.to_uint16())
buf.write_uint_le(sample_rate.reinterpret_as_uint())
buf.write_uint_le((sample_rate * channels * 2).reinterpret_as_uint()) // 字节率
buf.write_uint16_le((channels * 2).to_uint16()) // block align
buf.write_uint16_le((16).to_uint16()) // 位深
// data chunk
buf.write_bytes(b"data")
buf.write_uint_le(data_size.reinterpret_as_uint())
for f in 0..