2015年8月15日土曜日

ソフトシンセの作り方(6) - 音を鳴らす方法

VGSのソフトシンセ(波形メモリ音源)の開発で得られた知見を元に、PCやスマートフォンで動くソフトシンセの作り方を解説していきます。一冊の本が書ける程度の分量なので、幾つかのパートに区切って解説していきます。このシリーズを一通り読めば、サウンドプログラミングについて全くの素人でも、PCやスマホなどのプラットフォームで動くオリジナルのソフトシンセが作れる程度になります(たぶん)

なお、このシリーズで扱うプログラミングの例題のビルドには、パソコンが必要です。OSは私が使っているMac OS X向けに解説を記述しますが、Linux(※ALSAに対応しているもの)やWindowsでも問題ありません。

今回から実践的な内容に入ろうと思っていましたが、その前にコンピュータで音を鳴らす方法について、余談を挟みつつ簡単に解説します。


コンピュータで音を鳴らす方法

音と情報量の関係

コンピュータが音を鳴らす方法は、時代と共に大きく変化(進化)してきました。
そもそも、音というのはデータ量として極めて大きな部類のものです。
昨今のスマートフォンアプリケーションは、市販ゲームなら数百MB以上のものがゴロゴロありますが、そのゲームの構成要素の内、音のデータが占める割合はかなり大きいです。
一般的なCD音質の場合、1秒間のデータ量は 44100(サンプリング周波数)× 216bit× 2(ステレオ)バイト(176400バイト=172KB です。そのため、1分間で約10MBもの容量を必要とします。 圧縮技術の進化により、1/10程度への圧縮(エンコード)が可能になりましたが、それでも1分間で約1MBのディスク容量を必要とすることになります。
RPGなどの音楽数が多いジャンルのゲームなら、音楽だけで数百MBもの容量を喰うことになります。

チップチューン音源が生まれた理由

昨今のPCやスマートフォンなら、それぐらいの容量でも問題無く処理できますが、8bit16bitの頃のコンピュータでは、そんなに大きな容量のデータ処理は不可能です。また、CPU性能も遅いので、仮に現代の圧縮技術があったとしても、リアルタイムにデコードしながら再生することは、ほぼ不可能です。
そのため、制御信号だけで音を鳴らす仕組みとして、米国General Instruments社のAY-3-8910や、YAMAHAYM-2203OPN)といったLSIが誕生しました。

チップチューン音源が廃れた理由

しかし、Windows 95が登場した頃を契機に、PCが一般家庭に普及し、ストレージやメモリの容量、CPUの演算速度が爆発的に進化した結果、わざわざ音楽専用のLSIが無くても、音声全般を扱えるPCM音源だけで全て事足りるようになったため、チップチューン音源をPCに搭載する実用上の理由が無くなったことで、ハードウェアとしてのチップチューン音源 は、完全に姿を消しました。
ただし、SUZUKI PLANはその時代の流れに逆らって、チップチューン音源を復活させることを目指して活動しています。東方BGM on VGSも、いわばその活動の一環です。
それはともかくとして、現代のコンピュータで音を鳴らす手段は PCM音源に一本化された といえます。
という訳で、コンピュータでPCM音源を用いて音声を再生する方法について解説します。

PCM音源で音声を再生する方法

PCM音源で音声を再生する手段には、大きく分けると 低レベルAPI高レベルAPI の2種類があります。

低レベルAPI

最も原始的なPCMを再生する手段で、「波形直書き」と呼ばれる方式です。
低レベルAPIは、PCM音源デバイスに対して、PCMデータ配列を入力することで、PCM音源が発音するという極めてシンプルな仕組みで、WindowsLinuxMacAndroidiOSのどのOSでも提供されています。
ただし、Androidの場合、波形直書きができるようになったのはバージョン2.3.3以降からのみで、バージョン2.2以前は、MediaPlayerと呼ばれる音楽を再生する仕組みと、SoundPoolと呼ばれるaacoggなどのファイルから効果音を鳴らす仕組みしか提供されていませんでした。

高レベルAPI

Android 2.2以前から有る MediaPlayer SoundPool は、非常に簡単に音を再生できる反面、独自に生成した波形データを再生することができないため、自由度が低く、またレイテンシが酷すぎてゲーム等では使い物にならない残念な機能です。 (iOSでもAudioUnitで似たような機能が提供されていますが、これはAndroidよりは大分マシです)
このように、自由度を犠牲にしてより簡単に音を再生できる方式 のことを高レベルAPIと呼びます。 高レベルAPIでは自由度が低すぎるため、ソフトシンセを作ることは不可能なので、以後本書では取り扱いません。

OSの低レベルAPI

OS
低レベルAPI
備考
Windows
Wave Mapper, Direct Sound
本書ではDirectSoundを使用
Linux
ALSA, OSS (Open Sound System)
本書ではALSAを使用
Mac
Open AL
iOS
Open AL
Android
Open SL/ES
Mac iOS OpenAL は、全く同じです
見事に四者四様ですね。
ですが、できることは皆同じ「波形直書き」なので、使い方にはそれほどの大差はありません。

0 件のコメント:

コメントを投稿

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

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

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