FreeBasic
Вы хотите отреагировать на этот пост ? Создайте аккаунт всего в несколько кликов или войдите на форум.

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

Участников: 2

Перейти вниз

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

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

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

12val12

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

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

генерация звука Empty 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
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

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

Вернуться к началу

- Похожие темы

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