ラズパイオーディオで音楽情報をちっちゃい液晶画面に表示する方法【mpd_gui編】


さて、ボクの中のここ数年遊んでいるテーマの一つとして、「ラズパイで音楽とかMVとかを再生して、ちっちゃい画面に色々曲情報などを表示する」というのがある。

まあ、言葉で説明してもなんのこっちゃという話になるので、過去にボクがTwitterに上げた動画などを以下に貼り付けておくけど、こんな風に、MPDのプロセスと連携して、アーティスト名やアルバム名&曲名、その他、可能であればカバーアートやシークバーなどの装飾的な情報を出す、という事に多くの人がチャレンジしていて、ボクもありがたく利用させていただいているわけ。


で、この手のアプリケーションは幾つかあって、このチューブマンの例だと「mpd_oled」というのを利用しているのだけど、これは実は日本語表示ができず、日本語は全て「????」みたいな表示になって、まあまあに使い勝手が悪い。

その他にも、Sabreberryシリーズの作者であるTakazineさんは「oled_ctrl_xx.py」というスクリプトを使って、秋月のキャラクタ型有機ELディスプレイに表示を行っていたり、NosPiDACシリーズの作者であるじんそんさんは、もう少し小さい、秋月の小型キャラクタLCDモジュールに表示をするスクリプトを提供していたりして、ボクもメチャメチャ活用させてもらってはいるのだけど、これらは「キャラクタ型デバイス」を対象としているために、漢字やカバーアートといったリッチな情報を出すことは難しい。

まあ、こちらもこちらでかなりオシャレではあるんだけど。


そして、ここ最近はというと、ちょうど一つ前のエントリにも書いたように、「ちっちゃな液晶パネル」で遊ぶようになってからは、この液晶画面(もしくはキャラクタ型ではないOLED)に、曲情報を出せないのかな~と色々調べていて、先ほどのmpd_oledを試していたりしたのだけど、どうにも日本語を表示するには色々と課題があったりと、なかなか満足していない状況があった。




ちっちゃな液晶画面に曲情報を出したい!


というわけで、個人的には「もう自分で作るしか無いのか、、、」と思っていた(ちなみにプログラミングはメチャ苦手)ところなのだけど、ふとSNS上でのやりとりで、私が認識していながら試していない「MPD情報表示ソフトウェア」がある事を思い出すことになった。

それが、blue-7さんが開発を進めている「mpd_gui」だ。

さて、このmpd_guiをボクがまだ試していなかった理由。

それは、このアプリケーション自体がblue-7さんの「NanoPi NEO/NEO2」というRaspberry Piとは異なるLCD HAT用に作られているものだったため、Raspberry Pi上で動作させるには、そのままスッと動かせるものかどうかが、「試さないとわからず」、結果として後回しにしていたところが大きい。




で、そんなこんなでSNSの傍らでやり取りをしている中で、なんとblue-7さんから直接コメント(ツッコミ?笑)をいただくことに。


うーん、これだけ条件が揃ってやらないでいつやるの、今で、、、、古いな(笑)

というわけで長々と経緯を書いてしまったけど、ソーシャル関係のコラボ企画第2弾としてお届けしておりますってことで、続けます(笑)

moOde Audio Playerインストール


さて、このmpd_guiだけど、環境としてはmoOde Audio Playerに導入していくことにしよう。

そして、肝心のRaspberry Piについては、ちょうどKaruhamiyanさんから譲って頂いた、「BB-Berry Pro Z(単体では非売品?)」にWaveshareの240x240ドットのIPS液晶を搭載した「1.3inch LCD HAT」を組み合わせて(要改造)、色々実験していたところなので、こちらを環境としては用いることにした。

なお、moOde Audio PlayerのローカルUIは以下のように表示できるようにはなってたり。


ちょっと脱線するから方法はここでは書かないけど、割とパッと見はカッコいいので、写真だけお見せしてみた(笑)

さて、moOde Audio Playerは現時点の最新バージョンの5.3.1を用いる事として、以下からダウンロードしてまずはSDカードを準備しよう。

moOde Audio Player

