2012年3月13日火曜日

いっぺんにやろうとするから難しい

独自PSG音源専用のMMLコンパイラで、とりあえず、1チャネルで音楽を鳴らすことに成功。
毎日だいたい夜11:00頃帰宅(これでも早いほう)なので、ウィークデーの進捗はこの程度。
次の課題は「複数チャネルの音をどうやって同時に鳴らすか」。

まぁ、その辺は簡単に計算できます。
今のところ、PSG音源に対する指示情報としては、以下の7種類。

  1. エンベロープ1を設定(キーオンしてから100%になるまでの周波数)
  2. エンベロープ2を設定(オーオフしてから消音になるまでの周波数)
  3. チャネル別のボリュームを設定
  4. マスターボリュームを設定
  5. キーオン(音を鳴らす指示)※音色や音程も一緒に指定する仕様
  6. キーオフ(音を止める指示)
  7. 待機

網掛けしている待機という指示情報だけに着眼すれば良いだけです。

仮に、
  • Ch.1: event1 → wait(100Hz) → event2
  • Ch.2: event3 → wait(50Hz) → event4 → wait(75Hz) → event5
という感じで並んでいたら、

event1 → event3 → wait(50Hz) → event4 → wait(50hz) → event2 → wait(25Hz) → event5

という感じにすればOK。

アルゴリズム的に表現すれば、

  1. 待機時間が短い方の待機時間を採用し、
  2. 長い方(非採用)の待機時間は、採用値を減算
  3. 次の待機時間についても同じ処理で求める

で、OKな筈。(未検証)

処理としては単純。
問題は6チャネルの場合、フラグが沢山有り過ぎて、アルゴリズムが無茶苦茶複雑になりそうだ・・・
と、思っていたのですが、ピンポン録音の要領で、

  1. チャネル1+チャネル2=チャネルA
  2. チャネルA+チャネル3=チャネルB
  3. チャネルB+チャネル4=チャネルC
  4. チャネルC+チャネル5=チャネルD
  5. チャネルD+チャネル6=チャネルE

って、やれば良いだけですね。
物凄く簡単だった。

これなら、明日にはチャネル合成ができるかな。(本業の状況次第ですが)

ちなみに、チャネル毎の音の合成(音源レベルの話)をどうやるのか疑問だったのですが、これは単純な足し算でOKでした。音の合成ってこんな簡単だったのか。(てっきり、もっと複雑な「xxxの公式」みたいなヤツでも要るのかと)

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。

合理的ではないものを作りたい

ここ最近、実機版の東方VGSの開発が忙しくて、東方VGSの曲追加が滞っています。 東方VGS(実機版)のデザインを作りながら検討中。基本レトロUIベースですがシークバーはモダンに倣おうかな…とか pic.twitter.com/YOYprlDsYD — SUZUKI PLAN (...