今更な話題ですがw ここ最近ポケットミクをいじっていました。やりたかったことは大体やった感じなので、取りあえずお披露目です。
そもそもポケットミクを買った理由がバラして組み込みでなんか使えないかな、という感じで、たぶんみんなそう思って買ったのだと思いますが(偏見)、基本MIDI楽器なのとUSBデバイスで色々扱いにくかったり、妙なCPUが載ってたりと解析するのも面倒くさいし、音声データが抜けたとしてもそれはそれで他で使うと問題があったりするんで、あんまり流行らなかった感じですね。
というわけで、なんとかコレを正々堂々と電子工作に使えないかってことで、作ったのがコレです。
今回は折角なので概略説明と動作デモを動画にしてみましたので、見てみてください。無駄にフルHDで作ってみました(ぉ
そもそもポケットミクを買った理由がバラして組み込みでなんか使えないかな、という感じで、たぶんみんなそう思って買ったのだと思いますが(偏見)、基本MIDI楽器なのとUSBデバイスで色々扱いにくかったり、妙なCPUが載ってたりと解析するのも面倒くさいし、音声データが抜けたとしてもそれはそれで他で使うと問題があったりするんで、あんまり流行らなかった感じですね。
というわけで、なんとかコレを正々堂々と電子工作に使えないかってことで、作ったのがコレです。
今回は折角なので概略説明と動作デモを動画にしてみましたので、見てみてください。無駄にフルHDで作ってみました(ぉ
あと、録音があまりよくないので、音量小さめになってしまってるんで、うまく聞こえない場合には音量調整願います。
スマホ等向けリンク→ポケットミクをDDミクさんに組み込んでみた
回路図はこんな感じ。秋月のキットを色々組み合わせてる超手抜きです(ぉ
結局のところ、USBのMIDI Classデバイスなのが面倒くさい元なんで、だったらUSBホスト対応のマイコンにMIDI Class対応のファームウェアを乗っけて、そこからシリアルなどの簡易なインターフェイスで制御可能なブリッジを造ってしまおうってことです。今回はどうせならということで、DDミクさんに組み込める程度の小型化をしています。
ただ、どうしても現状は電池が入らなかったので、ボディの外に出しています。スピーカーは一応はいるのですが、音がこもり気味になるので、今のところはこれも外に出しておいてあります。一番問題の電源はワイヤレス給電にでもしようかなーと考えてはいます。受電用のコイルはお尻のところにでもいれておけば、スタンドに送電コイル入れればいけるかも、とか。。
いまのところは動画のようにNXPのCoretex-M3ベースのARMマイコンであるLPC1769のLPCXpresso評価ボードにくっつけてます。mbedでなくコレなのは、DDに仕込むにはこのサイズが限界だからです(ぉ なおポケミク基板はダイヤモンド歯のサーキュラーソー(PCBカッター)で限界まで切り刻んでます。
シリアルはデバッグ用に1つ、Androidなどと接続するためにBluetoothモジュールと接続することを意識しているものを1つ使ってますが、ここから簡単なMMLを入力すると対応するMIDIパケットを生成しUSB経由でポケミクに投げて、自由に発声させることができます。MMLは基本はむかーしのBASICのPLAYコマンドとかで使ったモノを音声対応に拡張した文法でこんな感じ。なお、#の後ろの数値は文字テーブル番号ここで発声する言葉を指定して、あとは音階や音符を指定する感じです。お手軽w
MML,T160V100O5#4E4#71F4#110G1 < これをブリッジ経由で入れるとミクさん声で「おはよー」と言ってくれます
デモではこの数値を実際はAndroidを間にかませて、文字列を自動的にこんなMMLに変換してブリッジへ送信する感じにしています。
ただ、MMLだけですとあまり凝ったことはできませんので、SMF(Standard MIDI Fileformat)ファイルの解析処理を追加して、簡単なAndroid用のMIDI再生機能を付けました。これでMIDIシーケンサーで作ったファイルを簡単にポケミクでリモート再生することができますから、DDミクさんに本格的に歌って貰うことができます。この処理は現状はAndroid側で実際にUSBに転送するレベルのパケットに変換するまで分解しているので、ARMマイコン側ではBluetoothで受信したパケットをそのままUSBバスへ指定された時間通りに垂れ流す処理しかしていませんが、マイコン側で全部やらせることも可能です。ただこういうマイコンはRAMが少ないので(LPC1769では64KB)、ちょっと工夫が必要です。現状のAndroidのソフトではMIDI解析用のクラスを作って、その中でSMFファイルの取り込みし、全トラックの全イベントをArrayListに登録したあとにイベント時間順にソートすれば済むので楽ですが、滅茶苦茶RAMを使います。
でもやってみてわかったのは、ミクさんの声を入れた曲データを作る方が遙かに大変だということです・・・(動画の前奏の声データを作るだけで一日がかり)。トラックのノートに自動的に音声用のシステムエクスルーシブを追加するのは大したことがないのですが、これを自然に聞こえるように調整するのが難しいです。
ちなみにポケミクの音声出力周りの回路はこんな感じです。
ただ、MMLだけですとあまり凝ったことはできませんので、SMF(Standard MIDI Fileformat)ファイルの解析処理を追加して、簡単なAndroid用のMIDI再生機能を付けました。これでMIDIシーケンサーで作ったファイルを簡単にポケミクでリモート再生することができますから、DDミクさんに本格的に歌って貰うことができます。この処理は現状はAndroid側で実際にUSBに転送するレベルのパケットに変換するまで分解しているので、ARMマイコン側ではBluetoothで受信したパケットをそのままUSBバスへ指定された時間通りに垂れ流す処理しかしていませんが、マイコン側で全部やらせることも可能です。ただこういうマイコンはRAMが少ないので(LPC1769では64KB)、ちょっと工夫が必要です。現状のAndroidのソフトではMIDI解析用のクラスを作って、その中でSMFファイルの取り込みし、全トラックの全イベントをArrayListに登録したあとにイベント時間順にソートすれば済むので楽ですが、滅茶苦茶RAMを使います。
でもやってみてわかったのは、ミクさんの声を入れた曲データを作る方が遙かに大変だということです・・・(動画の前奏の声データを作るだけで一日がかり)。トラックのノートに自動的に音声用のシステムエクスルーシブを追加するのは大したことがないのですが、これを自然に聞こえるように調整するのが難しいです。
ちなみにポケミクの音声出力周りの回路はこんな感じです。
スピーカーとライン出力の切り替えはハード的に切り替えているのではなくて、ソフト的にR47につながるポートの電圧をみて切り替えてるようです。このとき、ライン出力になにかさしているとH,ささってないとLになります。ライン出力コネクタに何か挿していても起動時に一瞬スピーカーがなるのはこのせいかもしれません。
ポケミクのラインアウトの回路ではカップリングコンデンサ(C22とC23)がセラコンなんで、コンデンサの特性上、音声信号に歪みを発生させる可能性があります。ここはライン出力を使う場合には、電解コンに置き換えた方がよいかと思います。なお、スピーカーは直接CPUの別ポートからドライブしているみたいです。このハードでカップリングコンデンサの前から信号を抜いて外部アンプに入れているのはそういった理由です。まぁ、音源ソースがそんなにキレイなものではないので、違いは気分程度でしょうがw
詳細はプログラムコードと一緒にそのうちWebページにアップする予定ですが、USBで組み込み系CPUで外部制御できてしまえば、たとえば時計の時報のお知らせにミクさんの声が使えたりと色々ポケットミクにも応用ネタが出てきますので、挑戦してみるとよいでしょう。
ポケミクのラインアウトの回路ではカップリングコンデンサ(C22とC23)がセラコンなんで、コンデンサの特性上、音声信号に歪みを発生させる可能性があります。ここはライン出力を使う場合には、電解コンに置き換えた方がよいかと思います。なお、スピーカーは直接CPUの別ポートからドライブしているみたいです。このハードでカップリングコンデンサの前から信号を抜いて外部アンプに入れているのはそういった理由です。まぁ、音源ソースがそんなにキレイなものではないので、違いは気分程度でしょうがw
詳細はプログラムコードと一緒にそのうちWebページにアップする予定ですが、USBで組み込み系CPUで外部制御できてしまえば、たとえば時計の時報のお知らせにミクさんの声が使えたりと色々ポケットミクにも応用ネタが出てきますので、挑戦してみるとよいでしょう。