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).