Pretty-MIDI
ディープラーニングのAutoEncoderの実験を下記でした際、サウンド関連のライブラリィについてフォローしなかったので、こちらで補足したいと思います。
https://decode.red/blog/202405041767/
ディープラーニングを実験する際、データは欠かせないものですが、そのデータとそれを扱うツールはとても重要です。実験データは書籍にも案内があった下記のものを使用しました。
https://github.com/jamesrobertlloyd/infinite-bach/tree/master/data/chorales/midi
今回はpretty_midiというライブラリでその挙動について調べてみました。
参考)
https://github.com/craffel/pretty-midi
http://craffel.github.io/pretty-midi/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
import pretty_midi from midi2audio import FluidSynth import matplotlib.pyplot as plt import numpy as np tk = 32 ks = pretty_midi.KeySignature(0, 0.0) print(ks) midi = pretty_midi.PrettyMIDI(initial_tempo=120.0,resolution=tk) tm = midi.tick_to_time(tk) piano_part = pretty_midi.Instrument(program=0) t = 0.0 for name in ['C3','D3','E3','F3','G3','A3','B3','C4', 'C4','B3','A3','G3','F3','E3','D3','C3']: no = pretty_midi.note_name_to_number(name) note = pretty_midi.Note( velocity=127, pitch=no, start=t, end=t+tm*0.9) piano_part.notes.append(note) t += tm midi.instruments.append(piano_part) np.set_printoptions(threshold=np.inf) piano_roll = midi.get_piano_roll(fs=4) plt.matshow(piano_roll[40:70, :]) plt.show() print(piano_roll) midi.write('piano_doremi.mid') print(midi.get_tempo_changes()) print(midi.get_end_time()) print(midi.estimate_tempo()) print(midi.get_beats()) print(midi.get_onsets()) print(midi.tick_to_time(1)) print(midi.tick_to_time(tk)) print(midi.time_to_tick(0.5)) fs = FluidSynth(sound_font="/usr/share/sounds/sf2/FluidR3_GM.sf2") fs.midi_to_audio('piano_doremi.mid', "piano_doremi.wav") |
実行結果
実験では、MIDIファイルから、音楽データを取得しましたが、ここではスクラッチから音楽データを作成しています。作成した音楽データをMIDIデータに保存、またFluidSynthをつかってWAVファイルにしました。
数値については、BPM120で、1拍0.5秒32tickを意味しています。piano_rollは高さ128(しかしトリミング)で、時間軸方向0.5秒ごとに16音になります。休符を挟むから16 x 2で、最後はないので-1で、横31です。
以上をおさえた上で、また活用したいと思います。
piano_doremi.wav
Category: AM