Chaos in Faust

ProgHead

Gepokt en gemazeld
Lid sinds
26 februari 2019
Berichten
5.566
Locatie
Zeist
Programma's geschreven in de programmeertaal Faust kun je draaien op de volgende twee gratis online websites:

In Faust kun je ook chaotische systemen simuleren die signalen in het audiofrequentiegebied genereren. In dit topic is dat al even aangestipt. Hier gaan we daar verder op in, en proberen we er ook een leuke soft synth mee te bouwen. Ziehier een (al eerder gegeven) voorbeeld van wat mogelijk is:

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

tc = hslider("[1]Time Constant[scale:log]", 0.001,0.0001,0.01,0.0000001);
le = hslider("[2]Leak[scale:log]", 0.00000000001,0.00000000001,1,0.00000000001);
pa = hslider("[3]Parameter", 0.6, 0.55,1,0.001);

add(x,y) = x,y : +;
block(x,y) = x,y :_*(1-_);
leak(x) = x*(1-le);

A(x,y) = x,y,y;
AA(x,y) = x,x,y,y;
AAA(x,y) = x,x,y;

B = _ : _/SR : _/tc : _ ;
C = ((add,_) : (block:leak)) ~ _;
Integrator = A : B,_,_ : block,_ : C;

P = _,_,_ : add,_ : A : Integrator,_ : AA : _,Integrator,_ : _,AAA : _,_, Integrator : _,_,_;
Q(x,y,z) = -1*pa*x - y + abs(z) - 1;

R = (P : Q) ~ _;

t60 = 10;
damp = 0.5;
size = 3;
early_diff = 0.5;
mod_depth = 0.1;
mod_freq = 1;
low = 0.5;
mid = 0.5;
high = 0.5;
low_cutoff = 500;
high_cutoff = 5000;
V = jpverb(t60, damp, size, early_diff, mod_depth, mod_freq, low, mid, high, low_cutoff, high_cutoff);

process = R : _ <: _,_ : V : _,_ : dcblocker,dcblocker;
 
Interesting. Het lijkt me een variatie van karplus-strong maar met reverb ipv delay... of sla ik de bal mis?
 
Nee - het is de simulatie van een chaotisch circuit (voorzien van sliders om er wat mee te kunnen spelen) en reverb. In Falstad zag het er (toen nog zonder reverb) zo uit:

chaos1-Falstad.png


Maar Falstad is te traag om real-time te gebruiken, en daarom heb ik een Faust progje geschreven dat - maar nu wel real-time - hetzelfde doet. De reverb zit er op advies van Disharmonic bij, omdat dat inderdaad veel beter klinkt.
 
Klinkt best tof.
feedback gebasseerd.

Wat doet 'kick' bij de intergrator?
 
De kick bij de integrators heb je alleen nodig als het betreffende circuit niet uit zich zichzelf opstart. Een simulatie van een slinger bijvoorbeeld komt niet uit zichzelf op gang als je vanuit nul start. Met een puls op de kick ingang geef je de betreffende integrator als het ware een schop. ;)
 
Het begint al ergens op te lijken. Ik probeer er een keyboard instrument van te maken, maar de "toonhoogten" onder de toetsen kloppen van geen kant:

Code:
declare name "Chaos2";
declare options "[midi:on]";
declare options "[nvoices:12]";

import("maths.lib");
import("reverbs.lib");
import("filters.lib");
import("stdfaust.lib");

freq = hslider("[1]freq",200,50,10000,0.01);
gain = hslider("[2]gain",0.5,0,1,0.01)/10;
gate = button("gate");
le   = hslider("[3]Leak[scale:log]", 0.00000000001,0.00000000001,1,0.00000000001);
pa   = hslider("[4]Parameter", 0.6, 0.55,1,0.001);

add(x,y) = x,y : +;
block(x,y) = x,y :_*(1-_);
leak(x) = x*(1-le);

A(x,y) = x,y,y;
AA(x,y) = x,x,y,y;
AAA(x,y) = x,x,y;

B = _ : _/SR : _*freq : _ ;
C = ((add,_) : (block:leak)) ~ _;
Integrator = A : B,_,_ : block,_ : C;
P = _,_,_ : add,_ : A : Integrator,_ : AA : _,Integrator,_ : _,AAA : _,_, Integrator : _,_,_;
Q(x,y,z) = -1*pa*x - y + abs(z) - 1;
R = (P : Q) ~ _;


att = hslider("[5]attack", 0.01, 0, 1, 0.01);
dec = hslider("[6]decay", 0.01, 0, 1, 0.01);
sus = hslider("[7]sustain", 0.8, 0.1, 1, 0.01);
rel = hslider("[8]release", 0.1, 0, 5, 0.01);

envelope = en.adsr(att,dec,sus,rel,gate)*gain;

fb1    = hslider("[9]Lowpass", 0.6,0,1,0.001);
fb2    = 0.5;
damp   = 0.5;
spread = 100;

