Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Brza svirka, loše zvuči

[es] :: Pascal / Delphi / Kylix :: Brza svirka, loše zvuči

[ Pregleda: 2257 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Milos D
Beograd

Član broj: 5621
Poruke: 280
*.ptt.yu.



+1 Profil

icon Brza svirka, loše zvuči05.07.2005. u 18:18 - pre 228 meseci
Zelim da PC svira tonove (frekvencije) na osnovu nekih podataka koji pristizu vremenom. Ima vise nacina da se to uradi, ali kod svakog je problem u "prelasku" sa jednog na drugi ton, naime ili dodje do kratkog prekida zvuka, ili do nekog "klik" zvuka izmedju dva tona tako da je "melodija" isprekidana. Probao sam MIDI ( http://www.alan-warriner.co.uk/ ), speaker (windows.beep) i ovo:

Code:

var
  msSound: TMemoryStream;

procedure MakeSound(Frequency{Hz}, Duration{mSec}: Integer; Volume: TVolumeLevel);
  {writes tone to memory and plays it}
var
  WaveFormatEx: TWaveFormatEx;
  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
  SampleRate: Integer = 44100;
  RiffId: string = 'RIFF';
  WaveId: string = 'WAVE';
  FmtId: string = 'fmt ';
  DataId: string = 'data';
begin
//    sndPlaySound (nil, 0);
  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;
  if msSound = nil
     then msSound := TMemoryStream.Create
     else msSound.Clear;
  with msSound 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 (nil, 0);
    sndPlaySound(msSound.Memory, SND_MEMORY or SND_ASYNC);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var i : integer;
begin
  for i := 0 to 100 do
      begin
        MakeSound (1000 + 100 * round (5*random), 150, 100);
        Application.ProcessMessages;
        sleep (150);
      end;
end;


Naravno, ne znam unapred koji ce biti sledeci zvuk, ni koliko ce trajati!
 
Odgovor na temu

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1403
82.208.201.*

ICQ: 246436949


+10 Profil

icon Re: Brza svirka, loše zvuči05.07.2005. u 18:29 - pre 228 meseci
Kako ne znas unapred koji ces zvuk trebati da pustas? Od cega ce to zavisiti?
 
Odgovor na temu

Milos D
Beograd

Član broj: 5621
Poruke: 280
*.ptt.yu.



+1 Profil

icon Re: Brza svirka, loše zvuči05.07.2005. u 20:36 - pre 228 meseci
Server salje podatke tj. ocitavanje jednog uredjaja (masena spektrometrija) klijentu. Ocitavanja imaju jedan "pretpostavljeni" nivo, i tada zvuk treba da ima "default" frekvenciju. Medjutim kada se ocitana vrednost poveca ili smanji u odnosu na ocekivanu, frekvencija zvuka treba da raste ili opada u skladu sa tim.
 
Odgovor na temu

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1403
82.208.201.*

ICQ: 246436949


+10 Profil

icon Re: Brza svirka, loše zvuči05.07.2005. u 21:07 - pre 228 meseci
Reci mi jos nesto... ti podaci ti stizu konstantno ili s vremena na vreme... moze da se uradi kao streaming (kad slusas muziku sa net radia ili slicno). Uzimas podatke o zvuku u jedan mali buffer od pola sekunde ili mozda manji (ne znam koliko ti je bitno da se zvuk promeni bas u trenutnku promene ulaznog podatka) i zatim taj buffer saljes na muzicku.

Treba da koristis sledece funkcije

waveOutOpen za pripremanje muzicke za pustanje zvuka
Napravices jednu funkciju tipa waveOutProc koja ce ti sluziti za komunikaciju sa muzickom.
waveOutPrepareHeader da pripremis podatke za slanje na muzicku
waveOutWrite da posaljes podatke na muzicku
waveOutUnprepareHeader da oslobodis bafer kad muzicka zavrsi s njim (obavestice te u funkciji koju si prosledio u waveOutOpen kad je zavrsila sa pustanjem baffera)
waveOutReset za zaustavljanje sviranja kad za to dodje vreme
waveOutClose za zatvaranje muzicke

Imas u Delphi-u lep help o svemu ovome.
U principu trebace ti 2 baffera... napunis oba podacima i posaljes ih muzickoj. Ona ce poceti i kad zavrsi prvi odmah uzimas nove podatke. Ti ces pre napuniti buffer podacima nego sto muzicka odsvira drugi buffer i ponovo ces poslati prvi koji ce se ovog puta nalaziti iza drugog. Drugi buffer ce se zavrsiti, napunices njega i ponovo ga poslati i tako dok ne odlucis da vise neces da pustas zvuk. Onda samo pozoves waveOutReset i muzicka ce ti reci da su svi bufferi odsvirani, oslobodis ih i gotovo.
Mozda zvuci malo komplikovano, ali nije... na ovaj nacin sam pravio player u Windows 3.1 koji je podrzavao plug-inove (cak 2... zamena stereo kanala i dodavanje suma).
 
Odgovor na temu

Milos D
Beograd

Član broj: 5621
Poruke: 280
*.ptt.yu.



+1 Profil

icon Re: Brza svirka, loše zvuči06.07.2005. u 11:32 - pre 228 meseci
Hvala, probacu tako. Pozeljno je da "rezolucija" zvuka bude sto bolja tj. da je kasnjenje minimalno. Iako je u pitanju server-client, u vecini slucajeva to ce biti localhost ili neka vrlo brza mrezna komunikacija.
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Brza svirka, loše zvuči

[ Pregleda: 2257 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.