feedback in sound
Till Bovermann
See below for starting points to implement the described feedback systems, mainly in SuperCollider.
Basics Link to heading
The laptop-internal microphone can be used to create a feedback loop through the internal speakers while shaping the sound with your hands. Moving your hands in front of the speakers, creating various shapes, and playing with the internal volume control reveals a surprising amount of complexity in the sonic capabilities of this simple feedback instrument.
Apart from the resulting multitude of sounds and manipulation possibilities this simple experimental setup has to offer, it also opens up the possibility to learn about the internal workings of the sounding system: the capabilities of the speakers, the microphone, the laptop as a resonating body, the hands, the positions of all components to each other. All of these components influence the sonic capabilities of this simple feedback instrument.
This setup also reveals that my current laptop1 features a (software?)-based filter that radically shapes the input sound depending on the current signal in an otherwise transparent way.
The ready-to-hand-ness of the system gets disturbed by the feedback system. One might argue that Heideggers assumption of the exclusiveness2 of ready-to-hand and present-at-hand disintegrates when dealing with feedback systems.
Extending feedback systems — shifting levels of abstraction Link to heading
The introduction of abstraction layers in feedback systems can be a powerful method to extend their sonic capabilities, as well as to gain insights into the inner workings of dynamic systems. For example, already the introduction of a (crude) frequency follower followed by a simple resynthesis of the input signal based on the perceived frequency adds a new layer of abstraction to the feedback system: There are two levels of interpretation possible:
- human-centered — a feature of the incoming signal (pitch) is extracted from the system’s output and subsequently used to re-synthesise the input signal.
- system-centered — an algorithm is applied to the incoming signal that calculates the number of zero-crossings per second. The resulting stream of numbers are used to determine the frequency of a sine wave generator.
Assuming a black-box perspective, i.e. the performer does not know the inner workings of the system, the feedback system appears as a complex system that reacts to the input signal in a way that is not directly comprehensible. However, it is possible to learn about the system by observing its behaviour and by interacting with it.
Adding more elements to the abstraction shifting part of the feedback system extents the system’s sonic capabilities and thus its perceived complexity.
Preventing the obvious Link to heading
Within a feedback system, the first resonance to appear wins on top of the others, i.e. after an initial indeterministic phase, the system starts to fall into a deterministic state in which only one frequency is audible. Most of the times, this is the first fundamental frequency of the system.
This most prominent resonance is what can be called the trivial resonance of the system. From an aesthetic as well as a research point of view, other resonances might be of more interest; in fact, the dominant resonance of a mostly linear system does not offer a lot of insights.
It is possible to tweak the feedback system to prevent the obvious to happen by adding one or more of the following elements to the circuit:
- locate the first obvious resonances and introduce one or more band-reject filters with their center frequencies on the prominent resonances,
- add a variable time delay controlled by the measured amplitude of the output signal,
- add a frequency shifter to the system,
- add a limiter to the system
While the first strategy may be considered the least invasive one since it only makes use of time-invariant, linear FIR filters, it does require additional knowledge about the system under investigation —namely its resonant frequencies. The second method constantly analyses the signal for a resonance to appear (assumed to make itself noticed by means of a rudimentary amplitude follower) and pushes the system out of its resonance by adjusting the length of the (possibly digital) round-trip time the signal travels within the feedback system.
Example: Half-closed loop Link to heading
Half-closed loop is an example for a more advanced feedback instrument. It incorporates sound-forming components like limiter, reverb and delay as well as harmonic distortion. Its central element, the black-box feedback system, is a brass tube that contains a tensioned string, inaccessibly to the performer. The performer can only interact with the system by moving the tube on a wooden board with attached audio transducers.
Implementation starting points Link to heading
The following code snippets provide starting points to implement the above-described feedback systems in SuperCollider, Max/MSP, and Ableton Live.
Ndef(\inFeedback, {
// capture the sound of the first input and play it
// back through both internal speakers
SoundIn.ar(0)!2;
}).play;
in Max/MSP (also pd) or Ableton Live:
Adding limiters to the feedback system in SuperCollider using the AGC2.1 limiter in a feedback context (also on sccode):
(
Ndef(\a).addSpec(\inAmp0, [0, 1]);
Ndef(\a).addSpec(\inAmp1, [0, 1]);
Ndef(\a).addSpec(\honig, [0.01, 10, \exp]);
Ndef(\a).addSpec(\honigDel, [0, 0.1, \lin]);
Ndef(\a).addSpec(\ampHonig, [0.01, 10, \exp]);
Ndef(\a).addSpec(\dyndB, [-5, 0, \lin]);
Ndef(\a, {
var modScale = 1; // dyn
var limit = \limit.kr(1);
var snd = SoundIn.ar([0, 1]) * [\inAmp0.kr(1),\inAmp1.kr(1)];
var inAmp = Amplitude.ar(snd);
//////////////////
// AGC2.1 ( a limiter)
var rms500 = RMS.ar(snd, 500);
var rms1 = RMS.ar(snd, 10) * 2;
var analytics = max(rms500 - rms1, 0) + rms1;
// limiting
snd = (
DelayL.ar(snd, 0.02, 0.5 * 0.02) / max(analytics / limit, 0.125)
).clip2(1);
snd = snd * LFDNoise3.kr(\ampHonig.kr(0.1)).range(\dyndB.kr(-3), 0).dbamp;
snd = FreqShift.ar(snd, inAmp * 5);
snd = SelectX.ar((inAmp * 2).tanh, [
snd,
LFTri.ar(inAmp * 20) * snd
]).sum!2;
///// AdC
// DelayL.ar(snd, 0.1, snd.collect{
// LFDNoise3.kr(\honig.kr(0.1)).range(0, \honigDel.kr(0.02))
// }).tanh
})
)
Shifting levels of abstraction in SuperCollider:
Ndef(\listenAndInterpret, {
var in = SoundIn.ar(0);
var perceivedFreq = ZeroCrossing.ar(in);
// do something with perceivedFreq and perceivedAmp
var snd = SinOsc.ar(perceivedFreq);
// add a delay of one second to add some time between the input and the resynthesis
DelayL.ar(snd, 1, 1);
})
Adding more elements to the abstraction shifting part of the feedback system extents the system’s sonic capabilities and thus its perceived complexity.
Ndef(\listenAndInterpret, {
var in = SoundIn.ar(0);
var perceivedFreq = ZeroCrossings.ar(in);
var perceivedAmp = Amplitude.kr(in);
// do something with perceivedFreq and perceivedAmp
var snd = SinOsc.ar(perceivedFreq, 0, perceivedAmp);
// add some delay to prevent the feedback to happen immediately
DelayL.ar(snd, 1, 1);
})
-
MacBook Pro, 14-inch, 2021 running macOS Ventura 13.6.3 ↩︎
-
According to Heidegger, present-at-hand and ready-to-hand are mutually exclusive, discrete states, i.e. we neither are able to perceive an object as both at the same time, nor are we able to perceive an object in a mixture of the two. See Heidegger (1927): Sein und Zeit. ↩︎