First Investigations Into the Sonic Character of Raw Materials


02 March 2011

This is now my second project that I will make public. I think that I already got so much nice feedback on the storyboard (which, of course, will be continued) that I decided to open also other research fields to the public.

Recently, I made a first experiment to investigate the characteristics of (in this case physical) materials regarding sound production, alteration, feedback. As a first material, I chose aluminum foil which I combined with a contact microphone and speakers (a primary satellites speaker, echoing speakers, and a sub). This is meant to be a very first impression of how feedback can unveil special characteristics of raw material, a technique that I plan to develop further and try to utilize this to represent digital material in a physical form. I know, this sounds very vague, but I will try to come up with a more conceptual post in the next few days. For now, as in the storyboard project, any feedback is welcome.

Hardware

A piece of aluminum foil of a size of about 30x300cm hung with a fairly simple construction from the ceiling. The contact microphone (AKG C411) was attached somewhere in the upper half of the foil. The speaker where placed in the middle of the foil facing towards it.

Additional speakers (three plus sub) where distributed in the space to add some reverberation, respectively bass.

Software

My sound rendering and processing language of choice is SuperCollider. For this first experiment, I decided to use ProxyChains (a JITLib addon for plugging filters by AdC).

Some filters, meant for global usage:

ProxyChain.add(
	ampFin, filter -> {
		|in, limDrive=1, ampLimit=0.8, postAmp=1 |
		Limiter.ar(in * limDrive, ampLimit) * postAmp;
	},
	krush, filter -> {|in, bits=16, downsamp=2|
		var down;
		in = in.round(0.5 ** bits);
		down = Latch.ar(
			in,
			Impulse.ar(SampleRate.ir / downsamp.max(2))
		); 

		// below 1/2 downsamp, do xfade:
		blend(in, down, (downsamp - 1).clip(0, 1));
	},
	verb,  filter -> {|in, rTime = 1|
		AdCVerb.ar(in, rTime, nOuts: 8)
	}
);

// Specs for the filters
Spec.add(wet, [0, 1]);

// krush
Spec.add(bits, [16, 1]);
Spec.add(downsamp, [1, 100, exp]);

// ampFin
Spec.add(limDrive, ampx4);
Spec.add(ampLimit, amp);
Spec.add(postAmp, ampx4);

// verb
Spec.add(rTime, [0, 10, lin]);

Add the filters

NdefMixer(s);
q = ();
(
q.masterEfx = MasterFX.new(server: s,
	numChannels: 8,
	slotNames: [krush, verb, ampFin],
	busIndex: 0);

q.masterEfxGUI = q.masterEfx.gui;

q.masterEfx.pxChain.add(verb, 0.1)
)

Get sound from the contact microphone and add a resonating high-pass filter

(
Ndef(alu, {|freq = 100, rq = 0.1|
	var src = SoundIn.ar(0);

	src = (RHPF.ar(src, freq, rq) + src) * 0.5;
})
)

Play the alu

Ndef(alu).playN([4], vol: 0.5); // plays on the fourth speaker

Some intial parameters, might be nice for a start

Ndef('master').set(
	'rTime', 2.9,
	'ampLimit', 0.667,
	'postAmp', 0.48,
	'limDrive', 0.71,
	'bits', 10.13,
	'wet20', 0.0,
	'wet30', 0.0,
	'downsamp', 2.49,
	'fadeTime', 7.0,
	'wet10', 1.0
);

Ndef('alu').set(
	'freq', 2320,
	'rq', 0.2
);

Automation for the downsampling parameter of the krusher

Ndef(lfo, {SinOsc.kr(0.25).range(0, 100)});
Ndef(master).map(downsamp, Ndef(lfo));

Experiment to induce oscillations into the feedback loop

Ndef(aluTrig, {|t_trig, lfFreq|
	var trig = t_trig + Impulse.ar(lfFreq);
	var freq = Demand.ar(trig-0.1, 0, Dwhite(10, 1000, inf));

	SinOsc.ar(freq) * EnvGen.ar(Env.perc(0, 0.1), gate: trig)
})