#![forbid(unsafe_code)]
use std::io::Write;
use oplon::Opl2;
fn main() {
let mut args = std::env::args().skip(1);
let out_path = args.next().unwrap_or_else(|| "out.pcm".into());
let seconds: f64 = args.next().and_then(|s| s.parse().ok()).unwrap_or(2.0);
let sample_rate = 44_100u32;
let mut opl = Opl2::new(sample_rate);
for (reg, val) in [
(0x20u8, 0x21u8), (0x23, 0x21), (0x40, 0x10), (0x43, 0x00), (0x60, 0xF2), (0x63, 0xF2), (0x80, 0x05), (0x83, 0x05), (0xC0, 0x06), (0xA0, 0x98), (0xB0, 0x31), ] {
opl.write_reg(reg, val);
}
let frames = (seconds * sample_rate as f64) as u64;
let mut out = Vec::with_capacity(frames as usize * 4);
for i in 0..frames {
if i == frames * 3 / 4 {
opl.write_reg(0xB0, 0x11); }
let (l, r) = opl.render_frame();
out.extend_from_slice(&(l.clamp(-32768, 32767) as i16).to_le_bytes());
out.extend_from_slice(&(r.clamp(-32768, 32767) as i16).to_le_bytes());
}
let mut f = std::fs::File::create(&out_path).expect("create output");
f.write_all(&out).expect("write output");
eprintln!(
"wrote {} ({:.1}s, s16le stereo @ {} Hz)",
out_path, seconds, sample_rate
);
}