Sampling, Recording, Programmierung & Software

Kategorie: Programmierung Seite 1 von 6

Decent Sampler – Eine erneute Einführung

Es ist schon wieder anderthalb Jahre her, dass ich mit einer Einführung zum kostenlosen Plugin Decent Sampler daherkam. Seitdem hat sich viel getan. Deshalb will ich nochmal von vorne beginnen. Den Sampler gibt es jetzt seit 2020, d.h. er ist schon seit fast vier Jahren in Umlauf und wird seitdem immer mal wieder erweitert. David Hilowitz hat mit seiner Software einen Nerv getroffen. Die Urgesteine wie NI Kontakt oder UVI Falcon sind natürlich wesentlich mächtiger, aber auch viel zu teuer für den ambitionierten Hobby-Enthusiasten.

Bei den günstigeren Vertretern, wie Renoise Redux oder TX16Wx, bzw. den nativen Samplern bekannter DAWs (Ableton Live, Bitwig Studio, Studio One, etc…) hat man nicht die Möglichkeit das GUI nach seinen Wünschen zu gestalten und man ist bei Letzteren an nur eine DAW gebunden.

JSFX Programmierung – Was sind JSFX Plugins?

Ganz kurz: JSFX sind Skripte, die in der Programmiersprache EEL2 (Embeddable Expression Language) geschrieben werden, und in der DAW – insbesondere in Reaper – dann als Effektplugins oder Tools eingesetzt werden können. EEL2 wurde von Cockos – den Entwicklern von Reaper – erschaffen und ist eine Open Source Programmiersprache, die C etwas ähnelt.

JSFX Editor in Reaper DAW

Aber von vorne: 2004, noch bevor es Reaper gab, hat Cockos versucht Software zu schreiben, die live auf der Bühne zum Einsatz kommt. Man wollte Gitarreneffekte programmieren, die dann auf einem kleinen Linux System laufen und in bühnentaugliche Hardware verbaut werden. Davon gab es auch einige Prototypen:

Quelle: cockos.com

Soundspear’s Formula ermöglicht das Programmieren von Audio-Plugins direkt in der DAW

Ok, das ist jetzt nicht ganz neu. Cockos‘ JSFX, Tracktion’s SOUL und auch Blue Cat’s Plug’n’Script können das ebenfalls. Naja, jedenfalls hat Soundspear – von denen ich vorher zumindest das Supertube Plugin kannte – jetzt Formula veröffentlicht. Ein Audio-Plugin, dass eigentlich eine kleine Entwicklungsumgebung für DSP Code ist.

Und das Beste? Das Ganze ist kostenlos und Open Source. Formula ist eine komplette IDE zum Schreiben und Testen von DSP-Code in Form eines VST3– oder AU-Plugins oder auch als Standalone App. Die Effekte, die man innerhalb von Formula schreiben kann werden in der Programmiersprache C verfasst. Leider ist die Software nur für Mac und Win verfügbar … aber immerhin.

Will man allerdings die Formula-eigene Cloud nutzen und den Code der anderen User ausprobieren bzw. seinen eigenen Code in der Cloud zur Verfügung stellen, dann muss man dafür bezahlen – derzeit 14,90€ pro Monat.

Decent Sampler Tutorials – 00: Eine kleine Einführung

Vor ungefähr zwei Jahren hat David Hilowitz seinen Decent Sampler der Öffentlichkeit präsentiert. Hierbei handelt es sich um Freeware und jeder kann den Sampler kostenlos benutzen und ihn auch hervorragend einsetzen, um eigene Sample Libraries zu bauen. In dieser kleinen Tutorialserie soll es genau darum gehen…

Mittlerweile gibt es haufenweise Software-Sampler auf dem Markt. Jede DAW hat ihren eigenen Sampler und Platzhirsche, wie NI Kontakt oder UVI Falcon haben sich als Standards durchgesetzt. Diese Standards kosten Geld. Auch wenn sie vielleicht jeden Cent wert sind, möchte nicht jeder so viel für eine Software ausgeben. Hier kommen Freeware-Lösungen ins Spiel. Der Decent Sampler ist solche eine Lösung.

