Difference between revisions of "FaustWorkshop2014"

From CCRMA Wiki
Jump to: navigation, search
(Day 3)
(Day 4)
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 21:07, 10 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);