(2019/8/11追記)※注意!!
色々実験した結果、Raspberry Pi Zero WHの環境で使用する際には、現バージョンでは、mpd_gui自体の処理がそこそこ重く(特にスクロール有り時の画面描画)、シングルコア&低クロックなRaspberry Pi Zero WHではCPU使用率がかなり上がることを確認しています。現時点では、Raspberry Pi 3A+/3B+/4Bあたりの環境でこのTIPSを適用することを推奨します。なお、何か簡単な改変でZero環境でも扱いやすい方法が無いかを探ります。


なお、イメージを書き込んだり、そういった手順は本題から外れるので今回は割愛。

moOde Audio Playerを起動した後は、
  • WiFi設定(APモード使う人はそのまま)
  • DAC有効化(I2Sを有効化)
  • タイムゾーンの設定

辺りを済ませておくのが良いかも。あと、実験用に「/mnt/SDCard」配下にSamba経由で曲ファイルを転送しておくのも良いかと。

なお、moOdeにはGPIOをいじる設定があるのだけど、ここではいじらない方が良いだろう

blue-7さん謹製MPD情報表示ソフトウェア「mpd_gui」を導入しよう!


mpd_guiの導入準備

さて、実際にNanoPiの環境にmpd_guiを導入するのであれば、正直、私が何も書くこともなく、blue-7さんの本家サイトを見ていただければ済んでしまうことかと思う。



ただし、これをラズパイ側で使おうと思うと、そのままでは動かず、幾つか注意(改変)しないといけないポイントがある。

そこで、今回はその辺りにポイントを絞って書いていきたいと思う。

なお、GPIOの割り当て等はさすがに、環境によって異なる(DACによって結果的に空きポートが違う)ので、他のDACやボタンアサインの環境で試す場合は、適宜、自身の環境に合わせて読み替える必要がある。

この辺りはちょっと玄人向けで申し訳ないけど、試す方はご注意いただきたい。

ちなみにボクの環境は、以下はKaruhamiyanさんから共有いただいたExcelだけど、こんな感じ。


■キー操作
GPIO P17→KEY1(HAT基板をパターンカット&結線で改造)
GPIO P20→KEY2
GPIO P16→KEY3
GPIO P6→ジョイスティックアップ
GPIO P22→ジョイスティックダウン(HAT基板をパターンカット&結線で改造)
GPIO P5→ジョイスティックレフト
GPIO P26→ジョイスティックライト
GPIO P13→ジョイスティックプレス

■SPI関連
GPIO P11→SCLK
GPIO P10→MOSI
GPIO P25→DC
GPIO P8→CS
GPIO P27→RST
GPIO P24→BL

なお、HAT基板を改造とあるのは、Waveshareの「1.3inch LCD HAT」とDAC基板で利用するGPIOがモロ被りしているので、それを逃がす必要があるからだ。

まあ、なにをやっているかは本題からずれるので割愛するけど、興味のある人は写真を見て、理解していただければ(笑)



mpd_guiのソースを入手

さて、環境の整理が終わったので、早速導入していくことにする。まずはGitHubからNanopi-NEOのソースコードを入手しよう。

$ cd ~
$ git clone https://github.com/blue777/NanoPi-NEO
$ cd NanoPi-NEO


使用するディスプレイ設定の編集

ここで、まずmpd_guiで使用するディスプレイを「usr_displays.h」というヘッダファイルで指定する必要がある。(なお、このファイルを見ていただくとわかるのだけど、mpd_guiは本当に多種多様な液晶パネルに対応しているので、ホント頭が下がります。)

$ vi usr_displays.h

デフォルトで有効になっている以下の行をコメントアウト。

■修正前
        iDisplays.push_back( new Display_ST7789_IPS_240x240_spi(0) );

■修正後
//      iDisplays.push_back( new Display_ST7789_IPS_240x240_spi(0) );

さらに、今回のLCD HAT用の設定として、以下の行を追加。

        iDisplays.push_back( new Display_ST7789_IPS_240x240_spi(180,-1,25,27,24) );

なお、上記の「180」という指定は180度画面を回転させる指定となっている。使用する向きで「0,90,180,270」を指定してやる事で画面の回転が可能。ここについては、最初180度回転が正常に動作しなかったのを、blue-7さんにSNSで相談したところ、即座に修正頂いた点だったり。