Auch wenn man vielleicht in Kauf nehmen muss, dass das Bauen einer eigenen Sample-Bibliothek vielleicht etwas weniger komfortabel ist, glänzt der Sampler trotzdem mit seiner einfachen Bedienung.

Programmiere einen einfachen 3-Band-Compressor mit diesem ausführlichen C++/JUCE Videotutorial

MatKat Music bietet einen ca. 8-stündigen Videokurs an, der zur Zeit absolut nichts kostet und den ambitionierten Programmierneuling an die Hand nimmt und ihm hilft, ein Compressor Plugin zu programmieren.

Das Tutorial beinhaltet das Setup der Entwicklungsumgebung unter Windows und MacOS, behandelt ein paar Grundlagen der Plugin-Entwicklung und steigt dann tief in den DSP Code und die GUI-Entwicklung ein.

Der Kurs nutzt das C++-Framework JUCE, welches speziell für Audio-Anwendungen optimiert ist. Auch wenn es zahlreiche Tutorials auf den JUCE-Webseiten gibt, ist dieses Videotutorial eine Spitzengelegenheit in die Materie einzusteigen. Und das Ganze dann auch noch völlig kostenlos!

JUCE 6 Tutorial: JUCE Framework unter Windows installieren…

Es wird mal wieder Zeit für ein Update zur aktuellen Version von JUCE. Seit ungefähr einem Jahr gibt es mittlerweile die Version 6 des beliebten C++ Frameworks zur Entwicklung von Audio-Plugins und ich möchte an dieser Stellen nochmal Schritt für Schritt durch die Einrichtung unter Windows 10 gehen.

Zunächst einmal installiere ich die aktuelle Version von Git. Dazu gehe ich auf die Git-Webseite und downloade den aktuellen Installer für ein 64Bit Windows. Nach dem Download kann ich Git einfach durch Starten des Installers installieren.

Während der Installation kann man Auswählen, welcher Code Editor standardmäßig mit Git verwendet werden soll. Hier kann man seinen installierten Editor auswählen (hier: Visual Studio Code), oder einen anderen Editor direkt installieren oder aber den Terminal-Editor Vim auswählen.

Einige ReaPlugs kann man auch außerhalb von Reaper nutzen, zumindest unter Windows … und das macht schon alleine aufgrund von ReaJS wirklich Sinn

Reaper hat bekanntermaßen einige gute Effekte an Bord. Mal angenommen man nutzt eine kostenlose DAW, die von Haus aus eher spärlich mit Effekten ausgestattet ist, wie z.B. Waveform Free, dann könnte man sich die ReaPlugs VST FX Suite auf die Festplatte kopieren.

Reaper’s ReaPlugs in Bitwig Studio…

Die Vorteile: Die Effekte sind komplett kostenlos und man hat mit ReaJS auch die Möglichkeit eigene Effekte zu programmieren oder etliche weitere JSFX-Plugins zu nutzen. Einziger Nachteil: Die ReaPlugs gibt es nur für das Microsoft Betriebssystem. Aber von vorne…

Faust – Echtzeit Audio Programmierung für Anwendungen und Plugins…

Faust (Functional AUdio STream) ist eine Programmiersprache, die speziell für die Erstellung von digitalen Synthesizern und Audio Effekten gedacht ist. Faust unterstützt das funktionale Programmierparadigma und man kann den geschriebenen DSP-Code schnell in eine andere allgemeine Programmiersprache, wie C, C++, Java, JavaScript oder Web Assembly, übersetzen.

Außerdem ist es möglich diesen generierten Code leicht in verschiedene Objekte zu kompilieren: Audio-Plugins, Standalone-Anwendungen, Smartphone- oder Web Apps.

Quelle: https://faust.grame.fr/

Faust Programme werden kompiliert und nicht interpretiert. Sie werden in möglichst optimierten C++ Code umgewandelt. Angeblich soll dieser generierte Code effizienter sein, als der den ein fortgeschrittener C++ Entwickler schreiben würde … zumindest genauso effizient. Hut ab!

Faust ist zwar im Grunde eine textuelle Sprache, aber trotzdem ähnelt das alles einem Block Diagramm. Sie vereint die funktionelle Programmierung mit dem Erstellen von Blockdiagrammen. Man programmiert quasi Blockdiagramme mithilfe von Funktionen. Kurz gesagt: Ein Faust Programm beschreibt einen Signalprozessor.

