Halaman

Minggu, 10 Juni 2012

Program Alarm Beep dalam Bahasa C di Sistem Linux

Program C termasuk bahasa pemrograman yang sering dipakai untuk keperluan pemrograman sistem (System Programming). Namun kali ini saya akan mencoba membuat program dengan bahasa pemrograman C untuk keperluan membuat alarm sederhana dengan memanfaatkan nada beep pada speaker PC internal.

Nada beep bisa dipanggil secara langsung dari terminal Linux tanpa harus melalui program C. Namun kelemahannya nada yang dihasilkan tidak fleksibel dan frekuensi serta waktu bunyinya tidak bisa diatur saat runtime. Jika Anda ingin mengetahui caranya, silakan baca tulisan Mengaktifkan Nada Beep Speaker PC Internal Melalui Terminal Linux.


Hasil Program Alarm Beep dalam Bahasa C di Sistem Linux


Menggunakan fungsi system()
Fungsi system() dapat dipakai untuk mengeksekusi program executable yang dilampirkan nama programnya dalam bentuk atribut string. Fungsi ini didefinisikan pada header stdlib.h sehingga jika ingin memakai fungsi system() maka deklarasinya adalah sebagai berikut:
#include <stdlib.h>

int main() {
  system("cal");
  return 0;
}
Kode di atas akan menampilkan kalender di terminal Linux.

Membunyikan Nada Beep Melalui Program C
Seperti yang telah dijelaskan di atas, bahwa nada beep dapat dibunyikan melalui program beep yang dijalankan melalui terminal Linux. Untuk itu Anda perlu menginstal program beep dan konfigurasinya yang telah saya uraikan pada tulisan Mengaktifkan Nada Beep Speaker PC Internal Melalui Terminal Linux.

Apabila program beep telah terinstal dan telah diaktifkan, maka Anda bisa memanggil programnya lewat fungsi system(). Berikut kodenya:
#include <stdlib.h>

int main() {
  system("beep -f 2000 -l 5000");
  return 0;
}
Kode di atas akan menghasilkan nada beep dengan frekuensi 2 kHz selama 5 detik.

Modifikasi Program Alarm Beep Secara Terprogram
Pada kode program C sebelumnya memiliki kekurangan yakni hasil nada beep-nya statis. Artinya nada tidak bisa diatur besaran frekuensi serta waktunya saat runtime. Kali ini dengan sedikit modifikasi, program C ini akan saya buat agar menghasilkan nada yang frekuesinya bervariasi.

Agar nadanya berubah secara bertahap dan terdengar halus, maka saya gunakan persamaan fungsi sinus. Nilai sinus dapat diperoleh dengan cara merubah besaran derajat nilainya ke dalam bentuk radian. Hasil dari nilai radian tersebut dilampirkan dalam fungsi sin(). Fungsi sin() ini didefinisikan dalam header math.h

Selain pengolahan numerik, di dalam program ini juga terdapat proses penyalinan string, pemanggilan program beep, dan menampilkan hasil frekuensinya ke layar terminal. Untuk itu header standar library C berikut perlu dituliskan:
#include <stdio.h> // untuk printf()
#include <stdlib.h> // untuk system()
#include <string.h> // untuk strcat() dan strcpy()
#include <math.h> // untuk sin()
Selanjutnya diperlukan beberapa variabel penampung data frekuensi awal, nilai sinus, dan hasil pengolahan nada.
// ...
int main(int argc, char** argv){
  int freq = 1000; // frekuensi awal dalam satuan Hz 
  float sinVal; // nilai sinus
  int toneVal; // menampung frekuensi pengolahan
  // ...

  return 0;
}
Supaya nada berubah secara dinamis, maka kode berikut perlu disertakan dalam perulangan.
int x;
for (x = 0; x < 180; x++) {
  sinVal = (sin(x*(3.1412/180)));
  toneVal = freq + ((int)(sinVal * 1000));
  char buffer1[20], buffer2[20];
  sprintf(buffer1,"%d",toneVal);
  strcpy(buffer2, "beep -l 250 -f ");
  strcat(buffer2, buffer1);
  system(buffer2);
  printf("Freq: %d Hz\n", toneVal);
}
Inti dari pengolahan nada di atas adalah dari statemen:
sinVal = (sin(x*(3.1412/180)));
toneVal = freq + ((int)(sinVal * 1000));
Pada statemen di atas variabel sinVal menampung nilai sinus dan variabel toneVal menampung nilai frekuensi yang nanti akan dilampirkan pada program beep.

