Am 31. Januar 2021 ging ich spazieren. Das Wetter war okay, der Wintereinbruch kam erst eine Woche später. Der Wanderweg führte ein Stück entlang der Bahnstrecke Erfurt — Weimar, wo auf bis zu sechs Gleisen Züge aller Art verkehren. Als ich einen sehr langsam nahenden Güterzug sah, positionierte ich mich so, dass die Umgebung zu einer fast grafisch anmutenden Bühne wurde. Mit meinem Smartphone (Samsung S10e) nahm ich den Zug in seiner ganzen Länge mit der Zeitlupenfunktion auf: Die Aufnahme dauerte 30 Sekunden, und bot etwa 5 Minuten Material.
Als ich weiter lief, sinnierte ich darüber, was ich wohl mit der Aufnahme anstellen könnte. Ich stellte mir vor, was wäre, wenn jeder Wagen ein Lautsprecher wäre, der einen Loop abspielt, während sich der Zug bewegt. Je mehr ich darüber nach dachte, desto konkreter waren die dazu nötigen Schritte und ich wollte es als Projekt umsetzen.
Ich bin Anfänger was After Effects angeht, aber auch jahrelang Programmierer. Mir gefällt die Möglichkeit, auf alle animierbaren Parameter ein Script (Expression) legen zu können und damit Berechnungen anzustellen. Es kribbelte wieder in den Fingern.
Angefangen hatte ich mit der Lok. Die sollte irgendwie so elektrisch klingen. So vorwärts ziehend. Mechanisch. Und ich verbrachte dann doch den Abend damit, in Sound Pi an diesem Sound zu feilen: Der »Lokomovorwärts«-Loop:
# Sketch für Sonic Pi # The Train - Lok-Loop # Autor: Sven Wachsmuth use_bpm 124 live_loop :loop0 do with_fx :distortion, distort: 0.5 do sample :elec_bong wait 1 sample :elec_twang wait 1 sample :elec_wood wait 0.5 sample :elec_wood wait 0.5 sample :elec_cymbal wait 1 end end live_loop :lok2 do sample :vinyl_hiss, pitch: 24, attack: 2, sustain: 0, release: 2, amp: 2 wait 4 end
Die Lok ist nicht kaputt, die sollte so klingen. Das heißt, der Sound musste sich mit der Lok bewegen. Im Umkehrschluss bedarf es einer Möglichkeit, stets zu wissen, wo die Lok ist, damit wollte ich die Lautstärke und die Balance ermitteln. In After Effects gibt es sogenannte Null-Objekte, die selbst nicht sichtbar sind, sondern nur Eigenschaften zur Verfügung stellen, wie X- und Y‑Koordinate. Der Zug fährt gleichmäßig, so ergibt sich die X‑Koordinate grob aus der Zeit im Video mal die Geschwindigkeit in Pixel pro Sekunde. Nach ein paar Anpassungen lag das Null-Objekt stets mittig auf der Lok. Ist die Lok links ist XPos=0, ist sie rechts ist XPos=1920 (Videogröße = 1920x1080 Pixel, rot dargestellt). Im Bild »klebt« das Null-Objekt mitten auf der Lok, seine X‑Koordinate habe ich als XPos eingezeichnet.
Für die weiteren Berechnungen sind Pixel nicht mehr relevant. Zur Vereinfachung rechnete ich die Pixel-Koordinaten XPos = [0…1920] (rot) in einen Wertebereich x_relative = [-1…+1](blau) mithilfe des Dreisatzes um:
2 / 1920 = (x_relative + 1) / Xpos | Umstellen nach x_relative
x_relative = 2 * Xpos / 1920 — 1;
In After Effects gibt es die Variable thisComp.width wo immer die Breite der Komposition in Pixeln drin steht. Hier steht also 1920 drin.
Bestimmung der Balance
Ich definierte die Variablen left und right. Die sollen Werte von 0 (keine Dämpfung) bis 1 (maximale Dämpfung) haben. In der Mitte bei x_relative=0 sollen beide 0 sein, also minimale Dämpfung, zum Rand hin soll sich ein Wert zum Maximum (1) bewegen. Die Ermittlung der Formeln dazu war eine Nuss. Aber ich habs geschafft:
left = 1 — ((x_relative < 0) ? 1 : Math.max(0, 1-x_relative));
right = 1 — ((x_relative > 0) ? 1 : Math.max(0,1‑Math.abs(x_relative)));
Dämpfung durch Distanz
Die Strecke von Betrachter zu Schiene und die Schiene selbst bilden ein rechtwinkliges T (schwarz). Der Abstand dist des Betrachters von der Lok lässt sich mit dem Phytagoras ermitteln (blau) — ist in der Mitte 1 und wird nach links und rechts größer.
dist = Math.sqrt(x_relative * x_relative + 1);
Aus der Distanz ergibt sich direkt der Dämpfungspegel:
pegel = ‑20 * Math.log10(dist);
Und da hatte ich alle Zutaten, um den Pegel der Audio-Spur mit Werten für den linken und rechten Kanal zu füttern. Dabei wird von der Dämpfung durch die Distanz noch die Dämpfung pro Kanal abgezogen (Faktor 48 regelt die Itensität des Stereo-Effekts).
pegel_left = pegel — (48 * left);
pegel_right = pegel — (48 * right);
Damit fährt der Sound mit der Lok scheinbar durch das Bild.
Die weiteren Wagons
Die Berechnungen für die Wagen war analog zur Lok: Jeder bekam sein eigenes Null-Objekt »aufgeklebt«, und das lieferte zu jedem Zeitpunkt die Position desselben, so dass diese zeitversetzt durch das Bild wandern und die Audiopegel der einzelnen Soundspuren — jeder Wagon hatte eine eigene — nach oben beschriebener Methode steuern. Als dieses Gerüst stand, konzentrierte ich mich auf die Programmieren weiterer Soundloops mit Sound Pi, die vom Takt zur Lok und nebeneinander gespielt auch zueinander passen. Insgesamt programmierte ich 11 verschiedene Sounds auf 19 Spuren, die am Anfang gleichzeitig starten und beginnend mit der Lok mit der Bewegung des Zuges langsam ineinander übergehen und sich abwechseln. Achja, das Quietschen ist Originalton.
Sicher kann man noch mehr ins Detail gehen und noch die Laufzeitunterschiede zu weiter entfernten Wagons durch die Schallgeschwindigkeit, den Doppler-Effekt und ein gewisses Echo berücksichtigen. Mir ging es hier aber nicht um Realismus, sondern um eine andere Art, die Sounds zu mischen, sozusagen fremdgesteuert durch die Bewegung eines Güterzuges.
Was denkt ihr?
Edit 14.11.2023:
ich habe ein Oszilloskop-Video von der Audiospur des Videos gemacht. Dazu nutzte ich das XXY Oszilloskop, den Aiseesoft ScreenRecorder, Adobe Photoshop und das freie DaVinci Resolve zum schneiden.
Weitere Beiträge in dieser Kategorie: