fine-line folder changed location

master
UDI-ME-TA 8 years ago
commit 933ab5b1d6

30
.gitignore vendored

@ -1,6 +1,10 @@
/* /*
!.gitignore !.gitignore
!/boot
/boot/*
!/boot/config.txt
!/etc !/etc
/etc/* /etc/*
@ -12,23 +16,47 @@
!/etc/asound.state !/etc/asound.state
!/etc/default/
/etc/default/*
!/etc/default/hostapd
!/etc/dnsmasq.conf
!/etc/fstab
!/etc/group
!/etc/hostapd/
/etc/hostapd/*
!/etc/hostapd/hostapd.conf
!/etc/hostname !/etc/hostname
!/etc/modprobe.d/ !/etc/modprobe.d/
/etc/modprobe.d/* /etc/modprobe.d/*
!/etc/modprobe.d/alsa-base.conf !/etc/modprobe.d/alsa-base.conf
!/etc/modules
!/etc/network/
/etc/network/*
!/etc/network/interfaces
!/etc/nginx/sites-available/ !/etc/nginx/sites-available/
!/etc/rc.local !/etc/rc.local
!/floppies/ !/floppies/
/floppies/*/ #/floppies/*/
!/usr/ !/usr/
/usr/* /usr/*
!/usr/local/ !/usr/local/
/usr/local/* /usr/local/*
!/usr/local/lib/
/usr/local/lib/*
!/usr/local/lib/pd-externals/
!/usr/local/lib/python2.7/
!/usr/local/sbin/ !/usr/local/sbin/
/usr/local/sbin/*/ /usr/local/sbin/*/

@ -0,0 +1,2 @@
gpu_mem=16
start_x=1

@ -0,0 +1,20 @@
# Defaults for hostapd initscript
#
# See /usr/share/doc/hostapd/README.Debian for information about alternative
# methods of managing hostapd.
#
# Uncomment and set DAEMON_CONF to the absolute path of a hostapd configuration
# file and hostapd will be started during system boot. An example configuration
# file can be found at /usr/share/doc/hostapd/examples/hostapd.conf.gz
#
DAEMON_CONF="/etc/hostapd/hostapd.conf"
# Additional daemon options to be appended to hostapd command:-
# -d show more debug messages (-dd for even more)
# -K include key data in debug messages
# -t include timestamps in some debug messages
#
# Note that -B (daemon mode) and -P (pidfile) options are automatically
# configured by the init.d script and must not be added to DAEMON_OPTS.
#
#DAEMON_OPTS=""

@ -0,0 +1,4 @@
interface=wlan0
dhcp-range=10.10.10.11,10.10.10.254,12h
address=/#/10.10.10.10
no-resolv

@ -0,0 +1,4 @@
/dev/mmcblk0p1 /boot vfat defaults 0 2
/dev/mmcblk0p2 / ext4 errors=remount-ro,noatime,nodiratime,commit=120 0 1
/dev/sda /media/floppy vfat noauto
tmpfs /tmp tmpfs defaults,nodev,nosuid 0 0

@ -0,0 +1,50 @@
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mail:x:8:
news:x:9:
uucp:x:10:
man:x:12:
proxy:x:13:
kmem:x:15:
dialout:x:20:
fax:x:21:
voice:x:22:
cdrom:x:24:
floppy:x:25:
tape:x:26:
sudo:x:27:
audio:x:29:www-data
dip:x:30:
www-data:x:33:
backup:x:34:
operator:x:37:
list:x:38:
irc:x:39:
src:x:40:
gnats:x:41:
shadow:x:42:
utmp:x:43:
video:x:44:
sasl:x:45:
plugdev:x:46:
staff:x:50:
games:x:60:
users:x:100:
nogroup:x:65534:
input:x:101:
systemd-journal:x:102:
systemd-timesync:x:103:
systemd-network:x:104:
systemd-resolve:x:105:
systemd-bus-proxy:x:106:
crontab:x:107:
messagebus:x:108:
ntp:x:109:
netdev:x:110:
ssh:x:111:

@ -0,0 +1,6 @@
interface=wlan0
driver=nl80211
ssid=TGC #3
hw_mode=g
channel=6

@ -0,0 +1,7 @@
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
#snd-bcm2835
snd-pcm-oss

@ -0,0 +1,10 @@
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
auto wlan0
iface wlan0 inet static
address 10.10.10.10
netmask 255.255.255.0

@ -11,6 +11,8 @@ server {
error_page 404 /404-floppy-not-found.html; error_page 404 /404-floppy-not-found.html;
add_header Cache-Control no-cache;
location = /404-floppy-not-found.html { location = /404-floppy-not-found.html {
root /var/www/static; root /var/www/static;
internal; internal;

@ -11,10 +11,17 @@
# #
# By default this script does nothing. # By default this script does nothing.
/usr/bin/printf " My IP address is\033[0;31m `/sbin/ifconfig | grep "inet addr" | grep -v "127.0.0.1" | awk '{ print $2 }' | awk -F: '{ print $2 }'` \033[0m\n" > /dev/console # TGC #3
# first line is just to buy some time to avoid text mixing up with other messages
echo "" | toilet -f ascii12 -w 100 --metal > /dev/console
echo "TETRA\nGAMMA\nCIRCULAIRE\n #3" | toilet -f ascii12 -w 100 --metal > /dev/console
/usr/bin/printf "\033[0;31m`/sbin/ifconfig | grep "inet addr" | grep -v "127.0.0.1" | awk '{ print $2 }' | awk -F: '{ print $2 }'` \033[0m\n" > /dev/console
echo "" > /dev/console
# Restore audio levels # Restore audio levels
alsactl --file /etc/asound.state restore alsactl --file /etc/asound.state restore
# Magnum Innominandum!!!!!!!!!
/usr/local/sbin/thewhispererindarkness.sh > /dev/console &
exit 0 exit 0

@ -1 +1,5 @@
FLOPPYLEFT - 2017 Copyright 2017 Kimmy Spreeuwenberg
You may do anything with this work that copyright law would normally
restrict, so long as you retain this license in all redistributed
copies and derived works. There is no warranty.

@ -1,135 +0,0 @@
#N canvas 166 23 912 793 10;
#X obj 98 109 adc~;
#X obj 167 267 tabwrite~ noise;
#X obj 98 131 +~;
#X msg 209 208 bang;
#X obj 214 136 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
1;
#X obj 161 361 tabread4~ noise;
#X obj 154 696 dac~;
#X obj 161 334 *~ 88200;
#X obj 198 170 metro 2000;
#N canvas 0 22 450 278 (subpatch) 0;
#X array noise 88200 float 2;
#X coords 0 1 88200 -1 200 140 1 0 0;
#X restore 428 114 graph;
#X obj 313 193 env~;
#X floatatom 369 228 5 0 0 0 - - -, f 5;
#X obj 161 302 phasor~ 0.5;
#X obj 175 525 +~;
#X floatatom 306 267 5 0 0 0 - - -, f 5;
#X obj 132 240 *~;
#X obj 274 322 line~;
#X obj 393 306 env~;
#X obj 318 499 line~;
#X floatatom 497 321 5 0 0 0 - - -, f 5;
#X floatatom 280 453 5 0 0 0 - - -, f 5;
#X obj 379 419 sel 1;
#X obj 420 417 sel 1;
#X obj 421 395 &&;
#X obj 500 417 sel 1;
#X obj 501 395 &&;
#X obj 580 417 sel 1;
#X obj 581 395 &&;
#X obj 662 417 sel 1;
#X obj 663 395 &&;
#X msg 318 477 \$1 2000;
#X obj 742 417 sel 1;
#X obj 211 658 delwrite~ fd 4000;
#X msg 379 442 1800;
#X obj 420 368 > 50;
#X obj 379 369 <= 50;
#X obj 299 39 loadbang;
#X msg 299 68 \; pd dsp 1;
#X obj 173 564 /~ 2;
#X obj 98 151 lop~ 2500;
#X msg 422 442 1830;
#X msg 744 442 1900;
#X msg 664 442 1875;
#X msg 582 442 1865;
#X msg 502 442 1850;
#X obj 742 369 > 90;
#X obj 698 370 <= 90;
#X obj 663 370 > 80;
#X obj 614 370 <= 80;
#X obj 580 368 > 70;
#X obj 534 370 <= 70;
#X obj 500 368 > 60;
#X obj 454 370 <= 60;
#X obj 273 269 &&;
#X obj 271 238 > 60;
#X obj 98 176 *~ 20;
#X obj 324 238 <= 80;
#X obj 318 523 vd~ fd 200;
#X obj 288 552 *~ 0.95;
#X msg 274 300 \$1 200;
#X connect 0 0 2 0;
#X connect 2 0 39 0;
#X connect 3 0 1 0;
#X connect 4 0 8 0;
#X connect 5 0 13 0;
#X connect 7 0 5 0;
#X connect 8 0 1 0;
#X connect 10 0 11 0;
#X connect 10 0 54 0;
#X connect 10 0 56 0;
#X connect 12 0 7 0;
#X connect 13 0 38 0;
#X connect 15 0 1 0;
#X connect 16 0 15 1;
#X connect 17 0 19 0;
#X connect 17 0 34 0;
#X connect 17 0 35 0;
#X connect 17 0 45 0;
#X connect 17 0 46 0;
#X connect 17 0 47 0;
#X connect 17 0 48 0;
#X connect 17 0 49 0;
#X connect 17 0 50 0;
#X connect 17 0 51 0;
#X connect 17 0 52 0;
#X connect 18 0 57 0;
#X connect 20 0 30 0;
#X connect 21 0 33 0;
#X connect 22 0 40 0;
#X connect 23 0 22 0;
#X connect 24 0 44 0;
#X connect 25 0 24 0;
#X connect 26 0 43 0;
#X connect 27 0 26 0;
#X connect 28 0 42 0;
#X connect 29 0 28 0;
#X connect 30 0 18 0;
#X connect 31 0 41 0;
#X connect 33 0 30 0;
#X connect 34 0 23 0;
#X connect 35 0 21 0;
#X connect 36 0 37 0;
#X connect 36 0 8 0;
#X connect 38 0 6 0;
#X connect 38 0 6 1;
#X connect 38 0 32 0;
#X connect 38 0 17 0;
#X connect 39 0 55 0;
#X connect 40 0 30 0;
#X connect 41 0 30 0;
#X connect 42 0 30 0;
#X connect 43 0 30 0;
#X connect 44 0 30 0;
#X connect 45 0 31 0;
#X connect 46 0 29 1;
#X connect 47 0 29 0;
#X connect 48 0 27 1;
#X connect 49 0 27 0;
#X connect 50 0 25 1;
#X connect 51 0 25 0;
#X connect 52 0 23 1;
#X connect 53 0 59 0;
#X connect 54 0 14 0;
#X connect 54 0 53 0;
#X connect 55 0 10 0;
#X connect 55 0 15 0;
#X connect 56 0 53 1;
#X connect 57 0 58 0;
#X connect 58 0 13 1;
#X connect 59 0 16 0;

@ -32,6 +32,8 @@
.st17{display:none;} .st17{display:none;}
.st18{display:inline;} .st18{display:inline;}
.st19{fill:#FFFFFF;stroke:#000000;stroke-width:3.6669;stroke-miterlimit:10;} .st19{fill:#FFFFFF;stroke:#000000;stroke-width:3.6669;stroke-miterlimit:10;}
.st20{stroke:#000000;stroke-width:4;stroke-miterlimit:10;}
</style> </style>
@ -1601,7 +1603,7 @@
C634.6,549,634.7,549.4,634.7,549.9z"/> C634.6,549,634.7,549.4,634.7,549.9z"/>
<g id="Laag_1"> <g id="Laag_1">
<line class="st0" x1="178.4" y1="218.8" x2="1111.1" y2="218.8"/> <line class="st20" x1="178.4" y1="218.8" x2="1111.1" y2="218.8"/>
</g> </g>
</g> </g>

Binary file not shown.

@ -0,0 +1,20 @@
<html>
<head>
<meta charset="UTF-8">
<script language="javascript" type="text/javascript" src="libraries/p5.min.js"></script>
<!-- uncomment lines below to include extra p5 libraries -->
<script language="javascript" src="libraries/p5.dom.min.js"></script>
<script language="javascript" src="libraries/p5.sound.min.js"></script>
<script language="javascript" type="text/javascript" src="sketch.js"></script>
<!-- this line removes any default padding and style. you might only need one of these values set. -->
<style> body {padding: 0; margin: 0;} </style>
</head>
<body>
</body>
</html>

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 one or more lines are too long

@ -0,0 +1,267 @@
var carrier; // this is the carrierillator we will hear
var modulator; // this carrierillator will modulate the amplitude of the carrier
var fft; // we'll visualize the waveform
var opac;
var carrier;
function getRandomArbitrary(min, max) {
return Math.random() * (max - min) + min;
}
function setup() {
createCanvas(innerWidth,innerHeight);
noFill();
//SETING FIRST OSCILLATOR: CARRIER
// EXPLANATION FROM WEBSITE: The carrier is typically set at an audible frequency (i.e. 440 Hz) and connected to master output by default. The carrier.amp is set to zero because we will have the modulator control its amplitude.
var randomnumb = getRandomArbitrary(0, 20);
console.log(randomnumb);
carrier = new p5.Oscillator(); // connects to master output by default
carrier.freq(200 + randomnumb); // it sets the frequency of the carrier. AN AUDIBLE ONE.
carrier.amp(1);
// carrier's amp is 0 by default, giving our modulator total control
carrier.start();
// create an fft to analyze the audio
//an FFT (fast Fourier transform) converts a signal from its original domain (often time or space) to a representation in the frequency domain and vice versa
fft = new p5.FFT();
}
function draw() {
//depen de la alçada, la nota TOCADA se sent mes for o menys (volum = amplitud)
if(mouseY <= height/2) {
var ampli = map(mouseY, 0, height, 0.01, 2.02);
}else{
var ampli = map(mouseY, height, 0, 0.01, 2.02);
}
// change carrierillator frequency based on mouseX
var modFreq = 0.1;
// si el mouseY és igual o el mateix que la meitat de l'altura, fes aixo. ((DEFINEIX LA AMPLITUD.))
if(mouseY <= height/2) {
var modAmp = map(mouseY, 0, height, 0.01, 2.02);
}else{
var modAmp = map(mouseY, height, 0, 0.01, 2.02);
}
carrier.amp(modAmp, 0.01); // fade time of 0.1 for smooth fading
// analyze the waveform
waveform = fft.waveform();
// drawText(modFreq, modAmp);
if (mouseIsPressed || (touches && touches.length)){
opac = 100;
var mx = mouseX || (touches[0] && touches[0][0]);
if (mx > 0 && mx < width/20 ){
carrier.freq(220.0);
carrier.amp(ampli);
}else if ( mx > width/20 && mx < 2*(width/20)){
carrier.freq(233.08);
carrier.amp(ampli);
}else if (mx > 2*(width/20) && mx < 3*(width/20)){
carrier.freq(246.94);
carrier.amp(ampli);
}else if (mx > 3*(width/20) && mx < 4*(width/20)){
carrier.freq(261.63);
carrier.amp(ampli);
}else if (mx > 4*(width/20) && mx < 5*(width/20)){
carrier.freq(277.18);
carrier.amp(ampli);
}else if (mx > 5*(width/20) && mx < 6*(width/20)){
carrier.freq(293.66);
carrier.amp(ampli);
}else if (mx > 6*(width/20) && mx < 7*(width/20)){
carrier.freq(311.13);
carrier.amp(ampli);
}else if (mx > 7*(width/20) && mx < 8*(width/20)){
carrier.freq(329.63);
carrier.amp(ampli);
}else if (mx > 8*(width/20) && mx < 9*(width/20)){
carrier.freq(349.23);
carrier.amp(ampli);
}else if (mx > 9*(width/20) && mx < 10*(width/20)){
carrier.freq(369.99);
carrier.amp(ampli);
}else if (mx > 10*(width/20) && mx < 11*(width/20)){
carrier.freq(392.0);
carrier.amp(ampli);
}else if (mx > 11*(width/20) && mx < 12*(width/20)){
carrier.freq(415.3);
carrier.amp(ampli);
}else if (mx > 12*(width/20) && mx < 13*(width/20)){
carrier.freq(440.0);
carrier.amp(ampli);
}else if (mx > 13*(width/20) && mx < 14*(width/20)){
carrier.freq(466.16);
carrier.amp(ampli);
}else if (mx > 14*(width/20) && mx < 15*(width/20)){
carrier.freq(493.88);
carrier.amp(ampli);
}else if (mx > 15*(width/20) && mx < 16*(width/20)){
carrier.freq(523.25);
carrier.amp(ampli);
}else if (mx > 16*(width/20) && mx < 17*(width/20)){
carrier.freq(554.37);
carrier.amp(ampli);
}else if (mx > 17*(width/20) && mx < 18*(width/20)){
carrier.freq(587.33);
carrier.amp(ampli);
}else if (mx > 18*(width/20) && mx < 19*(width/20)){
carrier.freq(622.25);
carrier.amp(ampli);
}else if (mx > 19*(width/20) && mx < width){
carrier.freq(659.26);
carrier.amp(ampli);
}
//draw a new line
stroke(0,0,0);
strokeWeight(0.5);
line(0, height/2,mx, mouseY);
line(mx, mouseY, width, height/2);
background(255, 255, 255,100);
}else{
// IF MOUSE IS NOT PRESSED
if(mouseY <= height/2) {
opac = map(mouseY, 0,height/2, 100, 0);
}else{
opac = map(mouseY, height, height/2, 100, 0);
}
background(255,255,255,opac); // alpha
// draw the shape of the waveform
//drawWaveform();
}
}
function drawWaveform() {
if(mouseIsPressed){
stroke(255,255,255);
strokeWeight(1);
line(0, height/2,mx, mouseY);
line(mx, mouseY, width, height/2);
background(0, 0, 0,100);
}else{
stroke(0,0,0,100);
strokeWeight(0.5);
beginShape();
for (var i = 0; i<waveform.length; i++){
var x = map(i, 0, (waveform.length)/8, 0, width);
var y = map((waveform[i])/8, -1, 1, -height/2, height/2);
vertex(x, y + height/2);
}
endShape();
}
}

@ -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 Author: Francisco González
Date: 1989 Date: 2017
Title: The Sublime Object of Floppy Title: Motions
Description: 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.

After

Width:  |  Height:  |  Size: 306 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

@ -0,0 +1,308 @@
<style>
/* add my font? */
body{
/* font */
color: black; /* font color */
font-size: 17pt;
font-family: Times,
line-height: 15px;
letter-spacing: 0.7px;
margin-left: 0px;
margin-right: 0px;
margin-top: 0px;
padding: 0px;
}
/* Responsive scaling */
h1 {
font-size: calc(2.4vW + 2.4vH);
text-align: center;
font-weight: normal;
}
h2 {
font-size: calc(0.8vW + 0.8vH);
font-weight: normal;
}
#container {
display: flex;
}
iframe {
border: 0px;
width: 30vW;
height: 60vH;
}
/* Text & image links*/
a { color: blue; text-decoration: none;
padding-bottom: 0.00em;
border-bottom: 0em rgba(255, 255, 255, 0.31);
}
a:visited {
color: blue; }
a:hover {
text-decoration: underline; }
a.image-link,
a.icon-link,
a.image-link:hover,
a.icon-link:hover
{ border-bottom: 0; padding-bottom: 0; }
div#noise-image {
margin-top: 0px;
text-align: center;
background: transparent;
position: absolute;
}
.container {
background-color: #e6ffe6;
background-image: url(noise.gif);
background-blend-mode: multiply;
}
div#header {
margin-top: 98px;
margin-left: 230px;
margin-right: 230px;
line-height: 47px;
font-size: 54px;
font-family: Times;
letter-spacing: 0pt;
color: black;
background: transparent;
position: absolute;
}
div#links {
margin-top: 40px;
margin-right: 0px;
margin-left: 1025px;
font-size: 14px;
font-family: Courier;
letter-spacing: 0px;
line-height: 12pt;
text-align: right;
color: blue;
text-decoration: underline;
background: transparent;
position: fixed;
}
div#buttons {
margin-top: 40px;
margin-left: 60px;
font-size: 14px;
font-family: Courier;
letter-spacing: 0px;
line-height: 12pt;
text-align: left;
color: black;
background: transparent;
position: fixed;
}
div#title {
margin-top: 40px;
margin-left: 550px;
font-size: 14px;
font-family: Times;
letter-spacing: 1pt;
text-align: center;
color: blue;
background: transparent;
position: fixed;
}
div#concept {
margin-top: 495px;
margin-left: 51px;
font-size: 18px;
font-family: Courier;
letter-spacing: 0pt;
text-align: left;
color: black;
background: transparent;
border: 1px solid black;
border-collapse: collapse;
position: absolute;
}
div#body {
margin-top: 495px;
margin-left: 684px;
font-size: 18px;
font-family: Courier;
letter-spacing: 0pt;
text-align: left;
color: black;
border: 1px solid black;
border-collapse: collapse;
background: transparent;
position: absolute;
}
div#samples {
margin-top: 1160px;
margin-left: 51px;
font-size: 18px;
font-family: Courier;
letter-spacing: 0pt;
text-align: left;
color: black;
border: 1px solid black;
border-collapse: collapse;
background: transparent;
position: absolute;
}
.mobile.icon {
color: blue;
position: fixed;
margin-left: 16px;
margin-top: 210px;
width: 12px;
height: 19px;
border-radius: 2px;
border: solid 1px currentColor;
}
.mobile.icon:before {
content: '';
position: absolute;
left: 5px;
top: 1px;
width: 2px;
height: 1px;
background-color: currentColor;
}
.mobile.icon:after {
content: '';
position: absolute;
bottom: 1px;
left: 5px;
height: 2px;
width: 2px;
border-radius: 50%;
background-color: currentColor;
}
.tablet.icon {
color: blue;
position: fixed;
margin-left: 15px;
margin-top: 240px;
width: 15px;
height: 17px;
border-radius: 2px;
border: solid 1px currentColor;
}
.tablet.icon:before {
content: '';
position: absolute;
top: 1px;
left: 0;
height: 13px;
width: 15px;
border-top: solid 1px currentColor;
border-bottom: solid 1px currentColor;
}
.tablet.icon:after {
content: '';
position: absolute;
bottom: 0px;
left: 6px;
width: 3px;
height: 1px;
background-color: currentColor;
}
.laptop.icon {
color: blue;
position: fixed;
margin-left: 16px;
margin-top: 269px;
width: 12px;
height: 8px;
border-radius: 2px;
border: solid 1px currentColor;
}
.laptop.icon:before {
content: '';
position: absolute;
left: -4px;
bottom: -5px;
width: 18px;
height: 1px;
border-radius: 0 0 2px 2px;
border: solid 1px currentColor;
}
div#rotate {
transform: rotate(270deg);
color: blue;
font-family: Courier;
font-size: 12px;
text-decoration: underline;
margin-left: 1150px;
margin-top: 225px;
position: fixed;
background: transparent;
/* Safari */
-webkit-transform: rotate(-90deg);
/* Firefox */
-moz-transform: rotate(-90deg);
/* IE */
-ms-transform: rotate(-90deg);
/* Opera */
-o-transform: rotate(-90deg);
/* Internet Explorer */
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
}
</style>

