- Back to Home »
- Membangkitkan Tone dengan Delphi
Posted by : Unknown
Jumat, 08 Mei 2015
Artikel mengenai cara menghasilkan bunyi tone menggunakan Delphi.
Bunyi tone yang dihasilkan kemudian dapat disimpan sebagai file WAV.
Pendahuluan
Untuk membuat bunyi tone yang frekuensinya ditentukan saat runtime, kita bisa menggunakan Beep() milik Windows. Fungsi ini simple tapi sayangnya mungkin untuk beberapa kasus, tidak cocok. Contohnya suara beep yang dibangkitkan, tidak bisa disimpan di file.Problem ini sempat mengemuka di milis Delphindo. Oleh karena itu saya tulis artikelnya. Untuk artikel kali ini, kita akan membuat aplikasi tone generator. Tone generator ini saya buat ketika terlibat dalam sebuah proyek active noise cancellation yakni sistem peredaman suara aktif dimana gelombang suara diredam menggunakan gelombang suara yang sama tapi dengan fase yang berbeda 180 derajat. ok langsung saja ke kode.
Implementasi Tone Generator
Kode berikut ini adalah deklarasi tipe-tipe yang akan kita pakai di tone generator dan beberapa deklarasi fungsi-fungsi helper. Tidak susah bukan?{======================================
Sound type definition
=======================================
(c) 2006 zamrony p juhara
=======================================}unit uSoundTypes;
interface
type
TVolumeLevel = 0..127;
TSampleRate=(sr8KHz,sr11_025KHz,sr22_05KHz,sr44_1KHz);
TSoundChannel=(chMono,chStereo);
TBitsPerSample=(bps8Bit,bps16Bit,bps32Bit);
function GetSampleRate(SampleRate:TSampleRate):integer;
function GetEnumSampleRate(SampleRate:integer):TSampleRate;
function GetNumChannels(ch:TSoundChannel):word;
function GetSoundChannels(nChannel:word):TSoundChannel;
function GetBitsPerSample(bits:TBitsPerSample):word;
function GetEnumBitsPerSample(bits:word):TBitsPerSample;
implementation
const SampleRates:array[sr8KHz..sr44_1KHz] of integer=
(8000,11025,22050,44100);
Channels:array[chMono..chStereo] of word=
(1,2);
BitsPerSample:array[bps8Bit..bps32Bit] of word=
(8,16,32);
function GetSampleRate(SampleRate:TSampleRate):integer;
begin
result:=SampleRates[SampleRate];
end;
function GetEnumSampleRate(SampleRate:integer):TSampleRate;
begin
result:=sr8KHz;
case sampleRate of
8000:result:=sr8KHz;
11025:result:=sr11_025KHz;
22050:result:=sr22_05KHz;
44100:result:=sr44_1KHz;
end;
end;
function GetNumChannels(ch:TSoundChannel):word;
begin
result:=Channels[ch];
end;
function GetSoundChannels(nChannel:word):TSoundChannel;
begin
result:=chMono;
case nChannel of
1:result:=chMono;
2:result:=chStereo;
end;
end;
function GetBitsPerSample(bits:TBitsPerSample):word;
begin
result:=BitsPerSample[bits];
end;