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;
}
JUGEMテーマ:Arduino