Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.28;
Скачать: CL | DM;

Вниз

Можно ли в DELPHI создать генератор звука   Найти похожие ветки 

 
pupsik   (2003-11-25 15:39) [0]

Можно ли в DELPHI создать генератор звука с выводом его на колонки,через звуковую карту.
Просьба хотя бы ссылочку на образец кода!
Например частота-1000 гц, громкость (-10 дб) и т.п.
Спасибо.


 
S@shka ©   (2003-11-25 15:57) [1]

Можно :)
ПО факту ссылки на мыло отправлю исходники


 
Crocodile   (2003-11-25 17:09) [2]

For me to, if you please


 
Evgeny V ©   (2003-11-26 05:48) [3]

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <math.h>
#include <mmsystem.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HWAVEOUT sound_out_handle;
WAVEHDR   hdr[3];
WAVEFORMATEX wfx;
short int buff[3][4000];
bool st,ends;
void  CALLBACK modem_callback(DWORD hw, UINT uMsg, DWORD dwinstance, DWORD dwParam1, DWORD dwParam2);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
{
st=false;
ends=true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{

int i,j,l;
double k;
MMRESULT p;
       wfx.wFormatTag  = WAVE_FORMAT_PCM;
wfx.nChannels  = 1;
wfx.nSamplesPerSec = 8000;
wfx.wBitsPerSample = 16;
wfx.nBlockAlign  = 2;
       wfx.nAvgBytesPerSec = 8000*2;
wfx.cbSize   = 0;

p=waveOutOpen((LPHWAVEOUT)&sound_out_handle,WAVE_MAPPER,(LPWAVEFORMATEX)&wfx.wFormatTag,(DWORD)&modem_callback,0,CALLBAC K_FUNCTION);
// делаю три буфера по пол секунды, которые заполняю сигналом
for (i=0;i<3;i++)
{
 for (j=0;j<4000;j++)
 {
  k=sin(2.0*M_PI*(double)j*400.0/8000.0);// генерация синуса 400 Гц
  l=(int)(k*32767.0);// делаем максимум амплитуды
  buff[i][j]=(short int)l;
 }
  hdr[i].lpData = (char *)buff[i];
 hdr[i].dwFlags  = 0;
 hdr[i].dwUser   = i; // Save the identity
 hdr[i].dwBufferLength = 8000;// 4000 short int
 hdr[i].dwBytesRecorded = 0;
 hdr[i].dwLoops   = 0;
               waveOutPrepareHeader(sound_out_handle,&hdr[i],sizeof(WAVEHDR));
               waveOutWrite(sound_out_handle,&hdr[i],sizeof(WAVEHDR));
 }
st=true;
ends=false;
waveOutRestart(sound_out_handle);
Button1->Enabled=false;
}
//---------------------------------------------------------------------------

void  CALLBACK modem_callback(DWORD hw, UINT uMsg, DWORD dwinstance, DWORD dwParam1, DWORD dwParam2)
{
       //TODO: Add your source code here
       WAVEHDR *phdr;

phdr = (WAVEHDR *)dwParam1;

switch(uMsg)
{
 case WOM_OPEN:
  break;

 case WOM_DONE:// буфер проигран,
//можно поставить в очередь следующий, если надо
//заполнить новыми данными, в примере этого не делаю,
//просто возвращаю его в очередь

  if(phdr != NULL)
  {
   // Signal ready
                         waveOutUnprepareHeader (sound_out_handle, phdr, sizeof(WAVEHDR));
  }
                       if(st==false)// признак того что
//надо завершить проигрыш
                       {
                         ends=true;
                         break;
                        }
                        else
                        {
                         waveOutPrepareHeader(sound_out_handle,phdr,sizeof(WAVEHDR));
                         waveOutWrite(sound_out_handle,phdr,sizeof(WAVEHDR));// ставлю буфер опять
//в очередь
                         }
  break;

 default:
  break;
}

}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
st=false;
while (!ends)
Application->ProcessMessages();
Sleep(1500);// разрешаю закончить проигрыш текущих
//буферов, делал по другому, но лень, точнее работы много,
//для примера пойдет и так, на самом деле для
//последнего буфера в dwUser можно положить признак того,
// что он последний, и по этому признаку в WOM_DONE
//делать Reset и закрывать устройство, или слать PostMessage
waveOutReset(sound_out_handle);
waveOutClose(sound_out_handle);
Button1->Enabled=true;
}



Страницы: 1 вся ветка

Текущий архив: 2004.03.28;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.045 c
8-1069102281
Aleksey_
2003-11-17 23:51
2004.03.28
Мерцание рисунка


4-1073733697
FireMan_Alexey
2004-01-10 14:21
2004.03.28
Hooks


11-1057518741
nice
2003-07-06 23:12
2004.03.28
JPEG из ресурса


11-1051970585
Olgerd
2003-05-03 18:03
2004.03.28
Замена системных модулей для Delphi 3


1-1078922080
Demand2k
2004-03-10 15:34
2004.03.28
PopupMenu