Merge branch 'writeup'
authorNeil Smith <neil.github@njae.me.uk>
Wed, 24 Apr 2013 12:47:51 +0000 (13:47 +0100)
committerNeil Smith <neil.github@njae.me.uk>
Wed, 24 Apr 2013 12:47:51 +0000 (13:47 +0100)
Conflicts:
README.md

44 files changed:
.Rhistory [new file with mode: 0644]
.gitignore
STE-000.wav [new file with mode: 0644]
arduino/drums.ino [deleted file]
arduino/guitar.ino [deleted file]
arduino/maracas.ino [deleted file]
raspberrypi/music-maker-handler.py [deleted file]
raspberrypi/music-maker.sb [deleted file]
release/cymbal.wav [new file with mode: 0644]
release/guitar.gif [new file with mode: 0644]
release/guitar1.wav [new file with mode: 0644]
release/guitar2.wav [new file with mode: 0644]
release/guitar3.wav [new file with mode: 0644]
release/guitar4.wav [new file with mode: 0644]
release/guitar5.wav [new file with mode: 0644]
release/hihat.wav [new file with mode: 0644]
release/instruments/instruments.ino [new file with mode: 0644]
release/instruments1/instruments1.ino [new file with mode: 0644]
release/instruments2/instruments2.ino [new file with mode: 0644]
release/instruments3/instruments3.ino [new file with mode: 0644]
release/maracas.gif [new file with mode: 0644]
release/maracas.wav [new file with mode: 0644]
release/miniband.py [new file with mode: 0755]
release/miniband1.sb [new file with mode: 0644]
release/miniband2.sb [new file with mode: 0644]
release/miniband3.sb [new file with mode: 0644]
release/scratchthumbs.db [new file with mode: 0644]
release/slowdrum.wav [new file with mode: 0644]
release/snare.wav [new file with mode: 0644]
writeup/.directory [new file with mode: 0644]
writeup/drums-script.png [new file with mode: 0644]
writeup/drums.fzz [new file with mode: 0644]
writeup/drums_bb.png [new file with mode: 0644]
writeup/drums_schem.png [new file with mode: 0644]
writeup/enable-remote-sensors.png [new file with mode: 0644]
writeup/guitar.fzz [new file with mode: 0644]
writeup/guitar_bb.png [new file with mode: 0644]
writeup/guitar_schem.png [new file with mode: 0644]
writeup/maracas-script.png [new file with mode: 0644]
writeup/maracas.fzz [new file with mode: 0644]
writeup/maracas_bb.png [new file with mode: 0644]
writeup/maracas_schem.png [new file with mode: 0644]
writeup/miniband.doc [new file with mode: 0644]
writeup/miniband.odt [new file with mode: 0644]

diff --git a/.Rhistory b/.Rhistory
new file mode 100644 (file)
index 0000000..e69de29
index d2d6f360b5d1ea91375f06547df0048ec47a4862..50bc3314262683bdb9ae9ef76c5071635fa3adbc 100644 (file)
@@ -33,3 +33,9 @@ nosetests.xml
 .mr.developer.cfg
 .project
 .pydevproject
