Raumklang (Mehrkanal-Mixing)

Kommentare anzeigen Worklog abonnieren

Worklogs Raumklang (Mehrkanal-Mixing)

Dienstag, 16. September 2014 von Chester
Mittlerweile ist die Basis für den Sequence Editor, indem später die SoundEntities und die Keyframes dargestellt werden, fertig.

Basis meint in dem Fall das Vorhandensein einer Sonstruktur, an der ein Projekt ausgerichtet ist.
Die "logische" Schwierigkeit hier war, dass Taktposition, Zeit und die grafische Darstellung konsistent sein müssen, unter der Voraussetzung, dass wechselnde Taktarten und BPM möglich sein sollen.

Zwar klingt jetzt die Umrechnung von Taktposition und Zeit (zumindest für Musiker) jetzt nicht so anspruchsvoll. Ich habe nur dummerweise den Fehler gemacht und mit der Kombination aus Taktposition und grafischer Darstellung begonnen. Das hat mit dem ursprünglichen Aufbau es unmöglich gemacht hat, die Zeit bei wechselnden Taktarten oder wechselnder BPM zu berechnen.
Dies hatte zur Folge, dass 60-70% der Arbeit am Sequence Editor erstmal wieder rausflog. Darauf wurden die benötigten Funktionen eingebaut, und dann darauf aufbauend die Funktionalität von vorher wieder hergestellt.

Die Moral aus der Geschichte: Wenn ihr denkt, ihr hättet eine noch so vermeintlich einfache Aufgabe umzusetzen, macht euch vorher trotzdem Gedanken, wie und welche Form der Umsetzung am sinnvollsten ist. Wink

Wollte zwar eigentlich warten, bis es ein wenig ansehlicher wird, aber da es sich ja um ein Worklog handelt, hier ein aktuelles Bild:

user posted image

Die "Asdf"-Platzhalter, die Fremdicons (von www.iconarchive.com) in der Toolbar und improvisierte GUI-Layouts bitte ich zu entschuldigen. Die leere (Entity-)Listbox im Sequence Editor fliegt noch raus bzw wird in den Canvas eingebaut.

Raumklang

Donnerstag, 11. September 2014 von Chester
So, nachdem die Phase des Ausprobierns und Experimentierens abgeschlossen ist und die eigentliche Entwicklung begonnen hat, möchte ich mein aktuelles Hobbyprojekt vorstellen:


1. Die Idee
Als begeisteter Musik- und Klangfan war ich tief beeindruckt von den Möglichkeiten die Surroundsound in der Musik bietet. Insbesondere das Wirken von Steven Wilson auf dem Gebiet möchte ich hier mal erwähnen - sein Livekonzert mit Quadrophonie Aufbau war eine sehr außergewöhnliche Erfahrung.
Da ich selbst auch viel Musik mache, habe ich mich natürlich gefragt, welche Möglichkeiten es für mich als Amateur gibt, mit einfachen Mitteln Musik "im Raum" zu mischen. Leider bieten das nur - wie so oft - die sehr teuren Programme an. Audacity bietet zwar auch die Möglichkeit, ist jedoch stark limitiert und sehr unflexibel, für meine "Vision" also nicht zu gebrauchen.


2. Das Konzept
Raumklang (vorläufiger Projektname) ist ein Programm zum einfachen und intuitiven Mischen von Musik in einer Mehrkanalumgebung. Das Abmischen erfolgt hier nicht über Regler und Schieber, sondern erfolgt automatisch aus der Bewegung in der Raumumgebung.

user posted image

Abstandsabhängige Lautstärkeberechnung einer animierten Soundquelle (grün) in einer Stereoumgebung (rot) in einer frühen "Machbarkeitsstudie" in B3D.

3. Funktionsweise
Die vorher produzierten Tonquellen (z.B. Instrumentenspuren, Ambienteffekte) können als Ressourcen geladen werden. Aus einer Ressource wird dann ein sogenanntes SoundEntity erstellt, welches über ein Keyframebasiertes Animationssystem im Raum verschoben werden kann. Im Raum erfolgt dann die Lautstärkeberechnung in Laufzeit über den Abstand zu den Lautsprechern. Natürlich sind auch konstante Offsets möglich - zur Berechnung der abstandsabhängigen Lautstärke gibt es viele Möglichkeiten. Primär wird jedoch noch keinen Wert drauf gelegt, eine physikalisch korrekte Simulation zu bieten.

4. Technische Umsetzung
Der Kern der Audioengine wurde in C++ entwickelt und findet sich in der audio_io.dll:
Die Klangausgabe auf unterster Ebene erfolgt über eine erweiterte Version von portaudio. Hier wurde das Mehrkanalmanagement ein wenig flexibler gestaltet und darauf aufbauend das Ressourcen/Entitysystem integriert.

File I/O erfolgt momentan über libsndfile.

Die Oberfläche, die der Großteil der Arbeit darstellt, wird in BlitzMax programmiert. Desweiteren erfolgt hier auch die Integration des Animationssystems, das zunächst noch von BlitzBasic nach BlitzMax portiert werden muss.

Beispiel aus der "Spielwiese" in C++ zur grundsätzlichen Funktionsweiße der audioengine:
Code: [AUSKLAPPEN]
   // Stereo Wave laden - (Kanäle werden in 2 Ressourcen gesplittet)
   my_output->AddSoundRessource("test.wav");
   
   // Linker Kanal
   SoundEntity* test = my_output->CreateSoundEntity(my_output->GetRessource(0));
   // Rechter Kanal
   SoundEntity* test2 = my_output->CreateSoundEntity(my_output->GetRessource(1));


   // Ende auf Soundlänge setzen
   test->SetEndTime(test->GetFrames());
   test2->SetEndTime(test->GetFrames());

   // Start auf 0
   test->SetStartTime(0);
   test2->SetStartTime(0);

   // Konstante Lautstärke L/R
   test->SetVolumeOffset(0,1.0f);   
   test2->SetVolumeOffset(1,1.0f);


5. Stand der Entwicklung
Die Arbeit rund um die audio_io.dll in einer Grundversion ist weitesgehend abgeschlossen und muss nur gelegentlich der BlitzMax Implementierung angepasst werden. Die Oberfläche ist jedoch noch in einem sehr frühen Stadium. Dinge, die sich in der "Spielwiese" in 2-3 Zeilen umsetzen lassen, erfodern hier einen deutlichen Mehraufwand aufgrund der Parameterdarstellung.

Nachdem sichergestellt wurde, dass das grundsätzliche Zusammenspiel der Library und BlitzMax ohne Probleme funktioniert, wird das System von "unten nach oben" integriert. So erfolgte die Integration der grundlegenden Soundeinstellungen als erstes. Danach wurde dafür gesorgt, dass Ressourcen geladen werden (und als Demo abgespielt werden können) und daraus Entities erstellt werden können. Aktuell wird an der Grundfunktionalität der Entities und der Darstellung der Entities in einem Sequenzeditor gearbeitet.

Der allgemeine Designentwurf der momentan angestrebt wird, sieht in der primitivsten Form wie folgt aus:
user posted image

6. Ausblick
Die Anfänge und die Spielereien, insbesondere mit portaudio, haben schon vor 4-5 Monaten begonnen - die eigentliche Entwicklung "nach Plan" hat jedoch erst vor 3 Wochen begonnen. Da ich das Projekt neben Studium in meiner Freizeit entwickle, wird es auch nur in kleinen Schritten vorwärts gehen. Das Hauptziel der Entwicklung liegt erstmal in der Herstellung der Grundfunktionsfähigkeit ohne große Spielereien und Schnickschnack. Ästhetik spielt auch erstmal keine Rolle.
Primär entwickle ich das Programm zwar für mich, jedoch könnte es gerade mangels günstiger Alternativen Verwendung finden, auch wenn die Zielgruppe klein sein wird.


Vielen Dank fürs Lesen, ich hoffe ich konnte trotz der wenigen Bilder einen kleinen Einblick in die Technik dahinter geben. Smile