【はじめに】
日頃から、低価格の携帯音楽プレーヤー(ドスパラで購入した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曲ずつギャップなしで分割されている場合
ダブルバッファを採用し曲間になるべくギャップを作らない様にする
A曲記憶機能
◇EEPROM搭載のPICで対応
BGLCD対応
◇EEPROM搭載のPICで対応
【作成方法】
ハードおよび、ソフトは、かの有名な、後閑哲也氏のページを参照し、作成した。
○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カード多重アクセス方法
FSconfig.hのFS_MAX_FILES_OPENが3となっているが、実際は多重アクセス不可となっている。
実際2つ目のファイルを開くと1つ目のファイルにアクセスできなくなる現象に陥る
後半の#define FS_DYNAMIC_MEMを有効にすれば、多重アクセス可能となるので、
#if 0をコメントアウトにすればOK
あとは、ファイルポインタ等の名前をコピーし、NO2等の名前をお尻につけれるだけ
SD同時オープンを行うと必ず、曲再生に間に合わなくなり、無音部分ができてしまうので、
演奏用のファイルをオープンし、曲演奏が開始してから少しした後に次曲のファイルをオープンすれば、
無音部分はなくなる。
演奏中の曲が終了した時に、通常行うファイルクローズとVS1001の停止をやらず、すぐに
2曲目を演奏する(違うビットレートだと演奏できない可能性あり)ことにより
あたかも、連続で演奏しているように聞こえる(曲の先頭にヘッダ部があるのでほんの少しだけ無音部分が
できる対策か次に記載)
◎よりノンストップを目指す(ファイル先頭の無音部分対策)
MP3のファイルをバイナリエディタで確認するとID3タグがある場合は、1200hか1300hから曲が始まっている
事が確認できる(所有しているファイルがそうなだけで、それ以外もあると思う)
IDタグがある場合には、曲が始まっている部分(0xFF,0xFB)にファイルポインタを移動させる。曲が終了後すぐに
曲が始まっている部分から演奏すると、CDでノンストップを聞いているのに近い状態となる。ギャップレスMP3をPCで
流し、一緒にこのプレイヤーで演奏させると、次の曲へのつなぎの部分もぴったりとなる事が確認できました。
◎曲番号記憶
演奏開始してすこし立ってから実施(I2CでPIC18F2550へ転送しEEPROMへ記憶)
◎演奏位置記憶
約1秒おきに実施(I2CでPIC18F2550へ転送しEEPROMへ記憶)
◎曲名表示
演奏開始してすこし立ってから実施(I2CでPIC18F2550へ転送しGLCD表示)
◎音量記憶
ボタン長押し操作でおこなう(I2CでPIC18F2550へ転送しEEPROMへ記憶)
◎曲フォルダ変更
左右ボタン長押し操作でおこなう事により、別の曲フォルダの演奏に移る。
今まで演奏していた曲情報は記憶しているので、曲フォルダ変更でフォルダに
戻ってきた時は、以前演奏していた曲から再生できる。
【これから】
携帯型での作成を目指しましたが手始めに、機能重視の為、ポケットサイズとはなりませんでした
(鞄にいれて持ち歩いているので一応携帯型!?)。
ある程度目処がついたら、ダウンサイジングに挑戦しようと思います。
また、本体のボタンかRS232でのみ操作可能な為、現在遠隔で曲操作可能なように改良中です。
電源周りですが、9Vの電池だとGLCD表示なしでも1時間程しか電池が持たない為、
単三電池を4本使用できる用にボックスを追加しました。
パナソニックのNi-MH電池EVOLTA(1.2V 2000mAh)を使用し
GLCD表示なし状態で8時間は再生できることを確認しました。
ただ、電池ボックスのつくりが悪いのか、振動で電源の瞬断が発生してしまう
ので、対策が必要です。
今後進展があり次第、ページを更新します。