【はじめに】
日頃から、低価格の携帯音楽プレーヤー(ドスパラで購入した2台)を使用していますが、
曲間なし(ギャップなし)で作成したMP3(ダンス系のノンストップ)を再生すると必ず曲と
曲の間に無音部分ができてしまいます。仕方がないので、1枚のCDを丸ごと1つのM
P3として聞いていましたが、途中まで聞き、電源を落とすと、またはじめからしか再生さ
れないので非常に不便だと感じました。
そんな中、ついに2台目のMP3プレーヤーも故障してしまいました。
どうせなら、ノンストップに対応した使いやすいMP3プレーヤーを作ってしまおうと考えた
のが、手作りノンストップMP3プレーヤの始まりです。
【ノンストップの機能について】
ノンストップCDをMP3に変換する場合は、2種類の状態が考えられる
@CD1枚分が1曲に結合する場合
A1曲ずつギャップなしで分割する場合
@は、曲間が0だが、電源ON時に曲を途中から聴くことができない為、不便である。
Aは、@の問題はないが、演奏時に曲間に必ず大きな無演奏部分が生じてしまう
@Aに対応した使いやすいノンストップMP3プレーヤーを作成することが目的である
【全体の機能について】
@2種類のノンストップミュージックへの対応
◇CD1枚分が1曲に結合されている場合
約1秒おきファイルのポインタを参照し、他PICのEEPROMへポインタ情報を記憶
電源ON時に、他PICから曲再生情報を貰い、曲長が長い場合には、途中から演奏する
◇1曲ずつギャップなしで分割されている場合
ダブルバッファを採用し曲間になるべくギャップを作らない様にする
※ディレクトリ検索用とFONT検索用で最大4多重でファイルアクセス可能とした
A曲記憶機能
◇EEPROM搭載のPICで対応
BGLCD対応
EEPROM搭載のPICで対応
◇漢字曲名表示対応(FONTはSDカードより読出)
◇タグ曲名スクロール対応
画面外にはみ出した曲名をスクロールさせ表示する(30文字まで対応)
C階層ディレクトリMP3自動検索再生機能
◇4階層まで自動検索を行う
DSDカード読込み日本語ファイル名・日本語フォルダ名対応
◇対応方法は後半に記載
【作成方法】
ハードおよび、ソフトは、かの有名な、後閑哲也氏のpicfunを参照し、作成した。
○MP3再生および、SDカード通信
PIC24FJ64GA002
○曲情報記憶および、GLCD制御
PIC18F2550
○PIC間通信はI2Cで実施
○変換基板以外はユニバーサル基板を使用
左側がSDカード、右側がMP3デコーダIC(VS1011e)
【改良点】
◎演奏速度の調整
VS1011.c
VS1011_Init()内の
/* クロックダブラ設定 */
val = 12288 / 2 + 0x8000;
から
val = 12288 / 2 + 0x8000 - 144;
へ変更した(−144というのが微調整値)
これは、実際プレーヤーとPCで同一の曲を同時に再生し確認する。
ずれていれば、数値を変え、曲が一致するまで繰り返す
(クリスタル等の使用部品により速度が異なるのかもしれない)
◎PIC18F2550の使用方法
メモリの都合でGLCD用フォントがメモリに乗らないのでROM上記述した(英数フォントのみ)
なお、SDから直接フォントを読み出す方法も検討したが、同時読み込みや書き込みを行うと
演奏用の転送が間に合わず、無音部分ができてしまう為、ノンストップでは未対応。
ノンストップでは無い曲の場合に、SDカードからTAG情報とFONT情報を読出し、
PIC18F2550へ転送し、表示させる
◎SDカード多重アクセス方法
FSconfig.hのFS_MAX_FILES_OPENが3となっているが、実際は多重アクセス不可となっている。
実際2つ目のファイルを開くと1つ目のファイルにアクセスできなくなる現象に陥る
後半の#define FS_DYNAMIC_MEMを有効にすれば、多重アクセス可能となるので、
#if 0をコメントアウトにすればOK
あとは、ファイルポインタ等の名前をコピーし、NO2等の名前をお尻につけれるだけ
SD同時オープンを行うと必ず、曲再生に間に合わなくなり、無音部分ができてしまうので、
演奏用のファイルをオープンし、曲演奏が開始してから少しした後に次曲のファイルをオープンすれば、
無音部分はなくなる。
演奏中の曲が終了した時に、通常行うファイルクローズとVS1001の停止をやらず、すぐに
2曲目を演奏する(違うビットレートだと演奏できない可能性あり)ことにより
あたかも、連続で演奏しているように聞こえる(曲の先頭にヘッダ部があるのでほんの少しだけ無音部分が
できる対策か次に記載)
◎SDカード日本語ファイル・日本語ディレクトリアクセス方法
picfunからダウンロードしたものは、ホームページに記載がある通り、日本語ファイル名が扱えない事に
なっていますが、無理矢理!?対応する方法があります。しかも簡単にできます。調査に半月ほど費や
しましたが…
その方法は、
FSIO.cの ValidateChars() 内の
FileName[index] = '_';が2箇所あるので、2箇所ともコメントアウトすればアクセス可能になります。
FATにアクセスする仕様?に違反した使用方法の可能性があるので、最悪SDカードのファイルが壊れ
ても当方は責任を取れませんので、実施する場合は、各自の責任でお願いします。念の為、SDカードデ
ータをバックアップしてから実施した方が良いかもしれませんね。また、読込みしか確認していないので、
書込みがどうなるのかわかりません。
◎巨大なMP3ファイルにアクセスする方法
100MBを超えるような(実際にどれくらいアクセス可能か不明)MP3ファイルにアクセスすると、途中で
エラーになり、継続して読み出すことができない現象が発生します(これはバグ?)
FSIO.cのFILEget_next_cluster()内の disk->maxclsのmaxclsに+10することにより
巨大なファイルにアクセスが可能になります+1でどれくらい増える不明ですが。こちらも、上記と同様で
仕様違反の可能性があるので、最悪SDカードデータが破壊される可能性があるので、実施する場合は、
各自の責任でお願いします。
◎よりノンストップを目指す(ファイル先頭の無音部分対策)
MP3のファイルをバイナリエディタで確認するとID3タグがある場合は、1200hか1300hから曲が始まっている
事が確認できる(所有しているファイルがそうなだけで、それ以外もあると思う)
IDタグがある場合には、曲が始まっている部分(0xFF,0xFB)にファイルポインタを移動させる。曲が終了後すぐに
曲が始まっている部分から演奏すると、CDでノンストップを聞いているのに近い状態となる。ギャップレスMP3を
PCで流し、一緒にこのプレイヤーで演奏させると、次の曲へのつなぎの部分もぴったりとなる事が確認できました。
◎曲番号記憶
演奏開始してすこし立ってから実施(I2CでPIC18F2550へ転送しEEPROMへ記憶)
◎演奏位置記憶
約1秒おきに実施(I2CでPIC18F2550へ転送しEEPROMへ記憶)
◎曲ファイル名表示
演奏開始してすこし立ってから実施(I2CでPIC18F2550へ転送しGLCD表示)
◎TAG曲名表示(11文字以上は、スクロールさせ表示させる)
アーティスト名と曲名をMP3ファイルから読出し、その情報を元にSDカードにあらかじめ格納したFONT情報を
読出す。I2CでPIC18F2550へ転送しGLCD表示させる。10文字まではそのまま表示し、それ以上はスクロール
させる。実際の表示ですが、線画方法に問題があるのかもしれませんが、どうも液晶パネルの反応速度が遅い
ようで、スクロールさせると文字がぼやけてしまうので、移動速度を遅くすれば直るのかもしれません。
◎音量記憶
ボタン長押し操作でおこなう(I2CでPIC18F2550へ転送しEEPROMへ記憶)
◎曲フォルダ変更
左右ボタン長押し操作でおこなう事により、別の曲フォルダの演奏に移る。
今まで演奏していた曲情報は記憶しているので、曲フォルダ変更でフォルダに
戻ってきた時は、以前演奏していた曲から再生できる。
【これから】
携帯型での作成を目指しましたが手始めに、機能重視の為、ポケットサイズとはなりませんでした
(鞄にいれて持ち歩いているので一応携帯型!?)。
ある程度目処がついたら、ダウンサイジングに挑戦しようと思います。
また、本体のボタンかRS232でのみ操作可能な為、現在遠隔で曲操作可能なように改良中です。
電源周りですが、9Vの電池だとGLCD表示なしでも1時間程しか電池が持たない為、
単三電池を4本使用できる用にボックスを追加しました。
パナソニックのNi-MH電池EVOLTA(1.2V 2000mAh)を使用し
GLCD表示なし状態で8時間は再生できることを確認しました。
ただ、電池ボックスのつくりが悪いのか、振動で電源の瞬断が発生してしまう
ので、対策が必要です。
今後進展があり次第、ページを更新します。