VST Plugins in C++ mit WDL-OL: Signalverarbeitung durch INSERT-Effekte und ihre Auswirkungen

Intention

In diesem Artikel dokumentiere ich meine ersten Erkenntnisse, die ich als Informatiker, Musiker und Cubase-Benutzer bei der Entwicklung von VST Plugins in C++ mache. Der Artikel wirkt daher sehr Ich-bezogen, da ich mich auf meinen eigenen Explorations-Lerntyp konzentriere. Ich bin allerdings kein Egozentriker :-/ …

Vorwort

Als musik- und programmierbegeisterterter DAW-Nutzer (ich bin Cubase Fan), fehlt einem oft noch der Draht zu der eigentlichen Audiosignalverarbeitung, die sich durch (Hall-/Echo-/Sustain-…) Effekt-Algorithmen und Heuristken manifestiert und dem eigentlich Werkzeug das Leben einhaucht, dass es benötigt um eine Audioverarbeitungsaufgabe mit mathematischen Modellen zu erfüllen.

Es ist mir als Informatiker bewusst, dass digitale Signale über eine Soundkarte gesendet werden, um dann über einen A/D-Wandler im analogen, physischen Raum Schalldruckschwankungen über Lautsprechermembranen zu erreichen. Ich kenne WAV-Dateien, und weiß dass diese in unterschiedlichen Sample-Raten (44100 Hz, 22050 Hz, 48000 Hz, 96000 Hz… [Samples/Sekunde])  und Auflösungen (z.B. 16 Bit, 24 Bit, 32 Bit float) existieren.

Als Cubase-Nutzer kenne ich die ASIO-Einstellungen (Menü Geräte –> Geräte konfigurieren) und habe bereits den Parameter Buffer Size bemerkt, welcher sich proportional auf die Eingangs- und Ausgangslatenzen, sowie reziprok auf meine CPU-Auslastung auswirkt.

asio_buffer_size

Als Musiker weiß ich geringe Latenzzeiten natürlich zu schätzen :-). Wer kann schon ein Instrument mit dem richtigen Timing auf den Takt einspielen, wenn er das akustische Ergebnis verzögert hört.

Nach dem Artikel Rechenlast beim Mixen verringern aus der c’t musik kreativ 2016 – S. 113 splittet man aufgrund dieses Buffers die Aufnahme in 3 Teile:

  1. Aufnahmephase: Alle komplexen INSERT-Effekte rausnehmen, kleine Sample Buffer einstellen, alle Spuren in Mono Aufnehmen die nicht zwingend Stereo sein müssen (Gesang, Kick, Bass….). Der Mix wird hierdurch auch transparenter, wenn man die Mono-Spuren im Nachgang im Stereopanorama verteilt.
  2. Mixingphase: Aufwendige Effekte hinzuschalten, Sample-Buffer erhöhen
  3. Masteringphase: Rohmix auf Stereospur mit 24-Bit Wortbreite rendern, hohen Sample-Buffer einstellen, so dass man die Masteringeffektkette wieder auf 96 khz fahren kann.

VST Insert-Effekte

Das Grundgerüst

Nachdem ich nun mit dem WDL-OL Framework von Oli Larkin und Visual Studio 2015 ein kompilierfähiges C++-Grundgerüst dank des Tutorials von Martin Finke erzeugt hatte, bemerkte ich schnell den Anwendungsbereich der Signalverarbeitung, der sich für mich anfänglich unkompliziert durch Probieren und Testen offenbaren sollte. Dabei machte ich ein paar (für den Profi triviale) Feststellungen, die ich hier niederschreiben möchte.

Wie sieht nun ein INSERT-Effekt in C++ aus? Was bekomme ich von der DAW von außen geliefert? Was kann ich damit machen? Wie gebe ich es an die DAW zurück?

basic1

In C++ passiert bei einem INSERT-Effekt alles in der Funktion „ProcessDoubleReplacing“, die als Übergabeparameter

  • die Amplitudenwerte des zu bearbeitenden Signals (*input)
  • die Amplitudenwerte des bearbeiteten Signals (*output)
  • die Puffergröße der ASIO-Einstellungen (hier 512)

als Zeiger erhält. Da diese Zeiger auf den tatsächlichen Wert im output-Buffer zeigen, kann die Funktion ohne Rückgabeparameter auskommen und wird VOID deklariert.

Digitale Verzerrung

