MP3プレーヤ第18作

ソフトウエアデコーダ+I2S接続DACによるMP3プレーヤ。

更新: 2023/10/21, 2023/11/04, 2023/11/12


Raspberry Pi Pico調査

  • こちらのページでRaspberry Pi PicoにMP3デコーダを移植。
  • FatFs の Raspberry Pi PICO への移植に関してはElehobicaさんを参照した。
  • pico-playgroundのsine_waveでI2Sの調査
  • sine_waveにFatFsを組み合わせてWAVプレーヤを試作してみたのがこちら

本製作の回路

  • スピーカはモノラルとする。
  • 表示器は秋月の「0.96インチ 128×64ドット有機ELディスプレイ(OLED)」(制御チップSSD1306)
  • ロータリエンコーダは秋月の「ロータリーエンコーダ(24クリックタイプ)」(通販コードP-06357)

途中経過

回路の主な部分をユニバーサル基板に作成したところで、タクトスイッチ、OLEDをブレッドボードに置いて動作テスト。プログラムの骨格を完成させた。

ケースの製作

  • タカチのMB11-7-15を選択。
  • 加工もタカチへ注文してみます(4回目)。依頼する窓口は「共立エレショップ」。
  • 当初MB10-9-12で加工注文したのだが、デザインルールに反する(ケースの折り曲げ箇所に穴が近すぎる)らしく、その注文をこちらからキャンセル。改めてMB11-7-15で注文した。

ケース加工発注の流れ

  • 共立エレショップのサイトから最初の申し込みをします。送付した図面データはこれ。注文入力したのが月曜日の夕方。
  • 共立エレショップから「受け付けました」の自動返信メールが来る。
  • 翌日、共立エレショップから「タカチに見積依頼を出しました」のメールが来る。
  • 翌週月曜日、共立エレショップから見積結果が来る。14,960円。タカチで書き直した図面と公差や注意事項の資料(PDF)が添付されていた。
  • その図面データをチェックした上で正式に注文することにします。必要なアクションは2つ。
    • 見積メールにある手順に従って共立のサイトで注文入力。タカチ以外の部品もいっしょに注文できるみたいだが今回はケースだけにする。
    • タカチで書き直した図面データに「押印またはサイン」をして返信する。「押印またはサイン」はAdobe Acrobat Reader DC の署名機能で名前と日付をPDFに書き込みました。それを見積メールの返信で共立に送ります。
  • 注文受付メールが共立から来る。これはいつもの自動返信メールだろう。
  • 振込先のご案内メールが来る。これに最終的な金額と振込先が記載されている。金額は見積通り14,960円で、振込先はいつもの共立の口座である。
  • 振込後、入金確認メールが来る。
  • 続いて「タカチに手配しました」メールがくる。正式注文入力からここまで1日で済んだ。
  • さらに翌日、出荷予定日の連絡が共立から来る。
  • 出荷予定日になり、「メーカーから出荷しました」メールが共立より来る。
  • 翌日到着。正式注文から9日目。同時に共立から納品書がPDFで来る(以前は郵送だった)。
  • インプレッション
    • 前回(3年前)注文と比べて。同じMBシリーズだけども今回の方が少し大きい、しかし穴数はそれほど変わりない。昨今の世間の値上げラッシュからして20,000円越えも覚悟していたが、意外や前回より安かった。(もしかして角穴の数が費用に大きく影響する?)
    • 納期も前回より早かった。

作成したプログラム(Raspberry PI Pico)

  • ソース一式はこちら
  • Windowsのプログラムで前処理データを作成しておき、それに基づいて動作する仕組みは今までの製作と同じ。
    (FatFsのf_readdir関数を使って存在するサブディレクトリやMP3ファイルを取得する、というような処理はまったくやっていない。またOLEDに文字を表示するためにFONTXフォントファイルを読みだすこともやっていない。)
  • ソース内サブディレクトリ
    • fatfs - pico_fatfs_testに付属のバージョン(R0.14b)。FF_LFN_UNICODE=1, FF_FS_MINIMIZE=2 などの設定変更。
    • libmad - 0.15.1bを移植
    • madplay - libmadを利用するアプリケーション例(madplay)からの流用ソース
    • pico_audio - pico-extrasのpico_audio
    • pico_audio_i2s - pico-extrasのpico_audio_i2s
    • pico_util_buffer - pico-extrasのpico_util_buffer
  • ソースはもっと整理できると思われる。手持ちのMP3ファイルに最適化するならpico_audioのsample_conversion.hとか。madplayから移植した resample.c とか struct playerのフィールドとか。最適化しないとスムーズな再生ができない、という音源もないので深入りしない。
  • 機能がまったく割り当てられていないタクトスイッチが一つある。(思いつくオプション機能は、OLEDのコントラスト設定とか、だが)

作成したプログラム(Windows)

  • ソース一式はこちら(VC++ 2019 で開発)。EXEをSDメモリのルートに置き、MP3ファイルを追加した後などにコマンドプロンプトで実行する。
  • 処理内容:ディレクトリ構成ファイル・MP3ファイルリストの作成。ディレクトリ名・ファイル名・曲名のOLED表示イメージの作成。ランダム再生の再生順作成。
  • 曲名については、MP3ファイルのタグ情報から曲名を取得できる場合にはそれを使い、取得できない場合はファイル名そのものを曲名とする。
    (タグ情報から取得できる曲目はときに"アルバム名+曲名"の形式になっていることがある。"アルバム名"の部分は全曲共通なので、その部分を削除して曲名だけにする処理もしている。また、曲名に最初から連番がついている場合とついていない場合がある。ついていない場合だけ連番を付加する。)
  • タグ情報取得のため、libid3tag-0.15.1b と zlib-1.1.4 をリンクしている。どちらもそれぞれに付属のmsvc++用dspファイルでコンパイルできた。
    ただ、libid3tagライブラリについては対象MP3ファイルをオープンするのにfopen関数を使っている。Windowsでロングファイルネームに対応するために_wfopen_s関数を使う処理を追加した。

結果

  • exFATに今回初めて対応したことにより、所有する音源がすべて1枚のメディアに収まるようになった。
MP3プレーヤのページに戻る トップページに戻る