FLUTTER ECOSYSTEM

chipweinberger/dart_melty_soundfont

다나카 노부아키(C#)의 멜티 싱스를 다트로 이식

dart_melty_soundfont 프로젝트 이미지
Stars
50
Forks
20
최근 푸시(UTC)
2026. 5. 30.
프로젝트 상태
활성
Chip Weinberger GitHub avatar
GITHUB User

Chip Weinberger ↗

Jamcorder, LLCSan Francisco, CA
언어Dart

기술 주제

이 저장소가 배포한 패키지

원본 README

아래는 영문 원문 스냅샷입니다. 최신 내용은 GitHub에서 확인하세요.

README 펼치기 / 접기

https://github.com/chipweinberger/dart_melty_soundfont/blob/main/logo.png?raw=true

dart_melty_soundfont is a SoundFont synthesizer (i.e. '.sf2' player) written in pure Dart.

It is a port of MeltySynth (C#, MIT License) written by Nobuaki Tanaka, to Dart.

https://github.com/sinshu/meltysynth

Dependencies

This package has no dependencies.

Maintanence

This project was specifically designed to not require maintanence, in large part by not having any dependencies. Apart from breaking changes to the Dart language (rare), it should be solid code that works for decades. It will work on any Dart SDK sdk>=2.12 indefinitely.

This package was written against Dart SDK 2.16.1.

Example

Synthesize a simple chord:

// Necessary Imports
import 'package:dart_melty_soundfont/dart_melty_soundfont.dart';
import 'package:flutter/services.dart' show rootBundle;

// load sf2
ByteData bytes = await rootBundle.load('assets/akai_steinway.sf2');

// Create the synthesizer.
Synthesizer synth = Synthesizer.loadByteData(bytes, 
    SynthesizerSettings(
        sampleRate: 44100, 
        blockSize: 64, 
        maximumPolyphony: 64, 
        enableReverbAndChorus: true,
    ));

// optional: print available instruments (aka presets)
List<Preset> p = synth.soundFont.presets;
for (int i = 0; i < p.length; i++) {
  String instrumentName = p[i].regions.isNotEmpty ? p[i].regions[0].instrument.name : "N/A";
  print('[preset $i] name: ${p[i].name} instrument: $instrumentName');
}

//  optional: select first instrument (aka preset)
synth.selectPreset(channel: 0, preset: 0);

// 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: 120);

// create a pcm buffer
ArrayInt16 buf16 = ArrayInt16.zeros(numShorts: 44100 * 3);

// render the waveform (1 second)
synth.renderMonoInt16(buf16);

// turn off a note
synth.noteOff(channel: 0, key: 72, velocity: 120);

// render another second
synth.renderMonoInt16(buf16);

Synthesize notes from a MIDI file playback:

// Necessary imports
import 'package:dart_melty_soundfont/dart_melty_soundfont.dart';
import 'package:flutter/services.dart' show rootBundle;

// Load the soundfont file
ByteData bytes = await rootBundle.load('assets/akai_steinway.sf2');

// Create the synthesizer
Synthesizer synth = Synthesizer.loadByteData(bytes);

// Load MIDI file from asset
ByteData midiBytes = await rootBundle.load('assets/arabesque.mid');
MidiFile midiFile = MidiFile.fromByteData(midiBytes);

// Start MIDI playback
MidiFileSequencer sequencer = MidiFileSequencer(synth);
sequencer.play(midiFile, loop: false);

// Change the playback speed.
sequencer.speed = 1.5;

// Render 10 seconds of playback into PCM buffer
ArrayInt16 buf16 = ArrayInt16.zeros(numShorts: 44100 * 10);
sequencer.renderMonoInt16(buf16);

Playing Sound

This library does not audibly make sound, it only generates the PCM waveform.

To actually hear something, you need to pass the generated PCM waveform to your device's speakers using PCM.

See the Example App for a flutter_pcm_sound + dart_melty_soundfont example.

Isolates

It is recommended to do your audio rendering in isolates or using compute. This will keep your UI fast & prevent audio stuttering.

Features

  • No memory allocation in the rendering process.

  • Wave synthesis

    • [x] SoundFont reader
    • [x] Waveform generator
    • [x] Envelope generator
    • [x] Low-pass filter
    • [x] Vibrato LFO
    • [x] Modulation LFO
  • MIDI message processing

    • [x] Note on/off
    • [x] Bank selection
    • [x] Modulation
    • [x] Volume control
    • [x] Pan
    • [x] Expression
    • [x] Hold pedal
    • [x] Program change
    • [x] Pitch bend
    • [x] Tuning
  • Effects

    • [x] Reverb
    • [x] Chorus
  • Other things

    • [x] Standard MIDI file support
    • [x] Loop extension support
    • [x] Performance optimization

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