JUGEMテーマ:Arduino


arduinoで3重和音出来ました。
昔、店頭で聞いたMZ5500のデモとはちょっと違ったかもしれませんがちょっと懐かし感満載です。
前の記事ではフラッシュメモリーにデータを置くのを断念していたのですが、今回は成功しました。
プログラムの無駄を削ってちょっとだけフラッシュメモリーにカスタマイズしました。
なんとか演奏に成功したので投稿します。

モーツァルト アイネ・クライネ・ナハトムジーク
全部で55小節。入力作業が丸2日ぐらいかかってなんとか出来ました。
音符なんて小学生以来、見たこともなかったので、55小節3重和音入力してちょっとだけモーツアルトになれた気がします。
というか、おたまじゃくしの読み方とか#とか1小節には全音符が1つ入るとか、2分音符とか4分音符とか、いろいろあるんですね。
なんか、よく判らないところはわからないままなんで聞いているとちょっと変なところがあるのはご愛嬌で。
回路図はそのまま、圧電サウンダーを入手したので3重和音になっております。
気になる容量ですが
「スケッチが プログラムストレージ領域の 12,178バイト (37%) を使用しています。最大は 32,256バイト です。
 グローバル変数が 998バイト (48%) の 動的メモリを使用しており、ローカル変数に 1,050 バイトが残っています。最高は 2,048バイトです。」
