はじめに
TensorFlow製の音楽生成プロジェクト「Magenta」をいじっています。
参考:[サカナクションさんをTensorFlow製アート・音楽生成プロジェクト「Magenta」に学習させてみる。]
(http://qiita.com/tackey/items/1295a0347a8b4cc30d46)
その前処理として、MIDIファイルを楽器ごとのファイルに変換したいなと思い、pretty_midiを用いて分割してみます。
参考:pretty_midi 0.2.6 documentation
参考:pretty_midiを使って、PythonでMIDIファイルを作成する
なお、環境はPython2.7、MIDIファイルはlogic Xでみたりしています。
サンプルコード1(1つの楽器を取り出し、ファイルにする)
sample.py
import pretty_midi
# MIDIファイルを読み込む
midi_data = pretty_midi.PrettyMIDI('hogehoge.MID')
# 楽器の一覧
midi_data.instruments
'''
[Instrument(program=80, is_drum=False, name="hoge"),
Instrument(program=4, is_drum=False, name="hoge"),
Instrument(program=0, is_drum=True, name="hoge"),
Instrument(program=16, is_drum=False, name="hoge"),
Instrument(program=52, is_drum=False, name="hoge"),
Instrument(program=71, is_drum=False, name="hoge"),
Instrument(program=4, is_drum=False, name="hoge"),
Instrument(program=29, is_drum=False, name="hoge"),
Instrument(program=30, is_drum=False, name="hoge"),
Instrument(program=51, is_drum=False, name="hoge"),
Instrument(program=33, is_drum=False, name="hoge"),
Instrument(program=27, is_drum=False, name="hoge"),
Instrument(program=81, is_drum=False, name="hoge")]
'''
# 80番の楽器(ReverseEngineering)を取り出し、インスタンスにする
for instrument in midi_data.instruments:
if instrument.program == 80:
ins_80 = instrument
# 新規作成用のPrettyMIDIオブジェクトを作る
rev_en_chord = pretty_midi.PrettyMIDI()
# 80番をPrettyMIDIオブジェクトに追加
rev_en_chord.instruments.append(ins_80)
# 保存する
rev_en_chord.write('ins_80.mid')
同フォルダ内に、ins_80.midというファイルが作成されます。
サンプルコード2(すべての楽器を取り出し、各々ファイルにする)
sample2.py
import pretty_midi
import os
title = "aoi"
midi_data = pretty_midi.PrettyMIDI('sakanaction_'+ title +'.MID')
# outputディレクトリがなければ作成
if not os.path.isdir('output'):
os.mkdir(output)
# 該当曲のディレクトリを作成
if not os.path.isdir('output/' + str(title)):
os.mkdir('output/' + str(title))
# 楽器を1つ1つ取り出し、インスタンスにする
for i in range(0,len(midi_data.instruments)):
instrument = midi_data.instruments[i]
program_num = midi_data.instruments[i].program
# 新規作成用のPrettyMIDIオブジェクトを作る
rev_en_chord = pretty_midi.PrettyMIDI()
# instrumentをPrettyMIDIオブジェクトに追加
rev_en_chord.instruments.append(instrument)
# 保存する
rev_en_chord.write('output/'+str(title) + '/' + str(title) +'_ins_' + str(program_num) + '.mid')
終わりに
もっと綺麗にコードを書ける気がします。
分割したファイルを元に、楽器ごとに音楽を個別に学習させてみたいと思います。
ありがとうございました。