M5Stack Core2でゲーム開発入門 その4 サウンド

概要

前回はロジックとデータ構造について説明をしました。今回はサウンド周りを解説してみたいと思います。

ESP32でのサウンド

まずは一般的なESP32でのサウンド処理について説明をしてみたいと思います。

PWMでの圧電スピーカー

一番原始的なサウンドは圧電スピーカーだと思います。ピーみたいな音を周波数を指定して鳴らすことができます。あまり細かい制御はできず、音質も良くはありません。しかしながらどの出力ピンを使っても制御が可能で、圧電スピーカーは安価に利用が可能です。

M5StickC PlusやCoreInkなどは圧電スピーカーを内蔵していますので、通知音などを鳴らすことはできます。ゲームにはあまり適していません。

アナログ出力スピーカー

ESP32にはDACと呼ばれるデジタル信号をアナログ信号に変換する機能があります。それを利用してスピーカーを鳴らすことができます。ESP32に内応しているDACは8ビットなので、256段階の音を出すことが可能です。

実際にはスピーカーを鳴らすには出力が小さすぎるので、アンプを使って信号を増幅する必要があります。使われるアンプによってかなり音質にばらつきが出てしまいます。

M5Stack BASIC、GRAY、FIREなどにはアナログ出力のスピーカーが内蔵されています。とはいえ、もともとM5Stackは組み込み用途として開発されていた経緯があるので、音が大きいです。静かな場所で鳴らすと爆音で音が割れてしまいます。かなり調整をしないと望む音質は再現できないと思います。

I2Sデジタル出力スピーカー

I2Sというデジタル出力可能なスピーカーです。厳密にはアンプまでI2Sでデジタルデータを転送し、アンプで高精度のDACからスピーカーに出力されます。利点としてデジタルデータで転送しているので、ESP32などのノイズの影響を受けにくいです。そして、ESP32内蔵のDACより高性能なものが使われている場合が多いので、音質も高い場合が多いです。

I2Sで接続しているアンプとスピーカーに依存してしまいますが、アナログ接続と比べると全般的に高音質になるはずです。

M5Stack Core2やATOM ECHOなどにはI2S接続のスピーカーが内蔵されています。ただしATOM ECHOは筐体が小さいため、搭載しているスピーカーも小さく音は控えめになっています。

外部Bluetoothスピーカー

ESP32はBluetoothが利用できますので、外部のBluetoothに接続することも可能です。しかしながらあまりゲームでは使われないとは思います。複数人で遊ぶゲームで本人だけに聞こえる音としては好ましいと思いますが、なかなかBluetoothスピーカーを準備するのは面倒です。

M5Stack Core2のサウンド

M5Stack Core2にはI2S接続のスピーカーが内蔵されていますので、こちらを通常使うことになると思います。

上記がDACを利用した場合の音データです。8ビットですので0から255までの信号レベルがあり、中心が127になります。中心からの上下の変動が音として認識されます。

上記がI2Sを利用した場合の音声データです。16ビットなので65536段階あります。中心は0で-32768から32767までのデータになります。

音質を決めるのは、音の強さを何ビットで記録しているかも重要ですが、時間に対してどれだけの頻度でデータがあるかも重要になります。これをアンプリングレートとよび、CDでは1秒間に44.1KHzですので44100個のデータがあります。

I2Sの場合1つの音データが16ビット(2バイト)です。CDと同じ音質にするためには1秒あたり44100×2で88,200バイト必要になります。ちなみにM5Stack Core2はモノラルスピーカーしか内蔵していませんのがもしステレオで再生したい場合にはさらに倍のデータが必要になります。

サンプリングビット秒数必要なデータ容量
44,1002188,200
44,100210882,000
44,1002201,764,000
44,1002302,646,000
44,1002403,528,000
44,1002504,410,000
44,1002605,292,000
44,100212010,584,000

上記がデータ量の計算です。M5Stack Core2は16MBのフラッシュを内蔵していますので120秒ぐらいの音声を保存するのが限界そうですね。

それ以上を再生しようと思ったらSDカードなどに保存しておく必要がありそうです。

データ容量の低減方法

ビット数削減

I2Sは16ビットの音声データが必要ですが、内部で8ビットで保存して利用する場合に16ビットに変換することで、音質は悪くなりますがデータサイズは半分になります。

またアナログDACと共通のデータにすることで、複数端末で同じデータを使い回すことも可能だと思います。

サンプリングレート削減

サンプリングビット秒数必要なデータ容量
44,1002605,292,000
22,0502602,646,000
11,0252601,323,000
32,0002603,840,000
16,0002601,920,000
8,000260960,000

ざっくりとですが、よく使うサンプリングレート一覧です。音源が44.1Kの場合には半分にした22Kをよく使います。音声系の場合には落としても16Kぐらいまでが多いです。音声認識系だと逆に8Kぐらいをよく使っている感じでした。

圧縮音源

mp3を再生するライブラリなどがありますので、圧縮音源を利用すれば曲一曲が数MBにおさまると思います。ただし、展開にCPUリソースやメモリが必要になるので気軽には利用できません。そして、わりと扱いが難しいです。

音源合成

波形データを自分で生成する方法もあります。BGMなどでは例えばドの波形データなどを内部に保存しておいて、楽譜などのデータから自分でデータを合成して再生します。使っている音が少ないのであれば波形データが小さく済みます。比較的長いBGMなども再生することもできます。

和音

ESP32やI2Sは1つの音源データを再生する機能しかありません。BGMを流しながらSEを鳴らすことができません。これは困った。

実は解決方法はあります。自分で合成するのです。

おそらくこの辺の本とかを参考にしながら、ごりごりとC言語で音を合成していくのです。すみません、私には難しかったですので今回は単音しか鳴らしません。

効果音の準備

今回は石を置いたときの効果音のみ鳴らしてみたいと思います。効果音の準備方法を少し説明したいと思います。

自分で録音する

基本は自分で録音することです。ドラマとかの効果音を作る職業がありますが、いろいろな物をつかって音を作って録音して、加工してから使ったりします。

audacityなどの音声編集ソフトを使って、エコーやフィルターなどをつかって音を作っていくことになると思います。ここは専業の人がいる分野なのでかなりノウハウが必要です。

フリー素材を使う

こちらが一般的だと思います。昔はCD-ROMでフリー素材が販売されていたりしました。最近はインターネットでダウンロードできる素材もそれなりにあります。ただし、ライセンスには気をつけて利用してください。加工ができない音源や、何かに組み込むときには別途費用が必要なデータもあります。

他の音源から抜き出す

曲や映画などから好きな音を抜き出して利用します。これは基本的には著作権的にNGなので使わないようにしてください。

音源を変換する

私が作成したツールですが、このブログの上にあるToolsの中から「音声データ変換」を開くと上記のページが開きます。audacityなどを利用して、利用するサンプリングレートに変換し、モノラルの16ビットWaveファイルをまずは作成しておきます。

作成したWaveファイルを上記ツールで読み込むことで、プログラムで利用できるデータ形式に変換が可能です。

上記に詳細は書いてありますので参考にしてみてください。

まとめ

いきなり核心部分を他の記事にぶん投げましたが、音を出す方法はいろいろあるので自由に選択してみてください。選択する前に必要な情報についてはこの記事に書けたとは思っています。

M5Liteの音声再生は、かんたんに利用できますが再生中は処理が一切できません。短い音声を鳴らすのであれば問題ありませんが、ちゃんとしたゲームとして利用するのであればマルチタスク化して、いろいろと処理を追加する必要があると思います。

コメント

タイトルとURLをコピーしました