@ -1,7 +1,16 @@
Author: Slavoj Žižek Author: Giulia de Giovanelli
Date: 1989 Date: 2017
Title: The Sublime Object of Floppy Title: Adopt A Walk
Description: Description:
And so on, and so on, and so on. By stealing the walk of another person do I become someone else?
This is an audio-guide of an experiment of gait analysis,
If you never heard about this term, gait analysis is the study of patterns of walk during ambulation used by new surveillance biometric technologies.
People are asked to walk following a series of spoken instructions. The walks are stored temporarily on a page where youre invited to “adopt a walk” of another person.
“Have you ever tried to look at the way a person walk as a way to identify her?
Surveillance technologies are using the homogenic perception of human being as a model for their mechanics.”
With this experiment youre invited to observe characteristic of walks your similar and adopt them. Try to imagine that in modifying your walk you could escape from detection of your identity.

@ -1,62 +0,0 @@
#!/usr/bin/env python
import cgi, jinja2, os, json, re
import cgitb; cgitb.enable()
from jinja2 import Template
# Directory => ITEMS list (all files with a timestamp name, grouped)
ff = os.listdir("clips")
tpat = re.compile(r"^(\d\d\d\d)-(\d\d)-(\d\d)-(\d\d)-(\d\d)-(\d\d)")
items = {}
for f in ff:
base, ext = os.path.splitext(f)
ext = ext[1:]
m = tpat.match(f)
if m:
t = m.group(0)
if t not in items:
items[t] = {}
items[t][ext] = f
items = [items[key] for key in sorted(items, reverse=True)]
for i in items[1:]:
for f in i.items():
print "deleting ", f
# dump the data (debugging)
# print "Content-type: text/plain"
# print ""
# print json.dumps(items, indent=2)
# Output template with items
print "Content-type: text/html"
print ""
print Template(u"""<html>
<head>
<title>ADOPT A WALK</title>
<style type="text/css">
div.movie {
border: 20px solid black;
display: inline-block;
}
div.movie img {
width: 400px;
}
</style>
</head>
<body>
<header>
<p>head<p>
<img src="../images/header.png" width="100%"/>
</header>
{% for i in items %}
<div class="movie"><a href="../clips/{{i.mp4}}"><img src="../clips/{{i.jpg}}" /></a> </div>
{% endfor %}
<div>
</div>
</body>
</html>""").render(items=items).encode("utf-8")

