Pythonでwavを作成する

適当なC5のようなコードからwaveを作る。 環境は Ubuntu18.04 Python3.6.5

インストール

pretty_midi

文字列のコードからmidiの作成、fluidsynthの呼び出しまでやってくれるライブラリ。

pip install pretty_midi

pyFluidSynth

pretty_midiからfluidsynthを呼び出すときに使用している。
pritty_midiを入れたただけでは入らないので個別に入れる必要がある。
PyPIに上がっている奴はかなり古く、Python3では動かないため、githubから入れること。

pip install git+https://github.com/nwhitehead/pyfluidsynth

fluidsynth

これで楽器の音をつける。
なくても音を着けることは可能だがピョーっという感じの音になる。

sudo apt install fluidsynth

scipy

fluidsynthでできたwaveを書き出すために使う。
別に書き出さないなら不要だが確認するのに便利。

pip install scipy

コード

import pretty_midi
from scipy.io import wavfile

pm = pretty_midi.PrettyMIDI() 
violin_program = pretty_midi.instrument_name_to_program("Violin")
violin = pretty_midi.Instrument(program=violin_program)

note_number = pretty_midi.note_name_to_number("C5")
note = pretty_midi.Note(velocity=100, pitch=note_number, start=0, end=.5)
violin.notes.append(note)

pm.instruments.append(violin)

# fluidsynthでwavに変換
audio_data = pm.fluidsynth()

# wavファイル書き出し
# fluidsynthのfsが44100なので合わせる
wavfile.write("hoge.wav",44100, audio_data)

音の変更

FluidSynthはSoundFontを使用して音をつけている。
つまり、これを変更することで音の質(?)を変えられる。(なんていうんですかね…。同種の楽器でも音が違うことに対する単語を知らない。)
変更するには上記コード中のfluidsynthにsfファイルのパスを指定してあげれば良い。
上記コードのように何も指定しない場合pretty_midiが入れてきたTimGM6mb.sf2を使うらしい。

変更する場合はTimGM6mbのようなGeneral MIDIという規格にそった、GMサウンドフォントと呼ばれるものを使うのが良さそう。 サウンドフォントのリストは以下のリンクが詳しい。

サウンドフォントと SFZ ファイル | MuseScore

ちなみにFluidSynthインストール時にもサウンドフォントはインストールされている。

/usr/share/sounds/sf2/FluidR3_GM.sf2

FluidR3_GM.sf2で音を作るには以下のコードに差し替える。

audio_data = pm.fluidsynth(sf2_path='/usr/share/sounds/sf2/FluidR3_GM.sf2')

聴き比べたら普通にわかるぐらいFluidR3_GM.sf2のほうがそれっぽい音だった。