![]() |
Sound ausgabe 40 mal in der Sekunde
Hallo :wink:
Da dies mein erster Beitrag in diesem super Forum ist (bisher habe ich immer nur mitgelesen :cyclops: ) möchte ich erstmal Hallo sagen :thumb: . Hallo :hi: So und nun zu meinem Problem: Also, ich möchte ein Programm schreiben, das im wesentlichen Sounds ausgibt (auf meinen Befehl). Bis hierhin nicht weiter schwierig, aber: Der abgespielte Sound soll 40 mal in der Sekunde ab und angeschaltet werden können und das ist in der Tat nicht so einfach, da selbst präzisere Timer Probleme zu haben scheinen. Ich glaube aber, das dass Problem nicht an den Timern selber liegt, sondern vielmehr an der Verarbeitung des Sounds. Damit meine ich, dass die Zeitspanne des Ladens und Stoppens des Sounds zu lange dauert. Ich habs mit wav dateien probiert aber keinen Erfolg gehabt. Dann bin ich auf die Komponente ToneGen gestoßen, damit ging es etwas besser, aber zufriedenstellend war das auch nicht. Der Sound lässt sich schätzungsweise 15-20 mal zuverlässig in der Sekunde Triggern. Das Programm soll am Ende den erzeugten Sound einfach als wav datei abspeichern. Ich möchte über eine bestimmte Zeitspanne die Hz Rate durch knopfdruck wechseln lassen. Das soll möglichst dynamisch sein. Die Rate möchte ich zum beispiel in 3 Sekunden um 10 Herz linear erhöhen oder von 30 auf 40 Herz setzten etc. . Das wird dann in Echtzeit aufgezeichnet. Der Sound an sich besteht dabei nur aus einer einfachen Sinuskurve, die sich eben zum Beispiel mit Tonegen erzeugen lässt. Habt ihr Ideen, wie ich das mit dem an - aus Problem lösen könnte ? Danke :-D Six |
Re: Sound ausgabe 40 mal in der Sekunde
Herzlich willkommen bei der Delphi-Praxis.
Ich glaube nicht das du auf diesem weg wirklich weiterkommst. Wie waere es denn einen WAV Sound mit den Aenderungen vorzuberechnen und einfach abzuspielen? Das sollte moeglich sein, allerdings sit das Soundverarbeitung von dem ich keine Ahnung habe. |
Re: Sound ausgabe 40 mal in der Sekunde
Hi,
Mit play-stop-play-stop wirst du wenig Erfolg haben. Entweder du berechnest den ganzen Sound vorab und gibst ihn da wieder (einfacher zu Coden) oder du berechnest den Anfang (ein paar Sekunden), startest die Wiedergabe und berechnest währenddessen den Rest. Wenn du das Ergebnis dann berechnet hast, kannst du es dann auch als WAV speichern. Mfg FAlter |
Re: Sound ausgabe 40 mal in der Sekunde
Erstmal danke für die Antworten :thumb:
Zitat:
Gruß Six |
Re: Sound ausgabe 40 mal in der Sekunde
Mit Turbo Pascal kann man glab' ich über
Delphi-Quellcode:
Sound aus dem integriertem Lautsprecher ausgeben.
Sound(Frequenz);
Delay(Dauer); NoSound; Dann mit ner Schleife oder so arbeiten. Wenns dir was bringt ... :wink: Florian |
Re: Sound ausgabe 40 mal in der Sekunde
Hi Florian,
danke für den Tipp, aber leider bringt mir das nicht viel, da ich eine bestimmte Sinuskurve über die Standardlautsprecher ausgeben und vor allem auch aufzeichnen möchte. Wahrscheinlich wäre auch diese Funktion zu langsam. Das Problem ist die Vorrausberechnung. Kennt da irgendjemand ein Tutorial zu oder ähnliches? Irgend etwas über fortgeschrittene Soundbearbeitung in Delphi... Audiacity ist ja leider in C++ verfasst und sich da einzuarbeiten ist für diesen Zweck leider auch ein bischen zu aufwendig... Aber wenn es sowas wie Audiacity in Delphi als open Source geben würde (kann ja auch viel einfacher sein), wäre mir schon sehr geholfen. Ich habe nur leider nichts in der Art gefunden. Six |
Re: Sound ausgabe 40 mal in der Sekunde
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:
Dann setzt du Size auf einen bestimmten Wert:
{ 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;
Delphi-Quellcode:
Wobei Sekunden irgendeine Zahl ist (z. B. Double). Wenn du nur mit ganzen Sekunden arbeitest (Integer), kannst du das Round weglassen.
Size := Round(Sekunden * nAvgBytesPerSec);
Dann musst du den Speicher reservieren:
Delphi-Quellcode:
Um nun die Sinuskurve zu erstellen, brauchst du eine Zählschleife:
GetMem(Data, Size);
Delphi-Quellcode:
Freq ist hierbei die gewünschte Frequent (z. B. 440 Hz fpr dier Note a'), es kann Douible oder Extended sein.
//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; 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). |
Re: Sound ausgabe 40 mal in der Sekunde
also dein Vorhaben wird mit aller wahrscheinlichkeit scheitern. Professionelle Programme welche einen extra Treiber mitbringen der im Kernelbereich arbeitet oder Programme die im RealTimeModus arbeiten kommen in aller Regel bei der Latenz nicht unter 2 ms. Wenn du den DirectSound-Treiber von Windows verwendest so liegt die Latenz irgendwo um die 100 ms.
|
Re: Sound ausgabe 40 mal in der Sekunde
@ SirThornberry:
Ja, ich denke mittlerweile auch, dass es in Echtzeit scheitern wird, daher bin ich ja auch an der Möglichkeit interessiert, die Falter mir gerade versucht zu erklären. @ Falter: Danke für die Antwort. Ich muss nur leider zugeben, dass ich von dem ganzen Sound zeugs wie gesagt, leider keine Ahnung habe und hier im Moment nur Bahnhof verstehe :stupid: Aber vielleicht steige ich da ja irgendwie durch. Du schreibst, dass Sampleraten (ich nehme an, das ist die höhe des Tons) zwischen 100Hz und 10Khz möglich sind. Ich bräuchte aber um die 22Khz, ist das irgendwie zu bewerkstelligen (liegt nicht mehr im höhrbaren Bereich und soll auch nicht höhrbar sein)? Was ist diese Sound Dll von der du sprichst, brauche ich die um den Code auszuführen? Brauche ich DelphiX um den Code auszuführen? Kann man die Sinuskurve nicht irgendwie so berechnen, das einmal ein Ton hörbar ist und dann wider für eine bestimmte zeit nicht, dann kommt wieder ein Ton etc.? So wie auf den Herzfrequenzmessern im Krankenhaus? Sorry, dass hört sich jetzt alles ziemlich dämlich an, aber es ist mein erstes Projekt in der Richtung und leider fehlen mir da auch einfachste Grundlagen. Wie hast du dir dein Wissen angeeigenet? Gruß Six |
Re: Sound ausgabe 40 mal in der Sekunde
Zitat:
Zitat:
Delphi-Quellcode:
Ansonsteh hätte ich sie dir empfohlen... Aber erst muss die Exception weg, da sonst das gesamte Programm (das die DLL geladen hat), beendet wird :(
procedure ...(...); stdcall;
var ... begin ... end; // <-- HIER Zitat:
Vielleicht wäre es praktisch, wenn du verstehst, wie Audiodaten im PCM-Format aufgebaut sind... Nehmen wir an, du hast zwei digitale Spannungsmesser an eine Audioquella engeschlossen und misst jetzt in jeder Seklunde 22050 mal die Spannung, ein Spannungsmessetr rechts und einen links. Die Spannungsmesser bringen 16-Bit-Werte zwischen -3,2768 V* und 3,2768 V*. Du multiplizierst sie mit 10000 und speicherst sie nacheinander ab, erst links, dann rechts, dann den nächsten Messwert... Damit hast du dein Geräusch als PCM-Rohdaten. Zur Wiedergabe wird an den Soundkartenausgang mit den gleicghen Zeitabständen wie bei der Aufnahme die vorher gemessene und dann gespeicherte Spannung angelegt. Mit einem Leistungs-Verstärker in deiner aktiven Lautsprecherbox kannst du die Lautsprecher mit hohen Leistungen ansteuern und somit ganz laut Musik oder andere Klänge wiedergeben. Jetzt fällt der Schritt der Aufnahme weg, du erzeugst selbst den Ton, mit Zuhilfenahme der Sinusfunktion. PS: Ich kann hier für Richtigkeiten keine Gewähr geben. Ich habe das Prinzip, Töne in den Speicher zu schreiben, durch eigebnes Ausprobieren entdeckt, ohne irgendwo zu lesen. Bei mkir hat es zumindest funktioniert. ________ *) Es wird i. d. R. mit Spannungen unter 1 V gearbeitet (775 mV wäre Standard, wird aber meist nicht ganz eingehalten), das hier war nur zur einfacheren Veranschaulichung. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:59 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