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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | #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" ); 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