Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.10.2009, 19:13   #1
smalsvoloch
 
Регистрация: 06.10.2009
Сообщений: 8
Стрелка помогите написать процедуру на delphi для работы со звуком

в общем есть частота звука N и длительность звучания T, требуется написать процедуру вывода звукового сигнала частотой N в течение времени T.
Выводить надо частоту на колонки (не системный динамик)...... может кто поможет???
smalsvoloch вне форума Ответить с цитированием
Старый 13.10.2009, 19:15   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,810
По умолчанию

Windows.Beep (N, T);

Скорее всего он на динамик выведет (не понял, т.к. на ноуте весь звук идёт на колонки).

Вот пример из DRKB:

Код:
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;

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

Последний раз редактировалось Arigato; 13.10.2009 в 19:26.
Arigato на форуме Ответить с цитированием
Старый 14.10.2009, 21:48   #3
smalsvoloch
 
Регистрация: 06.10.2009
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Windows.Beep (N, T);

Скорее всего он на динамик выведет (не понял, т.к. на ноуте весь звук идёт на колонки).

Вот пример из DRKB:

Код:
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;

procedure TForm1.Button1Click(Sender: TObject);
begin
MakeSound(1200, 1000, 60);
end;
ВАЩЬ ... спасибо.... воспроизводит он на звуковой карте, да еще и регулировка громкости... это вообще замечательно... только там небольшой косяк был где то (присваивание надо было поставить), но ет исправил.... пашет замечательно!!!
smalsvoloch вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно написать ПО для работы с видеизображением nazarei Фриланс 3 27.08.2009 14:28
Помогите правильно написать процедуру seasanya Microsoft Office Access 1 26.01.2009 22:02
Помогите написать процедуру на кнопку evrey Общие вопросы Delphi 1 16.06.2008 22:25
Функции Win32 API Для работы со звуком FSS Win Api 2 29.01.2008 04:41