Kemudian untuk mengolah data stringnya agar bisa dilampirkan dalam bentuk teks pada fungsi system(), misalnya "beep -l 250 -f 1500", maka diperlukan kode memanipulasi string seperti berikut:
char buffer1[20], buffer2[20];
sprintf(buffer1,"%d",toneVal);
strcpy(buffer2, "beep -l 250 -f ");
strcat(buffer2, buffer1);
Inti dari kode diatas adalah melakukan tiga hal yakni:
  1. Merubah tipe data integer ke string dari variabel toneVal ke dalam variabel buffer1
  2. Menyalin data string "beep -l 250 -f " ke variabel buffer2
  3. Menggabungkan data string variabel buffer1 ke variabel buffer2

Selanjutnya fungsi system() dan printf() dipanggil untuk mengeksekusi program beep dan menampilkan nilai frekuensinya ke layar terminal.
system(buffer2);
printf("Freq: %d Hz\n", toneVal)

Alternatif Lain
Untuk hasil maksimal dan nada yang dihasilkan lebih bagus dan halus, minim terjadi delay, serta tidak ketergantungan pada program lain yakni program beep, maka modifikasi pada program di atas perlu dilakukan. Kelemahan memakai program ini adalah menggunakan fungsi-fungsi khusus sistem UNIX sehingga tidak portabel dan terkesan low-level yakni sulit dimengerti karena menggunakan fungsi-fungsi native yang ada pada sistem operasi Linux.

Tambahkan deklarasi header khusus untuk sistem UNIX berikut:
#include <unistd.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <linux/kd.h>
Kemudian ganti nilai inisialisasi dari variabel freq. Tambahkan juga variabel len untuk keperluan delay dalam setiap perulangan.
int freq = 2000;
int len = 10000;
Modifikasi seluruhnya pada kode sebelumnya dengan kode baru ini:
int fd = open("/dev/console", O_RDONLY);
float sinVal;
int toneVal;
int x;
for (x = 0; x < 180 * 6; x++) {
  sinVal = (sin(x * (3.1412/180)));
  toneVal = freq + ((int)(sinVal * 1500));
  ioctl(fd, KIOCSOUND, (int)(1193180 / toneVal));
  printf("Freq: %d Hz\n", toneVal);
  usleep(len);
}
ioctl(fd, KIOCSOUND, 0);
close(fd);
Untuk kompilasi programnya dengan menggunakan program GCC (GNU Compiler Collection). Perintahnya adalah:
gcc -Wall -o alarm alarm.c -lm
Karena kita mengakses file /dev/console seperti terlihat pada potongan kode di atas, maka saat menjalankan program ini kita harus login sebagai root. Cukup ketikan perintah berikut pada terminal:
su root
./alarm
Keluaran dari program ini adalah program akan menghasilkan nada rendah ke nada tinggi secara bertahap kemudian turun lagi nadanya yang berlangsung beberapa kali (perubahan nada naik-turun secara berulang).

TIPS: Jika Anda menghentikan programnya pada saat program sedang berjalan dengan cara menekan tombol Ctrl+C pada terminalnya, maka nada akan terus bunyi. Untuk menghentikannya cukup ketikan perintah beep dengan asumsi program beep telah diinstal. Namun program alarm beep ini dirancang agar berjalan selama beberapa detik saja kemudian off sendiri.


Tidak ada komentar:

Posting Komentar