How I learned to stop hating and love old electronics – or, making a servo work with a Raspberry Pi by cannibalising ancient motherboards and creative use of the CRT monitors that have been cluttering up the studio

I’m going all guns preparing my sculpture for the New Atlantis theatre show by The Enlightenment Cafe. It’s opening on 19th January at The Crystal in London, UK. Having made iceberg moulds and delivered them to the UCL ice physics laboratory, the next step is to create a hot water boiler that responds to water-related activity on Twitter.

This involves some playing with electronics…

I unwrapped my “christmas presents” from myself gleefully yesterday morning. Electronics to play with! A Raspberry Pi! Cables! A servo!!

Except not everything was there… In fact, there were no jumper cables, and there was no Raspberry Pi B+. And to make matters worse, the 7 inch screen I ordered arrived broken – crucial wires having been sliced through before it was bunged in a package and sent over to me.

cable cutter... not impressed with the ebay service
This is not a serviceable screen.

 

Woe. Woe is me.

Having fortified myself with tea, I decided to see how far we could get with an old RPi (Model A, rev 2) and the cables we already had.

Thus, I made command central. All systems go.

IMG_5450

Using one age old CRT monitor as a workbench, I used the other – normally used for video editing – as a makeshift screen. I literally lost track of how long we spent looking for cables to hook up these bad boys. Finally, hanging onto these hulking brutes of useless electronics through international relocations has paid off. Jun (my incredibly helpful other half without whom I’d not have got so far yesterday) – and his vast stores of seemingly irrelevant and outdated gear – has been vindicated.

But it’s not just Jun who hangs onto old electronics – I have been lugging old bits of redundant crap around the globe too. Including this old motherboard.

motherboard
HOW OLD? I got this baby from a skip outside my department at the University of Cambridge in 2006.

This old motherboard which was the source of the final component we needed – female adapters for my cables so we could link them up to the RPi.

Ancient tech on a shiny new RPi
Ancient tech on a shiny new RPi

Et voila!

All that remained was for me to hook everything up

IMG_5456

Rigging up the servo
Rigging up the servo

Do a bit of programming – you can find some details of how Jun and I got it working on my New Atlantis hackpad – and suddenly you have a servo getting its groove on to the tune of Twitter.

New Atlantis Sculpture – Servo dances to Twitter beats from Kat Austen on Vimeo.

“This video shows two steps in getting a servo to respond to Twitter. First, we’re rigging it up and testing its response by varying the PWM-MS values. Then we hook it up to a Node Red script that scrapes Twitter for #water and #fail at the limits of the PWM-MS values – and it’s grooving to Twitter’s beats.”

The Node Red json files for this can be found on my github repository for New Atlantis.

Finally, I’m struggling with a name for the sculpture. In a wanton fit of sentimentality and punnage I went for Melting Hearts – but I hate it. Suggestions gratefully appreciated.

Time Slides #Success and Time Slides #Fail

photo-7

The plan was to go to over to the gallery to set up at 2:30. At 2:26, after a week of late nights and frantic preparation to make Time Slides record and play back in a responsive loop, I plugged the external battery into the sound card – there was a spark, and it stopped working. A little warning LED started blinking. That was it – the audio card was dead.

Devastating.

I know the whole point about the exhibition – The Ability To Fail in Public – was to embrace the potential of failure and see it in a constructive and creative light, but having put in so much work on the project, to have achieved close to what was wanted at the outset in so short a time, and then to have it break at the last minute… that was quite a blow.

Dejected, I drew black tears on my face – the bitter tears of failure – and packed up to go.

At that point, the cavalry suggested exhibiting the defunct electronics at the show, plugged in so that the visitors could see its pathetic blinking. We decided to check to see if we could power it with the battery pack alone, so it was more portable for display. Having pulled the necessary bits together, we plugged in and lo! it worked.