Binary file not shown.

Before

Width:  |  Height:  |  Size: 499 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 KiB

@ -1,12 +0,0 @@
#N canvas 296 315 450 300 10;
#X obj 37 104 osc~ 440;
#X obj 37 146 dac~;
#X obj 161 74 loadbang;
#X msg 161 111 \; pd dsp 1;
#X obj 37 36 netreceive 3000;
#X obj 46 62 print;
#X connect 0 0 1 0;
#X connect 0 0 1 1;
#X connect 2 0 3 0;
#X connect 4 0 5 0;
#X connect 4 0 0 0;

@ -1,12 +1,7 @@
#!/usr/bin/env python #!/usr/bin/env python
import os, random, time import subprocess
while True:
freq = str(random.randint(0,10)*110)
print(freq)
os.system('echo "'+freq+';" | pdsend 3000')
time.sleep(0.25)
subprocess.call(["scripts/voiceguide.sh"], cwd="/media/floppy")

@ -0,0 +1,77 @@
#!/usr/bin/env python
import cgi, jinja2, os, json, re
import cgitb; cgitb.enable()
from jinja2 import Template
# Directory => ITEMS list (all files with a timestamp name, grouped)
try:
ff = os.listdir("/var/www/static/gait")
except OSError:
ff = []
tpat = re.compile(r"^(\d\d\d\d)-(\d\d)-(\d\d)-(\d\d)-(\d\d)-(\d\d)")
items = {}
for f in ff:
base, ext = os.path.splitext(f)
ext = ext[1:]
m = tpat.match(f)
if m:
t = m.group(0)
if t not in items:
items[t] = {}
items[t][ext] = f
items = [items[key] for key in sorted(items, reverse=True)]
for i in items[10:]:
for f in i.items():
print "deleting ", f
# 10 os.unlink(f)
# dump the data (debugging)
# print "Content-type: text/plain"
# print ""
# print json.dumps(items, indent=2)
# Output template with items
print "Content-type: text/html"
print ""
print Template(u"""<html>
<head>
<title>ADOPT A WALK</title>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="../styles/main.css">
</head>
<body>
<div id="wrappper">
<header>
<img src="../images/headertr3.png" width="100%"/>
</header>
<div class="firstline">
<p> Here you can find footage of your walks.</p>
</div>
<img src="../images/camera.png" />
<div class="secondline">
<p> Steal a walk from another person's video. Download it. </p>
</div>
<div class="thirdline">
<p> Promise me, you're gonna start using this walk for the rest of the day. </p>
</div>
<img src="../images/cover.png" />
<div class="movies">
{% for i in items %}
<a href="../clips/{{i.mp4}}"><img src="../clips/{{i.jpg}}" /></a>
<p>{{i.mp4}}</p>
{% endfor %}
</div>
</div>
</body>
</html>""").render(items=items).encode("utf-8")

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

