先の「アナログ出力」は一定時間間隔で出力するパルスの幅を変える機能でした。パルスの幅でなくパルスの間隔を変えると音程(音の高さ)の異なる音を出すことができます。これらは、MPUの「タイマー機能」を利用しています。
ドイツ音階 | A | A# | B | C | C# | D | D# | E | F | F# | G | G# | A |
ラ | ラ# | シ | ド | ド# | レ | レ# | ミ | ファ | ファ# | ソ | ソ# | ラ | |
周波数 | 220.0 | 233.1 | 246.9 | 261.6 | 277.2 | 293.7 | 311.1 | 329.6 | 349.2 | 369.9 | 391.9 | 415.3 | 440.0 |
周波数比 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | |
周期(mS) | 4.5 | 4.3 | 4.1 | 3.8 | 3.6 | 3.4 | 3.2 | 3.0 | 2.9 | 2.7 | 2.6 | 2.4 | 2.3 |
tone(出力端子、周波数、長さ);音階を周波数に、長さを音符(4分、8分音符)に対応させると、楽譜を演奏することができます。noTone()で音は停止します。長さの時間が経過する前に次の音を指定すると、前の音が消えます。また、異なる端子に別の音を出すことはできません。
int melody[] = {NOTE_C4, NOTE_G3,NOTE_G3, NOTE_A3, NOTE_G3,0, NOTE_B3,NOTE_C4};これは ドソソラソ シド になります。
int noteDurations[] = { 4,8,8,4,4,4,4,4 };
//音階演奏 #define NOTE_G2 98 //ソ #define NOTE_GS2 104 //ソ# #define NOTE_A2 110 //ラ #define NOTE_AS2 117 #define NOTE_B2 123 #define NOTE_C3 131 //ド #define NOTE_CS3 139 #define NOTE_D3 147 #define NOTE_DS3 156 #define NOTE_E3 165 #define NOTE_F3 175 #define NOTE_FS3 185 #define NOTE_G3 196 #define NOTE_GS3 208 #define NOTE_A3 220 #define NOTE_AS3 233 #define NOTE_B3 247 #define NOTE_C4 262 //ド #define NOTE_CS4 277 #define NOTE_D4 294 #define NOTE_DS4 311 #define NOTE_E4 330 #define NOTE_F4 349 #define NOTE_FS4 370 #define NOTE_G4 392 //音符の高さ //ドソソラソシド int melody[] = { NOTE_C4, NOTE_G3,NOTE_G3, NOTE_A3, NOTE_G3,0, NOTE_B3, NOTE_C4}; //音符の長さ // 4:4分音符, 8:8分音符, etc.: int noteDurations[] = { 4,8,8,4,4,4,4,4 }; void setup() { } void loop() { for (int thisNote = 0; thisNote < 8; thisNote++) { //発音時間を定める int duration = 1000/noteDurations[thisNote]; tone(8, melody[thisNote],duration); //音符の間で時間をあける int pause = duration * 1.30; delay(pause); //演奏停止、なくてもよい noTone(8); } delay(1000); }