Einzelnen Beitrag anzeigen

Benutzerbild von FAlter
FAlter

Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.096 Beiträge
 
FreePascal / Lazarus
 
#7

Re: Sound ausgabe 40 mal in der Sekunde

  Alt 4. Jun 2005, 12:29
Tutorial kenn ich nicht, habs aber schonmal probiert. Ist eigentlich nicht schwer. Hier mal die Vorausberechnung eines Sinustones:

Delphi-Quellcode:
uses
  MMSystem;

var
  Format: TWaveFormatEx;
  Size: Longint;
  Data: PSmallInt; //für 8 Bit PByte verwenden


Um TWaveFormatEx mit gültigen Daten für ein PCM-Format (Pulse Code Modulation) zu füllen, habe ich mir das geschrieben (auch Bestandteil meiner Sound.dll)

Delphi-Quellcode:
{ Gültig sind: bei Bitrate = 8 ein oder zwei Channels,
bei 16 Bit ein, zwei oder vier Channels,
Sampleraten zwischen 100 Hz (nicht empfohlen!) und 10 kHz (= 10000 Hz)). Sampleraten in Hz angeben. }


function WavePCMFormat(const Channels, Bitrate: Word; const Samplerate: DWord): TWaveFormatEx;
begin
  with Result do
  begin
    nChannels := Channels;
    wFormatTag := WAVE_FORMAT_PCM;
    nSamplesPerSec := Samplerate;
    wBitsPerSample := Bitrate;
    nBlockAlign := nChannels * WBitsPerSample div 8;
    nAvgBytesPerSec := nSamplesPerSec * nBlockAlign;
    cbSize := 0;
  end;
end;
Dann setzt du Size auf einen bestimmten Wert:

Size := Round(Sekunden * nAvgBytesPerSec); Wobei Sekunden irgendeine Zahl ist (z. B. Double). Wenn du nur mit ganzen Sekunden arbeitest (Integer), kannst du das Round weglassen.

Dann musst du den Speicher reservieren:

GetMem(Data, Size); Um nun die Sinuskurve zu erstellen, brauchst du eine Zählschleife:

Delphi-Quellcode:
//für 8 Bit abwandeln!!
    X := Data; //X ist auch ain PSmallInt!
    for I := (Size div 2) - 1 downto 0 do
    begin
      X^ := Round(Sin(Y * Freq * Pi * 4 / Format.nAvgBytesPerSec) * 32767);
      inc(X);
    end;
Freq ist hierbei die gewünschte Frequent (z. B. 440 Hz fpr dier Note a'), es kann Douible oder Extended sein.

Zur Wiedergabe kannst du dann z. B. DirectSound verwenden. Da musst du meist Format oder @Format, Size und Data übergeben.

Für den Anfang ist DelphiX sehr einfacvh, wenn es auch veraltet ist und nicht mehr weiterentwickelt wird, aber bei DirectSound hat sich seitdem noch nicht viel geändert (im Gegensatz zu Direct3D).
Felix Alter
  Mit Zitat antworten Zitat