@ -1 +1,8 @@
GREAT JOB! <html>
<head>
<meta http-equiv="refresh" content="0;url=/cgi-bin/index.cgi" />
</head>
<body>
<a href="/cgi-bin/index.cgi">start</a>
</body>
</html>

@ -0,0 +1,104 @@
@font-face: {
font-family: "Sporting Grotesque";
src: url("/fonts/sporting_grotesque_normal.otf");
}
body {
background-image: url("../images/background.png");
background-repeat: repeat;
font-family: "Sporting Grotesque";
}
#wrapper {
max-width: 900px;
display: block;
margin: 0px auto;
padding:0px;
}
header img{
border: none;
}
div.movies img:nth-child(1) {
margin-top: 150px;
}
div.movies img {
display: block;
width: 632px;
height: auto;
margin: 25px auto;
box-shadow: 0px 0px 64px 13px rgba(255,255,255,1);
}
div.movies p {
color: white;
text-align: center;
font-family: "Sporting Grotesque";
}
div.firstline, div.secondline, div.thirdline {
max-width: 100%;
border: 10px solid white;
padding-top: 3px;
padding-bottom: 3px;
padding-left: 50px;
padding-right: 50px;
margin: 37px 15px 37px !important;
font-size: 200%;
color: white;
text-align: center;
text-shadow: 1px 1px 2px white;
line-height:110%;
margin: auto;
}
/*div.secondline {
width: 80%;
border: 10px solid white;
padding-top: 3px;
padding-bottom: 3px;
padding-left: 50px;
padding-right: 50px;
margin:25px;
font-size: 200%;
color: white;
text-align: center;
text-shadow: 1px 1px 2px white;
line-height:110%;
margin: auto;
margin-top:17px;
margin-bottom:17px;
}
div.thirdline {
width: 80%;
border: 10px solid white;
padding-top: 3px;
padding-bottom: 3px;
padding-left: 50px;
padding-right: 50px;
margin: 25px;
font-size: 200%;
color: white;
text-align: center;
text-shadow: 1px 1px 2px white;
line-height:110%;
margin: auto;
}*/
div.cover {
float: center;
margin: 20px;
}
img {
display: block;
margin: auto;
max-width: 900px;
border: 10px solid white;
}

@ -1,17 +0,0 @@
#! /usr/bin/env python
import subprocess
from time import sleep
# requires: espeak to be installed
waittimes = [1,2,1,4,1,4,1,4,1,4]
f=open("instructions.txt","r")
txt=f.readlines()
for i, line in enumerate(txt):
waittime = waittimes[i]
print i, waittime #, line,
subprocess.call(["espeak", line, "-v", "en"]) # character speaks: his/her line
sleep(waittime) # make pause after each text line

@ -0,0 +1,84 @@
#!/usr/bin/env python
from __future__ import print_function
import cv2, os, sys, time
import numpy as np
from argparse import ArgumentParser
from picamera.array import PiRGBArray
from picamera import PiCamera
p = ArgumentParser("")
p.add_argument("--video", type=int, default=0, help="video, default: 0")
p.add_argument("--output", default=None, help="path to save movie, default: None (show live)")
p.add_argument("--width", type=int, default=640, help="pre-detect resize width")
p.add_argument("--height", type=int, default=480, help="pre-detect resize height")
p.add_argument("--fourcc", default="XVID", help="MJPG,mp4v,XVID")
p.add_argument("--framerate", type=float, default=25, help="output frame rate")
p.add_argument("--show", default=False, action="store_true")
p.add_argument("--frames", type=int, default=100)
args = p.parse_args()
fourcc = None
cam = cv2.VideoCapture(args.video)
cam.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH, args.width)
cam.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT, args.height)
if args.output:
try:
fourcc = cv2.cv.CV_FOURCC(*args.fourcc)
except AttributeError:
fourcc = cv2.VideoWriter_fourcc(*args.fourcc)
out = cv2.VideoWriter()
out.open(args.output, fourcc, args.framerate, (args.width, args.height))
else:
out = None
print ("Starting camera", file=sys.stderr)
cam = PiCamera()
framesize = (160, 128)
cam.resolution = framesize
cam.framerate = 32
rawCapture = PiRGBArray(cam, size=framesize)
# allow the camera to warmup
time.sleep(0.25)
count = 0
try:
# while True:
# ret, frame = cam.read()
for frame in cam.capture_continuous(rawCapture, format="bgr", use_video_port=True):
# print "GRAB FRAME"
frame = frame.array
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
ret, t= cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
frame = cv2.cvtColor(t, cv2.COLOR_GRAY2BGR)
# flow = cv2.calcOpticalFlowFarneback(prevgray, gray, 0.5, 3, 15, 3, 5, 1.2, 0)
# prevgray = gray
# clear the stream in preparation for the next frame (important for picamera!)
rawCapture.truncate(0)
if out != None:
out.write(frame)
count += 1
if args.show:
cv2.imshow('display', frame)
if cv2.waitKey(5) & 0xFF == ord('q'):
break
if args.frames != None:
if (count >= args.frames):
break
except KeyboardInterrupt:
pass
print ("\nCleaning up... Wrote", count, "frames")
if out:
out.release()
if args.show:
cv2.destroyAllWindows()

