jenis file suara menurut sistem kompres data-nya terdiri atas file suara terkompresi dan file suara tidak dikompresi (compressed/uncompresses), yaitu metode penyimpanan data suara digital yang bertujuan memperkecil ukuran file suara dan dengan penurunan kualitas suara sekecil-kecilnya.
File suara tidak dikompres memiliki keunggulan kualitas yang asli selain itu tidak memerlukan proses dekompresi yang rumit untuk mengambil/memutar-nya menjadi suara.
WAV (waveform audio file format) adalah contoh file suara yang tidak dikompres. karena masih menyimpan data aslinya jenis file ini memiliki ukuran yang besar. tidak seperti file suara terkompresi seperti .mp3, .aac, .ogg, .wma yang mmembutuhkan algoritma/codec untuk membuka datanya, .wav bisa langsung digunakan. sehingga .wav sangat cocok untuk perangkat mikrokontroller seperti arduino yang memiliki kecepatan dan memory yang kecil.
play .wav dengan arduino
file wav disimpan dan di ambil data-nya dengan metode PCM (pulse code modulation). file wav memiliki struktur header 44 byte yang berisi informasi jum;ah channel (mono/stereo), sample rate, bit per sampel dan informasi lainnya.
Khusus penggunaan arduino untuk memutarĀ file .wav dengan kecepatan 16MHz hanya efektif di sample rate 32.000, 16.000, 8.000 dengan kanal mono dan 8 bit per sampel.
Skema memutar file suara .wav menggunakan arduino dari microSD
Rangkaian speaker bukan stereo (tapi unbalanced audio connection)
(seandainya menggunakan ampli) jangan hubungkan ground arduino dan ground ampli jika keluaran suara ke speaker menggunakan 2 kabel pin 9 dan 10 (gunakan salah satu saja jika ground terhubung)
koding memainkan suara dari kartu memori berbasis arduino:
#define pinSpeakerA 9 #define pinSpeakerB 10 #define pinCS 8 #define faktorKali 2 #include <SD.h> #include <SPI.h> bool suaraDimainkan; uint32_t sampleCounter; byte ulangPerSampel; byte ulang; struct HeaderWAV { char RIFF[4]; unsigned long ChunkSize; char WAVE[4]; char fmt[4]; unsigned long Subchunk1Size; unsigned short AudioFormat; unsigned short NumOfChan; unsigned long SamplesPerSec; unsigned long bytesPerSec; unsigned short blockAlign; unsigned short bitsPerSample; char Subchunk2ID[4]; unsigned long Subchunk2Size; }; HeaderWAV headerWAV; File fileSuara; void setup(void) { pinMode(pinSpeakerA, OUTPUT); pinMode(pinSpeakerB, OUTPUT); Serial.begin(9600); Serial.println("Memutar file suara .wav pada kartu memory SDCard dengan arduino"); Serial.println("https://www.project.semesin.com/"); if (!SD.begin(pinCS)) { Serial.println("SD fail"); return; } } void loop(void) { if (!suaraDimainkan) { mainkanSuara("pulang.wav"); } else { lanjutkanSuara(); } } void mainkanSuara(char *namaFile) { fileSuara = SD.open(namaFile); if ( !fileSuara ) { Serial.println("File suara tidak ditemukan"); return 0; } byte *alamat = (byte*)&headerWAV; for (byte i = 0; i < sizeof(headerWAV); i++) { byte data = fileSuara.read(); *alamat++ = data; } Serial.print("namaFile="); Serial.println(namaFile); Serial.print("headerWAV.SamplesPerSec="); Serial.println(headerWAV.SamplesPerSec); Serial.print("headerWAV.NumOfChan="); Serial.println(headerWAV.NumOfChan); Serial.print("headerWAV.bitsPerSample="); Serial.println(headerWAV.bitsPerSample); Serial.print("headerWAV.Subchunk2Size="); Serial.println(headerWAV.Subchunk2Size); ulangPerSampel = 32000L / headerWAV.SamplesPerSec; ICR1 = 256; TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(WGM11); TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); sampleCounter = 0; ulang = 0; suaraDimainkan = true; } void lanjutkanSuara() { if (TIFR1 & _BV(TOV1)) { TIFR1 |= _BV(TOV1); if (!(ulang++ % ulangPerSampel)) { if (sampleCounter++ >= headerWAV.Subchunk2Size) { Serial.println("Selesai"); stopPlayback(); } else { byte data = fileSuara.read(); uint16_t sample = data; OCR1B = 256 - sample; OCR1A = sample; } } } } void stopPlayback() { TIMSK1 &= ~_BV(OCIE1A); TCCR1B &= ~_BV(CS10); OCR1A = 128; OCR1B = 128; fileSuara.close(); digitalWrite(pinSpeakerA, LOW); digitalWrite(pinSpeakerB, LOW); suaraDimainkan = false; }
contoh file .wav mono 16kHz 8 bit:
pulang.wav
Thanks om percobaan saya ini berhasil langsung run om apakah sket ini bisa di kembangkan dengan di tambah sensor pas sensor di pukul dia jalan pas sesnsor ga di pukul dia berhenti saya lagi pengen praktek bikin drum arduino.
takutnya ada delay (pembacaan kartu memory sampai pembangkitan suara)
belum pernah uji berapa delaynya yang ini
kalau delay masih bisa ditoleransi, rasanya bisa saja pengaktifan suaranya di trigger oleh tuts
sulit sepertinya bang soalnya gak bisa membunyikan dua suara secara bersamaan bang
Gan kalo saya mau nambahin mini amplifier PAM8403,itu gimana cara wiring nya ya?
Karna itu nanti input nya saya mau tambahin jack 3.5mm.
Terimakasih
arduino — pam8403
9 — L in
10 — R in
gnd – gnd
pam8403 — speaker
L out – spk(1)
R out – spk(2)
kalo dengan PAM8410 gimana gan?
input seperti biasa L-GND-R, outputnya 1 speaker L-R
Bang alat ini bisa di gunakan untuk banyak file suara kan? Ga cuman untuk 1 file suara doang
bisa, selama masih muat di memory sdcard
bang semisal output suaranya diganti pakai earphone kira” ada komponen tambahan gk bang
tergantung besarnya ohm dari speaker earphone, jika terlalu besar misal 32ohm gunakan (mini) amplifier
Bang mohon info model/type arduino yang digunakan
arduino uno (boleh model 16u2/ch340, dip/smd)