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