
| Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
![]() |
||
Кто-нить знает, как в дельфи издать звук опр. частоты?
|
||
| Философия, технологии, алгоритмы! |
![]() |
|
|
Опции темы |
|
|
#1 |
|
Форумец
Сообщений: 148
Регистрация: 18.12.2003
Возраст: 36
|
Кто-нить знает, как в дельфи издать звук опр. частоты?
Есть такой вопрос.
Хотелось бы узнать какую-нить процедуру в delphi, которая издает звук опр. частоты(типа Sound в паскале), но чтобы звук был не на спикере, а в колонках(наушниках итп). ЗЫ я знаю, что такой стандартной процедуры нет, а хотелось бы увидеть отдельно написанную процедуру. |
|
|
|
|
#2 |
|
Форумец
Сообщений: 141
Регистрация: 16.06.2002
|
unit WinSound_;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, MPlayer; type TForm1 = class(TForm) MediaPlayer1: TMediaPlayer; // медиаплеер Label1: TLabel; // информационное сообщение ListBox1: TListBox; // список WAV-файлов Label2: TLabel; // выбранный из списка файл procedure FormActivate(Sender: TObject); procedure ListBox1Click(Sender: TObject); procedure MediaPlayer1Click(Sender: TObject; Button: TMPBtnType; var DoDefault: Boolean); private { Private declarations } public { Public declarations } end; const SOUNDPATCH='c:\windows\media\'; // положение звуковых файлов var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormActivate(Sender: TObject); var SearchRec: TSearchRec; // структура, содержащая информацию о файле, // удовлетворяющем условию поиска begin Form1.MediaPlayer1.Play; // сформируем список WAV-файлов, находящихся // в каталоге c:\windows\media if FindFirst(SOUNDPATCH+'*.wav', faAnyFile, SearchRec) =0 then begin // в каталоге есть файл с расширением WAV // добавим имя этого файла в список Form1.ListBox1.Items.Add(SearchRec.Name); // пока в каталоге есть другие файлы с расширением WAV while (FindNext(SearchRec) = 0) do Form1.ListBox1.Items.Add(SearchRec.Name); end; end; // щелчек на элементе списка procedure TForm1.ListBox1Click(Sender: TObject); begin // вывести в поле метки Label2 имя выбранного файла Label2.Caption:=ListBox1.Items[ListBox1.itemIndex]; end; // щелчок на кнопке компонента MediaPlayer procedure TForm1.MediaPlayer1Click(Sender: TObject; Button: TMPBtnType; var DoDefault: Boolean); begin if (Button = btPlay) and (Label2.Caption <> '') then begin // нажата кнопка Play with MediaPlayer1 do begin FileName:=SOUNDPATCH+Label2.Caption; // имя выбранного файла Open; Play; end; end; end; end. Так всегда работает. Если надо еще кучу процедур могу в примерах написать. И с простой генерацией произвольного сигнала не из файла. |
|
|
|
|
#4 |
|
Форумец
Сообщений: 33
Регистрация: 02.03.2004
|
Можно через функции MMSystem:
http://delphi.vitpc.com/asp/viewitem.asp?catalogid=534 |
|
|
|
|
#6 |
|
Форумец
Сообщений: 33
Регистрация: 02.03.2004
|
uses MMSystem;
waveOutGetDevCaps -- получить свойства аудиоустройства waveOutOpen -- открыть аудиоустройство waveOutPrepareHeader -- приготовить буфер вывода для воспроизведения waveOutWrite -- вывести звук (поставить буфер на воспроизведение) waveOutReset -- остановить воспроизведение и освободить буферы waveOutUnprepareHeader -- вернуть буфер вывода WaveOutClose -- закрыть устройство вывода звука |
|
|
|
|
#7 |
|
Пламенный Athlon
Сообщений: 113
Регистрация: 04.08.2004
Возраст: 37
|
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; Где частота, время, громкость, или вроде того... |
|
|