MMLでピコピコ

なんとなく音が鳴りはじめた。
かなり変だが、一応、音階とテンポ、ボリューム、オクターブなどの指定は通る。
長さが微妙なところで、MMLの&を使うところが難しい。
テンポ絡みで、ブレゼンハムっぽい方式を採用してみたところ、これがなかなかうまくいかないのだ。


わかりやすくいうと、まず全音符のカウントを計算する。
T150として、4分音符が400だから、1600になる。
音符の数字をそのまま、カウントする数字とする。
4分音符なら4、全音符なら1を足すわけだ。
3連符も、もとの数字を3倍すればいい。
んで、それをカウンタに足していって、1600を超えたら次の音符、となる。
これなら誤差は吸収できるし、計算も簡単なわけだが。
たとえば、MMLで「A4.(ピリオド)」とか指定されたら、これを表現する数字は4の2/3となって、割り切れなくなってしまう。
付点を表現しようと思ったら、全体の数字を3倍してやれば割り切れるようにはなるが、ことはそんなに単純ではない。
それが、初めに書いた「&」指定なのだ。
「A1&A8」って書かれたら、いったいどうすればいいのか。
それぐらいならもうちょっと倍率を上げれば実現できそうだが、「A1&A96」とかになってくると、いったいどうすれば実現できるのか、よくわからなくなってくる。
でもMAXとMINの長さを決めれば必要な倍率は計算できそうだ。
どこまで可能にすればいいのか、っていう話になるが、どっちかというと、なんでそんな制限をつけないといけないのか、って思うのだ。
アセンブラでドライバ書いてるわけでもなし、高級言語Rubyを使ってるのだから、そのあたり、柔軟に気持ちよく作る方法はないものか。
力技で倍率を徹底的に高めてしまうか。
768部音符とかできるレベルにしてしまえば誰も文句は言うまい。
んで、全音符が32個ぐらい続いても大丈夫にしてやれば、そんな音楽は現実的にないから、これで理論上はさておき、現実的には解決できるはずだ。
・・・スマートじゃないなあw
なんしか、ブレゼンハムぽいやりかたですべての音の長さを表現しようと思ったら、すべての音の長さが割り切れるような倍率にする必要があるから、なんだかかなり無茶な気がする。
ふーむ。


待てよ、動的にカウントを変更するってのはどーだろう。
例えば付点がきたらそのときだけ上の例で言うところの1600を3倍してやって、音符の数字も3倍してから2/3してやって、誤差なく計算できるようにする。
例えばA1&A8がきたら、A8は8なわけで、1600を8倍して、A1&A8は9と表現できるようにする。
A1&A96なら、96倍か?
一番細かい音符にあわせて、そのときだけ倍率を必要なだけ上げてやれば、全ての長さに対応するような倍率にする必要なく誤差をなくすことが・・・できるんだろか。
倍率を戻すときに誤差が出そうだな。
ブレゼンハムアルゴリズムは余りを次に持ち越すことで誤差を吸収するのだからな。
倍率を戻して切り捨てたらなんのためにやってるのかわからなくなる。
上げ続けるわけにもいかんし。
ふーむ。

っていうか、再生してると途中でライブラリ側からの呼び出しがこなくなってしまうんだが。
バグかな・・・(゜▽゜;)