Python
MIDI
music
magenta
pretty_midi

MIDIファイルから特定の楽器の音のみを取り出し別ファイルにする

More than 1 year has passed since last update.


はじめに

TensorFlow製の音楽生成プロジェクト「Magenta」をいじっています。

参考:サカナクションさんをTensorFlow製アート・音楽生成プロジェクト「Magenta」に学習させてみる。

その前処理として、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')



終わりに

もっと綺麗にコードを書ける気がします。

分割したファイルを元に、楽器ごとに音楽を個別に学習させてみたいと思います。

ありがとうございました。