AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Sound ausgabe 40 mal in der Sekunde
Thema durchsuchen
Ansicht
Themen-Optionen

Sound ausgabe 40 mal in der Sekunde

Ein Thema von Six · begonnen am 2. Jun 2005 · letzter Beitrag vom 29. Jun 2005
Antwort Antwort
Benutzerbild von FAlter
FAlter

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

Re: Sound ausgabe 40 mal in der Sekunde

  Alt 4. Jun 2005, 11: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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz