2012年3月3日土曜日

音程周波数のアルゴリズム化

音声プログラミング一般の理論は、前記事の書籍で大丈夫。
ただ、音程周波数のアルゴリズム化はその本では話題にしていないから自分で作る必要がありそう。

まず、音程というのは、波の周期(0→正方向の波→負方向の波→0)を単位時間(1秒)内に何回繰り返すかで決まります。そして、その単位のことを周波数(波の周期の回数)といい、ヘルツ(Hz)という単位で表記します。(音量は波の大きさで決まる)

で、ラ(A)の周波数は、

  • オクターブ5=880Hz
  • オクターブ4=440Hz
  • オクターブ3=220Hz
という具合に決まっています。

オクターブnのAの周波数がmHzであれば、オクターブn+1のAの周波数は2mHz

Aの音は全ての楽器の基準周波数になっているので、人間が一番聞き分け易い音です。
絶対音感が無い人でも、「Aの音だけは分かる」という人は結構居るものです。
ベースなど弦楽器のチューニングはAでやるし、オーケストラや室内楽なんかでも、演奏する前にA音の調整(チューニング)をしてます。ついでに、音楽大学の音の聞き分けテスト(そんなんあるんかい?)なんかでも、聞き分ける音の間にA音を鳴らしているようなことが漫画(のだめ)に描いてあったような気がします。

