Fictional Modelling?

Ik zal eens zien of ik de wiskundige vergelijking van het circuit kan opstellen. Dit is de basis:

Code:
  _ : f1 : integrate : f2 : integrate : f3 : _ ;

En dat gaat dan in een loop. Vervolgens wordt het resultaat gelimiteerd door een arctangens functie, vermenigvuldigd met het ingestelde volume, en in stereo omgezet:

Code:
process = C : atan : _*vol <: _,_;
 
Laatst gewijzigd:
Laat [imath] s_n [/imath] het signaal zijn dat de loop ingaat, en [imath] s_{n+1} [/imath] het signaal dat eruit komt. Dan moet er nadat het signaal opgestart is (en de buttons weer uit staan) gelden:

[imath] x_{n+1} = f_3(\mathrm{integrate}(f_2(\mathrm{integrate}(f_1(x_n))))) [/imath]

Verder schrijven we voor het gemak:

[imath] f_1(x) = - \mathrm{A}_1 \cdot x [/imath]
[imath] f_2(x) = - \mathrm{A}_2 \cdot x [/imath]
[imath] f_3(x) = - \mathrm{A}_3 \cdot x [/imath]

Zodat:

[imath] x_{n+1} = -\mathrm{A}_3 \cdot \mathrm{integrate}(- \mathrm{A}_2 \cdot (\mathrm{integrate}( - \mathrm{A}_1 \cdot x_n))) \,\,\,\,\,\,\,\, (i) [/imath]
 
Voor "integrate" is de volgende omschrijving van belang:

pole.png
 
In het programma wordt "integrate" als volgt gedefinieerd:

Code:
po     = 1 - 0.9*button("restart");

integrate = _ : atan : pole(po)/SR : atan : _;

Maar omdat we de situatie bekijken waarbij het signaal al is opgestart en de buttons weer uit staan hebben we:

Code:
integrate = _ : atan : pole(1)/SR : atan : _;
 
Nee - een analytische oplossing is niet te doen, want dat geeft onwerkbaar ingewikkelde vergelijkingen.

Terug dan maar naar de techneuten aanpak: bij onderstaande progje is de limiterende "atan" in het uitgangscircuit weggelaten:

Code:
declare name "Funny Loop";

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

var1   = hslider("variation 1", 0.5, 0.1, 1, 0.001);
var2   = hslider("variation 2", 0.5, 0.1, 1, 0.001);
var3   = hslider("variation 3", 0.5, 0.1, 1, 0.001);
var    = 10^9*(hslider("variation", 0.5, 0.001, 1, 0.001))^4;
vol    = 0.1*(hslider("volume", 0.5, 0, 1, 0.0001))^2;

start  = 0.01*button("start");
po     = 1 - 0.9*button("restart");

integrate = _ : atan : pole(po)/SR : atan : _;

f1(x) = -1*var1*var*x;
f2(x) = -1*var2*var*x;
f3(x) = -1*var3*var*x;

A = _ , start :> _ ;
B = _ : f1 : integrate : f2 : integrate : f3 : _ ;
C = A~B ;
process = C : _*vol <: _,_;

Wat we op de online Faust IDE dan zien is dat er uit de loop meestentijds een driehoeksgolf komt. Dat inzicht maakt het makkelijker te beredeneren hoe de loop werkt.
 
Ik heb stukjes van de loop in het uitgangscircuit gereproduceerd om via de plot te kunnen bekijken wat op verschillende punten in de loop gebeurt:

1.png


2.png


3.png
 
Wat we zien is dat de eerste "atan" in "integrate" de driehoeksgolf in een blokgolf omzet, die dan door de integrator pole(1) weer in een driehoeksgolf wordt omgezet.
 
Mijn Faust dsp programma nog wat verder vereenvoudigd:

Code:
declare name "Funny Loop";

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

var    = 10^7*(hslider("variation", 0.20, 0.05, 0.25, 0.001))^4;
vol    = 0.1*(hslider("volume", 0.5, 0, 1, 0.0001))^2;
start  = 0.01*button("start");
pol     = 1 - ( 2 - hslider("sway", 0.25, 0.01, 0.5, 0.0001) )*button("restart");

A = _ , start :> _*-1 : _ ;
B = _ : _*var : atan : pole(pol) : _*var : atan : pole(pol) : _*var : _ ;
C = A~B ;
process = C : atan : _*vol <: _,_ ;

Dit is te draaien in de online Faust IDE. Maar voor de LV2 versie heb ik inmiddels ook een GUI gemaakt m.b.v. XUiDesigner:

fl1.png


Voor wie de LV2 met GUI wil proberen zie fl1.zip als bijlage. Je hebt er wel een LV2 host voor nodig, maar misschien dat de online Cardinal versie dat kan?
 

Attachments

  • fl1.zip
    627,9 KB · Bekeken: 83
Cardinal heeft wel een plugin host maar zo te zien accepteert die geen externe plugins...
 
Back
Top