master
margreetriphagen 8 years ago
commit e79f4b7d28

2
.gitignore vendored

@ -47,7 +47,7 @@
!/etc/rc.local
!/floppies/
/floppies/*/
#/floppies/*/
!/usr/
/usr/*

Binary file not shown.

Binary file not shown.

@ -1 +1,8 @@
FLOPPYLEFT - 2017
MOTIONS - 2017
Copyright <2017> <FRANCISCO GONZALEZ>
You may do anything with this work that copyright law would normally
restrict, so long as you retain the above notice(s) and this license
in all redistributed copies and derived works. There is no warranty.

@ -1,7 +1,27 @@
Author: Slavoj Žižek
Date: 1989
Title: The Sublime Object of Floppy
Author: Francisco González
Date: 2017
Title: Motions
Description:
And so on, and so on, and so on.
This experiment analyses and measures data from peoples motion and explores how we humans become an extension of technology, adapting ourselves to immaterial environments by seeking information-control, performing sounds.
CONCEPT
Technology is providing us new ways to shape our perception of space, while at the same time it is transforming our bodies into gadgets. This is not only changing our spatial awareness but its also extending our senses beyond given nature. Moreover, control systems that regulate and command specific behaviours can be very practical tools to improve physical functionalities or translate its data. For instance, this experiment employs “Optical Flow” sensor which detects motion from image objects between frames, and “Open Sound Control (OSC)” which enables to exchange and format data from different devices, for instance, from Python to Puredata. Although the unique possibilities to improving human physical or cognitive limitations by plugging a body to an electronic or mechanical device are yet very hypothetical and might extend beyond our imagination, nevertheless technology is continuously transforming the abstract or fictional conception of “cybernetics” to a more realistic evidence. The communication between both automated and living systems is continuously evolving, upgrading and rising up more sophisticated engineered tools that might enable us to increase our knowledge, morphing our perception through deeper experiences.
In this experiment, the potential for controlling data through motion on space while becoming independent of physicality, opens up new creative and pragmatic alternatives for facing both technological and communication constraints.
BODY
This body analyses human motion on space and detects it using “Opitcal Flow” in “Python”, using a series of predesigned multidirectional interpreters. These interpreters are made up of a series of points (intersections), forming a grid which intersects with movement. This is detected in form of numeric values, which are automatically transmitted and formatted to a graphic array in Puredata.
This array arrange these values and generates a polygonal waveform based on these received coordinates (which numbers ranges between "x", having values from 0 to 10, and "y" from -1 to 1). This activates an “oscillator” object which defines the frequency of the tone, together with “metro” object, which time spans its duration in miliseconds, consequently iterating the audio (re-writting it in the display).
The intersections and the graphic array (together with the entire Puredata patch) become an interactive notation system, while people become the instrument/tool that triggers it.
WORK PROGRESS
By exploring the connection between motion and sound, experiments have been performed through different software and tools, which has substantially strengthen the following additional material in this project. For instance, Kinect sensor and Synapse, which receives input data from Kinect and sends it out to Ableton or Max MSP, have been tested out. Similarly, motion detection was together explored with “color detection” in Puredata, which brought up more interesting alternatives. Sound recording and feedback loop was further tested with this method, though mechanically it was hardly accurate. Finally with “Optical Flow”, this work was reconfigured with a wider sense for interacting with data.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -1,120 +1,58 @@
#N canvas 457 24 739 687 10;
#X declare -lib net;
#N canvas 553 37 553 723 10;
#X declare -lib unpackOSC;
#X text -22 232 #ikstem;
#X text 55 233 #gestemd;
#X obj -69 492 dac~;
#X obj -37 134 unpack s s s;
#X obj 441 -2 loadbang;
#X msg 441 31 \; pd dsp 1;
#X obj 191 64 udpreceive 127.0.0.1 4000;
#X text 160 318 comment;
#X obj 157 254 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
#X obj 34 92 unpackOSC;
#X text 360 432 attack;
#X text 431 433 release;
#X obj 362 569 line~;
#X obj 179 589 *~;
#X obj 361 452 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
-1;
#X obj 89 254 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
#X obj 435 455 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
-1;
#X text 45 133 tag \, hashtag \, time;
#X obj -3 162 select #ikstem #gestemd both;
#X obj 0 252 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
-1;
#N canvas 692 710 276 254 ikstemenv 0;
#X obj 72 80 line~;
#X msg 81 45 0 50;
#X msg 72 -15 1 1;
#X text 99 -13 1 msec attack;
#X text 118 44 50 msec release;
#X obj 88 15 del 10;
#X obj 72 -44 inlet;
#X obj 25 170 outlet~;
#X obj 25 -45 inlet~;
#X obj 25 146 *~;
#X text 134 14 10 msec sustain;
#X connect 0 0 9 1;
#X connect 1 0 0 0;
#X connect 2 0 0 0;
#X connect 5 0 1 0;
#X connect 6 0 2 0;
#X connect 8 0 9 0;
#X connect 9 0 7 0;
#X restore -69 344 pd ikstemenv;
#X text -16 289 comment;
#N canvas 692 710 276 254 bothenv 0;
#X obj 72 80 line~;
#X obj 72 -44 inlet;
#X obj 25 170 outlet~;
#X obj 25 -45 inlet~;
#X obj 25 146 *~;
#X text 137 44 5 second release;
#X text 114 -14 500 msec attack;
#X msg 72 -15 1 50;
#X obj 88 15 del 100;
#X text 144 15 100 msec sustain;
#X msg 81 45 0 2000;
#X connect 0 0 4 1;
#X connect 1 0 7 0;
#X connect 3 0 4 0;
#X connect 4 0 2 0;
#X connect 7 0 0 0;
#X connect 8 0 10 0;
#X connect 10 0 0 0;
#X restore 100 344 pd bothenv;
#X obj 100 467 snapshot~;
#X obj 112 435 metro 100;
#X floatatom 100 493 0 0 0 0 - - -;
#N canvas 692 710 276 254 gestemdenv 0;
#X obj 72 80 line~;
#X text 99 -13 1 msec attack;
#X text 118 44 50 msec release;
#X obj 72 -44 inlet;
#X obj 25 170 outlet~;
#X obj 25 -45 inlet~;
#X obj 25 146 *~;
#X text 134 14 10 msec sustain;
#X msg 81 45 0 700;
#X obj 88 15 del 100;
#X msg 72 -15 1 10;
#X connect 0 0 6 1;
#X connect 3 0 10 0;
#X connect 5 0 6 0;
#X connect 6 0 4 0;
#X connect 8 0 0 0;
#X connect 9 0 8 0;
#X connect 10 0 0 0;
#X restore 14 344 pd gestemdenv;
#X obj 125 409 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
1;
#X text -69 250 triggers;
#X text 142 233 both;
#X text 146 410 monitor output on/off;
#X text 190 45 normally \, this should suffice:;
#X obj 101 286 osc~ 150;
#X obj -69 286 osc~ 7000;
#X obj 14 286 osc~ 500;
#X text 174 296 sinewaves envelopes (triggered by incoming OSC) double
click pd ..env objects to change envelopes;
#X obj -34 16 import net;
#X obj -38 -30 import unpackOSC;
#X obj 184 90 unpackOSC;
#X connect 3 1 11 0;
#X connect 4 0 5 0;
#X connect 6 0 31 0;
#X connect 8 0 15 1;
#X connect 9 0 19 1;
#X connect 11 0 12 0;
#X connect 11 1 9 0;
#X connect 11 2 8 0;
#X connect 12 0 13 1;
#X connect 13 0 2 0;
#X connect 13 0 2 1;
#X connect 15 0 16 0;
#X connect 15 0 2 0;
#X connect 15 0 2 1;
#X connect 16 0 18 0;
#X connect 17 0 16 0;
#X connect 19 0 2 0;
#X connect 19 0 2 1;
#X connect 20 0 17 0;
#X connect 25 0 15 0;
#X connect 26 0 13 0;
#X connect 27 0 19 0;
#X connect 31 0 3 0;
#X msg 371 480 stop;
#X text 70 455 #ikstem;
#X text 188 454 #gestemd;
#X obj 179 685 dac~;
#X obj 34 142 unpack s s s;
#X obj 19 243 print;
#X obj 133 345 select #ikstem both;
#X text 264 345 #gestemd;
#X obj 175 539 osc~ 450;
#X obj 361 503 del 50;
#X msg 432 526 0 250;
#X msg 296 503 30 30;
#X obj 476 483 del 50;
#X msg 361 527 1 500;
#X msg 195 477 400;
#X msg 68 480 150;
#X obj 212 198 loadbang;
#X obj 364 23 import unpackOSC;
#X msg 211 244 \; pd dsp 1;
#X text 16 34 comment;
#X text 176 446 comment;
#X obj 34 48 mrpeach/udpreceive 127.0.0.1 4000;
#X connect 0 0 11 0;
#X connect 3 0 4 1;
#X connect 4 0 10 0;
#X connect 5 0 18 0;
#X connect 5 0 16 0;
#X connect 5 0 19 0;
#X connect 6 0 17 0;
#X connect 6 0 7 0;
#X connect 7 0 16 0;
#X connect 11 1 12 0;
#X connect 11 1 13 0;
#X connect 11 2 12 0;
#X connect 13 0 22 0;
#X connect 13 0 5 0;
#X connect 13 1 21 0;
#X connect 13 1 5 0;
#X connect 15 0 4 0;
#X connect 16 0 20 0;
#X connect 17 0 3 0;
#X connect 18 0 3 0;
#X connect 19 0 17 0;
#X connect 20 0 3 0;
#X connect 21 0 15 0;
#X connect 22 0 15 0;
#X connect 28 0 0 0;

@ -17,8 +17,8 @@ msg.setAddress("/twitter-ikstem")
#msg.append('hello from python')
#client.send(msg)
os.system('xzcat /media/floppy/twittersonification.csv.xz > /tmp/twittersonification.csv') #floppydisk
#os.system('xzcat twittersonification.csv.xz > /tmp/twittersonification.csv') #lokaal
#os.system('xzcat /media/floppy/twittersonification.csv.xz > /tmp/twittersonification.csv') #floppydisk
os.system('xzcat twittersonification.csv.xz > /tmp/twittersonification.csv') #lokaal

@ -0,0 +1 @@
FLOPPYLEFT - 2017

@ -0,0 +1,7 @@
Author: Slavoj Žižek
Date: 1989
Title: The Sublime Object of Floppy
Description:
And so on, and so on, and so on.

File diff suppressed because it is too large Load Diff

@ -0,0 +1,79 @@
#!/usr/bin/env python
import OSC
import multiprocessing, time
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
pin_pairs = [[14,15], [23,24], [1,7]]
# OSC
client = OSC.OSCClient()
address = '127.0.0.1', 3000 # 57120==SC
client.connect( address ) # set the address for all following messages
oscOne = OSC.OSCMessage() # OSCresponder name: '/touch_one'
oscTwo = OSC.OSCMessage() # OSCresponder name: '/touch_two'
oscThree = OSC.OSCMessage() # OSCresponder name: '/touch_three'
oscOne.setAddress("/touch_one")
oscTwo.setAddress("/touch_two")
oscThree.setAddress("/touch_three")
print client
def osc_msg(pinpair, val):
pinindex = pin_pairs.index(pinpair)
if pinindex == 0:
oscOne.append( val )
print oscOne
client.send(oscOne)
oscOne.clearData()
elif pinindex == 1:
oscTwo.append( val )
print oscTwo
client.send(oscTwo)
oscTwo.clearData()
elif pinindex == 2:
oscThree.append( val )
print oscThree
client.send(oscThree)
oscThree.clearData()
def discharge(a_pin, b_pin):
GPIO.setup(a_pin, GPIO.IN)
GPIO.setup(b_pin, GPIO.OUT)
GPIO.output(b_pin, False)
time.sleep(0.005)
def charge_time(a_pin, b_pin):
GPIO.setup(b_pin, GPIO.IN)
GPIO.setup(a_pin, GPIO.OUT)
count = 0
GPIO.output(a_pin, True)
while not GPIO.input(b_pin):
count = count + 1
return count
def analog_read(pin_pair):
discharge(pin_pair[0],pin_pair[1])
return charge_time(pin_pair[0],pin_pair[1])
def worker(pair):
"""thread worker function"""
while True:
reading = analog_read( pair ) #print(analog_read())
osc_msg(pair, reading)
time.sleep(0.1)
return
if __name__ == '__main__':
jobs = []
for i in range(len(pin_pairs)):
p = multiprocessing.Process(target=worker, args=(pin_pairs[i],))
jobs.append(p)
p.start()

@ -0,0 +1,6 @@
@font-face { font-family: "Genome"; src: url(../fonts/Genome-Thin.otf);}
body { background: #1F1F1F; color: #EEE; font-family: Genome, sans-serif; font-weight: 100; color: #DDD; }
p { margin: 0 0 70px; }
#defaultCanvas0 { display: block !important; margin: 5em auto ; }
#header { margin: 30px 0px 0px; }
.text { display: block; margin: 0 50px; font-size: 3em; font-weight: 100 !important; }

@ -0,0 +1,27 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Euclid</title>
<link rel="stylesheet" type="text/css" href="css/style.css">
<script type="text/javascript" src="js/p5.min.js"></script>
<script type="text/javascript" src="js/p5.svg.js"></script>
<script type="text/javascript" src="./js/euclidScore.js"></script>
</head>
<body>
<content class="text">
<object id="header" data="svgs/euclid.svg" type="image/svg+xml">
<h1>euclid</h1>
</object>
<p>To play, touch the metal contacts, connecting them. The more conductive you are, the more you will be able to affect the instrument.</p>
<p>The state of your composition is recorded, and displayed here as a downloadable score.</p>
<p>Never to be played, nor heard again.</p>
</content>
</body>
</html>

@ -0,0 +1,82 @@
// TODO: SAVE ON CLICK
var left, right, genLight, score
var el1 = [], el2 = [], scrVals = []
function preload() {
// left = loadSVG('../svgs/leftHand.svg')
// right = loadSVG('../svgs/rightHand.svg')
genLight = loadFont("fonts/Gen-Light.otf");
score = loadStrings('../score/score.txt')
for (var i = 0; i < 8; i++) {
el1.push( loadSVG('../svgs/el.' + int(random(1, 12)) + '.svg') )
el2.push( loadSVG('../svgs/el.' + int(random(1, 12)) + '.svg') )
}
}
function setup() {
createCanvas(800, 1200, SVG)
textFont(genLight)
// frameRate(1)
noLoop()
fill(220)
textSize(150)
textAlign('right')
}
function draw() {
background('#151515')
fill("#DDDDDD")
for (var i = 0; i < score.length; i++) {
var line = split(score[i].slice(0, -1), ' ')
text(line.join(" "), 90, 150 + (i*90), 710)
scrVals.push(line)
}
stroke('#FFCC00')
fill('#FFCC00')
// left.attribute('fill', 'none')
// right.attribute('fill', 'none')
// left.attribute('stroke', '#FFCC00')
// right.attribute('stroke', '#FFCC00')
// image(right, 0, 0, 600, 600)
for (var i = 0; i < el1.length; i++) {
var r = random(5)
var rVal = int(scrVals[int(random(scrVals.length))][int(random(7))])
var coin = int(random(2))
rVal = map(rVal, 0, 127, 0, width)
el1[i].attribute('fill', 'none')
el2[i].attribute('fill', 'none')
el1[i].attribute('stroke', '#FFCC00')
el2[i].attribute('stroke', '#FFCC00')
image(el1[i], 120 + rVal, (height/el1.length)*(i)+30, 75 + r, 75 + r)
image(el2[i], 15, (height/el1.length)*(i)+30, 75, 75)
if (coin) {
var coin2 = int(random(2))
if (coin2) {
ellipse(120 + rVal, (height/el1.length)*(i)+45, 30 + r, 30 + r)
} else {
ellipse(51, (height/el1.length)*(i)+55, 30, 30)
}
}
}
}
function saveMe() {
save()
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

@ -0,0 +1,7 @@
r4 16 7 0;
r4 18 6 0;
r3 18 7 0;
r2 9 2 0;
r1 7 8 0;
melody 51 43 34 26 37 43 33;
bass 73 75 74 86 87 70 86;

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 34.92 38.25"><title>Artboard 12</title><polyline class="a" points="34.55 0.5 1.12 0.5 34.55 37.91"/></svg>

After

Width:  |  Height:  |  Size: 159 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 37.41 38.25"><title>Artboard 21 copy</title><line class="a" x1="37.41" y1="19.04" y2="19.04"/></svg>

After

Width:  |  Height:  |  Size: 153 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 34.92 38.25"><title>Artboard 21</title><line class="a" x1="17.6" y1="0.33" x2="17.6" y2="37.75"/></svg>

After

Width:  |  Height:  |  Size: 156 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 34.92 38.25"><title>Artboard 13</title><polyline class="a" points="0.37 0.5 33.8 0.5 0.37 37.91"/></svg>

After

Width:  |  Height:  |  Size: 157 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 38.41 38.41"><title>Artboard 14</title><circle class="a" cx="19.21" cy="19.21" r="18.71"/></svg>

After

Width:  |  Height:  |  Size: 149 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 34.92 38.25"><title>Artboard 15</title><polyline class="a" points="0.37 37.74 33.8 37.74 0.37 0.33"/></svg>

After

Width:  |  Height:  |  Size: 160 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 34.92 38.25"><title>Artboard 16</title><polyline class="a" points="34.55 37.74 1.12 37.74 34.55 0.33"/></svg>

After

Width:  |  Height:  |  Size: 162 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 38.25 34.92"><title>Artboard 17</title><polyline class="a" points="37.74 34.55 37.74 1.12 0.33 34.55"/></svg>

After

Width:  |  Height:  |  Size: 162 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 38.25 34.92"><title>Artboard 18</title><polyline class="a" points="0.5 34.55 0.5 1.12 37.91 34.55"/></svg>

After

Width:  |  Height:  |  Size: 159 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 38.25 34.92"><title>Artboard 19</title><polyline class="a" points="37.74 0.37 37.74 33.8 0.33 0.37"/></svg>

After

Width:  |  Height:  |  Size: 160 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 38.25 34.92"><title>Artboard 20</title><polyline class="a" points="0.5 0.37 0.5 33.8 37.91 0.37"/></svg>

After

Width:  |  Height:  |  Size: 157 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 616.67 179" style="stroke: #FFCC00; fill: none; stroke-width: 2;"><title>Artboard 4 copy</title><polyline class="a" points="112 130 28 130 70 83 28 36 112 36"/><polyline class="a" points="373.11 130 289.11 130 373.11 36"/><line class="a" x1="487.78" y1="36" x2="487.78" y2="129.98"/><line class="a" x1="435.56" y1="36" x2="435.56" y2="129.98"/><line class="a" x1="127.44" y1="83" x2="221.44" y2="83"/><line class="a" x1="278.89" y1="36" x2="278.89" y2="130"/><circle class="a" cx="122.22" cy="83" r="47"/><circle class="a" cx="226.67" cy="83" r="47"/><circle class="a" cx="383.33" cy="83" r="47"/><circle class="a" cx="540" cy="83" r="47"/></svg>

After

Width:  |  Height:  |  Size: 699 B

@ -0,0 +1,10 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 317.7 395">
<g>
<path id="path3680" class="cls-1" d="M7.55,348.93,87.64,205.28l6.87-92.09,16.93-27.34"/>
<path id="path3684" class="cls-1" d="M101.39,143.43l15.12-86.6-4.12-41.24"/>
<path id="path3686" class="cls-1" d="M112.38,15.59h0l4.81-11.68,18.21,6.53,13.4,45.7-1.72,110,10.53,39.23-7.78,38.88"/><path id="path3688" class="cls-1" d="M148.81,56.14l41.52-34L248.65,1.7,260.31,7l-1,16L199.56,53.7l-37.42,54.92,3.59,7.7"/>
<path id="path3690" class="cls-1" d="M173.66,91.71l40.73-40.2,67.31-29.4,13.73,5.38-1.09,16L228.24,80.42l-37.91,57.35,2.38,13.48"/>
<path id="path3692" class="cls-1" d="M191.09,144.76l43.14-45.39L292,69.14l11,4.12-2.75,15.81L248,125.49,214.3,175l2.75,7.56,33.28-25,55.53-27.07,8.25,3.44.8,13.22-87.35,58.82-42.34,83.79-22.6,12.11-29.11,82.49"/>
<path id="path3694" class="cls-1" d="M163.11,301.9,147,295.23"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 940 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 329.88 393.19"><path id="path3680" class="cls-1" d="M221.35,98.42l9,18.18,14.15,94.49,78.65,109.19"/><path id="path3684" class="cls-1" d="M204.71,10.24,209,28l4.61,38.64,7.71,31.73"/><path id="path3686" class="cls-1" d="M179.41,227.45l-4.51-42.2,9.08-42,.21-59.83L178,39.52l1.94-28.59,13-8.49,11.77,7.79h0"/><path id="path3688" class="cls-1" d="M159.16,114.84l3.14-8.73L120.71,54.93,59.84,26.55l-1.56-16L69.74,4.79l59,18.24L181.7,65.8"/><path id="path3690" class="cls-1" d="M133.67,152.19,133,138.61,90.22,84.49,22.81,50l.42-14.8,12.51-4.74L108.85,60l51.55,51.37"/><path id="path3692" class="cls-1" d="M214.63,383.36l-42-84.64L150.5,288,99.76,211.59,71.33,188.53l-32.74-19.3-31.16-12L6.8,143.82l8.11-3.74,58.42,20.57,34.18,23.76,2.47-7.66-38.3-46.42L15.3,99.55,12,83.86l10.84-4.53,61.65,24.4,49,43.16"/><path id="path3694" class="cls-1" d="M181.23,294.79l-8.58,3.93"/></svg>

After

Width:  |  Height:  |  Size: 927 B

Loading…
Cancel
Save