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

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

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.01.2008, 15:16   #1
Gauss
Форумчанин
 
Аватар для Gauss
 
Регистрация: 26.11.2007
Сообщений: 235
По умолчанию Простой вопрос.Программирование звука.

Существует ли в дельфи процедура или функция, с помощью которой можно вывести звук, параметры(частота, тон, громкость и др) которого можно было бы регулировать???
Или может быть существует такой отдельный модуль?
Очень благодарен за ответы.
Gauss вне форума Ответить с цитированием
Старый 08.01.2008, 15:25   #2
SunKnight
Участник клуба Подтвердите свой е-майл
 
Аватар для SunKnight
 
Регистрация: 14.12.2007
Сообщений: 1,434
По умолчанию

Код:
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;
Код пренадлежит rubi.
Проповедую design patterns, верую в MVC, доверяю eXtrime programming.
SunKnight вне форума Ответить с цитированием
Старый 08.01.2008, 15:34   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Сушаствует конечно. НАпример PlaySound или функции Waveform Functions.
Еще мона bass.dll применить
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.01.2008, 12:13   #4
Gauss
Форумчанин
 
Аватар для Gauss
 
Регистрация: 26.11.2007
Сообщений: 235
По умолчанию

Большое вам спасибо что помогли, очень благодарен. Спасибо SunKnight за нужный код. Если понадобиться то добавлю другие параметры звука тоже в этой процедуре. )
Gauss вне форума Ответить с цитированием
Старый 09.01.2008, 13:26   #5
Gauss
Форумчанин
 
Аватар для Gauss
 
Регистрация: 26.11.2007
Сообщений: 235
По умолчанию

Извините SunKnight, а в этом коде строка 45-46 там идентификатор DWORD, он что показывает? И где мы его объявляем?
Если вам нетрудно конечно.
Gauss вне форума Ответить с цитированием
Старый 09.01.2008, 15:01   #6
SunKnight
Участник клуба Подтвердите свой е-майл
 
Аватар для SunKnight
 
Регистрация: 14.12.2007
Сообщений: 1,434
По умолчанию

Выписка из HELPа:
DWORD represents a four-byte integer.
Unit
Types
type DWORD = Longword;
Description
DWORD (double word) is used in Windows programming to represent a four-byte integer.
Проповедую design patterns, верую в MVC, доверяю eXtrime programming.
SunKnight вне форума Ответить с цитированием
Старый 09.01.2008, 22:33   #7
Gauss
Форумчанин
 
Аватар для Gauss
 
Регистрация: 26.11.2007
Сообщений: 235
По умолчанию

Thanks, забыл про help ))
Gauss вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Простой вопрос Д'якон Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 10.03.2008 16:51
Простой вопрос по INI xTANATOSx Общие вопросы Delphi 5 05.11.2007 18:10
Простой вопрос Таня84 БД в Delphi 4 03.03.2007 21:09
Простой вопрос Prowler БД в Delphi 3 26.01.2007 16:46