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 3 von 4     123 4      
Six

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

Re: Sound ausgabe 40 mal in der Sekunde

  Alt 22. Jun 2005, 19:53
Nein, ich bin KEIN Mutant

und du hast schon recht, wenn wir hier durcheinanderkommen, da ich in zwei verschiedenen Zusammenhängen von Frequenz spreche. Also nochmal zur Verdeutlichung: Der eigentliche Ton hat eine Frequenz von 22000Hz. Den kann und soll natürlich kein Mensch mehr hören, da er als Signal dient, um etwas anderes zu Steuern. Mit 40 Hz beispielsweise meine ich dann die Frequenz, mit der dieser 22000Hz Ton an- und ausgeschaltet wird. Die Samplerate (?) liegt bei 44100 Hz, sonst hört sich der 22000Hz Ton ja nicht an wie er soll, bzw. wird hörbar.

In meiner Anwendung, will ich nun diese An- und Ausschaltvorgänge vom Benutzer vorgeben und anschließend abmischen lassen. Dabei rauskommen soll dann eine Datei, mit einem gleichbleibenden Ton von 22000 Hz, der mit unterschiedlichen Frequenzen unterbrochen wird.

So, ich hoffe ich habe alle Klarheiten beseitigt


Six
  Mit Zitat antworten Zitat
Six

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

Re: Sound ausgabe 40 mal in der Sekunde

  Alt 24. Jun 2005, 12:42
Hi Falter,

Also so wie's aussieht komme ich jetzt klar und deshalb markiere ich den Post jetzt erstmal als gelöst. Nochmals vielen Dank, du hast mir die Augen geöffnet

Falls du Lust hast, könntest du ja mal ein Grundlagen Tutorial über die ganze Sache schreiben, leider ist da noch nicht viel in der Richtung verfügbar (eigentlich gar nichts?).

Eine Sache gibts aber dennoch, die ich noch nicht verstanden habe:

Delphi-Quellcode:
  DataLength := Size div 2;

  for I := 1 to DataLength do
Warum muss hier die DataLength durch zwei geteilt werden? Entspricht das einem Fade In über die ganze Länge des Sounds?

Hast du eigentlich vor den Source deiner Sound.dll zu veröffentlichen?


Six
  Mit Zitat antworten Zitat
Benutzerbild von FAlter
FAlter

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

Re: Sound ausgabe 40 mal in der Sekunde

  Alt 24. Jun 2005, 18:00
Hi,

Size entspricht der Größe in Bytes (!), die deine Sounddaten haben. Wenn du mit 16-Bit-Sounds arbeitest, ist eine Teilinformation zwei Bytes groß, das heißt die Gesamtzahl aller Teilinformationen ist die Hälfte der Anzahl der Bytes, da eine Teilinformation doppelt so groß ist (16 statt 8 Bits --> 2 statt 1 Byte).

Als Teilinformation verstehe ich hierbei einen Kanal innerhalb eines Samples.

Den Source gibts vorerst nicht.

Mfg
FAlter
Felix Alter
  Mit Zitat antworten Zitat
Six

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

Re: Sound ausgabe 40 mal in der Sekunde

  Alt 26. Jun 2005, 19:10
Hi Falter,

Sorry, aber ich brauche noch einmal deine Hilfe...

Ich möchte zwei gleich lange Monosounds zu einem Stereosound zusammenmischen. Dabei sollen die Monospuren jeweils dem Linken und rechten Soundkanal der erzeugten Stereodatei entsprechen. Dafür habe ich deinen Code folgendermaßen eingebaut:

Delphi-Quellcode:
Quelle1:=Data; // erster Monosound
Quelle2:=Data3; //zweiter Monosound
GetMem(ziel, 2*size);
for i := (Size div 2) - 2 downto 0 do //div 2 wegen 16 Bit = 2 Bytes
begin
ziel^ := quelle1^;
inc(Ziel);
ziel^ := quelle2^;
inc(Ziel); // <-- edit: ergänzt, fehlte
end;
SavePCMMemoryToFile(Ziel, 'C:\Result.wav', Format, Size); //Abspeichern
Leider bekomme ich bei der Verwendung dieses Codes eine nichtssagende Fehlermeldung und ich glaube auch nicht, dass ich damit zwei Monospuren zu einer Stereodatei zusammenfügen kann, richtig? Ich denke du dachtest, ich wollte zwei Mono- oder Stereosounds mischen. Wie kann ich also zwei Monosounds zu einem Stereosound zusammenmischen?

