![]() |
Re: Sound ausgabe 40 mal in der Sekunde
Nein, ich bin KEIN Mutant :wink:
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 :thumb: Six |
Re: Sound ausgabe 40 mal in der Sekunde
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 :spin: 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:
Warum muss hier die DataLength durch zwei geteilt werden? Entspricht das einem Fade In über die ganze Länge des Sounds?
DataLength := Size div 2;
for I := 1 to DataLength do Hast du eigentlich vor den Source deiner Sound.dll zu veröffentlichen? Six |
Re: Sound ausgabe 40 mal in der Sekunde
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 |
Re: Sound ausgabe 40 mal in der Sekunde
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:
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?
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 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 :wink: ). Dankeschön :thumb: Six |
Re: Sound ausgabe 40 mal in der Sekunde
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
Zitat:
Wie genau geht denn die nichtssagende Fehlermeldung, evtl. Exception-Klasse, wo tritt er auf? Zitat:
Zitat:
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: ![]() 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. |
Re: Sound ausgabe 40 mal in der Sekunde
Hi,
Zitat:
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 |
Re: Sound ausgabe 40 mal in der Sekunde
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 |
Re: Sound ausgabe 40 mal in der Sekunde
Hi,
Also muss ich "Ziel" irgendwie erst als Stereosound deklarieren? Aber wie?
Delphi-Quellcode:
So gehts ja nicht, weil ich ja keine Sounddatei erzeugen möchte... was meinst du also?
FormatStereo := PCMWaveFormat(2 {Stereo}, 16 {Bits}, 44100 {Hz Samplerate});
Ziel := CreatePCMRectMemory(22000, 1000, @FormatStereo, @Size); Six |
Re: Sound ausgabe 40 mal in der Sekunde
Hi,
Dein Code: Zitat:
Delphi-Quellcode:
Also nur ein anderes WaveFormat nehmen, den Stereosound hast du ja bereits als ein solcher erstellt.
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 Mfg FAlter |
Re: Sound ausgabe 40 mal in der Sekunde
Ohhhh, ja, wie dumm von mir :wall: :wall: :wall:
Danke vielmals Falter :thumb: Six |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:45 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