先の「アナログ出力」は一定時間間隔で出力するパルスの幅を変える機能でした。パルスの幅でなくパルスの間隔を変えると音程(音の高さ)の異なる音を出すことができます。これらは、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);
}