3. MC Squared . . .
° is a musical instrument that detects motion and generates sounds
from each side
° can be played with any part of the body, or an object
can be played by one or more than one person
° is simple, intuitive, playful, expressive
°
4. What People are Saying
about MC Squared
° “This is so fun!”
“Sexy!”
° “Awesome!”
°
5. USer Profile
° Musicians and nonmusicians.
umans, age 7 and up. Cats, age 6 weeks and up.
H
° People who have phobias about touching things.
°
A cat playing a theremin—one of many such talented
felines.
8. videos: Groovebox observation
click image to play click image to play
Diego set up his Groovebox in the ITP lobby, and we observed several people using it. This device was one of the inspirations
behind our project. I has a motion sensor at the top, just to the left of the numbers, which generates wacky thereminic sounds.
9. how MC Squared works
° ach side is embedded with an infrared sensor that detects
E
movements within a range of about 2 to 12 inches in front of it.
° library in Processing.
ignals from each sensor trigger a different sound, using the Minim
S
10. video: Initial version
click image to play
Diego and FIlippo play our first prototype. This two-sensor model
played sounds continuously, as long as an object was in range of the
sensors. Nearer objects generated one sound from each sensor; farther
objects, another, for a total of four sounds. The code is on India’s blog.
11. video: An intermediate version
click image to play
Diego plays a version with more sensors and revised code.
12. video: The penultimate (?) version
click image to play
Carolina Vallejo, Sara Bremen, Eyal Ohana, Filippo, and
Diego trying out the newest version on Tuesday evening.
This model sports a new, larger foam box and plays each
sound clip only once for each (contact-free) hit.
13. strates how to use the preVal[i]=0; myPort = new Serial( this, myPort.readStringUntil( ‘n’ //preVal=val;
<code>play</code> method of a val[i]=0; Serial.list()[2], 9600 ); ); //val=sensors[0];
<code>Playable</code> class. } // Read bytes into a buf- // If you got any bytes //println(val);
* The class used here is minim = new Minim(this); fer until you get a line other than the line feed: // Loop through to read
<code>AudioPlayer</code>, sample1 = minim.loadSample( feed. if ( bufferedString != null data from each sensor.
but you can also play an “kick01.wav”, 2048 ); myPort.bufferUntil( ‘n’ ); ) for ( int sensorNum = 0;
<code>AudioSnippet</code>. if ( sample1 == null ) { } { sensorNum < sensors.length;
* Playing a println( “Didn’t get void draw() bufferedString = trim( sensorNum++ )
code
<code>Playable</code> causes kick!” ); { bufferedString ); {
it to begin playing from the } background(0); /* Split the string at /* Print out the val-
current position. When it minim = new Minim(this); the tab(s) and convert the ues received from the sensors
reaches sample2 = minim.loadSample( //println(preVal+” “+val); sections into integers. (whose number was
* the end of the recording “snare.wav”, 2048 ); //println(val); Each section represents determined by the num-
it will emit silence, it will if ( sample2 == null ) { if (val[0]==1 && pre- one of the sensors. ber of tabbed sections.
not stop! In other words, if println( “Didn’t get Val[0]==0){ */ */
° Arduino: mc_squared_arduino_code.zip (64 KB)
you play something and kick!” ); println(“DSAD”); sensors = int( split( // print( “Sen-
rocessing: mc_squared_processing_code.zip (957KB)
P
* it gets to the end of the
file, it will not stop and
}
minim = new Minim(this); }
soundSample1(); bufferedString, ‘t’ ) ); sor “ + sensorNum + “: “ +
sensors[sensorNum] + “tt”
rewind, it will continue to sample3 = minim.loadSample( if (val[1]==1 pre- /* println(sensors[0]); );
°
try to read the file, but get “snare2.wav”, 2048 ); Val[1]==0){ println(sensors[1]); }
* nothing and send silence if ( sample3 == null ) { println(“BAM”); println(sensors[2]);
to the audio system. If you println( “Didn’t get soundSample2(); println(sensors[3]); }
call codeisPlaying()/code kick!” ); } println(sensors[4]); }
at that point, it will return } if (val[2]==1 pre- println(sensors[5]);*/ void soundSample1(){
true, minim = new Minim(this); Val[2]==0){ if (sensors[0] 350){ sample1.trigger();
* because the player is sample4 = minim.loadSample( println(“BAM”); val[0] = 1; }
still trying to read the file, “loop2.wav”, 2048 ); soundSample3(); } else {
think of a record player that if ( sample4 == null ) { } val[0] = 0; void soundSample2(){
gets to the end of a record. println( “Didn’t get if (val[3]==1 pre- } sample2.trigger();
* It just goes around on kick!” ); Val[3]==0){ if (sensors[1] 350){ }
the same groove. It’s not } println(“BAM”); void soundSample3(){
making any sound (well, minim = new Minim(this); soundSample4(); val[1] = 1; sample3.trigger();
crackles maybe) but it is sample5 = minim.loadSample( } } else { }
still playing. “hihat.wav”, 2048 ); if (val[4]==1 pre- val[1] = 0; void soundSample4(){
* Press ‘p’ to play the if ( sample5 == null ) { Val[4]==0){ } sample4.trigger();
file. println( “Didn’t get println(“BAM”); if (sensors[2] 350){ }
* kick!” ); soundSample5(); val[2] = 1; void soundSample5(){
*/ } } } else { sample5.trigger();
minim = new Minim(this); val[2] = 0; }
import processing.serial.*; sample6 = minim.loadSample( if (val[5]==1 pre- } void soundSample6(){
import ddf.minim.*; “loop1.wav”, 2048 ); Val[5]==0){ if (sensors[3] 350){ sample6.trigger();
Serial myPort; if ( sample6 == null ) { println(“BAM”); val[3] = 1; }
Minim minim; println( “Didn’t get soundSample6(); } else {
AudioSample sample1; kick!” ); } val[3] = 0; void stop()
AudioSample sample2; } preVal[0]=val[0]; } {
AudioSample sample3; /* List all the available preVal[1]=val[1]; if (sensors[4] 350){ // always close Minim audio
AudioSample sample4; serial ports. Don’t really preVal[2]=val[2]; val[4] = 1; classes when you are done
AudioSample sample5; need to do this, since preVal[3]=val[3]; } else { with them
AudioSample sample6; it’s always zero for me, preVal[4]=val[4]; val[4] = 0; sample1.close();
int[] sensors; but it doesn’t hurt. preVal[5]=val[5]; } sample2.close();
int[] preVal = new int[6]; */ } if (sensors[5] 350){ sample3.close();
//int val=0; println(Serial.list() ); void serialEvent( Serial val[5] = 1; sample4.close();
int[] val = new int[6]; // If I wanted a port myPort ) } else { sample5.close();
void setup(){ { val[5] = 0; sample6.close();
14. design decisions
° ach side has a different icon and color, to aid the players in
E
associating each side with a specific sound.
° make the interaction with MC Squared predictable and intuitive.
ach side uses the same kind of sensor, having the same range, to
E
° control, to make it simple to operate.
ach sensor functions as a digital switch rather than a variable
E
21. Future Possibilities
° MC Squared could be installed in public places, to get people
involved in playful interactions in unexpected environments (e.g.,
airports, train stations).
° MC Squared could come with alternate sound packs—electronica,
stringed instruments, etc.
° sound loops on the fly.
Buttons and a mic could be added so that users could record new