Chaos in Faust

Maar moeten de beginwaarden dan niet x0=0 en x1=1 zijn?

Hoe bedoel je dat? Het gekozen rijtje is maar een voorbeeldje om te zien of het progje goed werkt. Dit krijg ik bij x0=0 en x1=1:

0-1.png
 
Nu kon ik het natuurlijk ook niet laten onze gevonden differentievergelijking uit te proberen, met dit resultaat:

surprise.png
 
Wat met verschillende beginvoorwaarden (dat is: verschillende waarden voor x[0] en x[1]) geƫxperimenteerd, en tot mijn verrassing kun je zo heel verschillende plaatjes genereren.
 
De plot is springerig genoeg voor een riedeltje, maar de frequenties zijn duidelijk hoger dan wat we aan riedeltjes horen. We moeten dus een groter deel van het Faust progje (en daarmee van het corresponderende blokdiagram) meenemen om te begrijpen hoe die audio riedeltjes precies ontstaan. Om te beginnen de arctangens die het uitgangsniveau van het progje tot veilige proporties terug brengt.
 
Dit ziet er aannemelijk uit (nu met de arctangens van het "safe" blokje toegevoegd):

riedelplot2.png
 
Had het bijna opgegeven, maar heb 'm nu toch zover gekregen dat die rustige melodietjes speelt:



Weet iemand of dit binnen een of andere maatsoort valt? Het klinkt niet als volstrekte willekeur...
 
Mooi genoeg voorlopig! Zie hieronder het Faust progje, en in de bijlage de ingepakte 32-bit plugin versie (die laatste moet wel via een toetsenbord opgestart worden):

Code:
declare name "Riedel Alpha";

import("filters.lib");
import("delays.lib");
import("oscillators.lib");

restartvalue0 = hslider("Initial Condition 0",1,-10,10,0.0001); // 0th value periodical restart
restartvalue1 = hslider("Initial Condition 1",1,-10,10,0.0001); // 1st value periodical restart
freq = hslider("Restart Frequency",3.5,0.1,10,0.001); //frequency of periodical restarts
gain = hslider("Gain",10, 1,500,0.0001); // gains inside loop
p = 1 - hslider("Leakiness",0.002,0,0.02,0.0000001);  // pole reflects (non)leakiness of integrator

restart0 = lf_imptrain(freq) ;              //impulstrain signaling restart with restartvalue0
restart1 = lf_imptrain(freq) : delay(1,1) ; //impulstrain signaling restart with restartvalue1
restart(x) = restartvalue0*restart0 + restartvalue1*restart1 + (1-restart0-restart1)*x;

A = _ : restart : _*-1 : _ ;
B = _ : pole(p) : _*gain : pole(p) : _*gain : atan : _;
C = A~B ;

safe(x) = atan(x)/5; //suppression of extreme output values

process = C <: safe,safe : _,_ ;
 

Attachments

  • RiedelAlpha.zip
    88,7 KB · Bekeken: 63
Eigenlijk lijkt me dit heel geschikt voor een hybride systeem, een analoge schakeling voor het genereren van een chaotisch signaal en vervolgens met wat digitale toverkunst daar iets bruikbaars van maken dat goed klinkt.

Even terug naar die suggestie. Mijn inspiratie voor een verdere ontwikkeling van het riedel progje is nu even uitgeput, dus kunnen we kijken of het riedel progje zoals het nu is kan worden samengevoegd met mijn ChaosSynth (als VirtualAnalog ;)) om een beter bruikbaar geheel te krijgen. Het meest logisch lijkt mij dan om de riedeltjes als forcing function voor de loop van de ChaosSynth te gebruiken. Maar ik heb dat nog niet uitgeprobeerd, want ik ben nog even druk...
 
Met een forcing function krijg ik enkel een soort van mix van de twee signalen, dus dat is niet erg interessant. Toen maar wat simpels geprobeerd: ringmodulatie. En dat geeft helse klanken:
 
Heb nog een paar tweak opties toegevoegd:

Code:
declare name "ChaosSynth5";
declare options "[midi:on]";
declare options "[nvoices:8]";


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



