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 は、全く同じです
見事に四者四様ですね。
ですが、できることは皆同じ「波形直書き」なので、使い方にはそれほどの大差はありません。

ソフトシンセの作り方(5) - 開発環境の準備

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

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

今回は、実践的な解説をする前に開発環境の準備について説明します。

開発環境の準備

PSG音源の開発には、VGSの実装の一部を利用するため、ご使用のパソコンへVGSSDK(開発環境)のセットアップをしていただく必要があります。そこで、VGS SDKの導入方法について解説します。VGS SDKを既に導入済みの方は読み飛ばしてください。
なお、VGS SDKは無料で利用でき、商業利用も可能です。なお、VGSの場合、VGS SDKを用いて開発したゲームに限らず、VGSのソースコードの一部を流用した開発も可能なライセンス形態となっています。(ライセンス関係の詳細は、VGSの使用許諾を熟読してください。また、分からないことがある場合、直接SUZUKI PLANへ問い合わせてご確認ください)

対応OS

VGSSDKは、次のOSに対応しています。
  • Windows
  • Mac OS X
  • Linux (CentOS7推奨)
動作環境については、スマートフォン(Android, iOS)もサポートしていますが、開発環境についてはパソコンのみです。

セットアップ方法

VGSのリポジトリで、OS別のセットアップ方法を記述しているので、そちらを参照してください。

gitの使い方

VGSを始めとする SUZUKI PLAN のオープソース製品は、全て GitHub 上で公開しています。GitHub とは、gitコマンドのリポジトリを管理するWebサービスで、多くの企業やオープンソース団体が活用しているソース構成管理ツールのデファクトスタンダードです。
本節では、本書を読み進める上で最小限必要なGitHubgitコマンドの使用方法を解説します。

gitコマンドのインストール

Mac OS XLinuxをお使いの方は、homebrew  yum コマンドで gitコマンドをインストールしてください。(例: yum install git
Windowsをお使いの方は、GitHub が公開している msysgit というツールをインストールすれば git コマンドが使えるようになります。
なお、WindowsにはGUIツールも提供されているようですが、全OS共通の使用で使えるCLIのみ使用します。

GitHubアカウントの登録

git コマンドのインストールが完了したら、GitHub アカウントの登録を行ってください。
その後、git コマンドでGitHubに登録したユーザ名とメールアドレスを設定します。
$ git config --global user.name ユーザ名
$ git config --global user.email メールアドレス

VGSリポジトリの取得

適当なワークディレクトリに VGSリポジトリ clone してみましょう。
$ cd ~/ && git clone git@github.com:suzukiplan/vgs2.git
上記を実行すると、PC ~/vgs2 ディレクトリに VGSリポジトリ(の最新のmasterブランチ)の内容が複製されます。あとは、VGSリポジトリの README.md に記載されているセットアップ手順に従ってセットアップを行えば、VGSのセットアップができます。

以降、VGSのリポジトリが ~/vgs2 に格納されているものとして解説します。

VGSリポジトリのバージョンアップ

git clone で取得した VGSリポジトリが格納されているディレクトリ上で、git pull コマンドを実行すれば、VGSリポジトリの内容を最新の状態に更新できます。
$ cd ~/vgs2 && git pull
最低限、VGSのセットアップをするのに必要な git に関する知識は以上です。

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

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