Een Distortion/Waveshaper plugin met SynthCraft, FAUST, etc.

ProgHead

Gepokt en gemazeld
Lid sinds
26 februari 2019
Berichten
8.111
Locatie
Zeist
In dit topic probeer ik een Distortion/Waveshaper plugin met SynthCraft te bouwen.
 
Uit het topic over de Doepfer A-136 module gebruik ik onderstaande formules:


[imath] \mathrm{U}_{out} = \mathrm{amp}(\mathrm{U}_{in}) \, + \, \mathrm{dist}^+(\mathrm{U}_{in}) \, + \, \mathrm{dist}^-(\mathrm{U}_{in}) [/imath]


Met:


[imath] \mathrm{amp}(\mathrm{U}_{in}) = 2 \cdot (5 - \mathrm{A}) \cdot \mathrm{U}_{in} [/imath]


[imath] \mathrm{dist}^+(\mathrm{U}_{in}) = 2,5 \mathrm{V} \cdot \mathrm{A}^+ \cdot \mathrm{R}( \frac{\mathrm{U}_{in}}{ 1 \mathrm{V}} \, + \, (\mathrm{L}^+ - 5) ) [/imath]


[imath] \mathrm{dist}^-(\mathrm{U}_{in}) = -1,4 \mathrm{V} \cdot \mathrm{A}^- \cdot \mathrm{R}( \frac{\mathrm{U}_{in}}{ -1 \mathrm{V}} \, + \, (\mathrm{L}^- - 5) ) [/imath]


(Met R de ramp function.)
 
Dit is waar chatGPT mee komt als ik de formules geef en om een vst3 plugin vraag.

#include "public.sdk/source/vst/vstaudioeffect.h"
#include <cmath>

using namespace Steinberg::Vst;

class Waveshaper : public AudioEffect {
public:
Waveshaper() {}

// Initialize the plugin
tresult PLUGIN_API initialize(FUnknown* context) SMTG_OVERRIDE {
tresult result = AudioEffect::initialize(context);
if (result != kResultOk) return result;

// Add audio inputs/outputs
addAudioInput(USTRING("Stereo In"), SpeakerArr::kStereo);
addAudioOutput(USTRING("Stereo Out"), SpeakerArr::kStereo);

// Add parameters
parameters.addParameter(USTRING("A"), nullptr, 0, 0.5, ParameterInfo::kCanAutomate, 0);
parameters.addParameter(USTRING("A+"), nullptr, 0, 0.5, ParameterInfo::kCanAutomate, 1);
parameters.addParameter(USTRING("A-"), nullptr, 0, 0.5, ParameterInfo::kCanAutomate, 2);
parameters.addParameter(USTRING("L+"), nullptr, 0, 5.0, ParameterInfo::kCanAutomate, 3);
parameters.addParameter(USTRING("L-"), nullptr, 0, 5.0, ParameterInfo::kCanAutomate, 4);

return kResultOk;
}

// Process audio
tresult PLUGIN_API process(ProcessData& data) SMTG_OVERRIDE {
if (data.numInputs == 0 || data.numOutputs == 0) return kResultOk;

float* in = data.inputs[0].channelBuffers32[0];
float* out = data.outputs[0].channelBuffers32[0];
int32 numSamples = data.numSamples;

// Get parameters
float A = parameters.getParameter(0)->getNormalized();
float A_plus = parameters.getParameter(1)->getNormalized();
float A_minus = parameters.getParameter(2)->getNormalized();
float L_plus = parameters.getParameter(3)->getNormalized();
float L_minus = parameters.getParameter(4)->getNormalized();

for (int32 i = 0; i < numSamples; i++) {
float input = in;

// Apply waveshaping formula
float amp = 2.0f * (5.0f - A) * input;
float dist_plus = 2.5f * A_plus * saturate((input / 1.0f) + (L_plus - 5.0f));
float dist_minus = -1.4f * A_minus * saturate((input / -1.0f) + (L_minus - 5.0f));

out = amp + dist_plus + dist_minus;
}

return kResultOk;
}

// Saturation function
float saturate(float x) {
return std::tanh(x);
}

static FUnknown* createInstance(void*) { return (IAudioProcessor*)new Waveshaper(); }
};

