Proyek 10 – Piezo Sounder Melody Player

Piezo dapat digunakan untuk memainkan melodi. Pada proyek ini lagu yang akan dimainkan adalah “Oh My Darling Clementine”. Rangkaian sama seperti proyek sebelumnya.

Sketch

#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
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494

#define WHOLE 1
#define HALF 0.5
#define QUARTER 0.25
#define EIGHTH 0.125
#define SIXTEENTH 0.0625

int tune[] = {
 NOTE_F3, NOTE_F3, NOTE_F3, NOTE_C3,
 NOTE_A3, NOTE_A3, NOTE_A3, NOTE_F3,
 NOTE_F3, NOTE_A3, NOTE_C4, NOTE_C4, NOTE_AS3, NOTE_A3, NOTE_G3,
 NOTE_G3, NOTE_A3, NOTE_AS3, NOTE_AS3,
 NOTE_A3, NOTE_G3, NOTE_A3, NOTE_F3,
 NOTE_F3, NOTE_A3, NOTE_G3, NOTE_C3, NOTE_E3, NOTE_G3, NOTE_F3
};

float duration[] = {
 EIGHTH+SIXTEENTH, SIXTEENTH, QUARTER, QUARTER,
 EIGHTH+SIXTEENTH, SIXTEENTH, QUARTER, QUARTER,
 EIGHTH+SIXTEENTH, SIXTEENTH, QUARTER+EIGHTH, EIGHTH, EIGHTH, EIGHTH, HALF,
 EIGHTH, SIXTEENTH, QUARTER, QUARTER,
 EIGHTH+SIXTEENTH, SIXTEENTH, QUARTER, QUARTER,
 EIGHTH+SIXTEENTH, SIXTEENTH, QUARTER+EIGHTH, EIGHTH, EIGHTH, SIXTEENTH, HALF
};

int length;

void setup() {
  pinMode(8, OUTPUT);
  length = sizeof(tune) / sizeof(tune[0]);
}

void loop() {
  for (int x=0; x<length; x++) {
    tone(8, tune[x]);
    delay(1500 * duration[x]);
    noTone(8);
  }
  delay(5000);
}

Pembahasan Sketch

Sketch diawali dengan perintah define, perintah ini berguna untuk mendifinisikan sebuah token berserta nilainya.

Perintah define untuk set not dari C3 – B4 beserta nilai frekuensi tiap-tiap not.

Direktif berikutnya adalah panjang not. Panjang note bisa berupa penuh, setengah, seperempat, seperdelapan atau seperenambelas. Angka tersebut akan kita gunakan untuk perhitungan panjang setiap note.

Contoh not seperempat adalah 0.25, pada contoh maka 1500 x 0.25 untuk mendapatkan panjang sebuah not seperempat.

Berikutnya definisikan tune yang berisi lagu ‘Oh My Darling Clementine’.

int tune[] = {<br>
 NOTE_F3, NOTE_F3, NOTE_F3, NOTE_C3,<br>
 NOTE_A3, NOTE_A3, NOTE_A3, NOTE_F3,<br>
 NOTE_F3, NOTE_A3, NOTE_C4, NOTE_C4, NOTE_AS3, NOTE_A3, NOTE_G3,<br>
 NOTE_G3, NOTE_A3, NOTE_AS3, NOTE_AS3,<br>
 NOTE_A3, NOTE_G3, NOTE_A3, NOTE_F3,<br>
 NOTE_F3, NOTE_A3, NOTE_G3, NOTE_C3, NOTE_E3, NOTE_G3, NOTE_F3<br>
};

Gunakan array dengan tipe float, untuk mengatur durasi setiap note pada array int.

float duration[] = {<br>
 EIGHTH+SIXTEENTH, SIXTEENTH, QUARTER, QUARTER,<br>
 EIGHTH+SIXTEENTH, SIXTEENTH, QUARTER, QUARTER,<br>
 EIGHTH+SIXTEENTH, SIXTEENTH, QUARTER+EIGHTH, EIGHTH, EIGHTH, EIGHTH, HALF,<br>
 EIGHTH, SIXTEENTH, QUARTER, QUARTER,<br>
 EIGHTH+SIXTEENTH, SIXTEENTH, QUARTER, QUARTER,<br>
 EIGHTH+SIXTEENTH, SIXTEENTH, QUARTER+EIGHTH, EIGHTH, EIGHTH, SIXTEENTH, HALF<br>
};

Dengan menggunakan perintah define, kode program akan lebih terbaca, dan bila ada salah, cukup merubah value di area define.

int length;

variable length ini digunakan untuk menghitung dan menyimpan panjang array.

Pada fungsi setup, atur digital pin 8 sebagai output.

pinMode(8, OUTPUT);

kemudian initialisasi variable lenght

length = sizeof(tune) / sizeof(tune[0]);

Fungsi sizeof() mengembalikan nilai bytes dari parameter yang dikirimkan. Pada contoh maka hasilnya adalah 26/2, yaitu 13.

Pada main loop, kita gunakan perintah for untuk looping seluruh note dari lagu. Kemudian memainkan note tersebut pada pin 8 dengan perintah berikut

tone(8, tune[x]);

Gunakan delay dengan panjang 1500 milliseconds dikalikan dengan panjang note.

delay(1500 * duration[x]);

Sebelum memainkan note berikutnya, matikan dahulu tone yang telah diassign.

noTone(8);

Perintah ini untuk memastikan tidak ada 2 nada yang bermain bersamaan. Tanpa perintah noTone, note akan bercampur.

Akhir program, setelah lagu selesai dimainkan oleh perintah for, delay selama 5 detik sebelum memulai lagu dari awal lagi.

delay(5000);

Nilai 1500 pada delay fuction dapat diubah untuk mempercepat atau memperlambat lagu.

Sharing is caring: