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.

NOTE: these pictures are very high def so it might take a while for them to load up...

Final Projects

Teaser Video

Online Lectures

Sound Synthesis Basics Using the Faust Programming Language: Handout

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;

Faust Cheat Sheet

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.

Oscillators/Sound Generators

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.

Envelope Generators

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.

Filters

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.

LFOs

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.

Other Functions

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).