Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Генератор звуковых частот [D7, WinXP]


cherrex ©   (2004-07-24 14:41:00) 

нужно создать программу по Генерации звуковых частот. Пользователь вводит частоту (рапример 357Гц), а программа генерирует звук. помогите пожалуйсто, а то я даже не знаю ч чего начать, а лучше примерчик или ссылку на информацию.


cherrex   (2004-07-26 12:25:00) [1]

Большое спосибо!!!


Константинов   (2004-07-24 18:29:00) [2]

Самый простой пример:

uses  
 MMSystem;  

type  
 TVolumeLevel = 0..127;  

procedure MakeSound(Frequency{Hz}, Duration{mSec}: Integer; Volume: TVolumeLevel);  
 {writes tone to memory and plays it}  
var  
 WaveFormatEx: TWaveFormatEx;  
 MS: TMemoryStream;  
 i, TempInt, DataCount, RiffCount: integer;  
 SoundValue: byte;  
 w: double; // omega ( 2 * pi * frequency)  
const  
 Mono: Word = $0001;  
 SampleRate: Integer = 11025; // 8000, 11025, 22050, or 44100  
 RiffId: string = 'RIFF';  
 WaveId: string = 'WAVE';  
 FmtId: string = 'fmt ';  
 DataId: string = 'data';  
begin  
 if Frequency > (0.6 * SampleRate) then  
 begin  
   ShowMessage(Format('Sample rate of %d is too Low to play a tone of %dHz',  
     [SampleRate, Frequency]));  
   Exit;  
 end;  
 with WaveFormatEx do  
 begin  
   wFormatTag := WAVE_FORMAT_PCM;  
   nChannels := Mono;  
   nSamplesPerSec := SampleRate;  
   wBitsPerSample := $0008;  
   nBlockAlign := (nChannels * wBitsPerSample) div 8;  
   nAvgBytesPerSec := nSamplesPerSec * nBlockAlign;  
   cbSize := 0;  
 end;  
 MS := TMemoryStream.Create;  
 with MS do  
 begin  
   {Calculate length of sound data and of file data}  
   DataCount := (Duration * SampleRate) div 1000; // sound data  
   RiffCount := Length(WaveId) + Length(FmtId) + SizeOf(DWORD) +  
     SizeOf(TWaveFormatEx) + Length(DataId) + SizeOf(DWORD) + DataCount; // file data  
   {write out the wave header}  
   Write(RiffId[1], 4); // 'RIFF'  
   Write(RiffCount, SizeOf(DWORD)); // file data size  
   Write(WaveId[1], Length(WaveId)); // 'WAVE'  
   Write(FmtId[1], Length(FmtId)); // 'fmt '  
   TempInt := SizeOf(TWaveFormatEx);  
   Write(TempInt, SizeOf(DWORD)); // TWaveFormat data size  
   Write(WaveFormatEx, SizeOf(TWaveFormatEx)); // WaveFormatEx record  
   Write(DataId[1], Length(DataId)); // 'data'  
   Write(DataCount, SizeOf(DWORD)); // sound data size  
   {calculate and write out the tone signal} // now the data values  
   w := 2 * Pi * Frequency; // omega  
   for i := 0 to DataCount - 1 do  
   begin  
     SoundValue := 127 + trunc(Volume * sin(i * w / SampleRate)); // wt = w * i / SampleRate  
     Write(SoundValue, SizeOf(Byte));  
   end;  
   {now play the sound}  
   sndPlaySound(MS.Memory, SND_MEMORY or SND_SYNC);  
   MS.Free;  
 end;  
end;  

// How to call the function:  

procedure TForm1.Button1Click(Sender: TObject);  
begin  
 MakeSound(1200, 1000, 60);  
end;  

Взято с сайта http://www.swissdelphicenter.ch/en/tipsindex.php


Ig   (2004-07-24 17:06:00) [3]

Ищи TToneGen v.2.15, там можно сделать все, что тебе надо и даже больше :)


Наверх

Титульная страница Поиск, карта сайта Написать письмо