GPIO割り当ての修正

さて、次に、mpd_guiはC++で書かれており、ボタン操作についても「Play(再生)/Prev(先戻し)/Next(先送り)」がハードコーディングされているので、moOde自身にもGPIO設定の項目はあるのだけど、こちらを利用できるように改変しておく。

ただし、そのままコンパイルするとRaspberry PiのGPIOと指定がかぶって誤動作を引き起こすため、ソースコードを修正する必要がある。

なお、今回の場合は、以下の通りで割り当てる事にした。

GPIO P17→KEY1:PREV(先戻し)
GPIO P20→KEY2:PLAY(再生)
GPIO P16→KEY3:NEXT(先送り)

$ vi mpd_gui.cpp

■元ファイル

#define GPIO_BUTTON_PREV                0
#define GPIO_BUTTON_NEXT                3
#define GPIO_BUTTON_PLAY                2

■修正後

#define GPIO_BUTTON_PREV                17
#define GPIO_BUTTON_NEXT                16
#define GPIO_BUTTON_PLAY                20


さて、上記の変更のみだと、元々のソースコードがNanoPi NEO/NEO2の「NanoHat OLED」を想定して書かれている事もあり、きちんと動作しないため、これをWaveshareの「1.3inch LCD HAT」用に修正してやる必要がある。

なお、この辺り、モタモタしていたら、直接blue-7さんにSNSでコメント頂いた経緯があったり(笑)

ちなみにハードウェアの差分は以下の通りとなっている。


というわけで、
  1. ボタン押下時のステータスが逆なのでコード中の判定処理を逆にする
  2. Raspberry PiのGPIO16/17/20をプルアップ付き入力に指定する
という対応が必要になる。

なお、修正方法は色々あるとは思うのだけど、今回は、ステータス判定部はソースコードの改変で対処するものの、GPIOのプルアップ付入力への変更は、起動処理の中でそれぞれ行うことにした。

というわけで、mpd_gui.cpp中の以下行の判定文を修正する。

以下の、GPIO_BUTTON_PREVのステータス判定文を「0→1」に変更。