Und noch eine andere Sache ist mir aufgefallen, die ich nicht verstehe: diese Data2:=Data Geschichte... Was ist der Zweck des ganzen, warum kann man nicht einfach direkt mit Data arbeiten? Und dann wird nur noch mit data2 gearbeitet und am ende steht das Ergebnis dann doch wieder in data?! Habe ich da irgendwo eine zweite Zuweisung am Ende übersehen, oder wie geht das (Ich hoffe du verstehst, was ich meine ).

Dankeschön

Six
  Mit Zitat antworten Zitat
Benutzerbild von FAlter
FAlter

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

Re: Sound ausgabe 40 mal in der Sekunde

  Alt 26. Jun 2005, 19:30
Hi,

Zitat von Six:
Leider bekomme ich bei der Verwendung dieses Codes eine nichtssagende Fehlermeldung und ich glaube auch nicht, dass ich damit zwei Monospuren zu einer Stereodatei zusammenfügen kann, richtig? Ich denke du dachtest, ich wollte zwei Mono- oder Stereosounds mischen. Wie kann ich also zwei Monosounds zu einem Stereosound zusammenmischen?
Nein, eigentlich habe ich dich richtig verstanden, aber wie gesagt, das war ein ungetesteter, schnell ohne Delphi-IDE dahergetippter Beispielcode...

Wie genau geht denn die nichtssagende Fehlermeldung, evtl. Exception-Klasse, wo tritt er auf?

Zitat:
Und noch eine andere Sache ist mir aufgefallen, die ich nicht verstehe: diese Data2:=Data Geschichte... Was ist der Zweck des ganzen, warum kann man nicht einfach direkt mit Data arbeiten? Und dann wird nur noch mit data2 gearbeitet und am ende steht das Ergebnis dann doch wieder in data?! Habe ich da irgendwo eine zweite Zuweisung am Ende übersehen, oder wie geht das (Ich hoffe du verstehst, was ich meine ).
Der Zweck ist folgender:

