{"id":1879,"date":"2016-09-21T08:13:09","date_gmt":"2016-09-21T06:13:09","guid":{"rendered":"http:\/\/www.capri-soft.de\/blog\/?p=1879"},"modified":"2023-02-07T20:32:20","modified_gmt":"2023-02-07T19:32:20","slug":"vst-plugins-in-c-signalverarbeitung-durch-insert-effekte-und-ihre-auswirkungen","status":"publish","type":"post","link":"https:\/\/www.capri-soft.de\/blog\/?p=1879","title":{"rendered":"VST Plugins in C++ mit WDL-OL: Signalverarbeitung durch INSERT-Effekte und ihre Auswirkungen"},"content":{"rendered":"<h1>Intention<\/h1>\n<p>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 :-\/ &#8230;<\/p>\n<h1>Vorwort<\/h1>\n<p>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-&#8230;) Effekt-Algorithmen und Heuristken manifestiert und dem eigentlich Werkzeug das Leben einhaucht, dass es ben\u00f6tigt um eine Audioverarbeitungsaufgabe mit mathematischen Modellen zu erf\u00fcllen.<\/p>\n<p>Es ist mir <em>als Informatiker<\/em> bewusst, dass digitale Signale \u00fcber eine Soundkarte gesendet werden, um dann \u00fcber einen A\/D-Wandler im analogen, physischen Raum Schalldruckschwankungen \u00fcber Lautsprechermembranen zu erreichen. Ich kenne WAV-Dateien, und wei\u00df dass diese in unterschiedlichen<strong> Sample-Raten<\/strong> (44100 Hz, 22050 Hz, 48000 Hz, 96000 Hz&#8230; [Samples\/Sekunde]) \u00a0und\u00a0<strong>Aufl\u00f6sungen <\/strong>(z.B. 16 Bit, 24 Bit, 32 Bit float) existieren.<\/p>\n<p><em>Als Cubase-Nutzer<\/em> kenne ich die ASIO-Einstellungen (Men\u00fc Ger\u00e4te &#8211;&gt; Ger\u00e4te konfigurieren) und habe bereits den Parameter <strong>Buffer Size<\/strong> bemerkt, welcher sich proportional\u00a0auf die Eingangs- und Ausgangslatenzen, sowie reziprok auf meine CPU-Auslastung auswirkt.<\/p>\n<p><a href=\"https:\/\/www.capri-soft.de\/blog\/?attachment_id=1885\" rel=\"attachment wp-att-1885\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"1885\" data-permalink=\"https:\/\/www.capri-soft.de\/blog\/?attachment_id=1885\" data-orig-file=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/ASIO_Buffer_Size.png?fit=805%2C589&amp;ssl=1\" data-orig-size=\"805,589\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"asio_buffer_size\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/ASIO_Buffer_Size.png?fit=474%2C347&amp;ssl=1\" class=\"alignnone size-full wp-image-1885\" src=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/ASIO_Buffer_Size.png?resize=474%2C347&#038;ssl=1\" alt=\"asio_buffer_size\" width=\"474\" height=\"347\" srcset=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/ASIO_Buffer_Size.png?w=805&amp;ssl=1 805w, https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/ASIO_Buffer_Size.png?resize=300%2C220&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/ASIO_Buffer_Size.png?resize=768%2C562&amp;ssl=1 768w\" sizes=\"auto, (max-width: 474px) 100vw, 474px\" \/><\/a><\/p>\n<p><em>Als Musiker\u00a0<\/em>wei\u00df ich geringe Latenzzeiten nat\u00fcrlich zu sch\u00e4tzen :-). Wer kann schon ein Instrument mit dem richtigen Timing auf den Takt einspielen, wenn er das akustische Ergebnis verz\u00f6gert h\u00f6rt.<\/p>\n<p>Nach dem Artikel <em>Rechenlast beim Mixen verringern<\/em>\u00a0aus der <em><strong>c&#8217;t musik kreativ 2016 &#8211; S. 113<\/strong><\/em> splittet man aufgrund dieses Buffers die Aufnahme in 3 Teile:<\/p>\n<ol>\n<li><strong>Aufnahmephase:<\/strong> Alle komplexen INSERT-Effekte rausnehmen,<em><span style=\"text-decoration: underline;\"> <strong>k<\/strong><\/span><strong><span style=\"text-decoration: underline;\"><em>leine<\/em> Sample Buffer<\/span> einstellen<\/strong><\/em>, alle Spuren in Mono Aufnehmen die nicht zwingend Stereo sein m\u00fcssen (Gesang, Kick, Bass&#8230;.). Der Mix wird hierdurch auch transparenter, wenn man die Mono-Spuren im Nachgang im Stereopanorama verteilt.<\/li>\n<li><strong>Mixingphase:<\/strong> Aufwendige Effekte hinzuschalten, <span style=\"text-decoration: underline;\"><em><strong>Sample-Buffer erh\u00f6hen<\/strong><\/em><\/span><\/li>\n<li><strong>Masteringphase:\u00a0<\/strong>Rohmix auf Stereospur mit 24-Bit Wortbreite rendern,<em><strong><span style=\"text-decoration: underline;\"> hohen Sample-Buffer<\/span>\u00a0<\/strong><\/em>einstellen, so dass man die Masteringeffektkette wieder auf 96 khz fahren kann.<\/li>\n<\/ol>\n<h1>VST Insert-Effekte<\/h1>\n<h2>Das Grundger\u00fcst<\/h2>\n<p>Nachdem ich nun mit dem <a href=\"https:\/\/github.com\/olilarkin\/wdl-ol\">WDL-OL Framework\u00a0von Oli Larkin<\/a>\u00a0und Visual Studio 2015 ein kompilierf\u00e4higes C++-Grundger\u00fcst dank des <a href=\"http:\/\/www.martin-finke.de\/blog\/articles\/audio-plugins-002-setting-up-wdl-ol\/\">Tutorials von Martin Finke<\/a> erzeugt hatte, bemerkte ich schnell den Anwendungsbereich der Signalverarbeitung, der sich f\u00fcr mich anf\u00e4nglich unkompliziert durch Probieren und Testen offenbaren\u00a0sollte. Dabei machte ich ein paar (f\u00fcr den Profi triviale) Feststellungen, die ich hier niederschreiben m\u00f6chte.<\/p>\n<p>Wie sieht nun ein INSERT-Effekt in C++ aus? Was bekomme ich von der DAW von au\u00dfen geliefert? Was kann ich damit machen? Wie gebe ich es an die DAW zur\u00fcck?<\/p>\n<p><a href=\"https:\/\/www.capri-soft.de\/blog\/?attachment_id=1898\" rel=\"attachment wp-att-1898\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"1898\" data-permalink=\"https:\/\/www.capri-soft.de\/blog\/?attachment_id=1898\" data-orig-file=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/basic1-1.png?fit=774%2C266&amp;ssl=1\" data-orig-size=\"774,266\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"basic1\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/basic1-1.png?fit=474%2C163&amp;ssl=1\" class=\"alignnone size-full wp-image-1898\" src=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/basic1-1.png?resize=474%2C163&#038;ssl=1\" alt=\"basic1\" width=\"474\" height=\"163\" srcset=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/basic1-1.png?w=774&amp;ssl=1 774w, https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/basic1-1.png?resize=300%2C103&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/basic1-1.png?resize=768%2C264&amp;ssl=1 768w\" sizes=\"auto, (max-width: 474px) 100vw, 474px\" \/><\/a><\/p>\n<p>In C++ passiert bei einem INSERT-Effekt alles in der Funktion &#8222;ProcessDoubleReplacing&#8220;, die als \u00dcbergabeparameter<\/p>\n<ul>\n<li>die Amplitudenwerte des zu bearbeitenden Signals (*input)<\/li>\n<li>die Amplitudenwerte des bearbeiteten Signals (*output)<\/li>\n<li>die Puffergr\u00f6\u00dfe der ASIO-Einstellungen (hier 512)<\/li>\n<\/ul>\n<p>als Zeiger erh\u00e4lt. Da diese Zeiger auf den tats\u00e4chlichen Wert im output-Buffer zeigen, kann die Funktion ohne R\u00fcckgabeparameter auskommen und wird VOID deklariert.<\/p>\n<h2>Digitale Verzerrung<\/h2>\n<p>Einer der einfachsten INSERT Effekte ist die digitale Verzerrung, bei der lediglich die Amplituden abgeschnitten werden m\u00fcssen. Im Gegensatz zu einer weichen &#8222;analogen&#8220; Verzerrung, wie sie durch die R\u00f6hren eine Gitarrenverst\u00e4rkers statt finden kann und durch die Klangcharakteristik eines hart aufgeh\u00e4ngten Lautsprechers in ihrer &#8222;W\u00e4rme&#8220; abgerundet wird, legt die digitale Verzerrung lediglich durch das Abschneiden von Amplituden (auch Clipping genannt) wert auf Distortion \/ Verzerrung um jeden Preis.<\/p>\n<p>Ein Gitarrenr\u00f6hrenverst\u00e4rker f\u00fcgt dem Signal\u00a0zunehmend geradzahlige Harmonische (Obert\u00f6ne) zu und das Signal wird zunehmend weich begrenzt (soft clipping &#8211; W\u00e4rme).<\/p>\n<p>Bei der digitalen Verzerrung n\u00e4hern wir uns einer Rechteckform des Signals an\u00a0(hard clipping &#8211; Digitale Verzerrung).<\/p>\n<p><a href=\"https:\/\/www.capri-soft.de\/blog\/?attachment_id=1910\" rel=\"attachment wp-att-1910\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"1910\" data-permalink=\"https:\/\/www.capri-soft.de\/blog\/?attachment_id=1910\" data-orig-file=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/softVsHardClipping.gif?fit=700%2C180&amp;ssl=1\" data-orig-size=\"700,180\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"softvshardclipping\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/softVsHardClipping.gif?fit=474%2C122&amp;ssl=1\" class=\"alignnone size-full wp-image-1910\" src=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/softVsHardClipping.gif?resize=474%2C122&#038;ssl=1\" alt=\"softvshardclipping\" width=\"474\" height=\"122\" \/><\/a><\/p>\n<p><strong>Links<\/strong>: Hard-Clipping (Digitale Verzerrung)<br \/><strong>Rechts<\/strong>: Soft-Clipping (Wie bei einer R\u00f6hre)<\/p>\n<p>Der Hard-Clipping-Algorithmus (links) flacht also nicht wie rechts die Spitzen ab sondern nimmt einfach den \u00fcberschreitenden Wert als gegebenes Maximum hin. Programmiert sieht das folgenderma\u00dfen aus:<\/p>\n<p><a href=\"https:\/\/www.capri-soft.de\/blog\/?attachment_id=1873\" rel=\"attachment wp-att-1873\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"1873\" data-permalink=\"https:\/\/www.capri-soft.de\/blog\/?attachment_id=1873\" data-orig-file=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/mainfunction.jpg?fit=844%2C676&amp;ssl=1\" data-orig-size=\"844,676\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}\" data-image-title=\"mainfunction\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/mainfunction.jpg?fit=474%2C380&amp;ssl=1\" class=\"alignnone size-full wp-image-1873\" src=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/mainfunction.jpg?resize=474%2C380&#038;ssl=1\" alt=\"mainfunction\" width=\"474\" height=\"380\" srcset=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/mainfunction.jpg?w=844&amp;ssl=1 844w, https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/mainfunction.jpg?resize=300%2C240&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/mainfunction.jpg?resize=768%2C615&amp;ssl=1 768w\" sizes=\"auto, (max-width: 474px) 100vw, 474px\" \/><\/a><\/p>\n<p><strong>mThreshold:\u00a0<\/strong>Beinhaltet einen Wert zwischen 0 und 1, der mit einem Regler eingestellt wurde.<\/p>\n<p><strong>fmin():\u00a0<\/strong>Gibt hier den input-Amplitudenwert zur\u00fcck, es sei denn <strong>mThreshold<\/strong> wird \u00fcberschritten &#8211; dann wird <strong>mThreshold<\/strong> zur\u00fcckgegeben.<\/p>\n<p><strong>fmax():\u00a0<\/strong>Gibt den input-Amplitudenwert zur\u00fcck, es sei den\u00a0<strong>mThreshold<\/strong> wird unterschritten, dann wird\u00a0<strong>-mThreshold<\/strong> zur\u00fcckgegeben.<\/p>\n<p>\u00a0<\/p>\n<h2>Oszillation auf die Welle &#8222;draufmodulieren&#8220;<\/h2>\n<p>Ich schrieb eine Klasse &#8222;Oscillator.cpp&#8220;, die eine Sinus- bzw. Cosinusschwingung generierte. Zun\u00e4chst dachte ich, dass das simple &#8222;addieren&#8220; einer Welle auf die andere eine v\u00f6llig andere Klangcharakteristik erzeugen w\u00fcrde&#8230;. aber es erzeugte eher etwas wie das &#8222;Zusammenmischen&#8220; von zwei Signalquellen, so als ob man ein Signal mit dem Mischpult in das andere &#8222;reindreht&#8220;. Wenn ich so recht dr\u00fcber nachdenke kann ein Lautsprecher ja auch nur &#8222;eine&#8220; Welle erzeugen&#8230; diese Welle muss sich aber je Signalquelle unterscheiden&#8230; Man erreicht also das &#8222;Mixen&#8220; mehrerer Signalquellen durch das aufaddieren von Schwingungen. Und an dieser Stelle wird einem auch klar, dass eine nat\u00fcrliche 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 &#8222;Klick-Anteil&#8220;, einen druckbringenden &#8222;K\u00f6rper-Anteil&#8220; und einen tiefen &#8222;Bass-Anteil&#8220;, den man \u00fcber einen Equalizer separieren kann, und der sich alleinstehend v\u00f6llig anders anh\u00f6rt.<\/p>\n<p><a href=\"https:\/\/www.capri-soft.de\/blog\/?attachment_id=1903\" rel=\"attachment wp-att-1903\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"1903\" data-permalink=\"https:\/\/www.capri-soft.de\/blog\/?attachment_id=1903\" data-orig-file=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/basic3-1.png?fit=893%2C515&amp;ssl=1\" data-orig-size=\"893,515\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"basic3\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/basic3-1.png?fit=474%2C273&amp;ssl=1\" class=\"alignnone size-full wp-image-1903\" src=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/basic3-1.png?resize=474%2C273&#038;ssl=1\" alt=\"basic3\" width=\"474\" height=\"273\" srcset=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/basic3-1.png?w=893&amp;ssl=1 893w, https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/basic3-1.png?resize=300%2C173&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/basic3-1.png?resize=768%2C443&amp;ssl=1 768w\" sizes=\"auto, (max-width: 474px) 100vw, 474px\" \/><\/a><\/p>\n<h2>Phasenausl\u00f6schung: Wenn sich Wellen gegenseitig ausl\u00f6schen<\/h2>\n<p>Ich richtete den linken und den rechten Kanal nun aufeinander und dachte dass sich das &#8222;zugemischte&#8220; Signal durch die 180\u00a0Grad Phasenverschiebung (um PI) vollst\u00e4ndig ausl\u00f6schen m\u00fcsste. In Wirklichkeit wurde es aber nur leiser. Ich vermutete, dass hier die kreisf\u00f6rmige Ausdehnung des Schalls aus den Boxen eine Rolle spielt. Wenn man dies bereits im Rechner macht, ist das Resultat bekannterma\u00dfen Stille.<\/p>\n<p>sin(x)+sin(x+PI)=0;<\/p>\n<p>Der Cosinus ist quasi eine Phasenverschiebung\u00a0um 90 Grad.\u00a0In einer DAW k\u00f6nnte dies durch das Verschieben einer\u00a0Audiospur nach rechts bedeuten.<\/p>\n<p><a href=\"https:\/\/www.capri-soft.de\/blog\/?attachment_id=1920\" rel=\"attachment wp-att-1920\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"1920\" data-permalink=\"https:\/\/www.capri-soft.de\/blog\/?attachment_id=1920\" data-orig-file=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/phase_02.png?fit=466%2C222&amp;ssl=1\" data-orig-size=\"466,222\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"phase_02\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/phase_02.png?fit=466%2C222&amp;ssl=1\" class=\"alignnone size-full wp-image-1920\" src=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/phase_02.png?resize=466%2C222&#038;ssl=1\" alt=\"phase_02\" width=\"466\" height=\"222\" srcset=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/phase_02.png?w=466&amp;ssl=1 466w, https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/phase_02.png?resize=300%2C143&amp;ssl=1 300w\" sizes=\"auto, (max-width: 466px) 100vw, 466px\" \/><\/a><\/p>\n<p>180 Grad ist dann noch weiter geschoben&#8230;<\/p>\n<p><a href=\"https:\/\/www.capri-soft.de\/blog\/?attachment_id=1916\" rel=\"attachment wp-att-1916\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"1916\" data-permalink=\"https:\/\/www.capri-soft.de\/blog\/?attachment_id=1916\" data-orig-file=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/phase_03.png?fit=540%2C222&amp;ssl=1\" data-orig-size=\"540,222\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"phase_03\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/phase_03.png?fit=474%2C195&amp;ssl=1\" class=\"alignnone size-full wp-image-1916\" src=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/phase_03.png?resize=474%2C195&#038;ssl=1\" alt=\"phase_03\" width=\"474\" height=\"195\" srcset=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/phase_03.png?w=540&amp;ssl=1 540w, https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2016\/09\/phase_03.png?resize=300%2C123&amp;ssl=1 300w\" sizes=\"auto, (max-width: 474px) 100vw, 474px\" \/><\/a><\/p>\n<p>(Bild-Quelle: delamar.de)<\/p>\n<p>Jetzt werden beim Zusammenmischen der beiden Quellen die Amplitudenwerte addiert, wie es im Abschnitt &#8222;Oszillation auf die Welle draufmodulieren&#8220; bereits gezeigt wurde. <strong>Und genau diese Tatsache f\u00fchrt also zu einer Phasenausl\u00f6schung!<\/strong> Eine Phasenausl\u00f6schung kann also auch durch die ung\u00fcnstige Lage von Audiomaterial auf der Zeitachse stattfinden. Wen man das Material ein St\u00fcck nach rechts oder links schiebt (nat\u00fcrlich so, dass es nicht merkbar ist) k\u00f6nnte das Resultat auch wieder anders aussehen.<\/p>\n<p>Wenn ich nun die Boxen aufeinander richte erhalte ich tats\u00e4chlich Stellungen im Raum, an denen das Signal fast verschwunden ist. Durch die kreisf\u00f6rmige Ausdehnung des Schalls um die Boxen wird es aber nicht vollst\u00e4ndig terminiert.<\/p>\n<p>Hier habe ich mein Experiment dokumentiert:<\/p>\n<p><span class=\"embed-youtube\" style=\"text-align:center; display: block;\"><iframe loading=\"lazy\" class=\"youtube-player\" width=\"474\" height=\"267\" src=\"https:\/\/www.youtube.com\/embed\/94fX6nNl0nE?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=de-DE&#038;autohide=2&#038;wmode=transparent\" allowfullscreen=\"true\" style=\"border:0;\" sandbox=\"allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox\"><\/iframe><\/span><\/p>\n<p>Schalte ich den <strong>Cubase Stereo Out Mix auf Mono<\/strong>, indem ich das &#8222;Stereo Enhancer&#8220; Plugin in den INSERT-Effekten des Stereo-Outs auf Mono hinzuschalte (links unten ist ein MONO-Button wenn es geladen wurde), ist\u00a0das Signal wirklich verschwunden bevor es den Computer verlassen hat (Phasenausl\u00f6schung bereits Digital).<\/p>\n<h1>VST Instrumente<\/h1>\n<h2>Der Unterschied zu Insert-Effekten<\/h2>\n<p>Im Tutorial von Martin Finke wird ein Python-Skript verwendet, um aus den IPlugSamples ein Template f\u00fcr ein neues Projekt zu generieren. Als Grundlage meiner bisherigen Projekte wurde immer das selbe Startprojekt IPlugEffekt verwendet. Meine Vermutung war zun\u00e4chst, dass jetzt ein anderes Template als Grundlage f\u00fcr ein VST Instrument genutzt wird. Allerdings kann man einen VST Insert Effect mit wenigen Handgriffen in der Quelldatei &#8222;ressource.h&#8220; in ein VST Instrument umwandeln.<\/p>\n<pre><code><br \/>\n\/\/ #define PLUG_CHANNEL_IO \"1-1 2-2\"<br \/>\n#if (defined(AAX_API) || defined(RTAS_API))<br \/>\n#define PLUG_CHANNEL_IO \"1-1 2-2\"<br \/>\n#else<br \/>\n\/\/ no audio input. mono or stereo output<br \/>\n#define PLUG_CHANNEL_IO \"0-1 0-2\"<br \/>\n#endif<\/code><\/pre>\n<p>\u00a0<\/p>\n<pre><code><\/code><\/pre>\n<p>\/\/ &#8230;<br \/>#define PLUG_IS_INST 1<\/p>\n<pre><code><\/code><\/pre>\n<p>\/\/ &#8230;<br \/>#define EFFECT_TYPE_VST3 &#8222;Instrument|Synth&#8220;<\/p>\n<pre><code><\/code><\/pre>\n<p>\/\/ &#8230;<br \/>#define PLUG_DOES_MIDI<br \/>[\/javascript]<\/p>\n<pre><code><\/code><\/pre>\n<p>&#8222;0-1 0-2&#8220; bedeutet <strong>kein Input<\/strong> und<strong> einen Output\u00a0<\/strong>(Mono) oder\u00a0 <strong>kein Input<\/strong> und <strong>zwei Outputs. <\/strong><\/p>\n<pre><code><\/code><\/pre>\n<p>&#8222;<strong>PLUG_IS_INST 1<\/strong>&#8220; macht aus dem INSERT Effect endg\u00fcltig ein Instrument.<\/p>\n<pre><code><\/code><\/pre>\n<p>Inputs sind bei Instrumenten unn\u00f6tig, da ein Instrument selber als Signalquelle f\u00fcr den Gesamt-Mix genutzt wird. Die Funktion &#8222;ProcessDoubleReplacing&#8220; bekommt als \u00dcbergabeparameter allerdings weiter hin die Inputs geliefert. Ich habe noch nicht herausgefunden wof\u00fcr das gut sein soll ;-).<\/p>\n<pre><code><\/code><\/pre>\n\n\n<p>Inputs sind bei Instrumenten unn\u00f6tig, da ein Instrument selber als Signalquelle f\u00fcr den Gesamt-Mix genutzt wird. Die Funktion &#8222;ProcessDoubleReplacing&#8220; bekommt als \u00dcbergabeparameter allerdings weiter hin die Inputs geliefert. Ich habe noch nicht herausgefunden wof\u00fcr das gut sein soll ;-).<\/p>\n<iframe src=\"http:\/\/www.facebook.com\/plugins\/like.php?href=https%3A%2F%2Fwww.capri-soft.de%2Fblog%2F%3Fp%3D1879&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light\" scrolling=\"no\" frameborder=\"0\" allowTransparency=\"true\" style=\"border:none; overflow:hidden; width:450px;margin-top:5px;\"><\/iframe>","protected":false},"excerpt":{"rendered":"<p>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 :-\/ &#8230; Vorwort Als musik- und programmierbegeisterterter DAW-Nutzer (ich bin Cubase &hellip; <a href=\"https:\/\/www.capri-soft.de\/blog\/?p=1879\" class=\"more-link\"><span class=\"screen-reader-text\">VST Plugins in C++ mit WDL-OL: Signalverarbeitung durch INSERT-Effekte und ihre Auswirkungen<\/span> weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":true,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[1,7,35,23,6,3],"tags":[],"class_list":["post-1879","post","type-post","status-publish","format-standard","hentry","category-allgemein","category-aufnahmetechnik","category-c-programmierung","category-musik","category-musikproduktion","category-programmierung"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p4yGeN-uj","jetpack_likes_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1879","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1879"}],"version-history":[{"count":51,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1879\/revisions"}],"predecessor-version":[{"id":3719,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1879\/revisions\/3719"}],"wp:attachment":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1879"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1879"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1879"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}