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
Seite 1 von 4  1 23     Letzte »    
Six

Registriert seit: 2. Jun 2005
42 Beiträge
 
#1

Sound ausgabe 40 mal in der Sekunde

  Alt 2. Jun 2005, 21:32
Hallo

Da dies mein erster Beitrag in diesem super Forum ist (bisher habe ich immer nur mitgelesen ) möchte ich erstmal Hallo sagen .

Hallo


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

Six
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#2

Re: Sound ausgabe 40 mal in der Sekunde

  Alt 3. Jun 2005, 08:04
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.
  Mit Zitat antworten Zitat
Benutzerbild von FAlter
FAlter

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

Re: Sound ausgabe 40 mal in der Sekunde

  Alt 3. Jun 2005, 08:35
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
Felix Alter
  Mit Zitat antworten Zitat
Six

Registriert seit: 2. Jun 2005
42 Beiträge
 
#4

Re: Sound ausgabe 40 mal in der Sekunde

  Alt 3. Jun 2005, 18:55
Erstmal danke für die Antworten

Zitat:
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.
Ja, genau so habe ich mir das eigentlich auch gedacht, aber da ich vorher nie mit sound gearbeitet habe, habe ich auch keinen Schimmer, wie ich das mit der Vorrausberechnung oder "Wärendessenberechnung" hinbekommen kann. Kannst du oder irgendjemand anderes mir da weiterhelfen?


Gruß

Six
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

Re: Sound ausgabe 40 mal in der Sekunde

  Alt 3. Jun 2005, 19:07
Mit Turbo Pascal kann man glab' ich über

Delphi-Quellcode:
Sound(Frequenz);
Delay(Dauer);
NoSound;
Sound aus dem integriertem Lautsprecher ausgeben.
Dann mit ner Schleife oder so arbeiten.

Wenns dir was bringt ...

Florian
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Six

Registriert seit: 2. Jun 2005
42 Beiträge
 
#6

Re: Sound ausgabe 40 mal in der Sekunde

  Alt 3. Jun 2005, 19:30
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
  Mit Zitat antworten Zitat
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
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Sound ausgabe 40 mal in der Sekunde

  Alt 4. Jun 2005, 12:33
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Six

Registriert seit: 2. Jun 2005
42 Beiträge
 
#9

Re: Sound ausgabe 40 mal in der Sekunde

  Alt 4. Jun 2005, 14:14
@ 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

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
  Mit Zitat antworten Zitat
Benutzerbild von FAlter
FAlter

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

Re: Sound ausgabe 40 mal in der Sekunde

  Alt 6. Jun 2005, 18:29
Zitat von Six:
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)?
Sorry, Null vergessen (100 kHz --> für 22,05 kHz setze Samplerate auf 22050 [Hz])

Zitat:
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?
Die Sound.dll ist eine DLL. die ich selber entwickle. Du brauchst sie nicht. Ich habe Teile des Beispielcodes oben aus ihr Kopiert /(Copy&Paste&Anpass). Leider hat der Wiederrgabecode der Sound.dll momentan einen Bug. Beim verlassen der Proc wird (wenn es nicht der erste Aufruf ist) eine EAccesViolation ausgelöst. Tatsächlich in dieser Zeile:

Delphi-Quellcode:
procedure ...(...); stdcall;
var
  ...
begin
  ...
end; // <-- HIER
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

Zitat:
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?
Setze die nicht hörbaren Bereiche auf Null (z. B. 11025 Samples lassen, 11025 Samples Null, dann wieder unverändert, ...)

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.
Felix Alter
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


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 23:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz