Edited at
JuliaDay 10

FludSynth.jlを使ってJuliaで音を鳴らす

Juliaアドベントカレンダー10日目です。

Juliaを使ってmidiの演奏をしてみたいと思います。

音を鳴らしても良い環境でお楽しみください。


環境

Ubuntu18.04での動作を想定してます。

他の環境だとfluidsynth.jlを直さないと動きません…。


準備

今回はfluidsynthというオープンソースのソフトウェアシンセサイザーをJuliaから操作します。


midiの用意

一定以上の年齢の人はお世話になったはず。

隠し持ったmidiを引っ張り出してくるもよし、MuseScoreなどで探すも良しです。


SoundFontの用意

midiファイルは楽譜のようなもので、どのタイミングで、どの楽器の、どの音階を鳴らすかという情報は持っていますが、楽器の音色の情報は持っていません。

ですので、midiだけでは音が出せません。

音色の情報を持つのがSoundFontというファイルです。

ダウンロード可能なサウンドファイルのリストからダウンロードするか、aptからも以下で入手可能です。

sudo apt install fluid-soundfont-gm

ちなみにFludSynth.jlのtestフォルダにもヴァイオリンの音色のみですが、SoundFontが含まれているので、探すのが面倒な人はそちらを使用しても良いです。


ライブラリのインストール

Pkg REPL-modeでPkg.addしてください。

add https://github.com/yukota/FluidSynth.jl.git

お気づきでしょうか…。私の自作ライブラリです。このあいだ作りました。

依存ライブラリも自動で入るようにしていますが、失敗するようならlibfluidsynth-devをaptで入れてください。


実装

midi(test.mid)、SoundFile(violin_sample.sf2)を読み込んでスピーカーから音を鳴らします。


using FluidSynth

settings = Settings()

# Mac, Windows, LinuxでJackを使用している人は以下をコメントアウトしてください
setstr(settings, "audio.driver", "pulseaudio")

synth = Synth(settings)
sfload(synth, "violin_sample.sf2")

player = Player(synth)
audio_driver = AudioDriver(settings, synth)

add(player, "test.mid")
play(player)

FluidSynth.join(player)


解説


サウンドサーバー

setstr(settings, "audio.driver", "pulseaudio")

この行のpluseaudioってなんだろうと思った人がいるかもしれません。

Linuxで音を出す場合、ALSAという層がオーディオインターフェースなどに対する、デバイスドライバになります。

このALSAの一つ上の層、どのデバイスから音を出すか、音量の調節などを受け持っているのがサウンドサーバーになります。

サウンドサーバーには大きく2つのソフトがあり、今回指定したPluseAudioとJACKがあります。

UbuntuのデフォルトだとPluseAudioが採用されています。

fludsynthのデフォルトはJACKになっているため、今回はこのパラメータを設定しました。

逆にUbuntu StduioだとJACKが採用されているため、デフォルトのままで大丈夫です。


midiの作り方

楽譜作成ソフトなどで作れます。

MuseScoreが無料でおすすめです。

aptでも入ります。


SoundFontの作り方

録音環境については割愛します。

強いて言うなら、新しくオーディオインターフェースを買うぞ!と思っている人は以下のサイトでALSAが対応しているやつを確認してから買いましょう。

https://www.alsa-project.org/main/index.php/Matrix:Main

https://wiki.linuxaudio.org/wiki/hardware_support

ちなみに私のRoladのQUAD CAPTUREはUSBを指した時のボリュームから変更ができないという微妙な動きをしてました…。

面倒だったのでWindowsで録音しました…。

録音したwavを入力に、POLYPHONEでサウンドフォントが作れます。


まとめ

好きな音楽を鳴らすことはできたでしょうか?

それでは良いクリスマスを。