// Factory setup
BEGIN_FACTORY_DEF("YourCompany", "yourcompany.com - Diese Website steht zum Verkauf! - Informationen zum Thema yourcompany.", "contact@yourcompany.com")
DEF_CLASS2(INLINE_UID_FROM_FUID(FUID(0x12345678, 0x12345678, 0x12345678, 0x12345678)),
PClassInfo::kManyInstances,
kVstAudioEffectClass,
"Waveshaper",
Vst::kDistributable,
"Fx|Waveshaper",
"1.0.0",
"VST 3.7.1",
Waveshaper::createInstance)
END_FACTORY

 
Welke programmeertaal is daar gebruikt? Is dat C++?

Het is voor mij minder werk (en ook veel leuker!) om zelf een plugin te bouwen dan om na te pluizen wat ChatGPT gedaan heeft.

Maar misschien kan iemand anders met de aanzet van ChatGPT verder? Dat kan dan ook in dit topic.
 
Ik zie net dat SynthCraft geen Audio-In heeft. Die wordt het dus niet. :(
 
Hier een eerste probeersel in FAUST:

Code:
declare name "Distortion_Waveshaper";
import("maths.lib");
import("filters.lib");

a_plus = hslider("[1]A+", 0,-5,+5, 0.0001);
l_plus = hslider("[2]L+", 5, 0,10, 0.0001);
a      = hslider("[3]A ", 5, 0,10, 0.0001);
l_min  = hslider("[4]L-", 5, 0,10, 0.0001);
a_min  = hslider("[5]A-", 0,-5,+5, 0.0001);

amp(x) = 2*(5-a)*x;
ramp(x) = max(x,0);
dist_plus(x) = +2.5*a_plus*ramp( x + (l_plus - 5));
dist_min(x)  = -1.4*a_min *ramp(-x + (l_min  - 5));

y(x) = amp(x) + dist_plus(x) + dist_min(x);

safety(x) = tanh(dcblocker(x));

process = safety(y);


Te testen in: Faust IDE
 
Laatst gewijzigd:
Heb 'm vanuit de Faust IDE als VST geƫxporteerd (zie bijlage).

In Carla werkt die. Wie wil de plugin ook eens proberen?
 

Attachments

  • binary.zip
    91,1 KB · Bekeken: 80
Als het goed is is het een Windows 64 bit VST. Maar je kunt vanuit de online FAUST IDE ook zelf het soort plugin kiezen en exporteren wat je maar wilt. Helaas werken zulke geƫxporteerde plugins niet altijd en is de GUI van de plugins nogal primitief. Wel kun je het programma zeker in de online FAUST IDE zelf runnen om te zien en horen wat die doet. Dat zou sowieso moeten werken.
 
Zo ziet het er in de online FAUST IDE uit:

Screenshot.png
 
Heb de VST net proberen te gebruiken in Maschine 2.
Na het laden van de VST krijg ik alleen de A+ knop te zien zonder waarde.
Ook is het niet mogelijk om de VST te openen middels de 'pijl' knop. (links van page1)
Verder slaat Maschine 2 vast na het laden van de VST.

A136 test machine2.PNG
 
Dank voor het testen! Net zelf ook even de plugin uitgeprobeerd op mijn Windows laptop in Reaper, en daar crasht Reaper bij het openen van de plugin. Vervelend, want in de online FAUST IDE werkt mijn progje gewoon! Ik ga even bij de "FAUST mensen" informeren wat er aan de hand is.
 
Onderstaande 32-bit plugin (even uitpakken) werkt ook in Reaper onder Windows:
 

Attachments

  • binary.zip
    88,6 KB · Bekeken: 83
Verzoek voor moderatoren: Kan de titel van dit topic veranderd worden in:

Een Distortion/Waveshaper plugin met SynthCraft, FAUST, etc.​

 
Hoe nu verder? Ik ga het ook nog in Csound en PureData proberen. Is een goeie oefening!!
 
ik wil hem wel eens proberen maar ff druk met kids en moet nog veel tracks van de contest luisteren.
 
OK - laat maar horen als je tijd hebt. Ik kan er ook nog dingen aan veranderen of verbeteren als je wilt.

In de tussentijd ga ik even verder met Csound. Het is ook weer een tijd geleden dat ik daarmee gewerkt heb. ;)
 
Back
Top