dart_melty_soundfont 1.0.1 dart_melty_soundfont: ^1.0.1 copied to clipboard
A Soundfont synthesizer (i.e. '.sf2' player) written in pure Dart.
DartMeltySoundFont #
DartMeltySoundFont is a SoundFont synthesizer (i.e. '.sf2' player) written in pure Dart.
It is a port of MeltySynth (C#) written by Nobuaki Tanaka, to Dart.
https://github.com/sinshu/meltysynth
Dependencies #
This package has no dependencies.
Maintanence #
Apart from breaking changes to the Dart language (rare), this package has no external dependencies and should work on any Dart SDK >=2.12 indefinitely. This package was written against Dart SDK 2.16.1.
Example #
Ssynthesize a simple chord:
// Necessary Imports
import 'DartMeltySoundFont/synthesizer.dart';
import 'DartMeltySoundFont/synthesizer_settings.dart';
import 'DartMeltySoundFont/audio_renderer_ex.dart';
import 'DartMeltySoundFont/array_int16.dart';
import 'package:flutter/services.dart' show rootBundle;
// Create the synthesizer.
ByteData bytes = await rootBundle.load('assets/akai_steinway.sf2');
Synthesizer synth = Synthesizer.loadByteData(bytes,
SynthesizerSettings(
sampleRate: 44100,
blockSize: 64,
maximumPolyphony: 64,
enableReverbAndChorus: true,
));
// Turn on some notes
synth.noteOn(channel: 0, key: 72, velocity: 120);
synth.noteOn(channel: 0, key: 76, velocity: 120);
synth.noteOn(channel: 0, key: 79, velocity: 120);
synth.noteOn(channel: 0, key: 82, velocity: 127);
// Render the waveform (3 seconds)
ArrayInt16 buf16 = ArrayInt16.zeros(numShorts: 44100 * 3);
synth.renderMonoInt16(buf16);
Features #
-
No memory allocation in the rendering process.
-
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
- ✅ Loop extension support
- ✅ Performace optimization
Todo #
- MIDI file support.
Feel free to port MIDI file support to Dart and make a pull request.
Its usage would look like this when implemented:
// Create the synthesizer.
var sampleRate = 44100;
var synthesizer = new Synthesizer("TimGM6mb.sf2", sampleRate);
// Read the MIDI file.
var midiFile = MidiFile("flourish.mid");
var sequencer = MidiFileSequencer(synthesizer);
sequencer.play(midiFile, false);
// Render the waveform (3 seconds)
ArrayInt16 buf16 = ArrayInt16.zeros(numShorts: 44100 * 3);
sequencer.renderMonoInt16(buf16);
License #
DartMeltySoundFont is available under the MIT license.
References #
-
SoundFont® Technical Specification
http://www.synthfont.com/SFSPEC21.PDF -
Polyphone Soundfont Editor
Some of the test cases were generated with Polyphone.
https://www.polyphone-soundfonts.com/ -
Freeverb by Jezar at Dreampoint
The implementation of the reverb effect is based on Freeverb.
https://music.columbia.edu/pipermail/music-dsp/2001-October/045433.html