changes in index

master
karina 8 years ago
commit 4eba65f01b

19
.gitignore vendored

@ -1,6 +1,10 @@
/*
!.gitignore
!/boot
/boot/*
!/boot/config.txt
!/etc
/etc/*
@ -18,6 +22,10 @@
!/etc/dnsmasq.conf
!/etc/fstab
!/etc/group
!/etc/hostapd/
/etc/hostapd/*
!/etc/hostapd/hostapd.conf
@ -28,6 +36,8 @@
/etc/modprobe.d/*
!/etc/modprobe.d/alsa-base.conf
!/etc/modules
!/etc/network/
/etc/network/*
!/etc/network/interfaces
@ -37,12 +47,16 @@
!/etc/rc.local
!/floppies/
/floppies/*/
#/floppies/*/
!/usr/
/usr/*
!/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/*/
@ -57,4 +71,5 @@
*.pyc
.DS_Store
*DS_Store
._*

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

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

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

@ -11,10 +11,17 @@
#
# 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
alsactl --file /etc/asound.state restore
# Magnum Innominandum!!!!!!!!!
/usr/local/sbin/thewhispererindarkness.sh > /dev/console &
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;}
.st18{display:inline;}
.st19{fill:#FFFFFF;stroke:#000000;stroke-width:3.6669;stroke-miterlimit:10;}
.st20{stroke:#000000;stroke-width:4;stroke-miterlimit:10;}
</style>
@ -1601,7 +1603,7 @@
C634.6,549,634.7,549.4,634.7,549.9z"/>
<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>

Binary file not shown.

@ -1,17 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" type="text/css" href="style.css">
<title>The fine line - Existencialism and spirituality</title>
</head>
<body>
<div id="wrap">
</div>
</body>
</html>

@ -15,7 +15,7 @@
<p>This is a conceptual project based on a reflection around the sentence “The <b>FINE LINE</b> between <b>NOTHING MATTERS</b> and <b>EVERYTHING MATTERS</b>”. It took me a while to figure out how to translate this sentence into something. At the beginning, everything had to make perfect sense and had to have a reason to be. Among mind maps, research, crazy complicated ideas, and loads of thought, it became obvious that the concept was being explored from an “EVERYTHING MATTERS” perspective. Half of the sentence, “<b>NOTHING MATTERS</b>”, was being left behind. But, how to make a project based on meaninglessness? Suddenly, it clicked: <b>ANYWAY, WE ARE GOING TO DIE.</b> This sentence vanished all meaning this project could have, placing myself to the other side of the line. And then a process began: my mind tried to <b>MAKE SENSE</b> of everything saying words like: “If everyone thought this way, society would be aimless”. Then, on propose, I jumped to the other side: “Yes whatever, even though, we are going to die”. Quickly my mind tried to fix it again with other excuses in order to find meaning. And rushing, again on purpose, I shifted the side. It happened several times. I could feel the <b>TENSION</b>, the <b>POLARITIES</b>, the <b>OPPOSITION</b>: I was feeling the line between everything matters and nothing matters. </p>
<p style="margin-bottom:30px;">The idea of this project is to represent this line digitally and sonorously, and let the audience play with it. <b>SEEKING BALANCE AND BREAKING IT</b>. <b>HARMONIOUS</b> sounds and the <b>DISRUPTION</b> of those. Experiencing how close from each other <b>OPPOSITES</b> can be. </p>
<ul><a href="../fine-line/index.html" style="font-size:30px">EXPLORE THE LINE</a></ul>
<ul><a href="fine-line/index.html" style="font-size:30px">EXPLORE THE LINE</a></ul>
</div>
</body>
</html>

@ -220,7 +220,7 @@ if(mouseY <= height/2) {
background(255,255,255,opac); // alpha
// draw the shape of the waveform
drawWaveform();
//drawWaveform();
}

@ -4,16 +4,16 @@
<link rel="stylesheet" type="text/css" href="style.css">
<script language="javascript" type="text/javascript" src="../fine-line/libraries/p5.min.js"></script>
<script language="javascript" src="../fine-line/libraries/p5.dom.min.js"></script>
<script language="javascript" src="../fine-line/libraries/p5.sound.min.js"></script>
<script language="javascript" type="text/javascript" src="sketch.js"></script>
<!-- <script language="javascript" type="text/javascript" src="fine-line/libraries/p5.min.js"></script>
<script language="javascript" src="fine-line/libraries/p5.dom.min.js"></script>
<script language="javascript" src="fine-line/libraries/p5.sound.min.js"></script>
<script language="javascript" type="text/javascript" src="sketch.js"></script> -->
<title>The fine line</title>
</head>
<body>
<div id="canvasp5"></div>
<!-- <div id="canvasp5"></div> -->
<div id="wrap">
@ -28,7 +28,7 @@
<!--<ul><a href="essay.html">Existencialism and Spirituality</a></ul>-->
<ul><a href="explanation.html">Presentation of the line</a></ul>
<!--<ul><a href="score.html">Score to find the line</a></ul>-->
<ul><a href="../fine-line/index.html" style="font-size:30px">THE FINE LINE</a></ul>
<ul><a href="fine-line/index.html" style="font-size:30px">THE FINE LINE</a></ul>
</li>

@ -1,17 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" type="text/css" href="style.css">
<title>The fine line - Score</title>
</head>
<body>
<div id="wrap">
</div>
</body>
</html>

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

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 +1,22 @@
FLOPPYLEFT - 2017
Nietzsche Public License v0.6
Copyright <2017> <Giulia de Giovanelli>
Copyright, like God, is dead. Let its corpse serve only to guard against its
resurrection. You may do anything with this work that copyright law would
normally restrict so long as you retain the above notice(s), this license, and
the following misquote and disclaimer of warranty with all redistributed
copies, modified or verbatim. You may also replace this license with the Open
Works License, available at the http://owl.apotheon.org website.
Copyright is dead. Copyright remains dead, and we have killed it. How
shall we comfort ourselves, the murderers of all murderers? What was
holiest and mightiest of all that the world of censorship has yet owned has
bled to death under our knives: who will wipe this blood off us? What
water is there for us to clean ourselves? What festivals of atonement,
what sacred games shall we have to invent? Is not the greatness of this
deed too great for us? Must we ourselves not become authors simply to
appear worthy of it?
- apologies to Friedrich Wilhelm Nietzsche
No warranty is implied by distribution under the terms of this license.

@ -1,7 +1,16 @@
Author: Slavoj Žižek
Date: 1989
Title: The Sublime Object of Floppy
Author: Giulia de Giovanelli
Date: 2017
Title: Adopt A Walk
Description:
And so on, and so on, and so on.
This is an audio-guide of an experiment of gait analysis,
If you never heard about this term, gait analysis is the study of walking patterns as 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 identify someone by the way they walk?
Surveillance technologies are using homogenic perception of human beings as a model for their mechanics.”
With this experiment youre suggested to observe characteristics of other walks and adopt them.
In adopting a different walk do you become someone else?
Will it be you or someone elses identity that is detected by these surveillance algorithms?

@ -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/python
import os, random, time
while True:
freq = str(random.randint(0,10)*110)
print(freq)
os.system('echo "'+freq+';" | pdsend 3000')
time.sleep(0.25)
import subprocess
subprocess.call(["bash", "scripts/voiceguide.sh"], cwd="/media/floppy")

@ -0,0 +1,79 @@
#!/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)
path = "/var/www/static/gait"
try:
ff = os.listdir(path)
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
fp = os.path.join(path, f)
os.unlink(fp)
# 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="/static/gait/{{i.mp4}}"><img src="/static/gait/{{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_gras-webfont";
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=160, help="pre-detect resize width")
p.add_argument("--height", type=int, default=128, 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 = (args.width, args.height)
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,59 @@
# ensure the record folder exists
mkdir -p /var/www/static/gait
espeak "Gait analysis number one." -v en
v=-v en-gb -s 150
espeak "Tetra Gamma Gait Analysis " -v en-gb -s 150
sleep 1
espeak "Be ready for the security check." -v en-gb -s 150
sleep 1
espeak "Please state your name:" -v en
espeak "Please state your name:" -v en-gb -s 150
sleep 1
espeak "Position yourself 2 to 3 meters away from the Tetra Gamma Circulaire." -v en
espeak "Position yourself 2 to 3 meters away from me." -v en-gb -s 150
sleep 2
espeak "Walk towards the Tetra Gamma Circulaire in a straight line ." -v en
sleep 0.2
espeak "Walk towards me in a straight line ." -v en-gb -s 150
sleep 0.1
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...
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
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
mpv sweep_up.wav
espeak "Position yourself one meter away to the left of the Tetra Gamma Circulaire." -v en
sleep 1
espeak "Position yourself 2 to 3 meters away from me." -v en-gb -s 150
sleep 2
espeak "Walk from left to right in front of the Tetra Gamma Circulaire.
" -v en
sleep 0.2
espeak "Walk towards me on a zig zag line.
" -v en-gb -s150
sleep 0.1
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...
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
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
mpv sweep_up.wav
espeak "Turn your back to the Tetra Gamma Circulaire." -v en
espeak "Thank you for your cooperation" -v en-gb -s175
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 "Position yourself 2 to 3 meters away from the Tetra Gamma Circulaire." -v en
sleep 1
espeak "Walk towards the Tetra Gamma Circulaire on a zig zag line.
" -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
mpv sweep_up.wav
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
import os, random, time
while True:
freq = str(random.randint(0,10)*110)
print(freq)
os.system('echo "'+freq+';" | pdsend 3000')
time.sleep(0.25)
import subprocess
subprocess.call(["mpv", "inthemood.mp3", "--loop", "inf", "--volume", "25"], cwd="/media/floppy")

@ -7,16 +7,16 @@ import subprocess
f = cgi.FieldStorage()
p = f.getvalue("p", "Bump.mp3")
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 "Content-type:text/html; charset=utf-8"
print
print """<html>
<head>
<meta http-equiv="refresh" content="0;url=/pushingscore-Karina.html" />
<meta http-equiv="refresh" content="0;url=/index.html" />
</head>
<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,128 @@
GREAT JOB!
<!DOCTYPE html>
<html>
<head>
<title> Rock Step - Triple Step - Triple Step </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<style>
body {
margin-left: 20;
margin-right: 20;
padding: 0;
}
h1 {
font-family: sans-serif, Avenir, 'Poiret One' ;
font: 8px;
/* font size and typeface not working */
text-align: center;
text-transform: capitalize;
color: rgb(61, 61, 92);
}
.responsive {
padding: 0px;
float: left;
width: 12.5%;
}
@media only screen and (max-width: 700px){
.responsive {
width: 24.99999%;
margin: 6px 0;
}
}
@media only screen and (max-width: 320px){
.responsive {
width: 50%;
}
}
form.buttons {
}
form.buttons input {
width: 150px;
height: 150px;
/*hide the labels*/
font-size: 0;
line-height: 0;
border: 0;
margin: ;
}
</style>
</head>
<body>
<!--
/* For devices smaller than 400px: */
body {
background-image: url('img_smallflower.jpg');
}
/* For devices 400px and larger: */
@media only screen and (min-device-width: 400px) {
body {
background-image: url('img_flowers.jpg');
}
}
-->
<h1> rock step - triple step - triple step </h1>
<br>
<br>
<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;" />
<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;" />
<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;" />
<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;" />
<!-- "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>
<!-- no slider for the launch day
<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,128 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title> Rock-step - Triple-Step - Triple-Step </title>
<style>
body {
margin-left: 20;
margin-right: 20;
padding: 0;
}
h1 {
font-family: sans-serif, Avenir, 'Poiret One' ;
font: 8px;
/* font size and typeface not working */
text-align: center;
text-transform: capitalize;
color: rgb(61, 61, 92);
}
.responsive {
padding: 0px;
float: left;
width: 12.5%;
}
@media only screen and (max-width: 700px){
.responsive {
width: 24.99999%;
margin: 6px 0;
}
}
@media only screen and (max-width: 320px){
.responsive {
width: 50%;
}
}
form.buttons {
}
form.buttons input {
width: 150px;
height: 150px;
/*hide the labels*/
font-size: 0;
line-height: 0;
border: 0;
margin: ;
}
</style>
</head>
<body>
<!--
/* For devices smaller than 400px: */
body {
background-image: url('img_smallflower.jpg');
}
/* For devices 400px and larger: */
@media only screen and (min-device-width: 400px) {
body {
background-image: url('img_flowers.jpg');
}
}
-->
<h1> rock-step - triple-step - triple-step </h1>
<br>
<br>
<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;" />
<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;" />
<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;" />
<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;" />
<!-- "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>
<!-- no slider for the launch day
<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 time import sleep
import OSC
@ -8,7 +9,7 @@ import OSC
client = OSC.OSCClient()
address = '127.0.0.1', 4000 # 57120==SC
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'
@ -16,26 +17,38 @@ 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
then = None
with open('final-ikstem-openinghours.csv', 'rU') as csvfile:
with open('/tmp/twittersonification.csv', 'rU') as csvfile:
file = csv.DictReader(csvfile)
print file
print ("2.opening file stderr", file=sys.stderr)
#csv.DictReader(csvfile)(["time"] + ['time'])
i=0
sleep_time=1
for row in file:
#print row
print ("3.row stderr", file=sys.stderr)
i+=1
t = row['time']
print ("4.time stderr", file=sys.stderr)
t = float(t)
now = datetime.fromtimestamp(t) #[]dictreader reads the rowheader
print now, row
#print now, row
if then:
ti = (now-then).total_seconds()
#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():
msg.append( ['both', str(now)] )
@ -44,9 +57,12 @@ with open('final-ikstem-openinghours.csv', 'rU') as csvfile:
elif '#gestemd' in row['text'].lower():
msg.append( ['#gestemd', str(now)] )
# msg.append( [ str(row['text']) ] )
# send an osc message to pd
print msg#[ i, row['text'], str(now)]
#print msg#[ i, row['text'], str(now)]
sleep(sleep_time)
client.send(msg)
msg.clearData()
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,19 @@
Creative Commons License
This work is licensed under the Creative Commons Attribution 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by/4.0/ or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
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.
No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits.
Notices:
You do not have to comply with the license for elements of the material in the public domain or where your use is permitted by an applicable exception or limitation.
No warranties are given. The license may not give you all of the permissions necessary for your intended use. For example, other rights such as publicity, privacy, or moral rights may limit how you use the material.

@ -0,0 +1,11 @@
Author: Max Franklin
Date: 2017
Title: euclid
Description:
A chaotic software and hardware synthesiser and generative sequencer. Designed to explore improvisation, and musical interactivity.
To play, touch the metal contacts, connecting them. The more conductive you are, the more you will be able to affect the instrument.
The state of your composition is recorded, and displayed here as a downloadable score. Never to be played, nor heard again.

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; }

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

Loading…
Cancel
Save