Show at Electropixel #6

Setting up at Les Ateliers de Bitche in Nantes for Electropixel. After creating a clean floorspace, I look for two anchors in the space to connect the cocoon to. I find them in one pillar, and the foot of a set of seats that won't really be used during the evening. I spend way more time than expected to get the cocoon back into shape - I guess it needs practice. Once I succeed, I set up the lights around it and the rest of the equipment.

(note to self: I need 2 a longer cables for the DMX to make the connections a bit more easy to make.)

After discussing with Julien, we decide that the performance will be at the start of the evening - the first show of the night. I prepare the last things, test the systems and crawl inside the cocoon. I entangle myself within the white cloth inside and lie down and put myself in a restful state. Then I activate the physical model again and let the sound fade in. I make subtle, slow movements with my body; and at some points during the performance I shift my weight to roll onto my side and stomach, and back; trying to let the weight of my limbs guide me in the movement. With the white cloth covering my face, my own perception is also changed - which helps me to concentrate on the movement. The intensive reaction of the sound and light when I move a lot, bring me to then stop my movement and quiet down again.

I have remote control to start and stop the physical model and fade in and out the sound, using the Twiddler - at least, that is the plan. The start works fine, but when I want to fade out at some point, I find out that the connection is lost, as I did not use the Twiddler for too long.

(note to self: I need to check the timeout on the connection of the Twiddler - I believe there was a setting for it. Otherwise I will need to change the way I control this.)

So I cannot stop the performance by letting the system get to rest and then fade out - I will have to crawl out of the cocoon and end the performance like that.

Once I am out, I look back at the cocoon for a while, and then move to the computer to fade out the sound. I have no sense of time, of how long I have been in there - how long the performance lasted; the recordings that I got afterwards tell me it was about 15 minutes. According to feedback I get from some of the audience, I could have stretched it out a lot longer.

Personally, I feel excited - not just from performing a piece for the first time, but also from the experience inside the cocoon itself - the change in concentration and focus from everyday life, the altering of the sensation of the body.

The audience has been watching attentively, and seems excited judging from the applause I get, and the reactions later on during the evening.

The rest of the evening, I leave the cocoon in the space as an installation - the light is still reacting to movement of the cocoon - and occasionally the bass of the other performances are so loud that they create slight movements of the cocoon. Those who did not see the performance, see the installation as a curious object in the space.

(Photos 6 to 10 made by APO33).

Sat, 20 August, 2016

More interaction - sound design (day 4 at APO33)

With the basic mapping from the pulling on the stretch sensors, I find that I need something more to detect the micro-movements that are happening, to create more movement within the wavetable sound. As I also have acceloremeters available on the sensor nodes - I use these; I use a mean value of the acceleration, and map this to another force that acts on the nodes in the physical model. The mapping is done in such a way, that it slowly rises to a maximum amount, and then recedes again: so little movement can have much impact up to a certain level - but then the influence will be gone again if movement gets too intense. To do this, I use the class SegWarp from the wslib quark.

The deviation in position of the nodes from their mean position is then used to detune the wavetable synthesis.

Mapping from acceleration to forces on the nodes

~accDevSpec = SegWarp( Env([0,1,0], [0.005,0.03], [-5,-7] ) );

~travForceMap = [1e-3, 1.0, \exponential].asSpec;

// radial forces go to (7,9), (4,5), (1,2)
// so traversal forces should go somewhere else

x.addExpected( 151, \travForce1, 3 );
x.addExpected( 152, \travForce2, 3 );
x.addExpected( 153, \travForce3, 3 );

x.nodes[141].action = { |data| x.setData(151, ( data.sign * ~travForceMap.map( ~accDevSpec.map( data.abs ) ) ) ) };
x.nodes[142].action = { |data| x.setData(152, ( data.sign * ~travForceMap.map( ~accDevSpec.map( data.abs ) ) ) ) };
x.nodes[143].action = { |data| x.setData(153, ( data.sign * ~travForceMap.map( ~accDevSpec.map( data.abs ) ) ) ) };

x.at( \travForce1 ).slots[0].action = { |data| ~physics.setParticleTraversalForce( 8, 1, data ); };
x.at( \travForce1 ).slots[1].action = { |data| ~physics.setParticleTraversalForce( 9, 8, data ); };
x.at( \travForce1 ).slots[2].action = { |data| ~physics.setParticleTraversalForce( 7, 5, data ); };

x.at( \travForce2 ).slots[0].action = { |data| ~physics.setParticleTraversalForce( 4, 0, data ); };
x.at( \travForce2 ).slots[1].action = { |data| ~physics.setParticleTraversalForce( 5, 7, data ); };
x.at( \travForce2 ).slots[2].action = { |data| ~physics.setParticleTraversalForce( 6, 4, data )  };

x.at( \travForce3 ).slots[0].action = { |data| ~physics.setParticleTraversalForce( 0, 9, data ); };
x.at( \travForce3 ).slots[1].action = { |data| ~physics.setParticleTraversalForce( 1, 6, data ); };
x.at( \travForce3 ).slots[2].action = { |data| ~physics.setParticleTraversalForce( 2, 3, data ); };

Mapping from deviation to detuning frequencies

~dposFSpec = [0.01,1,\exponential].asSpec;
~dfreqSpec = [0.001,0.35,\exponential].asSpec;

// at each update:
10.do{ |jt, j|
    var dpos = 10.collect{ |it|
        (~physics.getParticleParameter( jt, it, \position ) - ~restParticlePositions[jt][it]).collect{ |a| a*a }.sum;
    };
    ~wavetables[j].setn( \dfreq, dpos.specMap( ~dposFSpec, ~dfreqSpec ) );
};

Adjusted wavetable synth

SynthDef( \wavetable, {
    var bufSelect = Linen.kr( \gate.kr(1), \fade.kr(0.25), 1, \fade.kr );
    var signal = VOsc.ar( 
        \bufnum.kr(0) + bufSelect, 
        \freq.kr(500).lag( \flag.kr(5) ) * (1 + \dfreq.kr( [0,0,0,0,0 ,0,0,0,0,0] ).lag( \dlag.kr(0.05) ) ),
        \phase.kr(0) 
    );
    Out.ar( \out.kr(0), Pan2.ar( signal, \pos.kr(0), \amp.kr(0.1) ) );
}).add;
Thu, 18 August, 2016
RSS Feed