針腳音樂盒

  // 腳位定義

const int pins[] = {8, 9, 10};

const int numSongs = 3;


// 音符定義

#define NOTE_0 0

#define NOTE_C4 262

#define NOTE_D4 294

#define NOTE_E4 330

#define NOTE_F4 349

#define NOTE_G4 392

#define NOTE_A4 440

#define NOTE_B4 494

#define NOTE_C5 523

#define NOTE_D5 587

#define NOTE_E5 659

#define NOTE_G5 784


// 歡樂頌

int melody1[] = {

  NOTE_E4, NOTE_E4, NOTE_F4, NOTE_G4,

  NOTE_G4, NOTE_F4, NOTE_E4, NOTE_D4,

  NOTE_C4, NOTE_C4, NOTE_D4, NOTE_E4,

  NOTE_E4, NOTE_D4, NOTE_D4, NOTE_0

};

int durations1[] = {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4};


// 小星星

int melody2[] = {

  NOTE_C4, NOTE_C4, NOTE_G4, NOTE_G4,

  NOTE_A4, NOTE_A4, NOTE_G4, NOTE_0,

  NOTE_F4, NOTE_F4, NOTE_E4, NOTE_E4,

  NOTE_D4, NOTE_D4, NOTE_C4, NOTE_0

};

int durations2[] = {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4};


// 生日快樂

int melody3[] = {

  NOTE_C4, NOTE_C4, NOTE_D4, NOTE_C4, NOTE_F4, NOTE_E4, NOTE_0,

  NOTE_C4, NOTE_C4, NOTE_D4, NOTE_C4, NOTE_G4, NOTE_F4, NOTE_0

};

int durations3[] = {4,4,4,4,4,4,4,4,4,4,4,4,4,4};


// 對應旋律與節奏陣列

int* melodies[] = {melody1, melody2, melody3};

int* durations[] = {durations1, durations2, durations3};

int lengths[] = {

  sizeof(melody1)/sizeof(int),

  sizeof(melody2)/sizeof(int),

  sizeof(melody3)/sizeof(int)

};


void setup() {

  // 無需初始化

}


void loop() {

  for (int i = 0; i < numSongs; i++) {

    playMelody(pins[i], melodies[i], durations[i], lengths[i]);

    delay(500); // 每首歌間隔

  }

}


void playMelody(int pin, int* melody, int* duration, int length) {

  for (int i = 0; i < length; i++) {

    int noteDuration = 1000 / duration[i];

    if (melody[i] != NOTE_0) {

      tone(pin, melody[i], noteDuration);

    }

    delay(noteDuration * 1.3);

    noTone(pin);

  }

}



留言