@ -0,0 +1,73 @@
#!/usr/bin/env python
from __future__ import print_function
import cv2, os, sys, time
import numpy as np
from argparse import ArgumentParser
p = ArgumentParser("")
p.add_argument("--video", type=int, default=0, help="video, default: 0")
p.add_argument("--output", default=None, help="path to save movie, default: None (show live)")
p.add_argument("--width", type=int, default=640, help="pre-detect resize width")
p.add_argument("--height", type=int, default=480, help="pre-detect resize height")
p.add_argument("--fourcc", default="XVID", help="MJPG,mp4v,XVID")
p.add_argument("--framerate", type=float, default=25, help="output frame rate")
p.add_argument("--show", default=False, action="store_true")
p.add_argument("--frames", type=int, default=100)
args = p.parse_args()
fourcc = None
cam = cv2.VideoCapture(args.video)
cam.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH, args.width)
cam.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT, args.height)
if args.output:
try:
fourcc = cv2.cv.CV_FOURCC(*args.fourcc)
except AttributeError:
fourcc = cv2.VideoWriter_fourcc(*args.fourcc)
out = cv2.VideoWriter()
out.open(args.output, fourcc, args.framerate, (args.width, args.height))
else:
out = None
while True:
ret, prev = cam.read()
prevgray = cv2.cvtColor(prev, cv2.COLOR_BGR2GRAY)
if prevgray.shape == (args.height, args.width):
break
count = 0
try:
while True:
ret, frame = cam.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
ret, t= cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
frame = cv2.cvtColor(t, cv2.COLOR_GRAY2BGR)
# flow = cv2.calcOpticalFlowFarneback(prevgray, gray, 0.5, 3, 15, 3, 5, 1.2, 0)
# prevgray = gray
if out != None:
out.write(frame)
count += 1
if args.show:
cv2.imshow('display', frame)
if cv2.waitKey(5) & 0xFF == ord('q'):
break
if args.frames != None:
if (count >= args.frames):
break
except KeyboardInterrupt:
pass
print ("\nCleaning up... Wrote", count, "frames")
if out:
out.release()
if args.show:
cv2.destroyAllWindows()

@ -1,95 +1,56 @@
# ensure the record folder exists
mkdir -p /var/www/static/gait
espeak "Gait analysis number one." -v en v=-v en-gb+f5 -s 150
espeak "Tetra Gamma Gait Analysis " -v en-gb +f5 -s 150
sleep 1 sleep 1
espeak "Please state your name:" -v en espeak "Be ready for the security check." -v en-gb+f4 -s 150
sleep 1 sleep 1
espeak "Position yourself 2 to 3 meters away from the Tetra Gamma Circulaire." -v en espeak "Please state your name:" -v en+f4 -s 150
sleep 1
espeak "Position yourself 2 to 3 meters away from me." -v en-gb+f4 -s 150
sleep 2 sleep 2
espeak "Walk towards the Tetra Gamma Circulaire in a straight line ." -v en espeak "Walk towards me in a straight line ." -v en+f4 -s 150
sleep 0.2 sleep 0.2
play sweep_up.wav mpv sweep_up.wav
basename=clips/$(date +%Y-%m-%d-%H-%M-%S) basename=/var/www/static/gait/$(date +%Y-%m-%d-%H-%M-%S)
echo recording $basename.avi... echo recording $basename.avi...
scripts/black2.py --output $basename.avi --frames 50 --framerate 4 --width 320 --height 240 python scripts/recordwalk.py --output $basename.avi --frames 50 --framerate 4 --width 320 --height 240
# convert to mp4 # convert to mp4
ffmpeg -i $basename.avi -y $basename.mp4 ffmpeg -i $basename.avi -y $basename.mp4
# make a thumnail image # make a thumnail image
ffmpeg -i $basename.avi -vframes 1 -ss 0.5 -y $basename.jpg ffmpeg -i $basename.avi -vframes 1 -ss 0.5 -y $basename.jpg
# rm $basename.avi # rm $basename.avi
play sweep_up.wav mpv sweep_up.wav
espeak "Position yourself one meter away to the left of the Tetra Gamma Circulaire." -v en espeak "Walk towards me on a zig zag line.
sleep 1 " -v en+f4 -s175
espeak "Walk from left to right in front of the Tetra Gamma Circulaire.
" -v en
sleep 0.2 sleep 0.2
play sweep_up.wav mpv sweep_up.wav
basename=clips/$(date +%Y-%m-%d-%H-%M-%S) basename=clips/$(date +%Y-%m-%d-%H-%M-%S)
echo recording $basename.avi... echo recording $basename.avi...
scripts/black2.py --output $basename.avi --frames 50 --framerate 4 --width 320 --height 240 python scripts/recordwalk.py --output $basename.avi --frames 50 --framerate 4 --width 320 --height 240
# convert to mp4 # convert to mp4
ffmpeg -i $basename.avi -y $basename.mp4 ffmpeg -i $basename.avi -y $basename.mp4
# make a thumnail image # make a thumnail image
ffmpeg -i $basename.avi -vframes 1 -ss 0.5 -y $basename.jpg ffmpeg -i $basename.avi -vframes 1 -ss 0.5 -y $basename.jpg
# rm $basename.avi # rm $basename.avi
play sweep_up.wav mpv sweep_up.wav
espeak "Turn your back to the Tetra Gamma Circulaire." -v en
sleep 1
espeak "Walk away from the Tetra Gamma Circulaire.
" -v en
sleep 0.2
play sweep_up.wav
basename=clips/$(date +%Y-%m-%d-%H-%M-%S)
echo recording $basename.avi...
scripts/black2.py --output $basename.avi --frames 50 --framerate 4 --width 320 --height 240
# convert to mp4
ffmpeg -i $basename.avi -y $basename.mp4
# make a thumnail image
ffmpeg -i $basename.avi -vframes 1 -ss 0.5 -y $basename.jpg
# rm $basename.avi
play sweep_up.wav espeak "Thank you for your cooperation" -v en+f4 -s175
espeak "Position yourself 2 to 3 meters away from the Tetra Gamma Circulaire." -v en
sleep 1 sleep 1
espeak "Walk towards the Tetra Gamma Circulaire on a zig zag line. mpv sweep_up.wav
" -v en
sleep 0.2
play sweep_up.wav
basename=clips/$(date +%Y-%m-%d-%H-%M-%S)
echo recording $basename.avi...
scripts/black2.py --output $basename.avi --frames 50 --framerate 4 --width 320 --height 240
# convert to mp4
ffmpeg -i $basename.avi -y $basename.mp4
# make a thumnail image
ffmpeg -i $basename.avi -vframes 1 -ss 0.5 -y $basename.jpg
# rm $basename.avi
play sweep_up.wav
# subprocess.call(["espeak", "Please state your name:", "-v", "en"])
# sleep(2)
# Position yourself 2 to 3 meters away from the Tetra Gamma Circulaire.
# Walk towards the Tetra Gamma Circulaire in a straight line .
# Position yourself one meter away to the left of the Tetra Gamma Circulaire.
# Walk from left to right in front of the Tetra Gamma Circulaire.
# Turn your back to the Tetra Gamma Circulaire.
# Walk away from the Tetra Gamma Circulaire.
# Position yourself 2 to 3 meters away from the Tetra Gamma Circulaire.
# Wal

@ -1,12 +1,6 @@
#!/usr/bin/env python #!/usr/bin/env python
import os, random, time import subprocess
while True:
freq = str(random.randint(0,10)*110)
print(freq)
os.system('echo "'+freq+';" | pdsend 3000')
time.sleep(0.25)
subprocess.call(["mpv", "inthemood.mp3", "--loop", "inf", "--volume", "25"], cwd="/media/floppy")

@ -7,16 +7,16 @@ import subprocess
f = cgi.FieldStorage() f = cgi.FieldStorage()
p = f.getvalue("p", "Bump.mp3") p = f.getvalue("p", "Bump.mp3")
p = os.path.join("voice", p) p = os.path.join("voice", p)
out = subprocess.check_output(["mplayer", p], stderr=subprocess.STDOUT) out = subprocess.check_output(["mpv", p], cwd="/media/floppy/noweb", stderr=subprocess.STDOUT)
# print "Location: /pushingscore-Karina.html" # print "Location: /index.html"
# print # print
print "Content-type:text/html; charset=utf-8" print "Content-type:text/html; charset=utf-8"
print print
print """<html> print """<html>
<head> <head>
<meta http-equiv="refresh" content="0;url=/pushingscore-Karina.html" /> <meta http-equiv="refresh" content="0;url=/index.html" />
</head> </head>
<body> <body>
</body> </body>

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Before

Width:  |  Height:  |  Size: 689 B

After

Width:  |  Height:  |  Size: 689 B

Before

Width:  |  Height:  |  Size: 727 B

After

Width:  |  Height:  |  Size: 727 B

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Before

Width:  |  Height:  |  Size: 6.9 KiB

After

Width:  |  Height:  |  Size: 6.9 KiB

