クーの自由研究

マスターのかえるのクーは、弟子達の召喚術により新たな依り代を得てⅡ世として復活しました。

自由研究の準備(その9)PythonでのMIDI操作(SMF編)

おおまかな内容

pythonでSMF(Standard MIDI File)を扱うライブラリを確認します。python-midiとpretty-midiを両方入れるのがトレンドのようです。pretty-midipython-midiに依存していますのでpretty-midiだけ入れて使うことはできません。

Midi系ライブラリの導入

ようやくubuntuの環境ができたので、python-midipretty-midiをいれます。

vishnubobさん怖そうな方です。

git clone git://github.com/vishnubob/python-midi

craffelさんクールな感じのする方です。

git clone git://github.com/craffel/pretty-midi

このあたりについては

様が詳しいです。参照させていただきました。それぞれをセットアップします。

cd python-midi
python setup.py install
cd ..
cd pretty-midi
python setup.py install

(追記)なお、残念ながら、python-midiは現在3系未対応です。2016/09末時点ではvishnubobさんによれば「やるつもりあるけどボランティア活動にも興味があり、オープンソース作業に集中して時間とれるまで本件(Python3対応)は保留だべ」とのことでした。

以下はpython2.7系での確認です。(追記ここまで)


まずはpython-midiのテストプログラムを実行します。

cd python-midi/tests
python tests.py

しばらくすると mary.mid  ができるので、デスクトップからメディアプレーヤで聞いてみます。
グルーブ感に問題はありそうですが、きちんと音がなります。

次はexamplesをやってみましょう。
python-midi/examples/ へcdして

python example_1.py

してみます。examplesはpython2系で実行しないとエラーがでる模様です。

midi.Pattern(format=1, resolution=220, tracks=\
[midi.Track(\
  [midi.NoteOnEvent(tick=0, channel=0, data=[43, 20]),
   midi.NoteOffEvent(tick=100, channel=0, data=[43, 0]),
   midi.EndOfTrackEvent(tick=1, data=[])])])<

と表示されました。example.mid ができているので聞いてみます。
う~んきこえません。
ソースをちょっとさわってみます

velocity=20->velocity=120

on = midi.NoteOnEvent(tick=0, velocity=120, pitch=midi.G_3)

tick=100->tick=960

off = midi.NoteOffEvent(tick=960, pitch=midi.G_3)

にしてみます。音が小さく、短いようなので調整しました。

example.mid ができているので聞いてみます。ピアノみたいな音が聞こえました。

次は

python example_2.py

してみます。

midi.Pattern(format=1, resolution=220, tracks=\
[midi.Track(\
  [midi.NoteOnEvent(tick=0, channel=0, data=[43, 120]),
   midi.NoteOffEvent(tick=960, channel=0, data=[43, 0]),
   midi.EndOfTrackEvent(tick=1, data=[])])])

が表示されるだけでした。midiファイルの中の表示するサンプルのようです。

python-midi/scripts/ にcdして、

python mididumphw.py

してみます。

Traceback (most recent call last):
  File "mididumphw.py", line 5, in <module>
    import midi.sequencer as sequencer
ImportError: No module named sequencer


Linux系でALSAがはいっていればシーケンサ使えるべ」と書いてあったので、期待していましたが何かが整っていないようです。シーケンサがつかえませんでした
ubuntu StudioなのでもちろんALSAははいっています。(そのためにStudioにしたのですから)
やっぱりJackを使っていないので、オーディオ系はpulseAudio->VMWareサウンドエミュレーション->USBAudio(Quad-capture)で、Jack/ALSAが介在していないのかなぁ。
残念ながらシーケンサは今度にして、先へすすみます。

((追記)SMF対応といえば、SMF読み込んで、シーケンサオブジェクトにしていろいろ操作できることだろ!と思われた方ごめんなさい。ボクもそれを期待してましたが、ボクのマシン環境ではできませんでした。「Python2系 + linux + ALSA がちゃんと動作する環境」 であればシーケンスオブジェクトが使えるはずです)

pretty-midi/examples/ へcdして

python chord_catalog.py


all_chords.mid ができたので聞いてみます。
あ、あんなところにUFOが・・・
すみません、取り乱しました。

もの凄いチュートリアルって結局どうよ?