■1843行付近
    if( 1 == value )
    {
     printf( "OnButtonPrev_Up()\n");

以下の、GPIO_BUTTON_NEXTのステータス判定文を「0→1」に変更。

■1870行付近
    if( 1 == value )
    {
     printf( "OnButtonNext_Up()\n");

以下の、GPIO_BUTTON_PLAYのステータス判定文を「1→0」に変更。

■1898行付近
    if( 0 == value )
    {
     MusicController::PlayPause();

この辺りは、使用するHWの設計に依存するところがあるので、自身の環境に合わせて修正する必要があるのだけど、適当にGPIOにタクトスイッチ付けるような場合であれば、ボクの修正方法のまんまで動くんじゃないかと。

以上でGPIO周りの修正は完了だけど、併せて曲情報のパス設定もmoOde Audio Playerに合わせて以下の通り、修正しておく。なお、以下の修正をしないと、カバーアート情報が正しく取れない模様。

■元ファイル

#if VOLUMIO
#define MUSIC_ROOT_PATH         "/mnt/"
#else
#define MUSIC_ROOT_PATH         "/media/"
#endif

■修正後

#if VOLUMIO
#define MUSIC_ROOT_PATH         "/mnt/"
#else
#define MUSIC_ROOT_PATH         "/mnt/"
#endif

さて、上記の修正が終わったら、改変作業は完了。さっそくコンパイルしていこう。

必要なパッケージの導入

まずは必要なパッケージの導入から。mpd_guiでは画面の描画にOpenCVを使っているので、そのパッケージやフォント、タグ情報取得のライブラリをインストールしてやる。OpenCVのダウンロード&インストールにはそこそこ時間がかかるのでしばらく待とう。

$ sudo apt update
$ sudo apt install libcv-dev libopencv-dev opencv-doc
$ sudo apt install fonts-takao-gothic
$ sudo apt install libtag1-dev

なお、ここで、赤字にしている部分なんだけど、blue-7さんのサイトでは、「fonts-takao-pgothic」とPゴシックのパッケージを導入しているのだけど、ラズパイ環境ではゴシックのパッケージにPゴシックのフォントも含まれるので、そちらをインストールしている。

mpd_guiのコンパイル

以上で準備は完了、ということで、以下を実行してコンパイルしよう。

$ g++ -O3 -std=c++11 mpd_gui.cpp -o mpd_gui.cpp.o -pthread `pkg-config --cflags opencv` `pkg-config --libs opencv` `freetype-config --cflags` `freetype-config --libs` `taglib-config --cflags` `taglib-config --libs`

上記のコマンドで「mpd_gui.cpp.o」というアプリケーションができているので、ここはまあ趣味の問題だけど、ホームディレクトリに「mpd_gui」という名前でコピーしてやる。

$ cp mpd_gui.cpp.o ~/mpd_gui

自動起動の設定

mpd_guiをOS起動時に自動起動させてやるために、「/etc/rc.local」中の「exit 0」行の直上に以下の行を追加してやる。なお、この際に、先ほどのGPIOのプルアップ付入力への変更のためのコマンドも併せて記述してやる必要がある。


$ sudo vi /etc/rc.local

gpio -g mode 17 in
gpio -g mode 17 up
gpio -g mode 16 in
gpio -g mode 16 up
gpio -g mode 20 in
gpio -g mode 20 up
/home/pi/mpd_gui &

SPIの有効化

上記の設定の後、raspi-configでSPIを有効にしておこう。

$ sudo raspi-config

5 Interfacing Option -> P4 SPI -> Yesを選択


再起動および動作確認

というわけで、上記で設定は全て完了。再起動してやると、、、画面、出たよね!

$ sudo reboot


※2018/8/7追記
なお、時計画面が出た後に、慌ててボタン操作等をすると、mpd_guiが落ちるような挙動を確認してます。おそらくmpd側が準備できていない状況で、操作しようとしてエラーになっているのだと思いますが、まあ、慌てなさんなということでよろしくお願いします(笑)


画面表示をつければラズパイオーディオは10倍楽しくなる!


さて、Twitterでも公開したけど、ボタン操作も含めて動作はバッチリです。液晶画面の表示もハッキリクッキリして、小さい画面ながら、遠くからも視認性高し


なお、カバーアートについては、曲自体に埋め込まれたカバーアート情報をタグから取得するので、カバーアートが埋め込まれた曲ファイルを準備する必要がある点は注意。最初、ここを理解していなくて、しばらく悩みました(笑)


さて、今回の導入にあたっては、まずはきっかけを頂いたKaruhamiyanさん(実は他のボクの進めているネタでこちらを試す予定があった)、開発者のblue-7さん、カーネル周りの改変で色々参考にさせて頂いている__tkz__さんにSNS上で、助言を頂いたおかげで、かなりハイスピードに導入することができたと考えています。まずは厚くお礼を申し上げたいかと。

これが外国人のソースコードだと、まだまだうまく動いていないかと思うと、、、本当に助かりました(笑)

で、動かしてみた実際の感想としては、MPD情報表示ソフトウェアの中では、多くのLCD/OLEDに対応しているので遊びがいがあるし、情報もハッキリクッキリしていてみやすいしで、ボクの中でデファクトスタンダードとさせていただいてもいいんじゃないかと。

一点、難点としては、OpenCVで描画しているので、OpenCVの仕組みを理解しないと、画面の改変で遊ぶのはちょいと勉強がいるかもというところ。画面色を変えようかと色々見ていたのだけど、、、もう少し時間がかかりそうね(笑)


さて、ボクは脇で利用させていただいている身なので、今回のように、我流で色々解決するしかないのだけど、blue-7さんはNanoPi NEO環境用のトガった面白いガジェットをたくさん作っていらっしゃるので、そちらを入手して、blue-7さんのオススメの遊び方にチャレンジするのが、近道なんじゃないかとは思います(笑)


というわけで、今回はずっとチャレンジしたかったテーマに取り組めて、本当に楽しかったです!

本当に楽しいので、皆さんも、興味のある方はぜひチャレンジしてみてください!

スポンサーリンク
スポンサーリンク