音楽してみる


R6.4.23 UnitSyinthの改造

 M5Stack社のUnitSyinthにはSAM2695というシンセサイザーが使われている。確か、midi野郎もそうだった。このチップ安価な割にはなかなかの性能を持っていることはかねてより分かっていた。

 Xで、りょう@iOSエンジニアさんがこんなPOSTをされていて、いたく感動したので、私もやってみることにした。すなわちUnitSyinthの改造だ。あとで後悔するのだが...

 アンプスピーカーに音を出して聞く場合と、外に出さずUnitSyinth内蔵のスピーカーで聞く場合を両方実現しようと考えた。下図のように組めばいい。言うのは簡単だが...

 まず部品集めに苦労する。岡山市内では電子部品を扱う店が限られる。自宅からは少々遠い。ようやく言ったものの、欲しいものは無かった(^^;) 結局、秋月電子通商さんに通販でお願いした。欲しいものは、細い配線用コード、チップコンデンサ475、細い半田。表面実装部品用はんだ φ0.3mm、ポリウレタン銅線(0.29mm)、チップ積層セラミックコンデンサー 4.7μF1608をゲット。コンデンサを取り付けるのに、手持ちのM5Capsuleプロトキットを刻んで使った。

 1608のサイズの475を選んだが、小さくて苦労した。2mmほどのもあるので、そちらが良かったか、多少でも楽そう。後で気が付いたことだが(^^;)

 UnitSyinthに入っている元のスピーカは大きいので、手持ちの小型の中で適当なものを選んだ。幸いに5ピンのPhoneJackも部品箱に収まっていた。配線袋に入っていた0.6mmほどのコードはコンデンサ基盤とPhoneJackとの接続に使った。それでも画を見ると太いな(^^;)

 UnitSyinthについていた475コンデンサの除去についてはネットで方法を学習しておいたので割と簡単にできた。手が振動するので苦労した。緊張ではない。宙に浮かした手は細かに振動しているのだ。(ホント??)上の画にあるポリウレタン銅線の4カ所半田付けがクライマックスだった。あの手この手でいろいろ工夫して半田付け。その後、ケースを閉じる時の力で剥がれないよう、グルースティックで固定した。

 最後に、エイヤッと挟み込んでケースを閉じた。中で剥がれてしまって音が出なくなっていてもあとは知らんし、再度開腹して半田付けはしない! 失敗したら撤退! 覚悟で終了。

 結果はこれ

 外に持ち出して楽しむ時には内部スピーカで。録音や室内で楽しむ時にはLineOutで。エレフエの音を出しながら演奏し、LineOutで録音するという使い方を考えているけれど、録音しても使い道がないかもしれない(^^;)


R6.4.7 Elefueとミク機をつないでみる

 エレフエとM5UnitSyinthがつながっていい音なので、演奏を録音してみたい。折角なのでゆっくりとしたBACHの曲を選んで、ボーカロイドにも歌わせたいと計画。ボーカロイドとなったら、ミクを選ぶのだが、どうせならミクもエレフエでコントロールしたい。3年程前にNSX-39とM5Stack+USBモジュールを組んで鳴らせたことがあるので、それを利用しようかと思った。下のような感じね。

 エレフエとM5StackをBLEで繋げるのはできている(^^) M5Stack+USBモジュールとNSX-39ともつないだことがある。ならば、できるんじゃないかな? と簡単に思ったが、なかなか3年前ものことは覚えていない(^^;)

 過去のスケッチをあれこれ探して試してみた結果、できた(^^)/ 奇跡だ。

 このスケッチは、YuuichiAkagawa さんによる USBH_MIDIライブラリ&サンプルプログラム、 necobit さんのM5Stack-MIDI-Module &多くのサンプルプログラム、BLE 関係も necobit さんだったかな? あれもこれも、みなさんのおかげです、有難うございました。


 #include <M5Stack.h>
 #include "BLEDevice.h"
 // =============================
 #include <usbh_midi.h>  // YuuichiAkagawa / USBH_MIDI
 #include <usbhub.h>
 #include <SPI.h> 
 #define DEBUG_USB 0 
 #define DBSerial Serialb

 USB Usb; 
 USBH_MIDI  Midi(&Usb);
 // ==================================
 static BLEUUID serviceUUID("..............");
 static boolean doConnect = false;
 static boolean connected = false;
 static boolean doScan = false;
 static BLEAdvertisedDevice* myDevice;

 static void notifyCallback(
   BLERemoteCharacteristic* pBLERemoteCharacteristic,
   uint8_t* pData,
   size_t length,
   bool isNotify) {

 //note On
   uint8_t buf[3]; //0x90>> noteOn + ch 1 >> 0x91
   buf[0] = pData[2];
   buf[1] = pData[3];
   buf[2] = pData[4];
   Midi.SendData(buf);

   M5.Lcd.setCursor(150,150);
   for ( int i = 2 ; i < length ; i++ ) {
     M5.Lcd.printf( "%02X ", pData[i] );//  pData[0] 〜 pData[4]
     Serial.printf( "%02X ", pData[i] );//  pData[0] 〜 pData[4]
   }
   Serial.println();
 }

 class MyClientCallback : public BLEClientCallbacks {
   void onConnect(BLEClient* pclient) {
   }
   void onDisconnect(BLEClient* pclient) {
     connected = false;
     Serial.println("onDisconnect");
   }
 };

 bool connectToServer() {
   Serial.print("Forming a connection to ");
   Serial.println(myDevice->getAddress().toString().c_str());
   BLEClient*  pClient  = BLEDevice::createClient();
   Serial.println(" - Created client");
   pClient->setClientCallbacks(new MyClientCallback());
   pClient->connect(myDevice); 
   Serial.println(" - Connected to server");
   BLERemoteService* pRemoteService = pClient->getService(serviceUUID);
   if (pRemoteService == nullptr) {
     Serial.print("Failed to find our service UUID: ");
     Serial.println(serviceUUID.toString().c_str());
     pClient->disconnect();
     return false;
   }
   Serial.println(" - Found our service");
   std::map<uint16_t, BLERemoteCharacteristic*>* mapCharacteristics = pRemoteService->getCharacteristicsByHandle();
   for (std::map<uint16_t, BLERemoteCharacteristic*>::iterator i = mapCharacteristics->begin(); i != mapCharacteristics->end(); ++i) {
     if (i->second->canNotify()) {
       Serial.println(" - Add Notify");
       i->second->registerForNotify(notifyCallback);
     }
   }
   connected = true;
   return true;
 }

 class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
   void onResult(BLEAdvertisedDevice advertisedDevice) {
     Serial.print("BLE Advertised Device found: ");
     Serial.println(advertisedDevice.toString().c_str());
     if (advertisedDevice.haveServiceUUID() && advertisedDevice.isAdvertisingService(serviceUUID)) {
       BLEDevice::getScan()->stop();
       myDevice = new BLEAdvertisedDevice(advertisedDevice);
       doConnect = true;
       doScan = true;
     }
   }
 }; 

 void setup() {
   M5.begin();
   Serial.begin(115200);
   M5.Lcd.setRotation(3);
   M5.Lcd.setTextSize(3);
   M5.Lcd.setCursor(0,80);
   if (Usb.Init() == -1) {
     M5.Lcd.print("OSC didn't start.");
     while (1);
   }
   M5.Lcd.print("USB OK.");
   delay( 1000 );
   BLEDevice::init("");
   BLEScan* pBLEScan = BLEDevice::getScan();
   pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
   pBLEScan->setInterval(1349);
   pBLEScan->setWindow(449);
   pBLEScan->setActiveScan(true);
   pBLEScan->start(5, false);

   if (doScan) {
     BLEDevice::getScan()->start(0); 
   }
   delay(1000); 

   if (doConnect == true) {
     if (connectToServer()) {
       M5.Lcd.clear();
       M5.Lcd.setCursor(0,80);
       M5.Lcd.print("ConnectedToElefue");
     } else {
       M5.Lcd.print("failed to connect");
     }
     doConnect = false;
   }
 }

 void loop() {
   Usb.Task();
 }


