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のほうがそれっぽい音だった。