Thereafter ensued a frantic 5 hours of tree climbing (to install Time Slides #Fail) and cupboard renovating (to create a novel exhibition site for Time Slides), before the first visitors showed up at the Kreuzberg Pavillion and started to engage with the work.

Time Slides and Time Slides #Fail both went down a storm tonight.

Time Slides is an interactive work reminiscent of a spider in form. It records and creates layers of sound from passers by, playing them back to create a vertical slice through time in one place. It is created as a highly intimate experience, and as with the other works in The Ability to Fail in Public, it focusses the visitor on the auditory experience – in this case using sound to create temporal distortions.

Here’s Time Slides in action:

**
Time Slides #Fail is much harder to capture on camera. It superimposes an evening in Brussels when Belgium played in the World Cup onto an evening in Berlin when Germany played, distorting time and space together to reveal the unique and similar elements of national experiences.

Installed in front of the gallery, in a tree on the square at Naunynstraße, the sounds of the busy Brussels streets, recorded just as Belgium won against Algeria in the World Cup last week, were extremely at odds with the visual stimuli of the surroundings. Passers by would look around confusedly, and the disjuncture produced had a particularly strong effect on cyclists, whose sensitivity to traffic noise is very important in addressing their vulnerability on the road.

Here’s the audio for Time Slides #Fail:

You can see some super pics of the exhibition on their facebook page of the event.

Time Slides was a great success, and Time Slides #Fail was deemed “Formidable!” by one visitor. We did, however, fail to fail.

**Edited to include media for Time Slides #Fail

Many thanks go to Claudia Mannigel, who initiated and organised the exhibition, Heiko and Alessandro from Kreuzberg Pavillion, Jun Matsushita and Sam Carlisle.

 

More Code – trying to loop and layer in ChucK

I’m still battling with ChucK. I can now record and play back in real time, but can’t loop. Record and play back in real time:

 

adc => LiSa loopme => dac;

//alloc memory

60::second => loopme.duration;

//set number of layers

10 => loopme.maxVoices;

// print get voice

<<< loopme.getVoice >>>;

//start recording input

loopme.record(1);

<<< “recording” >>>;

2000::ms => now; loopme.play(1);

2000::ms => now; loopme.play(0);

//10 sec later, stop recording //10000::ms => now;

//loopme.record(0); 500::ms => now;

 

However, looping doesn’t work and I can’t work out why because I don’t understand all the syntax in the example file… Here’s my messy attempt.

adc => Envelope e => LiSa loopme => dac;

//alloc memory
10::second => loopme.duration;
//confirm that the length of the buffer is what you expect
<<<“buffer duration = “, loopme.duration() / 44100.>>>;
//set number of layers
10 => loopme.maxVoices;
// print get voice
<<< loopme.getVoice >>>;

//440. => loopme.freq;
//0.2 => loopme.gain;

//set times for recording fade in/out and sample loop length
100::ms => dur recfadetime;
2000::ms => dur mylooplen;
e.duration(recfadetime);

//start recording input; record 2 seconds worth
loopme.record(1);
e.keyOn(); //can also do without the Envelope and use loopme.recramp(dur) to set a recording ramp
//1000::ms => dur loopme.recramp;
now + (mylooplen – recfadetime) => time later;
while(now < later) {

//    pitchmod.value() => loopme.freq;
1000::ms => now;
//2000::ms => now;
}
e.keyOff();
recfadetime => now;
loopme.record(0);

///WHY ISN’T THIS PLAYING BACK?!?!?!?!

<<< “recording” >>>;

//disconnect input and hangout a bit
loopme =< dac;
1000::ms => now;
<<< “hanging out” >>>;

//now, manipulate the sample
//    get a voicenumber; note that this voice won’t actually be reserved until you play it
loopme.getVoice() => int voice1;

<<< “getting voice number 1” >>>;

//we’ll play voice 1 forward, and then crossfade it with voice 2 backwards
loopme.play(voice1, 1);

<<< “play voice 1” >>>;
//(mylooplen – recfadetime) => now;

//just as voice 1 is going to fade, bring in voice 2
loopme.getVoice() => int voice2;
loopme.rate(voice2, 1.);
loopme.playPos(voice2, mylooplen);
//loopme.voiceGain(voice2, 0.2);
loopme.play(voice2, 1);

//wait until voice 1 had finished fading, then turn off
recfadetime => now;
loopme.play(voice1, 0);

//wait for voice 2 to finish
2000::ms => now;

//——–

////start recording input
//loopme.loopRec;
//<<< “recording” >>>;

//2000::ms => now;

//loopme.loopEndRec;

//loopme.play(1);

//2000::ms => now;

//loopme.play(0);

//10 sec later, stop recording
//10000::ms => now;
//loopme.record(0);

500::ms => now;

Adventures in RPi: programming with Chuck to trigger record depending on loudness

The flyer for our show at Kreuzberg Pavillion

Earlier this week Saturday’s exhibition, The Ability to Fail in Public, was announced. Here’s a non-permanent link to the exhibition.

I’ve been trying to programme the RPi for Time Slides – using ChucK. Somehow I managed to lose both the script I’d written and the doc I’d written detailing the script I’d written. #Fail! (how ironic)

Anyway, this is as far as I’ve got with the ChucK script, in a kind of wild mashup of some ChucK example files and a bit of wizardry (level -10)… I can now print “hello” when the mic registers a particular volume. Now I need to work out how to turn the print command into a record command (through LiSa?) and how then to play this back, and loop subsequent recordings over the top. All before Saturday. Wish me luck, I’ll need it!

—-BEGINS—-

// LiSa might be good for starting recording recording
// and then manipulating the loop
//http://chuck.cs.princeton.edu/doc/program/ugen_full.html

//start getting input from mic, something like…
adc => FFT fft =^ RMS rms => blackhole;

// split mic in ???

// if audio > loudness of X  (RMS) -> record
// set parameters – from loudness script
1024 => fft.size;
// set hann window
Windowing.hann(1024) => fft.window;

// get name
me.arg(0) => string filename;
if( filename.length() == 0 ) “foo.wav” => filename;

// control loop
while( true )
{
// upchuck: take fft then rms
rms.upchuck() @=> UAnaBlob blob;
// print out RMS
if( blob.fval(0) > 0.001 ) {

<<< “hello” >>>;
}
// advance time
fft.size()::samp => now;
}

// play recorded sound on loop

//.channels – (int, READ only) – the number channels on the UGen

//Zero crossing detector. Emits a pulse lasting a single sample at the the zero crossing in the direction of the zero crossing.
//(see examples/zerox.ck)
//this is useful if you want to make it loop without a glitch

—–ENDS—–

In terms of Time Slides #Fail, I managed to get some super recordings last night of Brussels after Belgium won against Portugal in the World Cup. Awesome timing.

Experiments in #Fail -ure

SoundWork

I have the pleasure of exhibiting next week at the Kreuzberg Pavillion in a show curated by the amazing Claudia Mannigel – called The Ability to #Fail in Public – (**edit /15:41/ – the title was inspired by my post, not the overall sensory concept for the exhibition which is all Claudia’s, who has been very visionary in the creation of the show ** inspired somewhat by my earlier post Are You Happy to #Fail in Public?)

For the exhibition, I’m aiming to make a site-specific work that plays off the location of the gallery on the quiet square on Naunynstraße in Berlin by recording and playing back sound in real time. But there’s very little time to make the piece – especially as I have to dash off to work in Brussels on something else all week – and I am trying to use a Raspberry Pi for the first time in a sound installation. All in all, it’s rather ambitious – although quite comparable to the level of ambition for all the projects we thought of for the exhibition – and I’ve had to put in place quite a few contingency plans in case I can’t pull it off. Hence the title of the show!

So, in order to try to get this show on the road, I have got myself an audio card for the RPi and have got some way with setting it up. Then things got way too complicated for me at 11pm last night and I had to call in the cavalry. This morning, we have got this far – with the help of Claudia’s speakers – we can play mp3s through the sound card with real time processing (technical bits to follow) at a volume loud enough for an outside installation. I may even manage to exhibit without needing a mains power line thanks to a new piece of kit I got – a lovely battery thingy that can power speakers and the RPi.

With me leaving tomorrow evening, #success is by no means certain… but hope springs eternal.