となっていますのでプログラム領域がまだ37%しか使用していないので、まだまだ曲は入りそうです。
プログラムは前のバージョンから無駄とバグを取り除いてコメントを大サービスしています。
そもそも、tone関数が和音対応していればこんな苦労は楽譜との戦いだけで済んでたんですが。結構勉強になりました。
//
//3重和音の演奏
// 圧電サウンダによる3重和音の演奏
//
#define TAN_I 30 //テンポの最小分解単位
#define TAN_M 15 //音と音の区切りの為の間隔
int BuzzPinNo[3]={
  11,
  12,
  13
};
struct ONTEI
{
  int Onkai;
  int NoteNumber;
  char Note[3+1];
  float fHz;
};
struct ONTEI ontei[]=
{
   3,  36, "DO ",  65.406,
   3,  37, "DO#",  69.296,
   3,  38, "RE ",  73.416,
   3,  39, "RE#",  77.782,
   3,  40, "MI ",  82.407,
   3,  41, "FA ",  87.307,
   3,  42, "FA#",  92.499,
   3,  43, "SO ",  97.999,
   3,  44, "SO#", 103.826,
   3,  45, "RA ", 110.000,
   3,  46, "RA#", 116.541,
   3,  47, "SI ", 123.471,
   4,  48, "DO ", 130.813,
   4,  49, "DO#", 138.591,
   4,  50, "RE ", 146.832,
   4,  51, "RE#", 155.563,
   4,  52, "MI ", 164.814,
   4,  53, "FA ", 174.614,
   4,  54, "FA#", 184.997,
   4,  55, "SO ", 195.998,
   4,  56, "SO#", 207.652,
   4,  57, "RA ", 220.000,
   4,  58, "RA#", 233.082,
   4,  59, "SI ", 246.942,
   5,  60, "DO ", 261.626,
   5,  61, "DO#", 277.183,
   5,  62, "RE ", 293.665,
   5,  63, "RE#", 311.127,
   5,  64, "MI ", 329.628,
   5,  65, "FA ", 349.228,
   5,  66, "FA#", 369.994,
   5,  67, "SO ", 391.995,
   5,  68, "SO#", 415.305,
   5,  69, "RA ", 440.000,
   5,  70, "RA#", 466.164,
   5,  71, "SI ", 493.883,
   6,  72, "DO ", 523.251,
   6,  73, "DO#", 554.365,
   6,  74, "RE ", 587.330,
   6,  75, "RE#", 622.254,
   6,  76, "MI ", 659.255,
   6,  77, "FA ", 698.456,
   6,  78, "FA#", 739.989,
   6,  79, "SO ", 783.991,
   6,  80, "SO#", 830.609,
   6,  81, "RA ", 880.000,
   6,  82, "RA#", 932.328,
   6,  83, "SI ", 987.767,
   7,  84, "DO ",1046.502,
   7,  85, "DO#",1108.731,
   7,  86, "RE ",1174.659,
   7,  87, "RE#",1244.508,
   7,  88, "MI ",1318.510,
   7,  89, "FA ",1396.913,
   7,  90, "FA#",1479.978,
   7,  91, "SO ",1567.982,
   7,  92, "SO#",1661.219,
   7,  93, "RA ",1760.000,
   7,  94, "RA#",1864.655,
   7,  95, "SI ",1975.533,
   8,  96, "DO ",2093.005,
   0,  0,  "",   0.0
};
int nCount[3];
int nNextFlag[3];
int nHiLo[3];
long nOldTime[3];
int bEndFlag[3];
void setup() {
  Serial.begin(9600);
  for(int i=0;i<3;i++){
    pinMode(BuzzPinNo[i], OUTPUT);
    digitalWrite(BuzzPinNo[i], LOW);
    //
    //各種フラグの初期化
    //
    nCount[i]=0;
    nNextFlag[i] = 1;
    nHiLo[i] = HIGH;
    nOldTime[i]=0;
    bEndFlag[i] = 0;
  }
}
struct GAKUFU
{
  unsigned char nOngenNo;
  unsigned char nCount;
  unsigned char nOnkaiNo;
  char szOto[4+1]; //float nHz;
  unsigned char nLen;
};
const PROGMEM struct GAKUFU gakufu[800]={
//モーツアルト ナハトムジーク
  //音源番号,小節,音階,音,長さ
  //(4/4の場合、4分音符が長さ16で1/4なので、1小節で64になる)
   0, 1, 6, "SO ", 16,
   0, 1, 6, "   ",  8,
   0, 1, 6, "RE ",  8,
   0, 1, 6, "SO ", 16,
   0, 1, 6, "   ",  8,
   0, 1, 6, "RE ",  8,
  
   0, 2, 6, "SO ",  8,
   0, 2, 6, "RE ",  8,
   0, 2, 6, "SO ",  8,
   0, 2, 6, "SI ",  8,
   0, 2, 7, "RE ", 16,
   0, 2, 6, "   ", 16,
  
   0, 3, 7, "DO ", 16,
   0, 3, 6, "   ",  8,
   0, 3, 6, "RA ",  8,
   0, 3, 7, "DO ", 16,
   0, 3, 6, "   ",  8,
   0, 3, 6, "RA ",  8,
  
   0, 4, 7, "DO ",  8,
   0, 4, 6, "RA ",  8,
   0, 4, 6, "FA#",  8,
   0, 4, 6, "RA ",  8,
   0, 4, 6, "RE ", 16,
   0, 4, 6, "   ", 16,
   0, 5, 6, "SO ", 16,
   0, 5, 6, "SO ", 24,
   0, 5, 6, "SI ",  8,
   0, 5, 6, "RA ",  8,
   0, 5, 6, "SO ",  8,
   0, 6, 6, "SO ",  8,
   0, 6, 6, "FA#",  8,
   0, 6, 6, "FA#", 24,
   0, 6, 6, "RA ",  8,
   0, 6, 7, "DO ",  8,
   0, 6, 6, "FA#",  8,
   0, 7, 6, "RA ",  8,
   0, 7, 6, "SO ",  8,
   0, 7, 6, "SO ", 24,
   0, 7, 6, "SI ",  8,
   0, 7, 6, "RA ",  8,
   0, 7, 6, "SO ",  8,
   0, 8, 6, "SO ",  8,
   0, 8, 6, "FA#",  8,
   0, 8, 6, "FA#", 24,
   0, 8, 6, "RA ",  8,
   0, 8, 7, "DO ",  8,
   0, 8, 6, "FA#",  8,
   0, 9, 6, "SO ",  8,
   0, 9, 6, "SO ",  8,
   0, 9, 6, "SO ",  4,
   0, 9, 6, "FA#",  4,
   0, 9, 6, "MI ",  4,
   0, 9, 6, "FA#",  4,
   0, 9, 6, "SO ",  8,
   0, 9, 6, "SO ",  8,
   0, 9, 6, "SI ",  4,
   0, 9, 6, "RA ",  4,
   0, 9, 6, "SI ",  4,
   0, 9, 6, "RA ",  4,
   0,10, 6, "SI ",  8,
   0,10, 6, "SI ",  8,
   0,10, 7, "RE ",  4,
   0,10, 7, "DO ",  4,
   0,10, 6, "SI ",  4,
   0,10, 7, "DO ",  4,
   0,10, 7, "RE ", 16,
   0,10, 7, "   ", 16,
   0,11, 6, "RE ", 32,
   0,11, 6, "MI ", 32,
   0,12, 6, "RE ",  8,
   0,12, 6, "DO ",  8,
   0,12, 6, "DO ", 16,
   0,12, 6, "DO ",  8,
   0,12, 5, "SI ",  8,
   0,12, 5, "SI ", 16,
   0,13, 5, "SI ",  8,
   0,13, 5, "RA ",  8,
   0,13, 5, "RA ", 16,
   0,13, 5, "SO ",  8,
   0,13, 5, "FA ",  8,
   0,13, 5, "MI ",  8,
   0,13, 5, "FA ",  8,
   0,14, 5, "SO ", 16,
   0,14, 5, "RA ", 16,
   0,14, 5, "SI ", 16,
   0,14, 5, "   ", 16,
   0,15, 6, "RE ", 32,
   0,15, 6, "MI ", 32,
   0,16, 6, "RE ",  8,
   0,16, 6, "DO ",  8,
   0,16, 6, "DO ",  8,
   0,16, 6, "DO ",  8,
   0,16, 6, "DO ",  8,
   0,16, 5, "SI ",  8,
   0,16, 5, "SI ",  8,
   0,16, 5, "SI ",  8,
   0,17, 5, "SI ",  8,
   0,17, 5, "RA ",  8,
   0,17, 5, "RA ",  8,
   0,17, 5, "RA ",  8,
   0,17, 5, "SO ",  8,
   0,17, 5, "FA ",  8,
   0,17, 5, "MI ",  8,
   0,17, 5, "FA ",  8,
   0,18, 5, "SO ", 40,
   0,18, 5, "SO ",  8,
   0,18, 5, "RA ",  8,
   0,18, 5, "FA ",  8,
   0,19, 5, "SI ", 40,
   0,19, 5, "SI ",  8,
   0,19, 6, "DO ",  8,
   0,19, 5, "RA ",  8,
   0,20, 6, "RE ", 32,
   0,20, 6, "MI ", 16,
   0,20, 6, "FA#", 16,
   0,21, 6, "SO ", 16,
   0,21, 6, "RA ", 16,
   0,21, 6, "SI ", 16,
   0,21, 7, "DO#", 16,
   0,22, 7, "RE ", 24,
   0,22, 6, "RA ",  8,
   0,22, 7, "DO#", 12,
   0,22, 6, "RA ",  4,
   0,22, 7, "DO#", 12,
   0,22, 6, "RA ",  4,
   0,23, 7, "RE ", 24,
   0,23, 6, "RA ",  8,
   0,23, 7, "DO#", 12,
   0,23, 6, "RA ",  4,
   0,23, 7, "DO#", 12,
   0,23, 6, "RA ",  4,
   0,24, 7, "RE ",  8,
   0,24, 7, "RE ",  8,
   0,24, 7, "   ",  8,
   0,24, 7, "RE ",  8,
   0,24, 7, "   ",  8,
   0,24, 7, "RE ",  8,
   0,24, 7, "   ",  8,
   0,24, 7, "RE ",  8,
   0,25, 7, "RE ",  8,
   0,25, 7, "RE ",  8,
   0,25, 7, "   ",  8,
   0,25, 7, "RE ",  8,
   0,25, 7, "   ",  8,
   0,25, 7, "RE ",  8,
   0,24, 7, "   ",  8,
   0,25, 7, "RE ",  8,
   0,26, 7, "DO#",  8,
   0,26, 6, "RA ",  8,
   0,26, 7, "RE ",  8,
   0,26, 6, "RA ",  8,
   0,26, 7, "DO ",  8,
   0,26, 6, "RA ",  8,
   0,26, 7, "RE ",  8,
   0,26, 6, "RA ",  8,
   0,27, 7, "DO#",  8,
   0,27, 6, "RA ",  8,
   0,27, 6, "RA ",  8,
   0,27, 6, "RA ",  8,
   0,27, 6, "RA ", 16,
   0,27, 6, "   ", 16,
   0,28, 6, "RA ", 24,
   0,28, 6, "SO ",  2,
   0,28, 6, "   ",  1,
   0,28, 6, "FA#",  2,
   0,28, 6, "   ",  1,
   0,28, 6, "MI ",  2,
   0,28, 6, "RE ", 16,
   0,28, 6, "SI ", 16,
   0,29, 6, "SO ", 16,
   0,29, 6, "MI ", 16,
   0,29, 6, "RA ", 16,
   0,29, 6, "   ", 16,
   0,30, 6, "FA#", 24,
   0,30, 6, "MI ",  2,
   0,30, 6, "   ",  1,
   0,30, 6, "RE ",  2,
   0,30, 6, "   ",  1,
   0,30, 5, "DO ",  2,
   0,30, 5, "SI ", 16,
   0,30, 6, "SO ", 16,
   0,31, 6, "FA#", 32,
   0,31, 6, "MI ", 16,
   0,31, 6, "   ", 16,
   0,32, 6, "   ",  8,
   0,32, 6, "RA ",  8,
   0,32, 6, "RA ",  8,
   0,32, 6, "RA ",  8,
   0,32, 6, "RA ",  8,
   0,32, 6, "RA ",  8,
   0,32, 6, "RA ",  8,
   0,32, 6, "RA ",  8,
   0,33, 6, "RA ",  8,
   0,33, 6, "RA ",  8,
   0,33, 6, "RA ",  8,
   0,33, 6, "RA ",  8,
   0,33, 6, "RA ",  8,
   0,33, 6, "RA ",  8,
   0,33, 6, "SI ",  8,
   0,33, 6, "DO#",  8,
   0,34, 7, "DO#",  8,
   0,34, 7, "RE ",  8,
   0,34, 6, "   ",  8,
   0,34, 6, "SI ",  8,
   0,34, 6, "SI ",  8,
   0,34, 6, "RA ",  8,
   0,34, 6, "   ",  8,
   0,34, 6, "DO#",  8,
   0,35, 6, "RE ", 16,
   0,35, 6, "   ",  8,
   0,35, 6, "RA ",  8,
   0,35, 7, "RE ",  8,
   0,35, 7, "DO#",  8,
   0,35, 6, "SI ",  8,
   0,35, 6, "RE ",  8,
   0,36, 6, "SI ",  2,
   0,36, 6, "   ",  1,
   0,36, 7, "DO ",  2,
   0,36, 6, "   ",  1,
   0,36, 6, "SI ",  2,
   0,36, 6, "RA ",  8,
   0,36, 6, "   ",  8,
   0,36, 6, "RA ",  8,
   0,36, 6, "RA ",  8,
   0,36, 6, "RA ",  8,
   0,36, 6, "RA ",  8,
   0,36, 6, "RA ",  8,
   0,37, 6, "SI ",  8,
   0,37, 6, "RA ",  8,
   0,37, 6, "   ",  8,
   0,37, 6, "RA ",  8,
   0,37, 7, "RE ",  8,
   0,37, 7, "DO#",  8,
   0,37, 6, "SI ",  8,
   0,37, 6, "RA ",  8,
   0,38, 6, "SI ",  2,
   0,38, 6, "   ",  1,
   0,38, 7, "DO ",  2,
   0,38, 6, "   ",  1,
   0,38, 6, "SI ",  2,
   0,38, 6, "RA ",  8,
   0,38, 6, "   ",  8,
   0,38, 6, "RA ",  8,
   0,38, 6, "RA ",  8,
   0,38, 6, "RA ",  8,
   0,38, 6, "RA ",  8,
   0,38, 6, "RA ",  8,
   0,39, 6, "SI ",  8,
   0,39, 6, "RA ",  8,
   0,39, 6, "   ", 16,
   0,39, 6, "SI ", 24,
   0,39, 6, "RA ",  2,
   0,39, 6, "   ",  1,
   0,39, 6, "SO ",  2,
   0,39, 6, "   ",  1,
   0,39, 6, "FA ",  2,
   0,40, 6, "SO ", 16,
   0,40, 6, "   ", 16,
   0,40, 6, "RA ", 24,
   0,40, 6, "SO ",  2,
   0,40, 6, "   ",  1,
   0,40, 6, "FA#",  2,
   0,40, 6, "   ",  1,
   0,40, 6, "MI ",  2,
   0,41, 6, "FA#", 16,
   0,41, 6, "   ", 16,
   0,41, 6, "SI ",  8,
   0,41, 7, "DO#",  4,
   0,41, 7, "RE ",  4,
   0,41, 7, "DO ",  8,
   0,41, 6, "SI ",  8,
   0,42, 6, "SI ",  8,
   0,42, 6, "RA ",  8,
   0,42, 6, "FA#",  8,
   0,42, 6, "RA ",  8,
   0,42, 6, "RA ",  8,
   0,42, 6, "SO ",  8,
   0,42, 6, "FA#",  8,
   0,42, 6, "MI ",  8,
   0,43, 6, "RE ", 16,
   0,43, 6, "   ",  8,
   0,43, 6, "RA ",  8,
   0,43, 7, "RE ",  8,
   0,43, 7, "DO#",  8,
   0,43, 6, "SI ",  8,
   0,43, 6, "RA ",  8,
   0,44, 6, "SI ",  8,
   0,44, 6, "RA ",  8,
   0,44, 6, "   ",  8,
   0,44, 6, "RA ",  8,
   0,44, 6, "RA ",  8,
   0,44, 6, "RA ",  8,
   0,44, 6, "RA ",  8,
   0,44, 6, "RA ",  8,
   0,45, 6, "SI ",  8,
   0,45, 6, "RA ",  8,
   0,45, 6, "   ",  8,
   0,45, 6, "RA ",  8,
   0,45, 7, "RE ",  8,
   0,45, 7, "DO#",  8,
   0,45, 6, "SI ",  8,
   0,45, 6, "RA ",  8,
   0,46, 6, "SI ",  8,
   0,46, 6, "RA ",  8,
   0,46, 6, "   ",  8,
   0,46, 6, "RA ",  8,
   0,46, 6, "RA ",  8,
   0,46, 6, "RA ",  8,
   0,46, 6, "RA ",  8,
   0,46, 6, "RA ",  8,
   0,47, 6, "SI ",  8,
   0,47, 6, "RA ",  8,
   0,47, 6, "   ", 16,
   0,47, 6, "SI ", 24,
   0,47, 6, "RA ",  2,
   0,47, 6, "   ",  1,
   0,47, 6, "SO ",  2,
   0,47, 6, "   ",  1,
   0,47, 6, "FA#",  2,
   0,48, 6, "SO ", 16,
   0,48, 6, "   ", 16,
   0,48, 6, "RA ", 24,
   0,48, 6, "SO ",  2,
   0,48, 6, "   ",  1,
   0,48, 6, "FA#",  2,
   0,48, 6, "   ",  1,
   0,48, 6, "MI ",  2,
   0,49, 6, "FA#", 16,
   0,49, 6, "   ", 16,
   0,49, 6, "SI ",  8,
   0,49, 7, "DO#",  4,
   0,49, 7, "RE ",  4,
   0,49, 6, "SO ",  8,
   0,49, 6, "SI ",  8,
   0,50, 6, "SI ",  8,
   0,50, 6, "RA ",  8,
   0,50, 6, "FA ",  8,
   0,50, 6, "RA ",  8,
   0,50, 6, "RA ",  8,
   0,50, 6, "SO ",  8,
   0,50, 6, "FA#",  8,
   0,50, 6, "MI ",  8,
   0,51, 6, "RE ",  8,
   0,51, 5, "RA ",  8,
   0,51, 5, "SI ",  8,
   0,51, 6, "DO#",  8,
   0,51, 6, "RE ",  8,
   0,51, 6, "RE ",  8,
   0,51, 6, "MI ",  8,
   0,51, 6, "RE ",  4,
   0,51, 6, "MI ",  4,
   0,52, 6, "FA#",  8,
   0,52, 5, "DO#",  8,
   0,52, 5, "RE ",  8,
   0,52, 6, "MI ",  8,
   0,52, 6, "FA#",  8,
   0,52, 6, "FA#",  8,
   0,52, 6, "SO ",  8,
   0,52, 6, "FA#",  4,
   0,52, 6, "SO ",  4,
   0,53, 6, "RA ",  8,
   0,53, 5, "RA ",  8,
   0,53, 5, "RA#",  8,
   0,53, 6, "SO#",  4,
   0,53, 6, "RA ",  4,
   0,53, 6, "SI ", 16,
   0,53, 6, "   ", 16,
   0,54, 5, "SI ", 24,
   0,54, 6, "MI ",  8,
   0,54, 6, "RE ",  8,
   0,54, 6, "DO#",  8,
   0,54, 5, "SI ",  8,
   0,54, 5, "RA ",  8,
   0,55, 6, "RE ", 16,
   0,55, 6, "FA#", 16,
   0,55, 6, "RE ", 16,
   0,55, 6, "   ", 16,
   1, 1, 4, "SO ", 16,
   1, 1, 5, "   ",  8,
   1, 1, 4, "RE ",  8,
   1, 1, 4, "SO ", 16,
   1, 1, 5, "   ",  8,
   1, 1, 4, "RE ",  8,
   1, 2, 4, "SO ",  8,
   1, 2, 4, "RE ",  8,
   1, 2, 4, "SO ",  8,
   1, 2, 4, "SI ",  8,
   1, 2, 5, "RE ", 16,
   1, 2, 4, "   ", 16,
  
   1, 3, 5, "DO ", 16,
   1, 3, 4, "   ",  8,
   1, 3, 4, "RA ",  8,
   1, 3, 4, "DO ", 16,
   1, 3, 4, "   ",  8,
   1, 3, 4, "RA ",  8,
  
   1, 4, 5, "DO ",  8,
   1, 4, 4, "RA ",  8,
   1, 4, 4, "FA ",  8,
   1, 4, 4, "RA ",  8,
   1, 4, 4, "RE ", 16,
   1, 4, 4, "   ", 16,
   1, 5, 3, "SI ",  8,
   1, 5, 3, "SI ",  8,
   1, 5, 3, "SI ",  8,
   1, 5, 3, "SI ",  8,
   1, 5, 3, "SI ",  8,
   1, 5, 3, "SI ",  8,
   1, 5, 3, "SI ",  8,
   1, 5, 3, "SI ",  8,
   1, 6, 4, "DO ",  8,
   1, 6, 4, "DO ",  8,
   1, 6, 4, "DO ",  8,
   1, 6, 4, "DO ",  8,
   1, 6, 4, "DO ",  8,
   1, 6, 4, "DO ",  8,
   1, 6, 4, "DO ",  8,
   1, 6, 4, "DO ",  8,
   1, 7, 3, "SI ",  8,
   1, 7, 3, "SI ",  8,
   1, 7, 3, "SI ",  8,
   1, 7, 3, "SI ",  8,
   1, 7, 3, "SI ",  8,
   1, 7, 3, "SI ",  8,
   1, 7, 3, "SI ",  8,
   1, 7, 3, "SI ",  8,
   1, 8, 4, "DO ",  8,
   1, 8, 4, "DO ",  8,
   1, 8, 4, "DO ",  8,
   1, 8, 4, "DO ",  8,
   1, 8, 4, "DO ",  8,
   1, 8, 4, "DO ",  8,
   1, 8, 4, "DO ",  8,
   1, 8, 4, "DO ",  8,
   1, 9, 4, "RE ", 16,
   1, 9, 5, "DO ",  8,
   1, 9, 5, "DO ",  8,
   1, 9, 5, "RE ",  8,
   1, 9, 5, "RE ",  8,
   1, 9, 5, "DO ",  8,
   1, 9, 4, "SI ",  4,
   1, 9, 4, "RA ",  4,
   1,10, 4, "SO ",  8,
   1,10, 4, "SO ",  8,
   1,10, 4, "FA ",  8,
   1,10, 4, "FA ",  8,
   1,10, 4, "SO ", 16,
   1,10, 4, "   ", 16,
   1,11, 4, "SI ", 32,
   1,11, 5, "DO ", 32,
   1,12, 4, "SI ",  8,
   1,12, 4, "RA ",  8,
   1,12, 4, "RA ", 16,
   1,12, 4, "RA ",  8,
   1,12, 4, "SO ",  8,
   1,12, 4, "SO ", 16,
   1,13, 4, "MI ", 16,
   1,13, 4, "MI ", 16,
   1,13, 4, "DO ", 16,
   1,13, 3, "RA ", 16,
   1,14, 4, "RE ", 16,
   1,14, 4, "FA ", 16,
   1,14, 4, "SO ", 16,
   1,14, 3, "   ", 16,
   1,15, 4, "SI ", 32,
   1,15, 5, "DO ", 32,
   1,16, 4, "SI ",  8,
   1,16, 4, "RA ",  8,
   1,16, 4, "RA ",  8,
   1,16, 4, "RA ",  8,
   1,16, 4, "RA ",  8,
   1,16, 4, "SO ",  8,
   1,16, 4, "SO ",  8,
   1,16, 4, "SO ",  8,
   1,17, 4, "MI ", 16,
   1,17, 4, "MI ",  8,
   1,17, 4, "MI ",  8,
   1,17, 4, "DO ", 16,
   1,17, 4, "DO ",  8,
   1,17, 4, "DO ",  8,
   1,18, 4, "SI ", 40,
   1,18, 4, "SI ",  8,
   1,18, 4, "DO ",  8,
   1,18, 4, "RA ",  8,
   1,19, 4, "SO ", 40,
   1,19, 4, "SO ",  8,
   1,19, 4, "RA ",  8,
   1,19, 4, "FA ",  8,
   1,20, 4, "SI ", 32,
   1,20, 5, "DO ", 32,
   1,21, 4, "SI ", 16,
   1,21, 5, "RE ", 16,
   1,21, 5, "RE ", 16,
   1,21, 5, "SO ", 16,
   1,22, 5, "FA ", 32,
   1,22, 5, "SO ", 32,
   1,23, 5, "FA ", 32,
   1,23, 5, "SO ", 32,
   1,24, 5, "FA ",  8,
   1,24, 5, "FA ",  8,
   1,24, 5, "   ",  8,
   1,24, 5, "FA ",  8,
   1,24, 5, "   ",  8,
   1,24, 5, "FA ",  8,
   1,24, 5, "   ",  8,
   1,24, 5, "FA ",  8,
   1,25, 5, "MI ",  8,
   1,25, 5, "MI ",  8,
   1,25, 5, "   ",  8,
   1,25, 5, "MI ",  8,
   1,25, 5, "   ",  8,
   1,25, 5, "MI ",  8,
   1,25, 5, "   ",  8,
   1,25, 5, "MI ",  8,
   1,26, 5, "MI ", 16,
   1,26, 5, "FA ", 16,
   1,26, 5, "MI ", 16,
   1,26, 5, "FA ", 16,
   1,27, 5, "MI ",  8,
   1,27, 4, "RA ",  8,
   1,27, 4, "RA ",  8,
   1,27, 4, "RA ",  8,
   1,27, 4, "RA ", 16,
   1,27, 4, "   ", 16,
   1,28, 4, "RA ", 24,
   1,28, 4, "SO ",  8,
   1,28, 4, "RE ", 16,
   1,28, 4, "SI ", 16,
   1,29, 4, "SO ", 16,
   1,29, 4, "MI ", 16,
   1,29, 4, "RA ", 16,
   1,29, 4, "   ", 16,
   1,30, 4, "FA ", 24,
   1,30, 4, "MI ",  8,
   1,30, 3, "SI ", 16,
   1,30, 4, "SO ", 16,
   1,31, 4, "FA ", 32,
   1,31, 4, "MI ", 16,
   1,31, 4, "   ", 16,
   1,32, 4, "RA ", 24,
   1,32, 4, "SO ",  8,
   1,32, 4, "RE ", 16,
   1,32, 4, "SI ", 16,
   1,33, 4, "SO ", 16,
   1,33, 4, "MI ", 16,
   1,33, 4, "RA ", 16,
   1,33, 4, "SO ", 16,
   1,34, 4, "SO ",  8,
   1,34, 4, "FA ",  8,
   1,34, 4, "   ",  8,
   1,34, 5, "SO ",  8,
   1,34, 5, "SO ",  8,
   1,34, 5, "FA ",  8,
   1,34, 4, "   ",  8,
   1,34, 4, "SO ",  8,
   1,35, 4, "FA ",  8,
   1,35, 4, "FA ",  8,
   1,35, 4, "SO ",  8,
   1,35, 4, "SO ",  8,
   1,35, 4, "RA ",  8,
   1,35, 4, "RA ",  8,
   1,35, 4, "FA ",  8,
   1,35, 4, "FA ",  8,
   1,36, 4, "MI ",  8,
   1,36, 4, "MI ",  8,
   1,36, 4, "FA ",  8,
   1,36, 4, "FA ",  8,
   1,36, 4, "SO ",  8,
   1,36, 4, "SO ",  8,
   1,36, 4, "MI ",  8,
   1,36, 4, "MI ",  8,
   1,37, 4, "FA ",  8,
   1,37, 4, "FA ",  8,
   1,37, 4, "SO ",  8,
   1,37, 4, "SO ",  8,
   1,37, 4, "RA ",  8,
   1,37, 4, "RA ",  8,
   1,37, 4, "FA ",  8,
   1,37, 4, "FA ",  8,
   1,38, 4, "MI ",  8,
   1,38, 4, "MI ",  8,
   1,38, 4, "FA ",  8,
   1,38, 4, "FA ",  8,
   1,38, 4, "SO ",  8,
   1,38, 4, "SO ",  8,
   1,38, 4, "MI ",  8,
   1,38, 4, "MI ",  8,
   1,39, 4, "FA ", 16,
   1,39, 4, "   ", 16,
   1,39, 5, "FA ", 48,
   1,40, 5, "   ", 16,
   1,40, 5, "MI ", 32,
   1,41, 5, "RE ",  8,
   1,41, 5, "FA ",  8,
   1,41, 5, "SO ",  8,
   1,41, 5, "RA ",  8,
   1,41, 5, "SO ",  8,
   1,41, 5, "RA ",  4,
   1,41, 5, "SI ",  4,
   1,41, 5, "RA ",  8,
   1,41, 5, "SO ",  8,
   1,42, 5, "SO ",  8,
   1,42, 5, "FA ",  8,
   1,42, 5, "RE ",  8,
   1,42, 5, "FA ",  8,
   1,42, 5, "FA ",  8,
   1,42, 5, "MI ",  8,
   1,42, 5, "RE ",  8,
   1,42, 5, "DO#",  8,
   1,43, 5, "RE ",  8,
   1,43, 4, "FA ",  8,
   1,43, 4, "SO ",  8,
   1,43, 4, "SO ",  8,
   1,43, 4, "RA ",  8,
   1,43, 4, "RA ",  8,
   1,43, 4, "FA ",  8,
   1,43, 4, "FA ",  8,
   1,44, 4, "MI ",  8,
   1,44, 4, "MI ",  8,
   1,44, 4, "FA ",  8,
   1,44, 4, "FA ",  8,
   1,44, 4, "SO ",  8,
   1,44, 4, "SO ",  8,
   1,44, 4, "MI ",  8,
   1,44, 4, "MI ",  8,
   1,45, 4, "FA ",  8,
   1,45, 4, "FA ",  8,
   1,45, 4, "SO ",  8,
   1,45, 4, "SO ",  8,
   1,45, 4, "RA ",  8,
   1,45, 4, "RA ",  8,
   1,45, 4, "FA ",  8,
   1,45, 4, "FA ",  8,
   1,46, 4, "MI ",  8,
   1,46, 4, "MI ",  8,
   1,46, 4, "FA ",  8,
   1,46, 4, "FA ",  8,
   1,46, 4, "SO ",  8,
   1,46, 4, "SO ",  8,
   1,46, 4, "MI ",  8,
   1,46, 4, "MI ",  8,
   1,47, 4, "FA ", 16,
   1,47, 4, "   ", 16,
   1,47, 5, "FA ", 32,
   1,48, 5, "MI ", 16,
   1,48, 5, "   ", 16,
   1,48, 5, "MI ", 32,
   1,49, 5, "RE ",  8,
   1,49, 5, "FA ",  8,
   1,49, 5, "SO ",  8,
   1,49, 5, "RA ",  8,
   1,49, 5, "SO ",  8,
   1,49, 5, "RA ",  4,
   1,49, 5, "SI ",  4,
   1,49, 5, "RA ",  8,
   1,49, 5, "SO ",  8,
   1,50, 5, "SO ",  8,
   1,50, 5, "FA ",  8,
   1,50, 5, "RE ",  8,
   1,50, 5, "FA ",  8,
   1,50, 5, "FA ",  8,
   1,50, 5, "MI ",  8,
   1,50, 5, "RE ",  8,
   1,50, 5, "DO#",  8,
   1,51, 5, "RE ",  8,
   1,51, 4, "RA ",  8,
   1,51, 4, "SI ",  8,
   1,51, 5, "DO#",  8,
   1,51, 5, "RE ",  8,
   1,51, 5, "RE ",  8,
   1,51, 5, "MI ",  8,
   1,51, 5, "RE ",  4,
   1,51, 5, "MI ",  4,
   1,52, 5, "FA ",  8,
   1,52, 5, "DO#",  8,
   1,52, 5, "RE ",  8,
   1,52, 5, "MI ",  8,
   1,52, 5, "FA ",  8,
   1,52, 5, "FA ",  8,
   1,52, 5, "SO ",  8,
   1,52, 5, "FA ",  4,
   1,52, 5, "SO ",  4,
   1,53, 5, "RA ",  8,
   1,53, 5, "RA ",  8,
   1,53, 5, "RA#",  8,
   1,53, 5, "SO#",  4,
   1,53, 5, "RA ",  4,
   1,53, 5, "SI ", 16,
   1,53, 5, "   ", 16,
   1,54, 4, "SO ", 64,
   1,55, 4, "SO ", 16,
   1,55, 4, "RA ", 16,
   1,55, 4, "FA ", 16,
   1,55, 4, "   ", 16,
   2, 1, 4, "SI ", 16,
   2, 1, 4, "   ", 48,
   2, 2, 4, "   ", 64,
   2, 3, 4, "   ", 64,
   2, 4, 4, "   ", 64,
   2, 5, 4, "   ", 64,
   2, 6, 4, "   ", 64,
   2, 7, 4, "   ", 64,
   2, 8, 4, "   ", 64,
   2, 9, 4, "   ", 64,
   2,10, 4, "   ", 64,
   2,11, 4, "   ", 64,
   2,12, 4, "   ", 64,
   2,13, 4, "   ", 64,
   2,14, 4, "   ", 64,
   2,15, 4, "   ", 64,
   2,16, 4, "   ", 64,
   2,17, 4, "   ", 64,
   2,18, 4, "   ", 64,
   2,19, 4, "   ", 64,
   2,20, 4, "   ", 64,
   2,21, 4, "   ", 64,
   2,22, 4, "   ", 64,
   2,23, 4, "   ", 64,
   2,24, 5, "RE ",  8,
   2,24, 5, "RE ",  8,
   2,24, 5, "   ",  8,
   2,24, 5, "RE ",  8,
   2,24, 5, "   ",  8,
   2,24, 5, "RE ",  8,
   2,24, 5, "   ",  8,
   2,24, 5, "RE ",  8,
   2,25, 5, "RE ",  8,
   2,25, 5, "RE ",  8,
   2,25, 5, "   ",  8,
   2,25, 5, "RE ",  8,
   2,25, 5, "   ",  8,
   2,25, 5, "RE ",  8,
   2,25, 5, "   ",  8,
   2,25, 5, "RE ",  8,
   2,26, 4, "   ", 64,
   2,27, 4, "   ", 64,
   2,28, 4, "   ", 64,
   2,29, 4, "   ", 64,
   2,30, 4, "   ", 64,
   2,31, 4, "   ", 64,
   2,32, 4, "   ", 64,
   2,33, 4, "   ", 64,
   2,34, 4, "   ", 64,
   2,35, 4, "   ", 64,
   2,36, 4, "   ", 64,
   2,37, 4, "   ", 64,
   2,38, 4, "   ", 64,
   2,39, 4, "   ", 32,
   2,39, 4, "SI ", 48,
   2,40, 4, "   ", 16,
   2,40, 4, "RA ", 32,
   2,41, 4, "   ", 64,
   2,42, 4, "   ", 64,
   2,43, 4, "   ", 64,
   2,44, 4, "   ", 64,
   2,45, 4, "   ", 64,
   2,46, 4, "   ", 64,
   2,47, 4, "   ", 32,
   2,47, 4, "SI ", 32,
   2,48, 4, "   ", 32,
   2,48, 4, "RA ", 32,
   2,49, 4, "   ", 64,
   2,50, 4, "   ", 64,
   2,51, 4, "   ", 64,
   2,52, 4, "   ", 64,
   2,53, 4, "   ", 64,
   2,54, 4, "   ", 64,
   2,55, 4, "   ", 64,
//
//終了
   0, 0, 0, 0,
   1, 0, 0, 0,
   2, 0, 0, 0,
};
//
//メインルーチン
//
void loop() {
Serial.println("loop() start");
  long StartTime[3];
  float nHz[3];
  int nLen[3];
  long d[3];
  while(1){
    long  nNewMillis = millis();      //テンポの為の時間所得
    for(int nOGNo=0;nOGNo<3;nOGNo++){ //三重和音なので3回回る
      if(bEndFlag[nOGNo] == 1){ //既に終わったものはcontinue
        continue;
      }
      if(nNextFlag[nOGNo]==1){  //初回の場合と前の音符が持ち時間終了した場合ここに入る
        struct GAKUFU lGakufu;
        //
        //音源番号が同じものが来るまで飛ばす
        //
        while(1){
          memcpy_P(&lGakufu, &gakufu[nCount[nOGNo]], sizeof(struct GAKUFU));  //フラッシュメモリーからで楽譜のデータを取得する
          if((int)(lGakufu.nCount)==0){ //小節が0は最後の合図
            break;
          }
          if(nOGNo==lGakufu.nOngenNo){  //音源番号が一緒のものが来たら脱出
            break;
          }
          nCount[nOGNo]++;  //次へ
        }
        if(lGakufu.nCount==0){  //最後検出
          bEndFlag[nOGNo] = 1;
          if((bEndFlag[0]+bEndFlag[1]+bEndFlag[2])==3){
            while(1);
          }
          continue;
        }
        //
        //必要な情報をコピーしたり計算したりしておく
        //
        nHz[nOGNo] = GetHz(lGakufu.nOnkaiNo, (char *)lGakufu.szOto);  //楽譜の音符にあわせた周波数を取得する
        nLen[nOGNo] = lGakufu.nLen; //1音の長さ
        nCount[nOGNo]++;            //次への音探し
        nNextFlag[nOGNo] = 0;       //今回の音符は始まったばかりなので初期化
        StartTime[nOGNo] = nNewMillis;  //開始時間を入れておく
        float fHz = nHz[nOGNo];     //周波数
        if(fHz==0.0){   //おまじない
          d[nOGNo] = 1000;
        }
        else{
          d[nOGNo] = 1000000 / fHz / 2; //周波数を発生させる為の時間(マイクロ秒)
        }
      }
      //
      //周波数発生ロジック
      //
      long nNewTime = micros();               //現在時刻を取得する
      long sa =  nNewTime - nOldTime[nOGNo];  //前にON/OFFした時刻との差(経過時間を取得)
      if(sa>d[nOGNo]){                        //dを越えたら
        if(nHz[nOGNo]>0.0){                   //ON/OFFを切り替える
          if(nHiLo[nOGNo]==HIGH){
              digitalWrite(BuzzPinNo[nOGNo], HIGH);
              nHiLo[nOGNo] = LOW;   
          }else{
              digitalWrite(BuzzPinNo[nOGNo], LOW);
              nHiLo[nOGNo] = HIGH;
          }
          //
          ////音を延べたんで並べて行くと楽器で引いたような表現にならないので音の長さよりも少し短く発音を止める
          //
          if((nNewMillis - StartTime[nOGNo])>=nLen[nOGNo]*TAN_I - TAN_M){
            nHz[nOGNo] = 0.0;  //音の区切りは歯切れ良く
            digitalWrite(BuzzPinNo[nOGNo], LOW);  //音を切ったところがたまたまONのままだと音は止まるがLEDが光りっぱなしなのでLOWにする
          }
        }
        nOldTime[nOGNo] = nNewTime; //現在時刻をOldに保存しておく
      }
      //
      //音符で指定された時間が経過したら次の楽譜を探しに行く
      //
      if((nNewMillis - StartTime[nOGNo])>=nLen[nOGNo]*TAN_I){
        nNextFlag[nOGNo] = 1;
      }
    }
  }
  while(1);
}
float GetHz(int nOnkaiNo, char *szOto)
{
  if(szOto[0]==' '){
    return 0.0;
  }
  float fRet = 0.00;
  int nStart = 0;
  for(int i=nStart;;i++){
    if(strcmp(szOto, ontei[i].Note)==0 && ontei[i].Onkai==nOnkaiNo){
      fRet = ontei[i].fHz;
      break;
    }
    if(ontei[i].Note[0]==0){
      break;
    }
  }
  return fRet;
}