Einer der einfachsten INSERT Effekte ist die digitale Verzerrung, bei der lediglich die Amplituden abgeschnitten werden müssen. Im Gegensatz zu einer weichen „analogen“ Verzerrung, wie sie durch die Röhren eine Gitarrenverstärkers statt finden kann und durch die Klangcharakteristik eines hart aufgehängten Lautsprechers in ihrer „Wärme“ abgerundet wird, legt die digitale Verzerrung lediglich durch das Abschneiden von Amplituden (auch Clipping genannt) wert auf Distortion / Verzerrung um jeden Preis.

Ein Gitarrenröhrenverstärker fügt dem Signal zunehmend geradzahlige Harmonische (Obertöne) zu und das Signal wird zunehmend weich begrenzt (soft clipping – Wärme).

Bei der digitalen Verzerrung nähern wir uns einer Rechteckform des Signals an (hard clipping – Digitale Verzerrung).

softvshardclipping

Links: Hard-Clipping (Digitale Verzerrung)
Rechts: Soft-Clipping (Wie bei einer Röhre)

Der Hard-Clipping-Algorithmus (links) flacht also nicht wie rechts die Spitzen ab sondern nimmt einfach den überschreitenden Wert als gegebenes Maximum hin. Programmiert sieht das folgendermaßen aus:

mainfunction

mThreshold: Beinhaltet einen Wert zwischen 0 und 1, der mit einem Regler eingestellt wurde.

fmin(): Gibt hier den input-Amplitudenwert zurück, es sei denn mThreshold wird überschritten – dann wird mThreshold zurückgegeben.

fmax(): Gibt den input-Amplitudenwert zurück, es sei den mThreshold wird unterschritten, dann wird -mThreshold zurückgegeben.

 

Oszillation auf die Welle „draufmodulieren“

Ich schrieb eine Klasse „Oscillator.cpp“, die eine Sinus- bzw. Cosinusschwingung generierte. Zunächst dachte ich, dass das simple „addieren“ einer Welle auf die andere eine völlig andere Klangcharakteristik erzeugen würde…. aber es erzeugte eher etwas wie das „Zusammenmischen“ von zwei Signalquellen, so als ob man ein Signal mit dem Mischpult in das andere „reindreht“. Wenn ich so recht drüber nachdenke kann ein Lautsprecher ja auch nur „eine“ Welle erzeugen… diese Welle muss sich aber je Signalquelle unterscheiden… Man erreicht also das „Mixen“ mehrerer Signalquellen durch das aufaddieren von Schwingungen. Und an dieser Stelle wird einem auch klar, dass eine natürliche Schwingung, beispielsweise der Ton eines Instrumentes, aus mehreren Teilschwingungen besteht und nur durch unsere Erfahrung als zwei oder mehrere unterschiedliche Signalquellen interpretiert werden kann. So hat zum Beispiel bei einem Schlagzeug die Bass-Drum einen hohen „Klick-Anteil“, einen druckbringenden „Körper-Anteil“ und einen tiefen „Bass-Anteil“, den man über einen Equalizer separieren kann, und der sich alleinstehend völlig anders anhört.

basic3

Phasenauslöschung: Wenn sich Wellen gegenseitig auslöschen

Ich richtete den linken und den rechten Kanal nun aufeinander und dachte dass sich das „zugemischte“ Signal durch die 180 Grad Phasenverschiebung (um PI) vollständig auslöschen müsste. In Wirklichkeit wurde es aber nur leiser. Ich vermutete, dass hier die kreisförmige Ausdehnung des Schalls aus den Boxen eine Rolle spielt. Wenn man dies bereits im Rechner macht, ist das Resultat bekanntermaßen Stille.

sin(x)+sin(x+PI)=0;

Der Cosinus ist quasi eine Phasenverschiebung um 90 Grad. In einer DAW könnte dies durch das Verschieben einer Audiospur nach rechts bedeuten.

phase_02

180 Grad ist dann noch weiter geschoben…

phase_03

(Bild-Quelle: delamar.de)

Jetzt werden beim Zusammenmischen der beiden Quellen die Amplitudenwerte addiert, wie es im Abschnitt „Oszillation auf die Welle draufmodulieren“ bereits gezeigt wurde. Und genau diese Tatsache führt also zu einer Phasenauslöschung! Eine Phasenauslöschung kann also auch durch die ungünstige Lage von Audiomaterial auf der Zeitachse stattfinden. Wen man das Material ein Stück nach rechts oder links schiebt (natürlich so, dass es nicht merkbar ist) könnte das Resultat auch wieder anders aussehen.

Wenn ich nun die Boxen aufeinander richte erhalte ich tatsächlich Stellungen im Raum, an denen das Signal fast verschwunden ist. Durch die kreisförmige Ausdehnung des Schalls um die Boxen wird es aber nicht vollständig terminiert.

