● 実験テーマ19
「VS1053b(MIDIデコーダ内臓IC)による、MIDI音源実験日記」
■ 2012.09.03
・いろいろ出来るみたいだが、最終的には、PIC24Fトレーニング基板を使い、SDカード上にセーブした
*.MIDファイルを再生出来るようにしたい。
■ 2012.09.04
・またまた、VS1053bのハンダ付が問題
パッケージ:LQFP-48(0.5mmピッチ)しかバリエーションがなく、どうしたものか?
以前、オシロV2で、PIC24HJ64GP206(GFP64)を、ダイセン電子のDIP変換基板にハンダ付する作業を、
マルツに依頼した時は、実装料として、4200円も取られた・・・
金欠の私としては、何回も依頼というわけにはいかない。
いろいろ悩んで内に、WEB通販サイトの「SWITCH
SCIENCE社(製造元: Sparkfun)で、
「VS1053b搭載MP3/MIDIデコーダボード」という部品実装済み(コネクタ以外)のボードが、2495円
(しかも送料が180円と安価)で売られていることを知る。
VS1053b以外のパーツも全て、SMDパッケージのしかも極小サイズ物を使用しており、サイズも約36*45mm
と小さい。
■ 2012.09.05
・Sparkfunの、VS1053bボードの回路図は、HP上にEAGLEファイルで、公開されているが、直感的に
解りにくいので、自分用の回路図を水魚堂のCADで作成することにした。
→ このボードは単独で、リアルタイムMIDIの、GM音源としても使えるように、その設定入力用に、全GPIO入力
を引き出しているが今回は、SPI通信を使った、SDカード内の、MIDI(SMF0)ファイルを読出し、
音楽データを、VS1053bに転送し、エンコード再生するモード
のみの実験とする。
・夕刻、ネットで当該ボードを注文済
■ 2012.09.06
・水魚堂CADにて、自分用の回路図作成完了
※ 自分用の、「VS1053b搭載MP3/MIDIデコーダボード」の、
回路図はこちらからどうぞ → 「VS1053B_MIDI評価基板回路図」
■ 2012.09.07
・PIC24Fトレーニング基板の、SPIコネクタに接続して実験が出来るように
以前の、VS1011eの時と同じような、VS1053b用の子基板
(LEFT, RIGHT, GBUFの先にステレオ・ミニジャック、必要なSPI信号と、XRESETを引出したコネクタを追加
した簡単な基板)を作って実験しようと思い、必要なパーツを、マルツに注文した。
・部品が到着するまで時間があるので、VS1011eと、VS1053bの、ソフト上でのアクセス方法の違いは何かを
調べようと思う → WEB検索したが、明確に、その違いを表にまとめた物は見当たらなかった。
→ 日本語訳のマニュアルが、WEB上に公開されているので、自力で調べてみたが、ざっと見たところは、
そんなに違うところは無さそうである。
■ 2012.09.08
・とりあえず、Cソースを準備しようと、書き始める。
以前の、VS1101bの時の、ソースを使って部分的に、ちょっとの修正をしただけであるが・・・
<修正箇所>
@ DREQラインのプルアップを、PIC内部プルアップ設定に変更
A PHONE出力を、固定レベル出力(ヘッドフォン出力
or ライン出力)にするため、51Ωの抵抗を入れて
レベル調整しているのでVS内部の、VR設定値が適当かどうか確認して適当でなければ修正
→ これは、適当な値になっていたので、修正は@だけである。
■ 2012.09.10
・部品が届き、簡単な実験基板を製作
VS1053bボードは、メール便にて、ドキュメント類、一切無しの基板のみで届いた。
・プロジェクトを作成し、コンパイルOK
・いよいよ実験開始。まずはダメ
@ VS1053bボード上のLEDは点灯している。VCC= 5.10V確認
A 電源ON時、SIN TESTを経由してから、SDカード挿入待ちにしてみたが
→ SIN_5kHz音鳴らず。
ただ1回だけ鳴ったことを確認
また、カード挿入待ちの、赤LEDは点滅しており、ソフトは動いているようである。
→ やはりこの原因は、前回の、VS1011eの時と同じでSPI
I/Fの、データに対するクロックのセットアップマージンが、
PIC側(MPU)の仕様上、満足されてないことによるものだった。
→ 以前と同じ対策を取った。
SCLラインに、100pのCを追加
これで毎回、鳴るようになった。
・また、MP3とWAVファイルの再生も問題ない。
この2つのファイルの再生に関しては、VS1011eの時のソフトのままでも、SKIP動作を含め、動くようである。
・いよいよ、MIDIファイルの再生を試してみる。
以前実験に使っていた、64MのSDカードを、MIDIデータ専用として次の2つのMIDIファイルを入れてみた。
@ WAVE.MID: だいぶ前にWEB購入した有料(確か200円位)のMIDIデータ
A IPANEMA.MID: 同上(ただ、フォーマットNoは不明)
(2曲とも、ボサノバの名曲です)
→ 2曲ともに、そこそこ聞けるレベルで、再生ノイズが極めて少ない。
(データシート上でも、VS1011eに比べ、SNは改善されているようである。)
ただ、ギターの音色が本来の音色マップにある音とは違う音で聞こえるような気もするが・・・・
→ ここで、おかしい点発覚
※ 次の曲への連続再生はOKなのだが、再生途中で、SKIP_SWを押しても、次の曲へスキップしない。
・VS1053bでサポートされている、MIDIファイル・フォーマットを再確認してみた。
→ GMか、SP-MIDIフォーマット0と、マニュアルには書かれていた。
ところで、SPとはなんぞや???
聞きなれない用語だが、WEBで調べると、Scalable
Poiyphonyという、いわゆるモバイル着メロ(携帯向け)の
MIDIフォーマットの規格らしいことが判ったが・・・・・
それ以上、詳しいことはよく解らない。
→ いずれにしても、スタンダードMIDIフォーマット0(SMF0)には対応すると思われるので、試しに、自作の、
CakeWalkファイルを、SMF0に変換してセーブしたMIDIファイルを再生することにした。
次の2曲を用意
@ PERGOLE2.MID: ペルゴレージ_コンチェルト2楽章 (ファイル容量:8KB)
A PERGOLE3.MID: ペルゴレージ_コンチェルト3楽章 (ファイル容量:15KB)
(MIDIファイルは、ファイル容量が極めて少ないのが良いね!!)
→ このファイルでも、再生途中で、SKIP_SWを押しても次の曲へスキップしない。
・トレーニング基板に、RS232Cデバッグ機能も組込み済なので、PC_端末(TERAターム)に繋いで、SDから読込んだ
ファイル名を確認してみると、ちゃんと「*.MID」になっている。
・VS1053bのマニュアルに、次のような記述あり。
<ソフトウエア・リセットについて>
※ 以前の、VS10XXチップとは異なり、曲間でのソフトウエア・リセットは推奨されない。
それは、低いサンプルレートまたは、ビットレートのファイルでも確実に最後まで再生出来るようにするため・・・
※ ところで、VS1011のライブラリ関数は、後閑氏の作成しされたものを、そのまま使わさせて頂いている。
現在は、通常の再生に於いても、1曲目のファイル転送が終了した後に、PlayEnd関数を実行しており、
その中で、ソフトウエア・リセット(SM_RESET)を行っている。
現状、WAV, MP3ファイルについては、SKIP動作は上手くいっているが、MIDIファイルはダメ
・明日、PlayEnd関数のお尻に入っている、SM_RESET部をコメント・アウトして試してみる。
■ 2012.09.11
・曲間でのソフトウエア・リセットを、やめてみる。
→ WAV, MP3ファイルの、SKIP再生は、これでもOKを確認
→ MIDIファイルの、SKIPはこれでも効かない。
ただ、通常の連続再生はOK
<原因調査>
・1つ判ったこと
WAV, MP3ファイルの場合
再生中に、SKIP SWを押すと、CN割込みの、スイッチ検知ルーチンにジャンプしてくるが、
MIDIファイルの場合は、ジャンプしてこない。
→ 具体的には、次のソースの通り確認
CN割込み関数の頭
if (!PORTBbits.RB0) { //
SW1 On Then NEXT File
LATAbits.LATA4 = 0; // GREEN_LED ON
while(1); // SWセンスしたら、その時点で緑LEDを点灯することで確認
FSfclose(pfile);
// Forced Close Current File
PlayEnd(); // Dispose of Play End
・
・
・
→ この原因を察するに、たぶん以下のことが関係していると思われる。
→ ポイントは、SPIによる、音楽データ転送中は、CN割込みの影響を避けるため、CN割込みを禁止している点である。
当然この期間中、SWセンスはしないことになる。
また、CN割込みを許可しているのは、規定バイト数:256転送終了後から、
次のブロック転送前までの間だけである。
※ WAV,MP3ファイルの場合、ファイル容量が、数M〜 数10M(3分〜5分位の楽曲の場合)と、転送バイト数に比べて
十分大きいため頻繁に、SWセンスのチャンスがあるのに対しMIDIファイルのそれは、数Kバイト(8KB〜30KB位)
しかないので極端に、SWセンスの、チャンス(確率)が低下する。
→ VS1053bの、マニュアルによると転送の最少バイト数は、32バイトということなので、32バイト転送にして、
SWセンス確率を上げるか?
→ こようにソフトを修正し、やってみると確かに改善された。
ただこれでも、確実に一回の、SW押しで必ずセンスするわけでなく3回に1回位の割合でセンスする感じ。
SWを少し長押しすれば、必ずセンスする。
→ ところが、CN割込みの先頭までは、ジャンプするのだが、PlayEnd()の後までジャンプしてこない。
その手前の、FSfclose(pfile)の所まではきていてファイル・クローズはしているようである。
→ ということは、PlayEnd()の、どこかでループしているのか?
・ここで、VS1011eとの違いを1つ見付けた。
それは、VS1053bの、SCI_MODEレジスタには、SM_CANSELビット(b3)というビットがあり、これを、'1'にセットすると
「現ファイルのデコードが中断される」というもの。
→ マニュアルに記載の、9.5.1
ファイル全体を再生する(手順)に、このビットのセットが出てくる。
またファイル転送の終了を確実にするための、'0'送出の方法も、VS1011eとは異なっているので現関数「PlayEnd()」を、
VS1053b用に書換えてみようと思う。
下図に、そのフロー案を示す。
■ 2012.09.12
・昨日考えたフロー案の通りソフトを修正しチェックを行った。
今、転送は32Byte単位にしてある。
<結果>
@ WAVとMP3ファイルは正常に、スキップ出来ている。
A MIDIファイルは、相変わらずスキップしない。
→ 未確認だが、CN割込みの、PlayEnd関数処理内の、SM_CANCELビットが、'0'にクリアされないで、ループしている
ことが考えられる。
→ 対策として、32byte * 64回= 2048byteの、'0'送出でも、SM_CANCELビットが、クリアされない場合は、
ソフト・リセットをする(極まれと書いてあるが・・・)を追加してみる。
→ これでも、MIDIファイルはスキップしない。
・さらに原因究明
@ SKIP SWを押すとCN割込みが入り、最初のカレント・ファイルの、クローズ処理までは進んでいるが、
次の、PlayEnd(); で止まってしまっている。
→ PlayEnd関数、頭の2052個の、'0'送信までも来ていない。
SendData(0);の中で送信前に、DREQを見ているが、どうも、MIDIファイルの場合の限り、
while(!MP3_DREQ_IO);
のところで、DREQが、'1'にならず、ここでループしている模様
A マニュアルによると、連続(通常)再生の場合の、PlayEnd処理と、再生途中で再生を中断し、次の曲へジャンプする時の
PlayEnd処理は、異なるようなので、下図のフロー案の通り変更してみる。
→ 関数名を「PlaySkip()」とした。
■ 2012.09.13
・PlaySkip関数デバッグ開始
次の、コンパイル・ワーニング発生
「implicit decriaration of function PlaySkip」
(暗黙の、宣言)
→ メインソース中で行っている、プロトタイプ宣言に、この関数を追加することで解決
・一応、32byte単位の転送設定で、MIDIの場合
少しSKIP_SWを長押しの条件付きで、再生途中のSKIPがOK
になった。
もちろん、WAVE、MP3に関しては全く問題なし。
■ 2012.09.14
・満足には、ほど遠いが、ほぼ形になってきた。
今回の、使用目的は、MIDIによるピアノ伴奏を小さい音量(アパートで使うので・・)で、小型SP(小坊主:100mW)から鳴らし
それに合わせフルートの練習をすることである。(アパートなので大きな音で吹けないが、リズム取りと指等の練習にはなる)
・そこで、現在の実験基板に、簡単なパワーアンプを追加実装することにした。
パワーアンプICには、JRC社の、「NJM2073D」を使用し、入力に音量調整VRを付けることにした。
・また、これまで実験ということで置き場所のスペース的なことは、一切気にしないで進めてきたので、平面配置になっていて、
場所を食い、実際には使いにくい状態になっているので、とりあえず、今の基板構成のまま、簡易的に2階建て構造にして
みようと思う。
■ 2012.09.19
・PIC24Fトレーニング基板の、SPIコネクタと、VS1053b実験基板の、SPIコネクタをケーブル接続にしてみました。
次の写真を参照してください。
・パワーアンプ部の特記事項
@ まず気になったのが、無信号時のホワイトノイズが多いことである。
少なくとも、スピーカーから小音量で聞く分には、そんなに気にならないが、ヘッド・フォンではとても気になって
聞く気になれず。
→ データシートには、負帰還を深く掛けて、電圧ゲインを落として使う例も載っていたが、定数設定が結構シビア
そうな感じだったのと、WEBでの評価も、負帰還を掛けても、ホワイトノイズは消えるわけではない等の記述も
あったので、今回は深追いせず、小型SPでのみの使用に限って使うことにする。
ヘッドホンで聞くには、VS1053bのオーディオ出力(L+R,
GBUF) からのジャック出力を使えばよい。
■ 2012.09.21
・後追いだが、水魚堂にて、パワーアンプを追加した、VS1053b実験基板の、回路図を作成した。
回路図はこちらからどうぞ → 「VS1053b実験基板回路図」
・とりあえず、2階建て構造にした基板は、1階部分を、PIC24Fトレーニング基板(ユニバーサル)で代用しているため、
横に無駄なスペースが飛び出した形になっていて、まだまだ使い易いとは言えない状態である。
→ ここに、前作(VS1011e_MP3プレーヤ)で、EAGLEでパターン化した「PIC24F
MAIN BOARD」を、利用すれば、
VS1053b実験基板(ユニバーサル)と、殆ど同サイズ(若干大き目)なので、2階建て構造で省スペース化できる
ので使い易くなるのではと思いついた。
→ 必要な部品リストを作成し、秋月とマルツにそれぞれ手配した。
(今回は、RS232C部、入力アンプ部及び、SW入力のワンショットマルチは、必要ないので、かなりすかすかの、
実装状態になる。)
■ 2012.09.22
・部品が届くまで時間があるので、この間に2階建て構造に必要な、補助ステー金具を、2種類、作ることにした。
以前と同様に、古いジャンク・アンプの、ヒートシンク板の、2tアルミ板を利用し、加工を行った。
■ 2012.09.24
・部品が届いたので、早速製作に入った 部品点数が、少ないので実装は短時間で終わったが、若干のストラップ、
カット修正及び、SPI接続ケーブルの製作があったので、結局、2時間ほど掛ってしまった。
・今回は、デバッグ用の、RS232Cによる、ファイル名表示機能は使わないので、その部分はコメントアウトし再コンパイル
HEXファイルのインポート〜 ROM焼きまで順調に完了
動作チェックも一発でOK
→ これで、暫く使ってみることにする。
<最終ソース及び、ヘッダーファイル>
・こちらからどうぞ→ easy_mp3_and_midi_player_24f.c
VS1011.C
VS1011.H
尚、「VS1011.C」のライブラリは、後閑氏が作成されたもので、一部これに私が
VS1053用の関数を追加しました。ファイル名は、そのまま、VS1011.Cとしました。
また、日本語コメントを、英文コメント(単語を並べただけですが・・)に直しました。
<MIDIファイル再生サンプル: こんな感じで聞こえます。>
・こちらからどうぞ→ SONATA_PER_ARPEGGIONE_VS1053B_MIDI_SAMPLE.mp3
※ Cakewalk Home Studio 9+SD-70で、MIDIデータの打込みを行い
それを、SMF0で保存、さらにそれを、スピーカから鳴らし、ワンポイント
ステレオ・マイクで、MDに録音
これを、SC-D70に取込み、MP3にミックスダウンしました。
※ 曲は、シューベルトの、「アルペジオーネ・ソナタ」で
Flute+Piano版です。
冒頭から30小節のみの、録音です。
全曲は、「クラシック作品の部屋」に、アップしました。
← 実験テーマ1に戻る TOP PAGEに戻る 実験テーマ20へ →