LoginSignup
12
8

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-10-08

はじめに

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')

終わりに

もっと綺麗にコードを書ける気がします。
分割したファイルを元に、楽器ごとに音楽を個別に学習させてみたいと思います。

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

12
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
8