Wie die Überschrift schon sagt, habe ich vor einen Audiokompressor zu basteln. Für alle die nicht wissen, was das ist:
Das ist so, wie wenn ein Männchen in deinem PC hockt und jedesmal, wenn der Soundpegel einen bestimmten Wert erreicht , den Lautstärkenregler ein bisschen nach unter zieht und nach kurzer Zeit wieder auf normal zurückstellt. Also praktisch ein Programm, das zu laute Sounds "abschwächt".
Nachdem ich mir die Finger wund gegoogelt habe und dieser Beitrag mir auch nicht weiter geholfen hat (VuMeter), muss ich halt euch fragen!
Ich brauche eigtl nur eine Möglichkeit das Soundausgangslevel meiner Soundkarte auszulesen. Praktisch ein VUMeter für die Soundkarte. Bass.dll nützt mir in diesem Fall wahrscheinlich nichts, da ich keinen Player baue, sondern den Systemsound brauche!
Such mal nach ACS (Audio Component Suit), da gibt es die Komponente TAudioIn, eine ältere Version der Komponente wird glaub ich auch beim VUMeter verwendet.
Die Bass.dll kannst du auch verwenden, In dem du mit der Bass.dll einfach den Audio aufnimmst. Bei aufnehmen wird eine Callback Methode aufgerufen, in dieser Methode speicherst du die Werte nicht in einer Datei sondern benutzt sie für dein Programm.
Zur ACS: Das ist glaub ich ein sf.net Projekt, aber leider nicht (mehr) sonderlich aktuell.
Auf jeden Fall wäre es schön wenn du deine erkenntnisse uns hier Mitteilst, so etwas in der Richtig will ich auch noch machen, bin da bisher aber noch nicht zu gekommen.
mfg, Björn
Björn >> http://bsnx.net <<
Virtual DP Stammtisch v1.0"iw" am 19.09.2007 - ich war dabei!
Ähm, ich glaub du möchtest eher einen Limiter programmieren?
Limiter und Kompressor sind aus SW-Sicht das Gleiche: Bei beiden wird ein Wert X transformiert, Du hast also eine Limiter/Kompressorfunktion f(X).
Im Einfachsten Fall (wenn die Funktion nichts machen soll), dann wäre das einfach f(X) = X. Bei einem Limiterwürde man z.B
f(X) = If X<90 then X else If X<110 then 90+(X-90)/2 else X:=100
implementieren. Wenn 0<=X<=110 ist, dann wird ab einer Lautstärke von 90 gedrosselt, und lauter als 100 wird das Ganze nicht, Man kann sich aber auch eine komplexe Funktion (z.B. durch ein Spline definiert) vorstellen, die leise Passagen verstärkt und laute eben etwas abschwächt... Das Ganze kann man noch auf die Spitze treiben, in dem eine FFT vorgeschaltet wird und so eine Manipulation auch noch abhängig von der Frequenz ist: Bässe anheben, Mitten runter etc...
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!" (Monty Python "Joke Warefare")
Man kann sich aber auch eine komplexe Funktion (z.B. durch ein Spline definiert) vorstellen, die leise Passagen verstärkt und laute eben etwas abschwächt...
Genau das macht ein Kompressor... Die regelbaren Werte am Kompressor sind ja Threshold, Attack, Release, Ratio und Output.
Wenn nur ab einem bestimmten Pegel runtergeregelt werden soll, dann ist ne Limiterfunktion, die dann auch eine Ratio von unendlich:1 hat
Interessant wäre wirklich, das ganze als Multibandausführung, damit die Bässe, Mitten und Höhen getrennt bearbeitet werden. Standard-Kompressoren/Limiter in der Summe klingen furchtbar...
Also, ich war jetzt eine Woche im Urlaub, aber da hat sich hier ja schon einiges getan! Respekt und Danke an alle!
Zum ersten zu eurer Frage ob es nun ein Limiter, Kompressor oder Normalizer sein soll! Ich glaube ich erklärs euch mal kurz was was ist, da ich mich da ganz gut auskenne.
Um das zu verdeutlichen habe ich eine kleine Zeichnung gemacht, welche das meiner Meinung ganz gut darstellt. Die verschiedenen Arten sind mit unterschiedlichen Fargen markiert. Die grüne Linie zeigt den normalen Verlauf, ohne irgendein Eingreifen.
Limiter und Kompressor schalten sich ab einem bestimmten Pegel ein, der sogenannte "Threshold". Ab diesem Wert greifen sie ein. Weiter gibt es noch die Variablen Attack und Release, welche bezeichnen, wie schnell das Programm anspringt bzw. wie schnell es wieder zu seinem Ursprungswert zurückkehrt.
1. Limiter
Der Limiter begrenzt ab dem Thresholdwert alles auf diese Lautstärke. Das heißt, dass kein Signal lauter als der Thresholdwert den Limiter verlässt. Limiter sind dazu da um zum Beispiel Geräte vor Übersteuerung zu schützen. Endstufen haben zum Beispiel meistens einen Limiter integriert um die Bauteile vor Schaden zu schützen. Auf dem Bild wäre das der rote Strich.
2. Kompressor
Beste Erklärung, die ich dafür gehört habe: Ein Kompressor ist die technische Form von einem Tontechniker, der vor seinem Mischpult sitzt und den Fader bei zu lauten Stellen um ein Stück nach unter zieht um ihn danach wieder zurückzuschieben. Dabei gibt es die sogenannte "Ratio". Diese besagt, in welchem Verhältnis der Soundpegel ab dem Thresholdwert abgeregelt wird. In dem Bild ist der blaue Strich ein Beispiel für einen Kompressor mit dem Verhältnis 1:2.
Ein weiterer Wert, welcher bisschen unwichtiger ist, ist der sogenannte "Knee". Dieser gibt an, ob der Kompressor sofort anfängt zu arbeiten, oder ob er die Regelung sanfter, in einer Kurve, machen soll (!Vorsicht! nicht mit Attack verwechseln; auf dem Bild die gelbe Linie).
3. Normalizer
Dieses Gerät ist ziemlich schnell beschrieben. Es hebt leise Passagen an und schwächt laute ab. Am Schluss hat also alles die gleiche Lautstärke, was meiner bescheidenen Meinung nach weniger Sinn der Sache ist!
Gut, soviel zu Kompressor etc ^^ Hoffe es war nicht zu lange.
Jetzt zu meinem Programm:
Ich hab mich schonmal hingehockt und ein paar Sachen ausprobiert.
Um den Audioausgang zu kontrollieren habe ich indirekt die Bass.dll benutzt. Ich habe im Netz ein Programm von Michael Gaedtke namens Record-Demo gefunden, welches den Ausgangspegel angibt. Sehr schön gestaltet mit Combobox zum Auswählen der Quelle etc. (Auch im Anhang).
Dieses hab ich schlicht und ergreifend umgebaut und einen Normalizer integriert, was nicht weiter schwer war. Aber es gibt trotzdem noch ein Problem: Mit diesen Pegeln ist es nicht möglich einen richtigen Kompressor zu basteln, weil diese "nur" das Signal ist, welches von der Soundkarte zurückgeschickt wird. Also sobald ich das Signal auf meinem Monitor sehe ist es schon zu spät, weil es zu diesem Zeitpunkt schon auf den Boxen ist. Und das ist nicht der Sinn der Sache, weil wirklich laute Signal nicht "erwischt" werden sondern nur ihre "Nachfolger".
Ich hab mir auch schon überlegt, ob ich den Kompressor auf Frequenzen bezogen arbeiten lassen soll. Selbstverständlich ist das eine gute Idee, aber bevor wir nicht das Problem gelöst haben, wie wir "pünktlich", also vor der Ausgabe, an das Ausgabesignal kommen, wird das keinen Sinn machen, weil es sonst wieder nur zu spät kommt =*MIST!!!* Aber wenn wir das gelöst haben, wäre es sehr intressant. Ich habe selber schon ziemlich viel mit solchen Teilen gearbeitet, weil ich viel mit Ton&PA Technik zu tun habe und die sind wirklich 1a!! Kosten aber als "Hardwareausführung" ein Schweinegeld!
Ich schick euch jetzt mal das ganze Programm von mir und die Recorddemo damit ihr euch das mal anschauen könnt. Vielleicht hat ja jemand eine Idee, wie man das Signal noch unter Windows auslesen kann.
Ansonsten verabschiede ich mich jetzt, da ich genug geschrieben habe ^^
Du musst einen Soundkarten-Treiber bauen, und soweit ich weiss, geht das nmit Delphi nicht so einfach (oder gar nicht). Na ja, 'alles geht' aber imho wäre da C die bessere Wahl.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!" (Monty Python "Joke Warefare")
Da kann ich leider überhaupt nicht mitreden, weil ich in C überhaupt nix kann! Ich bin jetzt kurz davor mein Informatik oder Elektro- und Informationstechnik Studium anzugehen, wo ich das sicherlich lernen werde, aber bis ich mich so gut eingearbeitet habe wie in Pascal wird das sicherlich dauern!
Aber ich glaube du hast Recht, weil mein Bruder auch mal probiert hat auf den Treiber von seiner Grafikkarte mit Delphi zuzugreifen und er hat auch kläglich versagt...
Naja, falls es doch noch irgendwelche Ideen gibt oder sich jemand bereit erklärt das ganze in C zu schreiben dann bitte ich um Antwort!