eigener audio-mixer
-
hi folks!
bin am überlegen, ob ich mir nicht einen eigenen audio-mixer programmieren soll.
habe gemerkt dass es ohne mixer nicht geht, wenn man API-abstrahierte audio-ausgabe haben will.
natürlich gibt es den SDL_mixer, der auch ganz nett ist, aber ich will es etwas simpler haben, und features wie MP3-decoding sollten auch extern sein, daher.
ich stelle mir das eigentlich so vor, dass der mixer nur einen buffer bereitstellt, der dann von einem API-abhängigen callback übernommen wird.
grundlegendes: wie werden verschiedene audio-signale zusammengelegt? ich denke erstmal muss mann allen input in ein gleiches format bekommen, und dann einfach (abhängig von gewünschtem volumelevel) zusammenaddieren und durch anzahl der quellen teilen?
wenn ihr irgendwo gute tutorials kennt, bitte sagen. habe in google leider nichts gefunden.
-
Durch die Zahl der Quellen teilen ist jedensfalls schonmal Unsinn...
In einem der Game Programming Gems war das mal gut beschrieben. Aber mit ein wenig Mühe findet man auch im Netz was.
Bye, TGGC
-
Durch die Anzahl der Quellen teilen geht im Prinzip schon, vorausgesetzt, dass auf jedem verwendeten Kanal ein Signal anliegt.
Am besten ist, wenn die Lautstaerke der Signale vor dem Mischen auf volle Pulle steht; man kann das auch durch die Skalierung der Signale erreichen (indem man z.B. verwendete Samples vorbereitet, dabei kann man dann z.B. gleich noch einen Filter wie z.B. Spline-Interpolation anwenden, zur Glaettung der Wellenform nach der Umrechnung in das gewuenschte Format). So laesst sich leicht testen, ob ein Puffer sinnvolle Daten enthaelt. Und bei Stille in einem Puffer laesst Du den Puffer beim Mischen aussen vor.
So kann man durchaus mit Addieren und Teilen ein akzeptables Mischergebnis erreichen.
Aus Geschwindigkeitsgruenden lohnt es sich u.U., Mischroutinen etc. in Assembler zu schreiben. Ein Pentium 4 Prozessor kann z.B. mittels SSE 4 32-Bit Fliesskommawerte auf einmal berechnen, oder mittels MMX 4 16-Bit Ganzzahlen. Damit kann man selbst auf aelteren Maschinen 64 Kanaele oder mehr in Echtzeit mischen.
(Ausgeben geht leider nicht in Echtzeit, da je nach Ausgabemethode eine mehr oder weniger grosse Verzoegerung eintritt, durch die mehr oder weniger grossen Puffer, die man bei der Ausgabe verwenden muss)
(EDIT: uebrigens, nicht vergessen, dass man beim Addieren und Teilen von Ganzzahlen einen Wertebereich braucht, der doppelt so gross ist wie die Bitbreite der Kanaele, die man mischen will; also bei 16-Bit-Audiodaten als Ganzzahlen muss man 32-Bit-Ganzzahlen zum Mischen verwenden)
-
Warum dividieren?
Angenommen wir spielen einen Ton A mit einer gewissen Lautstärke ab.
Nun kommt noch ein zweiter Ton B dazu. Durch die Division wäre Ton A auf einmal viel leiser.
In der Praxis: Plötzlich würde eine Explosion fast verstummen, weil irgendwo fünf Vögelchen leise vor sich hin zwitschern.Power Off schrieb:
(EDIT: uebrigens, nicht vergessen, dass man beim Addieren und Teilen von Ganzzahlen einen Wertebereich braucht, der doppelt so gross ist wie die Bitbreite der Kanaele, die man mischen will; also bei 16-Bit-Audiodaten als Ganzzahlen muss man 32-Bit-Ganzzahlen zum Mischen verwenden)
Es sei denn Du machst die Division vor der Addition.
-
Power Off schrieb:
Durch die Anzahl der Quellen teilen geht im Prinzip schon, vorausgesetzt, dass auf jedem verwendeten Kanal ein Signal anliegt.
Nur weil man es kann, muss es nciht sinnvoll sein.
Power Off schrieb:
(EDIT: uebrigen, nicht vergessen, dass man beim Addieren und Teilen von Ganzzahlen einen Wertebereich braucht, der doppelt so gross ist wie die Bitbreite der Kanaele, die man mischen will; also bei 16-Bit-Audiodaten als Ganzzahlen muss man 32-Bit-Ganzzahlen zum Mischen verwenden)
17-Bit Ganzzahlen hätten doch auch den doppelten Wertebereich.
Bye, TGGC
-
TomasRiker schrieb:
Warum dividieren?
Angenommen wir spielen einen Ton A mit einer gewissen Lautstärke ab.
Nun kommt noch ein zweiter Ton B dazu. Durch die Division wäre Ton A auf einmal viel leiser.
In der Praxis: Plötzlich würde eine Explosion fast verstummen, weil irgendwo fünf Vögelchen leise vor sich hin zwitschern.Deswegen schrieb ich ja auch, dass es am besten ist, die Kanaele vor dem Mischen auf voller Lautstaerke zu haben.

