Related to a thread in the JUCE forum, Stéphane Letz asked me to post my Faust Cod here in the mailing list.

I'm afraid, it's a bit messy and not documented at all, but i hope, you can get it. Compiled as a jack or alsa standalone, i works pretty fine.

It's an fx bank for messing up input signals (for example a drum loop or whatever).

Here is the code:

declare name "t_glitch";

declare version "1.0";
declare author "toxonic";
declare copyright "(c) toxonic 2019";

import("stdfaust.lib");

// global_tempo
tempo = vslider("h:T_Glitch/v:[0]GLOBAL/[0]bpm",120,50,200,0.1):/(60,_);

// t_reverser
reverserLen =vslider("h:T_Glitch/v:[1]REVERSE/[1]length[style:radio{'2 beats': 2 ;'1 beat':4 ;'1/2 beat':8 ;'1/4 beat':16 ;'1/8 beat':32 ;'1/16 beat':64}]", 8, 1, 64, 1):/(4,_):*(ma.SR):*(tempo):si.smoo;
reverserTrig = button("h:T_Glitch/v:[1]REVERSE/[2]reverser");
wxReverser = +(reverserTrig==0)~_:-(reverserTrig):int:&(131071);
rxReverser(len_reverser) = (wxReverser-(+(reverserTrig)~(int:%(len_reverser:max(100):int):*(reverserTrig)):-(reverserTrig)))<: select2(<(0),_,131072+_); reverser(reverserIn) = rwtable(131072,0.0,wxReverser:int,reverserIn,rxReverser(reverserLen):int):select2(reverserTrig,reverserIn,_);

// t_stutter
stutLen = vslider("h:T_Glitch/v:[2]STUTTER/[1]length[style:radio{'2 beats': 2 ;'1 beat':4 ;'1/2 beat':8 ;'1/4 beat':16 ;'1/8 beat':32 ;'1/16 beat':64}]",  8, 1, 64, 1):/(4,_)*(ma.SR):*(tempo):si.smoo;
stutTrig = button("h:T_Glitch/v:[2]STUTTER/[2]stutter");
stutRX(stutLen,fb) = (+(stutTrig)~(_*stutTrig):int:%(min(131072,fb:stutSampHold(stutLen)):max(10):int)):mem:int;
stutWX = +(stutTrig)~(_*stutTrig):min(131072):-(1):int;
stutSampHold(in,ramp) = (*((ramp>0)) + in * (ramp<=0)) ~_ ;
stutter(in) = select2(stutTrig,in,rwtable(131072,0.0,stutWX,in,(stutRX(stutLen)~_) ));

// t_gater
gtrPW = vslider("h:T_Glitch/v:[3]GATER/h:/v:/[1]pw[style:knob]",0.5,0,1,0.1):si.smoo; // pulsewith gtrAmt = vslider("h:T_Glitch/v:[3]GATER/h:/v:/[2]gap[style:knob]",1,0,1,0.01):si.smoo; //gap amplitude gtrSmth = vslider("h:T_Glitch/v:[3]GATER/h:/v:/[3]smooth[style:knob]",1,0,10,0.01):si.smoo; //smooth gating gtrLenSlider = vslider("h:T_Glitch/v:[3]GATER/h:/[0]speed[style:radio{'1 beat':1 ;'1/2 beat':2 ;'1/4 beat':4 ;'1/8 beat':8 ;'1/16 beat':16}]", 8, 1, 64, 1);
gtrTrig = button("h:T_Glitch/v:[3]GATER/[4]gater"); //trigger