他の11個の音程(A#, B, C, C#, D, D#, E, F, F#, G, G#)の求め方は諸説色々あります。
一番シンプルなのは平均律。
半音=(55×オクターブ)÷12Hzの増加
という単純計算。
※55は12で割り切れない(4.583333333...になる)から、諸説乱立する訳です

で、コンピュータでアルゴリズム化する場合、55も1秒(1000ミリ秒)で割り切れないから更に厄介。
18.181818....回、波形の周期を繰り返せば、オクターブ1のラになる訳です・・・
18×55=990msなので、ラ音では1%の誤差が生じます。
平均律だと、ラ音以外にも強かに誤差が生じる筈。
この辺りの誤差は、実際に鳴らしてみて微調整するしか無いですねぇ....
まさか、ディジタル楽器を作るのに調律が必要になるとは。

とりあえず、
  • オクターブ1のA~G#の波形パターンをオンメモリでプリセットする
  • 配列サイズ(周期)は小数点以下は切り捨てて考える
という感じで、作ってみます。
性能優先なので、違和感があった場合、DDT又は配列サイズの調整で調律する感じ。
(浮動小数点数は重いので使わない)

とりあえず、三角波の波形パターンを作ってみてテストしてみようと思います。
あ・・・あと、サイン波は音が気に入らなかった(使いどころが少なそうだった)し、面倒くさいので、落とす方向で。(三角波、ノコギリ波、短形波+ノイズで実装する方向)

良書(音関連)

VG-Engineの独自PSG音源を実装するにあたり、先ずは、波形と周波数の関係が分かり易く解説されている理論書を探しに本屋に行ったところ、良書過ぎる良書を発見。


C言語ではじめる音のプログラミング
サウンドエフェクトの信号処理
青木直史・著(オーム社/出版局)
http://www.amazon.co.jp/C%E8%A8%80%E8%AA%9E%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E9%9F%B3%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E2%80%95%E3%82%B5%E3%82%A6%E3%83%B3%E3%83%89%E3%82%A8%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E4%BF%A1%E5%8F%B7%E5%87%A6%E7%90%86-%E9%9D%92%E6%9C%A8-%E7%9B%B4%E5%8F%B2/dp/4274206505


ウチの近所の本屋では、プログラミング関連の本の所ではなく、ディジタル信号処理関連の本の所に有りました(理論ベースで調べようとして正解)。まだ、全体をパッと斜め読み(速読)しただけですが、独自PSG音源を実装する上で必要な理論は一通り揃っていて、尚且つ、C言語で解説つき。

一般的な理論書から音(波形や周波数)の理論をC言語に落とし込む手間が省けます。
ついでに、(入門書的な位置づけのようなので)書いてある内容も簡素。

独自音源(ソフトシンセ)を実装したい人に、オススメの一冊です。
まあ、普通の人はwav、ogg、mp3でお手軽に鳴らせれば良いんでしょうけど。
普通じゃない人は、理論書ベースで何ら苦労しない簡単な内容だから、そもそも、こういう本が存在することを期待していなかったので、ラッキーでした。

VG-Engine 2.00の強化

とりあえず、INVADER BLOCK2に開発については、一通りの作業が完了したっぽいです。
AndroidMarketの場合、かなり本腰を入れて販促活動(プロモーション)をしないと全然売れないと思うので、公開開始してからがスタートラインの気がしないでもないですが。
ただ、Android/Windowsの独自ソース共通化エンジン(VG-Engine)を強化する作業を優先。

■VG-Engine version 2.00に向けた強化点

  • 効果音の合成:INVADER BLOCK2では不要だったけど、他ゲームでは必要。
  • 音源搭載:独自PSG音源を搭載する。

音関連だけです。

グラフィック方面も強化の為所は有りますが・・・回転、拡大縮小、半透明など。
ただ、それらは無ければ無くても何とかなる。

「音源搭載」も、BGMを全てPCMで鳴らせば何とかなりますが、それだと容量がデカくなり過ぎる。
如何に、スマホのダウンロード性能が早くて、大容量のストレージを積んでいたとしても、その部分に頼るのは、プログラマの信義に反します。

という訳で、独自PSG音源のスペックとしては、

  1. モノラル
  2. 同時発音数:6チャネル
  3. 波形:サイン波、三角波、ノコギリ波、矩形波の4種類(固定)+ノイズ
  4. エンベロープ:固定アルゴリズムパターンから選択
  5. フィルター、モジュレーション、エフェクト等:なし
各チャネルで、任意の波形・エンベロープ・音量・音程で音を鳴らすことができる・・・という仕様。
まぁ、ほぼPC-Engineの内臓音源と同等スペックだと思います。
不要な奢侈機能は実装しない方向で。
独自シンセにすると、性能が悪くなるので。
「独自シンセなのに高性能」を目指したい。
ローパスフィルタ、ハイパスフィルタぐらいなら有っても良いかもしれませんが。(軽いので)

私は、音関連の知識は素人同然なので、まずは、波形と周波数の関係とかの勉強が必要。
面倒くさそうなもの&有益度が低いものについては随時省いて、完成を早めたいところです。
とりあえず、PCMを鳴らす機能はINVADER BLOCK2に載せているVG-Engine version 1.00で完成しているから、後は音の仕組み(理論)さえ理解すれば良いので、完成は結構早いと思います。(音を聞くことができれば、理論の理解は容易な筈)

2012年3月2日金曜日

INVADER BLOCK 2 Windows版(無償公開) <更新>

Android Marketで販売中の「INVADER BLOCK 2」(99円)のWindows版を無償公開します。
INVADER BLOCK 2は、タッチでバーを操作し、ボールでインヴェーダーを倒すアクションゲームです。
↓Android版の詳細は、コチラ
http://hp.vector.co.jp/authors/VA040196/android/

Windows版(無償)は、現在Vectorにアップロード申請中です。
来週中にはアップロードされると思います。

ただ、このブログを見て下さった方向けに、以下URLで先行公開します。
公開終了しました

上記ZIPを解凍してIBLOCK2.EXEを実行すればゲームが開始します。
なお、このゲームは、DirectX9を使用して作られているので、実行にはDirectX End-User Runtimeが必要です。(DirectX End-User Runtimeについては、同梱しているREADME.TXTに詳しく書いてあります)

追記(2012年3月5日)
Vectorで公開開始されたので、先行配信版(上記の網掛け部分)を消しました。
以下のURLからダウンロードできます。
http://www.vector.co.jp/soft/winnt/game/se496097.html

2012年3月1日木曜日

自己購入はNG

どうも、「自分で作った有料アプリを自分で購入すること」は、NGらしいです。
Google Checkoutのポリシーとかで。
なので、Googleアカウントに紐付けているクレジットカードではエラーになるようです。
(エラーになりました)


確かに、自転車操業的に自分で何本も買うこと(工作)はダメだと思いますが、1本だけならテスト用に許して良いような気もしますが・・・まぁ、ダメなものは仕方が無い。


という訳で、会社に知り合いに頼んで一本買って貰い、検証。
特に問題無いようでした。

なお、公開してから約22時間経過の現時点で、総ダウンロード数はその一本のみ。
やはり、Android Marketの仕組み上、ある程度宣伝活動をしないとダメか。
とりあえず、当初予定通り、先ずはWindows版(フリー)を配布してみようと思います。

ただ、Windows版(フリー)は、Vectorに載せる方向で動いていますが、こういうパターンが規約に抵触しないかはノーチェックだった。→追記:問題なし

2.3.7~

Windows上のAndroidMarketでINVADER BLOCK2を検索したところ、普通に発見。
https://market.android.com/details?id=com.suzukiplan.IBLOCK&feature=search_result#?t=W251bGwsMSwxLDEsImNvbS5zdXp1a2lwbGFuLklCTE9DSyJd

動作要件が「2.3.7~」になっていた。
恐らく、アップロード時点で最新の2.3.xになっているのだろうか?
API的には「2.3.3~」のもの(API Level 10)なんですが・・・

そして、私のデバッグ機は「2.3.4」でした。
これが原因。
端末アップデートしたら、無事検索できました。


しかし、最低バージョンを2.2以降にしなかった(できなかった)弊害がこんなところで出るとは・・・
(OpenSL|ESを使う為には、2.3.3以降にせざるを得なかったのが痛い)

[3/1訂正]
どうも、アップデートは関係無かった模様。
2.3.4の未アップデート端末でも普通に検索できました。

どうやって探すんだ?

公開しました・・・が、検索しても見つからない。
DB反映はバッチ処理かな。
検索以外に検索する手段が無いのが、Androidマーケットの痛いところ。

で、検索していて気付いたのですが、「Invader Block」という別の方が作られたゲームが存在します。
私が登録したソフトは、「INVADER BLOCK 2」。
「Invader Block」と「INVADER BLOCK 2」とは、全くの無関係です。
無料ゲームだったので、DLして内容を確認しましたが、幸いゲーム本質の内容は、全然別でした。
しかし、私の方が「2」がついているので、続編と勘違いされるかも....

一応、説明文に、
「2009年に公開したWindows用ゲーム INVADER BLOCKの続編です」
と、補足を追記。
英語版のInvader Blockが有るのか不明なので、英語の説明は変更せず。

あとは、Invader Blockの作者さんから怒られないことを願うばかり。
しかし、Androidで同名ソフトが無いかチェックするのをウッカリ忘れていた・・・
(勿論、初代のINVADER BLOCKを公開した時はチェックしましたが)



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

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