@ -1 +1,69 @@
GREAT JOB! <html>
<head>
<title></title>
<style>
body {
margin-left: 20;
margin-right: 20;
padding: 0;
color: grey;
}
form.buttons {
}
form.buttons input {
width: 150px;
height: 150px;
/*hide the labels*/
font-size: 0;
line-height: 0;
border: 0;
margin: ;
}
</style>
</head>
<body>
<form action="cgi-bin/play.cgi" class="buttons">
<input type="submit" name="p" value="BasicTurn.mp3" style="background:url(images/choreology1-BasicTurn.svg) no-repeat;" />
<input type="submit" name="p" value="Follow.mp3" style="background:url(images/choreology2-Follow.svg) no-repeat;" />
<br>
<input type="submit" name="p" value="AmericanSpin.mp3" style="background:url(images/choreology3-AmericanSpin.svg) no-repeat;" />
<input type="submit" name="p" value="Bump.mp3" style="background:url(images/choreology4-Bump.svg) no-repeat;" />
<br>
<input type="submit" name="p" value="StopAndGo.mp3" style="background:url(images/choreology5-StopAndGo.svg) no-repeat;" />
<input type="submit" name="p" value="Windmill.mp3" style="background:url(images/choreology6-Windmill.svg) no-repeat;" />
<br>
<input type="submit" name="p" value="SpanishArms.mp3" style="background:url(images/choreology7-SpanishArms.svg) no-repeat;" />
<input type="submit" name="p" value="Hucklebuck.mp3" style="background:url(images/choreology8-Hucklebuck.svg) no-repeat;" />
<br>
<!--"Whip" of "The Whip" options - needs testing with music playing in the background
<input type="submit" name="p" value="TheWhip.mp3" style="background:url(images/choreology9-Whip.svg) no-repeat;" />
-->
<input type="submit" name="p" value="Whip.mp3" style="background:url(images/choreology9-Whip.svg) no-repeat;" />
<input type="submit" name="p" value="ChickenWalks.mp3" style="background:url(images/choreology10-ChickenWalks.svg) no-repeat;" />
<div class="tempo">
<br>
<br>
<br>
<input id="slider3" type="range" min ="100" max="180" step ="1" style="width: 640px" />
<!-- <input id="slider3" type="range" min ="100" max="180" step ="1" orient="vertical" style="-webkit-appearance: slider-vertical; writing-mode: bt-lr" />
-->
</div>
</form>
</body>
</html>

@ -1,53 +0,0 @@
<html>
<head>
<title></title>
<style>
form.buttons input {
width: 160px;
height: 160px;
/*hide the labels*/
font-size: 0;
line-height: 0;
}
</style>
</head>
<body>
<form action="cgi-bin/play.cgi" class="buttons">
<input type="submit" name="p" value="BasicTurn.mp3" style="background:url(images/Choreology-BasicTurn.png) no-repeat;" />
<input type="submit" name="p" value="Follow.mp3" />
<input type="submit" name="p" value="AmericanSpin.mp3" />
<input type="submit" name="p" value="Bump.mp3" />
<input type="submit" name="p" value="StopAndGo.mp3" />
<input type="submit" name="p" value="Windmill.mp3" />
<input type="submit" name="p" value="SpanishArms.mp3" />
<input type="submit" name="p" value="Hucklebuck.mp3" />
<input type="submit" name="p" value="TheWhip.mp3" />
<input type="submit" name="p" value="Whip.mp3" />
<input type="submit" name="p" value="ChickenWalks.mp3" />
<div class="tempo">
<input id="slider3" type="range" min ="100" max="180" step ="1" style="width: 640px" />
<!-- <input id="slider3" type="range" min ="100" max="180" step ="1" orient="vertical" style="-webkit-appearance: slider-vertical; writing-mode: bt-lr" />
-->
</div>
</form>
</body>
</html>

@ -0,0 +1,23 @@
A sonification of the Dutch elections March 2017; based on the hashtags #gestemd and #ikstem
Creative Commons - Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)
You are free to:
Share — copy and redistribute the material in any medium or format
Adapt — remix, transform, and build upon the material
for any purpose, even commercially.
The licensor cannot revoke these freedoms as long as you follow the license terms.
Under the following terms:
Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
ShareAlike — If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.
More information can be found here:
https://creativecommons.org/licenses/by-sa/4.0/
///////////////////////////////////////////////////////////////////////////
TGC (Terra Gamma Circulaire) scripts and config files
WTFPL (Do What the Fuck You Want To Public License).
More information can be found here:
https://en.wikipedia.org/wiki/WTFPL

