Making「鼻歌」その2

Home PC-6001mkII Program etc

 このページでは、計画から音声出力の部分的成功までの過程を書いています。

Making「鼻歌」 Top


2016/02/25〜26:HML その1 (基本処理)
 ネタの実現のためには、今後必要となるだろう。MMLもどきが。

 MMLがMusic Macro Languageか。今回は鼻歌をメインにしたいので、さしずめHanauta Macro Language、HMLといったところか。まあネーミングはどうでも良いけれど。

 P6のPLAY文や、WebにあるMMLの情報を元に、欲しいコマンドを挙げていく。
コマンド内容xの範囲xの初期値
T[x]テンポ32?〜255120
L[x]音長96の約数4
V[x]ボリューム0〜158
A[x]〜G[x]音階96の約数Lの現在値
N[x]Pitch直指定0〜127?OC4相当のPitch
O[x]オクターブ1?〜8?4
R[x]休符96の約数Lの現在値
&タイ/スラー--

 まずはHMLを1文字ずつ解析するための基本処理部分を作成する。大まかにこんな感じかな?
  1. HMLから1文字分のデータを取り出す
  2. コマンド文字かどうか判定
    コマンド文字でない場合は終了
  3. コマンド文字の直後に数字があるか確認
    → 数字があれば、数値を取り出し、設定値とする
    → 数字以外の場合は初期値を適用
  4. コマンド文字毎の処理を行う
  5. 処理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コマンド実行用にフラグを追加し、以下のようにフラグの役割を変更する。
フラグ内容
出力初回フラグ
(bit0)
初期値はON
ONのときは、E2H, E3Hポートへの出力を行う
E2H, E3Hポートへの出力完了後にOFFに変更
初回追いつきフラグ
(bit1)
初期値はON
1音目のはじめに出すF値とB値に、内部管理の
F値とB値が追いついたらOFFに変更
無音フラグ
(bit2)
初期値はON。Rコマンド解釈時もONに変更
ONの間は、音量0で出力
追いつきまたはRコマンドの終了時にOFFに変更

 さて、テスト。いくつかバグを修正し、指定通りに発生するようになった、ような気がする。

2016/03/01:音階変換 その1
 Nコマンドを実装した事で最低限の音階出力はできるが、やっぱりドレミ指定できた方が良いよね。という事で、事前調査を行う。

 まずは、Pitch値と音階との変換テーブルを作らないといけないのだが、音声合成ROM側のPitch値と周波数に関する情報も手元にないので、作成できない。
いや、作成できないではなくて、ならどうするか…だ。

 とりあえず耳で聴き分けてデータを取るとするか…音感には少々自信がないが。

 エミュ上でPLAY文の出力とPitch値の音声出力を同時に鳴らして、シンクロしていそうな組み合わせをいくつかピックアップする。これらのデータからなんらかの法則性が見出せたらいいけれど。

 調べたデータをExcelに持っていき、法則を調べる。…お、指数近似の近似曲線だと、割といい感じにつながるぞ。

画像

 この曲線に沿うようにテーブルを作成すれば、それらしい音階が出力できるようになるんじゃなかろうか。


その1 Making「鼻歌」