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でサウンドフォントが作れます。
まとめ
好きな音楽を鳴らすことはできたでしょうか?
それでは良いクリスマスを。