Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как вывести звук через звуковую карту

Delphi , ОС и Железо , Аудиокарта и Видеокарта



Автор: http://www.swissdelphicenter.ch

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;

Программа на Delphi, которая генерирует и воспроизводит звуковой сигнал с помощью библиотеки MMSystem. Процедура MakeSound принимает три параметра:

  • Frequency: частота тона в Гц
  • Duration: продолжительность тона в миллисекундах
  • Volume: уровень громкости тона, диапазон от 0 до 127

Рассмотрим шаг за шагом, как работает программа:

  1. Программа проверяет, является ли частота слишком низкой для частоты дискретизации (11025 Гц), и если это так, то она выходит из программы.
  2. Создается структура TWaveFormatEx с необходимыми полями:
    • wFormatTag: WAVE_FORMAT_PCM
    • nChannels: Моноканальный (1 канал)
    • nSamplesPerSec: Частота дискретизации (11025 Гц)
    • wBitsPerSample: 8 бит на пробел
    • nBlockAlign: Блокировка алгоритма (1 байт на пробел)
    • nAvgBytesPerSec: Средняя количество байтов в секунде (11025 * 1 = 11025 байт/с)
    • cbSize: Размер дополнительных данных формата (0 байт)
  3. Создается объект TMemoryStream для хранения звуковых данных.
  4. Программа рассчитывает длину звуковых и файловых данных:
    • DataCount: количество пробелов в звуковых данных (продолжительность * частота дискретизации / 1000)
    • RiffCount: размер заголовка файла WAV (включая RIFF, WAVE, fmt и данные)
  5. Программа записывает заголовок файла WAV:
    • RIFF chunk: 4 байта
    • RiffCount chunk: 4 байта
    • WAVE chunk: 4 байта
    • fmt chunk: 4 байта (структура TWaveFormatEx)
    • data chunk: 4 байта
  6. Программа рассчитывает и записывает звуковой сигнал:
    • Используется формула wt = w * i / SampleRate для расчета пробелов
    • Каждый пробел записывается как байт в память
  7. Наконец, программа воспроизводит звук с помощью sndPlaySound с флагами SND_MEMORY и SND_SYNC.

Чтобы вызвать функцию, создайте кнопку на вашем формате и присвойте ее процедуре Button1Click:

procedure TForm1.Button1Click(Sender: TObject);
begin
  MakeSound(1200, 1000, 60); // воспроизводит тон на 1200 Гц в течение 1 секунды с уровнем громкости 60
end;

Это будет воспроизводить тон на 1200 Гц в течение 1 секунды с уровнем громкости 60. Вы можете изменять параметры для изменения частоты, продолжительности и уровня громкости тона.

В статье описывается программный код на Delphi, который позволяет выводить звук через звуковую карту с помощью функции MakeSound, которая генерирует тон и играет его через звуковой драйвер.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Аудиокарта и Видеокарта ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-28 06:49:57/0.0034668445587158/0