@ -0,0 +1,17 @@
Author: Margreet Riphagen
Date: 2017
Publication: Special Issue #2
Publication launch: Tetra Gamma Circulaire #3 at De Player in Rotterdam (24th of March 2017)
Title: A sonification of the Dutch elections March 2017; based on the hashtags #gestemd and #ikstem
Description:
In the run up to the 2017 general elections in the Netherlands last Wednesday, the 15 of March 2017, a lot of Twitter traffic was generated. Literally millions of tweets were send that day over the Internet.
This sonification entails three kinds of scores;
a) for the whole tweet,
b) for the hashtag ikstem (#ikstem), and
c) for the hashtag gestemd (#gestemd).
Thanks to:
All PZI tutors, fellow students and Jan-Kees van Kampen

File diff suppressed because one or more lines are too long

@ -0,0 +1,74 @@
#N canvas 398 23 553 723 10;
#X declare -lib OSC;
#X declare -lib net;
#X text 372 516 attack;
#X text 443 517 release;
#X obj 374 653 line~;
#X obj 176 638 *~;
#X obj 373 536 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
-1;
#X obj 447 539 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
-1;
#X msg 383 564 stop;
#X text 70 455 #ikstem;
#X text 188 454 #gestemd;
#X obj 176 693 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 373 587 del 50;
#X msg 444 610 0 250;
#X msg 308 587 30 30;
#X obj 488 567 del 50;
#X msg 373 611 1 500;
#X obj 212 198 loadbang;
#X msg 211 244 \; pd dsp 1;
#X text 176 446 comment;
#X obj 118 585 *~ 10;
#X obj 34 48 udpreceive 127.0.0.1 4000;
#X obj 34 92 unpackOSC;
#X obj 364 23 import OSC;
#X obj 365 55 import net;
#X obj 149 148 print;
#X obj 182 539 osc~ 880;
#X msg 195 477 880;
#X obj 271 500 line~;
#X msg 266 434 1 10;
#X msg 318 494 0 30;
#X obj 318 451 b;
#X obj 318 473 delay 10;
#X msg 68 480 220;
#X text 16 34;
#X connect 3 0 9 0;
#X connect 3 0 9 1;
#X connect 4 0 16 0;
#X connect 4 0 14 0;
#X connect 4 0 17 0;
#X connect 5 0 15 0;
#X connect 5 0 6 0;
#X connect 6 0 14 0;
#X connect 10 1 12 0;
#X connect 12 0 35 0;
#X connect 12 0 31 0;
#X connect 12 1 29 0;
#X connect 12 1 31 0;
#X connect 14 0 18 0;
#X connect 15 0 2 0;
#X connect 16 0 2 0;
#X connect 17 0 15 0;
#X connect 18 0 2 0;
#X connect 19 0 20 0;
#X connect 23 0 24 0;
#X connect 24 0 10 0;
#X connect 24 0 27 0;
#X connect 28 0 22 0;
#X connect 28 0 3 0;
#X connect 29 0 28 0;
#X connect 30 0 3 1;
#X connect 31 0 30 0;
#X connect 31 0 33 0;
#X connect 32 0 30 0;
#X connect 33 0 34 0;
#X connect 34 0 32 0;
#X connect 35 0 28 0;

@ -1,4 +1,5 @@
import csv from __future__ import print_function
import csv, os, sys
from datetime import datetime from datetime import datetime
from time import sleep from time import sleep
import OSC import OSC
@ -8,7 +9,7 @@ import OSC
client = OSC.OSCClient() client = OSC.OSCClient()
address = '127.0.0.1', 4000 # 57120==SC address = '127.0.0.1', 4000 # 57120==SC
client.connect( address ) # set the address for all following messages client.connect( address ) # set the address for all following messages
print client print ("1.client stderr", file=sys.stderr)
msg = OSC.OSCMessage() # OSCresponder name: '/touch' msg = OSC.OSCMessage() # OSCresponder name: '/touch'
@ -16,26 +17,38 @@ msg.setAddress("/twitter-ikstem")
#msg.append('hello from python') #msg.append('hello from python')
#client.send(msg) #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
then = None then = None
with open('final-ikstem-openinghours.csv', 'rU') as csvfile: with open('/tmp/twittersonification.csv', 'rU') as csvfile:
file = csv.DictReader(csvfile) file = csv.DictReader(csvfile)
print file print ("2.opening file stderr", file=sys.stderr)
#csv.DictReader(csvfile)(["time"] + ['time']) #csv.DictReader(csvfile)(["time"] + ['time'])
i=0 i=0
sleep_time=1 sleep_time=1
for row in file: for row in file:
#print row print ("3.row stderr", file=sys.stderr)
i+=1 i+=1
t = row['time'] t = row['time']
print ("4.time stderr", file=sys.stderr)
t = float(t) t = float(t)
now = datetime.fromtimestamp(t) #[]dictreader reads the rowheader now = datetime.fromtimestamp(t) #[]dictreader reads the rowheader
print now, row #print now, row
if then: if then:
ti = (now-then).total_seconds() ti = (now-then).total_seconds()
#print ti/100 #print ti/100
sleep_time = ti/15 sleep_time = ti/40
print ("5.msg stderr", file=sys.stderr)
#msg.append( row['text'].lower() )
#client.send(msg)
#msg.clearData()
if "#ikstem" in row['text'].lower() and '#gestemd' in row['text'].lower(): if "#ikstem" in row['text'].lower() and '#gestemd' in row['text'].lower():
msg.append( ['both', str(now)] ) msg.append( ['both', str(now)] )
@ -44,9 +57,12 @@ with open('final-ikstem-openinghours.csv', 'rU') as csvfile:
elif '#gestemd' in row['text'].lower(): elif '#gestemd' in row['text'].lower():
msg.append( ['#gestemd', str(now)] ) msg.append( ['#gestemd', str(now)] )
# msg.append( [ str(row['text']) ] )
# send an osc message to pd # send an osc message to pd
print msg#[ i, row['text'], str(now)] #print msg#[ i, row['text'], str(now)]
sleep(sleep_time) sleep(sleep_time)
client.send(msg) client.send(msg)
msg.clearData() msg.clearData()
then = now then = now
print ("6.last print stderr", file=sys.stderr)

@ -0,0 +1,236 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<title>twitter sonification</title>
<style>
.background {
background-image: url('stemicoon.svg');
background-repeat: no-repeat;
background-size: contain;
background-position: center;
position: fixed;
top: 0;
left: 0;
height: 90vh;
width: 90vw;
margin: 5vh 5vw;
opacity: .2; /* PAS HIER DE OPACITY AAN VOOR DE TRANSPARANTIE VAN HET ICOON */
z-index: -1;
}
h1,
h2,
h3,
h4,
h5,
h6,
p,
blockquote {
margin: 0;
padding: 0;
}
body {
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 13px;
line-height: 18px;
margin: 10px 13px 10px 13px;
background-color: rgb(173,169,169); /* PAS DEZE KLEUR AAN VOOR DE ACHTERGRONDKLEUR VAN DE GEHELE PAGINA */
}
table {
margin: 10px 0 15px 0;
border-collapse: collapse;
}
td,th {
border: 1px solid #ddd;
padding: 3px 10px;
}
th {
padding: 5px 10px;
}
a {
color: #d64646;
}
a:hover {
color: #0050a3;
text-decoration: none;
}
a img {
border: none;
}
p {
margin-bottom: 9px;
}
h1,
h2,
h3,
h4,
h5,
h6 {
color: #f4eded;
line-height: 36px;
}
h1 {
margin-bottom: 18px;
font-size: 30px;
}
h2 {
font-size: 24px;
}
h3 {
font-size: 18px;
}
h4 {
font-size: 16px;
}
h5 {
font-size: 14px;
}
h6 {
font-size: 13px;
}
hr {
margin: 0 0 19px;
border: 0;
border-bottom: 1px solid #ccc;
}
blockquote {
padding: 13px 13px 21px 15px;
margin-bottom: 18px;
font-family:georgia,serif;
font-style: italic;
}
blockquote:before {
content:"\201C";
font-size:30px;
margin-left:-10px;
font-family:georgia,serif;
color:#eee;
}
blockquote p {
font-size: 14px;
font-weight: 300;
line-height: 18px;
margin-bottom: 0;
font-style: italic;
}
code, pre {
font-family: Monaco, Andale Mono, Courier New, monospace;
}
code {
background-color: #fee9cc;
color: rgba(0, 0, 0, 0.75);
padding: 1px 3px;
font-size: 12px;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
}
pre {
display: block;
padding: 14px;
margin: 0 0 18px;
line-height: 16px;
font-size: 11px;
border: 1px solid #d9d9d9;
white-space: pre-wrap;
word-wrap: break-word;
}
pre code {
background-color: #fff;
color:#737373;
font-size: 11px;
padding: 0;
}
b, strong {
color: red;
}
sup {
font-size: 0.83em;
vertical-align: super;
line-height: 0;
}
* {
-webkit-print-color-adjust: exact;
}
@media screen and (min-width: 914px) {
body {
width: 854px;
margin:10px auto;
}
}
@media print {
body,code,pre code,h1,h2,h3,h4,h5,h6 {
color: black;
}
table, pre {
page-break-inside: avoid;
}
}
</style>
<title>Sonification of the Dutch elections 2017</title>
</head>
<body>
<div class="background"></div>
<h1>Sonification of the Dutch elections 2017</h1>
<p>In the run up to the 2017 general elections in the Netherlands last Wednesday, the 15 of March 2017, a lot of Twitter<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup> traffic was generated. Literally millions of tweets were send that day over the Internet.</p>
</p>
<br>
<h1>The online political battle</h1>
<blockquote><p>En meteen is daar de tweet: #waarwasBuma<sup id="fnref:2"><a href="#fn:2" rel="footnote">2</a></sup>
(And right after there was the tweet: #wherewasBuma)</p></blockquote>
<p>This research is inspired on an article in the NRC (27 februari 2017) about the online political battle. Just like in the United States, parties attempt to reach voters through social media and to frame political opponents. The parties use social media more than ever this years elections. They try to convey their message to the unprecedented number of undecided voters and they try to frame opponents with catchy slogans or hashtags.</p>
<p>Seeing all these tweets passing so quickly it reminds me of a cascade of data, the starting point of a sonification<sup id="fnref:3"><a href="#fn:3" rel="footnote">3</a></sup> to perceptualize this huge amount of data in a <em>score</em>.</p>
<br>
<h1>Pushing the score</h1>
<p>This sonifiction entails three kinds of scores; a) for the whole tweet, b) for the hashtag ikstem (#ikstem), and c) for the hashtag gestemd (#gestemd).</p>
<p>a) It captures tweets sed during the day of the elections, between 07.30 and 21.00, when the polling stations were open. In total there are 47613 tweets captured. Some examples of tweets send:</p>
<blockquote><p>Ik wist niet wat ik moest stemmen, dus heb ik uiteindelijk maar een bootje gevouwen van het stembiljet <strong>#ikstem</strong> #tk2017 <strong>#gestemd</strong> https://t.co/KBqLBkYrpV</p>
<p>Grappig! RT @Mvan_berkel: In Leiden is rekening gehouden met zwevende kiezers. <strong>#ikstem</strong> #TweedeKamerverkiezingen https://t.co/Un8uJfNZ0v</p>
<p>Met volle trotst en vrolijkheid voor de eerste keer gaan stemmen vandaag <strong>#ikstem</strong></p></blockquote>
<p>b + c) A hash tag is used to streamline relevant topics by keyword or phrase by grouping them together to make it easier to find and follow tweets from people who are talking about the same thing. In this sonificatoin I used #ikstem and #gestemd. Both are given a different kind of sound.</p>
<br>
<br>
<h1>Used hardware and software</h1>
<p><a href="https://www.python.org">Python</a> , specific libraries: <a href="https://www.python.org/dev/peps/pep-0305/">csv</a>, <a href="https://docs.python.org/2/library/os.html">os</a> and <a href="https://pypi.python.org/pypi/python-osc">OSC</a></p>
<p><a href="https://puredata.info">Pure Data</p>
<p><a href="https://pzwiki.wdka.nl/mediadesign/The_Ultimate_RPi_Installation_Guide">RaspberryPi</a> and <a href="https://pzwiki.wdka.nl/mediadesign/Pi_skin_conductivity">Pi skin conductivity</a></p>
<p>Flyer: <a href="https://issue.xpub.nl/02/">https://issue.xpub.nl/02/</a></p>
<br>
<h1>References</h1>
<div class="footnotes">
<hr/>
<ol>
<li id="fn:1">
<p>Twitter is an online news and social networking service where users post and interact with messages, &ldquo;tweets,&rdquo; restricted to 140 characters, (<a href="http://twitter.com">http://twitter.com</a>).<a href="#fnref:1" rev="footnote">&#8617;</a></p></li>
<li id="fn:2">
<p>En meteen is daar de tweet: #waarwasBuma, De politieke strijd online, door Andreas Kouwenhoven &amp; Hugo Logtenberg, 27 februari 2017, 21:05 (<a href="https://www.nrc.nl/nieuws/2017/02/27/en-meteen-is-daar-de-tweet-waarwasbuma-7033073-a1547979">https://www.nrc.nl/nieuws/2017/02/27/en-meteen-is-daar-de-tweet-waarwasbuma-7033073-a1547979</a>).<a href="#fnref:2" rev="footnote">&#8617;</a></p></li>
<li id="fn:3">
<p>Sonification is the use of non-speech audio to convey information or perceptualize data. Auditory perception (the sensory system for the sense of hearing) has advantages in temporal, spatial, amplitude, and frequency resolution that open possibilities as an alternative to visualization techniques.<a href="#fnref:3" rev="footnote">&#8617;</a></p></li>
</ol>
</div>
</body>
</html>

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 274 274"><defs><style>.cls-1{fill:#fff;}.cls-2{fill:#e21e27;}</style></defs><title>Asset 11</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><path class="cls-1" d="M274,137a137,137,0,1,1-40.13-96.87A136.57,136.57,0,0,1,274,137Z"/><g id="aPOneC.tif"><path class="cls-2" d="M136.82,35.19h1.13a19.14,19.14,0,0,0,7.61,1.37c5.14.18,3.59-.54,7.05,3.57a1.74,1.74,0,0,1,.55,1.24c0,.28-.13.64.35.79.83.27.51.9.11,1.15-1,.67-1,1.8-1.55,2.77,2.54,1.19,5,2.34,7.44,3.46.55.25,1,.45.95,1.18-.19,1.93-.66,3.77-2.47,4.8a24.45,24.45,0,0,0-5.53,4.92,2.71,2.71,0,0,0-.89,1.71c0,3-2,4.42-4.28,5.73-6.84,3.89-13.39,8.26-20.09,12.39a7.61,7.61,0,0,0-1,.77.87.87,0,0,0-.34,1.11,1,1,0,0,0,1,.69,5.76,5.76,0,0,0,1,0c3-.39,5.86-1.15,8.8-1.69,5.06-.92,10.14-1.71,15.22-2.54,5.31-.86,10.61-1.78,15.94-2.53,8.4-1.18,16.83-2.09,25.28-2.8,1.26-.11,2.65-.52,3.6.93a4.34,4.34,0,0,1,2.73-1.61c5.19-.35,10.36-.84,15.52-1.51a3.45,3.45,0,0,1,2.46.16,15.58,15.58,0,0,0,7.51,2c1.31.07,2.6.31,3.91.48a1,1,0,0,1,.92.74,44.64,44.64,0,0,1,1.81,6.91c.32,2.4,1.25,4.58,3.5,5.76a1.5,1.5,0,0,1,.82,2.14c-.38,1.2-.84,2.39-1.24,3.59a4,4,0,0,0,.7,4c.22.29.54.54.52,1a26.74,26.74,0,0,1-5,4.71,13.92,13.92,0,0,0-4.76,5.6,2.24,2.24,0,0,1-1.25,1.25,29.5,29.5,0,0,1-5.87,1.77,11.55,11.55,0,0,0-4.62,1.86,18.8,18.8,0,0,1-9.08,3.74c-2.8.28-5.24,1.91-7.57,3.45-1.47,1-1.29,1.85.31,2.55a6.1,6.1,0,0,0,3.17.44,28.49,28.49,0,0,0,5.2-1.12,36.39,36.39,0,0,1,13.56-1.7c2,.14,3.9.49,5.87.54a10,10,0,0,1,6.45,2.31,12.65,12.65,0,0,0,2.86,1.77c3.77,1.73,5.67,4.57,5.47,8.76a14.31,14.31,0,0,0,1.18,6.43,4.8,4.8,0,0,1-1.44,6.07,24.24,24.24,0,0,0-4.95,5.87,24.16,24.16,0,0,1-8.11,7.94c-5.57,3.39-11.17,6.73-16.73,10.13-1.35.83-2.52,2.26-4,2.58-2.89.65-5,2.28-7.18,4.09-.81.69-1.64,1.78-2.68,1.66-2.27-.27-3.57,1-4.88,2.44a3.65,3.65,0,0,1-.68.48c-1.62,1.11-3.44,1.85-5.14,2.82a8.74,8.74,0,0,0-3.71,3.41,13.38,13.38,0,0,0,2.47.52A51.48,51.48,0,0,1,192,189.6a40.79,40.79,0,0,1,7.41,3.57c2.19,1.2,2.21,1.22,1.52,3.53a1.35,1.35,0,0,0,.53,1.76,9.25,9.25,0,0,1,3.47,6.06,7.93,7.93,0,0,1-.34,4.92c-.7.21-1-.25-1.33-.39s-.76-.32-1.14-.48a2.92,2.92,0,0,0-.13,3.68,1.54,1.54,0,0,1-.41,2.26c-1.7,1.55-3.29,3.2-5,4.74s-3.35,3.72-5.51,5A68.25,68.25,0,0,0,175.66,236a10.46,10.46,0,0,0-2.94,5.17,5.24,5.24,0,0,1-2.62,3.63,15.22,15.22,0,0,0-5.67,5.86,9.71,9.71,0,0,1-6,4.7c-2.23.63-4.6.18-6.79,1-1,.37-1.61.06-1.84-1-.37-1.66-1.3-2.17-3-1.86-2.32.42-3.2-.42-3.76-3-.12-.55-.17-1.11-.32-1.66a15.93,15.93,0,0,1-.78-6.92,2,2,0,0,0-.51-1.54,10.92,10.92,0,0,1-2.06-6.73c0-1.3.16-2.6.24-3.89-.13,0-.24,0-.31,0-.28.17-.54.37-.81.55a10.3,10.3,0,0,1-7.88,1.55c-3.13-.57-6.22-1.28-9.32-2a10,10,0,0,1-6.81-4.44,4.31,4.31,0,0,1-.92-3,12.73,12.73,0,0,0-2-9.36,6,6,0,0,1,0-6.53c1.69-2.8,3.43-5.58,5.19-8.34,5.82-9.13,14.1-15.89,22.22-22.77,1.23-1,2.7-1.84,3.38-3.63a14.18,14.18,0,0,0-3.39.31,34.26,34.26,0,0,0-6.69,2c-3.64,1.65-7.7,2.22-11.09,4.54-3.12,2.14-6.81,3.17-10.23,4.74-6.47,3-12.53,6.74-18.71,10.25-6,3.41-11.56,7.61-18.16,10.08a44.33,44.33,0,0,1-15,2.53,1.59,1.59,0,0,1-1.63-.85,6.65,6.65,0,0,0-2.71-2.6c-2.1-1.16-3-3-3.65-5.23-.74-2.72-.71-5.58-1.65-8.25-.65-1.85-1.43-3.66-2-5.53-.45-1.44-1.11-2.92-.35-4.49a17.62,17.62,0,0,1,2.22-3.57c1.16-1.4,2.32-2.8,2.52-4.74a3,3,0,0,1,1-1.67,58.35,58.35,0,0,1,5.75-5.36c8-6.16,16.48-11.78,24.85-17.48,3.55-2.41,7.44-4.35,10.8-7a96.06,96.06,0,0,1,11.91-7.76c3.68-2.09,7.44-4.07,10.55-7-2.63-2.71-2.53-4.19-7.16.33-2-1.15-2.41-1.16-4.21.36a3.66,3.66,0,0,1-2.84.85,12.81,12.81,0,0,0-5.79.66c-1.94.77-4,1.39-5.91,2.13-4.73,1.79-9.57,3.29-14.17,5.43-6.92,3.23-13.68,6.93-21.29,8.36a22.13,22.13,0,0,1-9.33-.14c-2.93-.7-5.57-2.11-8.31-3.23-3.1-1.27-3.5-2.17-3.12-5.55a12.7,12.7,0,0,0-.88-7.16,14.36,14.36,0,0,1-1.13-7,3.46,3.46,0,0,1,.89-2.41C35.88,114.77,38.1,112,41,110a7.31,7.31,0,0,0,1.58-1.38,119.41,119.41,0,0,1,16.68-16.8c4.81-4.1,9.73-8.08,13.74-13,.24-.3.73-.48.56-1-1.48-.32-3.11.46-4.4-.57a3,3,0,0,0-3.49-.2,7.93,7.93,0,0,1-6.11.66c-1.29-.47-2.35-1.48-4-1.52a9,9,0,0,0,.65-4.22A4.41,4.41,0,0,1,58,68.32c-.23-.47-.66-.55-1-.77-3.52-2.26-4.83-4.54-1.4-7.43.18-.15.33-.33.5-.49,5.5-5.24,12.23-8.28,19.32-10.64,3.44-1.15,6.9-2.24,10.37-3.31,2.62-.81,5.25-1.61,7.9-2.3,3.57-.92,7.16-1.77,10.75-2.58s7.11-1.56,10.74-2c2.65-.33,5.32-.41,7.94-1s5.09-.73,7.59-1.3C132.76,36,134.89,36.08,136.82,35.19Z"/></g></g></g></svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

@ -1 +0,0 @@
#N canvas 518 144 450 300 10;

@ -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>

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save