Hier habe ich mein Experiment dokumentiert:

Schalte ich den Cubase Stereo Out Mix auf Mono, indem ich das „Stereo Enhancer“ Plugin in den INSERT-Effekten des Stereo-Outs auf Mono hinzuschalte (links unten ist ein MONO-Button wenn es geladen wurde), ist das Signal wirklich verschwunden bevor es den Computer verlassen hat (Phasenauslöschung bereits Digital).

VST Instrumente

Der Unterschied zu Insert-Effekten

Im Tutorial von Martin Finke wird ein Python-Skript verwendet, um aus den IPlugSamples ein Template für ein neues Projekt zu generieren. Als Grundlage meiner bisherigen Projekte wurde immer das selbe Startprojekt IPlugEffekt verwendet. Meine Vermutung war zunächst, dass jetzt ein anderes Template als Grundlage für ein VST Instrument genutzt wird. Allerdings kann man einen VST Insert Effect mit wenigen Handgriffen in der Quelldatei „ressource.h“ in ein VST Instrument umwandeln.


// #define PLUG_CHANNEL_IO "1-1 2-2"
#if (defined(AAX_API) || defined(RTAS_API))
#define PLUG_CHANNEL_IO "1-1 2-2"
#else
// no audio input. mono or stereo output
#define PLUG_CHANNEL_IO "0-1 0-2"
#endif

// ...
#define PLUG_IS_INST 1

// ...
#define EFFECT_TYPE_VST3 "Instrument|Synth"

// ...
#define PLUG_DOES_MIDI
[/javascript]

"0-1 0-2" bedeutet kein Input und einen Output (Mono) oder  kein Input und zwei Outputs.

"PLUG_IS_INST 1" macht aus dem INSERT Effect endgültig ein Instrument.

Inputs sind bei Instrumenten unnötig, da ein Instrument selber als Signalquelle für den Gesamt-Mix genutzt wird. Die Funktion "ProcessDoubleReplacing" bekommt als Übergabeparameter allerdings weiter hin die Inputs geliefert. Ich habe noch nicht herausgefunden wofür das gut sein soll ;-).

Kostenloses VST3 Effect-Plugin / Free VST3 effects plugin: Digitale Verzerrung / Digital Distortion

Download kostenloses VST3 Plugin Digitale Verzerrung | VST3 Effect Download

Nach dem Download können Sie das Plugin einfach in Ihr VST3 Verzeichnis kopieren (z.B. C:\Program Files (x86)\Common Files\VST3)

Just copy the VST3 Plugin into your VST3 Directory (i.e. C:\Program Files (x86)\Common Files\VST3 ).

Bei diesem VST3 Plugin handelt es sich um eine einfache digitale Verzerrung.

Der Regler lässt sich von 0 Prozent bis 100 Prozent (links) drehen, je näher man an die 100 Prozent kommt, desto stärker werden die Amplituden abgeschnitten. Bei leiseren Signalen muss man ganz nach links drehen. Am 100 % Anschlag ist allerdings die Welle ausgelöscht :-). Also immer ein paar Cent weiter rechts bleiben und die Lautstärke wieder anheben (diese wird ebenfalls abgeschwächt). Eine automatische Lautstärkenkorrektur findet nicht statt, da die Lautheit durch die Annäherung an ein Rechtecksignal relativ hoch wird, sollte dies nämlich besser individuell eingepegelt werden.

Screenshot: Der Effekt „Distortion -> Hard Digital Distortion“ wurde bei den INSERT-Effekten einer Spur in Steinberg Cubase an erster Stelle ausgewählt und dessen GUI über den „e“-Button hervorgebracht.

digitale_verzerrung

 