Die meisten Audiotools können als Signalprozessoren dargestellt werden. Sie verfügen über Audio-Ein– und –Ausgänge und Kontrollsignale werden mithilfe von Drehreglern, Schiebern und diversen Anzeigen dargestellt.

Audio Programmierung #09 – C++ Grundlagen: Funktionen (Teil 1)

Bisher haben wir all unseren Programmcode in die main()-Funktion geschrieben. Wenn man nur kleine Programme oder Beispiele schreibt, kann das durchaus Sinn machen. Wenn ein Programm aber größer und komplexer wird, sollte man den Code strukturieren. Dabei helfen Funktionen.

Funktionen helfen dabei ein Programm in logische Blöcke zu unterteilen, die man dann aufrufen kann, wenn man sie benötigt. Eine Funktion ist quasi ein Unterprogramm, dem man Parameter übergeben kann und die etwas zurückgeben kann. Damit sie ihre Arbeit verrichtet, muss sie aufgerufen werden.

Ein klassisches Beispiel für eine Anwendung ist die Berechnung des Umfangs und der Fläche eines Kreises. Der Nutzer gibt einen Radius an und das Programm berechnet diese beiden Werte. Man könnte das nun alles in die main()-Funktion schreiben. Eine bessere Lösung wäre es, wenn man den Code in logische Blöcke unterteilt: Eine Funktion, die den Umfang berechnet und eine Funktion, die die Fläche des Kreises bestimmt.

// circle01.cpp

#include <iostream>

using namespace std;

const double PI = 3.14159265;

// Function declarations (prototypes)
double area(double);
double circumference(double);

int main() {
    cout << "Enter radius: ";
    double radius = 0;
    cin >> radius;

    // Call function area()
    cout << "Area is: " << area(radius) << endl;

    // Call function circumference()
    cout << "Circumference is: " 
         << circumference(radius) << endl;
    
    return 0;
}

// Function definitios (implementations)
double area(double radius) {
    return PI * radius * radius;
}

double circumference(double radius) {
    return 2 * PI * radius;
}
Enter radius: 4
Area is: 50.2655
Circumference is: 25.1327

Audio Programmierung #08 – C++ Grundlagen: Verschachtelte Schleifen

Genauso, wie man manchmal verschachtelte if-Anweisungen benötigt, ist es nicht ungewöhnlich auch Schleifen zu verschachteln. Wenn wir beispielsweise zwei Arrays mit Integern haben und jedes der Elemente miteinander multiplizieren wollen – wenn es sich um mathematische Vektoren handelt – dann benutzt man dazu am besten eine verschachtelte Schleife.

Die erste Schleife läuft durch myNums1, während die innere Schleife durch myNums2 läuft.

// nestedLoops.cpp

#include <iostream>

using namespace std;

int main() {
    const int ARRAY1_LEN = 3;
    const int ARRAY2_LEN = 2;

    int myNums1[ARRAY1_LEN] = {35, -3, 0};
    int myNums2[ARRAY2_LEN] = {20, -1};

    cout << "Multiplying each int in myNums1 by each"
         << " im MyNums2:" << endl;

    for(int index1 = 0; index1 < ARRAY1_LEN; ++index1) {
        for(int index2 = 0; index2 < ARRAY2_LEN; ++index2) {
            cout << myNums1[index1] << " X " << myNums2[index2]
                 << " = " << myNums1[index1] * myNums2[index2]
                 << endl;
        }
    }
    return 0;
}
Multiplying each int in myNums1 by each im MyNums2:
35 X 20 = 700
35 X -1 = -35
-3 X 20 = -60
-3 X -1 = 3
0 X 20 = 0
0 X -1 = 0

Die besagten verschachtelten for Schleifen sind in Zeile 17 und 18. Die erste Schleife durchläuft das Array myNums1 und die zweite Schleife durchläuft das Array myNums2. Für jedes Element in myNums1 wird immer die komplette zweite Schleife ausgeführt.

Seite 1 von 6

Präsentiert von WordPress & Theme erstellt von Anders Norén