Kyoto.pm 町家ハッカソンに行ってきた話
人と接するの本当に久しぶりだったと思う。
事前にPerlの予習をして行ったけど、いざ書こうと思ったら書き方が分からなくて1行書く度にググるみたいな感じだった。いきなりPerlで何か作るのは難しそうだったので、Perlじゃなかったら出来そうなことをやろうと思って、事前に標準入力にデータを出すと音が鳴るやつを用意しておいて、当日はとりあえずMMLを鳴らすやつを書いて、その後どうするか考えていなくて全然面白くないやつをいくつか書いて、このままでは駄目だと、叩き出されてしまうと思ったので、なんとなくアイデアはあるけど面倒くさそうなので避けていたことを気合い入れてやったら、思った以上に面倒くさかった。結局、半ばやっつけで短調の曲を沖縄っぽい感じに変更するのができた。
発表のとき説明を端折りすぎたので、書いておくと。
ハッカソン前日に
# use.pl use strict; use warnings; my $phase = 0; while (1) { print sin(6.28 * $phase); $phase += 880 / 44100; }
こんな感じの、例えばサイン波を計算した結果を出力するスクリプトを
% perl use.pl | ./cin2audio
こんな感じで入力すると音が鳴るやつ(C++でCore Audioを呼んでいる)を準備しておいて、当日は先に書いたようにMMLを解釈してついでに調性を変えるPerlのスクリプトを作った。調性を変える手順は以下の感じ。
- MMLを読み込む
- 音に対応する番号に変換(ドは0、ド#は1、レは2といった具合)
- スケールデータに変換(元データの調でいうとn番目の音ですねに変換)
- 別のスケールデータを適用(別の調でn番目の音はこの音ですねに変換)
- 音の周波数を求めて、サイン関数を適用してprint出力
スケールデータというのは、鍵盤で全音全音半音みたいな、何番目にどの音の出現するかみたいな音階のパターンで、それを切り替えると別の音階になる。
決め打ちになっている部分が多いので自動で元データのスケールを判別したり、琉球スケール以外の例えばアラブっぽいのとか試してもいまいちだったので調整する方法を考えて、もっと汎用的にしないといけない。
Kyoto.pmでつくったやつ
https://gist.github.com/2980586
標準出力を鳴らすやつ(Mac)
https://gist.github.com/8144af463e36b5ae8836
scalable mml from mohayonao on Vimeo.