TDXSound. AudioStream, стерео эффекты

Материал из DRKB


TDXSound. AudioStream, стерео эффекты.

Основные принципы[править | править код]

С помощью TDXSound вы можете создавать звуковые эффекты в вашей программе.

Все что Вам понадобится это поставить на форму 2 компонента: DXSound и DXWaveList. Последний является "коллекцией wav файлов". В который вы будете заносить wav файлы. Установите DxWaveList1.DXSound := DXSound1. В этот DXSound будет воспроизводиться звук.

Чтобы проиграть звук вам надо в DxWaveList1 добавить какой нибудь wav файл. После чего вызвать dxWaveList1.Items[0].Play(False); Будет проигран звук, который находится в списке нулевым. Можно и так: dxWaveList1.Items.Find('somewave1').Play(False);

Добавление дополнительных эффектов:

Добавить можно следующие эффекты: изменение frequensy, pan, volume.

Pan - ориентация звука (левый правый канал).

dxWaveList1.Items.Find('somewave1').Pan := 0; // Центр.
dxWaveList1.Items.Find('somewave1').Pan := -10000; // Максимально слева.
dxWaveList1.Items.Find('somewave1').Pan := 10000; // Максимально справа.

После чего вызвать dxWaveList1.Items.Find('somewave1').Play(False);

Frequency - частота звука.

Назначается это значение так: dxWaveList1.Items.Find('somewave1').Frequency. Минимальное значение 4410, а максимальное 44100.

Volume - громкость звука.

Назначается это значение так: dxWaveList1.Items.Find('somewave1').Volume. Минимальное значение -10000, а максимальное 0.

Looped.

У звука есть еще параметр .Looped: Boolean который означает будет ли звук проигрываться "по кругу". Что бы остановить такое проигрывание используйте .Looped := False;

Загрузка wav файлов[править | править код]

Загружать звуки в программу можно непосредственно через dxWaveList1 (просто вручную добавить файлы и все).

А можно через отдельные *.dxw файлы - это контейнеры wav'ов. Создавать которые можно специальными программами. dxWaveList1.Items.LoadFromFile('sounds.dxw'); Это полезно для того чтобы ехе файл занимал меньше размера.

Загрузка wav файлов в "realtime"[править | править код]

Ниже указанная процедура загружает wav, и автоматически добавляет в Dxwavelist1:

procedure LoadSound (FileName, SoundName: string);
begin
  dxwavelist1.Items.Add;
  with dxWaveList1.Items[dxWaveList1.Items.Count-1] do
  begin;
    Wave.LoadFromFile(FileName);
    Name := SoundName;
    restore;
  end;
end;


NOTE
не забудьте поставить with Form1 do. или declarations. Вызывайте эту процедуру до dxsound1.initialize;

Если после, то выполните код:

dxsound1.Finalize;
dxsound1.Initialize;


Загрузка всех wav файлов из директории[править | править код]

Собственно использование FindFirst. не более того:

var
  sr: TSearchRec;
begin
  ChDir('sounds'); // директория в которой звуки лежат
  if FindFirst('*.wav', faAnyFile, sr) = 0 then
  begin
    LoadSound(sr.name, sr.name); // имя звука будет идентично имени файла.
    while FindNext(sr)=0 do
      LoadSound(sr.name, sr.name); // заметьте что в имени звука учитывается регистр
  end;
end;


Использование AudioStream[править | править код]

var
  Audio: TAudioFileStream;
  WaveFormat: TWaveFormatEx;
begin
  Audio := TAudioFileStream.Create(DXSound1.DSound);
  Audio.AutoUpdate := True;
  Audio.BufferLength := 1000;
  Audio.FileName := 'somefile.wav';
  Audio.Looped := False;
  MakePCMWaveFormatEx(WaveFormat, 44100, Audio.Format.wBitsPerSample, 2);
  DXSound1.Primary.SetFormat(WaveFormat);
  Audio.Play;
end;


NOTE
Вам надо в uses занести MMSystem, Wave; Я заметил что этот метод пожирает память (проверял по тестам).

И на последок классная процедура автоматического расчета звука по каналам: Эта процедура автоматически расчитывает стерео для разрешения экрана 640х480. Вызывается так:

PlaySound('somesound1', 320); // центр.
PlaySound('somesound1', 0); // слева. etc.


const
  OPT_SOUND: boolean = True ; // наличие звук
  OPT_STEREO: boolean = True ; // стерео
  OPT_CHANNELAPPROACH: Word = 10 ; // степень смешения каналов
  OPT_REVERSESTEREO: Boolean = False ; // реверсировать стерео
  OPT_VOLUME: Integer = 0 ; // громкость (-10000 | 0).

procedure PlaySound(SoundName: ShortString; x: Word);
var
  PanFactor, PanValue: Double;
begin
  if OPT_SOUND = False then exit;
  if OPT_STEREO = True then
  begin
    PanFactor := 31.25; // 10000 is the panning range
    PanValue := ((X * PanFactor)-10000) / OPT_CHANNELAPPROACH;
    if OPT_REVERSESTEREO then PanValue := -panvalue;
  end
  else
    PanValue := 0;
  try
    WaveLst.Items.Find(soundname).Pan := Round(PanValue);
    WaveLst.Items.Find(soundname).Play(False);
    WaveLst.Items.Find(soundame).Volume := OPT_VOLUME;
  except
    ShowMessage('Error playing sound "'+soundname+'"');
  end;
end;


Author: 3d[Power]
Source: http://www.mirgames.ru
ID: 03623