VS1053bとXBeeを使って無線MIDI音源を作る
VLSI SolutionのオーディオIC、VS1053(http://www.vlsi.fi/en/products/vs1053.html)を扱う機会がありましたので、忘れないうちにその使い方をまとめておきたいと思いエントリーしました。
VS1053とは
秋月で700円で購入できるオーディオ関係の機能を載せたIC(http://akizukidenshi.com/catalog/g/gI-02407/)です。主な機能としては、
- Ogg Vorbisデコード
- MP3デコード
- AACデコード
- WMAデコード
- WAV再生
- リアルタイムMIDIデコード
- オーディオDAC
- ヘッドホンアンプ内蔵
- 音場拡大エフェクト
などがあるようです。これだけの機能がこのような小さなICで実現されていて、かつ700円という低価格さです。
今回はVS1053のリアルタイムMIDIモードを使いました。MIDIの規格に基づいてシリアル通信でデータを送ってあげるとリアルタイムで発音するMIDI音源として使用することができます。最大同時発音数が64(※ただしクロック周波数やエフェクトの有無で変化)なのでそこそこ鳴らせそうです。
下準備
ICはLQFPパッケージで販売されておりこのままでは扱いづらいので2.54mmピッチへの変換基板(http://akizukidenshi.com/catalog/g/gP-03782/)も一緒に購入し、ユニバーサル基板で試作できるようにしました。
試作回路
データシートに基づいてIC周りに必要な回路をユニバーサル基板上で構成しました。その際、以下のページで詳細な解説がされていましたので参考にさせて頂きました。
- VS1053Bで遊ぶ(http://www016.upp.so-net.ne.jp/taka/VS1053B/VS1053B.htm)
- VS1053b 日本語データシート私家版(http://www.chiaki.cc/Timpy/vs1053b_jp.html)
- VS1053b Datasheet Version 1.10(http://www.vlsi.fi/fileadmin/datasheets/vlsi/vs1053.pdf)
GPIOの0〜7のH/Lで動作モードを指定するようで、リアルタイムMIDIモードで動作させるためにGPIO1のみLとし、残りはHとなるよう接続しました。
他のI/Oピンは以下のように接続しました。
ピン番号 | ピン種類 | 機能 | 処理 |
---|---|---|---|
8 | Digital Out | DREQ | 未接続 |
13 | Digital In | XDCS / BSYNC | H |
23 | Digital In | XCS | L |
28 | Digital In | SCLK | L |
29 | Digital In | SI | L |
30 | Digital Out | SO | 未接続 |
電源はアナログ電源に2.8〜3.6V、ディジタル電源に1.7〜1.85V、I/O電源に1.8〜3.6Vが必要なのでアナログ電源とI/O電源をまとめて3.3V、ディジタル電源を1.8Vにすることにしました。
外部からの供給電源は3.3Vのみとし、回路内での3.3V -> 1.8Vの降圧に三端子レギュレータTA48018Fを使用しています。
クロックは外部よりセラロックで12MHzを入力しています。
さらに今回はMIDIデータを無線で送受信する必要があったため、無線部分にはXBee(シリーズ2 : ZigBee版)を使いました。
左上のユニバーサル基板がVS1053と必要なコンデンサ等の部品です。その右に8ピンのPSoC(CY8C24123)があり、このPSoCはXBeeで受信したデータをMIDIの規格である31.25kbpsに変換してVS1053へ送っています。左下のXBeeが受信の役割であり、そこからPSoCへ19,200bpsで送られてきます。
右のXBeeはパソコンに接続され、パソコンで再生しているMIDIデータをそのまま送っています。
電源はACアダプタより3.3Vを供給し、音声出力はステレオでアクティブスピーカに接続しました。
PSoCは内蔵24MHz発振で動作させています。プログラムは以下のように非常に単純なものです。
#include <m8c.h> #include "PSoCAPI.h" void main(void) { TX8_1_Start(TX8_PARITY_NONE); // 送信モジュール(PSoC -> VS1053)スタート RX8_1_Start(RX8_PARITY_NONE); // 受信モジュール(XBee -> PSoC)スタート while(1) { TX8_1_PutChar(RX8_1_cGetChar()); // データを受信したら送信モジュールからそのまま送信 } }
この回路でテストしてみたところ心配していた遅延やデータの欠落も無く、テストに使用したいくつかの10chほどの曲のデータは全て正常に再生されました。
プリント基板製作
試作回路で動作を確認できたのでプリント基板を製作しました。
ほとんどの部品を表面実装部品にして省スペース化を図っています。
一部配線ミスがありましたが、パターンカットとジャンパ線での接続で解決しました。全体の動作も問題ありませんでした。
バッテリー駆動
回路が完成したところで、完全な無線状態で使用するためにバッテリーでの駆動を検討しました。
はじめにアルカリ単4電池2本で試してみたところ10分程度しか持ちませんでした。それでいて電池の容積も大きいため、今回は小型で大容量なLiPoバッテリー(リチウムイオンポリマーバッテリー)を使用しました。
スイッチサイエンスでsparkfunの110mAhバッテリー(http://www.switch-science.com/products/detail.php?product_id=157)とUSB充電器(http://www.switch-science.com/products/detail.php?product_id=550)を購入しました。
※この充電器は購入状態では500mA仕様となっているので100mAhのバッテリーを充電するには改造が必要です。
LiPoバッテリーは出力電圧が3.7Vとなっていますが実際には4.2V〜2.7V程度と開きがあるので三端子レギュレータを入れて3.3Vに降圧しました。
このバッテリーを使用した結果、満充電状態で約50分間連続動作することを確認しました。この時の回路の消費電流は平均67mA程度でした。
また20mAh(http://www.switch-science.com/products/detail.php?product_id=479)のバッテリーでも試した結果、約15分間連続で動作しました。
まとめ
無線通信なのでデータの欠落や遅延を心配していましたが、MIDIキーボードを接続して演奏しても遅延やデータ抜けは全く気になりませんでした。
VS1053は安価なモジュールなのでそこまで性能は高くないのかな?と思っていましたが、同時発音数や遅延等が気になるようなことは無くちゃんと鳴らしてくれました。ただやはり音は載せている波形が貧弱なのかWindowsに標準搭載されているMicrosoft GS Wavetable SW Synthより少し劣るような感じです。
また48ピンのQFPパッケージであり、IC周辺に多少部品を追加する必要があり、さらに電源も複数用意しないといけないため取り扱いは少し面倒だと感じました。
しかしこれだけ小型なのにも関わらず立派なMIDI音源として使用できるので、いろいろなものに組み込んだりと様々な場面での利用価値があるのではないかと思います。