Zitat von RAM:
Addr: Word
Addr+2: Word
Nehmen wir an, dein Pointer Data hat den Inhalt Addr. Bei der Verarbeitung weist du dem signed Word (in Delphi: Smallint) an dieser Stelle einen Wert zu (Data^ := xyz und setzt den Pointer an die nächste Stelle (inc(Data)), zwei Bytes weiter (Addr+2). Das ganze passiert sehr oft.

Nach der Verarbeitung benötigst du zur weiteren Verarbeitung oder zur Wiedergabe wieder den Anfangswert. Entweder du stellst den Wert durch Rechnugng wieder her (dec(Data, AnzahlDerElementeDieDerZeigerZurueckgesetztWerdenS oll)) oder du änderst ihn gar nicht, sondern nutzt zwischendurch einen "Hilfszeiger".

Das besondere ist eben die Arbeit mit Zeigern. Ein Zeiger speichert eine Adresse im RAM, er zeigt sozusagen auf diese Speicheradresse. Wenn du zwei Zeiger hast, die auf die gleiche Adresse zeigen, und den Wert, auf dem einer der beiden Zeiger zeigt, änderst, ändert sich der Wert an dieser Speicheradresse und somit auch der Wert an der Adresse, auf die der andere Zeiger zeigt.

Eine gute Einführung zu Zeigern gibt es hier:
http://www.dsdt.info/grundlagen/sprache/zeiger.php

Mfg
FAlter

PS: Ich habe 'ne neue Version der SOUND.dll herausgebracht. Ein großer Teil der AVs trewten jetzt nicht mehr aus.

//edit: Oh mann, es gibt ja wirklich 'nen User "RAM". Ich meine hier den Random Access Memory.
Angehängte Dateien
Dateityp: zip sound_427.zip (199,9 KB, 10x aufgerufen)
Felix Alter
  Mit Zitat antworten Zitat
Six

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

Re: Sound ausgabe 40 mal in der Sekunde

  Alt 26. Jun 2005, 19:38
Hi,

Zitat:
Wie genau geht denn die nichtssagende Fehlermeldung, evtl. Exception-Klasse, wo tritt er auf?
So wie ich das gesehen habe tritt er an der Stelle des Speicherns auf und die erzeugte Datei hat erstens nur eine Spur und ist zweitens leer

Wo wird denn mitgeteilt, wie die erzeugte datei Aussehen soll und das sie zwei Spuren hat?

Bist du dir sicher, dass es wirklich mit dem Code funktionieren sollte?


PS: Danke für den Link und die Datei!

Six
  Mit Zitat antworten Zitat
Benutzerbild von FAlter
FAlter

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

Re: Sound ausgabe 40 mal in der Sekunde

  Alt 26. Jun 2005, 19:41
Hi,

Sieht so aus, als ob du das WaveFormat vom MONO-Sound genommen hast. Bei Stereo musst du ein neues WaveFormat nehmen. Du solltest dieselben Daten nehmen bei meiner Funktion zum PCM-Wave-Format-Erstellen, außer, dass bei Channels nicht 1 sondern 2 steht.

Mfg
FAlter
Felix Alter
  Mit Zitat antworten Zitat
Six

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

Re: Sound ausgabe 40 mal in der Sekunde

  Alt 26. Jun 2005, 19:46
Hi,

Also muss ich "Ziel" irgendwie erst als Stereosound deklarieren? Aber wie?

Delphi-Quellcode:
  FormatStereo := PCMWaveFormat(2 {Stereo}, 16 {Bits}, 44100 {Hz Samplerate});
  Ziel := CreatePCMRectMemory(22000, 1000, @FormatStereo, @Size);
So gehts ja nicht, weil ich ja keine Sounddatei erzeugen möchte... was meinst du also?

Six
  Mit Zitat antworten Zitat
Benutzerbild von FAlter
FAlter

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

Re: Sound ausgabe 40 mal in der Sekunde

  Alt 26. Jun 2005, 19:50
Hi,

Dein Code:

Zitat von Six:
Delphi-Quellcode:
Quelle1:=Data; // erster Monosound
Quelle2:=Data3; //zweiter Monosound
GetMem(ziel, 2*size);
for i := (Size div 2) - 2 downto 0 do //div 2 wegen 16 Bit = 2 Bytes
begin
ziel^ := quelle1^;
inc(Ziel);
ziel^ := quelle2^;
inc(Ziel); // <-- edit: ergänzt, fehlte
end;
SavePCMMemoryToFile(Ziel, 'C:\Result.wav', Format, Size); //Abspeichern
Änderung:

Delphi-Quellcode:
Quelle1:=Data; // erster Monosound
Quelle2:=Data3; //zweiter Monosound
GetMem(ziel, 2*size);
for i := (Size div 2) - 2 downto 0 do //div 2 wegen 16 Bit = 2 Bytes
begin
ziel^ := quelle1^;
inc(Ziel);
ziel^ := quelle2^;
inc(Ziel); // <-- edit: ergänzt, fehlte
end;

//Änderung
FormatStereo := PCMWaveFormat(2 {Stereo}, 16 {Bits}, 44100 {Hz Samplerate});
//Änderung ende


SavePCMMemoryToFile(Ziel, 'C:\Result.wav', {Änderung}FormatStereo{Änderung Ende}, Size); //Abspeichern
Also nur ein anderes WaveFormat nehmen, den Stereosound hast du ja bereits als ein solcher erstellt.

Mfg
FAlter
Felix Alter
  Mit Zitat antworten Zitat
Six

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

Re: Sound ausgabe 40 mal in der Sekunde

  Alt 26. Jun 2005, 19:56
Ohhhh, ja, wie dumm von mir

Danke vielmals Falter

Six
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


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:27 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