генерация звука

Предыдущая тема Следующая тема Перейти вниз

генерация звука

Сообщение  12val12 в Пт Апр 16, 2010 1:11 pm

покажите на примере как выдать на звуковую карту (не на PC спикер)
синусоиду например 2400гЦ

12val12

Сообщения : 14
Дата регистрации : 2009-09-23

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: генерация звука

Сообщение  electrik в Пт Апр 16, 2010 11:34 pm

вот пример. только звук выводится на низком уровне, можно как-то и через playsound, но я делаю так.
как это можно сделать подругому, можно почитать книжку:
http://frolov-lib.ru/books/bsp/v15/index.html

Код:

' генерирует одну секунду синус звука с частотой 2400 герц
#include "Windows.bi"
#include "win/mmsystem.bi"

#define WAVE_MAPPER -1
#define amplitude 10000 ' амплитуда (громкость)
#define SamplesPerSec 44100 ' частота дискретизации
#define Freq 2400 ' частота звука
Const PI As Double = 3.1415926535897932 ' константа pi

dim hOut as hWaveOut 'тут будет лежать идентификатор устройства
dim wFormat as WaveFormatEx 'тип(описатель) wave формата
dim wHdr as wavehdr 'описатель заголовка буфера
dim buf(44100) as short 'буфер для звуковых данных
dim i as integer

' генерируем синус и пишем его в буфер
for i = 1 to 44100
buf(I) = amplitude * Sin(2 * pi * i * freq / samplesPerSec)
next

'подготовим заголовок для буфера

'описатель заголовка буфера
wHdr.lpData = @buf(0) 'указатель на буфер со звуковыми данными
wHdr.dwBufferLength = 44100*2 'длина буфера в байтах

'описатель заголовка формата wave
wFormat.wFormatTag=1 ' wave pcm
wFormat.nChannels= 1 ' моно
wFormat.nSamplesPerSec = 44100 ' частота дискретизации
wFormat.nAvgBytesPerSec = 44100*2 ' частота выдачи байт
wFormat.nBlockAlign= 2 ' выравнивание
wFormat.wBitsPerSample = 16 ' число бит

'откроем звуковое устройство. первый параметр функции waveOutOpen- это указатель
'на переменную hOut, и если с устройством нет проблем,
'то в переменную запишется идентификатор открытого устройства
'второй параметр, номер устройства. обычно туда пишут WAVE_MAPPER,
'для автоматического определения звуковухи по умолчанию.
'третий параметр, указатель на описатель заголовка wave формата.
if waveOutOpen(@hOut,WAVE_MAPPER,@wFormat,0,0,0) then
messagebox(0,"Устройство не поддерживает данный Wave формат, или проблема открытия устройства","ошибка waveOut",0)
end
end if

'подготовим заголовок
'первый параметр, идентификатор устройства.
'второй параметр, указатель на заголовок для буфера.
'третий параметр, длина заголовка
if waveOutPrepareHeader(hOut,@wHdr,32) then
messagebox(0,"Не могу создать заголовок","Ошибка подготовки заголовка",0)
end
end if

'подаем драйверу всё подготовленное хозяйство.
'первый параметр, идентификатор устройства.
'второй параметр, указатель на заголовок для буфера.
'третий параметр, длина заголовка
WaveOutWrite(hOut,@wHdr,32)
sleep
WaveOutReset(hOut) 'збросим устройство, звук сразу заткнётся

'закроем заголовок
'первый параметр, идентификатор устройства.
'второй параметр, указатель на заголовок для буфера.
'третий параметр, длина заголовка
WaveOutUnprepareHeader(hOut,@whdr, 32)
WaveOutClose(hOut) 'закроем устройство 

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения