2012年3月19日月曜日

ptcopを解析中...

ptcopファイルの音符情報等(EventV5レコード)の解析ですが・・・中々厄介だということは、把握。
ピスコラ自体、あまり「誰もが知っている」というレベルで普及しているものではないので、解析データの情報が転がっていない(海外にかなり間違ったデータを載せているものはありましたが...)から、色々と試行錯誤しながら解析しています。

とりあえず、かなり適当に作ったコンバータで、4部休符+4部音符(音程はc)を2小節(音符はオクターブ0と1を交互に)鳴らすptcopを解析したところ、こんな感じになりました。
Number of event: 25
    1: Tr#00/Ev#0C: Inst: 0000(0)
-----: Tr#00: Wait=01f0(496)
    2: Tr#00/Ev#02: Key : 6680(26240)
    3: Tr#00/Ev#01: Len : 01f0(496)
    4: Tr#00/Ev#04: Vel : 0068(104)
-----: Tr#00: Wait=03e0(992)
    5: Tr#00/Ev#02: Key : 7e80(32384)
    6: Tr#00/Ev#01: Len : 01f0(496)
    7: Tr#00/Ev#04: Vel : 0068(104)
-----: Tr#00: Wait=03e0(992)
    8: Tr#00/Ev#02: Key : 6680(26240)
    9: Tr#00/Ev#01: Len : 01f0(496)
   10: Tr#00/Ev#04: Vel : 0068(104)
-----: Tr#00: Wait=03e0(992)
   11: Tr#00/Ev#02: Key : 7e80(32384)
   12: Tr#00/Ev#01: Len : 01f0(496)
   13: Tr#00/Ev#04: Vel : 0068(104)
-----: Tr#00: Wait=03e0(992)
   14: Tr#00/Ev#02: Key : 6680(26240)
   15: Tr#00/Ev#01: Len : 01f0(496)
   16: Tr#00/Ev#04: Vel : 0068(104)
-----: Tr#00: Wait=03e0(992)
   17: Tr#00/Ev#02: Key : 7e80(32384)
   18: Tr#00/Ev#01: Len : 01f0(496)
   19: Tr#00/Ev#04: Vel : 0068(104)
-----: Tr#00: Wait=03e0(992)
   20: Tr#00/Ev#02: Key : 6680(26240)
   21: Tr#00/Ev#01: Len : 01f0(496)
   22: Tr#00/Ev#04: Vel : 0068(104)
-----: Tr#00: Wait=03e0(992)
   23: Tr#00/Ev#02: Key : 7e80(32384)
   24: Tr#00/Ev#01: Len : 01f0(496)
   25: Tr#00/Ev#04: Vel : 0068(104)
-----: Tr#00: Wait=6574(25972)


・・・ここまででもちょっと面倒でした。
しかし、まだ色々と読み違えている箇所があるようです。
なので、上記解析は未だ間違っているのかもしれません。
結構複雑です。

“V5”ということは、色々と仕様面で綺麗にはできていないだろう・・・と、想定済みですが。

2012年3月18日日曜日

色々と移植中

Android用の独自PSG音源は一応完成しましたが、実際に曲を打ち込んでみて、音源(またはMMLコンパイラ)のブラッシュアップを図る作業中。

私は、音楽の作曲にピストンコラージュを用いてますが、ピスコラのデータ形式(ptcop又はpttune)は公開されていないようなので、MMLに打ち込み直す作業に結構時間が掛かりました。
約50小説の曲でだいたい1人日ぐらい。(今日の昼ぐらいから作り始めて今1曲完成)

ノート(音符)データなら、MasterV5レコードEventV5レコード(ptcopの内部データ形式)あたりを解析すれば取り出せそうな感じなので、コンバータを作るのに丸1週間程度掛けても、余裕で元が取れるな・・・と、思い始めてます。

昔作った曲を~10曲程度作ったら、ジュークボックスみたいな形にして、Marketでタダで配る予定。
ちなみに、↓こういう曲ばかり。(ズンダラ節っていうんですかね?)
http://www.k2.dion.ne.jp/~ysuzuki/game06/bgm09.mp3
※上記は、ピスコラで作ったもの

2012年3月17日土曜日

独自PSG音源の実機検証

Android用に作っているPSG音源なのに、Android上で一回も鳴らしたことが無かった(Windowsでのみ確認していた)ので、Android向けにコンパイルして鳴らしてみました。

ちなみに、画面(Windows/Android共通)は下記のような感じです。

結果は良好。
当然ながら、鳴っている音の内容も全くWindows版と同じ。
ただ、ちょっと音が丸くなったかもしれません。
これはスピーカーの個体差かな。


動作はかなり軽快です。

このテスタをバックグラウンドでループ再生し続けた状態で、INVADER BLOCK 2を起動してみましたが、全く処理落ちせずに動作できました。CPU使用率にかなりの余裕があるので、デバッグ機(LenovoのIdea Pad 01)よりも遅い環境でも問題無いと思います。

多少の表現能力を犠牲にしてでも性能を追求した甲斐がありました。

Android用・独自PSG音源(VGS)の仕様

