oxisynth 0.0.5

Rust soundfont synthesizer
Documentation
use byte_slice_cast::AsByteSlice;
use std::{fs::File, io::Write};

use oxisynth::{MidiEvent, OxiError, SoundFont, Synth};

fn main() {
    use env_logger::Env;
    env_logger::Builder::from_env(Env::default().default_filter_or("info")).init();
    synth_sf2().unwrap();
}

fn synth_sf2() -> Result<(), OxiError> {
    let mut pcm = File::create("Out.sf2.pcm").unwrap();

    let mut synth = Synth::default();

    let mut file = File::open("./testdata/sin.sf2").unwrap();
    let font = SoundFont::load(&mut file).unwrap();
    synth.add_font(font, true);

    {
        let mut samples = [0f32; 44100 * 2];

        synth.set_polyphony(5).unwrap();

        synth.send_event(MidiEvent::NoteOn {
            channel: 0,
            key: 60,
            vel: 127,
        })?;
        synth.send_event(MidiEvent::NoteOn {
            channel: 0,
            key: 70,
            vel: 127,
        })?;
        synth.send_event(MidiEvent::NoteOn {
            channel: 0,
            key: 80,
            vel: 127,
        })?;
        synth.send_event(MidiEvent::NoteOn {
            channel: 0,
            key: 90,
            vel: 127,
        })?;
        synth.send_event(MidiEvent::NoteOn {
            channel: 0,
            key: 199,
            vel: 127,
        })?;

        {
            synth.write(samples.as_mut());

            pcm.write_all(samples.as_byte_slice()).unwrap();
        }

        for n in 1..5 {
            synth.set_polyphony(5 - n).unwrap();
            {
                synth.write(samples.as_mut());

                pcm.write_all(samples.as_byte_slice()).unwrap();
            }
        }

        Ok(())
    }
}