Dann kann man zwar die Lautstaerke nur nach dem Mischen regeln, aber das muss nicht unbedingt ein Nachteil sein,
es haengt halt davon ab, was man machen will.Vor dem Addieren zu Dividieren hat den Nachteil, dass man etliche Bits verliert, die bei der Addition noch zum Tragen kommen koennten.
Dividiert man nach der Addition, sind die Effekte auch nicht so krass, wie von Dir beschrieben.
Selbst wenn die Samples nicht die gleiche Lautstaerke haben, faellt der Mischfehler kaum ins Gewicht, wenn man nicht genau hinhoert.Jedoch ist die Methode tatsaechlich nur begrenzt anwendbar.
-
TGGC schrieb:
17-Bit Ganzzahlen hätten doch auch den doppelten Wertebereich.
Stimmt, ich meinte eher "doppelte Bitanzahl".

-
Hier ist uebrigens noch ein Beispiel, wie das Mischen bei ScreamTracker 3 geloest wurde:
-
so, sorry das ich das topic hier nochmal pushe, aber ich bin endlich dazu gekommen etwas mit soundstreams rumzubasteln.
da mir 3d-audio noch zu komplex ist und ich es auch nicht für sooooo notwendig empfinde, will ich jetzt mit nem ausgabeformat von 44100 samples auf 2 kanälen mit 16 bits unsigned LSB pro sample arbeiten (ach ja, unsigned gefällt mir irgendwie besser, aber ist das standard, oder ist eher signed standard?).
das ding muss nicht ungeheuer aufpoliert sein, sondern sollte recht simpel sein, hauptsache es funktioniert.
die architektur soll natürlich auch filter zulassen, somit _kann_ da bei bedarf noch was gemacht werden.jetzt ein paar kleinere fragen: der einfachheit wegen werden keine formate mit mehr als 44100 hertz und/oder mehr als 16 bit pro sample unterstützt. aber welche mit niedrigerer frequenz und/oder bitrate sollen schon unterstützt werden, jedoch wahrscheinlich nur welche mit genormten frequenzen, also z.b. 22050 und 11025 hertz. das umrechnen denke ich mir so: bei 22050 -> 44100 werden die einzelnen samples einfach jeweils 2-mal genommen, bei 11050 -> 44100 einfach 4-mal. das _sollte_ doch dann exakt die selbe hörbare qualität haben, oder?
bei conversion von 8 bit zu 16 bit unsigned müsste ja einfach eine multiplikation mit 256 funktionieren, oder?ich denke mal das sollte so alles funktionieren.
nur die theorie des mischen der kanäle bereitet mir noch ein paar probleme....
die sache mit der explosion und dem vogelgezwitscher klingt einleuchtend, also teilen durch kanäle ist blödsinn.einfaches addieren dürfte nach kurzem nachdenken auch nicht gehen, da man da sehr schnell über das spektrum hinauskäme.
die sache mit dem hochskalieren aller kanäle vor dem mischen verstehe ich leider nicht wirklich.... zudem hatte ich gehofft, dass es auch einfacher ginge.
also, bin mal wieder für alle bestätigung, kritik und ideen offen und dankbar

gruß,
---loki
-
och büdde, habt ihr nicht wenigstens ein paar kleine antworten?