+
+# Backup files
+*~
+
+# Open Office lock files
+.~lock*#
diff --git a/STE-000.wav b/STE-000.wav
new file mode 100644 (file)
index 0000000..6ed2985
Binary files /dev/null and b/STE-000.wav differ
diff --git a/arduino/drums.ino b/arduino/drums.ino
deleted file mode 100644 (file)
index 4b3c18c..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-
-#define THRESHOLD 64
-#define PADNUM 4
-#define PINLIMIT 500
-
-int val;
-int pinDelay;
-int pinDelays[4] = { 0, 0, 0, 0 };
-
-void setup() {
-  Serial.begin(57600);
-}
-
-void loop() {
-  for(int i = 0; i < PADNUM; i++) {
-    val = analogRead(i);
-    pinDelay = pinDelays[i];
-    
-    if(val >= THRESHOLD && pinDelay < 1) {
-      Serial.print(i);
-      Serial.print(",");
-      Serial.print(val);
-      Serial.println();
-      pinDelays[i] = PINLIMIT;
-    }
-    
-    if (pinDelay > 0) {
-      pinDelays[i] = pinDelay - 1;
-    }
-  }
-}
-  
diff --git a/arduino/guitar.ino b/arduino/guitar.ino
deleted file mode 100644 (file)
index 874a163..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-
-#define THRESHOLD 16
-#define PADNUM 1
-#define PINLIMIT 5000
-
-int val;
-int pinDelay;
-int pinDelays[4] = { 0, 0, 0, 0 };
-
-void setup() {
-  Serial.begin(57600);
-}
-
-void loop() {
-  for(int i = 0; i < PADNUM; i++) {
-    val = analogRead(i);
-    pinDelay = pinDelays[i];
-    
-    if (val >= THRESHOLD && pinDelay < 1) {
-      Serial.print(i);
-      Serial.print(",");
-      Serial.print(val);
-      Serial.println();
-      pinDelays[i] = PINLIMIT;
-    }
-    
-    if (pinDelay > 0) {
-      pinDelays[i] = pinDelay - 1;
-    }
-  }
-}
-  
diff --git a/arduino/maracas.ino b/arduino/maracas.ino
deleted file mode 100644 (file)
index a50a53a..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-int newState;\r
-int states[] = {-1,-1};\r
-const int wait = 500;\r
-\r
-void setup() {\r
-  Serial.begin(9600);\r
-}\r
-void loop() {\r
-  for (int i = 0; i < 3; i+=2) {\r
-    newState = digitalRead(i);\r
-    if (newState != states[i]) {\r
-      Serial.print(i);\r
-      Serial.print(",1023");\r
-      Serial.println();\r
-      states[i] = newState;\r
-      delay(wait);\r
-    } \r
-  }\r
-}
\ No newline at end of file
diff --git a/raspberrypi/music-maker-handler.py b/raspberrypi/music-maker-handler.py
deleted file mode 100755 (executable)
index eb83ce0..0000000
+++ /dev/null
@@ -1,215 +0,0 @@
-# This code is copyright ...... under the GPL v2.
-# This code is derived from scratch_gpio_handler by Simon Walters, which
-# is derived from scratch_handler by Thomas Preston
-# Version 0.1: It's kind of working.
-
-from array import *
-import threading
-import socket
-import time
-import sys
-import struct
-import serial
-import io
-import datetime as dt
-
-'''
-from Tkinter import Tk
-from tkSimpleDialog import askstring
-root = Tk()
-root.withdraw()
-'''
-
-PORT = 42001
-DEFAULT_HOST = '127.0.0.1'
-BUFFER_SIZE = 240 #used to be 100
-SOCKET_TIMEOUT = 1
-DRUM_DEVICE = '/dev/ttyACM0'
-GUITAR_DEVICE = '/dev/ttyUSB1'
-MARACAS_DEVICE = '/dev/ttyACM1'
-ARDUINO_BAUD_RATE = 57600
-
-DRUM_INSTRUMENT_NAMES = {0: 'cymbal',
-    1: 'hihat',
-    2: 'slowdrum',
-    3: 'snare',
-    4: 'tomtom'}
-
-DRUM_VALUE_NAMES = {0: 'drum-volume',
-    1: 'drum-volume',
-    2: 'drum-volume',
-    3: 'drum-volume',
-    4: 'drum-volume'}
-
-GUITAR_INSTRUMENT_NAMES = {0: 'guitar'}
-GUITAR_VALUE_NAMES = {0: 'guitar_pitch'}
-
-GUITAR_INSTRUMENT_NAMES = {0: 'guitar'}
-GUITAR_VALUE_NAMES = {0: 'guitar_pitch'}
-
-MARACAS_INSTRUMENT_NAMES = {0: 'maracas', 2: 'maracas'}
-MARACAS_VALUE_NAMES = {0: 'maracas_vigour', 2: 'maracas_vigour'}
-
-
-class MyError(Exception):
-    def __init__(self, value):
-        self.value = value
-
-    def __str__(self):
-        return repr(self.value)
-
-class ScratchSender(threading.Thread):
-    def __init__(self, socket):
-        threading.Thread.__init__(self)
-        self.scratch_socket = socket
-        self._stop = threading.Event()
-
-
-    def stop(self):
-        self._stop.set()
-
-    def stopped(self):
-        return self._stop.isSet()
-
-    def run(self):
-        # Detect sensors here
-        
-        while not self.stopped():
-            time.sleep(0.01) # be kind to cpu - not certain why :)
-
-    def send_scratch_command(self, cmd):
-        n = len(cmd)
-        a = array('c')
-        a.append(chr((n >> 24) & 0xFF))
-        a.append(chr((n >> 16) & 0xFF))
-        a.append(chr((n >>  8) & 0xFF))
-        a.append(chr(n & 0xFF))
-        self.scratch_socket.send(a.tostring() + cmd)
-
-
-class ArduinoListener(threading.Thread):
-    def __init__(self, device, speed, sender, instruments, values):
-        threading.Thread.__init__(self)
-        self.arduino_device = serial.Serial(device, speed)
-        self._stop = threading.Event()
-        self.scratch_sender = sender
-        self.instruments = instruments
-        self.values = values  
-
-    def stop(self):
-        self._stop.set()
-
-    def stopped(self):
-        return self._stop.isSet()
-
-    def run(self):
-        self.arduino_device.readline() # discard the first (partial) line
-        while not self.stopped():
-            try:
-                pin_string, pin_value_string = self.arduino_device.readline().rstrip().split(',', 1)
-                pin = int(pin_string)
-                pin_value = int(pin_value_string)
-                print dt.datetime.now(), 'Pin: %d, Value: %d' % (pin, pin_value)
-                try:
-                    print "sensor-update %s %d" % (self.values[pin], (pin_value * 100) / 1024)
-                    self.scratch_sender.send_scratch_command("sensor-update %s %d" % (self.values[pin], (pin_value * 100) / 1024))
-                except KeyError:
-                    # Do nothing
-                    pass
-                try:
-                    print "broadcast %s" % self.instruments[pin]
-                    self.scratch_sender.send_scratch_command('broadcast %s' % self.instruments[pin])
-                except KeyError:
-                    # Do nothing
-                    pass
-
-            except serial.SerialException:
-                print 'Serial exception'
-
-
-
-def create_socket(host, port):
-    while True:
-        try:
-            print 'Trying'
-            scratch_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-            scratch_sock.connect((host, port))
-            break
-        except socket.error:
-            print "There was an error connecting to Scratch!"
-            print "I couldn't find a Mesh session at host: %s, port: %s" % (host, port) 
-            time.sleep(3)
-            #sys.exit(1)
-
-    return scratch_sock
-
-def cleanup_threads(threads):
-    for thread in threads:
-        thread.stop()
-
-    for thread in threads:
-        thread.join()
-
-if __name__ == '__main__':
-    if len(sys.argv) > 1:
-        host = sys.argv[1]
-    else:
-        host = DEFAULT_HOST
-
-
-cycle_trace = 'start'
-while True:
-    if (cycle_trace == 'disconnected'):
-        print "Scratch disconnected"
-        cleanup_threads((listener, sender))
-        time.sleep(1)
-        cycle_trace = 'start'
-
-    if (cycle_trace == 'start'):
-        # open the socket
-        print 'Starting to connect...' ,
-        the_socket = create_socket(host, PORT)
-        print 'Connected!'
-        the_socket.settimeout(SOCKET_TIMEOUT)
-##        data = the_socket.recv(BUFFER_SIZE)
-##        print "Discard 1st data buffer" , data[4:].lower()
-        sender = ScratchSender(the_socket)
-        drum_listener = ArduinoListener(DRUM_DEVICE, ARDUINO_BAUD_RATE, sender, DRUM_INSTRUMENT_NAMES, DRUM_VALUE_NAMES)
-        guitar_listener = ArduinoListener(GUITAR_DEVICE, ARDUINO_BAUD_RATE, sender, GUITAR_INSTRUMENT_NAMES, GUITAR_VALUE_NAMES)
-        maracas_listener = ArduinoListener(MARACAS_DEVICE, ARDUINO_BAUD_RATE, sender, MARACAS_INSTRUMENT_NAMES, MARACAS_VALUE_NAMES)
-        cycle_trace = 'running'
-        print "Running...."
-       sender.start()
-        drum_listener.start()
-        guitar_listener.start()
-        maracas_listener.start()
-
-        #pin = 1
-        #pin_value = 512
-        #print 'Sending:' "sensor-update %s %d" % (VOLUME_NAMES[pin], (pin_value * 100) / 1024)
-        #sender.send_scratch_command("sensor-update %s %d" % (VOLUME_NAMES[pin], (pin_value * 100) / 1024))
-        #print 'Sending:' 'broadcast %s' % INSTRUMENT_NAMES[pin]
-        #sender.send_scratch_command('broadcast %s' % INSTRUMENT_NAMES[pin])
-
-        #sender.send_scratch_command("sensor-update guitar-pitch 10")
-       #sender.send_scratch_command("broadcast cymbal")
-       #time.sleep(1)
-       #sender.send_scratch_command("broadcast snare")
-       #time.sleep(1)
-        #sender.send_scratch_command("broadcast hihat")
-       #time.sleep(1)
-        #sender.send_scratch_command("broadcast slowdrum")
-       #time.sleep(1)
-        #sender.send_scratch_command("broadcast tomtom")
-       #time.sleep(1)
-
-    # wait for ctrl+c
-    try:
-        #just pause
-        
-#        else:
-            time.sleep(0.1)
-    except KeyboardInterrupt:
-        cleanup_threads((sender, drum_listener, guitar_listener, maracas_listener))
-        sys.exit()
-
diff --git a/raspberrypi/music-maker.sb b/raspberrypi/music-maker.sb
deleted file mode 100755 (executable)
index 64f848d..0000000
Binary files a/raspberrypi/music-maker.sb and /dev/null differ
diff --git a/release/cymbal.wav b/release/cymbal.wav
new file mode 100644 (file)
index 0000000..7c2e528
Binary files /dev/null and b/release/cymbal.wav differ
diff --git a/release/guitar.gif b/release/guitar.gif
new file mode 100644 (file)
index 0000000..b453957
Binary files /dev/null and b/release/guitar.gif differ
diff --git a/release/guitar1.wav b/release/guitar1.wav
new file mode 100644 (file)
index 0000000..1de2ccc
Binary files /dev/null and b/release/guitar1.wav differ
diff --git a/release/guitar2.wav b/release/guitar2.wav
new file mode 100644 (file)
index 0000000..955de5b
Binary files /dev/null and b/release/guitar2.wav differ
diff --git a/release/guitar3.wav b/release/guitar3.wav
new file mode 100644 (file)
index 0000000..3486c86
Binary files /dev/null and b/release/guitar3.wav differ
diff --git a/release/guitar4.wav b/release/guitar4.wav
new file mode 100644 (file)
index 0000000..9c15de5
Binary files /dev/null and b/release/guitar4.wav differ
diff --git a/release/guitar5.wav b/release/guitar5.wav
new file mode 100644 (file)
index 0000000..3f9dcc5
Binary files /dev/null and b/release/guitar5.wav differ
diff --git a/release/hihat.wav b/release/hihat.wav
new file mode 100644 (file)
index 0000000..e591363
Binary files /dev/null and b/release/hihat.wav differ
diff --git a/release/instruments/instruments.ino b/release/instruments/instruments.ino
new file mode 100644 (file)
index 0000000..61442ff
--- /dev/null
@@ -0,0 +1,86 @@
+const int NUMBER_OF_MARACAS = 2;
+const int MARACAS_PINS[] = {6, 7};
+const int MARACAS_DELAY = 5000;
+
+const int NUMBER_OF_DRUMS= 4;
+const int DRUM_PINS[] = {8, 9, 10, 11};
+const int DRUM_DELAY = 2500;
+
+const int GUITAR_THRESHOLD = 20;
+const int GUITAR_PIN = A0;
+const int GUITAR_DELAY = 5000;
+
+int maracas_states[] = {-1,-1};
+int maracas_delays[] = {0, 0};
+
+int drum_delays[] = {0, 0, 0, 0};
+
+int guitar_delay = 0;
+
+void setup() {
+  for (int i = 0; i < NUMBER_OF_MARACAS; i++) {
+    pinMode(MARACAS_PINS[i], INPUT);
+  }
+  for (int i = 0; i < NUMBER_OF_DRUMS; i++) {
+    pinMode(DRUM_PINS[i], INPUT);
+  }
+  Serial.begin(9600);
+}
+
+void loop() {
+  maracas();
+  drums();
+  guitar();
+  update_delays();  
+}
+
+
+void maracas() {
+  for (int i = 0; i < NUMBER_OF_MARACAS; i++) {
+    int newState = digitalRead(MARACAS_PINS[i]);
+    if (newState != maracas_states[i] && maracas_delays[i] < 1) {
+      Serial.print("maracas,");
+      Serial.print(i);
+      Serial.println();
+      maracas_states[i] = newState;
+      maracas_delays[i] = MARACAS_DELAY;
+    }
+  }
+}
+
+void drums() {
+  for (int i = 0; i < NUMBER_OF_DRUMS; i++) {
+    if (digitalRead(DRUM_PINS[i]) == HIGH && drum_delays[i] < 1) {
+      Serial.print("drum,");
+      Serial.print(i);
+      Serial.println();
+      drum_delays[i] = DRUM_DELAY;
+    }
+  }
+}
+
+void guitar() {
+  int pitch = analogRead(GUITAR_PIN);
+  if (pitch >= GUITAR_THRESHOLD && guitar_delay < 1) {
+    Serial.print("guitar,");
+    Serial.print(pitch);
+    Serial.println();
+    guitar_delay = GUITAR_DELAY;
+  }
+}
+
+void update_delays() {
+  for (int i = 0; i < NUMBER_OF_MARACAS; i++) {
+    if (maracas_delays[i] > 0) {
+      maracas_delays[i] -= 1;
+    }
+  }
+  for (int i = 0; i < NUMBER_OF_DRUMS; i++) {
+    if (drum_delays[i] > 0) {
+      drum_delays[i] -= 1;
+    }
+  }
+  if (guitar_delay > 0) {
+    guitar_delay -= 1;
+  }
+}
diff --git a/release/instruments1/instruments1.ino b/release/instruments1/instruments1.ino
new file mode 100644 (file)
index 0000000..b3b3159
--- /dev/null
@@ -0,0 +1,40 @@
+const int NUMBER_OF_MARACAS = 2;
+const int MARACAS_PINS[] = {6, 7};
+const int MARACAS_DELAY = 5000;
+
+int maracas_states[] = {-1,-1};
+int maracas_delays[] = {0, 0};
+
+void setup() {
+  for (int i = 0; i < NUMBER_OF_MARACAS; i++) {
+    pinMode(MARACAS_PINS[i], INPUT);
+  }
+  Serial.begin(9600);
+}
+
+void loop() {
+  maracas();
+  update_delays();  
+}
+
+
+void maracas() {
+  for (int i = 0; i < NUMBER_OF_MARACAS; i++) {
+    int newState = digitalRead(MARACAS_PINS[i]);
+    if (newState != maracas_states[i] && maracas_delays[i] < 1) {
+      Serial.print("maracas,");
+      Serial.print(i);
+      Serial.println();
+      maracas_states[i] = newState;
+      maracas_delays[i] = MARACAS_DELAY;
+    }
+  }
+}
+
+void update_delays() {
+  for (int i = 0; i < NUMBER_OF_MARACAS; i++) {
+    if (maracas_delays[i] > 0) {
+      maracas_delays[i] -= 1;
+    }
+  }
+}
diff --git a/release/instruments2/instruments2.ino b/release/instruments2/instruments2.ino
new file mode 100644 (file)
index 0000000..66c8413
--- /dev/null
@@ -0,0 +1,66 @@
+const int NUMBER_OF_MARACAS = 2;
+const int MARACAS_PINS[] = {6, 7};
+const int MARACAS_DELAY = 5000;
+
+const int NUMBER_OF_DRUMS= 4;
+const int DRUM_PINS[] = {8, 9, 10, 11};
+const int DRUM_DELAY = 2500;
+
+int maracas_states[] = {-1,-1};
+int maracas_delays[] = {0, 0};
+
+int drum_delays[] = {0, 0, 0, 0};
+
+void setup() {
+  for (int i = 0; i < NUMBER_OF_MARACAS; i++) {
+    pinMode(MARACAS_PINS[i], INPUT);
+  }
+  for (int i = 0; i < NUMBER_OF_DRUMS; i++) {
+    pinMode(DRUM_PINS[i], INPUT);
+  }
+  Serial.begin(9600);
+}
+
+void loop() {
+  maracas();
+  drums();
+  update_delays();  
+}
+
+
+void maracas() {
+  for (int i = 0; i < NUMBER_OF_MARACAS; i++) {
+    int newState = digitalRead(MARACAS_PINS[i]);
+    if (newState != maracas_states[i] && maracas_delays[i] < 1) {
+      Serial.print("maracas,");
+      Serial.print(i);
+      Serial.println();
+      maracas_states[i] = newState;
+      maracas_delays[i] = MARACAS_DELAY;
+    }
+  }
+}
+
+void drums() {
+  for (int i = 0; i < NUMBER_OF_DRUMS; i++) {
+    if (digitalRead(DRUM_PINS[i]) == HIGH && drum_delays[i] < 1) {
+      Serial.print("drum,");
+      Serial.print(i);
+      Serial.println();
+      drum_delays[i] = DRUM_DELAY;
+    }
+  }
+}
+
+void update_delays() {
+  for (int i = 0; i < NUMBER_OF_MARACAS; i++) {
+    if (maracas_delays[i] > 0) {
+      maracas_delays[i] -= 1;
+    }
+  }
+  for (int i = 0; i < NUMBER_OF_DRUMS; i++) {
+    if (drum_delays[i] > 0) {
+      drum_delays[i] -= 1;
+    }
+  }
+}
diff --git a/release/instruments3/instruments3.ino b/release/instruments3/instruments3.ino
new file mode 100644 (file)
index 0000000..61442ff
--- /dev/null
@@ -0,0 +1,86 @@
+const int NUMBER_OF_MARACAS = 2;
+const int MARACAS_PINS[] = {6, 7};
+const int MARACAS_DELAY = 5000;
+
+const int NUMBER_OF_DRUMS= 4;
+const int DRUM_PINS[] = {8, 9, 10, 11};
+const int DRUM_DELAY = 2500;
+
+const int GUITAR_THRESHOLD = 20;
+const int GUITAR_PIN = A0;
+const int GUITAR_DELAY = 5000;
+
+int maracas_states[] = {-1,-1};
+int maracas_delays[] = {0, 0};
+
+int drum_delays[] = {0, 0, 0, 0};
+
+int guitar_delay = 0;
+
+void setup() {
+  for (int i = 0; i < NUMBER_OF_MARACAS; i++) {
+    pinMode(MARACAS_PINS[i], INPUT);
+  }
+  for (int i = 0; i < NUMBER_OF_DRUMS; i++) {
+    pinMode(DRUM_PINS[i], INPUT);
+  }
+  Serial.begin(9600);
+}
+
+void loop() {
+  maracas();
+  drums();
+  guitar();
+  update_delays();  
+}
+
+
+void maracas() {
+  for (int i = 0; i < NUMBER_OF_MARACAS; i++) {
+    int newState = digitalRead(MARACAS_PINS[i]);
+    if (newState != maracas_states[i] && maracas_delays[i] < 1) {
+      Serial.print("maracas,");
+      Serial.print(i);
+      Serial.println();
+      maracas_states[i] = newState;
+      maracas_delays[i] = MARACAS_DELAY;
+    }
+  }
+}
+
+void drums() {
+  for (int i = 0; i < NUMBER_OF_DRUMS; i++) {
+    if (digitalRead(DRUM_PINS[i]) == HIGH && drum_delays[i] < 1) {
+      Serial.print("drum,");
+      Serial.print(i);
+      Serial.println();
+      drum_delays[i] = DRUM_DELAY;
+    }
+  }
+}
+
+void guitar() {
+  int pitch = analogRead(GUITAR_PIN);
+  if (pitch >= GUITAR_THRESHOLD && guitar_delay < 1) {
+    Serial.print("guitar,");
+    Serial.print(pitch);
+    Serial.println();
+    guitar_delay = GUITAR_DELAY;
+  }
+}
+
+void update_delays() {
+  for (int i = 0; i < NUMBER_OF_MARACAS; i++) {
+    if (maracas_delays[i] > 0) {
+      maracas_delays[i] -= 1;
+    }
+  }
+  for (int i = 0; i < NUMBER_OF_DRUMS; i++) {
+    if (drum_delays[i] > 0) {
+      drum_delays[i] -= 1;
+    }
+  }
+  if (guitar_delay > 0) {
+    guitar_delay -= 1;
+  }
+}
diff --git a/release/maracas.gif b/release/maracas.gif
new file mode 100644 (file)
index 0000000..c5cca75
Binary files /dev/null and b/release/maracas.gif differ
diff --git a/release/maracas.wav b/release/maracas.wav
new file mode 100644 (file)
index 0000000..a039e3a
Binary files /dev/null and b/release/maracas.wav differ
diff --git a/release/miniband.py b/release/miniband.py
new file mode 100755 (executable)
index 0000000..2ec3769
--- /dev/null
@@ -0,0 +1,177 @@
+# This code is copyright ...... under the GPL v2.
+# This code is derived from scratch_gpio_handler by Simon Walters, which
+# is derived from scratch_handler by Thomas Preston
+# Version 0.1: It's kind of working.
+
+from array import *
+import threading
+import socket
+import time
+import sys
+import struct
+import serial
+import io
+import logging
+
+PORT = 42001
+DEFAULT_HOST = '127.0.0.1'
+BUFFER_SIZE = 240 #used to be 100
+SOCKET_TIMEOUT = 1
+DEVICES = ['/dev/ttyACM3']
+#DEVICES = ['/dev/ttyACM0', '/dev/ttyACM1','/dev/ttyACM3']
+ARDUINO_BAUD_RATE = 9600
+
+BROADCAST_NAMES = {'guitar': 'guitar', 
+    'drum': {0: 'cymbal',
+        1: 'hihat',
+        2: 'slowdrum',
+        3: 'snare',
+        4: 'tomtom'},
+    'maracas': 'maracas'}
+
+SENSOR_NAMES = {'guitar': 'guitar_pitch'}
+
+logging.basicConfig(level = logging.INFO)
+#logging.basicConfig(level = logging.DEBUG)
+
+class MyError(Exception):
+    def __init__(self, value):
+        self.value = value
+
+    def __str__(self):
+        return repr(self.value)
+
+class ScratchSender(threading.Thread):
+    def __init__(self, socket):
+        threading.Thread.__init__(self)
+        self.scratch_socket = socket
+        self._stop = threading.Event()
+        
+    def join(self,timeout=None):
+        self._stop.set()
+        threading.Thread.join(self, timeout)
+
+    def stopped(self):
+        return self._stop.isSet()
+
+    def run(self):
+        while not self.stopped():
+            time.sleep(0.01) # be kind to cpu - not certain why :)
+
+    def send_scratch_command(self, cmd):
+        n = len(cmd)
+        a = array('c')
+        a.append(chr((n >> 24) & 0xFF))
+        a.append(chr((n >> 16) & 0xFF))
+        a.append(chr((n >>  8) & 0xFF))
+        a.append(chr(n & 0xFF))
+        self.scratch_socket.send(a.tostring() + cmd)
+
+
+class ArduinoListener(threading.Thread):
+    def __init__(self, device, speed, sender, instruments, values):
+        threading.Thread.__init__(self)
+        self.arduino_device = serial.Serial(device, speed, timeout=0.5)
+        self._stop = threading.Event()
+        self.scratch_sender = sender
+        self.instruments = instruments
+        self.values = values  
+        logging.info("Started listener on port %s" % device)
+
+    def join(self,timeout=None):
+        self._stop.set()
+        threading.Thread.join(self, timeout)
+
+    def stopped(self):
+        return self._stop.isSet()
+
+    def run(self):
+        self.arduino_device.readline() # discard the first (partial) line
+        while not self.stopped():
+            logging.debug('Thread waiting for a signal')
+            try:
+                device_line = self.arduino_device.readline()
+                if device_line :
+                    instrument, instrument_value_string = device_line.rstrip().split(',', 1)
+                    instrument_value = int(instrument_value_string)
+                    logging.info('Instrument: %s, Value: %d' % (instrument, instrument_value))
+                    if instrument in self.values:
+                        try:
+                            logging.info("sensor-update %s %d" % (self.values[instrument], (instrument_value * 100) / 1024))
+                            self.scratch_sender.send_scratch_command("sensor-update %s %d" % (self.values[instrument], (instrument_value * 100) / 1024))
+                        except KeyError:
+                            # Do nothing
+                            pass
+                    if instrument in self.instruments:
+                        if isinstance(self.instruments[instrument], dict):
+                            broadcast = self.instruments[instrument][instrument_value]
+                        else:
+                            broadcast = self.instruments[instrument]
+                        try:
+                            logging.info("broadcast %s" % broadcast)
+                            self.scratch_sender.send_scratch_command('broadcast %s' % broadcast)
+                        except KeyError:
+                            # Do nothing
+                            pass
+
+            except serial.SerialException:
+                logging.error('Serial exception')
+        logging.debug('Thread run() exiting')
+
+
+def create_socket(host, port):
+    while True:
+        try:
+            logging.info('Connecting to Scratch')
+            scratch_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+            scratch_sock.connect((host, port))
+            break
+        except socket.error:
+            logging.warning("There was an error connecting to Scratch!")
+            logging.warning("I couldn't find a Mesh session at host: %s, port: %s" % (host, port))
+            time.sleep(3)
+    return scratch_sock
+
+def cleanup_threads(threads):
+    logging.debug("Stopping %d threads" % len(threads))
+    for thread in threads:
+        thread.join()
+    logging.debug("Threads joined")
+
+if __name__ == '__main__':
+    if len(sys.argv) > 1:
+        host = sys.argv[1]
+    else:
+        host = DEFAULT_HOST
+
+cycle_trace = 'start'
+while True:
+    if (cycle_trace == 'disconnected'):
+        logging.info("Scratch disconnected")
+        cleanup_threads(listeners + sender)
+        time.sleep(1)
+        cycle_trace = 'start'
+
+    if (cycle_trace == 'start'):
+        # open the socket
+        logging.info('Connecting to Scratch...')
+        the_socket = create_socket(host, PORT)
+        logging.info('Connected to Scratch')
+        the_socket.settimeout(SOCKET_TIMEOUT)
+        sender = ScratchSender(the_socket)
+        listeners = [ArduinoListener(device, ARDUINO_BAUD_RATE, sender, BROADCAST_NAMES, SENSOR_NAMES) for device in DEVICES]
+        cycle_trace = 'running'
+        logging.info("Listeners running....")
+        sender.start()
+        for listener in listeners:
+          listener.start()
+
+    # wait for ctrl+c
+    try:
+        #just pause
+        time.sleep(0.1)
+    except KeyboardInterrupt:
+        logging.warning("Interrrupted")
+        cleanup_threads(listeners + [sender])
+        sys.exit()
+
diff --git a/release/miniband1.sb b/release/miniband1.sb
new file mode 100644 (file)
index 0000000..6f1be4b
Binary files /dev/null and b/release/miniband1.sb differ
diff --git a/release/miniband2.sb b/release/miniband2.sb
new file mode 100644 (file)
index 0000000..263b9da
Binary files /dev/null and b/release/miniband2.sb differ
diff --git a/release/miniband3.sb b/release/miniband3.sb
new file mode 100644 (file)
index 0000000..39bef79
Binary files /dev/null and b/release/miniband3.sb differ
diff --git a/release/scratchthumbs.db b/release/scratchthumbs.db
new file mode 100644 (file)
index 0000000..31aaa37
Binary files /dev/null and b/release/scratchthumbs.db differ
diff --git a/release/slowdrum.wav b/release/slowdrum.wav
new file mode 100644 (file)
index 0000000..c55965a
Binary files /dev/null and b/release/slowdrum.wav differ
diff --git a/release/snare.wav b/release/snare.wav
new file mode 100644 (file)
index 0000000..92d24c4
Binary files /dev/null and b/release/snare.wav differ
diff --git a/writeup/.directory b/writeup/.directory
new file mode 100644 (file)
index 0000000..cdbb188
--- /dev/null
@@ -0,0 +1,4 @@
+[Dolphin]
+Timestamp=2013,4,19,20,12,1
+Version=3
+ViewMode=1
diff --git a/writeup/drums-script.png b/writeup/drums-script.png
new file mode 100644 (file)
index 0000000..767957b
Binary files /dev/null and b/writeup/drums-script.png differ
diff --git a/writeup/drums.fzz b/writeup/drums.fzz
new file mode 100644 (file)
index 0000000..c44172a
Binary files /dev/null and b/writeup/drums.fzz differ
diff --git a/writeup/drums_bb.png b/writeup/drums_bb.png
new file mode 100644 (file)
index 0000000..857eeb0
Binary files /dev/null and b/writeup/drums_bb.png differ
diff --git a/writeup/drums_schem.png b/writeup/drums_schem.png
new file mode 100644 (file)
index 0000000..22d54d3
Binary files /dev/null and b/writeup/drums_schem.png differ
diff --git a/writeup/enable-remote-sensors.png b/writeup/enable-remote-sensors.png
new file mode 100644 (file)
index 0000000..fa30c52
Binary files /dev/null and b/writeup/enable-remote-sensors.png differ
diff --git a/writeup/guitar.fzz b/writeup/guitar.fzz
new file mode 100644 (file)
index 0000000..78aac9a
Binary files /dev/null and b/writeup/guitar.fzz differ
diff --git a/writeup/guitar_bb.png b/writeup/guitar_bb.png
new file mode 100644 (file)
index 0000000..8966d03
Binary files /dev/null and b/writeup/guitar_bb.png differ
diff --git a/writeup/guitar_schem.png b/writeup/guitar_schem.png
new file mode 100644 (file)
index 0000000..d03ea67
Binary files /dev/null and b/writeup/guitar_schem.png differ
diff --git a/writeup/maracas-script.png b/writeup/maracas-script.png
new file mode 100644 (file)
index 0000000..0f3957b
Binary files /dev/null and b/writeup/maracas-script.png differ
diff --git a/writeup/maracas.fzz b/writeup/maracas.fzz
new file mode 100644 (file)
index 0000000..60941d2
Binary files /dev/null and b/writeup/maracas.fzz differ
diff --git a/writeup/maracas_bb.png b/writeup/maracas_bb.png
new file mode 100644 (file)
index 0000000..77050b0
Binary files /dev/null and b/writeup/maracas_bb.png differ
diff --git a/writeup/maracas_schem.png b/writeup/maracas_schem.png
new file mode 100644 (file)
index 0000000..b766079
Binary files /dev/null and b/writeup/maracas_schem.png differ
diff --git a/writeup/miniband.doc b/writeup/miniband.doc
new file mode 100644 (file)
index 0000000..dfc762d
Binary files /dev/null and b/writeup/miniband.doc differ
diff --git a/writeup/miniband.odt b/writeup/miniband.odt
new file mode 100644 (file)
index 0000000..6a82b63
Binary files /dev/null and b/writeup/miniband.odt differ