//------------------------------
freq = hslider("v:chaos/v:[1]basic/[2]freq",200,50,5000,0.01);
gate = button("v:chaos/v:[1]basic/[1]gate");
gain = hslider("v:chaos/h:[2]control/[1]gain[style:knob]",0.1,0,1,0.01);
bend = ba.semi2ratio(hslider("v:chaos/h:[2]control/[2]bend[midi:pitchwheel][style:knob]",0,-20,20,0.01)) : si.smoo;
oct  = hslider("v:chaos/h:[2]control/[3]octave[style:knob]", 1, 1, 2, 0.01);
//------------------------------



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

C = ((add,_) : (block:leak)) ~ _;

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



//------------------------------
le = hslider("v:chaos/v:[3]chaos/[1]leak[scale:log]", 0.00000000001,0.00000000001,1,0.00000000001);
pa = hslider("v:chaos/v:[3]chaos/[2]parameter", 0.6, 0.55,1,0.001);
tw1 = hslider("v:chaos/v:[3]chaos/[3]tweak1", 0, -0.1,0.01,0.00001);
tw2 = hslider("v:chaos/v:[3]chaos/[4]tweak2[scale:log]", 100, 1,200,0.001) : si.smoo ;
tw3 = hslider("v:chaos/v:[3]chaos/[5]tweak3", 0,0,0.08,0.00001);

timeconstant = 0.1585/(bend*(freq*oct));
//------------------------------



//---- R -----------------------
B = _ : _/SR : _/timeconstant : _;
Integrator = A : B,_,_ : block,_ : C;
P = _,_,_ : add,_ : A : Integrator,_ : AA : _,Integrator,_ : _,AAA : _,_, Integrator : _,_,_;
Q(x,y,z) = -1*pa*x - (1 + tw1)*y + abs(tw2*atan(z/tw2))^(1 + tw3) - 1;
R = (P : Q) ~ _;
//------------------------------



//-----envelope-----------------
att = hslider("v:chaos/h:[2]control/[6]attack[style:knob]", 0.01, 0, 1, 0.01);
dec = hslider("v:chaos/h:[2]control/[7]decay[style:knob]", 0.01, 0, 1, 0.01);
sus = hslider("v:chaos/h:[2]control/[8]sustain[style:knob]", 0.8, 0.1, 1, 0.01);
rel = hslider("v:chaos/h:[2]control/[9]release[style:knob]", 0.1, 0, 5, 0.01);

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



//---------reverb---------------
t60  = hslider("v:chaos/h:[4]reverb/reverberation time[style:knob]", 10, 0.1, 60, 0.01);
damp = hslider("v:chaos/h:[4]reverb/damping[style:knob]", 0.5, 0, 1, 0.01);
size = hslider("v:chaos/h:[4]reverb/size[style:knob]", 3, 0.5, 5, 0.01);
early_diff = hslider("v:chaos/h:[4]reverb/early reflections[style:knob]", 0.5, 0, 1, 0.01);
mod_depth  = hslider("v:chaos/h:[4]reverb/modulation depth[style:knob]", 0.1, 0, 1, 0.01);
mod_freq   = hslider("v:chaos/h:[4]reverb/modulation frequency[style:knob]", 1, 0, 10, 0.01);
low  = hslider("v:chaos/h:[4]reverb/low band[style:knob]", 0.5, 0, 1, 0.01);
mid  = hslider("v:chaos/h:[4]reverb/mid band[style:knob]", 0.5, 0, 1, 0.01);
high = hslider("v:chaos/h:[4]reverb/high band[style:knob]", 0.5, 0, 1, 0.01);
low_cutoff  = hslider("v:chaos/h:[4]reverb/low cutoff[style:knob]", 500, 100, 6000, 1);
high_cutoff = hslider("v:chaos/h:[4]reverb/high cutoff[style:knob]", 5000, 1000, 10000, 1);

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


//------------------------------
vol  = hslider("v:chaos/[5]volume", 0.5, 0, 1, 0.0001);
//------------------------------

safe(x) = atan(x)/5; //suppression of extreme output values

process = R*vol : _*envelope <: V : dcblocker,dcblocker : safe,safe;
 
Heb je wel Chrome gebruikt?

Hier de 32bit VSTi versie:
 

Attachments

  • binary.zip
    109 KB · Bekeken: 66
Zelf ook weer even de plugin geprobeerd, maar het ziet ernaar uit dat die geƫxporteerde plugins niet of nauwelijks bruikbaar zijn. We zullen het met de online Faust IDE moeten doen...
 
Back
Top