The Composed Instrument Workshop took place at CCRMA between 07/18 and 07/22 2016. Participants used their phones as the audio synthesis unit of a hybrid musical instrument. Using our custom Faust based iOS framework, students connected digital synthesis parameters to the available sensors embedded on mobile platforms (touch screen, accelerometers, gyroscope, etc.). To craft coherence between the musical interaction and the physical form of the device, participants also designed bespoke phone cases using OpenScad. These musical prosthetics augmented the chosen interaction, and reinforce the sound with passive waveguides. The course combined digital audio synthesis (Faust), basic mobile phone programming, 3D modeling (using OpenScad) and 3D printing. Students left the workshop with a musical phone case, tailored to their digital musical instrument.
WARNING: This course was designed for Mac computers only. If you don't have a Mac, you wont be able to follow it.
This page will be updated with the examples studied during the lecture.
To try out the different examples given in this handout, you must have
FaustLive and a proper
text editor like TextWrangler
(available on the app store) installed on your system. To install
FaustLive
, you must follow the instructions given in
the installation package.
If you want to learn more about Faust, visit the Faust website or checkout the 2016 CCRMA Faust Workshop and the 2015 CCRMA Faust Online Course.
The simplest Faust program must at least contain the process
line:
process = _;
The program above will just connect the default mono input to the default mono output of your system (the microphone and the speaker on your smartphone).
To gain access to the different Faust libraries and their various functions, import
stdfaust.lib
:
import("stdfaust.lib");
To add controllable parameters to your Faust object, you must create user interface (UI) elements.
For continuous parameters, use the hslider
primitive and for discreet parameters, use
the button
primitive:
import("stdfaust.lib");
freq = hslider("freq",200,50,2000,0.01);
gate = button("gate");
process = os.osc(freq)*gate;
This section gives an overview of the most widely used Faust functions. To be used as such,
stdfaust.lib
must be imported (as described above). This is only the tip of the
iceberg and stdfaust.lib
gives access to hundreds of functions. To get an exhaustive
list, check the
Faust libraries documentation.
Function Name | Description |
---|---|
os.osc(freq) |
Default sine wave oscillator where freq is the frequency of the generated
wave. |
os.sawtooth(freq) |
Default sawtooth wave oscillator where freq is the frequency of the generated
wave. |
os.triangle(freq) |
Default triangle wave oscillator where freq is the frequency of the generated
wave. |
os.square(freq) |
Default square wave oscillator where freq is the frequency of the generated
wave. |
os.imptrain(freq) |
Default impulse train generator where freq is the frequency of the generated
wave. |
no.noise |
Default noise generator. |
Function Name | Description |
---|---|
en.ar(a,r,t) |
Attack/Release envelope generator: triggers release right after the attack without
sustain. a is the attack time is second, r is the release
time is second and t is the trigger signal (0-1) controllable using
the button UI element. The output signal of this function can be multiplied
to any signal to control its gain. |
en.asr(a,s,r,t) |
Attack/Sustain/Release envelope generator. Release is triggered whenever
t=0 .
a is the attack time is second, s is the sustain gain as
a percentage of t , r is the release
time is second and t is the trigger signal (0-1) controllable using
the button UI element. The output signal of this function can be multiplied
to any signal to control its gain. |
en.adsr(a,d,s,r,t) |
Attack/Decay/Sustain/Release envelope generator. Release is triggered whenever
t=0 .
a is the attack time in second, d is the decay time in second,
s is the sustain gain as
a percentage of t , r is the release
time is second and t is the trigger signal (0-1) controllable using
the button UI element. The output signal of this function can be multiplied
to any signal to control its gain. |
t : si.smooth(ba.tau2pole(ar)) |
smooth can be used as an exponential envelope generator. t
is the trigger signal (0-1) controllable using the button UI element and
ar is the attack and release time in second. The output signal of this
function can be multiplied to any signal to control its gain. |
Function Name | Description |
---|---|
fi.resonlp(freq,q,gain) |
Resonant lowpass filter where freq is the resonance frequency,
q is the quality and gain the gain. |
fi.resonbp(freq,q,gain) |
Resonant bandpass filter where freq is the resonance frequency,
q is the quality and gain the gain. |
fi.resonhp(freq,q,gain) |
Resonant highpass filter where freq is the resonance frequency,
q is the quality and gain the gain. |
fi.resonhp(freq,q,gain) |
Resonant highpass filter where freq is the resonance frequency,
q is the quality and gain the gain. |
fi.fb_fcomb(maxdel,del,b0,aN) |
Feedback comb filter where maxdel is the maximum delay (a power of 2)
intdel the current (integer) comb-filter delay between 0 and
maxdel , del the current (float) comb-filter delay between 0
and maxdel , b0 the gain applied to delay-line input and forwarded
to output, aN the minus the gain applied to delay-line output before summing
with the input and feeding to the delay line. |
Function Name | Description |
---|---|
os.lf_trianglepos(freq) |
Low frequency triangle wave oscillator with positive output (0-1) where
freq is the frequency of the generated wave. |
os.lf_squarewavepos(freq) |
Low frequency square wave oscillator with positive output (0-1) where
freq is the frequency of the generated wave. |
os.lf_pulsetrainpos(freq) |
Low frequency pulsetrain generator with positive output (0-1) where
freq is the frequency of the generated wave. |
os.osc(freq) |
Default sine wave oscillator where freq is the frequency of the generated
wave. Can be used safely as low frequency oscillator. |
Function Name | Description |
---|---|
si.smooth(ba.tau2pole(t)) |
Smoothing function with controllable interpolation time where
t is the interpolation time in second. |
si.polySmooth(g,ba.tau2pole(t),n) |
Smoothing function with controllable interpolation time that doesn't smooth
when a trigger signal is sent. This is very useful when making polyphonic synths
to make sure that the value of the parameter is the right one when the note is started.
g is the trigger signal (gate ), t is the
interpolation time in second and n is the number of samples to wait before
smoothing after the trigger signal was sent. |
si.smoo |
Standard smoothing function equivalent to si.smooth(0.999). |
an.amp_follower(t) |
Amplitude following function (takes an audio signal as an input and output
a signal usable to control any kind of parameter) where t is the interpolation
time is second (a typical value for it can be 0.1). |