#midi #synthesizer #music #sound-font

rustysynth

A SoundFont MIDI synthesizer written in pure Rust

15 releases (stable)

new 1.3.4 Jan 5, 2025
1.3.3 Dec 24, 2024
1.3.2 Sep 30, 2024
1.3.1 Sep 8, 2023
0.9.2 Mar 31, 2023

#18 in Audio

Download history 460/week @ 2024-09-21 439/week @ 2024-09-28 154/week @ 2024-10-05 429/week @ 2024-10-12 464/week @ 2024-10-19 186/week @ 2024-10-26 188/week @ 2024-11-02 82/week @ 2024-11-09 98/week @ 2024-11-16 185/week @ 2024-11-23 174/week @ 2024-11-30 404/week @ 2024-12-07 307/week @ 2024-12-14 749/week @ 2024-12-21 197/week @ 2024-12-28 287/week @ 2025-01-04

1,570 downloads per month
Used in 14 crates (8 directly)

MIT license

195KB
4.5K SLoC

RustySynth

RustySynth is a SoundFont MIDI synthesizer written in pure Rust, ported from MeltySynth.

Features

  • 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.

Examples

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[..]);

Todo

  • Wave synthesis
    • SoundFont reader
    • Waveform generator
    • Envelope generator
    • Low-pass filter
    • Vibrato LFO
    • Modulation LFO
  • MIDI message processing
    • Note on/off
    • Bank selection
    • Modulation
    • Volume control
    • Pan
    • Expression
    • Hold pedal
    • Program change
    • Pitch bend
    • Tuning
  • Effects
    • Reverb
    • Chorus
  • Other things
    • Standard MIDI file support
    • MIDI file loop extension support
    • Performace optimization

License

RustySynth is available under the MIT license.

No runtime deps