Hi Gabriel, Thanks for sharing! Interesting sounds, with a lot of variety and expressiveness.
Cheers Yann Le jeu. 4 sept. 2025 à 11:58, ga <[email protected]> a écrit : > Hello > I am proposing the attached synthesis engine. > It uses a "3D" oscillator that oscillates in x,y, z ( similar to FM / AM) > The radius of x,y is fed into a pickup distortion, which goes into a > triangular filter ( 3 phase offset copies going into an integrator) an > asymmetric distortion. > It has only 4× 4 parameter, including classic ADSR and LFO, envelope > hardwired to oscillation amplitudes. > Its capable of a variety of semi- realistic sounds. > Sound demo is here: > https://youtu.be/7CBhMcYDWac?feature=shared > > > I would need some help to streamline the code mor Faustian, > to export including GUI, and to export including the effect, > and maybe ideas how to port this to some small hardware, Pi or Daisy Pod ( > though I doubt it will run there ). as well as opinion on the method and > ideas. > > Code: > > declare options "[midi:on][nvoices:8]"; > declare options "[-vec]"; > declare name "Paradigma_9 v007"; > declare version "0.0.7"; > declare author "gabriel"; > declare copyright "https://steady.page/en/voxangelica/"; > declare license "DWTW"; > // a synthesizer with "philonic" 3D spin oscillator and triangular filter > import("stdfaust.lib"); > import("maths.lib"); > > // frequency ratios table > frtonum = waveform{1,16,9,6,5,4,7,3,8,5,7,15}; > frtodiv = waveform{1,15,8,5,4,3,5,2,5,3,4, 8}; > > // MIDI > midigrp(x) = hgroup("[1]MIDI",x); > f = nentry("freq",200,40,2000,0.1) ; > kmidi = nentry("key",69,0,127,1) ; > bend = ba.semi2ratio(hslider("bend[midi:pitchwheel][style: > knob]",0,-2,2,0.01)) ; > gain = nentry("gain",0.6,0,1,0.01)<:* ; > master = hslider("volume[midi:ctrl 7]",1,0,2,0.01) ; > gate = button("gate") ; > > // spin oscill params > rtogrp(x) = hgroup("[2]philonic",x); > rto1sel = rtogrp(hslider("[1]x[style:knob]",-12,-24,24,1)); > rto2sel = rtogrp(hslider("[2]z[style:knob]",19,-24,24,1)); > fbka = > rtogrp(hslider("[3]excentric[style:knob]",0.4,0,1,0.01)<:*:*(1/ma.PI)); > detune = rtogrp(hslider("[4]warble[style:knob]",0.125,0,0.5,0.005)/ma.SR); > pickd = > rtogrp(hslider("[5]distance[style:knob]",0.7,0.25,1,0.0625))<:*:si.smoo; > > // LFO and Envelope Parameter > lfogrp(x) = hgroup("[3]envelope & lfo",x); > enva = (lfogrp(ba.db2linear(hslider("[1]A[style:knob]",20,15,66,1) > )/1000)); > envd = (lfogrp(ba.db2linear(hslider("[2]D[style:knob]",74,26,100,1) > )/1000)*envpscal); > envs = (lfogrp(hslider("[3]S[style:knob]",0,0,1,0.01) )); > envr = (lfogrp(ba.db2linear(hslider("[4]R[style:knob]",50,26,100,1) > )/1000)*envpscal); > lfof = lfogrp(hslider("[5]LFO Hz[style:knob]",3,0.1,12,0.1)); > lfvibra = lfogrp(hslider("[6]Vibrato[style:knob]",0.125,0,2,0.01))<:*; > > env = en.adsre(enva,envd*envpscal,envs,envr*envpscal,gate); > envg = env:_* gain; > > lfosn = qsin(mphasor(lfof/ma.SR)); > > // Triangular Filter Parameter > fltgrp(x) = hgroup("[4]triangulation",x); > wid = fltgrp(hslider("[1]rise[style:knob]",4.89,1,9,0.001)):2^_:1/_; > edge = fltgrp(hslider("[2]fall[style:knob]",6,1,9,0.001)):2^_:1/_; > fiq = fltgrp(hslider("[3]q[style:knob]",1.18,0.5,3.87,0.01))<:*; > hpon = fltgrp(checkbox("[4]highpass")); > drive = fltgrp(hslider("[5]drive[style:knob]",0,-6,36,0.1)):_/20.0:10^_; > > rto1oct = rto1sel / 12 : floor; > rto1semi = rto1sel + 24 : _% 12; > rto1a = frtonum, rto1semi : rdtable; > rto1b = frtodiv, rto1semi : rdtable; > rto1 = (rto1a/rto1b)*(2^rto1oct); > rto1r = min((1/ rto1),1); > > rto2oct = rto2sel / 12 : floor; > rto2semi = rto2sel + 24 : _% 12; > rto2a = frtonum, rto2semi : rdtable; > rto2b = frtodiv, rto2semi : rdtable; > rto2 = rto1*(rto2a/rto2b)*(2^rto2oct); > rto2r = min((1 / rto2),1); > > // fve > lg2f = ma.log2(f/440); > stretch = 0.0333*lg2f; > envpscal = ( - 3 * lg2f ):ba.db2linear; > fplus = f*bend + lfosn* lfvibra*f * 0.5/12*envg + stretch; > > w = f/ma.SR; > w2 = rto1 * w; > w3 = rto2 * w; > wplus = fplus/ma.SR; > > fbk1 = fbka*(0.5 -w)^4; > fbk2 = fbka*(0.5 - w2)^4*rto1r; > fbk3 = fbka*(0.5 - w3)^4*rto2r; > > // modulation reduction per frequency > redux1 = ((3.3 -((rto1+1)*w) )/3.3),0: max:_^3; > redux2 = ((3.3 -((rto2+1)*w) )/3.3),0: max:_^3; > modep = envg; > modep1 = envg * redux1 *rto1r * gain ; > modep2 = envg * redux2 *rto2r * gain ; > > // sine oscillator > wrap(n) = n-( floor( n +0.5)) ; > qsincurve(x) = 1 - ( (x*x)<: *(1.2253517*16),(_<:*:* (-3.60562732*16)):>_ > ); > qsin(x) = x+(0.5): wrap <: (abs:-(0.25):qsincurve),_:ma.copysign; > // feedback depth reduction curve > fbcurve (x)= x:abs:-(1) <:^(3):_,(x):ma.copysign; > > // oscillator > mphasor(fw) = (+(fw) ~ (wrap)); > oscsn(fw, off) = mphasor(fw) + off:qsin:+~*(0.5); > osc1(fw, off) = ((fw),+(off):(oscsn)) ~ > (*(fbk2):fi.pole(0.5):_*fbcurve(fw)); > dcrem(x) = x <:_,_': -: +~*(0.999773243); > > // 3D > oscy(fw, off) = (osc1(fw, off )*osc1(fw*rto2+2*detune,0.75 + > off)*modep2)*modep; > oscx(fw, off) = (osc1(fw*rto1+detune,0.25 + > off)*osc1(fw*rto2+2*detune,0.25 + off)*modep2)*modep1; > oscxy(fw, off) = (oscy(fw, off)<:*),(oscx(fw, off)<:*):+:sqrt: > fi.zero(1.0);//dcrem; // > //oscxyb(fw, off) = (oscy(fw, off):fi.zero(1)) <:_,(_^2),((oscx(fw, > off):fi.zero(1):_^2)): _, (_+_):_,(_+0.1:_^(3/2)):_/_; > // with pickup > oscxyc(fw, off) = oscxy(fw, off) <:_,(_^2:_+pickd:_^(3/2)):/; > // > //synthvox(fw, ph2, ph3, g1, g2, g3) = (oscxy(fw, 0):_*g1), (oscxy(fw, > ph2):_*g2),(oscxy(fw, ph3):_*g3):>_ ; > synthvox(fw, ph2, ph3, g1, g2, g3) = (oscxyc(fw, 0):_*g1), (oscxyc(fw, > ph2):_*g2),(oscxyc(fw, ph3):_*g3):>_ ; > // triangulation > widredux = w <:+:_^3:1.0-_; > // diff to max f in octaves, reduced for higher octaves > dwo = ( 0.25 / wid ):max(_, 1): ma.log2: ma.inv: _*widredux: ma.inv; > //edge = 1/7; // falling triangle edge, > egderto = edge / wid; > wid2 = wid * (2^(dwo * (1-envg ))): > _* (2^(dwo * (1- gain ) )): > min( _, 0.25): max( _, 4 / (ma.SR/fplus)); > wid2e = edge: min( _, 0.25): max( _, 4 /(ma.SR/fplus)); > > fiw = wplus/wid2; > fiwtail = wplus/wid2e; > // triangle coefficients > apg0 = fiw; > apg1 = - apg0 - fiwtail; > apg2 = fiwtail; > // integration freq > igpole = 1.0-5.0/ma.SR; > resf = (fplus /( wid2 +wid2e) ): min( _, (0.249 * ma.SR)); > > // shaper > // x - 0.15x²-0.15x³ > tubicclip = _:min(_, (1.19419)):max(_,(-1.86086)); > //tubic(x) = x - 0.15*(x^2)-0.15*(x^3); > tubicilo(x) = x, > // normal for in < 1.2e-4 > ( x - 0.15*(x^2)-0.15*(x^3) ), > // ILO: > (( 0.5*(x^2) - 0.05*(x^3) - 0.0375*(x^4) ),(x <:_,_':- > :_<:(abs:max(_,1.2e-4)),(ma.signum):ma.copysign):/): > // select > ba.if( (_:abs:_<= 1.2e-4), _, _ ):dcrem; > // > superfbp = 1 - sin( 2 * ma.PI * w ); > > // make sound > process = synthvox(wplus, wid2, wid2e, apg0, apg1, apg2): > fi.dcblockerat(10.0): fi.pole(igpole) : fi.svf.peak( resf, fiq) <: > ba.if( hpon, fi.svf.hp( fplus/(wid+wid):min(_, ma.SR*0.249), > 0.707 ),_): > _*drive: tubicclip: tubicilo:_*(1/drive); > effect = _ * master:rev; > > // > ############################################################################################### > // CIELverb > ###################################################################################### > // minimalist reverb > // > // UI > revgrp(x) = hgroup("[5]reverb",x); > sizem = > revgrp(hslider("[1]size[style:knob]",0,-1.5,1.5,0.02)):(2.0)^_:_*16.7:si.smoo; > revt = revgrp(hslider("[2]revTime[style:knob]",60,40,80,0.1)): > ba.db2linear:_*0.001; > bright = revgrp(hslider("[4]brightness[style:knob]",90,52,112,0.1)): > ba.midikey2hz; > earlyl = revgrp(hslider("[5]early/late[style:knob]",0,0,1,0.01)); > drywet = revgrp(hslider("[6]dry/wet[style:knob]",0.5,0,1,0.01)) <:*; > > // reverb settings > // change revt with size > revtadapt = revt * ( 0.161*(sizem^3)/(6*sizem^2 )); > // diffusion delay times > revd0 = ma.SR * (sizem / 334); > revd1 = revd0 * 1 / ( 2 - log(2)); > revd2 = revd0 * 1 / ( 3 - log(2)); > revd3 = revd0 * 1 / ( 4 - log(2)); > revgn = 10^(-3*(( sizem/ 334 )/revtadapt)); > // diffusion allpass coeficients > revc = 0.707;//0.61803; // > revc1 = -revc * 10^(-3*(( revd1/ ma.SR )/revtadapt)); > revc2 = -revc * 10^(-3*(( revd2/ ma.SR )/revtadapt)); > revc3 = -revc * 10^(-3*(( revd3/ ma.SR )/revtadapt)); > // post (early) > revdp = revd3 * 1 / ( 4 - log(2)); > postd1 = revdp * 1 / ( 2 - log(2)); > postd2 = postd1 * 1 / ( 3 - log(2)); > postd3 = postd2 * 1 / ( 4 - log(2)); > postc = 0.382;//1/3;//0.61803; // > postc1 = -postc * 10^(-3*(( postd1/ ma.SR )/(revtadapt * 1 / ( 4 - > log(2))))); > postc2 = -postc * 10^(-3*(( postd2/ ma.SR )/(revtadapt * 1 / ( 4 - > log(2))))); > postc3 = -postc * 10^(-3*(( postd2/ ma.SR )/(revtadapt * 1 / ( 4 - > log(2))))); > > // left right delay time offsets > postdlroff = ma.SR * 0.15 /334 ; > > lfo1 = os.oscsin(0.13)*8.0; > apcomblp(maxdel,N,g) = (+ <: > (de.fdelay1a(maxdel,N-1.5)<:_,_':+:_*0.5),*(g)) ~ *(-g) : mem,_ : +; > // post diffusion (early reflections, placed after reverb loop) > postdiff( in ) = in <: > (apcomblp( 4096, postd1, postc1): apcomblp( 4096, postd2 + > postdlroff, postc2): apcomblp( 4096, postd3 - postdlroff*0.382, postc3)), > (apcomblp( 4096, postd1 + postdlroff, postc1) :apcomblp( > 4096, postd2 - postdlroff*0.382, postc2): apcomblp( 4096, postd3, postc3)); > > // feedback filter > dampp = sin( 2 * ma.PI * bright/ma.SR); > fidamp = _*(dampp) : +~*(1-dampp) <:_,_':+:_*0.5: *(revgn); > > > // reverb > rev = _<: +~ (apcomblp( 4096, revd1 - lfo1, revc1):apcomblp( 4096, revd2 + > lfo1, revc2): apcomblp( 4096, revd3,revc3): de.fdelay1a( 4096, revd0 > ):fidamp ),_:(_*drywet:postdiff),((_*(1-drywet))<:_,_):route(4, 4, > (1,1),(2,3),(3,2),(4,4)):>(_+_),(_+_); > > // END REVERB > ############################################################################ > > _______________________________________________ > Faudiostream-users mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/faudiostream-users >
_______________________________________________ Faudiostream-users mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/faudiostream-users
