VS1003ボードでMIDIファイルを再生する


R5.1.13 完結品

 結局、大穴開けました(^^)/ ぎりぎり入る大きさのスピーカーが音量豊かだったので、スタックさせることにした。

こんな感じにMIDIが鳴ります。

 モーツァルトのピアノソナタが気に入ったので、モーツァルト専用のスケッチにした。作曲者別のスケッチにしようかと思う。

 MIDIファイルを読み込むのにこんなスケッチでも良かった。読み込む速さは同じだったけど(^^;)

  while (f.available()) {
   int length = f.available();
   http://f.read(buffer, length);
  }
  f.close();


R5.1.5 ようやくSDのMIDIファイルを読めた

 ようやくSD内のMIDIファイルを読むことができた。できてしまえば何のことはなかった(^^;) いろんな難しいことを考えてしまっていた。バイナリーなMIDIファイルのデータをひとつずつ取り出して、MIDIの文法に従いVS1003ボードに送るということは正道なんだろうけど無理。一つの市販ソフトを作るようなことじゃないかな。止めた。結果、MIDI文法を勉強することから逃れられた(^^)

 数日前に、デコードしたファイルを再生したときのように、16進データを送ってやればVS1003がやってくれるんじゃないか? どこかのサイトでそんな発言を見た! ということで、

  1. まずMIDIデータを入れるバッファーを用意する。 unsigned char buf[32768*2];  私の環境の場合100640バイトが限界のようなので、そこまで大きくしてもいいのだろうが、64の倍数あたりで、適当な 32768*2 にしてみた。32786バイトにして曲を読み込んだらリセットしたので、2倍にしただけ。
  2. ファイルをオープン File f = SD.open("/mid/Ballade1.mid"); 
  3. サイズを調べておく midiSize = f.size();
  4. データを1バイトずつ読み込み、bufferに入れる。(1バイトずつなので処理が遅い 他の方法があると思うけど )
     int ct = 0 ;
     while (f.available()) {
      buf[ct] = f.read() ;
      ct = ct + 1 ;
     }
     f.close(); ここで、ファイルをクローズする。
  5. player.playChunk(buf,midiSize);で鳴った(^^)/ 
 M時間がかかった(^^;) SDカード内のMIDIファイルをすべてFORMAT0に変換しておかないと、鳴らない(^^;)


R5.1.4 スピーカを更新してみた

 共鳴箱を使うといいかも(^^;) こんな感じ。裏側はこうなってます(^^) もうちょっと大きなスピーカを入手しないとな。


R5.1.3 MIDIを演奏できた!

 スピーカの大きさに拘らなければ、それなりの音で聞ける(^^)/ Φ40mmほどのスピーカ使えば、左下のボトムケースでスタックできそう。今のところSDカードからの読み込みが不可だ。こんな感じ

 M5Stackで音楽しようとすると、柄が大きくなりますね(^^;) VS1003ボードをスタックした右側のM5Stackでの16進デコーダしたMIDI(正しい言い方かな?)の演奏は、MIDIファイルサイズ自体が小さいので余裕で6曲入りました(^^)/ 限界に挑戦してみようか。

 #include "campanella.h"でスケッチに入れるわけだが、全く入れない時には、スケッチが393805バイト(18%)グローバル変数が23872バイト(7%)使用。15曲入れた時にはスケッチが471797バイト(22%)グローバル変数が101472バイト(30%)使用。曲数を増やしても、この値は変わらないようだ。

 しかし、いくらでも曲を挿入できるという都合の良いことはなかった(^^;) region `dram0_0_seg' overflowed by 2112 bytesなんてのが出てきてしまった。どうやらMIDIファイルの合計が私の環境の場合100640バイトが限界のようだ。


R5.1.1 MIDIを演奏できた!

 baldramさんのESP_VS1053_Libraryの Mp3PlayerDemo.inoを使い、16進にデコードしたMIDIを同フォルダに入れ、midiだけどplayer.switchToMp3Modeをそのまま使う! このファイル、音が多いので追いついていない(^^;) VS1003のxrstにM5StackのENに接続して、漸くMIDI奏鳴(^^)/ こんな感じ

 FORMAT0のMIDIファイル(念のためにスコアメーカーで書き換えた)を用意して、たなかまさゆきさんのlang-shipというサイトでTools>ファイルデータ変換を使わせていただいて、16進にデコードしたファイルに変換する。これを unsigned char adagio[3149] PROGMEM = { }; にいれたものをadagio.hとしてスケッチと同じフォルダに入れる。

 しかし、これでは新しいMIDIファイルに交換するたび、いちいちスケッチを再コンパイルしなければならない。不便なので、SDカード内のMIDIファイルを再生したい。これが難しいのだが、挑戦は続く。


R4.12.25 wedradioは動作

 もう一枚のVS1003ボードを使い、XRSTをM5StackのENにつないでwedradioを動作させた。音が出ることを確認できたので(音が出なかったので、壊れてる?なんて思った)これからいろんなライブラリを使って、mp3やmidiファイルの音出しを試してみようかと(^^;)

 diyelectromusicのKevinさんが GitHubに公開している膨大なサンプルからArduinoMIDIVS10xxSynthを選択。ピンを書き換えてコンパイルしたところ難なく書き込み。VS1003が鳴りました! ありがとうございます。しかし、スケッチを解読できない(^^;) 

こんな感じ

 ただ、これだと本当にMIDIの知識でひとつずつ音出しをしないと無理のようだ。(^^;)


R4.12.23 ENって何だ??

 悩ましいのだけれど、VS1003ボードを扱うライブラリには、ボードのXRSTをM5StackのENにつなぐものとG2をはじめとして他のGPIOにつなぐものがあるようだ。ENだとM5Stack内部にアクセスしなければならない(^^;) 面倒だし、いろいろ実験してみるために切り替えスイッチを加えてみた。(^^)


R4.12.22 VS1003ボード

 MIDIの勉強をしようと思っていたところ、MIDI野郎はM5Stackに内蔵スタックしてしまったので、余っていたVS1003モジュールを使おうかと。ところが、殆ど扱いを忘れてしまったので、やはりM5Stackに内蔵していたもう一枚のVS1003モジュールの結線を再現してみた。覚書が必要だった(^^;)

 その覚書も含めて取り組んでみることにした。まずは、配線の記録を残す。

 最初はWebRadioを再現してみる。ArduinoIDEやPCの環境が変わっているので、エラーが出ていたがライブラリを整備・更新したところうまくいった。M5StackとWebRadioの組み合わせはmacsbugさんの記事が最高なので、今回も参照させていただきました。こんな感じに完動しました。ありがとうございます。