MIDIファイルをはてなのメロディ記法やピコカキコに変換する(mid2flmml)

ニコニコ大百科MMLで音楽を投稿できるサービスを始めたはいいが、
MMLって難しいですよねー。
というわけで、MIDIからMMLへの変換をするソフトを作ってみた。


mid2mmlというソフトウェアがあるが、やはりFlMMLとは文法がちょっと違う。


こういうのを書くときにはPythonで。
各種ライブラリが充実しているし、
あとでWin32用のフロントエンドを付けたくなったときもすぐ出来るし。
PythonInMusic
今回は、midi.pyというパブリックドメインなSMFパーサを使いました。


適当にドラえもんの魔境編中盤のnsfをnsf2midiして、それをmid2flmmlで変換してみた。
Ticks->n分音符の変換がやはり難しい。というか、割り切れてないからズレるのは当然だな。
全体を把握してのテンポ調整なんかをしないとダメだなー。
とはいえ、音階はちゃんと取れていていい感じ。

T30
@V127O4B68R160A68R160<E68R160>B34R80A68R160<E68R160>B68R160B68R160A68R160<E68R160>B34R80A68R160<E68R160>B68R160B68R160A68R160<F+68R160C+34R80>A68R160<F+68R160C+68R160>B68R160A68R160<F+68R160C+34R80>A68R160<F+68R160C+68R160>A68R160G68R160<D68R160>A34R80G68R160<D68R160>A68R160A68R160G68R160<D68R160>A34R80G68R160<D68R160>A68R160A68R160G68R160<E68R160>B34R80G68R160<E68R160>B68R160A68R160G68R160<E68R160>B34R80G68R160<E68R160>B68R160B68R160A68R160<E68R160>B34R80A68R160<E68R160>B68R160B68R160A68R160<E68R160>B34R80A68R160<E68R160>B68R160B68R160A68R160<F+68R160C+34R80>A68R160<F+68R160C+68R160>B68R160A68R160<F+68R160C+34R80>A68R160<F+68R160C+68R160>A68R160G68R160<D68R160>A34R80G68R160<D68R160>A68R160A68R160G68R160<D68R160>A34R80G68R160<D68R160>A68R160A68R160A68R160A68R160<A68R36A68R160E68R160>A68R160A68R160A68R160A68R160<A68R160A68R160E68R160>A68R40O6F+60R240E60R240F+60R240E60R21>B60R240<D60R240F+60R240E60R240F+60R240E60R21>B60R240<D60R240E60R240D60R240E60R240D60R21>A60R240<C60R240E60R240D60R240E60R240A60R240E60R240D60R240>A60R40<F+60R240E60R240F+60R240E60R21>B60R240<D60R240F+60R240E60R240F+60R240E60R21>B60R240<D60R240E60R240D60R240E60R240D60R21>A60R240<C60R240E60R240D60R240E60R240A60R240E60R240D60R240>A60
;

T30
@V127O4B68R160A68R160<E68R160>B34R80A68R160<E68R160>B68R160B68R160A68R160<E68R160>B34R80A68R160<E68R160>B68R160B68R160A68R160<F+68R160C+34R80>A68R160<F+68R160C+68R160>B68R160A68R160<F+68R160C+34R80>A68R160<F+68R160C+68R160>A68R160G68R160<D68R160>A34R80G68R160<D68R160>A68R160A68R160G68R160<D68R160>A34R80G68R160<D68R160>A68R160A68R160G68R160<E68R160>B34R80G68R160<E68R160>B68R160A68R160G68R160<E68R160>B34R80G68R160<E68R160>B160R68B68R160A68R160<E68R160>B34R80A68R160<E68R160>B68R160B68R160A68R160<E68R160>B34R80A68R160<E68R160>B68R160B68R160A68R160<F+68R160C+34R80>A68R160<F+68R160C+68R160>B68R160A68R160<F+68R160C+34R80>A68R160<F+68R160C+68R160>A68R160G68R160<D68R160>A34R80G68R160<D68R160>A68R160A68R160G68R160<D68R160>A34R80G68R160<D68R160>A68R160A68R160A68R160A68R160<A68R36A68R160E68R160>A68R160A68R160A68R160A68R160<A68R160A68R160E68R160>A68R68O6D60R240C60R240D60R240C60R21>G60R240B60R240<D60R240C60R240D60R240C60R21>G60R240B60R240<C60R240>A+60R240<C60R240>A+60R21F60R240A60R240<C60R240>A60R240<C60R240E60R240C60R240>A60R240F60R40<D60R240C60R240D60R240C60R21>G60R240B60R240<D60R240C60R240D60R240C60R21>G60R240B60R240<C60R240>A+60R240<C60R240>A+60R21F60R240A60R240<C60R240>A60R240<C60R240E60R240C60R240>A60R240F60
;

T30
@V90O5E32R96F+32R96G32R96B32R96<E16R48E32R96E32R96D+20R68>B60R240<D+20R68>B60R240<D+60R240E60R240F+60R240E60R240D+32R19>D32R96E32R96F32R96A32R96<D16R48D32R96E32R96C+20R68>A60R240<C+20R68>A60R240<C+32R96>B60R240<C+60R240>A32R19E32R96F+32R96G32R96B32R96<E16R48E32R96E32R96D+20R68>B60R240<D+20R68>B60R240<D+60R240E60R240F+60R240E60R240D+32R19>D32R96E32R96F32R96A32R96<D16R48D32R96E32R96C+60R240D60R240E20R68D60R240C+60R240>A60R240<C+60R240D60R240E60R240F+60R240E60R240D60R240C+60R40O4E60R240D60R240E60R240D60R240D60R240D60R240G60R240G60R240E60R240D60R240E60R240D60R240D60R240D60R240G60R240G60R240<D60R240C60R240D60R240C60R240C60R240C60R240>F60R240F60R240F60R240F60R240F60R240F60R240F60R240F60R240F60R240F60R240E60R240D60R240E60R240D60R240D60R240D60R240G60R240G60R240E60R240D60R240E60R240D60R240D60R240D60R240G60R240G60R240<D60R240C60R240D60R240C60R240C60R240C60R240>F60R240F60R240F60R240F60R240F60R240F60R240F60R240F60R240F60R240F60
;

いつものごとく完成度1割くらいでCodeReposに放りこんでおきました。

フロントエンドとかnsf/spc対応とかに期待したいところ。ぽこぺん。