● 実験テーマ102
「カラーOLEDに、BMPイメージと共に、演奏者名・曲名を表示する実験」
(MP3のID3v2タグからアルバム情報を検索しイメージと共に演奏者名・曲名を表示する実験です)
以下、この実験の顛末記です。
■ 2018.2.9
・今使っている、Adafruitの、1.5inchカラーOLEDを、MP3プレーヤに応用しようと進めているが、今回は、
SDに収録されている、MP3ファイルの、ID3v2タグからアルバム情報を検索しイメージと共に演奏者名・曲名を
表示する実験をしてみました。但しまだ、MP3デコーダ部は組込んでいません。
・MP3プレーヤにする場合の、画面レイアウトを検討。
@ ジャケットイメージサイズは、今の、100x100dotのままに変えない。
丁度見易いサイズなので。
A そうすると、下段の空スペースに、漢字或いは半角ANK文字で、曲名と演奏者名を、もれなく入れることは
出来ないので、演奏者名は、上段2行MAXで、イメージと重ね書き(テキストは、背景色:黒、文字色:白)
して表示。
曲名は、下段の空スペースに、2行MAXで漢字或いは、半角ANK文字で表示。
(結果的には、こちらも部分的には、イメージとの重ね書きになりました。)
・MP3デコーダ部のソフトを追加する前に、この画面イメージの表示テストプログラムを作成して見栄えを確認してみる。
・ソフトを作成開始。要点を整理してみた。
@ 前回の、BMPイメージ表示テストの、フローでは駄目なこと。
基本は、以前自作した、タッチ式MP3プレーヤ(QVGA)のソフトを参考。
この時は、最初に、MP3ファイルリストを出したが、今回はスペースが無いのでださないことにした。
(とこの時点では思ったが、最終的には、デバッグの意味も含めて初期画面として最初から16曲分のリストのみ
表示するようにした。)
A 曲(アルバム)と対応したイメージの表示方法(簡易的な方法とした。)
・SDにMP3ファイルの他に、それに対応する曲番をファイル名に入れたBMPファイルを用意して、それを再生前
に読出して表示。
<例>→ 曲番:1→ BMPファイル名:"IMAGE001.BMP"
↑
※ この文字列バッファの定義: char
str_IMAGE[]= "IMAGExxx.BMP";
・イメージファイルを開く手順は、
A-1: itostring(3, FileNo+1, str_IMAGE+5); // ファイル名の曲番部分を文字に変換して、全体の文字列と結合
A-2: fptr = FSfopen(str_IMAGE, "r"); // File Open (Read Mode)
B 今は、同じアルバムに収録されている曲の場合は、最初の曲の再生前にだけ、そのジャケットを表示していて、
その後の曲については表示しないようにしている。
■ 2018.2.10
・ソース書き上げた。HEXまで準備出来る。
色々やったが未だ駄目。
<症状>
@ 最初の曲(さだまさし:SUIGARA.MP3)のイメージは表示するが、TAG情報が表示されない。
A 次の曲(太田裕美)のイメージは表示するが、3曲目(荒井由実)のTAG情報が表示されてる。
つまり、1つずれている。
B 半角ANK文字のTAG情報表示の位置制御がおかしい。
■ 2018.2.11
・昨日の<症状>−@ を追求。
最初の、FileNo= 0の、TAG情報が表示しない。
→ SaveFileName関数(ファイル名のバッファへの格納)で、最初のMP3ファイルが、正常にサーチされているか、
最初から16曲分のファイルリストを表示させて確認した。→ これはOKだった。
何故か、デバッグ用に、最初の16ファイル分のリスト表示をするように、SaveFileName関数をいじったら、
最初の曲に、TAG情報が表示出来、1つずれる現象も無くなった。
この修正をやる為に、OLEDと、SDのSPI設定を頻繁に切替えなければならなかった。
はっきりした原因は不明だが、そこらの切替えタイミングの問題だったと想像する。
(修正前のソースのバックアップに不手際があり、バックアップが取れて無く比較考察出来てない。)
このデバッグ表示は、そのまま残しておくことにした。
・昨日の<症状>−B「半角ANK文字のTAG情報表示の位置制御がおかしい」を追求。
→ TAG情報に、半角ANK文字が含まれていた場合(漢字と混合している場合+ANK文字のみの場合)で、半角のみの場合
の、表示位置制御に誤りがあって修正。これでOKになる。
以下の、半角のみの場合の処理部分の、コメントを参照してください。
//// 半角のみの場合
// OLED_Char(i/16, (i%16)+14, DataBuf[locate+11+i], WHITE, BLACK);← 修正前
/// 180211
/// i=0〜15の余り計算結果=x=0〜15
/// i=16文字目で、x=0で改行
/// i=0〜15の割り算結果=y=13
/// i=16文字目で、y=14で改行
OLED_Char(i%16, (i/16)+13, DataBuf[locate+11+i], WHITE, BLACK);
// 修正後
■ 2018.2.12
・不具合はこれだけではなかった。
曲に対応する、BMPイメージが無い場合に、そこで止まってしまうのである。
これは単純なミスで、曲ファイルに対応するイメージが無い場合(BMPファイルオープンに失敗した場合)の処理が抜けていただ
けで、これを以下のように対処した。
イメージファイルがない場合は茶色のジャケットを表示して、その中央に、"NO
IMAGE"と表示するようにした。
もう一つの残る問題は、TAG情報に、漢字と半角ANK文字が混合している場合に、表示位置がおかしくなる現象である。
これも、表示位置(Y座標)制御部分の記述ミスが原因で、直したらOKになる。
■ 2018.2.13
・一応当初考えた通リのテスト仕様での動作はOKになった。
まあもう少し見易くするためには、BMPイメージとTAG情報表示の干渉が起きないようにレイアウトを考えたいが
そうするには、BMPイメージのサイズを、70x70dot位に小さくするしかない。
そうすると無駄なスペースが出来てしまう。
それと、今迄作ってきた、100x100サイズのイメージをそのまま使いたいという思いもあり、サイズ的にも
丁度良い、100x100にし、それにオーバーラップさせてTAG情報を表示させている。
<回路図>
※ 前回の実験テーマ101と同じです。
<最終ソース>
・こちらから、どうぞ→ OLED_MP3_IDTAG_DISP_TEST.c
※ 上メインソース以外のファイルは、前回の実験テーマ101と同じです。