やっぱり奇跡が起きたのかな
http://d.hatena.ne.jp/sayuming/20071213/p2
にわかもいいところなんで、曲のこと以外はあんまり書かないように気をつけているのですが、昨年8月にベスト盤が出たあたりの雰囲気について書かれている方がおられて思わず…
いろんな掲示板を読んだりいろんな動画や音声に触れたりして、bitterの写真集の作りがあまりに卒業アルバム然としていることや、最終ページの機械(3人の名前がついたつまみがついている)の電源ランプがオフになっていることとかに勝手に慄然としてます。
とにかく今年起きたことはものすごい出来事だったんでしょうね。
何年も繰り返し語られるクラスの奇跡。
「痛み」を生成したpythonスクリプトのソース
標準マクロに比べて配列を使えるところがちょっとやりやすいです。
あと、私はひとかたまりずつ打っては再生しつつ作業するので、だんだん長くなってくると途中から再生できた方がいいなと思うことがあります。
pythonを使うことで、要らない行をコメントアウトしたり、別の関数にして外に出したりすることができるようになりました。
#coding:shift_jis import os,string song =[] s_drum=['cccccccccccccccc'] b_drum=['ccccccccccccccr8c8r8c8'] bass =['o3e-e-ddcc>b-b-a-a-a-a-<e-e-e-d', 'o3cccc>gggga-a-a-a-b-b-b-b-', 'o3cccc>gggga-a-a-a-<e-e-e-e-', 'o3ccccccccffffffff', 'o2a-a-a-a-a-a-a-a-<cccc>b-b-b-b-', 'o2a-a-a-a-b-b-b-b-<e-e-e-e-e-e-e-e-'] melody=[ 'o5gfe-f4b-4e-&e-2r2a-e-e-a-4e-e-g&g2r2', '<c>gggg<c4>b-&b-2r4.ga-rgre-rca-&a-a-gge-f4.', 'gfe-e-fb-4e-&e-2r4.e-a-e-e-a-4e-e-g&g2r2', '<c>gggrg<c>b-&b-2r4.ga-rgre-rca-&a-4ge-4f4.', 'o5gfe-e-fb-4e-&e-2r2a-e-e-a-4e-e-g&g2r2', '<c>gggrg<c>b-&b-2r2a-rgre-rca-&a-a-ggre-fe-&', 'e-re-re-e-4f&f>b-b-4r2r<e-e-e-e-e-4g&gfe-4r2', 'rb-b-b-b-b-4b-b-b-b-b-b-b-b-a-&a-2r2r1', 'ra-a-a-a-a-a-a-a-4gf4g4rre-e-e-e-e-e-e-g4fe-4e-4r', 're-4e-4e-re-rgggg>b-4<e-&e-2r2' ] def main(): init() a_mero() b_mero() def a_mero(): play([bass[0],s_drum[0],b_drum[0],melody[0],melody[0]]) play([bass[1],s_drum[0],b_drum[0],melody[1],melody[1]]) play([bass[0],s_drum[0],b_drum[0],melody[2],melody[2]]) play([bass[1],s_drum[0],b_drum[0],melody[3],melody[3]]) play([bass[0],s_drum[0],b_drum[0],melody[4],melody[4]]) play([bass[1],s_drum[0],b_drum[0],melody[5],melody[5]]) def b_mero(): play([bass[2],s_drum[0],b_drum[0],melody[6],melody[6]]) play([bass[3],s_drum[0],b_drum[0],melody[7],melody[7]]) play([bass[4],s_drum[0],b_drum[0],melody[8],melody[8]]) play([bass[5],s_drum[0],b_drum[0],melody[9],melody[9]]) def init(): for x in range(8): song.append('t152') play(['l4v7q6 @w10 @3 o3 @E1,0,40,30,30', 'l4v6q6 @4 @E1,0,60,0,20 @n90', 'l4v5q6 @4 @E1,0,20,5,20 @n110', 'l8v15q7 @1 @D0 @E1,0,60,30,35', 'l8v10q7 @1 @D10 @E1,0,60,30,35']) def play(track): for ch,seq in enumerate(track): song[ch] +=seq + '\n' def cmd_play(): for i in song: if i <> '': print i + ';' if __name__ == '__main__': main() cmd_play()
クレヨン社「痛み」
ちょっと唐突かもしれませんが、python+MML第一号作品です。
激励を頂いたid:wanderingdjさんの日記(http://d.hatena.ne.jp/wanderingdj/20071106/1194314130)を見て、強烈に懐かしくなりました。
誰かのオールナイトニッポンで流れていたのを耳にしたときに凄い衝撃を受けたのを覚えています。大体4年おきくらいに思い出します。この前懐かしくなった時はMP3を今はなきmusic.co.jpで購入しました。
ニコニコ動画でも「クレヨン社」で検索したら聴けますので、ぜひ聴いてみてください。
やっぱり恋しいPLAY文
N66Basicの時代にPLAY文で死ぬほどMMLをやってきたためか、やはり逐行実行のほうが生産性が上がるかもしれないということに思い至りました。そこで助っ人としてpythonを久々に使用して、こんなものを。
#coding:shift_jis import os,string #空の配列を8トラック分作る song =[] for x in range(8): song.append('') def play(track): for ch,seq in enumerate(track): song[ch] +=seq def cmd_play(): for i in song: if i <> '': print i + ';' if __name__ == '__main__': play(['t97','t97','t97']) play(['l8o6rdf+abrrb baf+ef+raf+rf+f+f+eedeeaf+ed1','l2o5reeddeef+f+','l2o4rb<c+>abb<c+>aa']) cmd_play()
play関数で各チャンネルに次々と文字列を連結して行って、最後にcmd_play関数ではてなMML対応の形に整形して標準出力に出します。
Mac OS Xには標準出力をクリップボードに送り込む「pbcopy」というコマンドがあるので、例えばこのスクリプトをcmdplay.pyとしますと、ターミナルで以下のような命令を実行して
% python cmdplay.py | pbcopy
クリップボードにMMLを送ることが出来ます。
あとはid:Untouchableさんが作られたMMLエディタ(http://d.hatena.ne.jp/Untouchable/20071012/1192190220)を開いてペーストして、ためしに鳴らして見る、といった作業を続けて行きます。
ちなみにこのcmdplay.pyで生成されるMMLはこんな感じです。
t97l8o6rdf+abrrb baf+ef+raf+rf+f+f+eedeeaf+ed1; t97l2o5reeddeef+f+; t97l2o4rb<c+>abb<c+>aa;
以上、さっき考えて(この程度でも参考書片手に30分かかりましたが)みたことをメモとして。
将来的にはMMLの標準コマンド(繰り返しとかマクロとか)をはるかに凌ぐことが出来るようになるかもしれません。
Perfume「コンピュータードライビング」(作りかけ)
「SEVENTH HEAVEN」と「ポリリズム」に挑んで挫折中です。
更新が滞っているのでとりあえず…
昔のコナミのゲームっぽいコード進行とFM音源っぽいドラムの音がすきです。
t132l16v10q5 @2 o7 ; t132l16v3q5 @2 o7 ; t158l8v7q6 @w10 @3 o3 @E1,0,40,30,30 /:/:c<c>c<c>c<c>c<c>:/>b-<b->b-<b->b-<b->b-<b->f<f>f<f>g<g>g<g:/ /:3 e<e>e<e>e<e>e<e> f<f>f<f>f<f>f<f>:/ g<g>g<g>g<g>g<c reff+gr>g4 ; t158l8v10q7 @1 @E1,0,60,30,35 o5/:r4g4g4g4g4fe4fge& e4.c&c2 rcccdcd4:/ r4e4eg4a&ac4>b<c2 r4g4garc&c1 r4e4eg4a&ac>b<c2c fedcfedc&c2r2 ; t158l4v5q6 @4 @E1,0,20,5,20 @n110 /:cccc cccc cccc /ccc16c16c16r16r:/ cccc /:cccc cccc cccc /ccc16c16c16r16r:/ ; t158l4v6q6 @4 @E1,0,60,0,20 @n90 /:rcrc rcrc rcrc /rcrc:/ rc c16c16c8c8c16c16 /:rcrc rcrc rcrc /rcrc:/ r1 ; t158l8v3q6 @4 o3 @E1,0,20,10,10 @n10 /:cccccccc cccccccc cccccccc cccccccc:/ /:cccccccc cccccccc cccccccc /ccccc16c16ccc16c16:/ r1 ;