process = R : _*envelope : dcblocker <: stereo_freeverb(fb1, fb2, damp, spread);
 
Ach, soms is het beter om traditionele concepten, als "toonhoogte", te laten varen, moet je maar denken. :)
 
Of ik het precies kloppend krijg is de vraag, en inderdaad ook of dat voor experimenteel bedoeld werk wel wenselijk is. Maar dat je via een keyboard grofweg tussen hogere en lagere tonen kan kiezen lijkt mij praktisch gezien wel aardig. Ik ben al een heel eind op weg en zal straks een voorbeeldje posten.
 
Laatst gewijzigd:
Code:
declare name "Chaos2";
declare options "[midi:on]";
declare options "[nvoices:12]";

import("maths.lib");
import("reverbs.lib");
import("filters.lib");
import("stdfaust.lib");


freq = hslider("[1]freq",200,50,5000,0.01);
bend = ba.semi2ratio(hslider("frequency[midi:pitchwheel]",0,-20,20,0.01)) : si.smoo;
timeconstant = 0.151/(bend*freq^0.92);
gain = hslider("[2]gain",0.5,0,1,0.01);
gate = button("[5]gate");


le = hslider("[3]Leak[scale:log]", 0.00000000001,0.00000000001,1,0.00000000001);
pa = hslider("[4]Parameter", 0.6, 0.55,1,0.001);

add(x,y) = x,y : +;
block(x,y) = x,y :_*(1-_);
leak(x) = x*(1-le);

A(x,y) = x,y,y;
AA(x,y) = x,x,y,y;
AAA(x,y) = x,x,y;

B = _ : _/SR : _/timeconstant : _;
C = ((add,_) : (block:leak)) ~ _;
Integrator = A : B,_,_ : block,_ : C;

P = _,_,_ : add,_ : A : Integrator,_ : AA : _,Integrator,_ : _,AAA : _,_, Integrator : _,_,_;
Q(x,y,z) = -1*pa*x - y + abs(z) - 1;

R = (P : Q) ~ _;


att = hslider("[6]attack", 0.01, 0, 1, 0.01);
dec = hslider("[7]decay", 0.01, 0, 1, 0.01);
sus = hslider("[8]sustain", 0.8, 0.1, 1, 0.01);
rel = hslider("[9]release", 0.1, 0, 5, 0.01);

envelope = en.adsr(att,dec,sus,rel,gate)*gain;


t60  = hslider("reverberation time", 10, 0.1, 60, 0.01);
damp = hslider("damping ", 0.5, 0, 1, 0.01);
size = hslider("size", 3, 0.5, 5, 0.01);
early_diff = hslider("early reflections", 0.5, 0, 1, 0.01);
mod_depth  = hslider("modulation depth", 0.1, 0, 1, 0.01);
mod_freq   = hslider("modulation frequency", 1, 0, 10, 0.01);
low  = hslider("low band", 0.5, 0, 1, 0.01);
mid  = hslider("mid band", 0.5, 0, 1, 0.01);
high = hslider("high band", 0.5, 0, 1, 0.01);
low_cutoff  = hslider("low cutoff", 500, 100, 6000, 1);
high_cutoff = hslider("high cutoff", 5000, 1000, 10000, 1);

V = jpverb(t60, damp, size, early_diff, mod_depth, mod_freq, low, mid, high, low_cutoff, high_cutoff);


process = R : _*0.1 : _*envelope <: _,_ : V : _,_ : dcblocker,dcblocker;

Eigen improvisatie (een echte artiest moet er veel meer uit kunnen halen):

 
Wellicht ben ik ook toe aan een MIDI-controller. Dit is de Faust UI van mijn soft synthje:

UI.png


Zoiets valt tijdens het bespelen van het keyboard met de muis niet meer te bedienen.
 
Ja - met een MIDI-keyboard gespeeld. ;)

Alleen veel te veel schuifjes om nog met een muis te kunnen bedienen...
 
Dank voor al de positieve reacties! :)

Zal vandaag nog even proberen of ik detune kan toevoegen en eens zien (of eigenlijk horen) hoe dat uitpakt en of dat dus wel zin heeft.

Heeft iemand nog tips voor een MIDI-controller om daar dan ook al die schuifjes real-time mee te kunnen bedienen?
 
Ja - ik werk met Linux dus dat is wel een vereiste. En er moeten zo'n 20 schuifjes op zitten en liefst ook nog wat draaiknoppen, buttons en joysticks. Oh wacht - ik vrees dat zoiets al snel in de papieren gaat lopen...
 
Detune is ook gelukt. Maar een grote uitdaging is nog steeds om op mijn Linux computer een app of plugin te maken die ook nog op een Windows computer werkt. Misschien gaat dat met een web applicatie? Je kunt vanuit de FaustIDE allerlei van die dingen exporteren:

screenshot.png


Maar wat is wat, en wat maakt kans te werken op een standaard Windows computer?
 
Back
Top