1bit DACで音楽を再生する
音楽再生の原理
マイコンから音楽のような音声出力を行うためには、デジタルデータをアナログ信号に変換するDAC(Digital Analog Converter)機能が必要となります。デジタル音楽プレーヤ等ではフラッシュメモリ等に格納されたデジタルデータをDACで音声データに変換してイヤホーンやスピーカを鳴らす仕組みになっています。これはノートPC等でも同じです。一方、RaspBerryPi Picoには残念ながらハードウェアとしてのDAC機能は搭載されていません。そこで使用するのが前回の音楽演奏で使用したPWM(Plus wide Modulation)機能です。前回はPWMの周波数を音符の音程に合わせて変化させて音楽演奏をしましたが、今回は周波数は一定にししてパルスの間隔を音の大きさに応じて変化させます。周波数は耳に聞こえない可聴範囲外の周波数(数メガHz)にします。このような方式のDACを1bitDAC方式と呼んでいます。
アナログ出力を行うDAC方式は出力でスピーカを鳴らすような場合はアナログ信号を増幅するアンプと呼ばれる電気回路が必要となります。しかし、1bitDACは上記のように出力がデジタル信号のためデジタル出力しか扱えないGPIOピンから疑似的なアナログ出力を行うことが可能となります。さらにこの疑似アナログ出力信号は、トランジスタ1個(2SC1815)簡単な電気回路を外付けで付加することでスピーカを大きな音で鳴らすことが出来るようになります。全体の接続回路を下記に示します。
音楽再生アプリケーション
Raspberry Pi PicoのArduinoライブラリにはPWMAudioやI2Sというオーディオ信号を出力するライブラリがデフォルトで組み込まれていますが、今回はより高機能なオーディオ処理を簡単に行えるESP8266Audioライブラリを利用しました。このライブラリは名前の通りESPマイコン用に開発されたライブラリですが、Raspberry Pi Picoでも動作可能です。ESP8266Audioライブリは音声処理のための下記の3種のライブラリ群があります。
入力処理(AudioFileSource)
音データの入力処理ライブラリです。SDカードや内蔵フラッシュ上のファイル等を選べます。バッファ処理も追加することができます。
データ加工処理(AudioGenerator)
音データ処理のライブラリです。WAVやMP3等のファイルからのデータの読み出しや圧縮データの伸長処理などを行います。圧縮形式は、無圧縮WAVやFlac、MP3、AAC等が選べます。
出力処理(AudioOutput)
音のデジタル情報のDA変換等を行い、人が聞くことができるデータとして出力します。ソフトウェアでデルタシグマ処理を行いマイコンのピンから疑似的なアナログ出力をするライブラリや、外部にI2SインターフェースのDA変換モジュールを接続するためのライブラリなどがあります。スケッチ例を参考に、この3つのライブラリを組み合わせてさまざまなバリエーションのアプリケーションを作成することができます。
WAVファイルの再生
SDカードに格納したWAVファイル(無圧縮のPCMファイル)を再生するアプリケーションを作成します。
回路構成
音声出力は前回紹介した圧電スピーカでも可能ですが、音量が小さく実用的ではないため、ダイナミックスピーカの方を使用します。高周波成分はスピーカで減衰されてしまうので、特にフィルタ回路もなく、抵抗とトランジスタ1個の簡単な構成で実用的な音質と音量で鳴ってくれます。
アプリケーションの動き
アプリケーションは、SDカード上のWAVフォルダ内にあるWAVファイルをリストアップし、順番にESP8266Audioライブラリで演奏していきます。ファイル名は昇順でソートして表示するため、ファイル名の頭に番号を付けることで演奏する順番を指定できるようにしました。リストアップしたファイル名は前に紹介したLovyanGFXライブラリを使ってLCD上に表示します。表示はスクロール機能を使用することで、シリアルコンソール表示のように順次上方にスクロールするようにしました。
また、再生するファイル名も曲の開始時に順次LCD上に表示していきます。
以下に全体の処理の流れを説明します。最初にSDカードおよびLCDの初期化を行います。LCD画面やスプライト、文字色、背景色、フォント設定等を行います。次にWAVフォルダをオープンしてフォルダ内のファイル名を取得し、配列に格納します。loop関数の中でリストアップしたファイルを順次openして、曲の終了までloop()関数を呼び出します。曲が終了したらstop()ファイルのcloseなどの終了処理を行
います。