FaustWorkshop2014: Difference between revisions
Line 334: | Line 334: | ||
process = *(gain) : +(offset) : clip(-1,1) : cubic : dcblocker; | process = *(gain) : +(offset) : clip(-1,1) : cubic : dcblocker; | ||
</pre> | |||
=== Resonant Bandpass Filter === | |||
<pre style="white-space: pre-wrap; | |||
white-space: -moz-pre-wrap; | |||
white-space: -pre-wrap; | |||
white-space: -o-pre-wrap; | |||
word-wrap: break-word;"> | |||
import("filter.lib"); | |||
ctFreq = hslider("ctFreq",400,50,2000,0.01) : smooth(0.999); | |||
BW = hslider("Bandwidth",100,1,1000,1) : smooth(0.999); | |||
Q = ctFreq/BW; | |||
process = noise : resonbp(ctFreq,Q,1); | |||
</pre> | |||
=== Parametric Equalizer === | |||
<pre style="white-space: pre-wrap; | |||
white-space: -moz-pre-wrap; | |||
white-space: -pre-wrap; | |||
white-space: -o-pre-wrap; | |||
word-wrap: break-word;"> | |||
import("filter.lib"); | |||
import("effect.lib"); | |||
bandsNumber = 10; | |||
highestBand = 15000; | |||
oneBand(cnt) = vgroup("Band %cnt",peak_eq(Lfx,fx,B)) | |||
with{ | |||
Lfx = vslider("Level",0,-60,10,0.1); | |||
fx = nentry("Freq",highestBand*(cnt+1)/bandsNumber,40,highestBand,0.1); | |||
B = hslider("Bdwth [style: knob]",100,1,5000,0.1); | |||
}; | |||
bp = checkbox("Bypass"); | |||
process = hgroup("Parametric Equalizer",bypass1(bp,seq(i,bandsNumber,oneBand(i)))); | |||
</pre> | |||
=== Vocoder === | |||
<pre style="white-space: pre-wrap; | |||
white-space: -moz-pre-wrap; | |||
white-space: -pre-wrap; | |||
white-space: -o-pre-wrap; | |||
word-wrap: break-word;"> | |||
import("filter.lib"); | |||
import("effect.lib"); | |||
import("oscillator.lib"); | |||
oneVocoderBand(band,nBands,bwRatio,bandGain) = resonbp(bandFreq,bandQ,bandGain) | |||
with{ | |||
bandFreq = 25*pow(2,(band+1)*(9/nBands)); | |||
BW = (bandFreq - 25*pow(2,band*9/nBands))*bwRatio; | |||
bandQ = bandFreq/BW; | |||
}; | |||
vocoder(nBands,att,rel,bwRatio,source,excitation) = source <: par(i,nBands,oneVocoderBand(i,nBands,bwRatio,1) : amp_follower_ud(att,rel) : _,excitation : oneVocoderBand(i,nBands,bwRatio)) :> _; | |||
vocoder_demo = _,lf_imptrain(freq)*gain : vocoder(bands,att,rel,bwRatio) | |||
with{ | |||
bands = 64; | |||
vocoderGroup(x) = vgroup("Vocoder Params",x); | |||
att = vocoderGroup(hslider("[0]Attack [style: knob]",5,0.1,100,0.1)*0.001); | |||
rel = vocoderGroup(hslider("[1]Release [style: knob]",5,0.1,100,0.1)*0.001); | |||
bwRatio = vocoderGroup(hslider("[2]BW [style: knob]",0.5,0.1,2,0.001)); | |||
excitGroup(x) = vgroup("Excitation Params",x); | |||
freq = excitGroup(hslider("Freq [style: knob]",330,50,2000,0.1)); | |||
gain = excitGroup(vslider("Gain",0.5,0,1,0.01) : smooth(0.999)); | |||
}; | |||
process = hgroup("Vocoder",vocoder_demo); | |||
</pre> | </pre> |
Revision as of 04:07, 11 July 2014
Day 1
Optional textbook to go further: http://www.amazon.com/Physical-Audio-Signal-Processing-Instruments/dp/0974560723
Simple Gain Controller
import("filter.lib"); process = *(hslider("gain",0.5,0,1,0.01)) : smooth(0.999);
Simple Sine Oscillator Synthesizer
import("music.lib"); import("filter.lib"); g = hslider("myParameter",0,0,1,0.01); freq = hslider("frequency",440,50,1000,0.1); myOsc(frequency,gain) = osc(frequency)*(smoothGain) with{ // the smooth(0.999) function interpolates the different values of gain so that it doesn't click smoothGain = gain : smooth(0.999); }; process = myOsc(freq,g) ;
Working with Signals
process = _ <: _,_,_,_ :> _;
is the same as:
process = _ <: _+_+_+_;
Simple Panner
import("filter.lib"); // the metadata "[style:knob]" turns the horizontal slider into a knob pan = hslider("pan [style:knob]",0.5,0,1,0.01) : smooth(0.999); process = _ <: *(pan),*(1-pan);
Additive Synthesizer
import("music.lib"); import("effect.lib"); gain = hslider("gain",0,0,1,0.01) : smooth(0.999); freq = hslider("freq",440,50,1000,0.1) : smooth(0.999); // the smooth function can be used as a simple envelope generator for gate gate = button("gate") : smooth(0.999); process = osc(freq),osc(freq*2),osc(freq*3) :> *(gain)*gate <: _,_;
The last line of the code can be replaced by:
process = par(i,3,osc(freq*(i+1))) :> *(gain)*gate <: _,_;
or
process = sum(i,3,osc(freq*(i+1))) : *(gain)*gate <: _,_;
Day 2
Wave Shape Synthesis
saw1(freq) // Sawtooth wave lf_imptrain(freq) // Impulse train lf_squarewave(freq) // Square wave
Tremolo and Ring Modulation
https://ccrma.stanford.edu/~jos/rbeats/Sinusoidal_Amplitude_Modulation_AM.html
import("filter.lib"); freq = hslider("freq",2,1,500,0.01); gain = hslider("gain",1,0,1,0.01) : smooth(0.999); depth = hslider("depth",0,0,1,0.01) : smooth(0.999); ringMod = *(1-(depth*osc(freq)/2 + 0.5)); process = ringMod*gain <: _,_;
Stereo Ring Modulator
import("filter.lib"); freq = hslider("freq",2,1,500,0.01); gain = hslider("gain",1,0,1,0.01) : smooth(0.999); depth = hslider("depth",0,0,1,0.01) : smooth(0.999); pan = 1-(depth*osc(freq)/2 + 0.5); stereoRingMod = _ <: *(pan),*(1-pan); process = stereoRingMod : *(gain), *(gain);
Delay
One sample delay:
_';
N samples delay:
_@N;
Fractional delay:
fdelay1(MaxDelayLength, delayLength)
The Simplest Lowpass/Highpass Filter
https://ccrma.stanford.edu/~jos/filters/One_Zero.html
import("filter.lib"); import("music.lib"); b1 = hslider("feedforward",0,-1,1,0.01) : smooth(0.999); filter = _ <: _+(_' : *(b1)) : *(0.5); process = noise : filter;
Feedforward Comb Filter
https://ccrma.stanford.edu/~jos/pasp/Feedforward_Comb_Filters.html
import("filter.lib"); import("music.lib"); b = hslider("feedforward",0,-1,1,0.01) : smooth(0.999); del = hslider("del",1,1,100,1); filter = _ <: _+(_@del : *(b)) : *(0.5); process = noise : filter;
Flanger
https://ccrma.stanford.edu/~jos/pasp/Flanging.html
import("music.lib"); import("filter.lib"); flangeDelay = hslider("flangeDelay",0.05,0.001,1,0.001)*SR*0.001; depth = hslider("depth",0.5,-1,1,0.01) : smooth(0.999); speed = hslider("speed",0.5,0.1,20,0.01); gain = hslider("gain",0.8,0,1,0.01) : smooth(0.999); myFlanger = _ <: _,fdelay1(1024,delayLength)*depth : + : *(0.5) with{ delayLength = flangeDelay*(1 + osc(speed))/2; }; process = myFlanger*gain;
Day 3
Flanger with Advanced Interface
This interface is in no way better than the previous one. It just demonstrates what elements can be used to improve a simple Faust UI.
import("music.lib"); import("filter.lib"); flangeDelay = hslider("[0]Flange Delay [tooltip: This is the flanger delay] [unit: ms] [style: knob]",0.05,0.001,1,0.001)*SR*0.001; depth = hslider("[1]Depth",0.5,-1,1,0.01) : smooth(0.999); speed = hslider("[2]Speed",0.5,0.1,20,0.01); gain = hslider("[3]Gain",0.8,0,1,0.01) : smooth(0.999); myFlanger = _ <: _,fdelay1(1024,delayLength)*depth : + : *(0.5) with{ delayLength = flangeDelay*(1 + osc(speed))/2; }; process = vgroup("My Flanger",hgroup("[1]Flanger Parameters",myFlanger)*hgroup("[0]Gain",gain));
Echo
import("music.lib"); import("filter.lib"); delayDuration = hslider("duration",1,0.01,1,0.01); // in seconds feedback = hslider("feedback",0,0,0.99,0.01) : smooth(0.999); delayLength = SR*delayDuration; process = (+ : fdelay(SR,delayLength)) ~ *(feedback);
Feedback Comb Filter
https://ccrma.stanford.edu/~jos/pasp/Feedback_Comb_Filters.html
import("music.lib"); import("filter.lib"); delayLength = hslider("delayLength",1,0,1000,1); // in samples feedback = hslider("feedback",0,0,0.99,0.01) : smooth(0.999); process = (+ : fdelay(1024,delayLength)) ~ *(-feedback);
Karplus Strong
A simple string physical model. An average filter is used to attenuate high frequencies faster than low frequencies.
https://ccrma.stanford.edu/~jos/pasp/Karplus_Strong_Algorithm.html
import("filter.lib"); import("music.lib"); freq = hslider("freq",440,50,1000,0.1); feedback = hslider("feedback",0,0,0.999,0.001); string = + ~ (fdelay(1024,delayLength) : *(feedback) : filter) with{ delayLength = SR/freq; filter = _ <: (_+_')/2; }; impulse = button("gate") <: _,_' : - : >(0); process = impulse : string;
Day 4
Cubic Distortion
https://ccrma.stanford.edu/realsimple/faust_strings/Cubic_Nonlinear_Distortion.html
import("filter.lib"); drive = hslider("Drive",0,0,1,0.01) : smooth(tau2pole(0.1)); offset = hslider("Offset",0,-1,1,0.01) : smooth(0.999); gain = pow(10.0,2*drive); clip(lo,hi) = min(hi) : max(lo); cubic = _ <: _ - _*_*_/3; process = *(gain) : +(offset) : clip(-1,1) : cubic : dcblocker;
Resonant Bandpass Filter
import("filter.lib"); ctFreq = hslider("ctFreq",400,50,2000,0.01) : smooth(0.999); BW = hslider("Bandwidth",100,1,1000,1) : smooth(0.999); Q = ctFreq/BW; process = noise : resonbp(ctFreq,Q,1);
Parametric Equalizer
import("filter.lib"); import("effect.lib"); bandsNumber = 10; highestBand = 15000; oneBand(cnt) = vgroup("Band %cnt",peak_eq(Lfx,fx,B)) with{ Lfx = vslider("Level",0,-60,10,0.1); fx = nentry("Freq",highestBand*(cnt+1)/bandsNumber,40,highestBand,0.1); B = hslider("Bdwth [style: knob]",100,1,5000,0.1); }; bp = checkbox("Bypass"); process = hgroup("Parametric Equalizer",bypass1(bp,seq(i,bandsNumber,oneBand(i))));
Vocoder
import("filter.lib"); import("effect.lib"); import("oscillator.lib"); oneVocoderBand(band,nBands,bwRatio,bandGain) = resonbp(bandFreq,bandQ,bandGain) with{ bandFreq = 25*pow(2,(band+1)*(9/nBands)); BW = (bandFreq - 25*pow(2,band*9/nBands))*bwRatio; bandQ = bandFreq/BW; }; vocoder(nBands,att,rel,bwRatio,source,excitation) = source <: par(i,nBands,oneVocoderBand(i,nBands,bwRatio,1) : amp_follower_ud(att,rel) : _,excitation : oneVocoderBand(i,nBands,bwRatio)) :> _; vocoder_demo = _,lf_imptrain(freq)*gain : vocoder(bands,att,rel,bwRatio) with{ bands = 64; vocoderGroup(x) = vgroup("Vocoder Params",x); att = vocoderGroup(hslider("[0]Attack [style: knob]",5,0.1,100,0.1)*0.001); rel = vocoderGroup(hslider("[1]Release [style: knob]",5,0.1,100,0.1)*0.001); bwRatio = vocoderGroup(hslider("[2]BW [style: knob]",0.5,0.1,2,0.001)); excitGroup(x) = vgroup("Excitation Params",x); freq = excitGroup(hslider("Freq [style: knob]",330,50,2000,0.1)); gain = excitGroup(vslider("Gain",0.5,0,1,0.01) : smooth(0.999)); }; process = hgroup("Vocoder",vocoder_demo);