Raspberry Pi PicoでAT-Xを作る⑯ 音声再生を実装する

raspberry pi pico

リソースの管理ムズすぎ。

買ったもの

小さいスピーカーアンプボード(DIP化済み)
(左の袋に入ってるオペアンプは今回使ってないよ。)

「電子工作ステーション」って通販サイトで購入したよ
はんだごて持ってないからはんだ付けして送ってくれる有料オプションマジで助かった
購入したときの記事↓

結線

繋ぐだけだからめっちゃ簡単

アンプボードのピン間が2.54mmピッチより狭くて
ブレッドボードに挿せなかったからジャンパーで無理矢理繋いだよ

片側のチャンネルだけなのにモジャモジャでウケる。

音声のフォーマット

元の動画ファイルから音声をひっぺがしてadpcm形式に変換する

adpcmの中身はwavヘッダ無しで、1バイト目から音声データ

16kHz、12bit、PWMで再生

音声の変換

動画ファイルをpythonで生のADPCMに変換

ここに載せてたソースが間違えてた・・
ちゃんと変換できるソースはこちら↓

Raspberry Pi PicoでAT-Xを作る⑰ 音声がブツブツ鳴るのを解決する

役割分担

core0
・LCDへの描画
・adpcmをpcmにデコード ←New!!
・PWMで音声を再生 ←New!!

core1
・microSDからフレームデータの読み込み
・フレームデータの展開
・microSDからadpcmの読み込み ←New!!

再生までの流れ

core1で動画1フレーム分の描画データを読み出した直後に
音声も1フレーム分読み出してadpcmのバッファにプッシュ

core0で動画を1フレーム描画した直後に
1フレーム分のadpcmをpcmにデコードしてpcmのバッファにプッシュ

この繰り返しで動画用のバッファも音声用のバッファも1フレーム分くらいは埋まってるようにしてある

PWMでの音声再生自体はタイマーを使って16kHz(62.5usに1回)で呼び出され続ける

イベントハンドラに着火

pcmのバッファから1バイト(2サンプル)ポップして
duty比を変更

結果

ピッチ、再生速度、動画との同期は完璧にできた

でも1秒に6回くらいの頻度で音がブツブツ鳴っててまともに聴いてられない・・・
最後のクラッシュシンバルの減衰おかしいよね??

おわりに

タイマーの割り込みが悪さしてる とか メモリ足りない とか
色んな原因考えて色々(DMA転送、デコードするコアを変更)やってみたけど
まだ原因わかってない・・・

続きはこちら↓

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