Kitchengame was a game that started from the idea to have people interact with live music. MinWoo had outlined a project earlier that aimed at visualizing live music in public spaces via user (audience) interaction (
his blog for more info).
As we were figuring out how we would imagine the audience to interact directly with a musical performance, we thought of laser-tripwires that would could capture the crowd dynamic in a visual way. After we went through some scenarios, we changed our initial plan and started to think of a game scenario we could use this basic principal for. So, our idea was to use photocells (photo resistors) and lasers to trigger sound instead of visuals. Also, instead of passively registering the audience's interaction we used laserpens as "guns" that would have to be shot at the photocells, thereby enabling direct interaction with the interface.
The basic game setup so far: a one way interaction with two teams trying to shoot photocells with laserpointers and thereby triggerin sounds. We still wanted to include some real world musical element so we decided to add another player to each team that would have to play some instrument, which would 'activate' the photocells (i.e. make them read values) and control a visual output. This as outline for our mediacontroller project, we started to organize materials and test some small setups:
10 laserpens (eBay 10$)
12 3,5" Photocells (electronic goldmine ~20$)
2 Arduinos (wherever ~60$)
(1 Arduino and multiplexer also possible)
cardboard (free – 18th Street Fellowship)
After we had tried various game scenarios, we decided to set up two Arduinos, one [1] reading six photocells and the other[2] reading values from piezzo sensors that were attached to the physical instruments (cardboardboxdrum). The analog values read from the piezzos on [2] were linked to a Max Patch and whenever they would receive readings above a threshold (I think 50 for our setup) a digital signal was communicated to [1], which would then start reading from the three photo cells matching the piezzo source signal to the appropriate team (if drummer of team A drums, field players of team A can score).
Here is a video MinWoo made of the game being played at the presentation (thanks to the fierce players: Dawn, Cody, and Sarah Jenny on the one side, Chika, Leo, and Rory on the other side):
The critique afterwards was pretty cool because many detailed comments where made that showed that the basic concept worked but that many details weren't really fleshed out. The most important one, I thought, was that we should have introduced a scoreboard. Also the connection to the MaxPatch could've been clearer or at least been projected. All in all, I am happy with the outcome as I never designed a game before (especially no physical one).
Here are the codes we used for the photo cell sound communciation.
***********************************************
***********************************************
Arduino
*********************************************** ***********************************************
int analogOneA = 0; int analogTwoA = 1; int analogThreeA = 2; // analog input
int analogOne = 3; int analogTwo = 4; int analogThree = 5;
int digitalOne=12,digitalTwo=13;//digitalPins to communicate with the other Arduino
int sensorValue = 0; // reading from the sensor
void setup() {
// configure the serial connection:
Serial.begin(9600);
// configure the digital input:
pinMode(digitalOne, INPUT);
pinMode(digitalTwo, INPUT);
}
//we were having trouble with the for-loop
//which is why we call from each pin with full declarations of evey pin
void loop() {
//if signal arrives from the piezo buzzer
if(digitalRead(digitalOne)==1)
{
// read the sensor:
sensorValue = analogRead(analogOne);
// print the results:
// Serial.print("analogOne-");
Serial.print(sensorValue, DEC);
Serial.print(",");
// read the sensor:
sensorValue = analogRead(analogTwo);
// print the results:
// Serial.print("analogTwo-");
Serial.print(sensorValue, DEC);
Serial.print(",");
// read the sensor:
sensorValue = analogRead(analogThree);
// print the results:
// Serial.print("analogThree-");
Serial.println(sensorValue, DEC);
}
if(digitalRead(digitalTwo)==1)
{
sensorValue = analogRead(analogOne);
// print the results:
// Serial.print("analogOne-");
Serial.print(sensorValue, DEC);
Serial.print(",");
// read the sensor:
sensorValue = analogRead(analogTwo);
// print the results:
// Serial.print("analogTwo-");
Serial.print(sensorValue, DEC);
Serial.print(",");
// read the sensor:
sensorValue = analogRead(analogThree);
// print the results:
// Serial.print("analogThree-");
Serial.println(sensorValue, DEC);
}
}
***********************************************
***********************************************
Processing code
***********************************************
import processing.serial.*;
import ddf.minim.*;
import ddf.minim.signals.*;
Serial myPort;
int counterA=0, counterB=0;
// Init objects
Minim minim;
AudioPlayer win;
AudioPlayer oneA;
AudioPlayer twoA;
AudioPlayer threeA;
AudioPlayer oneB;
AudioPlayer twoB;
AudioPlayer threeB;
void setup() {
myPort = new Serial(this, Serial.list()[0], 9600);
minim = new Minim(this);
win = minim.loadFile("winner.mp3");
// first team
oneA = minim.loadFile("1.wav");
twoA = minim.loadFile("2.wav");
threeA = minim.loadFile("3.wav");
//second team
oneB = minim.loadFile("4.wav");
twoB = minim.loadFile("5.wav");
threeB = minim.loadFile("6.wav");
}
void draw() {
// First Photocell
if (oneA.isPlaying()) {
//counterA +=1;
}
else {
oneA.rewind();
}
//Second Photocell
if (twoA.isPlaying())
{
// counterA+=1;
}
else {
twoA.rewind();
}
//third Photocell
if (threeA.isPlaying()) {
//counterA+=1;
}
else {
threeA.rewind();
}
//AND THE WINNER IS
if (counterA>10)
{
//win.play();
}
// First Photocell
if (oneB.isPlaying()) {
//counterB +=1;
}
else {
oneB.rewind();
}
//Second Photocell
if (twoB.isPlaying())
{
// counterB+=1;
}
else {
twoB.rewind();
}
//third Photocell
if (threeA.isPlaying()) {
//counterB+=1;
}
else {
threeB.rewind();
}
//AND THE WINNER IS
if (counterB>10)
{
//win.play();
}
}
void serialEvent(Serial myPort) {
String myString = myPort.readStringUntil('\n');
println(myString);
if (myString != null) {
myString = trim(myString);
int sensors[] = int(split(myString, ","));
for (int sensorNum = 0; sensorNum < sensors.length; sensorNum++) {
print("Sensor " + sensorNum + ": " + sensors[sensorNum] + "\t");
}
println();
//first team
if (sensors[0] > 200) {
oneA.play();
}
if (sensors[1] > 200) {
twoA.play();
}
if (sensors[2] > 200) {
threeA.play();
}
// second team
if (sensors[3] > 200) {
oneB.play();
}
if (sensors[4] > 200) {
twoB.play();
}
if (sensors[5] > 200) {
threeB.play();
}
}
}
void stop()
{
win.close();
oneA.close();
twoA.close();
threeA.close();
minim.stop();
super.stop();
}