【 Making「鼻歌」その2 】 |
---|
Home | PC-6001mkII | Program | etc |
このページでは、計画から音声出力の部分的成功までの過程を書いています。 |
2016/02/25〜26:HML その1 (基本処理) | ||||||||||||||||||||||||||||||||||||
ネタの実現のためには、今後必要となるだろう。MMLもどきが。 MMLがMusic Macro Languageか。今回は鼻歌をメインにしたいので、さしずめHanauta Macro Language、HMLといったところか。まあネーミングはどうでも良いけれど。 P6のPLAY文や、WebにあるMMLの情報を元に、欲しいコマンドを挙げていく。
まずはHMLを1文字ずつ解析するための基本処理部分を作成する。大まかにこんな感じかな?
|
2016/02/27:HML その2 (T,Lコマンド) |
まずは、音の長さを実装したい。該当するのはTコマンドとLコマンドだ。 とりあえず、数値の取り出し処理だが、ここは共通処理にした方が良いだろう。 数字が来るたびに、決定値を10倍にし数字を加算する。1バイトの範囲でこの処理を行う。シンプルにこんな感じかな。 はじめは、1バイトの範囲(0〜255)の範囲を超えるとエラーを出そうかと思ったが、エラーの出力が面倒そうなので、桁あふれしようが強引に計算するようにする。当然、256以上の数字を入力すると決定値がおかしくなるが、それは自己責任という事で。 続いてTコマンド。以前に考えた通り、64000からテンポ値を割った96分音符基準フレーム数を求め、ワーク領域に格納する。 続いてLコマンド。はじめは指定した音の長さに対応するフレーム数を先に求めておこうと思ったが、よくよく考えるとTコマンドを再設定するとフレーム数も計算し直しになるので二度手間になる。 という事で、まずは設定値をそのままワーク領域に入れて、実際に音声を鳴らす段階で音の長さに応じたフレーム数を求める事にする。 続いて、音の出力時に実際に鳴らすフレーム数を計算する事にする。とりあえず、音階部分は後回しで「C」の処理を作るか。 音符数字を96分音符を基準とした値への変換テーブルを通して変換後、96分音符基準フレーム数を掛け合わせて、鳴らすフレーム数を決定する。 ここまで終わったところで、HMLのテストを行う。簡単に試したところでは、うまく動いているようだ。 |
2016/02/28〜29:HML その3 (N,V,Rコマンド) | ||||||||
次は、Pitch直指定を作るとする。 まずNコマンドで指定した値をワークに入れる処理を追加する。7バイトデータを作成する段階で、音声データのPitch値にこの値を追加し、追加後のPitch値が範囲内になるよう調整する。 次に、Vコマンドの実装。同様に、Vコマンドの解釈処理と、音声データのAmp部分にVコマンドで指定したAmpの値を加算し、範囲内になるよう調整する処理を追加する。 これに伴い、加工元の音声データの仕様もPitch, Amp部分を0が基準となるように変更する。これで理論上うまくいくはずだ。 次!Rコマンドの実装。Rコマンドの解釈処理をまず加える。合わせて、Rコマンド実行用にフラグを追加し、以下のようにフラグの役割を変更する。
さて、テスト。いくつかバグを修正し、指定通りに発生するようになった、ような気がする。 |
2016/03/01:音階変換 その1 |
Nコマンドを実装した事で最低限の音階出力はできるが、やっぱりドレミ指定できた方が良いよね。という事で、事前調査を行う。 まずは、Pitch値と音階との変換テーブルを作らないといけないのだが、音声合成ROM側のPitch値と周波数に関する情報も手元にないので、作成できない。 いや、作成できないではなくて、ならどうするか…だ。 とりあえず耳で聴き分けてデータを取るとするか…音感には少々自信がないが。 エミュ上でPLAY文の出力とPitch値の音声出力を同時に鳴らして、シンクロしていそうな組み合わせをいくつかピックアップする。これらのデータからなんらかの法則性が見出せたらいいけれど。 調べたデータをExcelに持っていき、法則を調べる。…お、指数近似の近似曲線だと、割といい感じにつながるぞ。 この曲線に沿うようにテーブルを作成すれば、それらしい音階が出力できるようになるんじゃなかろうか。 |
その1 | Making「鼻歌」 | − |