Music Production: Workflow bei der Nachbearbeitung von Gesang

  1. Gesang aufnehmen
  2. Tonhöhen und Intonationen mit z.B. Melodyne oder VariAudio korrigieren
  3. Zischlaufte mit Deesser eleminieren (z.B. SPITFISH oder Fabfilter Pro-C 2)
  4. Einer oder mehrere Kompressoren über die INSERTs in Reihe schalten (Achtung: Gesang hat  die größte Dynamik daher können mehrere Kompressoren verwendet werden um unterschiedliches Ansprechverhalten sowie deren Klangfärbung zu kombinieren). Hier wird dafür gesorgt dass sich die Stimme im Mix durchsetzt.
  5. Mix mit dem Equalizer bearbeiten, damit er klarer heraussticht.
  6. Hall (Reverb) kann helfen einen Lead Sänger in den Vordergrund zu rücken. Bei Hall nimmt man die gleiche Klangcharakteristik wie für die üblichen Instrumente, damit es sich nicht anhört als ob diese in einem anderem Raum sind.
  7. Echos (Delays) können bei rythmischen Passagen besser geeignet sein als Hall, da sie den Gesang nicht nur difus streuen, sondern mit SYNC-Optionen im richtigen Tempo den Rythmus unterstützen.
  8. Anschließend wird der Gesang im Mix platziert. Hiermit ist der Platz im Stereo-Panorma gemeint (also wie weit der Sänger links oder rechts angeordnet ist). Ein Lead Sänger kommt für gewöhnlich immer durch die Mitte. Der Gesamtmix (Stereo Out) wird am Besten auf Mono umgeschaltet, dann stellt man die Lautstärke ein. Setzt sich der Gesang aufgrund der Gitarren/Synthesizer-Dichte nicht durch, kann man diese über Sidechain-Kompressoren um 2dB-3dB (in Cubase standard) über Ducking absenken wenn der Gesang einsetzt.
  9. Nun kann man die Refrain-Passagen fetter machen (falls nötig), indem man einen Kompressor und einen leichten Chorus oder ein Plug-In zur Stereo-Verbreiterung in die INSERTs/Returns schaltet. Einen brauchbaren Effekt kann auch das Kopieren des Gesangs auf zwei weitere Spuren mit einer Pitch-Anhebung und -Absenkung um jeweils 8 Cent bringt und die Lautstärke der Spuren langsam in den Mix dreht. Eine Alternative zum Pitchen kann man aber auch die beiden Spuren mit einer kurzen Verzögerung um etwas 20 ms versehen.
  10. Falls der Gesang zu clean ist, kann man mit harmonischer Verzerrung den Rotz reinbringen.

Musik: Angesagte Musikgenres / Musikstile / Musikrichtungen nach Google Trends (weltweit / Deutschland / Deutsche Musikindustrie)

Intention

In diesem Artikel möchte ich Google Trends als Auswertungswerkzeug für die Analyse des Musikmarktes vorstellen. Zunächst beobachten wir den Weltmarkt, anschließend schauen wir uns Deutschland an. Zur Verfizierung der Repräsentationsfähigkeit vergleichen wir mit frei zugänglichen Berichten der Musikindustrie.

Statistik Google Trends (weltweit)

Neben den Berichten der Musikindustrie, welche bereits suggerieren, dass Rock die angesagteste Musikrichtung seit Anfang der Zählung (2004) ist, gibt es dank Google Trends auch die Möglichkeit anhand der häufigsten Suchen Trends abzubilden:

Problem

Wie aus der Grafik ersichtlich ist, sinken die Gesamtabfragen, so dass es teilweise schwierig ist die neuen Trends zu erkennen.

Ansatz

Um Trends besser zu analysieren lohnt es sich die Grafik anhand der Gesamtabfragen prozentual zu normalisieren.

Lösung

Durch den CSV Download kann man brauchbare Auswertungen erstellen

chart1

Elektronische Tanzmusik (EDM) wäre in einer Portfolio-Analyse eine Cash Cow.

chart2

Zur detailierten Auswertung kommen Sie über diesen Link.

Statistik Google Trends (Deutschland)

Betrachten wir hingegen den gleichen Trend für Deutschland, so gab es bis 2008 in Deutschland tatsächlich einen Zeitraum, in dem Hip Hop angesagter war als Rockmusik:

Anteilige Änderung
chart1D

Prozentuale Nachfrage
chart2D

Verifizierung anhand freier Berichte der Musikindustrie

miz.org

In diesem Bericht lässt sich beispielsweise ebenfalls den Abwärtstrend von Rap / Dance / Hip Hop beobachten, allerdings ist er nicht so stark ersichtlich wie bei Google Trends:

Klicke, um auf statistik31.pdf zuzugreifen

(siehe PDF Seite 4).

Vermutlich ist die Subkultur Hip-Hop und die Zielgruppe stärker im Internet vertreten. Der absolute Anteil von Rap ist ingesamt niedriger als der von Rock, wobei sich Rock sogar noch hier zusätzlich in Deutsch und Englisch aufteilt.

Die Tanzmusik beinhaltet sowohl die elektronische Tanzmusik als auch die gewöhnliche Disco-Fox-Musik. Durch EDM hat hier ein starker Wandel stattgefunden, wodurch man sogar Helene Fischer diesem Genre zuordnen könnte.