Crates.io | rustysynth |
lib.rs | rustysynth |
version | 1.3.2 |
source | src |
created_at | 2023-01-15 06:56:30.155016 |
updated_at | 2024-09-30 10:46:43.470417 |
description | A SoundFont MIDI synthesizer written in pure Rust |
homepage | |
repository | https://github.com/sinshu/rustysynth |
max_upload_size | |
id | 759275 |
size | 192,234 |
RustySynth is a SoundFont MIDI synthesizer written in pure Rust, ported from MeltySynth.
Suitable for both real-time and offline synthesis.
Supports standard MIDI files with additional features including dynamic tempo changing.
No dependencies other than the standard library.
An example code to synthesize a simple chord:
// Load the SoundFont.
let mut sf2 = File::open("TimGM6mb.sf2").unwrap();
let sound_font = Arc::new(SoundFont::new(&mut sf2).unwrap());
// Create the synthesizer.
let settings = SynthesizerSettings::new(44100);
let mut synthesizer = Synthesizer::new(&sound_font, &settings).unwrap();
// Play some notes (middle C, E, G).
synthesizer.note_on(0, 60, 100);
synthesizer.note_on(0, 64, 100);
synthesizer.note_on(0, 67, 100);
// The output buffer (3 seconds).
let sample_count = (3 * settings.sample_rate) as usize;
let mut left: Vec<f32> = vec![0_f32; sample_count];
let mut right: Vec<f32> = vec![0_f32; sample_count];
// Render the waveform.
synthesizer.render(&mut left[..], &mut right[..]);
Another example code to synthesize a MIDI file:
// Load the SoundFont.
let mut sf2 = File::open("TimGM6mb.sf2").unwrap();
let sound_font = Arc::new(SoundFont::new(&mut sf2).unwrap());
// Load the MIDI file.
let mut mid = File::open("flourish.mid").unwrap();
let midi_file = Arc::new(MidiFile::new(&mut mid).unwrap());
// Create the MIDI file sequencer.
let settings = SynthesizerSettings::new(44100);
let synthesizer = Synthesizer::new(&sound_font, &settings).unwrap();
let mut sequencer = MidiFileSequencer::new(synthesizer);
// Play the MIDI file.
sequencer.play(&midi_file, false);
// The output buffer.
let sample_count = (settings.sample_rate as f64 * midi_file.get_length()) as usize;
let mut left: Vec<f32> = vec![0_f32; sample_count];
let mut right: Vec<f32> = vec![0_f32; sample_count];
// Render the waveform.
sequencer.render(&mut left[..], &mut right[..]);
Standard MIDI file support
MIDI file loop extension support
Performace optimization
RustySynth is available under the MIT license.