概ね、Android用・独自PSG音源の仕様が固まったので、纏めておきます。
  • 基本情報: 22050Hz + 16bit + モノラル(秒間約43キロバイト程度)
  • 同時発声: 6ch (6声)
  • 分解精度: 1/22050 (1Hz毎にキーオン等のイベント指令が可能)
  • 波形数: 4種類(三角波、ノコギリ波、短形波、 短形ノイズ)のプリセットのみ
  • エンベロープ:  各ch毎(6系統) & キーオン・キーオフ毎(2系統) に設定可能
  • ピッチシフト: 各ch毎に周波数精度の自動ピッチアップ・ピッチダウンに対応
  • ボリューム: マスターボリューム+チャネル別ボリューム
  • 処理性能: 500MHz程度のマシンで、CPUを最大2~3%占有する
  • 発音例:  http://www.k2.dion.ne.jp/~ysuzuki/sample2.mp3 (※ノイズとピッチシフトは未使用)
シンプル過ぎるぐらいシンプルですが、ゲーム音楽用の音源としてはこれぐらいが丁度良いです。

Android搭載用ということで、消費電力を気をつけなければいけないから、性能には拘りました。
普通、波形計算には浮動小数点数が使われるのですが、全て整数で計算したりとか。
なお、AndroidのAPIが全般的に浮動小数点数を多様するものが多いので、Android端末のCPU(ARM)は、FPUが特化しているのかな?・・・と思ったのですが、それ程でもなかったので、計算は全て整数で行うのが正解です。(単にAndroidIを作った人が性能に関して疎かっただけ)


ドラム音源

独自PSG音源のドラムは、完全にプリセットのPCMでいこうとしたのですが、自動的にキーダウン・キーアップする機能がやっぱり欲しかったので、ドラムもPSGで鳴らす方向で。

↓こんな感じになりました。
http://www.k2.dion.ne.jp/~ysuzuki/drum.mp3

まぁ、ショボイですが、この方がPSG音源とも調和が取れるので良いかも。
音源については、あとはループ再生する命令を実装すれば一通り完成。
ようやく、本編(ゲーム)の開発に戻れそうです。

そういえば、前作(INVADER BLOCK 2)ですが、マーケットでは意見を貰えるほどダウンロードされていないので、会社の人や取引先の人から意見を収集したところ、主に以下のような指摘がありました。

①難しすぎる
②残機が欲しい(1機でゲームオーバーという仕様)
③何故、Android 2.2対応にしなかったし

これでもかなり難度を落としたのですが、まだまだのようです。
②は単純に①の影響で1回のプレイ時間が満足のいくものでないことが原因だと思います。
ということで、難易度が一番のネック。

でも、易し過ぎると私が遊べなくなってしまいます。
という訳で、次回作ではEasy/Normal/Hardみたいな感じのランク設定を設ける予定。
たぶん、私が作るゲームでは初めての試みになる筈。
一応、昔作ったSHOT02というゲームにエキスパート・モードみたいなものがありましたが。


あと、取引先の人のAndroidが2.2でした。
やはり、2.2の普及率は侮れない。
でも、2.3.3以降にしないとOpenSLが使えないからどうにもなりません。
OpenSLじゃないと、波形データを直書きできないので。
波形データを直書きできないということは、(音関係では)何もできないも同然。

2012年3月15日木曜日

脳内で鳴っていた筈の音

昨日、独自PSG音源で鳴らしたサンプルをアップしていたのですが、実の所、MMLで書いた内容と微妙に違ってて、違和感みたいなものを感じていました。

「まぁ、こんなもんだろ」程度に思っていたのですが、実は、MMLコンパイラがバグっていて、本来、各チャネルに設定できる筈のエンベロープが、全てチャネル0にしか設定されず、チャネル1~5はデフォルトのエンベロープで鳴っていた・・・という、かなりしょっぱいバグでした。

正しい演奏は、下記。
http://www.k2.dion.ne.jp/~ysuzuki/sample2.mp3

昨日アップロードしたしょっぱいヤツは、下記。
http://www.k2.dion.ne.jp/~ysuzuki/sample1.mp3

何故、昨日の時点で耳で気付けなかったのか・・・。
作曲や音楽は完全に専門外ですが、それにしては酷いイージーミスです。

2012年3月14日水曜日

独自音源の実力(当社比)

とりあえず、独自PSG音源で音楽らしい音楽を鳴らせるようになったのに、「蛙の歌」や「キラキラ星」などの童謡しか鳴らさないのはどうよ?・・・という訳で、自作の曲で現状の独自PSG音源の実力を100%発揮した音楽を作ってみました。

http://www.k2.dion.ne.jp/~ysuzuki/sample1.mp3

現状、ドラム機能がないので、ドラムの無い曲。
新曲ではなく、1年ぐらい前にピスコラで作った曲ですが。
とりあえず、6チャンネル全て使って鳴らしています。

とりあえず、これが現状の音源の表現性能の限界・・・という訳ではないですが。
作曲の腕前がイマイチなので、表現性能としては限界値に達せません。
実装した機能を全て使っているので、機能的な限界なのは確かですが。

次の課題は、ドラム音源の搭載。
とりあえず、申し訳ない程度のノイズ音源を実装してみましたが、やはりキーダウンとか、性能影響がありそうな機能追加が必要になってしまうので、やはり、PCMをそのまま鳴らす方向がベストか。

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

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