マイコン工作実験日記

Microcontroller を用いての工作、実験記録

Oscilloscope Music -- 画面表示

2024-09-23 16:10:42 | DoomPlayer

前記事はオーディオ再生についてでしたので、本記事では画面表示について説明します。

画面描画処理は、基本的には各PCMサンプルの値をXY座標値として表示するだけの単純な処理です。元のPCMデータは16bit符号付き整数ですが画面は480x320しかありませんので、上位8bit分の値だけを使ってプロットする点の位置を決定しています。LVGLでは描画用のWidgetとしてcanvasが用意されていますが、lv_canvas_set_px_color() を使って1画素ずつプロットしていたのでは処理時間がかかり過ぎて 192Kのサンプリング速度に間に合いません。そこで 深さ1ビットの256x256画素画像(LV_COLOR_FORMAT_I1)をImage widgetを使って表示しています。

オーディオ再生時には、6ms分のPCMデータ(1152サンプル) を1フレームとして再生送信処理を行なっていますが、画面表示では6フレーム分のPCMデータを256x256画素のバッファにプロットした時点でそのImage画像を更新(lv_obj_invalidate())してからバッファをクリアすることにより、画面の更新を行なっています。したがって、画面上には常時36ms分のオーディオサンプルに相当する画像が表示されていることになります。画面の更新周期としてはおよそ27Hzですね。

本当は、もう少し短い周期で、連続するサンプル区間が半分くらい重なるようにずらしながら、表示イメージデータの蓄積をして表示更新を行いたかったのですが、処理負荷と使用メモリ量が大きくなってしまうので、今回は単純に36msごとに区切ってのデータ蓄積と表示更新を行なっています。何の工夫もない単純な処理ですが、幸いなことにそれっぽい画像変化を得ることができました。


Oscilloscope Music - オーディオの再生

2024-09-22 15:04:27 | DoomPlayer

本記事では、前記事で触れたOscilloscope Musicについて紹介します。この機能は、Oscilloscope Musicのサイトで紹介されている音源ファイルを再生するものです。今回は、2016年にリリースされたアルバムを連続して再生する機能を実装してみました。サイト上で紹介されているように、オシロスコープをXY表示モードに設定しておき、再生した音楽の左チャンネルをX方向の入力、右チャンネルをY方向入力につないでやると、その音に対応した図形が描画表示されるというものです。アナログスコープを使った方が、輝線の残像効果に風情があるので、わざわざテクトロの中古を購入して再生している画像もYouTubeにはいくつもあがっていますが、PC上で再生するためのソフトも用意されているので、オシロスコープを持っていなくとも充分に楽しむことができます。

音源ファイルは有料で配布されており、代金を支払うとダウンロードして入手することができます。2016年のアルバムの場合、ホームページの説明にあるように全10曲が WAVフォーマットで配布されています。192KHzのステレオで非圧縮の16ビットPCMなので総量は1.52GBになるのですが、実際に入手して確認してみると1曲目の''01 Dots'' だけは96Kサンプリングになっていました。データ量は大きいですが、今時のSDカードを使えば何の問題もなく、fatfsを使って読み出すことができます。幸いなことにDoomPlayerで使っているTLV320DAC3203は192KHzまで対応しているので、読み出した16ビットPCMデータをそのままSAIを使ってTLV320DAC3203に送ってやれば音を再生することができます。

実際にPCMデータを送信するには、サンプリング周波数に応じたクロックを生成するために、STM32U5のPLLを設定したり、CODECの設定を変更したりする必要もあります。これらの準備を済まして音源を再生してみたのですが、当初は 96Kサンプリングの1曲目は再生できるものの、192Kサンプリングの2曲目以降がまっとうな音にならないという問題に遭遇。しばらく悩んでいましたが、ロジアナをつないでSAIの出力信号を確認したところ、SCK, FS, SD信号はきちんと出ているものの、MCK信号は192Kに設定すると出力されていないことが判明。SAIの設定を確認すると GPIOの出力スピード設定が Lowになっていたので、これをMediumに修正することで正常に音が出るようになりました。


LVGL Player

2024-09-19 16:16:23 | DoomPlayer

これまで、DoomPlayerにA2DP Sink機能を追加してきましたが、SDカードの有無で起動する機能を切り替えるのはあまりにも使いにくいので、起動時にはメニューを表示して選択できるようにすることにしました。ついでに、もうひとつ新たに機能を追加することにしたので、起動時には3項目を表示することになりました。こうなると、Doom Playerはもはや選択機能のひとつになってしまったので、起動画面には LVGL Playerという名前のタイトルを入れることにしました。

新たに追加した機能は、Oscilloscope Musicです。YouTubeで検索すればスグに見つかりますが、個人的にかなり気に入ったので、この再生機能を簡易的に追加することにしました。まだ作業中ですが、次の記事でもう少し詳しく紹介することにします。


オフィシャルパートナー

2024-07-14 17:44:31 | Weblog

Githubでlvglのプルリクを見ていたら、#6487 としてNemaGFXでの描画サポートの追加というのが出ていました。調べてみたら、NegaGFXというのは Think SilliconのGPUの API のようで、どうやらSTM32でNeoChromとかNeoChrom VGとか呼ばれているGPU機能は Think Silliconの製品を採用したもののようです。

近いうちにNeoChromがlvgl でも使えるようになることが期待できます。

そう思っていたら、いつの間にか LVGLのオフィシャルパートナーにSTのロゴが加わっていることに気づきました。正式発表も近いかな。

でも、NeoChromってNucleoボードに搭載されているMCUではサポートされていないんですよね。やっぱ、DMA2Dのサポートも復活して欲しいところです。

 


A2DP sink機能の追加 -- その2

2024-07-11 16:57:31 | DoomPlayer

曲名やアーティスト名が長い場合にスクロール表示が発生すると、表示の更新が遅くなってしまう原因を調べたところTTF(True Type Font)を使って表示しているために、その表示処理に時間がかかってしまっていることがわかりました。通常の埋め込みフォントであれば、描画の負荷が小さいのですが、TTFフォントを使うと展開と描画の負荷が重いようです。

ちょっと調べたところでは、LVGLのTiny TTF font engine では展開したビットマップイメージをキャッシュしているものの、Unicodeからglyph indexへの変換情報はキャッシュされていなかったために展開速度の低下を招いていたようです。ちょうど運良く、この問題を修正したPRが出ていてマージされたので、早速試してみました。確かに目で見てわかるほどにスクロール表示が改善されています。

TTFフォントを使った場合には文字のサイズを変更しても綺麗に表示されるのですが、A8フォーマットのビットマップに展開されているので、メモリと描画処理の負荷は重くなっていると思われます。フォントの描画処理をDMA2Dを使うように最適化すれば、もう少し早くできるかもしれません。