diff --git a/floppies/giulia/LICENSE b/floppies/giulia/LICENSE
new file mode 100644
index 0000000..bc8fde7
--- /dev/null
+++ b/floppies/giulia/LICENSE
@@ -0,0 +1 @@
+FLOPPYLEFT - 2017
diff --git a/floppies/giulia/README b/floppies/giulia/README
new file mode 100644
index 0000000..aec7f25
--- /dev/null
+++ b/floppies/giulia/README
@@ -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.
diff --git a/floppies/giulia/cgi-bin/index.cgi b/floppies/giulia/cgi-bin/index.cgi
new file mode 100755
index 0000000..b145d97
--- /dev/null
+++ b/floppies/giulia/cgi-bin/index.cgi
@@ -0,0 +1,50 @@
+#!/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(".")
+tpat = re.compile(r"^(\d\d\d\d)(\d\d)(\d\d)T(\d\d)(\d\d)(\d\d)Z")
+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)]
+
+# # 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"""
+
+RECORD O RAMA
+
+
+
+
+{% for i in items %}
+
+{% endfor %}
+
+
+
+
+
+""").render(items=items).encode("utf-8")
\ No newline at end of file
diff --git a/floppies/giulia/cgi-bin/record.cgi b/floppies/giulia/cgi-bin/record.cgi
new file mode 100755
index 0000000..5ac84c6
--- /dev/null
+++ b/floppies/giulia/cgi-bin/record.cgi
@@ -0,0 +1,23 @@
+#!/usr/bin/env python
+
+import cgi, sys, datetime
+import cgitb; cgitb.enable()
+import subprocess
+
+print "Content-type: text/html"
+print
+print "hello from python
"
+
+n = datetime.datetime.now()
+
+basename = n.strftime("%Y%m%dT%H%M%SZ")
+
+o1 = subprocess.check_output(["scripts/simplerecord.py", "--output", basename+".avi", "--time", "5"])
+print o1 + "
\n"
+o2 = subprocess.check_output(["ffmpeg", "-i", basename+".avi", "-y", basename+".mp4"])
+print o2 + "
\n"
+o2 = subprocess.check_output(["ffmpeg", "-i", basename+".avi", "-ss", "1", "-vframes", "1", "-y", basename+".jpg"])
+print o2 + "
\n"
+
+# print """VIDEO""".format(basename)
+print """OK"""
diff --git a/floppies/giulia/instructions.txt b/floppies/giulia/instructions.txt
new file mode 100644
index 0000000..653947b
--- /dev/null
+++ b/floppies/giulia/instructions.txt
@@ -0,0 +1,11 @@
+Gait analysis number one.
+Please state your name:
+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.
+Walk towards the Tetra Gamma Circulaire on a zig zag line.
+
diff --git a/floppies/giulia/main.pd b/floppies/giulia/main.pd
new file mode 100644
index 0000000..92bcef6
--- /dev/null
+++ b/floppies/giulia/main.pd
@@ -0,0 +1,12 @@
+#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;
diff --git a/floppies/giulia/main.py b/floppies/giulia/main.py
new file mode 100644
index 0000000..715ce35
--- /dev/null
+++ b/floppies/giulia/main.py
@@ -0,0 +1,12 @@
+#!/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)
+
+
+
diff --git a/floppies/giulia/noweb/index.html b/floppies/giulia/noweb/index.html
new file mode 100644
index 0000000..bc6fe43
--- /dev/null
+++ b/floppies/giulia/noweb/index.html
@@ -0,0 +1 @@
+GREAT JOB!
diff --git a/floppies/giulia/scriptespeak.py b/floppies/giulia/scriptespeak.py
new file mode 100755
index 0000000..ac506c3
--- /dev/null
+++ b/floppies/giulia/scriptespeak.py
@@ -0,0 +1,17 @@
+#! /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
+
\ No newline at end of file
diff --git a/floppies/giulia/scripts/black.py b/floppies/giulia/scripts/black.py
new file mode 100755
index 0000000..b6b3e65
--- /dev/null
+++ b/floppies/giulia/scripts/black.py
@@ -0,0 +1,64 @@
+#!/usr/bin/env python
+
+import numpy as np
+import cv2
+import video
+
+
+def draw_flow(img, flow, step=16):
+ h, w = img.shape[:2]
+ y, x = np.mgrid[step/2:h:step, step/2:w:step].reshape(2,-1)
+ fx, fy = flow[y,x].T
+ lines = np.vstack([x, y, x+fx, y+fy]).T.reshape(-1, 2, 2)
+ lines = np.int32(lines + 0.5)
+ vis = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
+
+ cv2.polylines(vis, lines, 0, (0, 0, 0))
+ # for (x1, y1), (x2, y2) in lines:
+ # cv2.circle(vis, (x1, y1), 1, (0, 255, 0), -1)
+ return vis
+
+def draw_hsv(flow):
+ h, w = flow.shape[:2]
+ fx, fy = flow[:,:,0], flow[:,:,1]
+ ang = np.arctan2(fy, fx) + np.pi
+ v = np.sqrt(fx*fx+fy*fy)
+
+ # hsv = np.zeros((h, w, 3), np.uint8)
+ # hsv[...,0] = ang*(180/np.pi/2)
+ # hsv[...,1] = 255
+ # hsv[...,2] = np.minimum(v*4, 255)
+ # bgr = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
+
+ f = np.zeros((h, w, 3), np.uint8)
+ f[...,0] = 0 #np.minimum(v*10, 255)
+
+ f[...,1] = 0
+ f[...,2] = 255- np.minimum(v**2, 255) #ang*(180/np.pi/2)
+ bgr = cv2.cvtColor(f, cv2.COLOR_HSV2BGR)
+
+ return bgr
+
+width, height = 640, 480
+cam = video.create_capture("0:size="+str(width)+"x"+str(height))
+
+while True:
+ ret, prev = cam.read()
+ prevgray = cv2.cvtColor(prev, cv2.COLOR_BGR2GRAY)
+ if prevgray.shape == (height, width):
+ break
+
+while True:
+ ret, img = cam.read()
+ gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
+ print prevgray.shape, gray.shape
+ flow = cv2.calcOpticalFlowFarneback(prevgray, gray, 0.5, 3, 15, 3, 5, 1.2, 0)
+ prevgray = gray
+
+ # cv2.imshow('flow', draw_flow(gray, flow))
+ cv2.imshow('flow', draw_hsv(flow))
+
+ ch = 0xFF & cv2.waitKey(5)
+ if ch == 27:
+ break
+cv2.destroyAllWindows()
diff --git a/floppies/giulia/scripts/black2.py b/floppies/giulia/scripts/black2.py
new file mode 100755
index 0000000..f7d868a
--- /dev/null
+++ b/floppies/giulia/scripts/black2.py
@@ -0,0 +1,93 @@
+#!/usr/bin/env python
+
+from __future__ import print_function
+import cv2, os, sys, time
+import numpy as np
+from argparse import ArgumentParser
+
+
+def draw(flow):
+ h, w = flow.shape[:2]
+ fx, fy = flow[:,:,0], flow[:,:,1]
+ ang = np.arctan2(fy, fx) + np.pi
+ v = np.sqrt(fx*fx+fy*fy)
+
+ # hsv = np.zeros((h, w, 3), np.uint8)
+ # hsv[...,0] = ang*(180/np.pi/2)
+ # hsv[...,1] = 255
+ # hsv[...,2] = np.minimum(v*4, 255)
+ # bgr = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
+
+ f = np.zeros((h, w, 3), np.uint8)
+ f[...,0] = 0 #np.minimum(v*10, 255)
+
+ f[...,1] = 0
+ f[...,2] = 255- np.minimum(v**2, 255) #ang*(180/np.pi/2)
+ bgr = cv2.cvtColor(f, cv2.COLOR_HSV2BGR)
+
+ return bgr
+
+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("--time", type=float, default=None)
+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
+
+try:
+ if args.time != None:
+ start = time.time()
+ while True:
+ ret, frame = cam.read()
+
+ gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
+ flow = cv2.calcOpticalFlowFarneback(prevgray, gray, 0.5, 3, 15, 3, 5, 1.2, 0)
+ prevgray = gray
+ frame = draw(flow)
+
+ if out != None:
+ out.write(frame)
+ if args.show:
+ cv2.imshow('display', frame)
+ if cv2.waitKey(5) & 0xFF == ord('q'):
+ break
+ if args.time != None:
+ elapsed = time.time() - start
+ if (elapsed >= args.time):
+ break
+except KeyboardInterrupt:
+ pass
+
+print ("\nCleaning up...")
+if out:
+ out.release()
+if args.show:
+ cv2.destroyAllWindows()
+
+
+
diff --git a/floppies/giulia/scripts/simplerecord.py b/floppies/giulia/scripts/simplerecord.py
new file mode 100755
index 0000000..3cde98f
--- /dev/null
+++ b/floppies/giulia/scripts/simplerecord.py
@@ -0,0 +1,68 @@
+#!/usr/bin/env python
+
+from __future__ import print_function
+import cv2, os, sys, time
+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("--time", type=float, default=None)
+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
+
+try:
+ if args.time != None:
+ start = time.time()
+ while True:
+ ret, frame = cam.read()
+ if out != None:
+ out.write(frame)
+ if args.show:
+ cv2.imshow('display', frame)
+ if cv2.waitKey(5) & 0xFF == ord('q'):
+ break
+ if args.time != None:
+ elapsed = time.time() - start
+ if (elapsed >= args.time):
+ break
+
+except KeyboardInterrupt:
+ pass
+
+print ("\nCleaning up...")
+if out:
+ out.release()
+if args.show:
+ cv2.destroyAllWindows()
+
+
+
+
+
+
+
+
+
+
+