Mahir Arduino Sketch dan Elektro secara praktek

14 - Piezo-Sounder Melody Player

Daripada bikin bunyi yang mengganggu, bagaimana bila kita bikin piezo memainkan melodi. Pada proyek ini akan kita bikin arduino memainkan lagu "Oh My Darling Clementine". Biarkan rangkaian tetap seperti proyek sebelumnya.

Code

// Project 14 - Piezo Sounder Melody Player

#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 Kode
Kode kali ini diawali dengan perintah define, perintah ini berguna untuk mendifinisikan sebuah token berserta nilainya.

Pada proyek ini kita melakukan perintah define untuk set not dari C3 - B4 beserta nilai frekuensi tiap-tiap not. Sebetulnya lagu pada proyek ini tidak menggunakan semua lagu, namun kita sediakan, barangkali pembaca hendak bikin lagu pilihan sendiri.

Direktif berikutnya adalah panjang not. Yang sudah lupa pelajaran seni musik waktu SMP atau SMA, monggo dibuka-buka lagi bukunya.. ;)  Panjang note bisa berupa penuh, setengah, seperempat, seperdelapan atau seperenambelas. Angka tersebut akan kita gunakan untuk perhitungan panjang setiap note. Sebagai contoh note seperempat adalah 0.25, pada contoh kasus kita maka 1500 x 0.25 untuk mendapatkan panjang sebuah note seperempat.


Berikutnya kita akan mendefinisikan tune yang berisi lagu ‘Oh My Darling Clementine’.

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
};


Setelah itu, kita buat array baru dengan tipe float, untuk mengatur durasi setiap note pada array int.

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
};


Nah, tentu sekarang jelaskan, kenapa kita menggunakan perintah define, karena dengan perintah define, kode program kita akan lebih terbaca, dan bila ada salah, cukup merubah value di area define.

Berikutnya kita buat satu variable integer length.

int length;

variable length ini digunakan untuk menghitung dan menyimpan panjang array.

Pada routing setup, pertama kali kita 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 kita kirimkan. Pada contoh kasus kita maka hasilnya adalah 26 / 2, yaitu 13.

Pada main loop, kita gunakan perintah for untuk looping seluruh note dari lagu.
  for (int x=0; x<length; x++) {

Kemudian memainkan note tersebut pada pin 8 dengan perintah berikut

    tone(8, tune[x]);

Kemudian kita gunakan delay, panjang delay adalah  1500 milliseconds dikalikan dengan panjang note.

delay(1500 * duration[x]);

Sebelum dilanjut ke note berikutnya, kita matikan dahulu tone yang telah kita assign di pin 8

noTone(8);

Perintah ini untuk memastikan tidak ada 2 nada yang  bermain bersamaan. Tanpa perintah noTone, note akan bercampur, anda bisa bereksperimen untuk melihat hasilnya dengan menghapus perintah noTone.

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

delay(5000);

Jika kamu ingin mempercepat atau memperlambat lagu, dapat mengubah nilai 1500 pada delay fuction.


Related Artikel
Projek Sebelumnya Piezo Sounder Alarm
Projek Berikutnya Piezo Knock Sensor

No comments:

Post a Comment