R6.4.10 訂正!!

 私の環境では、map関数を使わない方が音がスムーズに出ることが分かった。つまり、

 if (pData[3] == 0x0b ){ // Expression

とExpessionデータだったらば、setVolumeの後に入る引数を(チャンネル,pData[4] )とそのまま送ってしまえばいいということです。

setVolume(0, map( pData[4] , 0 , 64 , 0 , 127 ));
setVolume(ch, pData[4] );


R6.3.28 音色に豊かさを求める2

 エレフエで「ソ」を吹いてみると、下図の4行のようなデータが得られるところから、2行目〜4行目がエクスプレッションデータだ。pData[2]のB0がコントロールチェンジで、pData[3]の0Bがエクスプレッションを示している。なので、これらの行のpData[4]をボリュームにどのように反映するかが思案どころとなる。

 エレフエのサポートの方に尋ねたところ、同じ内容の返答が得られた(サポートさん有難うございます)ので前に進めることにする。

 この件をネットで探索していたところ、どこかで、エクスプレッションはボリュームを弱めながら音を出せばいい、のような書き込みがあった。なるほど。ボリューム変化か、と得心した。さらに、elchikaでのshigobuさんのYMZ294に係る記事を発見。pData[4]をmap関数で操作されていた。これだ!と直感。

setVolume(0, map( pData[4] , 0 , 64 , 0 , 127 ));
setVolume(ch,level(map(value,fromLow,fromHigh,toLow,toHigh));

 効果は、こんな感じになる。ただし、MIDI野郎の方では、UnitSynthのmap関数の引数をそのまま流用したら上手くなかったので、環境によって修正しなければならないようだ。


R6.3.22 音色に豊かさを求める

 楽器やボリューム、リバーブ等の変更はできるようになった。UnitSynthのサンプルプログラムにあるsrc中のファイルに書いてある。ただ、演奏中に息が弱まるとelefueの音がプツッと消えてしまう(^^;)のが課題。
 Elefueの取説によると「エレフエからは音量をコントロールするエクスプレッションデータが送出される」と書いてある。上手くいかなかったので、リバーブでごまかしたけれど、プッツ切れは解消しない。

 まあ、リバーブが使えるようになったので、良しとする。programの91がプログラムチェンジに含まれるリバーブのコントロールナンバー。効果は、こんな感じになる。

setReverb( 0 , 91 , 127 , 127 );
setReverb(ch,program,level,delayfeedback);

 ちなみに、楽器変更の場合。76はパンフルート。

setInstrument( 0 , 0 , 76 );
setInstrument(bank, ch, value);

 ボリューム変更の場合。

setVolume( 0 , 127 );
setVolume(ch, level));

 


R6.3.21 UnitSynthを使う

 注文していたUnitSynthが届いた。ElefueとシンセサイザーをBLEで繋ぐのに、M5Stackを使うとほとんどレイテンシーがなくなるので、新発売だった小型のUnitSynthを待ちわびていたのだ。

 中に入っているGM音源ICはSAM2695で、M5Stackにスタックして使っているMIDI野郎と同じだ。さらに小型化して使いやすくなることだろう。

 余っていたM5AtomMatrixにサンプルプログラムを書き込んでも鳴らなかった(^^;) 同じGroveポートを使うのでも、マイコンのGPIOが色々なので、そこは合わせないといけなかっただけ。

 M5Cardputerと繋げてみたらあっけなく実働した。Cardputerは電源容量も大きいので、これをUnitSynth専用とする。

ここで見ることができます。


R3.2.1 midiファイルを作る

 まあそれなりにM5Stack+USBモジュール+ポケミクで音楽が聞けるので、どのくらいきけるものなのか試してみる。ショパン等の超絶技巧の音楽を入力します。ピアノだけなら楽なので(^^;)

 ただ問題は、再生時の安定感ですね。起動したてでは、音楽のテンポがおかしくなります。最初から正しいテンポのSMFファイルもあるので、何かSMFファイル側に工夫があるのか、そもそもスケッチに不十分さがあるのか。そのあたりも分かればいいのですが。


R3.1.28 選曲しやすくしてみる2

 選曲の仕方は、以前行ったMP3再生の時に曲名を選択できるスケッチを流用しました。このスケッチも公開されていたスケッチを利用させていただいたものでした。再利用ができるからいいですね。ただ、変数の扱いを同じにしないといけないので注意が必要です。自分が携わった2つを組み合わせる場合はいいのですが、他の人が作ったスケッチに組み合わせる場合は、変数の扱いを吟味しておかないとエラーが続出です。

 今回は、分からないままにあれこれ変数の型を試行錯誤した挙句、出なかった演奏中や停止中にファイル名が表示されるようになりました。(^^;) 理屈による理解は後から付いてくるかな? と思って気にしないことにしました(^^;)

 updateScreen() のところで、lcd.println(filename); で表示するのですが、


R3.1.25 選曲しやすくしてみる

 もともとのスケッチでは、playdat0〜playdat9までのファイル名での選曲でしたが、何の曲にしていたか忘れてしまうのと、smfファイルが10曲ではおさまらないので、midディレクトリに入れたファイルを選ぶことにしました。

 ただ、曲名の文字数を考えないと画面壊すし、再生時には曲名消えるしで、まだまだ先は長いです。


R3.1.25 M5StackとUSB_MIDIまとめ

 M5StackとUSBモジュール&MIDIの私的まとめ。USBポートを持っているポケット・ミク等にはUSBケーブルのみで接続可能。M5StackにはM5StackSmfPlayer.inoをもとにして、USB機能を持たせるためにVY1_sample.inoのUSB部分を使う、2つのスケッチを組み合わせ。

 nanoKEY2のようなUSB_MIDIポートしか持っていない機器でもUSBケーブルのみで接続可能。M5Stackには画面のようにねこびっとさんのスケッチが必要。私の場合ではM5StackGrayでスピーカー音質が良くないので、MIDIモジュール2とMIDI野郎を内蔵して聞くことができますが、Core2ならば、MIDI野郎だけで良い音で聞けるのではないかと思います。さらに、MIDI野郎を使えばステレオ、楽器ごとのPANで定位させて、ステレオで聞けるかも。

 ? MIDI野郎はレガシーMIDIを扱うのだったかな? Core2持っていないので、間違えていたらご容赦を。


R3.1.24 ポケミクが歌う2

 USBが不安定なんだけれど、なだめて使えるようになったので画面にトラック毎のキーボード表示するスケッチの方もUSBでポケミクを鳴らすようにしてみました。ラ・カンパネルラ弾いたけれど、これだけトラック数あると全部使いたくなります(^^)/

ここで見ることができます。

全曲はこちらです。


R3.1.22 ポケミクが歌う

 BACH BWV244マタイ受難曲の第39曲をポケミクに歌わせてみました。スコアメーカー→Domino→StudioOne2→ICレコーダーでwav録音→ビデオ。ポケミクのプリセット歌詞を書き換えれるかもしれないので、再度挑戦。

 しかし、プリセットされているところの言葉を書き換えてみましたが、音符と発音文字が合わないので、連携してやらないと意味がないことと、プリセット文字数が限定されているので、難しい(^^;)

ここで見ることができます。


R3.1.20 ポケミクが歌った2

 スケッチ内の、恐らく重要な行1行(Serial2.write( data );)をコメントアウトしているので、SMFファイルによっては不安定です(他にも原因があるかも)が、ミクがうまく歌ってくれたBWV244の第49曲です。キャピキャピ言葉をどうにかしたいものです(^^;) 

ここで見ることができます。


R3.1.19 ポケミクが歌った!

 懸案のポケミクでしたが、歌えるようになりました(^o^)/ まだ、序の口だけど(^^;)

 基本となるスケッチはM5StackeSmfPlayer.inoです。SDカードからSMFファイルを読むことも、それをポートに流すための整形の仕方さえ不明です(^^;) そこで、素晴らしいスケッチを使わせていただきました。しかし! 素晴らしすぎて解読できない、のが私のような初心者だろうと思います。あれこれネットで勉強して、結局、データを流すポートさえ確保できればOKなんだろうな、の感覚が得られました。レガシーMIDIにしろUSB_MIDIにしろあまり変わりはないんだろうなということで(^^;) 両者の翻訳!なんて記事もあって戸惑ったのだけれど、やってみて無理なら次の手を考えることで。

 USBに関しては、絶対の信頼を置くVY1_sample.inoというスケッチ。この中のUSB関係をM5StackeSmfPlayer.inoにコピペします。一応、noteOn で単音をUSBを通してポケミクで鳴らせるようにはしておきました。しかし、SMFファイルとなると、ドバっと様々なmidiデータが流れるので、心配なわけです。
 次に、M5StackeSmfPlayer.inoでは、どこでデータをMIDIポートに流しているのかというと、MidiPort_write( UCHAR data )MidiPort_writeBuffer( UCHAR * pData, ULONG Len )の2カ所しかないのです!w(゜o゜)w それぞれ、Serial2.write( data ); と Serial2.write( pData, Len ); で送ってます。ここで、USBの方に流してやればいいのでは? というわけでやってみました。Midi.SendData( data ); Midi.SendData( pData, Len ); 。すると、前者の方はエラーが出てしまったので、無くてもいいかな? くらいの楽な気持ちでコメントアウトしてM5Stackに書き込んだところ、すんなりエラーなくコンパイルされてポケミクが歌ってくれたという次第です。

 Serial2.write( data ); って何なのだろう? 今後の課題ですが(^^;) でも、こんなんで良かったんだろうかという気持ちです。(o・ω・o)?ホエ? 鳴っているからよかったことにしておこう。

 妙なテンポで鳴っているところは、ここで見ることができます。ポケミクの1チャンネルはミクの声になっているので、そこに楽器の細かいリズムを入れてしまうと混乱するのですね。

 ミクが歌う部分はここで見ることができます。


R3.1.14 M5StackとEWI_USB

 M5StackのUSBシールドでMIDI機材とつながるなら、以前から持っているEWI_USBというウィンドコントローラはどうか? と素直に考えました。これね。

 今のところの結果、M5Stack内に組み込んだMIDIモジュールとMIDI野郎を使うとなると、電流が不足するんでしょうか、下左のようにEWIUSBのLED点灯しません。MIDI_DUMPだけなら動きます。

 さらに動いた瞬間に、MIDIメッセージをたっぷり吐き出しています(^^;)

 キーに触っただけでも出します。一音吹くとようやく Note On 73,16 chan 1 を表示しました。M5Stackではこれだけで十分でしょうか(^^;)

 内蔵した音源を使うなら、セルフパワーのUSB_HUBの使用が必要かも知れない。ということで、注文しました(^^)/

 ところで、USBシールドは若干不安定です。スケッチをコンパイルしてUSBでM5Stackに書き込むときに、USBシールドにUSB機器をつないでおくとorUSBシールドを使うスケッチがM5Stackに書き込まれていると、新規の書き込みができないことがあります。一応、LovyanLancherに戻しておきます。
 書き込まれた後に、USBシールドにUSB機器を差し込んで電源ボタンでリセットします。USBがダメよと出たら、PCとつないであるUSBケーブルを抜いてみます。すると、その瞬間からUSBが使えるようになります。

 これは私の環境だけかもしれません。私の環境は、M5Stackに電源モジュールと物理スィッチモジュール、MIDIモジュールにMIDI野郎等々をスタックしてある上にUSBモジュールも挟んでしまったので、自分でも分からないことになっていますので(^^;)


R3.1.13 M5Stackとポケット・ミク

 チャンネル1が e-ボーカロイドのポケット・キクという音源を入手していました。この音源に、M5Stack+USBシールドというスタイルで、SMFファイルを流して鳴らしていたnatto21さんの記事を見て俄然興味がわきました。しかしながら、USBシールドなければ無理な話。諦めてはいましたが、M5Stack用のUSBシールドがリーズナブルな価格で売られていたのでポチッとしてしまいました(^^;)

 それから苦難がありましたが、先ほどようやく一歩前進。ポケット・ミクと同様なeVY1シールドを使ったサンプル、GitHubの USB_Host_Shield_2.0 中のYuuichiAkagawa さんによる「eVY1_sample.ino」を発見! これを使わせてもらいました。

 簡潔なスケッチで明快ですし、USB接続も分かり易いです。 eVY1はCh1のe-ボカロを避け、Ch2以降にmidiデータを送れば鳴るな!と予想してやってみると。鳴りました(^^)/

 ただ、チャンネル指定はどうする? 基本を学んでいない私にとっては難しい話ですが、ネットで調べまくった挙句

  1. //note On
  2. void noteOn(uint8_t note){
  3.  uint8_t buf[3];
  4.  buf[0] = 0x91; //0x90>> noteOn + ch 1 >> 0x91
  5.  buf[1] = note;
  6.  buf[2] = 0x7f;
  7.  Midi.SendData(buf);
  8. }
のように、4行目、noteOnが0x90なので、これにチャンネル数を加算( +ch1 => 0x91 )させれば指定できるというわけでした。なるほど。もちろんこの音をoffにするには、0x81で指定するわけです。

ここで見ることができます。


R3.1.13 M5StackでMIDI 5

 ふと気が付いて、MIDI.sendNoteOnを使ってみました。すると、26ピンで鳴りました(^^)/ もともとのスケッチでこれを使ってなくても26ピンでもMU5からの信号で鳴っていたので、長いこと悩んでしまったのでした(^^;)

 前回の記事を参照すると、USBHostDump() 関数内で、例えば NoteOn メッセージの場合、青文字のMIDIDumpのコードの間に挟んだ赤文字のコードを削除して、緑文字のコードを挟む。

case MidiType::NoteOn:
 dumpNoteOn(p[1], p[2], chan);
 MIDI.sendNoteOn(p[1], p[2], chan);
 break;

 プログラムチェンジはM5StackのボタンBとCで変更するようにしました。ボリュームはほとんど使わないので。これでUSB-MIDI機器、korgのマイクロキーボードが視野に入ってきました。

ここで見ることができます。

 さて、いよいよこれからが本丸。M5StackのSDカードからのmidiファイルをポケットミクで再生するという課題に取り組みます。恐らく1年以上かかることでしょう(^^;)


R3.1.3 M5StackでMIDI 4

 昨年の暮れに、M5Stack用のUSBモジュールが安くなっていたので思わずポチッとしてしまいました。すぐに届いたので、年末年始は、ものモジュールでマウスやMIDIキーボード信号のDumpスケッチを入手して遊んでいました。

 折角なので、これまで懸案だったnanoKEY2とUSBケーブルで結んでM5StackのMIDI音源(野郎)を鳴らしてみようとスタックしてみると、こんなに分厚くなってしまいました(^^;)

 gdsportsさんの
というM5Stack用スケッチをGitHubで発見したのでM5Stack にそのまま書き込んでやると動きました(^^)/
 次に、MIDIDumpで得たMIDIデータを、necobitのMIDIモジュール2に送ってやればなるだろうという予想で、ecobitさんの8bitNESSynthaudiooutというスケッチ内の必要と思われるものを、ベースにしたスケッチMIDIDumpに加え、変数を合わせてみました。

 すると、nanoKEY2の打鍵に反応して鳴りました。25pinだけ。ただ、26pinが鳴らない(^^;) おかしいな、MU5と8bitNESSynthaudiooutでは鳴るのに。

USBHostDump() 関数内で、例えば NoteOn メッセージの場合、青文字のMIDIDumpのコードの間に赤文字のコードを挟む。

case MidiType::NoteOn:
 dumpNoteOn(p[1], p[2], chan);
 portENTER_CRITICAL(&Tunes::timerMux);
 tunes.noteon(chan, p[1], p[2]);
 portEXIT_CRITICAL(&Tunes::timerMux);
 break;

 他のメッセージも同じように処理します。

 全て他力本願です(^^;) ありがとうございます。

ここで見ることができます。


R2.12.24 M5StackでMIDI 3

 USB-MIDI_HOSTかUSB_HOSTが必要になるようで、M5Stackと音源・MIDIキーボードの簡潔接続は諦めました。natto21さんが下図のように、M5StackにUSB_HOSTシールドを付けてポケット・ミクを接続してMIDI再生をされていましたが、ハードル高いのであきらめました(^^;)

 標準MIDIケーブルで下図の如く接続すると、MU5は鳴ってくれるので、これで良しとします。同時に、M5Stackでも鳴っています。


R2.12.17 M5StackでMIDI 2

 最終的には、下の図を目指しています。nanoKEY2はusbMIDI端子だけなので。最近は、MIDI規格も新しくなっているようで、usbMIDIだけでなく、3.5mmジャックのも使っていますね。

 難しいことは、他力本願で今回もネットサーチ。いくつか発見した一つ、kachineさんの「記憶は人なり」中の「USB-MIDI I/FをArduinoで自作する」を拝見し、ATmega32u4を積んだArduino互換ボードを使うと、USBからMIDI出力することができるそうなのでトライ。
 スケッチもそのまま拝借。鳴りました(^^)/ けれどKORGは無理でした(^^;) めげずに次のステップ!

 鳴ったのは、こんな配線。安価なATmega32u4積載のArduino互換ボード、助かります(^^) PCでなくて、nanoKEY2にする場合は、外部電源が必要ですね。

 kachineさんのスケッチはPCからのmidi信号をoutするものなんだと認識しています。

 ここで、大いに疑問なのですが、

  1. nanoKEY2からの信号とPCからoutする信号は違うんですかね? 
  2. nanoKEY2と外部電源入れてArduinoとつないでもnanoKEY2本体の左上LEDが点灯しないのは? 左下OCT等のスイッチを押すとLEDが点灯するんだけど。MIDI(usbデバイス)として認識されていないことですかね?
 このあたりを解決しなければなりませんね。

 とりあえず、PCとM5Stackを結んで鳴らすインターフェースは完成したので、ケースに収めて使いやすくしました。kachineさんありがとうございました!

 ここで聞くことができます。


R2.12.13 M5StackでMIDI

 しばらくM5AtomECHOでの2足歩行ロボットに取り組んでいたため、M5Stackから離れていました。先日ツイッター見ていると(この辺、毎回同じです(^^;))、M5Pianoなるものを発見! M5Stackに直接つけるキーボードです。直接日本で販売されているようではないのですが、欲しい! 2000円ほどのようなので。とりあえず、早速自分のM5Stackを点検。

 M5Stack+Midiを久しぶりに出してみると、音がでない! 予想通り(よくあるんです)Midi野郎ボードのあの部分の半田がとれてました(^^;) P1の足をヤスリでこすってからそこに半田付けして、鳴らすことができました。
 以前やった時は半田が付かなかったのですが、恐らく表面保護でクリヤーラッカーのようなものを塗っているんだろうと思い、ヤスリの先端でゴシゴシ。その後半田を付けてみるとくっ付きました。部品の足、2か所あるうちのP1の方に付けてみました。鳴りました(^^)/

 そこで、ヘンデルのオンブラ・マイ・フ冒頭だけを演奏。ここで聞くことができます。

 さて次に、すぐには入手できないM5Pianoであれば、手持ちのKorg nanoKEY2を使ってみるということ。ただこれはUSBインターフェースしかないので、PC中継が必要です。PCでDominoを使えば手持ちのいろんなmidi曲をM5Stackで楽しめます。スコアメーカーでmidiファイルを作れるし。

 でも、このシステムは大きいですよね。手軽ではない。M5Pianoのように簡単につなげたい。

 で、簡単にするにはこんな感じ。これはMIDIの基礎中の基礎のつなぎ方。YAMAHA MU5についているキーボードで、M5Stackを鳴らすことができます。完全なケーブルがなかったので、ピンを付けながらやったのでゴチャゴチャしています。

 配線図はこれ。このくらいだと手軽でいいですね。なら、標準USB OUTポートがあるキーボードを用意すればいいということですね。(^^;) しかし! nanoKEY2を使いたい。まあ、工作したいということもあるのですが。

 いろんなサイトを見て勉強してみました。また、せっせと工作作業をしてトライエンドエラーをしながら学んできたところ、これだ! というサイトと方法を発見しました。上手くいったら、報告します(^^)


R2.8.26 M5StackSMFPlayerができていた!

 しばらくラズベリーパイZeroに取り組んでいたため、M5Stackから離れていました。先日ツイッター見てみると、鍵盤表示ついたM5Stack SMF Playerがリリースされていました!

「オオッ!」さっそくDLしてコンパイルしてみると、いつものエラーが出た。「そんなものはない!」というやつです(^^;) ふと気が付いて、LovyanGFXをincludeした(^^;) ごめんなさい。当然ですね。そうなると、LovyanGFXとM5Stack.hとの共存には手続きが必要なことを思い出してネット検索。処理して、勇躍再コンパイル!

 しかし、「このボードでは書き込めない」だったかな? のこれまたいつものエラー! エラーが出たときには、そのメッセージをコピーしてエディタでエラー内容を調べるというけれど、4000行以上あって、あちこちにerrorが見つかる。仕方なしに、ツィートする(^^;)

 その後、らびやんさんから的確なアドバイスをいただいて(とんちんかんな反応ですみませんでした)M5Stackに書き込むことができた(^o^)/

 結局、スケッチの中で、色を指定するときにBLACKとあったところがあって、他を見てみるとTFT_BLACKのようになっていたので、TFT_BLACKに直したところ、コンパイルが通りました。この辺に気が付いたのは、らびやんさんのお陰でした。ありがとうございます。

 ここでベートーベンの運命を最初の60小節ぐらい聞くことができます。


R2.7.30 カードからmid再生!

 sin catさんのスケッチ、動きました! 京都電創庵 / Release Project SmfSeqのページですが、「https://bitbucket.org/kyoto-densouan/smfseq/src/m5stack/」 と 「https://bitbucket.org/kyoto-densouan/smfseq/src/master/」 があります。このうちのm5stackの方を見ます。「ArduinoSMFPlayer.ino 12.54 KB 2020-06-29 Wio Terminal対応の追加」のファイルが、ArduinoSMFPlayerとありますがM5Stack用のスケッチです。/smfseq/src/master/の方には、「ArduinoSMFPlayer.ino 11.2 KB 2020-06-03 TimerOneを使用したテンポずれの改善」という似たようなスケッチがありますが、これはArduino用です、多分。メニューでダウンロードを選択すると、「リポジトリをダウンロードする」がありますが、これはArduino版がダウンロードされます。私はこれでしばらく悩みました(^^;)

 私はM5Stack用のスケッチはコピペでエディタに貼り付けて使いました。ダウンロードした中にはM5Stackでも使うファイルが入っているので、ダウンロードしておいてもいいですね。IntervalCheckMicros.hはその中に入っていないので、コピペしました。


R2.7.30 パガニーニ Caprice

 sin catさんがyoutubeにアップしている「M5STackでMIDIシーケンサを動かして演奏してみた」からたどってM5Stackのスケッチに行きついたけれど、自分のM5Stackではなかなか動きません(^^;) かなり時間がかかりそうなので、今までのようにチマチマと数値入力的にパガニーニのカプリースNo.24を入力してみました。バイオリン曲なので、ほぼ単音。最後だけ、4和音(^^;) なので、楽そうだったので。(そうでもなかったけど)けれど、入力も楽になってきた。これだと弦楽四重奏くらいはいけるかもしれない。ここで聞くことができます。PentaxQ10で撮影しているんだけど、うまく撮れない。暗いです。

 necobitMIDIモジュールとMIDI野郎の位置関係はこんな感じです。

 MIDI.sendNoteOn(); MIDI.sendNoteOff();のセットで入力していきますが、かなり苦労です。

 今回、勉強してMIDI.sendProgramChange(40,1);//バイオリン、45だとピチカート
  MIDI.sendControlChange(7,vol,1); // ボリューム
  MIDI.sendControlChange(37,127,4); // リバーブ
 MIDI.sendControlChange(38,127,4); // コーラス
を使っています。MIDI野郎はSAM2695というチップを使っていますが、なかなか奥が深くて、使いこなせません。まあ、ボチボチ入口あたりで楽しもうかと。

 ボリューム変更ができるので、いちいち開腹してパワーアンプの可変抵抗を調節しなくて済みます。半田も取れないかも。ただ、リバーブ関係が耳を近づけると効果あるようなので、スピーカだけでなく、ヘッドホン用のジャックを取り付けようかと考えています。ちょうど部品箱に5本端子のジャックがあったので(^^)/ いい音で聞けるかも。もっとも、スピーカーで聞くと満足しているのは自分だけで、周囲の者には迷惑かな(^^;)と思った次第で。


R2.7.26 M5Stackにスタックする

 部品箱を探していたらパワーアンプを見つけたので、早速内蔵に取り組みました。計画としては、下の通り。

 necobitMIDIモジュールは内部にMIDI音源ボードは入らないけれど、余裕があるのでパワーアンプを入れます。

 そばにスピーカーもあるので、これを使います。BUSモジュールに音源モジュールを据え付けます。MIDIやオーディオのジャック受け、USB電源部は高さがありすぎるので取り外します。音源モジュールは基板に両面テープ止め。ネジの通り道が4隅にあるけれど、2つは使わないので、その穴を通して配線を通します。

 だいたいこういう工作ではミスることが多いのですが、今回はとても大事なところをミスりました。MIDIジャック受け(J2)を外しているときに、一か所下の銅箔を取り去ってしまいました(^^;)

 冷静に! そうなると、D2あるいはP1の足に半田付けを考えましたが半田が乗らない。そこで、矢印の細い回路道の表面塗装を剥がしてそこに半田を付けること。ただ、周りはすべてGNDなんですよね、確か。ショートする可能性あり!

 やるしかないので、やってみました。

 あとは、スタッキング。この辺の写真を撮り忘れています。配線がゴチャゴチャで苦戦していたからだろうと思います(^^;)

 どうにか収めて、電源を入れてみると鳴りました(^o^)/ ここで聞くことができます。

 SDカードからmidファイルを読み込むことは(今のところ)できないので、スケッチ上で、MIDI.sendNoteOn(36, 127, 1); delay(300); MIDI.sendNoteOff(36, 0, 1);のように苦闘しながら入力します(^^;) この入力方法、以前やったFM音源での方法とほぼ同じなので、テキストエディタで変換を駆使すると思いのほか簡単に入力できます。もちろん、新規曲は大変(^^;)

 また、M5Stackのバッテリーはbottomに付いていたものでなく、M5Stack用電池モジュールを使っています。M5Stack本体、MIDIモジュール、MIDI野郎、パワーアンプを使っていても、電力的には大丈夫なようです(^^)w


R2.7.24 MIDI音源

 昔使っていたYAMAHAのMU5。乾電池で使えるところがグッドでした。M5Stackはこれを鳴らすことができました。ところが、ネットをサーフィンしていたら、なんとMIDI音源モジュールが売ってました。MIDI野郎by木下研究所。即ゲット。昨日の夕方に届きました。

電源のところが半田付けの必要があったので、試運転は今朝しました。下のように配線します。BUSモジュールに収めたいな(^^)とは思いますが、微妙なサイズなので検討が必要なことと、midi音源モジュールとスピーカーの電源をM5Stackから取っても大丈夫かな?

ここで音を聞くことができます。


R2.7.20 MIDIモジュールの内側

 下の画像を見ると、M5_BUSの裏側に15×2列の金属板が綺麗に並んでいます。なんか、回路を適当に半田付けしてね! って感じに見えてしまうのですよね。注文していたアンプボードが到着したら、ブレッドボード使ってテストして、PAM8303より良かったら入れてしまうかも.....(^^;)


R2.7.20 M5StackでMIDI 最初の一歩

 ずっと前に使っていたYAMAHAのUX16というUSB−MIDI変換ケーブル。これがあったものだからPCとM5Stackをつないでみました。necobitMIDIモジュールのサンプルスケッチを利用。

 もう製造終了のようです(^^;)

 PC用にキーボードを鍵盤にするソフトやmidファイルを再生するソフトをインストールして使ってみました。きちんと鳴りますね(当たり前か(^^;))。M5StackにはGPIO25と26のOUTがあるんだけど、25の方は内部スピーカを鳴らします。26の方をMIDIモジュールにあるアンプPAM8303でモジュールについているスピーカを鳴らすそうです。それで、内部を開けてみるとこんな感じ。U3と記載されているのがそのPAM8303のようです。こんなに小さなチップがアンプなんですね。

 このMIDIモジュールでmp3を再生したところ、25でも26でも再生音にノイズが入ってしまいました。ヘッドホンをつなぐとホワイトノイズぽいのがかすかに入って綺麗な音なのですが。この時、スピーカも鳴っていますね(^^;)

 そこで、一号機のように内部アンプをつぶして、中に新たなアンプを内蔵してみようかと考えていましたが、PAM8303があるならちょっと様子見ということにしました。近いうちにMIDIケーブルが届くので、外部音源とつないで試してみてからにしようと思います。


R2.7.18 M5Stack用MIDIモジュール2購入!

 FM音源ボードを内蔵したM5Stack一号機はその後いろいろトラブルに見舞われましたが、どうにか正常に動くようになっています(^^)/

 一度起動しなくなった時に、転進しようと思い二号機用にM5Stack用MIDIモジュール2を注文してしまいました。その直後、一号機が生き返ったのでした(^^;) ということで下の写真。一号機はFM音源ボードとそれ用スピーカ、外部アンプとスピーカを内蔵して分厚くなっていたんですが、二号機もMIDIモジュール2をスタックして、一号機以上に分厚くなりました。

 サンプルスケッチに、WAVファイルを再生するものがあったので、ちょこっと書き換えて最初にmp3ファイルをMIDIモジュールについているスピーカで再生させてみました。スケッチはgainが0.4になっていたのでmp3再生音が小さかったのですが、時々入るドラムの音でノイズがバシバシ入ってしまいました(^^;) 残念。一号機のように25ピンの内部DACを潰さなければいけないのかな? 一号機の時に何をしたか忘れてしまった! 復習してみよう。


R2.6.18 テンペスト第3楽章の件2

 FM音源ボードが鳴ったり鳴らなかったりするのは、基板の半田付けがまずかったことが原因でした。細かい配線が何カ所かあって、点検で触ったらかなりの箇所外れてしました。きちんと作業しないといけないね。

 一応修理は済んで、鳴るようにはなりました。近いうちに、大作のパッサカリアとフーガの入力に挑戦予定です。


R2.6.1 テンペスト第3楽章の件

 不思議なことにテンペストは最後まで鳴りました。途中で切れたのはハード的な、半田的な問題ではなかったようです。繰り返しを一部省いて入力していると思うけれど、400小節あるので、もしかすると、どれかのチャンネルを鳴らしたままにしているのかもしれない(違うかもしれないけれど)。ただ、400小節もあると、確認するのが億劫でほったらかしになっています(^^;)

 現在は、mp3を聞くのがM5Stackを使うメインになっています。22曲で1画面の選択になっているけれど、複数画面にして沢山の曲から選べるようにしようとしています。頭の訓練にいいようです。

 ついでに、ボーカロイドに歌わせるのに慣れてきたので、その方面のmp3曲を作っているところです。


R2.5.14 就寝用BGMとしてMP3

 テンペスト第3楽章は入力し終えました。けれど、就寝用に使うには無理がありますね。興奮して、弾けもしないピアノを弾いたふりで動き回って眠れません。それに、YMF825のボードに不都合が生じたらしく、途中で切れるので使えなくなってしまいました。半田ごてを持ってきてないし。

 代わりに、MP3を聞いています。ボーカロイドのPrimaで入力したカッチーニのアベマリアやらドニゼッティのアリアやらを入力して聞いています。新しく、こころ旅のテーマ曲の楽譜を購入して、初音ミクに歌わせてみました。テンペストと違い1日で入力できますね(^^;)

 聞いていると、曲が終わっても while loop から出ないことと、バッテリーがどのくらいあるか表示できないのが課題です。バッテリー表示はアイコンで4段階表示できるのですが、それをMP3再生のスケッチに組み込むと"ピー・ジャー"の大雑音です。時間があるので、どうにか解決したいなと思います。(できないかな?)


R2.4.15 スピーカーを装着

 音が小さいのは、スピーカーを内蔵したままだったからでしょう。基板から外して、ボトムカバーの外側にスピーカーを外に向けるようにしました。

 スピーカーの厚さが5mmほど。ボトムカバー自体が厚みがないので、結局ボトムの外側に大穴をあけました。スピーカーをボトム基板に不織布を挟んで固定したところ少々スピーカーが外に出てしまうので、丁度いい具合にあった1mm程度のゴムパッキンを挟んで穴を多数あけたプラ板で押さえました。

 多少、鮮明で大きな音になりました。寝る前に寝床で静かな曲を聞く分にはいい道具になりました(^^;)

 そこで、mp3再生のための自作曲を制作中です。久しぶりにボーカロイドでグノーのアベマリアを作っていますが、昔発売のソプラノ歌手のボーカロイドを使おうとしたら、ラテン語はもちろん英語も入れにくくて挫折。初音ミクに歌わせることにしました。


R2.4.13 MP3再生

 M5Stackに内蔵されている小型のスピーカーを利用しようと画策しました。スタックする順番を変えて、画面のすぐ下にアンプボードの入ったBUSモジュールを組み込みます。使っていない穴からスピーカーの線を持ってきます。ただ、手持ちのスピーカーの方が音質が良かったので、結局内蔵スピーカーは取り去ることとなりました。

 その後、外部I2Sアンプボードの音質と音量を求めて試行錯誤しますが、なかなか改善しません。mp3ファイルの音量を20%にして、スケッチでgainを上げることで、多少良くなりましたが、耳元に近づけて聞く程度。静かに聞く分には良いのですが.....改善の余地ありですが、手立てなし。

 転身して、MP3ファイルを選択するメニューを作成しました。


R2.4.10 外部I2Sアンプボード

 FM音源で、ベートーベンの悲愴とテンペストを同じ時期に入力を始めていたら、飽和状態になって別のことを考えるようになりました。それが、M5Stackスピーカーの改善。音環境の改善ですね。

 M5Stackのスピーカー音が良くないのでどうにかしたいと思っていたら、Mhageさんの2019年05月05日に更新された「M5Stackのスピーカーの音質が悪い原因と対策」という記事の最後に「内部アンプを無効化してI2Sアンプを外付けすれば良い」とありました。へぇぇ! ということで、いろいろ検索してみました。と同時に、MAX98357A搭載 I2S 3W D級アンプボードとそれを組み込むM5StackのBUSモジュールをゲット。

 Mhageさんによれば、内部アンプの無効化には、「基板のT1ジャンパーをショート」とあるので、下の図のAMPと記載ある右のネジみたいのを回せばいいのかな? なんて、傷つけてしまった(^^;)シロウトは怖い。これは、半田を盛ってショートさせるのだ。これまでいろんなところで見てきた手法だった。やってみると確かに、音が出なくなった(^^;)(いいのか??)

 次にアンプボードを固定する。失敗してもたかが知れている(本当に?!)から思い切って半田で固定する(恐ろしい!)。

 最初は、

  1. Amp Vin -> M5 3.3V
  2. Amp GND -> M5 GND
  3. Amp DIN -> M5 GPIO 15 IISOUT
  4. Amp BCLK -> M5 GPIO 12 IIS_SK
  5. Amp LRCLK -> M5 GPIO 13 II_WS

という接続にしてみました。それらしい名称がM5Stackの内部のESP32のラベルにあったからです。しかし、この接続では無音。そこで、あちこち調べてESP32で鳴らしていた方のつなぎ方でやってみました。すると、鳴った!

  1. Amp Vin -> M5 3.3V
  2. Amp GND -> M5 GND
  3. Amp DIN -> M5 GPIO 22
  4. Amp BCLK -> M5 GPIO 26 DAC2
  5. Amp LRCLK -> M5 GPIO 25 DAC1
というつなぎ方ですね。

 ただ、スケッチでこれを指定してやらねばならないな、と案じておりました。out = new AudioOutputI2S(0,1);// internal DACという一文です。内部DAC! 外部に出すにはどうするの? この辺もマニュアル読めば出ているのかもしれないけれど、ゴチャゴチャしてわからない。要は、

out = new AudioOutputI2S();//外部

ですね。そう書いておいてくれればいいのに。

というわけで、MP3やWAV音はきれいに鳴りました。ただ、gainを大きくするとやはり割れますね。それに、AquesTalkが鳴らなくなった。ならば内部DAC利用でゲインを小さくしてもよかったのではないかな? とも思います。今更面倒なのでやらないけれど。

結果、こんなに厚みが増して持ちやすくなりました(^^;)。


R2.4.6 Nocturne55_1の打ち込み

 全部を記載してみました。行数を抑えるためにエディタで整形したので、ミスがあるかもしれません。和音のだし方やトリル・装飾音符・アルペジオ・連符などを工夫してみました。ピアニストさんからの指摘はあるかもしれません(^^;)ここで聞くことができます。

#include #include  //メニューに戻るための記述 #include "SimpleYMF825.h" SimpleYMF825 YMF; #define c 0 #define cm 1 #define dw 1 #define d 2 #define dm 3 #define ew 3 #define e 4 #define f 5 #define fm 6 #define gw 6 #define g 7 #define gm 8 #define aw 8 #define a 9 #define am 10 #define bw 10 #define b 11 void setup(){ M5.begin(); if(digitalRead(BUTTON_A_PIN) == 0) { Serial.println("Will Load menu binary"); updateFromFS(SD); ESP.restart(); } YMF.begin(IOVDD_5V); // for 5V MCU YMF.setTone( 0, BRIGHT_PIANO ); YMF.setTone( 1, BRIGHT_PIANO ); YMF.setTone( 2, BRIGHT_PIANO ); YMF.setTone( 3, BRIGHT_PIANO ); YMF.setTone( 4, BRIGHT_PIANO ); YMF.setTone( 5, BRIGHT_PIANO ); YMF.setMasterVolume(40); for(int ch=0;ch<6;ch++){ YMF.setVolume(ch, 30); } M5.Lcd.setTextSize(2); } void loop(){ M5.Lcd.setCursor(60,60); M5.Lcd.println(" Chopin "); M5.Lcd.setCursor(60,90); M5.Lcd.print("Nocturne Op.55_1"); delay(3000); // 四分音符 900 int L = 900 ; int L2 = 900; //-------1 M5.Lcd.setCursor(110,160); M5.Lcd.print("Bar 1"); YMF.keyon(0,5,c); delay(L); //-------2 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 2"); YMF.keyon(1,2,f); delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,f);YMF.keyon(1,4,f); YMF.keyon(2,4,c);YMF.keyon(3,3,aw); delay(L); YMF.keyoff(0); YMF.keyoff(1);YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,ew);YMF.keyon(1,3,g); delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,dw);YMF.keyon(1,4,ew); YMF.keyon(2,3,bw);YMF.keyon(3,3,ew); delay(L); //-------3 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 3"); YMF.keyoff(0); YMF.keyoff(1);YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,c);YMF.keyon(1,2,aw); delay(L/4*3); YMF.keyoff(0); YMF.keyon(0,4,b); delay(L/4); YMF.keyoff(0);YMF.keyoff(1); YMF.keyon(0,5,c);YMF.keyon(1,4,aw); YMF.keyon(2,4,c); delay(L/4*3); YMF.keyoff(0); YMF.keyon(0,5,dw); delay(L/4); YMF.keyoff(0);YMF.keyoff(1);YMF.keyoff(2); YMF.keyon(0,5,c);YMF.keyon(1,2,e); delay(L); YMF.keyoff(1); YMF.keyon(1,4,g);YMF.keyon(1,4,c);YMF.keyon(2,3,bw); delay(L); //-------4 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 4"); YMF.keyoff(1);YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(1,2,f);delay(L); YMF.keyoff(0);YMF.keyoff(1); YMF.keyon(0,5,f);YMF.keyon(1,4,f);YMF.keyon(2,4,c);YMF.keyon(3,3,aw);delay(L); YMF.keyoff(0);YMF.keyoff(1);YMF.keyoff(2);YMF.keyoff(3); YMF.keyon(0,5,ew);YMF.keyon(1,3,bw);delay(L); YMF.keyoff(0);YMF.keyoff(1); YMF.keyon(0,5,dw);YMF.keyon(1,4,ew);YMF.keyon(2,3,bw);YMF.keyon(3,3,ew);delay(L); //-------5 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 5"); YMF.keyoff(0); YMF.keyoff(1);YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,c);YMF.keyon(1,2,aw); delay(L/4*3); YMF.keyoff(0); YMF.keyon(0,4,b); delay(L/4); YMF.keyoff(0);YMF.keyoff(1); YMF.keyon(0,5,c);YMF.keyon(1,4,aw); YMF.keyon(2,4,c); delay(L/4*3); YMF.keyoff(0); YMF.keyon(0,5,ew); delay(L/12); YMF.keyoff(0); YMF.keyon(0,5,dw); delay(L/6); YMF.keyoff(0);YMF.keyoff(1);YMF.keyoff(2); YMF.keyon(0,5,c);YMF.keyon(1,2,e); delay(L); YMF.keyoff(1); YMF.keyon(1,4,g);YMF.keyon(1,4,c);YMF.keyon(2,3,bw); delay(L); //-------6 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 6"); YMF.keyoff(1);YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(1,2,f);delay(L); YMF.keyoff(0);YMF.keyoff(1); YMF.keyon(0,5,f);YMF.keyon(1,4,f);YMF.keyon(2,4,c);YMF.keyon(3,3,aw);delay(L); YMF.keyoff(0);YMF.keyoff(1);YMF.keyoff(2);YMF.keyoff(3); YMF.keyon(0,5,ew);YMF.keyon(1,3,bw);delay(L); YMF.keyoff(0);YMF.keyoff(1); YMF.keyon(0,5,dw);YMF.keyon(1,4,ew);YMF.keyon(2,3,bw);YMF.keyon(3,3,ew);delay(L); //-------7 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 7"); YMF.keyoff(0);YMF.keyoff(1);YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,c);YMF.keyon(1,2,aw);delay(L); YMF.keyoff(1); YMF.keyon(1,4,aw);YMF.keyon(2,4,ew);YMF.keyon(3,4,c);delay(L); YMF.keyoff(0);YMF.keyoff(1);YMF.keyoff(2);YMF.keyoff(3); YMF.keyon(0,4,bw);YMF.keyon(1,2,bw);delay(L/8); YMF.keyoff(0);YMF.keyon(0,5,c);delay(L/8); YMF.keyoff(0);YMF.keyon(0,4,bw);delay(L/8); YMF.keyoff(0);YMF.keyon(0,5,c);delay(L/8); YMF.keyoff(0);YMF.keyon(0,4,bw);delay(L/8); YMF.keyoff(0);YMF.keyon(0,5,c);delay(L/8); YMF.keyoff(0);YMF.keyon(0,4,bw);delay(L/8); YMF.keyoff(0);YMF.keyon(0,4,a);delay(L/8); YMF.keyoff(0);YMF.keyon(0,4,bw);delay(L/8); YMF.keyoff(0);YMF.keyoff(1); YMF.keyon(0,5,c);YMF.keyon(1,4,gw);YMF.keyon(2,4,dw);YMF.keyon(3,3,ew);delay(L/4*3); YMF.keyoff(0); YMF.keyon(0,5,dw);delay(L/4); //-------8 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 8"); YMF.keyoff(0);YMF.keyoff(1);YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,4,aw);YMF.keyon(1,4,c);delay(L); YMF.keyoff(1); YMF.keyon(1,4,f);YMF.keyon(2,4,c);YMF.keyon(3,3,aw);delay(L); YMF.keyoff(0);YMF.keyoff(1);YMF.keyoff(2);YMF.keyoff(3); YMF.keyon(3,2,c);delay(L/8); YMF.keyon(2,3,bw);delay(L/8); YMF.keyon(1,4,e);delay(L/8); YMF.keyon(2,3,bw);delay(L/4*3); YMF.keyoff(0);YMF.keyoff(1);YMF.keyoff(2);YMF.keyoff(3); YMF.keyon(0,4,g);YMF.keyon(1,4,c);YMF.keyon(2,3,c);delay(L/4*3); YMF.keyoff(0); YMF.keyon(0,4,f);delay(L/4); //-------9 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 9"); YMF.keyoff(0);YMF.keyoff(1);YMF.keyoff(2); YMF.keyon(0,3,aw);delay(L/12); YMF.keyoff(0);YMF.keyon(0,4,f);YMF.keyon(1,2,f);delay(L); YMF.keyoff(1); YMF.keyon(1,4,c);YMF.keyon(2,3,aw);delay(L); YMF.keyoff(0);YMF.keyoff(1);YMF.keyoff(2); YMF.keyon(0,5,c);YMF.keyon(1,2,f);delay(L/6*7); YMF.keyoff(0);YMF.keyoff(1); YMF.keyon(0,5,c);YMF.keyon(1,4,e);YMF.keyon(2,3,g);delay(L/6*7); //-------10 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 10"); YMF.keyoff(1);YMF.keyoff(2); YMF.keyon(1,2,f);delay(L); YMF.keyoff(0);YMF.keyoff(1); YMF.keyon(0,5,f);YMF.keyon(1,4,g);YMF.keyon(2,4,c);YMF.keyon(3,3,aw);delay(L); YMF.keyoff(0);YMF.keyoff(1); YMF.keyoff(2);YMF.keyoff(3); YMF.keyon(0,5,ew);YMF.keyon(1,2,g);delay(L); YMF.keyoff(0);YMF.keyoff(1); YMF.keyon(0,5,dw);YMF.keyon(1,4,ew);YMF.keyon(2,3,bw);YMF.keyon(3,3,ew);delay(L); //-------11 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 11"); YMF.keyoff(1); YMF.keyoff(2);YMF.keyoff(3);YMF.keyoff(0); YMF.keyon(0,5,c);YMF.keyon(1,2,aw);delay(L/4*3); YMF.keyoff(0); YMF.keyon(0,4,b);delay(L/4); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,c);YMF.keyon(1,4,aw);YMF.keyon(2,4,c);delay(L/4*3); YMF.keyoff(0); YMF.keyon(0,5,dw);delay(L/4); YMF.keyoff(0); YMF.keyoff(1);YMF.keyoff(2);YMF.keyoff(3); YMF.keyon(0,5,c);YMF.keyon(1,2,e);delay(L); YMF.keyoff(1); YMF.keyon(1,4,g);YMF.keyon(2,4,c);YMF.keyon(3,3,bw);delay(L); //-------12 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 12"); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(1,2,f);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,f); YMF.keyon(1,4,f); YMF.keyon(2,4,c); YMF.keyon(3,3,aw);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,ew); YMF.keyon(1,2,g);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,dw); YMF.keyon(1,4,ew); YMF.keyon(2,3,bw); YMF.keyon(3,3,ew);delay(L); //-------13 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 13"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,c); YMF.keyon(1,2,aw);delay(L/4*3); YMF.keyoff(0); YMF.keyon(0,4,b);delay(L/4); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,c); YMF.keyon(1,4,aw); YMF.keyon(2,4,c);delay(L/4*3); YMF.keyoff(0); YMF.keyon(0,5,ew); delay(L/12); YMF.keyoff(0); YMF.keyon(0,5,dw);delay(L/6); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,5,c); YMF.keyon(1,2,e);delay(L); YMF.keyoff(1); YMF.keyon(1,4,g); YMF.keyon(2,4,c); YMF.keyon(3,3,bw);delay(L); //-------14 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 14"); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(1,2,f);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,f); YMF.keyon(1,4,f); YMF.keyon(2,4,c); YMF.keyon(3,3,aw);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,ew); YMF.keyon(1,2,g);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,dw); YMF.keyon(1,4,ew); YMF.keyon(2,3,bw); YMF.keyon(3,3,ew);delay(L); //-------15 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 15"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,c); YMF.keyon(1,2,aw);delay(L); YMF.keyoff(1); YMF.keyon(1,4,aw); YMF.keyon(2,4,ew); YMF.keyon(3,4,c);delay(L/2); YMF.keyoff(0); YMF.keyon(0,4,a);delay(L/6); YMF.keyoff(0); YMF.keyon(0,4,bw);delay(L/6); YMF.keyoff(0); YMF.keyon(0,5,c);delay(L/6); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,4,bw); YMF.keyon(1,2,bw);delay(L/16); for (int i=0;i<4;i++){ // Trill YMF.keyoff(0); YMF.keyon(0,5,c);delay(L/8); YMF.keyoff(0); YMF.keyon(0,4,bw);delay(L/8); } YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(1,4,gw); YMF.keyon(2,4,dw); YMF.keyon(3,3,gw);delay(L-L/8*5); YMF.keyon(0,4,a);delay(L/8); YMF.keyoff(0); YMF.keyon(0,4,bw);delay(L/8); YMF.keyoff(0); YMF.keyon(0,5,c);delay(L/8); YMF.keyoff(0); YMF.keyon(0,5,ew);delay(L/8); YMF.keyoff(0); YMF.keyon(0,4,dw);delay(L/8); //-------16 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 16"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,4,aw);YMF.keyon(1,4,c);delay(L); YMF.keyoff(1); YMF.keyon(1,4,f); YMF.keyon(2,4,c); YMF.keyon(3,3,aw);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,3,bw);delay(L/8); YMF.keyoff(0); YMF.keyon(2,3,bw); YMF.keyon(3,2,c);delay(L/8); YMF.keyon(1,4,e);delay(L/8); YMF.keyon(2,3,bw);delay(L/4*3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,4,g); YMF.keyon(1,4,c); YMF.keyon(2,3,c);delay(L/4*3); YMF.keyoff(0); YMF.keyon(0,4,f);delay(L/4); //-------17 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 17"); YMF.keyoff(0); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,3,aw);delay(L/12); YMF.keyoff(0); YMF.keyon(0,4,f); YMF.keyon(1,2,f);delay(L); YMF.keyoff(1); YMF.keyon(1,4,c); YMF.keyon(2,3,aw);delay(L); YMF.keyoff(0); YMF.keyon(0,4,aw); YMF.keyon(3,3,f);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,4,aw); YMF.keyon(1,4,d); YMF.keyon(2,3,aw); YMF.keyon(3,3,e);delay(L); //-------18 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 18"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,4,bw); YMF.keyon(1,3,ew);delay(L); YMF.keyoff(0); YMF.keyon(0,4,d); YMF.keyon(2,4,d); YMF.keyon(3,3,aw);delay(L/2); YMF.keyoff(0); YMF.keyon(0,4,ew);delay(L/2); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,4,f); YMF.keyon(1,2,ew);delay(L/2); YMF.keyoff(0); YMF.keyon(0,4,ew);delay(L/2); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,4,aw); YMF.keyon(1,4,d); YMF.keyon(2,3,g);delay(L/2); YMF.keyoff(0); YMF.keyon(0,4,bw);delay(L/2); //-------19 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 19"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,5,c); YMF.keyon(1,2,aw);delay(L); YMF.keyoff(1); YMF.keyon(1,4,c); YMF.keyon(2,3,aw); YMF.keyon(3,3,ew);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,c); YMF.keyon(1,2,f);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,c); YMF.keyon(1,4,c); YMF.keyon(2,3,f); YMF.keyon(3,3,d);delay(L); //-------20 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 20"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,d); YMF.keyon(1,2,g);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,4,fm); YMF.keyon(1,4,c); YMF.keyon(2,3,f); YMF.keyon(3,3,d);delay(L/2); YMF.keyoff(0); YMF.keyon(0,4,g);delay(L/2); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,4,aw); YMF.keyon(1,2,g);delay(L/2); YMF.keyoff(0); YMF.keyon(0,4,g);delay(L/2); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,c); YMF.keyon(1,3,b); YMF.keyon(2,3,f); YMF.keyon(3,3,d);delay(L/2); YMF.keyoff(0); YMF.keyon(0,5,d);delay(L/2); //-------21 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 21"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,e); YMF.keyon(1,3,c);delay(L); YMF.keyoff(1); YMF.keyon(1,4,g); YMF.keyon(2,4,c); YMF.keyon(3,3,bw);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,f); YMF.keyon(1,3,c);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,ew); YMF.keyon(1,4,aw); YMF.keyon(2,4,c); YMF.keyon(3,3,aw);delay(L/4*3); YMF.keyoff(0); YMF.keyon(0,5,dw);delay(L/4); //-------22 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 22"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,dw); YMF.keyon(1,3,c);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,c); YMF.keyon(1,4,ew); YMF.keyon(2,3,g);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,5,dw); YMF.keyon(1,3,c);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,c); YMF.keyon(1,4,f); YMF.keyon(2,3,aw);YMF.keyon(3,3,f);delay(L/4*3); YMF.keyoff(0); YMF.keyon(0,4,bw);delay(L/4); //-------23 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 23"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,4,bw); YMF.keyon(1,3,c);delay(L); YMF.keyoff(0); YMF.keyon(0,4,aw); YMF.keyon(2,4,c); YMF.keyon(3,3,ew);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,4,g); YMF.keyon(1,3,c);delay(L); YMF.keyoff(0); YMF.keyon(0,4,bw); YMF.keyon(2,3,b); YMF.keyon(3,3,f); YMF.keyon(4,3,dw);delay(L/8); YMF.keyoff(0); YMF.keyon(0,4,aw);delay(L/8*5); YMF.keyoff(0); YMF.keyon(0,4,g);delay(L/4); //-------24 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 24"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyoff(4); YMF.keyon(0,4,g); YMF.keyon(1,3,c);delay(L); YMF.keyoff(0); YMF.keyon(0,4,g); YMF.keyon(2,4,c); YMF.keyon(3,3,e);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,4,g); YMF.keyon(1,3,c);delay(L); YMF.keyoff(0); YMF.keyon(0,4,bw); YMF.keyon(2,3,b); YMF.keyon(3,3,f); YMF.keyon(4,3,dw);delay(L/8); YMF.keyoff(0); YMF.keyon(0,4,aw); delay(L/8*5); YMF.keyoff(0); YMF.keyon(0,4,g);delay(L/4); //-------25 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 25"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyoff(4); YMF.keyon(0,4,g); YMF.keyon(1,3,c);delay(L); YMF.keyoff(0); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,c); YMF.keyon(2,3,bw); YMF.keyon(3,3,e);delay(L/6*7); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,c);delay(L/6*7); YMF.keyoff(0); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,c);delay(L/6*7); //-------26 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 26"); YMF.keyon(1,2,f);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,f); YMF.keyon(1,3,aw); YMF.keyon(2,3,c);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,5,ew); YMF.keyon(1,2,g);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,dw); YMF.keyon(1,4,ew); YMF.keyon(2,3,bw); YMF.keyon(3,3,ew);delay(L); //-------27 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 27"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,c); YMF.keyon(1,2,aw);delay(L/4*3); YMF.keyoff(0); YMF.keyon(0,4,b);delay(L/4); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,c); YMF.keyon(1,4,aw); YMF.keyon(2,4,c);delay(L/4*3); YMF.keyoff(0); YMF.keyon(0,5,dw);delay(L/4); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,5,c); YMF.keyon(1,2,e);delay(L); YMF.keyoff(1); YMF.keyon(1,4,g); YMF.keyon(2,4,c); YMF.keyon(3,3,bw);delay(L); //-------28 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 28"); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(1,2,f);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,e); YMF.keyon(1,4,f); YMF.keyon(2,4,c); YMF.keyon(3,3,aw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,g);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,f);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,ew); YMF.keyon(1,2,g);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,ew);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,bw);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,c); YMF.keyon(1,4,ew); YMF.keyon(2,3,bw); YMF.keyon(3,3,ew);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,ew);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,dw);delay(L/3); //-------29 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 29"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,c); YMF.keyon(1,2,aw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,ew);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,4,aw); YMF.keyon(1,4,c); YMF.keyon(2,3,aw); YMF.keyon(3,3,ew);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,b);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,dw);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,c); YMF.keyon(1,2,e);delay(L); YMF.keyoff(1); YMF.keyon(1,4,g); YMF.keyon(2,4,c); YMF.keyon(3,3,bw);delay(L); //-------30 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 30"); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(1,2,f);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,f); YMF.keyon(1,4,f); YMF.keyon(1,4,c); YMF.keyon(2,3,ew);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,ew); YMF.keyon(1,2,g);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,dw); YMF.keyon(1,4,ew); YMF.keyon(2,3,bw); YMF.keyon(3,3,ew);delay(L); //-------31 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 31"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,c); YMF.keyon(1,2,aw);delay(L); YMF.keyoff(1); YMF.keyon(1,4,aw); YMF.keyon(2,4,ew); YMF.keyon(3,4,c);delay(L/2); YMF.keyoff(0); YMF.keyon(0,4,a);delay(L/6); YMF.keyoff(0); YMF.keyon(0,4,bw);delay(L/6); YMF.keyoff(0); YMF.keyon(0,5,c);delay(L/6); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,4,bw); YMF.keyon(1,2,bw);delay(L/16); for (int i=0;i<4;i++){ // Trill YMF.keyoff(0); YMF.keyon(0,5,c);delay(L/8); YMF.keyoff(0); YMF.keyon(0,4,bw);delay(L/8); } YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(1,4,gw); YMF.keyon(2,4,dw); YMF.keyon(3,3,gw);delay(L/2); YMF.keyon(0,4,a);delay(L/8); YMF.keyoff(0); YMF.keyon(0,4,bw);delay(L/8); YMF.keyoff(0); YMF.keyon(0,5,c);delay(L/8); YMF.keyoff(0); YMF.keyon(0,5,dw);delay(L/8); //-------32 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 32"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,4,aw); YMF.keyon(1,4,c);delay(L); YMF.keyoff(1); YMF.keyon(1,4,f); YMF.keyon(2,4,c); YMF.keyon(3,3,aw);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,3,bw);delay(L/8); YMF.keyoff(0); YMF.keyon(2,3,bw); YMF.keyon(3,2,c);delay(L/8); YMF.keyon(1,4,e);delay(L/8); YMF.keyon(2,3,bw);delay(L/4*3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,4,g); YMF.keyon(1,4,c); YMF.keyon(2,3,c);delay(L/4*3); YMF.keyoff(0); YMF.keyon(0,4,f);delay(L/4); //-------33 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 33"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,3,aw);delay(L/12); YMF.keyoff(0); YMF.keyon(0,4,f); YMF.keyon(1,2,f);delay(L); YMF.keyoff(1); YMF.keyon(1,4,c); YMF.keyon(2,3,aw);delay(L); YMF.keyoff(0); YMF.keyon(0,4,aw); YMF.keyon(3,3,f);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,4,aw); YMF.keyon(1,4,d); YMF.keyon(2,3,aw); YMF.keyon(3,3,e);delay(L); //-------34 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 34"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,4,bw); YMF.keyon(1,3,ew);delay(L); YMF.keyoff(0); YMF.keyon(0,4,d); YMF.keyon(2,4,dw); YMF.keyon(3,3,aw);delay(L/2); YMF.keyoff(0); YMF.keyon(0,4,ew);delay(L/2); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,4,f); YMF.keyon(1,2,ew);delay(L/2); YMF.keyoff(0); YMF.keyon(0,4,ew);delay(L/2); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,4,aw); YMF.keyon(1,4,dw); YMF.keyon(2,3,g);delay(L/2); YMF.keyoff(0); YMF.keyon(0,4,bw);delay(L/2); //-------35 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 35"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,5,c); YMF.keyon(1,2,aw);delay(L); YMF.keyoff(1); YMF.keyon(1,4,c); YMF.keyon(2,3,aw); YMF.keyon(3,3,ew);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,c); YMF.keyon(1,2,f);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,c); YMF.keyon(1,4,c); YMF.keyon(2,3,f); YMF.keyon(3,3,d);delay(L); //-------36 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 36"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,d); YMF.keyon(1,2,g);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,4,fm); YMF.keyon(1,4,c); YMF.keyon(2,3,f); YMF.keyon(3,3,d);delay(L/2); YMF.keyoff(0); YMF.keyon(0,4,g);delay(L/2); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,4,aw); YMF.keyon(1,2,g);delay(L/2); YMF.keyoff(0); YMF.keyon(0,4,g);delay(L/2); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,c); YMF.keyon(1,3,b); YMF.keyon(2,3,f); YMF.keyon(3,3,d);delay(L/2); YMF.keyoff(0); YMF.keyon(0,5,d);delay(L/2); //-------37 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 37"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,e); YMF.keyon(1,3,c);delay(L); YMF.keyoff(1); YMF.keyon(1,4,g); YMF.keyon(2,4,c); YMF.keyon(3,3,bw);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,f); YMF.keyon(1,3,c);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,ew); YMF.keyon(1,4,aw); YMF.keyon(2,4,c); YMF.keyon(3,3,aw);delay(L/4*3); YMF.keyoff(0); YMF.keyon(0,5,dw);delay(L/4); //-------38 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 38"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,dw); YMF.keyon(1,3,c);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,c); YMF.keyon(1,4,ew); YMF.keyon(2,3,g);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,5,dw); YMF.keyon(1,3,c);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,c); YMF.keyon(1,4,f); YMF.keyon(2,3,aw); YMF.keyon(3,3,f);delay(L/4*3); YMF.keyoff(0); YMF.keyon(0,4,bw);delay(L/4); //-------39 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 39"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,4,bw); YMF.keyon(1,3,c);delay(L); YMF.keyoff(0); YMF.keyon(0,4,aw); YMF.keyon(2,4,c); YMF.keyon(3,3,ew);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,4,g); YMF.keyon(1,3,c);delay(L); YMF.keyoff(0); YMF.keyon(0,4,bw); YMF.keyon(2,3,b); YMF.keyon(3,3,f); YMF.keyon(4,3,dw);delay(L/8); YMF.keyoff(0); YMF.keyon(0,4,aw);delay(L/8*5); YMF.keyoff(0); YMF.keyon(0,4,g);delay(L/4); //-------40 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 40"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyoff(4); YMF.keyon(0,4,g); YMF.keyon(1,3,c);delay(L); YMF.keyoff(0); YMF.keyon(0,4,g); YMF.keyon(2,4,c); YMF.keyon(3,3,e);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,4,g); YMF.keyon(1,3,c);delay(L); YMF.keyoff(0); YMF.keyon(0,4,bw); YMF.keyon(2,3,b); YMF.keyon(3,3,f); YMF.keyon(4,3,dw);delay(L/8); YMF.keyoff(0); YMF.keyon(0,4,aw); delay(L/8*5); YMF.keyoff(0); YMF.keyon(0,4,g);delay(L/4); //-------41 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 41"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(4); YMF.keyon(0,4,g); YMF.keyon(1,3,c);delay(L); YMF.keyoff(0); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,c); YMF.keyon(2,3,bw); YMF.keyon(3,3,e);delay(L/6*7); YMF.keyoff(0); YMF.keyon(0,5,c);delay(L/6*7); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,c);delay(L/6*7); //-------42 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 42"); YMF.keyon(1,2,f);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,f); YMF.keyon(1,3,aw); YMF.keyon(2,3,c);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,5,ew); YMF.keyon(1,2,g);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,dw); YMF.keyon(1,4,ew); YMF.keyon(2,3,bw); YMF.keyon(3,3,ew);delay(L); //-------43 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 43"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,c); YMF.keyon(1,2,aw);delay(L/4*3); YMF.keyoff(0); YMF.keyon(0,4,b);delay(L/4); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,c); YMF.keyon(1,4,aw); YMF.keyon(2,4,c);delay(L/4*3); YMF.keyoff(0); YMF.keyon(0,5,ew);delay(L/12); YMF.keyoff(0); YMF.keyon(0,5,dw);delay(L/6); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,5,c); YMF.keyon(1,2,e);delay(L); YMF.keyoff(1); YMF.keyon(1,4,g); YMF.keyon(2,4,c); YMF.keyon(3,3,bw);delay(L); //-------44 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 44"); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(1,2,f);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,e); YMF.keyon(1,4,f); YMF.keyon(2,4,c); YMF.keyon(3,3,aw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,g);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,f);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,ew); YMF.keyon(1,2,g);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,ew);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,bw);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,c); YMF.keyon(1,4,ew); YMF.keyon(2,3,bw); YMF.keyon(3,3,ew);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,ew);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,dw);delay(L/3); //-------45 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 45"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,c); YMF.keyon(1,2,aw);delay(L/7*2); YMF.keyoff(0); YMF.keyon(0,4,c);delay(L/7*2); YMF.keyoff(0); YMF.keyon(0,4,ew);delay(L/7*2); YMF.keyoff(0); YMF.keyon(0,4,aw);delay(L/7); YMF.keyoff(1); YMF.keyon(1,4,c); YMF.keyon(2,3,aw); YMF.keyon(3,3,ew);delay(L/7); YMF.keyoff(0); YMF.keyon(0,4,b);delay(L/7*2); YMF.keyoff(0); YMF.keyon(0,5,c);delay(L/7*2); YMF.keyoff(0); YMF.keyon(0,5,ew);delay(L/7); YMF.keyoff(0); YMF.keyon(0,5,dw);delay(L/7); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,c); YMF.keyon(1,2,ew);delay(L); YMF.keyoff(1); YMF.keyon(1,4,g); YMF.keyon(2,4,c); YMF.keyon(3,3,bw);delay(L); //-------46 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 46"); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(1,2,f);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,f); YMF.keyon(1,4,f); YMF.keyon(2,4,c); YMF.keyon(3,3,aw);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,ew); YMF.keyon(1,2,g);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,dw); YMF.keyon(1,4,ew); YMF.keyon(2,3,bw); YMF.keyon(3,3,ew);delay(L); //-------47 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 47"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,c); YMF.keyon(1,2,aw);delay(L); YMF.keyoff(1); YMF.keyon(1,4,aw); YMF.keyon(2,4,ew); YMF.keyon(3,4,c);delay(L/2); YMF.keyoff(0); YMF.keyon(0,4,a);delay(L/6); YMF.keyoff(0); YMF.keyon(0,4,bw);delay(L/6); YMF.keyoff(0); YMF.keyon(0,5,c);delay(L/6); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,4,bw); YMF.keyon(1,2,bw);delay(L/16); for (int i=0;i<4;i++){ // Trill YMF.keyoff(0); YMF.keyon(0,5,c);delay(L/8); YMF.keyoff(0); YMF.keyon(0,4,bw);delay(L/8); } YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(1,4,gw); YMF.keyon(2,4,dw); YMF.keyon(3,3,gw);delay(L-L/8*6); YMF.keyon(0,4,a);delay(L/8); YMF.keyoff(0); YMF.keyon(0,4,bw);delay(L/8); YMF.keyoff(0); YMF.keyon(0,4,b);delay(L/8); YMF.keyoff(0); YMF.keyon(0,5,c);delay(L/8); YMF.keyoff(0); YMF.keyon(0,5,ew);delay(L/8); YMF.keyoff(0); YMF.keyon(0,4,bw);delay(L/8); //-------48 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 48"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,4,aw); YMF.keyon(1,4,c);delay(L); YMF.keyoff(1); YMF.keyon(1,4,f); YMF.keyon(2,4,c); YMF.keyon(3,3,aw);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,3,bw);delay(L/8); YMF.keyoff(0); YMF.keyon(2,3,bw); YMF.keyon(3,2,c);delay(L/8); YMF.keyon(1,4,e);delay(L/8); YMF.keyon(2,3,bw);delay(L/4*3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,4,g); YMF.keyon(1,4,c); YMF.keyon(2,3,c);delay(L/4*3); YMF.keyoff(0); YMF.keyon(0,4,f);delay(L/4); //-------49 L=L2/2 ; // テンポ変更 Piu Mosso M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 49"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,4,f); YMF.keyon(1,3,aw); YMF.keyon(2,3,c); YMF.keyon(3,2,f);delay(L*2); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,3,b); YMF.keyon(1,2,b);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,4,c); YMF.keyon(1,3,c);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,4,dw); YMF.keyon(1,3,dw);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,4,c); YMF.keyon(1,3,c);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,3,g); YMF.keyon(1,2,g);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,3,bw); YMF.keyon(1,2,bw);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,3,aw); YMF.keyon(1,2,aw);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,3,e); YMF.keyon(1,2,e);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,3,g); YMF.keyon(1,2,g);delay(L/3); //-------50 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 50"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,3,f); YMF.keyon(1,2,f);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,f); YMF.keyon(1,4,aw); YMF.keyon(2,4,f); YMF.keyon(3,4,c); YMF.keyon(4,3,f);delay(2*L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyoff(4); YMF.keyon(0,5,f); YMF.keyon(1,4,bw); YMF.keyon(2,4,g); YMF.keyon(3,4,f); YMF.keyon(4,3,dw); YMF.keyon(5,3,f);delay(L); //-------51 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 51"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyoff(4); YMF.keyoff(5); YMF.keyon(0,5,f); YMF.keyon(1,5,c); YMF.keyon(2,4,aw); YMF.keyon(3,4,f); YMF.keyon(4,4,c); YMF.keyon(5,3,f);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyoff(4); YMF.keyoff(5); YMF.keyon(0,3,b); YMF.keyon(1,2,b);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,4,c); YMF.keyon(1,3,c);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,4,dw); YMF.keyon(1,3,dw);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,4,c); YMF.keyon(1,3,c);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,3,g); YMF.keyon(1,2,g);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,3,bw); YMF.keyon(1,2,bw);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,3,aw); YMF.keyon(1,2,aw);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,3,e); YMF.keyon(1,2,e);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,3,f); YMF.keyon(1,2,f);delay(L/3); //-------52 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 52"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,3,g); YMF.keyon(1,2,g);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,ew); YMF.keyon(1,4,g); YMF.keyon(2,4,ew); YMF.keyon(3,4,c); YMF.keyon(4,3,g);delay(2*L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyoff(4); YMF.keyon(0,5,d); YMF.keyon(1,4,g); YMF.keyon(2,4,f); YMF.keyon(3,3,b); YMF.keyon(4,3,g);delay(L); //-------53 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 53"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyoff(4); YMF.keyon(0,5,d);delay(L/8); YMF.keyoff(0); YMF.keyon(0,5,c); YMF.keyon(1,4,g); YMF.keyon(2,4,ew); YMF.keyon(3,4,c); YMF.keyon(4,3,g); YMF.keyon(5,3,c);delay(L/8*5); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyoff(4); YMF.keyoff(5); YMF.keyon(0,4,b); YMF.keyon(1,4,g); YMF.keyon(2,4,f); YMF.keyon(3,4,d); YMF.keyon(4,3,g); YMF.keyon(5,3,c);delay(L/4); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyoff(4); YMF.keyoff(5); YMF.keyon(0,5,c); YMF.keyon(1,4,g); YMF.keyon(2,4,ew); YMF.keyon(3,4,c); YMF.keyon(4,3,g); YMF.keyon(5,3,c);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyoff(4); YMF.keyoff(5); YMF.keyon(0,3,fm); YMF.keyon(1,2,fm);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,3,g); YMF.keyon(1,2,g);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,3,aw); YMF.keyon(1,2,aw);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,3,g); YMF.keyon(1,2,g);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,3,d); YMF.keyon(1,2,d);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,3,ew); YMF.keyon(1,2,ew);delay(L/3); //-------54 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 54"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,3,c); YMF.keyon(1,2,c);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,c); YMF.keyon(1,4,ew); YMF.keyon(2,4,c); YMF.keyon(3,4,g); YMF.keyon(4,3,c);delay(2*L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyoff(4); YMF.keyon(0,5,c); YMF.keyon(1,4,f); YMF.keyon(2,4,d); YMF.keyon(3,4,c); YMF.keyon(4,3,aw); YMF.keyon(5,3,c);delay(L); //-------55 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 55"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyoff(4); YMF.keyoff(5); YMF.keyon(0,5,c); YMF.keyon(1,4,g); YMF.keyon(2,4,ew); YMF.keyon(3,4,c); YMF.keyon(4,3,g); YMF.keyon(5,3,c);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyoff(4); YMF.keyoff(5); YMF.keyon(0,3,fm); YMF.keyon(1,2,fm);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,3,g); YMF.keyon(1,2,g);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,3,aw); YMF.keyon(1,2,aw);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,3,g); YMF.keyon(1,2,g);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,3,d); YMF.keyon(1,2,d);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,3,f); YMF.keyon(1,2,f);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,3,ew); YMF.keyon(1,2,ew);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,2,b); YMF.keyon(1,1,b);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,3,c); YMF.keyon(1,2,c);delay(L/3); //-------56 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 56"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,3,d); YMF.keyon(1,2,d);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,bw); YMF.keyon(1,4,d); YMF.keyon(2,3,bw); YMF.keyon(3,3,g); YMF.keyon(4,3,d);delay(2*L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyoff(4); YMF.keyon(0,4,a); YMF.keyon(1,4,d); YMF.keyon(2,4,c); YMF.keyon(3,3,fm); YMF.keyon(4,3,d);delay(L); //-------57 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 57"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyoff(4); YMF.keyon(0,4,a);delay(L/8); YMF.keyoff(0); YMF.keyon(0,4,g); YMF.keyon(1,4,d); YMF.keyon(2,3,bw); YMF.keyon(3,3,g); YMF.keyon(4,3,d); YMF.keyon(5,2,g);delay(L/4*3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyoff(4); YMF.keyoff(5); YMF.keyon(0,4,fm); YMF.keyon(1,4,d); YMF.keyon(2,4,c); YMF.keyon(3,3,a); YMF.keyon(4,3,d); YMF.keyon(5,2,g);delay(L/4); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyoff(4); YMF.keyoff(5); YMF.keyon(0,4,g); YMF.keyon(1,4,d); YMF.keyon(2,4,bw); YMF.keyon(3,3,g); YMF.keyon(4,3,d); YMF.keyon(5,2,g);delay(L/4); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyoff(4); YMF.keyoff(5); YMF.keyon(0,4,g);delay(L); YMF.keyoff(0); YMF.keyon(0,4,g);delay(L); //-------58 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 58"); YMF.keyoff(0); YMF.keyon(0,5,dw); YMF.keyon(1,2,e);delay(L/3); YMF.keyoff(1); YMF.keyon(1,3,dw);delay(L/3); YMF.keyoff(1); YMF.keyon(1,2,bw);delay(L/3); YMF.keyoff(1); YMF.keyon(1,3,g);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,c); YMF.keyon(1,2,e);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,dw); YMF.keyon(1,3,dw);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,c); YMF.keyon(1,2,bw);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,dw); YMF.keyon(1,3,g);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,ew);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,dw);delay(L/3); //-------59 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 59"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,c); YMF.keyon(1,4,bw); YMF.keyon(2,2,f);delay(L/3); YMF.keyoff(2); YMF.keyon(2,3,c);delay(L/3); YMF.keyoff(2); YMF.keyon(2,2,aw);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,5,f); YMF.keyon(1,4,aw); YMF.keyon(2,3,aw);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,5,f); YMF.keyon(1,4,g); YMF.keyon(2,2,aw);delay(L/3); YMF.keyoff(2); YMF.keyon(2,3,f);delay(L/3); YMF.keyoff(2); YMF.keyon(2,3,c);delay(L/3); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(1,4,f); YMF.keyon(2,4,c);delay(L); //-------60 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 60"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,5,dw); YMF.keyon(1,4,f); YMF.keyon(2,2,e);delay(L/3); YMF.keyoff(2); YMF.keyon(2,2,g);delay(L/3); YMF.keyoff(2); YMF.keyon(2,2,dw);delay(L/3); YMF.keyoff(2); YMF.keyon(2,3,bw);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,5,c); YMF.keyon(1,2,e); YMF.keyon(2,4,e);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,dw); YMF.keyon(1,3,e);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,c); YMF.keyon(1,3,c);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,dw); YMF.keyon(1,3,bw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,ew);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,dw);delay(L/3); //-------61 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 61"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,c); YMF.keyon(1,4,g); YMF.keyon(2,2,aw);delay(L/3); YMF.keyoff(2); YMF.keyon(2,3,ew);delay(L/3); YMF.keyoff(2); YMF.keyon(2,2,aw);delay(L/3); YMF.keyoff(0); YMF.keyoff(2); YMF.keyon(0,5,f); YMF.keyon(1,4,c);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,5,f); YMF.keyon(1,4,f); YMF.keyon(2,2,aw);delay(L/3); YMF.keyoff(2); YMF.keyon(2,3,f);delay(L/3); YMF.keyoff(2); YMF.keyon(2,3,c);delay(L/3); YMF.keyoff(2); YMF.keyon(2,4,c);delay(L); //-------62 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 62"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,5,gw); YMF.keyon(1,5,ew); YMF.keyon(2,2,a);delay(L/3); YMF.keyoff(2); YMF.keyon(2,3,gw);delay(L/3); YMF.keyoff(2); YMF.keyon(2,2,ew);delay(L/3); YMF.keyoff(2); YMF.keyon(2,4,c);delay(L); YMF.keyoff(0); YMF.keyoff(2); YMF.keyon(0,5,f); YMF.keyon(2,2,a);delay(L/3); YMF.keyoff(0); YMF.keyoff(2); YMF.keyon(0,5,gw); YMF.keyon(2,3,gw);delay(L/3); YMF.keyoff(0); YMF.keyoff(2); YMF.keyon(0,5,f); YMF.keyon(2,3,ew);delay(L/3); YMF.keyoff(0); YMF.keyoff(2); YMF.keyon(0,5,gw); YMF.keyon(2,4,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,aw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,gw);delay(L/3); //-------63 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 63"); YMF.keyoff(0); YMF.keyoff(2); YMF.keyon(0,5,f); YMF.keyon(2,2,bw);delay(L/3); YMF.keyoff(2); YMF.keyon(2,3,f);delay(L/3); YMF.keyoff(2); YMF.keyon(2,3,bw);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,5,bw); YMF.keyon(1,5,dw); YMF.keyon(2,4,dw);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,5,bw); YMF.keyon(1,5,c); YMF.keyon(2,3,dw);delay(L/3); YMF.keyoff(2); YMF.keyon(2,3,bw);delay(L/3); YMF.keyoff(2); YMF.keyon(2,3,f);delay(L/3); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(1,4,bw); YMF.keyon(2,4,f);delay(L); //-------64 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 62"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,5,gw); YMF.keyon(1,4,bw); YMF.keyon(2,3,c);delay(L/3); YMF.keyoff(2); YMF.keyon(2,3,bw);delay(L/3); YMF.keyoff(2); YMF.keyon(2,2,gw);delay(L/3); YMF.keyoff(2); YMF.keyon(2,4,ew);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,5,f); YMF.keyon(1,4,a); YMF.keyon(2,3,c);delay(L/3); YMF.keyoff(0); YMF.keyoff(2); YMF.keyon(0,5,gw); YMF.keyon(2,3,a);delay(L/3); YMF.keyoff(0); YMF.keyoff(2); YMF.keyon(0,5,f); YMF.keyon(2,3,f);delay(L/3); YMF.keyoff(0); YMF.keyoff(2); YMF.keyon(0,5,gw); YMF.keyon(2,4,ew);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,aw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,gw);delay(L/3); //-------65 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 65"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,5,f); YMF.keyon(1,5,c); YMF.keyon(2,3,dw);delay(L/3); YMF.keyoff(2); YMF.keyon(2,3,aw);delay(L/3); YMF.keyoff(2); YMF.keyon(2,2,f);delay(L/3); YMF.keyoff(0); YMF.keyoff(2); YMF.keyon(0,5,bw); YMF.keyon(1,4,f);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,5,bw); YMF.keyon(1,4,bw); YMF.keyon(2,3,dw);delay(L/3); YMF.keyoff(2); YMF.keyon(2,3,bw);delay(L/3); YMF.keyoff(2); YMF.keyon(2,3,f);delay(L/3); YMF.keyoff(2); YMF.keyon(2,4,f);delay(L); //-------66 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 66"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,5,bw); YMF.keyon(1,5,dw); YMF.keyon(3,4,bw); YMF.keyon(2,2,dw);delay(L/3); YMF.keyoff(2); YMF.keyon(2,3,bw);delay(L/3); YMF.keyoff(2); YMF.keyon(2,3,gw);delay(L/3); YMF.keyoff(2); YMF.keyon(2,4,gw);delay(L); YMF.keyoff(0); YMF.keyoff(2); YMF.keyon(0,5,aw); YMF.keyon(2,3,dw);delay(L/3); YMF.keyoff(2); YMF.keyon(2,3,bw);delay(L/3); YMF.keyoff(2); YMF.keyon(2,3,gw);delay(L/3); YMF.keyoff(2); YMF.keyon(2,4,gw);delay(L/2); YMF.keyoff(0); YMF.keyon(0,5,gw);delay(L/2); //-------67 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 67"); YMF.keyoff(0);YMF.keyoff(1);YMF.keyoff(2);YMF.keyoff(3); YMF.keyon(0,5,gw); YMF.keyon(1,5,bw); YMF.keyon(3,4,gw); YMF.keyon(2,3,dw);delay(L/3); YMF.keyoff(2); YMF.keyon(2,3,bw);delay(L/3); YMF.keyoff(2); YMF.keyon(2,3,gw);delay(L/3); YMF.keyoff(2); YMF.keyon(2,4,dw);delay(L); YMF.keyoff(0); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,f); YMF.keyon(3,4,f); YMF.keyon(2,3,dw);delay(L/3); YMF.keyoff(2); YMF.keyon(2,3,bw);delay(L/3); YMF.keyoff(2); YMF.keyon(2,3,gw);delay(L/3); YMF.keyoff(2); YMF.keyon(2,4,dw);delay(L); //-------68 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 68"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,f); YMF.keyon(1,4,bw); YMF.keyon(3,4,f); YMF.keyon(2,3,dw);delay(L/3); YMF.keyoff(2); YMF.keyon(2,3,bw);delay(L/3); YMF.keyoff(2); YMF.keyon(2,3,g);delay(L/3); YMF.keyoff(2); YMF.keyon(2,4,dw);delay(L); YMF.keyoff(0); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,e); YMF.keyon(3,4,e); YMF.keyon(2,3,dw);delay(L/3); YMF.keyoff(2); YMF.keyon(2,3,bw);delay(L/3); YMF.keyoff(2); YMF.keyon(2,3,g);delay(L/3); YMF.keyoff(2); YMF.keyon(2,4,dw);delay(L); //-------69 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 69"); YMF.keyoff(2); YMF.keyon(2,3,dw);delay(L/3); YMF.keyoff(2); YMF.keyon(2,3,bw);delay(L/3); YMF.keyoff(2); YMF.keyon(2,3,g);delay(L/3); YMF.keyoff(2); YMF.keyon(2,4,dw);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,e); YMF.keyon(1,4,bw); YMF.keyon(2,4,e); YMF.keyon(3,3,dw);delay(L/3); YMF.keyoff(3); YMF.keyon(3,3,bw);delay(L/3); YMF.keyoff(3); YMF.keyon(3,3,g);delay(L/3); YMF.keyoff(3); YMF.keyon(3,4,dw);delay(L/2); YMF.keyoff(0); YMF.keyoff(2); YMF.keyon(0,5,f); YMF.keyon(2,4,f);delay(L/2); //-------70 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 70"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,f); YMF.keyon(1,4,aw); YMF.keyon(2,4,f); YMF.keyon(3,3,b); YMF.keyon(4,3,aw); YMF.keyon(5,3,dw);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyoff(4); YMF.keyoff(5); YMF.keyoff(0); YMF.keyon(0,6,f);delay(L/4); YMF.keyoff(0); YMF.keyon(0,6,ew);delay(L/4); YMF.keyoff(0); YMF.keyon(0,6,dw);delay(L/4); YMF.keyoff(0); YMF.keyon(0,6,c);delay(L/4);L=L2*0.5; YMF.keyoff(0); YMF.keyon(0,5,b);delay(L/4); YMF.keyoff(0); YMF.keyon(0,5,aw);delay(L/4); YMF.keyoff(0); YMF.keyon(0,5,g);delay(L/4); YMF.keyoff(0); YMF.keyon(0,5,f);delay(L/4);L=L2*0.6; YMF.keyoff(0); YMF.keyon(0,5,e);delay(L/4); YMF.keyoff(0); YMF.keyon(0,5,f);delay(L/4); YMF.keyoff(0); YMF.keyon(0,5,ew);delay(L/4); YMF.keyoff(0); YMF.keyon(0,5,dw);delay(L/4);L=L2*0.7; //-------71 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 71"); YMF.keyoff(0); YMF.keyon(0,5,c);delay(L/4); YMF.keyoff(0); YMF.keyon(0,4,b);delay(L/4); YMF.keyoff(0); YMF.keyon(0,4,aw);delay(L/4); YMF.keyoff(0); YMF.keyon(0,4,g);delay(L/4); YMF.keyoff(0); YMF.keyon(0,4,bw);delay(L/4); YMF.keyoff(0); YMF.keyon(0,4,aw);delay(L/4);L=L2*0.8; YMF.keyoff(0); YMF.keyon(0,4,g);delay(L/4); YMF.keyoff(0); YMF.keyon(0,4,f);delay(L/4); YMF.keyoff(0); YMF.keyon(0,4,e);delay(L/4); YMF.keyoff(0); YMF.keyon(0,4,f);delay(L/4); YMF.keyoff(0); YMF.keyon(0,4,ew);delay(L/4);L=L2*0.9; YMF.keyoff(0); YMF.keyon(0,4,dw);delay(L/4); YMF.keyoff(0); YMF.keyon(0,4,c);delay(L/4); YMF.keyoff(0); YMF.keyon(0,4,dw);delay(L/4); YMF.keyoff(0); YMF.keyon(0,3,aw);delay(L/4); YMF.keyoff(0); YMF.keyon(0,3,bw);delay(L/4); //-------72 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 72"); YMF.keyoff(0); YMF.keyon(0,4,c);delay(L/2); YMF.keyon(1,3,g); YMF.keyon(2,3,e); YMF.keyon(3,3,c);delay(L/2); YMF.keyoff(0); YMF.keyon(0,4,dw);delay(L/2); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(1,3,aw); YMF.keyon(2,3,f); YMF.keyon(3,2,b);delay(L/2); YMF.keyoff(0); YMF.keyon(0,4,f);delay(L/2); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(1,4,d); YMF.keyon(2,3,aw); YMF.keyon(3,2,bw);delay(L/2); YMF.keyoff(0); YMF.keyon(0,4,e);delay(L/2); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(1,4,d); YMF.keyon(2,3,gm); YMF.keyon(3,2,e);delay(L/2); //-------73 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 73"); YMF.keyoff(0);L=750; YMF.keyon(0,4,e);delay(L/2); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(1,4,cm); YMF.keyon(2,3,g); YMF.keyon(3,2,a);delay(L/2); YMF.keyoff(0); YMF.keyon(0,4,f);delay(L/2); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(1,4,c); YMF.keyon(2,3,f); YMF.keyon(3,2,aw);delay(L/2); YMF.keyoff(0); YMF.keyon(0,4,aw);delay(L/2); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(1,4,f); YMF.keyon(2,3,b); YMF.keyon(3,2,g);delay(L/2); YMF.keyoff(0); YMF.keyon(0,4,g);delay(L/2*3);//フェルマータ YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3);L=800; YMF.keyon(1,4,e); YMF.keyon(2,3,bw); YMF.keyon(3,2,c);delay(L/2); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,c);delay(L/2); //-------74 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 74"); YMF.keyon(1,2,f);delay(L);L=L2; YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,f); YMF.keyon(1,4,f); YMF.keyon(2,4,c); YMF.keyon(3,3,aw);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,ew); YMF.keyon(1,2,g);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,dw); YMF.keyon(1,4,ew); YMF.keyon(2,3,bw); YMF.keyon(3,3,ew);delay(L); //-------75 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 75"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,c); YMF.keyon(1,2,aw);delay(L/4*3); YMF.keyoff(0); YMF.keyon(0,4,b);delay(L/4); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,c); YMF.keyon(1,4,aw); YMF.keyon(2,4,c);delay(L/4*3); YMF.keyoff(0); YMF.keyon(0,5,dw);delay(L/4); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,5,c); YMF.keyon(1,2,e);delay(L); YMF.keyoff(1); YMF.keyon(1,4,g); YMF.keyon(2,4,c); YMF.keyon(3,3,bw);delay(L); //-------76 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 76"); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(1,2,f);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,e); YMF.keyon(1,4,f); YMF.keyon(2,4,c); YMF.keyon(3,3,aw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,g);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,f);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,ew); YMF.keyon(1,2,g);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,ew);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,bw);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,c); YMF.keyon(1,4,ew); YMF.keyon(2,3,bw); YMF.keyon(3,3,ew);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,ew);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,dw);delay(L/3); //-------77 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 77"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,c); YMF.keyon(1,2,aw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,ew);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,4,aw); YMF.keyon(1,4,c); YMF.keyon(2,3,aw); YMF.keyon(3,3,ew);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,b);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,dw);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,c); YMF.keyon(1,2,ew);delay(L); YMF.keyoff(1); YMF.keyon(1,4,g); YMF.keyon(2,4,c); YMF.keyon(3,3,bw);delay(L); //-------78 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 78"); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(1,2,f);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,f); YMF.keyon(1,4,aw); YMF.keyon(2,4,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,f);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,6,e); YMF.keyon(1,3,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,g);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,e);delay(L/3); YMF.keyoff(0); YMF.keyoff(1);L=L2*0.9; YMF.keyon(0,5,aw); YMF.keyon(1,5,c); YMF.keyon(2,4,f); YMF.keyon(3,4,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,ew);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,a);delay(L/3); //-------79 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 79");L=L2*0.8; YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,6,d); YMF.keyon(1,2,bw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,bw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,d);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,6,dw); YMF.keyon(1,4,bw); YMF.keyon(2,4,f); YMF.keyon(3,4,dw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,dw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,dw);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3);L=L2*0.7; YMF.keyon(0,6,c); YMF.keyon(1,3,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,d);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,c);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,ew); YMF.keyon(1,4,bw); YMF.keyon(2,4,g); YMF.keyon(3,4,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,bw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,e);delay(L/3); //-------80 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 80"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3);L=L2*0.6; YMF.keyon(0,5,a); YMF.keyon(1,3,dw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,a);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,aw); YMF.keyon(1,4,f); YMF.keyon(2,4,dw); YMF.keyon(3,3,aw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,aw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,aw);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,g); YMF.keyon(1,2,bw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,dw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,g);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,gw); YMF.keyon(1,4,dw); YMF.keyon(2,3,bw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,gw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,gw);delay(L/3); //-------81 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 81"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,f); YMF.keyon(1,3,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,aw);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,c); YMF.keyon(1,4,c); YMF.keyon(2,3,aw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,ew);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,dw);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,5,c); YMF.keyon(1,2,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,e);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,g);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,4,b); YMF.keyon(1,4,c); YMF.keyon(2,3,g); YMF.keyon(3,3,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,bw);delay(L/3); //-------82 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 82"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,4,a); YMF.keyon(1,2,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,aw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,f);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,f); YMF.keyon(1,4,c); YMF.keyon(2,3,aw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,f);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,4,g); YMF.keyon(1,2,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,e);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,aw);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,ew); YMF.keyon(1,4,f); YMF.keyon(2,4,c); YMF.keyon(3,3,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,a);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,ew);delay(L/3); //-------83 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 83"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,5,d); YMF.keyon(1,2,bw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,bw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,d);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,dw); YMF.keyon(1,4,f); YMF.keyon(2,3,bw); YMF.keyon(3,3,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,dw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,dw);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,4,d); YMF.keyon(1,3,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,ew);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,4,bw); YMF.keyon(1,4,c); YMF.keyon(2,4,g);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,e);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,bw);delay(L/3); //-------84 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 84"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,4,a); YMF.keyon(1,3,dw); YMF.keyon(1,2,dw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,a);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,4,aw); YMF.keyon(1,3,aw); YMF.keyon(2,3,dw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,dw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,aw);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,4,gw); YMF.keyon(1,3,bw); YMF.keyon(2,2,bw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,dw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,gw);delay(L/3); YMF.keyoff(0); YMF.keyoff(1);YMF.keyoff(2); YMF.keyon(0,4,f); YMF.keyon(1,3,aw); YMF.keyon(2,3,b);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,dw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,f);delay(L/3); //-------85 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 85"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyon(0,4,gw); YMF.keyon(1,3,bw); YMF.keyon(1,2,bw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,dw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,gw);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,4,f); YMF.keyon(1,3,aw); YMF.keyon(2,2,b);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,dw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,f);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,5,c); YMF.keyon(1,3,aw); YMF.keyon(2,3,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,f);delay(L/3); YMF.keyoff(0); YMF.keyoff(1);YMF.keyoff(2); YMF.keyon(0,4,e); YMF.keyon(1,3,g); YMF.keyon(2,3,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,3,bw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,c);delay(L/3); //-------86 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 86"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,4,f); YMF.keyon(2,2,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,3,aw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,c);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,3,a); YMF.keyon(1,3,gw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,ew);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,4,gw); YMF.keyon(1,3,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,a);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,c);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,ew); YMF.keyon(1,3,ew);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,gw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,a);delay(L/3); //-------87 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 87"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,6,gw); YMF.keyon(1,3,ew);YMF.keyon(2,2,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,ew);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,a);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,gw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,c);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,5,ew); YMF.keyon(1,3,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,a);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,gw);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,4,c); YMF.keyon(1,3,ew);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,ew);delay(L/3); YMF.keyoff(0); YMF.keyon(0,3,a);delay(L/3); //-------88 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 88"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,3,bw); YMF.keyon(1,3,dw); YMF.keyon(2,2,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,3,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,3,g);delay(L/3); YMF.keyoff(0); YMF.keyon(0,3,bw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,dw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,f);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,4,g); YMF.keyon(1,3,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,bw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,dw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,g);delay(L/6); YMF.keyoff(1); YMF.keyon(1,2,bw);delay(L/6); YMF.keyoff(0); YMF.keyon(0,5,bw);delay(L/3); //-------89 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 89"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,6,dw); YMF.keyon(1,2,bw);YMF.keyon(2,2,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,g);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,bw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,e);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,dw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,g);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,4,bw); YMF.keyon(1,3,dw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,e);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,dw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,3,g);delay(L/3); YMF.keyoff(0); YMF.keyon(0,3,bw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,3,e);delay(L/3); //-------90 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 90"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyon(0,3,f); YMF.keyon(1,3,c); YMF.keyon(2,2,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,3,a);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,3,bw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,c);delay(L/3); YMF.keyoff(0); YMF.keyoff(1); YMF.keyon(0,3,a); YMF.keyon(1,3,a);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,a);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,d);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,f);delay(L/3); //-------91 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 91"); YMF.keyoff(0); YMF.keyon(0,4,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,a);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,g);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,a);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,a);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,bw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,c);delay(L/3); //-------92 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 92"); YMF.keyoff(0); YMF.keyon(0,4,a);delay(L/3);L=700; YMF.keyoff(0); YMF.keyon(0,5,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,a);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,d);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,a);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,g);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,a);delay(L/3); //-------93 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 93"); YMF.keyoff(0); YMF.keyon(0,5,f);delay(L/3);L=650; YMF.keyoff(0); YMF.keyon(0,5,a);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,bw);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,5,a);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,a);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,d);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,f);delay(L/3); //-------94 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 94"); YMF.keyoff(0); YMF.keyon(0,6,c);delay(L/3);L=600; YMF.keyoff(0); YMF.keyon(0,6,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,a);delay(L/3); YMF.keyoff(0); YMF.keyon(0,7,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,g);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,a);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,a);delay(L/3); YMF.keyoff(0); YMF.keyon(0,7,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,7,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,g);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,a);delay(L/3); //-------95 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 95"); YMF.keyoff(0); YMF.keyon(0,6,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,a);delay(L/3); YMF.keyoff(0); YMF.keyon(0,7,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,7,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,g);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,a);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,a);delay(L/3); YMF.keyoff(0); YMF.keyon(0,7,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,7,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,g);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,a);delay(L/3); //-------96 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 96"); YMF.keyoff(0); YMF.keyon(0,6,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,a);delay(L/3); YMF.keyoff(0); YMF.keyon(0,7,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,7,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,g);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,a);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,a);delay(L/3); YMF.keyoff(0); YMF.keyon(0,7,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,7,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,g);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,a);delay(L/3); //-------97 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 97"); YMF.keyoff(0); YMF.keyon(0,6,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,a);delay(L/3); YMF.keyoff(0); YMF.keyon(0,7,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,7,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,g);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,a);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,a);delay(L/3); YMF.keyoff(0); YMF.keyon(0,7,c);delay(L/3); YMF.keyoff(0); YMF.keyon(0,7,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,g);delay(L/3); YMF.keyoff(0); YMF.keyon(0,6,a);delay(L/3); //-------98 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 98"); YMF.keyoff(0); YMF.keyon(0,6,f);YMF.keyon(1,3,a);YMF.keyon(2,3,c);YMF.keyon(3,2,f);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); delay(L*3); //-------99 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 99");L=L2; YMF.keyon(0,5,dw); YMF.keyon(1,4,g); YMF.keyon(2,4,f); YMF.keyon(3,4,dw); YMF.keyon(4,2,bw); YMF.keyon(5,1,bw);delay(L*2); YMF.keyoff(0); YMF.keyoff(2); YMF.keyoff(3); YMF.keyoff(4); YMF.keyoff(5); YMF.keyon(0,5,c); YMF.keyon(2,4,e); YMF.keyon(3,3,bw); YMF.keyon(4,3,c); YMF.keyon(5,2,c); delay(L*2); //-------100 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 100");L=L2; YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyoff(4); YMF.keyoff(5); YMF.keyon(0,2,f); delay(L/5); YMF.keyon(5,3,c); delay(L/5); YMF.keyon(4,3,f); delay(L/5); YMF.keyon(3,3,a); delay(L/5); YMF.keyon(2,4,c); delay(L/5); YMF.keyon(1,4,f); delay(L/5); YMF.keyoff(0); YMF.keyon(0,4,a); delay(L*3); //-------101 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 101"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyoff(4); YMF.keyoff(5); YMF.keyon(0,2,f);delay(L/5); YMF.keyon(5,3,c);delay(L/5); YMF.keyon(4,3,f);delay(L/5); YMF.keyon(3,3,a);delay(L/5); YMF.keyon(2,4,c);delay(L/5); YMF.keyon(1,4,f);delay(L/5); YMF.keyoff(0); YMF.keyon(0,4,a);delay(L); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyoff(4); YMF.keyoff(5); YMF.keyon(0,2,f);delay(L/5); YMF.keyon(5,3,c);delay(L/5); YMF.keyon(4,3,f);delay(L/5); YMF.keyon(3,3,a);delay(L/5); YMF.keyon(2,4,c);delay(L/5); YMF.keyon(1,4,f);delay(L/5); YMF.keyoff(0); YMF.keyon(0,4,a);delay(L); //-------102 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 102"); YMF.keyoff(0); YMF.keyoff(1); YMF.keyoff(2); YMF.keyoff(3); YMF.keyoff(4); YMF.keyoff(5); YMF.keyon(0,2,f);delay(L/5); YMF.keyon(5,3,c);delay(L/5); YMF.keyon(4,3,f);delay(L/4); YMF.keyon(3,3,a);delay(L/4); YMF.keyon(2,4,c);delay(L/3); YMF.keyon(1,4,f);delay(L/3); YMF.keyoff(0); YMF.keyon(0,4,a);delay(L*4); delay(5000); }
 今回は、102小節。なにか病みつきになりました(^o^)/


R2.3.27 シャコンヌの打ち込み

 音名を数字で打ち込むのはなかなか難しいものです。慣れればそれなりにできますが、頭の中で音名を数字に変換するわけで時々ミスるのですね。そこで、音名をそのままアルファベットで表記できるようにしました。最初からそうすればよかった。

#define c 0 #define cm 1 #define d 2 #define dm 3  ・  ・  ・ //-------16 M5.Lcd.setCursor(120,160); M5.Lcd.print("Bar 16"); YMF825.keyoff(0); YMF825.keyon(0,5,d); YMF825.keyon(1,4,f); YMF825.keyon(2,3,a); delay(L/4*3); YMF825.keyoff(0); YMF825.keyoff(1); YMF825.keyoff(2); YMF825.keyon(0,5,e); YMF825.keyon(1,4,g); YMF825.keyon(2,3,g); delay(L/4); YMF825.keyoff(0); YMF825.keyoff(1); YMF825.keyoff(2); YMF825.keyon(0,5,d); YMF825.keyon(1,4,e); YMF825.keyon(2,3,a); delay(L); YMF825.keyoff(0); YMF825.keyon(0,5,cm);delay(L/4*3); YMF825.keyoff(0); YMF825.keyon(0,5,d); delay(L/4);
ただ、データ量はとても多く、上の16小節目のような記述をして、257小節・5232行ありました。


R2.3.26 M5Stackでバッハのシャコンヌ

 ここで聞くことができます。

 少々気合を入れて打ち込んでいきました。本当はブゾーニ編曲のピアノ楽譜を使いたかったのですが、和音が沢山あって大変そうだったので、バイオリンの楽譜を使いました。小節のコピペをして音名の変更だけで済むパッセージが多かったので、それなりに楽でした。一応何回も聞いて確認したので、大きな間違いはないと思います(^^;) 楽譜とプログラムデータとの逐一比較はしませんでした。大変なので(^^;)

 次作はやはりバッハのパッサカリアとフーガBWV582を選ぼうと考えてます。そして、それが最後。次なるM5Stackでの音楽を考えようと思います。MIDIかな? ねこびっとさんからM5Stack用のMIDIボックス2が出るようなので。


R2.3.19 M5Stackで月光

 Paganiniは2チャンネルが同時発音だったので、あのようなやり方でよかったのですが、チャンネルごとにテンポが異なる場合もあるので、今回はそのことに挑戦しました。ただ、入力が楽そうな曲を選んで、ベートーベンの月光としました。3連符の繰り返しが楽。

 第5小節を例に挙げます。3連符の繰り返しを1CH、メロディーを0CH、左手の低音伴奏を2・3CHとしています。delay(340)を3つで4分音符1拍分です。

// 5 小節目 M5.Lcd.setCursor(80,110); M5.Lcd.print("Bar 5"); YMF825.keyon(1,3,4); YMF825.keyon(2,2,8); YMF825.keyon(3,3,1); delay(340); YMF825.keyoff(1); YMF825.keyon(1,3,8); delay(340); YMF825.keyoff(1); YMF825.keyon(1,4,1); delay(340); YMF825.keyoff(1); YMF825.keyon(1,3,8); delay(340); YMF825.keyoff(1); YMF825.keyon(1,4,1); delay(340); YMF825.keyoff(1); YMF825.keyon(1,4,4); delay(340); YMF825.keyoff(1); YMF825.keyon(1,3,8); delay(340); YMF825.keyoff(1); YMF825.keyon(1,4,1); delay(340); YMF825.keyoff(1); YMF825.keyon(1,4,4); delay(340); YMF825.keyoff(1); YMF825.keyon(1,3,8); YMF825.keyon(0,4,8); delay(340); YMF825.keyoff(1); YMF825.keyon(1,4,1); delay(340); YMF825.keyoff(1); YMF825.keyon(1,4,4); delay(84); YMF825.keyoff(0); YMF825.keyon(0,4,8); delay(256); YMF825.keyoff(0); YMF825.keyoff(1); YMF825.keyoff(2); YMF825.keyoff(3);
 音符の長さを delay()で 決めます。今回は4分音符を1024としました。8分音符が512、16分音符が256という具合に割り切れていかねばならないからですね。でも、3連符の場合割り切れないのですね。340としていますが、どうなんでしょう? このページの画面、見やすいですね。こんな感じで入力したら見やすく楽かもしれません。

 月光、9小節まではここで聞くことができます。録画するときに、そばにあった桐の箱を高さ調節に使ったら、思いの外、共鳴箱になっていい音になりました(^^)/

 R2.3.20 一応の完成版は、ここで聞くことができます。


R2.3.18 M5StackでPaganini

 内蔵したはいいけれど、M5Stackの電源を入れたら、中のYMF825にも電源が入ってしまいました。下の画像の無意味な円形窓からLEDの灯りが見えてました。そりゃそうだ。ということで、再度分解してスイッチを入れました。

 Paganiniの24の奇想曲の中の24番目、その第6変奏曲は、今回の挑戦にふさわしい。それなりに名曲で、入力も簡単そう(^^;) こんな感じにしてみました。


void Play(int a,int b,int c,int d,int e){ // a:オクターブ  b:KEY c:オクターブ  d:KEY e:delay YMF825.keyon(0, a, b); YMF825.keyon(9, c, d); delay(e); YMF825.keyoff(0); YMF825.keyoff(9); delay(50); } void loop(){ M5.Lcd.drawJpgFile(SD, "/jpg/Cap1.jpg"); for (int i=0;i<2;i++){ // 1 , 2 , 5 , 6 小説番号 Play(6,4,6,0,768); Play(6,2,5,11,128); Play(6,0,5,9,128); Play(5,11,5,8,128); Play(5,9,5,5,128); Play(5,8,5,4,128); Play(5,5,5,2,128); Play(5,4,5,0,128); Play(5,2,4,11,128); Play(5,0,4,9,128); Play(4,11,4,8,128); // 3 , 4 , 7 , 8 Play(5,0,4,9,768); Play(5,2,4,11,128); Play(5,4,5,0,128); Play(5,2,4,11,128); Play(5,0,4,9,128); Play(4,11,4,8,128); Play(4,9,4,5,128); Play(4,8,4,4,512); } // 9 M5.Lcd.drawJpgFile(SD, "/jpg/Cap2.jpg"); Play(6,1,4,9,768); Play(6,2,4,11,128); Play(6,4,5,1,128); // 10 Play(6,5,5,2,128); Play(6,7,5,4,128); Play(6,9,5,5,128); Play(6,11,5,7,128); Play(7,1,5,9,128); Play(7,2,5,11,128); Play(7,4,6,1,128); Play(7,5,6,2,128); // 11 Play(4,11,3,7,768); Play(5,0,3,9,128); Play(5,2,3,11,128); // 12 Play(5,4,4,0,128); Play(5,5,4,2,128); Play(5,7,4,4,128); Play(5,9,4,5,128); Play(5,11,4,7,128); Play(6,0,4,9,128); Play(6,2,4,11,128); Play(6,4,5,0,128); // 13 Play(6,5,5,2,768); Play(6,4,5,0,128); Play(6,2,4,11,128); // 14 Play(6,4,5,0,768); Play(6,2,4,11,128); Play(6,0,4,9,128); // 15 Play(5,5,4,2,256); Play(5,4,4,4,128); Play(5,2,4,5,128); Play(5,0,4,4,128); Play(5,0,4,9,128); Play(4,11,4,4,128); Play(4,11,4,8,128); // 16 Play(4,9,4,9,512); Play(3,9,3,9,256); delay(5000); }
 入力は慣れている秀丸エディタで行いました。面倒かな? と思っていた数値入力は楽譜に予めキー番号を書き込んでおいて、機械的に入力したので、難しくはなかったですね。短い曲で、高音と低音の和音が同じ長さで進行したので楽だったのかも。まあ、そういう曲を選んだのですけれど。ついでに画像も入れましたが、切り替わるときに間が空きすぎますね。

ここで聞けます。


R2.3.17 M5StackにFM音源を内蔵してみた

 M5StackでYMF825を鳴らすことができたので、M5Stackに内蔵してみました。余っていたバッテリーのケースと基板を使うことにしました。

 スピーカーは大分前に購入していた小型のもの。スピーカーの上に6mmの穴が開いていますが、3.5mmジャックを使おうと思って開けた穴ですが、ジャックの厚さが厚すぎて入らないので空いたままになってしまいました(^^;)

 鳴らしてみると、スピーカーの位置が良くないのですが、それなりに聞こえます。ここで聞けます。

 高さが7mmほどしかないので、配線の取り回しが良くなかったのか、若干隙間が空いてしまっています。

 これで、ブレッドボードでの配線に気を遣わなくてプログラミングできるので楽になりました。

 けれど、大分大きくなってしまったなぁ〜(^^;)


R2.3.16_2 M5StackでFM音源モジュール

 あれこれネットで検索しながら考えて、スレーブセレクトピンとリセットピンをどれにするか。デジタルで出力できればどこでもいいんじゃないかと考えました。で、16・17ピンを選択。下の記事で使った DoReMi.ino で読み込む SimpleYMF825.cpp のピンナンバー定義で、#define PIN_RST_N 16  #define PIN_SS 17 としました。午前中に、検証・コンパイルしたときは、何回かdigitalWriteで止まったので、ledcWriteに書き換えたり、「LOWって何のこと?」みたいに言われたので、#DEFINE LOW 0 としたりしました。ただ、書き込むことはできても音が出ませんでした。

 夕方になって再開し、上のように16・17ピンをSS・RSTピンに使い、digitalWriteに戻したりして書きこんだところ、不思議なことにスンナリ音が出たのです(^^;) なんのこっちゃ!

 下図が接続図。間違えていたらごめん!

 ということで、次はこの基盤(かなり小さいです 上図では大きく見えるけど)をM5Stackの中に組み入れることです。そして、曲ファイルを作ること。和音が出るので、1曲作るのにかなり時間がかかるようです。

 ここで見ることができます。


R2.3.16 FM音源モジュールでパガニーニ演奏

 いろいろ検索していたら、昨夜、西村備山さんのGitHubのページを発見! これは素晴らしいスケッチで使いやすいものでした。西村さんありがとう! 早速使わせていただきました。

 YFM825の持っている音色を自由に使うことができます。さらに、SimpleYMF825ファイル群のSimpleYMF825.cpp・SimpleYMF825.h・ToneData.hファイルはなかなか勉強になります、分からないこと多いけど(^^;) DoReMi.inoを使っていろんな試しが行えて、簡単な楽器4つ程度の室内楽ならできそうです。

 でも、やっぱりこれをM5Stackでどう走らせるかですね。まだ未着手です。スレーブセレクトがどのピンになるのか? 21ピンという情報を見ましたが、このピンI2Cのピンですよね? まあ、試行錯誤で行けばいいんでしょうけど。


R2.3.15_2 FM音源モジュールでパガニーニ演奏

 短い曲で簡単に打ち込めるもの。パガニーニの 24Caprices 最後の中のテーマ部分を演奏させてみました。 ここで聞くことができます。

 音を出す関数 Play(); に LOOP の中からデータを入れています。


void Play(int i,int j){ Fmdriver_sendMidi(0x90); Fmdriver_sendMidi(i); Fmdriver_sendMidi(0x7f); delay(j); Fmdriver_sendMidi(0x90); Fmdriver_sendMidi(i); Fmdriver_sendMidi(0x00); delay(10); }
 打ち込みが見やすいように小節ごとに行を変えています。いずれ、音符(音程と長さ)データを配列に入れて、SDカードに置いておくようにすれば便利ですね。ただ、ビープ音と変わりないね。音色変更と和音ができればそれなりになってくるのでしょう。MIDIケーブルで音源(ミク含めていくつかあるので)つないで鳴らしてもいいけれど、M5Stack単体での運用を考えています、あくまでコンパクトに。


void loop() { Play(0x3c,500);//do 48 Play(0x3e,500);//re 4a Play(0x40,500);//mi 4c Play(0x41,500);//fa 4d Play(0x43,500);//so 4f Play(0x45,500);//ra 51 Play(0x47,500);//si 53 Play(0x48,500);//do 54 delay(1000); for (int i=0 ;i<2 ;i++){ Play(0x45,400);Play(0x45,150);Play(0x45,150);Play(0x48,150);Play(0x47,150);Play(0x45,150); Play(0x4c,400);Play(0x40,150);Play(0x40,150);Play(0x44,150);Play(0x42,150);Play(0x40,150); Play(0x45,400);Play(0x45,150);Play(0x45,150);Play(0x48,150);Play(0x47,150);Play(0x45,150); Play(0x4c,600);Play(0x40,300); delay(500); } Play(0x51,400);Play(0x51,150);Play(0x51,150);Play(0x52,150);Play(0x51,150);Play(0x4f,150); Play(0x4d,400);Play(0x4a,150);Play(0x4a,150);Play(0x4d,150);Play(0x4c,150);Play(0x4a,150); Play(0x4f,400);Play(0x4f,150);Play(0x4f,150);Play(0x51,150);Play(0x4f,150);Play(0x4d,150); Play(0x4c,400);Play(0x48,150);Play(0x48,150);Play(0x4c,150);Play(0x4a,150);Play(0x48,150); Play(0x4d,400);Play(0x47,150);Play(0x47,150);Play(0x4a,150);Play(0x48,150);Play(0x47,150); Play(0x4c,400);Play(0x45,150);Play(0x45,150);Play(0x48,150);Play(0x47,150);Play(0x45,150); Play(0x41,400);Play(0x4b,150);Play(0x40,150);Play(0x4c,150);Play(0x4a,150);Play(0x47,150); Play(0x45,400);Play(0x39,400); delay(1000); }


R2.3.15 FM音源モジュール

 FM音源モジュールが届きましたので、早速 ArduinoNano を使ってみました。ArduinoではYAMAHAさんのGitHubページからダウンロードできるサンプルスケッチを使うとすぐに鳴らすことができます。感謝ですね。

 接続法は、見にくいけれど下記の通り。どこかのページでリセットピンはつながなくても大丈夫ということで、外してみても音は鳴ってました。

 発音のさせ方は、スケッチ1とスケッチ2とでは違います。スケッチ2の方が私には扱いやすかったですね。

 下にあるのが発音させるときの記述。スケッチ1の方は音出し(keyon)と音止め(keyoff)の表現の音出しで fnumh fnuml を keyon 関数に渡しますが、その fnumh fnuml と音名が一致しにくい(^^;) keyon(0x14,0x65); と指定するとC音らしいんだけど、どう指定したらA音(440Hz)なのかが分からない。どうも面倒な計算が必要らしいのだけれど(?)


void keyon(unsigned char fnumh, unsigned char fnuml){ if_s_write( 0x0B, 0x00 );//voice num if_s_write( 0x0C, 0x54 );//vovol if_s_write( 0x0D, fnumh );//fnum if_s_write( 0x0E, fnuml );//fnum if_s_write( 0x0F, 0x40 );//keyon = 1 } void keyoff(void){ if_s_write( 0x0F, 0x00 );//keyon = 0 } keyon(0x14,0x65); delay(500); keyoff(); delay(200);
 一方、スケッチ2の方では、note のところに音名を記述すればいい。0x3cをC音として、0x01刻みで半音ずつ音程が高くなっていく。これなら、楽譜も記述しやすそうだ。


Fmdriver_sendMidi(0x90); Fmdriver_sendMidi(note); Fmdriver_sendMidi(0x7f); delay(500); Fmdriver_sendMidi(0x90); Fmdriver_sendMidi(note); Fmdriver_sendMidi(0x00); delay(100);
 とりあえず、Arduinoを使ってパガニーニの24の奇想曲最終曲を演奏させてみようか。それができたら、M5Stackで挑戦ということで。


R2.3.14 13日のスケッチ

 何とか書き上げたスケッチ、ほとんど下の記事にある方々のスケッチを使わせていただいています。ありがとうございます。あれこれ変形し、妙なところがあると思いますが、動くようになったスケッチです(若干の手直しを発見してますが)。覚書として掲載します。


// MML演奏サンプル for M5Stack 2020/01/25 // SDから音楽データを取る データファイルは2行で1行目に改行を入れると読み取ることができる #include #include  //メニューに戻るための記述 #include "MML.h" MML mml; // MML文演奏管理 File root; // ファイル選択の変数等 char** nameList; int numList; int Fcnt; // 上のnumListから代入する変数 代入しなくてもいいかもしれない String fileName; int Target=0; // ファイル選択の際の変数 int Decision=0; //決定したかのフラグ-------------ここまで // デバイス初期化関数 void dev_toneInit() { } // toneEx // 引数 // frequency (Hz) // vol (0 〜 9、0:無音 9:最大) void toneEx(uint16_t frequency, uint16_t vol) { vol=1; ledcSetup(TONE_PIN_CHANNEL, frequency, 10); ledcWrite(TONE_PIN_CHANNEL,0x1FF>>(9-vol)); } void noToneEx() { ledcWriteTone(TONE_PIN_CHANNEL, 0); digitalWrite(SPEAKER_PIN, 0); } // 単音出力関数 void dev_tone(uint16_t freq, uint16_t tm, uint16_t vol) { toneEx(freq, vol); if (tm) { delay(tm); noToneEx(); } } // 単音出力停止関数 void dev_notone() { noToneEx(); } // MML楽曲 const char* mmltext; String buffer; // String型の変数に入るサイズは機器のメモリーに拠るらしい // デバッグ出力用 void debug(uint8_t c) { Serial.write(c); } void setup() { M5.begin(); if(digitalRead(BUTTON_A_PIN) == 0) { Serial.println("Will Load menu binary"); updateFromFS(SD); ESP.restart(); } M5.Power.begin(); Serial.begin(115200); ledcSetup(TONE_PIN_CHANNEL, 0, 10); ledcAttachPin(SPEAKER_PIN, TONE_PIN_CHANNEL); root = SD.open("/mml"); // ファイル選択の定義等 printDirectory(root); //-------------ここまで } // ファイル選択実行関数 void printDirectory(File dir) { String listTemp =""; while (true) { File entry = dir.openNextFile(); if (! entry) { // no more files entry.close(); break; } fileName = entry.name(); listTemp += fileName; listTemp += ","; } for (int i = 0; i < listTemp.length(); i++) { i = listTemp.indexOf(',', i); numList++; } nameList = new char*[numList]; for (int i = 0; i < numList; i++) { int index = listTemp.indexOf(','); String temp = String(listTemp.substring(0, index)); nameList[i] = new char[temp.length() + 1]; temp.toCharArray(nameList[i], temp.length() + 1); Serial.println(nameList[i]); listTemp.remove(0, index + 1); } M5.Lcd.setTextSize(2); for (int i=0; i< numList ;i++){ M5.Lcd.setCursor( 0, i*20); M5.Lcd.println(nameList[i]); Serial.println(nameList[i]); } M5.Lcd.setCursor( 0, 200); M5.Lcd.println("A:Play"); M5.Lcd.setCursor(90, 200); M5.Lcd.println("B:Decision"); M5.Lcd.setCursor(220, 200); M5.Lcd.println("C:Select"); Serial.println("select"); while(!M5.BtnB.wasPressed()){ // 曲選択 M5.update(); if (M5.BtnC.wasReleased()){ moji(Target); Target++; if (Target > numList){ // numList-1 なのかな? Target =0; } Rmoji(Target); delay(200); } } Decision = 1 ; Rmoji(Target); // 曲データ読込 File mdata = SD.open(nameList[Target], FILE_READ); delay(10); if (mdata) { while (mdata.available()) { buffer = mdata.readStringUntil('\n'); } } // ファイルクローズ mdata.close(); mmltext = buffer.c_str(); // MML初期化、デバイス依存関数の登録 mml.init(dev_toneInit, dev_tone, dev_notone, debug); mml.setText(mmltext); } void moji(int i){ M5.Lcd.setTextColor(WHITE,BLACK); M5.Lcd.drawString(nameList[i],0,i*20); } void Rmoji(int j){ if ( Decision == 0){ M5.Lcd.setTextColor(BLACK,WHITE); }else{ M5.Lcd.setTextColor(BLACK,YELLOW); } M5.Lcd.drawString(nameList[j],0,j*20); } void loop() { M5.update(); if (M5.BtnA.wasReleased()){ // どうもこれと下の if文 がないと演奏不可です mml.stop(); delay(15); mml.playBGM(); } if (mml.isBGMPlay()) { // 演奏状態で演奏継続可能なら1音再生 if (mml.available()) mml.playTick(); } }
 今日、FM音源LSIモジュールが投函されるということなので、楽しみです。FM音源でもファイル選択が必要になると思いますので、上のスケッチで流用できるところがありそうです。

 読み込む楽譜ファイルはどんな形式なのかな? やはりテキスト形式のMMLファイルがいいかな?


R2.3.13 データ一覧から選択

 何度やってもうまくいかなかったので、諦めかけた一覧からの曲選択。今日、最初からやり直したらなんとなくうまくいってしまいました。

 今のところ8曲だけなのでリストが表示できますが、もっと増えたらスクロールさせなければなりません(^^;) それは無理。

 Cボタンで選択してBボタンで決定、黄色反転表示。Aボタンで演奏が始まります。ただ、曲を変えるときはリセットボタン(^^;) できる範囲で使えるギリギリのプログラミングで構わないか。

 選択ができなかったので、諦めて次の挑戦に向いてました。次の挑戦とはヤマハ製YMF825使用FM音源LSIモジュール。注文してしまいました(^^;)


R2.3.8 SDのMMLデータ一覧取得

 MMLデータはSDカードのMMLディレクトリに入れています。ですから、そのディレクトリにアクセスして一覧を取得すればいいわけです。書くと簡単、M5Stackで実現するには大変。一日かかりました(^^;)

 午前中に早速検索。ここ、Reveちゃんさんのところを発見。けれど、うまくいきません。あれこれ改変して、リストはLCD画面に表示できるようになったのですが、得た一覧リストを配列に入れることができません。従って、利用することができません。またまた型の問題で挫折。

 午後になって、さらに検索。すると、Arduino本家を発見。本来ならここからスタートすべきだったかな?(^^;)

 どこをどうしたかが自分でも忘れてしまったのですが、見比べながら試行錯誤で書き換えていくと、できてしまいました。結局、読み取ったファイル名を無理やり、型の違った(^^;)配列に入れようとするのではなくて(最後のデータは残るけれど前のデータが壊れてしまっている)、コンマでつなげながら、その塊を下のように処理していくのです。下のスケッチはReveちゃんさんに拠るものです。

  1. if (listTemp.length() > 0) {
  2.  //Serial.println(listTemp);
  3.  //リストの要素数を数え上げる
  4.  for (int i = 0; i < listTemp.length(); i++) {
  5.   i = listTemp.indexOf(',', i); //コンマの位置を探す
  6.   numList++;
  7.  }
  8.  //リストの初期化
  9.  nameList = new char*[numList];
  10.  for (int i = 0; i < numList; i++) {
  11.   //カンマの位置を見つけ、
  12.   int index = listTemp.indexOf(',');
  13.   String temp = String(listTemp.substring(0, index));
  14.   nameList[i] = new char[temp.length() + 1];
  15.   temp.toCharArray(nameList[i], temp.length() + 1);
  16.   Serial.println(nameList[i]);
  17.   listTemp.remove(0, index + 1);
  18.  }
  19. }
そのまま利用させていただきました。でも、理屈は不明なままです(^^;) まあ、いいか。そのうち分かるかもしれませんが、年寄りには時間がないのですので。


R2.3.7 SDからMMLデータ読込

 2つのPCソフトを使えばMMLデータはいくらでも(?)できるので、それらをSDカードに保存して、メニューから読み込んで聞くということにしてみたい。音はBEEP音質だけど、うわさの音割れはないし、雑音もないのでそれなりにPC88時代の昔を思い出せる。FM音源でもできれば嬉しいけれど.....

 しかしながら、SDカードからデータを読み込むのも初心者の私には難しい。例のようにネットで検索してスケッチつくり。悩みました(^^;)

 whileを使わなくてもいいように思います。MMLファイルの中身は2行ですので、2回読んでしまえばいいわけですね。はじめは出力された1行ファイルを使いましたが、音が出ない。試行錯誤しているうちに、最後の1行が再生されたので、1行目をちょこっと付けて、再生すべきデータを2行目にしています。この辺不明なのだけれど、再生できたからいいか、ということで。ちなみに、2行目はこの曲chaconneの場合1万文字あります。String buffer で読み込めるんですね。

 上の件で悩みました。その前に、下記の11行目の mmltext = buffer.c_str(); が難題でしたね。C言語やC++を知っている人は良くわかると思いますが、SDから読み込んだStringをそのまま const char* mmltext に代入できないのですね。型が違うようです。そこで c_str() を使う。ここに至るまでも時間がかかりました。

  1. // 曲データ読込
  2. File f = SD.open("/mml/chaconne.mml", FILE_READ);
  3. delay(10);
  4. if (f) {
  5.  while (f.available()) {
  6.   buffer = f.readStringUntil('\n');
  7.  }
  8. }
  9. // ファイルクローズ
  10. f.close();
  11. mmltext = buffer.c_str();
 さて、SDカードから読み込めるようになったので、次はメニューから選べるようにしようかなと計画中。サンプルがいろいろあるので大丈夫だろうということで。


R2.3.3 MML音楽してみた

 小学生のころから音楽好きで、パソコンに絡んでからはコンピュータミュージックにも手を出していました。でも今は、IMSLPからPDA楽譜をいただいてスコアメーカーに読み込み、編曲して自作笛で演奏を楽しむ方向に行ってます(^^;)

 そんな時、M5Stackのスピーカー問題に関して解決策を探していたところ、たま吉さんの「猫にコ・ン・バ・ン・ワ」というところで、「M5StackでMML単音演奏」という記事を発見。「ほほう〜(^^)/」ということで「猫ふんじゃった」のデータのところを変更してみました。

 笛用に単旋律にしてある曲を、スコアメーカーでMIDIファイルに変換して、これを 3ML EDITOR 2 というソフトでMMLデータに置き換えるという手順です。1行で出てくるので、これを秀丸エディタで複数行にします。どこで切っても構わないのかもしれませんが、一応一音のデータを途中で切らないようにはしています。

 beep音だけどそれなりに聞こえ、私の演奏練習には助っ人になってくれそうです、特に、初めて練習する曲の場合は(^^)/ さらに、雑音もなく音量調整もでき、これがM5Stackスピーカーから出る全ての音に効果を出せる方向に進んでいったらいいなと思います。他力本願だけど.....(^^;)