gtrLen=gtrLenSlider:/(1,_):*(ma.SR):*(tempo):si.smoo; //speed in samples
gtrPhasor(len) = +(1)~(%(len):*(gtrTrig)):-(1); // wrap count 0-len
gtrPWLen=*(gtrLen,gtrPW); //pw length in samples
gtrSqrOsc=<(gtrPhasor(gtrLen),gtrPWLen); //squarewave osc 0-1
gtrAmpCentr=*(gtrAmt,_):+(1-gtrAmt); //keep Amplitude Center at 0.5
gtrSmooth=fi.lowpass(1,-( *(gtrLenSlider,10) , *(gtrSmth,gtrLenSlider) ) ); //smooth squarewave
gatingFunction(len) = gtrSqrOsc : gtrAmpCentr:gtrSmooth; //gating function
gater(in) = select2(gtrTrig, in, gatingFunction(gtrLen)*in);

// t_grain
grnSize = vslider("h:T_Glitch/v:[4]GRAIN/h:/[0]chunk", 1500, 1, 10000, 1):int:si.smoo; grnPitch = vslider("h:T_Glitch/v:[4]GRAIN/h:/[1]pitch", 65, -120, 120,1):si.smoo;
grnTrig = button("h:T_Glitch/v:[4]GRAIN/[2]grain");
grnWrap_r1(x) = select2(>(x,1),x,0);
grnRamp1 = +(/(grnFreq,ma.SR):abs)~grnWrap_r1:grnSign;
grnSign(x)=select2(==(grnFreq:abs,grnFreq),x,1-x);
grnFreq = *((pow(2,grnPitch/120)-1),(ma.SR/grnSize));
grnRamp2 = grnRamp1+0.5:grnWrap_r2;
grnWindow = -(0.5)*(0.5)*(2*ma.PI):cos;
grnWrap_r2(x) = select2(>(x,1),x,x-1);
grnRange = min(20000):max(1);
grain(grnIn) = select2(grnTrig, grnIn, @(grnIn, grnRamp1*grnSize:grnRange)*(grnRamp1:grnWindow) + @(grnIn, (grnRamp2*grnSize):grnRange)*(grnRamp2:grnWindow));

// t_lofi
lofiTrig = button("h:T_Glitch/v:[5]LOFI/[2]lofi");
lofiDeci = vslider("h:T_Glitch/v:[5]LOFI/h:/[0]deci", 5, 1, 50, 1):si.smoo;
lofiBit = vslider("h:T_Glitch/v:[5]LOFI/h:/[1]bit", 32,8,64,1):si.smoo;
lofiRamp = +(1)~%(lofiDeci:max(2):int):-(1);
lofiHold = &((lofiRamp'==0), (lofiRamp>0));
lofiDecimator(in) = (*(1 - lofiHold) + in * lofiHold) ~_;
lofiBitRed(in) = *(in,lofiBit):int/lofiBit;
lofi(in1)=lofiDecimator(in1):lofiBitRed:select2(lofiTrig, in1,_);

// t_tapestop
tapeInertia = vslider("h:T_Glitch/v:[6]TAPE/[0]inertia",2,0.5,3,0.01):si.smoo; // slow down frequency
tapeTrig = button("h:T_Glitch/v:[6]TAPE/[1]tape_stop"); // trigger effect
tapeRX = +(1*decr)~*(tapeTrig); // readposition main function
decr = +((1/ma.SR)*tapeInertia)~(min(1):*(tapeTrig)):-(1,_):*(tapeTrig); // decrease stepsize to zero
tapeWX = +(1)~(min(65535):*(tapeTrig)):-(1):int;
tapeFract = tapeRX-(tapeRX:int);
tapeTableOne(in) = rwtable(65536,0.0,tapeWX,in,tapeRX:int)*(1-tapeFract);
tapeTableTwo(in) = rwtable(65536,0.0,tapeWX,in,tapeRX+1:int)*(tapeFract);
tapeStop(in) = tapeTableOne(in)+tapeTableTwo(in):select2(tapeTrig,in,_);

process = _,_:sp.stereoize(reverser):sp.stereoize(stutter):sp.stereoize(gater):sp.stereoize(grain):sp.stereoize(lofi):sp.stereoize(tapeStop):_,_;
_______________________________________________
Faudiostream-users mailing list
Faudiostream-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/faudiostream-users

Reply via email to