さて、ここからがpretty-midiチュートリアルが凄いのでは?という本題です。
import djitw とimport librosa が必要なのですが、これがwindowsだとどうしてもうまくいきませんでした。以下もubuntsuでやります。

githubからとってきます

git clone https://github.com/craffel/djitw

djitw へ cdして

python setup.py install

します


librosa は

pip install librosa

します。(setup.py install からpip install へ訂正:setup.py install でもできます)

(追記)youtubeにScipy2015での開発者本人による紹介があったので英語のできる方はどうぞ。

ちなみにボクにはさっぱりわかりませんが、デモとグラフでなんとなくイメージしました。(追記ここまで)


さて、いよいよ動かしてみます。なんと今度は pyfluidsynth がないといわれました。このサンプル只者ではありません。

からとってきました。

またまたpython setup.py installです。

実行しましたが、

(ana27) koowells@ubuntu:~/pysrc/sound01/pretty-midi/examples$ python align_midi.py
Traceback (most recent call last):
  File "align_midi.py", line 12, in <module>
    import pretty_midi
  File "build/bdist.linux-x86_64/egg/pretty_midi/__init__.py", line 138, in <module>
  File "build/bdist.linux-x86_64/egg/pretty_midi/pretty_midi.py", line 13, in <module>
  File "build/bdist.linux-x86_64/egg/pretty_midi/instrument.py", line 6, in <module>
  File "/home/koowells/.pyenv/versions/anaconda3-4.1.1/envs/ana27/lib/python2.7/site-packages/fluidsynth.py", line 40, in <module>
    _fl = CDLL(lib)
  File "/home/koowells/.pyenv/versions/anaconda3-4.1.1/envs/ana27/lib/python2.7/ctypes/__init__.py", line 362, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: /home/koowells/.pyenv/versions/anaconda3-4.1.1/envs/ana27/bin/../lib/libreadline.so.6: undefined
symbol: PC

ライブラリの中身のことをおこられました。anacondaを入れていますが、どうやら地道にmakeしていかないといけない気がしてきました。結局ubuntuでもつまずきました。
この"align_midi.py"を動かすためだけに、この2週間(VMWareなんまいだ事件&ソース整理GitHubへアップ&&ザオラル詠唱をはさんだものの)努力を続けてきましたが、ボクには荷がおもすぎました。(挫折)

そんなボクに慰めの一曲。mamamia let me go!

pretty-midi/example.mid 

align_midi.pyはこれだけのモジュールをimportして凄そうな「何か」をしようとしているのでしょうが、それが単なるミキシングなのか、音の再構築なのか、まったくわかりません。結局気になるところをレポートできませんでした。すみません。

シーケンサの扱いやすさや他の補助モジュールとの補完、機能統合がpretty-midiの真骨頂であると思っていますが、どれもレポートできていません。
もう少しスキルをつけてから挑戦します。未来のボクに期待します。がんばれボク。
でもlibrosaを知ることができただけでも収穫大です。(感覚的には「マグロをつってたらクジラがつれました。」です。)librosaは音楽やサウンドを解析するためのpythonライブラリです。以下のリンクのようなことができます。

Pythonのlibrosaで楽曲中に含まれている12半音の強さを出力する | hacknote


librosaのレポートも未来の課題です。いつの間にか本題の「自由研究」よりも「準備」のほうが多くなってしまいました。
そろそろ本題に復帰します。

蛙類補完計画!かえるに欠けているなにかを自己符号化器で補う壮大なプロジェクト

今回はレポートというにはお粗末な内容でした。どうもすみません。pretty-midiについては今後使っていくと思いますので、いろいろわかったことがあればその時にレポートします。ほんとうはalign_midi.pyが動くまでじっくりやりたいのですが、時には撤退する勇気!も必要です。(「XXする勇気!」はホントに使える言い回しだと思います!)

「蛙類補完計画!」を構想しました。「死の池文書」によれば、蛙類が地球上で唯一の完全な生命体になる試練が、「裏死の池文書」ではさらに蛙類が神に至るための具体的なロードマップが示されています。人類の人工知能を凌駕する蛙類のための自己符号化器の完成が物語のキーとなります。これで蛙類は神へとかえります。

蛇足コーナーの見出しもそろそろネタ切れ気味です。。。