Difference between revisions of "Team:NYU Shanghai/Code"

 
(44 intermediate revisions by 2 users not shown)
Line 32: Line 32:
 
   span:hover {
 
   span:hover {
 
   color: goldenrod;
 
   color: goldenrod;
 +
  }
 +
  #sponsors a:hover {
 +
    color: goldenrod;
 +
  }
 +
  #BMGText span, #ButtonText span {
 +
    color: white;
 +
    width: 10px;
 +
    padding: 0 15px;
 +
    display: inline;
 
   }
 
   }
 
</style>
 
</style>
Line 38: Line 47:
 
     function expandBMG() {
 
     function expandBMG() {
 
     if (document.getElementById("BMG").className === "collapsed") {
 
     if (document.getElementById("BMG").className === "collapsed") {
       document.getElementById("BMG").style.color = "goldenrod";
+
       document.getElementById("BMG").style.color = "white";
 
       document.getElementById("BMGText").style.display = "inline-block";
 
       document.getElementById("BMGText").style.display = "inline-block";
 
       document.getElementById("BMG").className = "expanded";
 
       document.getElementById("BMG").className = "expanded";
Line 49: Line 58:
 
   function expandButton() {
 
   function expandButton() {
 
     if (document.getElementById("Button").className === "collapsed") {
 
     if (document.getElementById("Button").className === "collapsed") {
       document.getElementById("Button").style.color = "goldenrod";
+
       document.getElementById("Button").style.color = "white";
 
       document.getElementById("ButtonText").style.display = "inline-block";
 
       document.getElementById("ButtonText").style.display = "inline-block";
 
       document.getElementById("Button").className = "expanded";
 
       document.getElementById("Button").className = "expanded";
Line 63: Line 72:
 
   <h3>Code</h3>
 
   <h3>Code</h3>
 
</div>
 
</div>
<div id="BMG"class="collapsed" onclick="expandBMG()">
+
<div id="BMG"class="collapsed">
   <h5 style="display:inline-block"><span class="noselect">Bacterial Music Generator</span></h5>
+
   <h5 style="display:inline-block"><span class="noselect" onclick="expandBMG()">Bacterial Music Generator</span></h5>
 
   <br>
 
   <br>
<p id="BMGText" style="display:none">
+
  <p><font face="helveticaNL">
  //main
+
<dl id="BMGText" style="display:none"> //main
 +
//main
 
<br>import processing.video.*;
 
<br>import processing.video.*;
 
<br>import arb.soundcipher.*;
 
<br>import arb.soundcipher.*;
Line 95: Line 105:
  
 
<br><br>void setup() {
 
<br><br>void setup() {
  <br>volume[0]=0;
+
<br><span></span>volume[0]=0;
  <br>volume[1]=0;
+
<br><span></span>volume[1]=0;
  <br>volume[2]=0;
+
<br><span></span>volume[2]=0;
  <br>window_size=displayWidth;
+
<br><span></span>window_size=displayWidth;
  <br>window_height=displayHeight;
+
<br><span></span>window_height=displayHeight;
  
  <br><br>margin=(window_size-(grid_num*(grid_size+interval)+interval)
+
<br><br><span></span>margin=(window_size-(grid_num*(grid_size+interval)+interval)
  <br>*block_number)/(block_number+1);
+
<br><span></span> *block_number)/(block_number+1);
  
  <br>size(window_size, window_height);
+
<br><span></span>size(window_size, window_height);
  
  <br><br>//empty tracks
+
<br><br><span></span>//empty tracks
  <br>for (int i=0; i<block_number; i++) {
+
<br><span></span>for (int i=0; i < block_number; i++) {
    <br>camera[i]=false;
+
<br><span></span><span></span>camera[i]=false;
    <br>music[i]=false;
+
<br><span></span><span></span>music[i]=false;
  }
+
<br><span></span>}
  
  <br><br>make_empty();
+
<br><br><span></span>make_empty();
  
  <br><br>String[] cameras = Capture.list();
+
<br><br><span></span>String[] cameras = Capture.list();
 
+
  <br><br>video_sequencer = new Capture(this, cameras[0]);
+
  <br>video_sequencer.start();
+
  <br>sequencer_video=new Sequencer_video(video_sequencer, sc, grid_num, grid_size, interval);  
+
  
  <br><br>video_rack = new Capture(this, cameras[15]);
+
<br><br><span></span>video_sequencer = new Capture(this, cameras[0]);  
  <br>video_rack.start();
+
<br><span></span>video_sequencer.start();  
  <br>rack=new Rack(video_rack, sc, window_size, window_height,
+
<br><span></span>sequencer_video=new Sequencer_video(video_sequencer, sc, grid_num, grid_size, interval);  
  <br>window_height-margin-grid_num*(grid_size+interval));
+
  
  <br><br>frameRate(4);
+
<br><br><span></span>video_rack = new Capture(this, cameras[15]);
}
+
<br><span></span>video_rack.start();
 +
<br><span></span>rack=new Rack(video_rack, sc, window_size, window_height,
 +
<br><span></span>window_height-margin-grid_num*(grid_size+interval));
 +
 
 +
<br><br><span></span>frameRate(4);
 +
<br>}
  
 
<br><br>void draw() {
 
<br><br>void draw() {
<br>background(0);
+
<br><span></span>background(0);
  <br>if (tube) {
+
<br><span></span>if (tube) {
    <br>rack.get_color();
+
<br><span></span><span></span>rack.get_color();
    <br>rack.draw_rack();
+
<br><span></span><span></span>rack.draw_rack();
    <br>rack.glow(n);
+
<br><span></span><span></span>rack.glow(n);
    <br>rack.play_sounds(n);
+
<br><span></span><span></span>rack.play_sounds(n);
  }
+
<br><span></span>}
  
  <br><br>for (int i=0; i<block_number; i++) {
+
<br><br><span></span>for (int i=0; i < block_number; i++) {
    <br>sequencer[i].draw_grid();
+
<br><span></span><span></span>sequencer[i].draw_grid();
    <br>if (camera[i]&&!music[i]) {
+
<br><span></span><span></span>if (camera[i]&&!music[i]) {
      <br>sequencer_video.position(pos_x(i), margin);
+
<br><span></span><span></span><span></span>sequencer_video.position(pos_x(i), margin);
      <br>sequencer_video.grid_off();
+
<br><span></span><span></span><span></span>sequencer_video.grid_off();
      <br>sequencer_video.bd();
+
<br><span></span><span></span><span></span>sequencer_video.bd();
      <br>sequencer_video.bd_draw(n);
+
<br><span></span><span></span><span></span>sequencer_video.bd_draw(n);
    <br>} else if (camera[i]&&music[i]) {
+
<br><span></span><span></span>} else if (camera[i]&&music[i]) {
      <br>sequencer_video.position(pos_x(i), margin);
+
<br><span></span><span></span><span></span>sequencer_video.position(pos_x(i), margin);
      <br>sequencer_video.grid_on();
+
<br><span></span><span></span><span></span>sequencer_video.grid_on();
      <br>sequencer_video.bd();
+
<br><span></span><span></span><span></span>sequencer_video.bd();
      <br>sequencer_video.bd_draw(n);
+
<br><span></span><span></span><span></span>sequencer_video.bd_draw(n);
    <br>} else if (!camera[i]&&music[i]) {
+
<br><span></span><span></span>} else if (!camera[i]&&music[i]) {
      <br>sequencer[i].set_volume(volume[i]);
+
<br><span></span><span></span><span></span>sequencer[i].set_volume(volume[i]);
      <br>sequencer[i].play_sounds(n);
+
<br><span></span><span></span><span></span>sequencer[i].play_sounds(n);
      <br>sequencer[i].glow(n);
+
<br><span></span><span></span><span></span>sequencer[i].glow(n);
    <br>}
+
<br><span></span><span></span>}
  <br>}
+
<br><span></span>}
  
  <br><br>n++;
+
<br><br><span></span>n++;
  <br>if (n>=grid_num) {
+
<br><span></span>if (n>=grid_num) {
    <br>n=0;
+
<br><span></span><span></span>n=0;
  <br>}
+
<br><span></span>}
 
<br>}
 
<br>}
  
  
 
<br><br>void keyPressed() {
 
<br><br>void keyPressed() {
  <br>//track 1
+
<br><span></span>//track 1
  <br>if (key=='q'||key=='Q') {
+
<br><span></span>if (key=='q'||key=='Q') {
    <br>if (camera[0]==false &&camera[1]==false &&camera[2]==false) {
+
<br><span></span><span></span>if (camera[0]==false &&camera[1]==false &&camera[2]==false) {
      camera[0]=true;
+
<br><span></span><span></span><span></span>camera[0]=true;
    <br>}
+
<br><span></span><span></span>}
  <br>} else if (key=='w'||key=='W') {
+
<br><span></span>} else if (key=='w'||key=='W') {
    <br>camera[0]=false;
+
<br><span></span><span></span>camera[0]=false;
    <br>if (music[0]) {
+
<br><span></span><span></span>if (music[0]) {
      <br>sequencer[0].get_sequence(sequencer_video.sequence());
+
<br><span></span><span></span><span></span>sequencer[0].get_sequence(sequencer_video.sequence());
      <br>sequencer[0].get_color(sequencer_video.grid_color());
+
<br><span></span><span></span><span></span>sequencer[0].get_color(sequencer_video.grid_color());
    <br>}
+
<br><span></span><span></span>}
  <br>} else if (key=='e'||key=='E') {
+
<br><span></span>} else if (key=='e'||key=='E') {
    <br>music[0]=true;
+
<br><span></span><span></span>music[0]=true;
  <br>} else if (key=='r'||key=='R') {
+
<br><span></span>} else if (key=='r'||key=='R') {
    <br>music[0]=false;
+
<br><span></span><span></span>music[0]=false;
    <br>sequencer[0].delete();
+
<br><span></span><span></span>sequencer[0].delete();
  <br>} else if (key=='t'||key=='T') {
+
<br><span></span>} else if (key=='t'||key=='T') {
    <br>if (music[0]) {
+
<br><span></span><span></span>if (music[0]) {
  
      <br><br>if (camera[0]) {
+
<br><br><span></span><span></span><span></span>if (camera[0]) {
        <br>sequencer_video.set_volume(volume[0]);
+
<br><span></span><span></span><span></span><span></span>sequencer_video.set_volume(volume[0]);
      <br>} else {
+
<br><span></span><span></span><span></span>} else {
        <br>sequencer[0].set_volume(volume[0]);
+
<br><span></span><span></span><span></span><span></span>sequencer[0].set_volume(volume[0]);
      <br>}
+
<br><span></span><span></span><span></span>}
    <br>}
+
<br><span></span><span></span>}
  <br>} else if (key=='y'||key=='Y') {
+
<br><span></span>} else if (key=='y'||key=='Y') {
    <br>if (music[0]) {
+
<br><span></span><span></span>if (music[0]) {
      <br>volume[0]=constrain(volume[0]+5, 0, 127);
+
<br><span></span><span></span><span></span>volume[0]=constrain(volume[0]+5, 0, 127);
      <br>if (camera[0]) {
+
<br><span></span><span></span><span></span>if (camera[0]) {
        <br>.set_volume(volume[0]);
+
<br><span></span><span></span><span></span><span></span>.set_volume(volume[0]);
      <br>} else {
+
<br><span></span><span></span><span></span>} else {
        <br>sequencer[0].set_volume(volume[0]);
+
<br><span></span><span></span><span></span><span></span>sequencer[0].set_volume(volume[0]);
      <br>}
+
<br><span></span><span></span><span></span>}
    <br>}
+
<br><span></span><span></span>}
  <br>}
+
<br><span></span>}
  <br>//track 2
+
<br><span></span>//track 2
  <br>else if (key=='a'||key=='A') {
+
<br><span></span>else if (key=='a'||key=='A') {
    <br>if (camera[0]==false &&camera[1]==false &&camera[2]==false) {
+
<br><span></span><span></span>if (camera[0]==false &&camera[1]==false &&camera[2]==false) {
      camera[1]=true;
+
<br><span></span><span></span><span></span>camera[1]=true;
    <br>}
+
<br><span></span><span></span>}
  <br>} else if (key=='s'||key=='S') {
+
<br><span></span>} else if (key=='s'||key=='S') {
    <br>camera[1]=false;
+
<br><span></span><span></span>camera[1]=false;
    <br>if (music[1]) {
+
<br><span></span><span></span>if (music[1]) {
      <br>sequencer[1].get_sequence(sequencer_video.sequence());
+
<br><span></span><span></span><span></span>sequencer[1].get_sequence(sequencer_video.sequence());
      <br>sequencer[1].get_color(sequencer_video.grid_color());
+
<br><span></span><span></span><span></span>sequencer[1].get_color(sequencer_video.grid_color());
    <br>}
+
<br><span></span><span></span>}
  <br>} else if (key=='d'||key=='D') {
+
<br><span></span>} else if (key=='d'||key=='D') {
    <br>music[1]=true;
+
<br><span></span><span></span>music[1]=true;
  <br>} else if (key=='f'||key=='F') {
+
<br><span></span>} else if (key=='f'||key=='F') {
    <br>music[1]=false;
+
<br><span></span><span></span>music[1]=false;
    <br>sequencer[1].delete();
+
<br><span></span><span></span>sequencer[1].delete();
  <br>} else if (key=='g'||key=='G') {
+
<br><span></span>} else if (key=='g'||key=='G') {
    <br>if (music[1]) {
+
<br><span></span><span></span>if (music[1]) {
      <br>volume[1]=constrain(volume[1]-5, 0, 127);
+
<br><span></span><span></span><span></span>volume[1]=constrain(volume[1]-5, 0, 127);
      <br>if (camera[1]) {
+
<br><span></span><span></span><span></span>if (camera[1]) {
        <br>sequencer_video.set_volume(volume[1]);
+
<br><span></span><span></span><span></span><span></span>sequencer_video.set_volume(volume[1]);
      <br>} else {
+
<br><span></span><span></span><span></span>} else {
        <br>sequencer[1].set_volume(volume[1]);
+
<br><span></span><span></span><span></span><span></span>sequencer[1].set_volume(volume[1]);
      <br>}
+
<br><span></span><span></span><span></span>}
    <br>}
+
<br><span></span><span></span>}
  <br>} else if (key=='h'||key=='H') {
+
<br><span></span>} else if (key=='h'||key=='H') {
    <br>if (music[1]) {
+
<br><span></span><span></span>if (music[1]) {
      <br>volume[1]=constrain(volume[1]+5, 0, 127);
+
<br><span></span><span></span><span></span>volume[1]=constrain(volume[1]+5, 0, 127);
      <br>if (camera[1]) {
+
<br><span></span><span></span><span></span>if (camera[1]) {
        <br>sequencer_video.set_volume(volume[1]);
+
<br><span></span><span></span><span></span><span></span>sequencer_video.set_volume(volume[1]);
      <br>} else {
+
<br><span></span><span></span><span></span>} else {
        <br>sequencer[1].set_volume(volume[1]);
+
<br><span></span><span></span><span></span><span></span>sequencer[1].set_volume(volume[1]);
      <br>}
+
<br><span></span><span></span><span></span>}
    <br>}
+
<br>}<span></span><span></span>
  <br>}
+
<br><span></span>}
  <br>//track 3
+
<br><span></span>//track 3
  <br>else if (key=='z'||key=='Z') {
+
<br><span></span>else if (key=='z'||key=='Z') {
    <br>if (camera[0]==false &&camera[1]==false &&camera[2]==false) {
+
<br><span></span><span></span>if (camera[0]==false &&camera[1]==false &&camera[2]==false) {
      <br>camera[2]=true;
+
<br><span></span><span></span><span></span>camera[2]=true;
    <br>}
+
<br><span></span><span></span>}
  <br>} else if (key=='x'||key=='X') {
+
<br><span></span>} else if (key=='x'||key=='X') {
    <br>camera[2]=false;
+
<br><span></span><span></span>camera[2]=false;
    <br>if (music[2]) {
+
<br><span></span><span></span>if (music[2]) {
      <br>sequencer[2].get_sequence(sequencer_video.sequence());
+
<br><span></span><span></span><span></span>sequencer[2].get_sequence(sequencer_video.sequence());
      <br>sequencer[2].get_color(sequencer_video.grid_color());
+
<br><span></span><span></span><span></span>sequencer[2].get_color(sequencer_video.grid_color());
    <br>}
+
<br><span></span><span></span>}
  <br>} else if (key=='c'||key=='C') {
+
<br><span></span>} else if (key=='c'||key=='C') {
    <br>music[2]=true;
+
<br><span></span><span></span>music[2]=true;
  <br>} else if (key=='v'||key=='V') {
+
<br><span></span>} else if (key=='v'||key=='V') {
    <br>music[2]=false;
+
<br><span></span><span></span>music[2]=false;
  <br>sequencer[2].delete();
+
<br><span></span><span></span>sequencer[2].delete();
  <br>} else if (key=='b'||key=='B') {
+
<br><span></span>} else if (key=='b'||key=='B') {
    <br>if (music[2]) {
+
<br><span></span><span></span>if (music[2]) {
      <br>volume[2]=constrain(volume[2]-5, 0, 127);
+
<br><span></span><span></span><span></span>volume[2]=constrain(volume[2]-5, 0, 127);
      <br>if (camera[2]) {
+
<br><span></span><span></span><span></span>if (camera[2]) {
        <br>sequencer_video.set_volume(volume[2]);
+
<br><span></span><span></span><span></span><span></span>sequencer_video.set_volume(volume[2]);
      <br>} else {
+
<br><span></span><span></span><span></span>} else {
        <br>sequencer[2].set_volume(volume[2]);
+
<br><span></span><span></span><span></span><span></span>sequencer[2].set_volume(volume[2]);
      <br>}
+
<br><span></span><span></span><span></span>}
    <br>}
+
<br><span></span><span></span>}
  <br>} else if (key=='n'||key=='N') {
+
<br><span></span>} else if (key=='n'||key=='N') {
    <br>if (music[2]) {
+
<br><span></span><span></span>if (music[2]) {
      <br>volume[2]=constrain(volume[2]+5, 0, 127);
+
<br><span></span><span></span><span></span>volume[2]=constrain(volume[2]+5, 0, 127);
      <br>if (camera[2]) {
+
<br><span></span><span></span><span></span>if (camera[2]) {
        <br>sequencer_video.set_volume(volume[2]);
+
<br><span></span><span></span><span></span><span></span>sequencer_video.set_volume(volume[2]);
      <br>} else {
+
<br><span></span><span></span><span></span>} else {
        <br>sequencer[2].set_volume(volume[2]);
+
<br><span></span><span></span><span></span><span></span>sequencer[2].set_volume(volume[2]);
      <br>}
+
<br><span></span><span></span><span></span>}
    <br>}
+
<br><span></span><span></span>}
  <br>} else if (key=='o'||key=='O') {
+
<br><span></span>} else if (key=='o'||key=='O') {
    <br>tube=true;
+
<br><span></span><span></span>tube=true;
  <br>} else if (key=='p'||key=='P') {
+
<br><span></span>} else if (key=='p'||key=='P') {
    <br>tube=false;
+
<br><span></span><span></span>tube=false;
  <br>} else if (key==CODED) {
+
<br><span></span>} else if (key==CODED) {
    <br>if (keyCode==LEFT) {
+
<br><span></span><span></span>if (keyCode==LEFT) {
      <br>sequencer_video.threshold_down();
+
<br><span></span><span></span><span></span>sequencer_video.threshold_down();
    <br>} else if (keyCode==RIGHT) {
+
<br><span></span><span></span>} else if (keyCode==RIGHT) {
      <br>sequencer_video.threshold_up();
+
<br><span></span><span></span><span></span>sequencer_video.threshold_up();
    <br>} else if (keyCode==UP) {
+
<br><span></span><span></span>} else if (keyCode==UP) {
      <br>rack.volume_up();
+
<br><span></span><span></span><span></span>rack.volume_up();
    <br>} else if (keyCode==DOWN) {
+
<br><span></span><span></span>} else if (keyCode==DOWN) {
      <br>rack.volume_down();
+
<br><span></span><span></span><span></span>rack.volume_down();
    <br>}
+
<br><span></span><span></span>}
  <br>}
+
<br><span></span>}
 
<br>}
 
<br>}
  
  
 
<br><br>void make_empty() {
 
<br><br>void make_empty() {
  <br>for (int i=0; i<block_number; i++) {
+
<br><span></span>for (int i=0; i < block_number; i++) {
    <br>int x= pos_x(i);
+
<br><span></span><span></span>int x= pos_x(i);
    <br>int y=margin;
+
<br><span></span><span></span>int y=margin;
    <br>sequencer[i]=new Sequencer(sc, grid_num, grid_size, interval, x, y);
+
<br><span></span><span></span>sequencer[i]=new Sequencer(sc, grid_num, grid_size, interval, x, y);
  <br>}
+
<br><span></span>}
 
<br>}
 
<br>}
  
 
<br><br>int pos_x(int i) {
 
<br><br>int pos_x(int i) {
  <br>int x=margin+(grid_num*(grid_size+interval)+interval+margin)*i;
+
<br><span></span>int x=margin+(grid_num*(grid_size+interval)+interval+margin)*i;
  <br>return x;
+
<br><span></span>return x;
 
<br>}
 
<br>}
  
 
<br><br>//tube rack
 
<br><br>//tube rack
 
<br>class Rack {
 
<br>class Rack {
  <br>Capture video;
+
<br><span></span>Capture video;
  <br>int tube_number=8;
+
<br><span></span>int tube_number=8;
  <br>int space_height;
+
<br><span></span>int space_height;
  <br>float[][] colors;
+
<br><span></span>float[][] colors;
  <br>SoundCipher sc;
+
<br><span></span>SoundCipher sc;
  <br>int white=150;
+
<br><span></span>int white=150;
  <br>float bright=1.5;
+
<br><span></span>float bright=1.5;
  <br>int volume=100;
+
<br><span></span>int volume=100;
  <br>int rack_width;
+
<br><span></span>int rack_width;
  <br>int rack_height;
+
<br><span></span>int rack_height;
  <br>int window_size;
+
<br><span></span>int window_size;
  <br>int window_height;
+
<br><span></span>int window_height;
  <br>int tube_height;
+
<br><span></span>int tube_height;
  <br>int tube_width;
+
<br><span></span>int tube_width;
  <br>int rack_x;
+
<br><span></span>int rack_x;
  <br>int rack_y;
+
<br><span></span>int rack_y;
  <br>int margin;
+
<br><span></span>int margin;
  
  <br><br>Rack(Capture _video, SoundCipher _sc, int _window_size,  
+
<br><br><span></span>Rack(Capture _video, SoundCipher _sc, int _window_size,  
  <br>int _window_height, int _space_height) {
+
<br><span></span>int _window_height, int _space_height) {
    <br>video=_video;
+
<br><span></span><span></span>video=_video;
    <br>window_size=_window_size;
+
<br><span></span><span></span>window_size=_window_size;
    <br>window_height=_window_height;
+
<br><span></span><span></span>window_height=_window_height;
    <br>space_height=_space_height;
+
<br><span></span><span></span>space_height=_space_height;
    <br>sc=_sc;
+
<br><span></span><span></span>sc=_sc;
    <br>rack_width=int(window_size*0.75);
+
<br><span></span><span></span>rack_width=int(window_size*0.75);
    <br>rack_height=space_height/2;
+
<br><span></span><span></span>rack_height=space_height/2;
    <br>tube_height=int(space_height*0.6);
+
<br><span></span><span></span>tube_height=int(space_height*0.6);
    <br>tube_width=int(rack_width/(tube_number*3));
+
<br><span></span><span></span>tube_width=int(rack_width/(tube_number*3));
    <br>rack_x=(window_size-rack_width)/2;
+
<br><span></span><span></span>rack_x=(window_size-rack_width)/2;
    <br>rack_y=int(space_height*0.3);
+
<br><span></span><span></span>rack_y=int(space_height*0.3);
    <br>margin=(rack_width-tube_number*tube_width)/(tube_number+1);
+
<br><span></span><span></span>margin=(rack_width-tube_number*tube_width)/(tube_number+1);
  <br>}
+
<br><span></span>}
  
  <br><br>void play(int n) {
+
<br><br><span></span>void play(int n) {
  <br>get_color();
+
<br><span></span><span></span>get_color();
    <br>draw_rack();
+
<br><span></span><span></span>draw_rack();
    <br>glow(n);
+
<br><span></span><span></span>glow(n);
    <br>play_sounds(n);
+
<br><span></span><span></span>play_sounds(n);
  <br>}
+
<br><span></span>}
 
+
  <br><br>void get_color() {
+
    <br>if (video.available()) {
+
      <br>video.read();
+
      <br>video.loadPixels();
+
      <br>colors=new float[tube_number][3];
+
      <br>float[] loc_x = {0.1,0.215,0.333,0.45,0.569,0.705,0.823,0.941};
+
      <br>for (int i = 0; i < tube_number; i++) {
+
        <br>// Begin loop for rows
+
  
        <br><br>// Where are we, pixel-wise?
+
<br><br><span></span>void get_color() {
        <br>int x = int(width*loc_x[i]) ;
+
<br><span></span><span></span>if (video.available()) {
        <br><br>int y = int(video.height*0.7);
+
<br><span></span><span></span><span></span>video.read();
        <br>int loc = x + y*video.width;  
+
<br><span></span><span></span><span></span>video.loadPixels();
 +
<br><span></span><span></span><span></span>colors=new float[tube_number][3];
 +
<br><span></span><span></span><span></span>float[] loc_x = {0.1,0.215,0.333,0.45,0.569,0.705,0.823,0.941};
 +
<br><span></span><span></span><span></span>for (int i = 0; i < tube_number; i++) {
 +
<br><span></span><span></span><span></span><span></span>// Begin loop for rows
  
        <br><br>colors[i][0] = red(video.pixels[loc]);
+
<br><br><span></span><span></span><span></span><span></span>// Where are we, pixel-wise?
        <br>colors[i][1]= green(video.pixels[loc]);
+
<br><span></span><span></span><span></span><span></span>int x = int(width*loc_x[i]) ;
        <br>colors[i][2]= blue(video.pixels[loc]);
+
<br><br><span></span><span></span><span></span><span></span>int y = int(video.height*0.7);
      <br>}
+
<br><span></span><span></span><span></span><span></span>int loc = x + y*video.width;
  <br>}
+
  <br>}
+
 
+
 
+
  <br><br>void draw_rack() {
+
    <br>if (colors!=null) {
+
      <br>pushMatrix();
+
      <br>translate(0, window_height-space_height);
+
    <br>noFill();
+
      <br>stroke(255);
+
      <br>strokeWeight(3);
+
      <br>rect(rack_x, rack_y,
+
      <br>rack_width, rack_height, rack_height/10);
+
      <br>pushMatrix();
+
      <br>translate(rack_x, rack_y);
+
      <br>for (int i = 0; i < tube_number; i++) {
+
        <br>pushMatrix();
+
        <br>translate(margin*(i+1)+tube_width*i, -rack_y*0.6);
+
        <br>if ((colors[i][0]+colors[i][1]+colors[i][2])/3<white) {
+
          <br>noStroke();
+
          <br>fill(constrain(colors[i][0]*1.1,0,255),
+
        <br>constrain(colors[i][1]*1.1,0,255),
+
        <br>constrain(colors[i][2]*1.1,0,255));
+
          <br>rect(0, 0, tube_width, tube_height,tube_width/2);
+
        <br>} else {
+
          <br>noFill();
+
          <br>stroke(255);
+
          <br>strokeWeight(3);
+
          <br>rect(0, 0, tube_width, tube_height,tube_width/2);
+
        <br>}
+
       
+
        <br><br>popMatrix();
+
      <br>}
+
      <br>popMatrix();
+
      <br>popMatrix();
+
    <br>}
+
  <br>}
+
  
  <br><br>void glow(int n) {
+
<br><br><span></span><span></span><span></span><span></span>colors[i][0] = red(video.pixels[loc]);
    <br>n=n%tube_number;
+
<br><span></span><span></span><span></span><span></span>colors[i][1]= green(video.pixels[loc]);
    <br>if (colors!=null) {
+
<br><span></span><span></span><span></span><span></span>colors[i][2]= blue(video.pixels[loc]);
      <br>pushMatrix();
+
<br><span></span><span></span><span></span>}
      <br>translate(0, window_height-space_height);
+
<br><span></span><span></span>}
      <br>if ((colors[n][0]+colors[n][1]+colors[n][2])/3<white) {
+
<br><span></span>}
        <br>pushMatrix();
+
        <br>translate(rack_x, rack_y);
+
        <br>pushMatrix();
+
        <br>translate(margin*(n+1)+tube_width*n, -rack_y*0.6);
+
        <br>fill(255, 255, 255, 40);
+
        <br>noStroke();
+
        <br>rect(0, 0, tube_width, tube_height,tube_width/2);
+
        <br>popMatrix();
+
        <br>popMatrix();
+
      <br>}
+
      <br>popMatrix();
+
    <br>}
+
  <br>}
+
  
    <br><br>void play_sounds(int n) {
+
<br><br><span></span>void draw_rack() {
      <br>n=n%tube_number;
+
<br><span></span><span></span>if (colors!=null) {
      <br>if (colors!=null) {
+
<br><span></span><span></span><span></span>pushMatrix();
        <br>float noteVal;
+
<br><span></span><span></span><span></span>translate(0, window_height-space_height);
        <br>float[] noteVals=new float[0];
+
<br><span></span><span></span><span></span>noFill();
        <br>boolean play;
+
<br><span></span><span></span><span></span>stroke(255);
        <br>if ((colors[n%tube_number][0]+colors[n%tube_number][1]
+
<br><span></span><span></span><span></span>strokeWeight(3);
          <br>+colors[n%tube_number][2])/3<white) {
+
<br><span></span><span></span><span></span>rect(rack_x, rack_y,
          <br>play=true;
+
<br><span></span><span></span><span></span>rack_width, rack_height, rack_height/10);
        <br>} else {
+
<br><span></span><span></span><span></span>pushMatrix();
          <br>play=false;
+
<br><span></span><span></span><span></span>translate(rack_x, rack_y);
        <br>}
+
<br><span></span><span></span><span></span>for (int i = 0; i < tube_number; i++) {
        <br>if (play) {
+
<br><span></span><span></span><span></span><span></span>pushMatrix();
          <br>noteVal = noteVal(n);
+
<br><span></span><span></span><span></span><span></span>translate(margin*(i+1)+tube_width*i, -rack_y*0.6);
          <br>noteVals=append(noteVals, noteVal);
+
<br><span></span><span></span><span></span><span></span>if ((colors[i][0]+colors[i][1]+colors[i][2])/3 < white) {
        <br>}
+
<br><span></span><span></span><span></span><span></span><span></span>noStroke();
        <br>sc.instrument(instrument(n));
+
<br><span></span><span></span><span></span><span></span><span></span>fill(constrain(colors[i][0]*1.1,0,255),
        <br>println(instrument(n));
+
<br><span></span><span></span><span></span><span></span><span></span>constrain(colors[i][1]*1.1,0,255),
        <br>sc.playChord(noteVals, volume, 0.25);
+
<br><span></span><span></span><span></span><span></span><span></span>constrain(colors[i][2]*1.1,0,255));
      <br>}
+
<br><span></span><span></span><span></span><span></span><span></span>rect(0, 0, tube_width, tube_height,tube_width/2);
    <br>}
+
<br><span></span><span></span><span></span><span></span>} else {
 +
<br><span></span><span></span><span></span><span></span><span></span>noFill();
 +
<br><span></span><span></span><span></span><span></span><span></span>stroke(255);
 +
<br><span></span><span></span><span></span><span></span><span></span>strokeWeight(3);
 +
<br><span></span><span></span><span></span><span></span><span></span>rect(0, 0, tube_width, tube_height,tube_width/2);
 +
<br><span></span><span></span><span></span><span></span>}
  
  <br><br>int instrument(int n){
+
<br><br><span></span><span></span><span></span><span></span>popMatrix();
    <br>int h=int(hue(color(colors[n][0],colors[n][1],
+
<br><span></span><span></span><span></span>}
    <br><br>colors[n][2]))%6);
+
<br><span></span><span></span><span></span>popMatrix();
    <br>if (h==0){return 38;}
+
<br><span></span><span></span><span></span>popMatrix();
  <br>else if (h==1){return 103;}
+
<br><span></span><span></span>}
    <br>else if (h==2){return 112;}
+
<br><span></span>}
    <br>else if (h==3){return 113;}
+
    <br>else if (h==4){return 117;}
+
    <br>else {return 124;}
+
  <br>}
+
 
+
  <br><br>int noteVal(int n){
+
    <br>int h=int(hue(color(colors[n][0],colors[n][1],
+
    <br>colors[n][2]))%6);
+
    <br>if (h==0){return 14;}
+
    <br>else if (h==1){return 20;}
+
    <br>else if (h==2){return 24;}
+
    <br>else if (h==3){return 60;}
+
    <br>else if (h==4){return 96;}
+
    <br>else {return 60;}
+
  <br>}
+
  
    <br><br>void volume_up() {
+
<br><br><span></span>void glow(int n) {
      <br>volume=constrain(volume+5, 0, 127);
+
<br><span></span><span></span>n=n%tube_number;
    <br>}
+
<br><span></span><span></span>if (colors!=null) {
 +
<br><span></span><span></span><span></span>pushMatrix();
 +
<br><span></span><span></span><span></span>translate(0, window_height-space_height);
 +
<br><span></span><span></span><span></span>if ((colors[n][0]+colors[n][1]+colors[n][2])/3 < white) {
 +
<br><span></span><span></span><span></span><span></span>pushMatrix();
 +
<br><span></span><span></span><span></span><span></span>translate(rack_x, rack_y);
 +
<br><span></span><span></span><span></span><span></span>pushMatrix();
 +
<br><span></span><span></span><span></span><span></span>translate(margin*(n+1)+tube_width*n, -rack_y*0.6);
 +
<br><span></span><span></span><span></span><span></span>fill(255, 255, 255, 40);
 +
<br><span></span><span></span><span></span><span></span>noStroke();
 +
<br><span></span><span></span><span></span><span></span>rect(0, 0, tube_width, tube_height,tube_width/2);
 +
<br><span></span><span></span><span></span><span></span>popMatrix();
 +
<br><span></span><span></span><span></span><span></span>popMatrix();
 +
<br><span></span><span></span><span></span>}
 +
<br><span></span><span></span><span></span>popMatrix();
 +
<br><span></span><span></span>}
 +
<br><span></span>}
  
    <br><br>void volume_down() {
+
<br><br><span></span><span></span>void play_sounds(int n) {
      <br>volume=constrain(volume-5, 0, 127);
+
<br><span></span><span></span><span></span>n=n%tube_number;
    <br>}
+
<br><span></span><span></span><span></span>if (colors!=null) {
  <br>}
+
<br><span></span><span></span><span></span><span></span>float noteVal;
 +
<br><span></span><span></span><span></span><span></span>float[] noteVals=new float[0];
 +
<br><span></span><span></span><span></span><span></span>boolean play;
 +
<br><span></span><span></span><span></span><span></span>if ((colors[n%tube_number][0]+colors[n%tube_number][1]
 +
<br><span></span><span></span><span></span><span></span><span></span>+colors[n%tube_number][2])/3 < white) {
 +
<br><span></span><span></span><span></span><span></span><span></span>play=true;
 +
<br><span></span><span></span><span></span><span></span>} else {
 +
<br><span></span><span></span><span></span><span></span><span></span>play=false;
 +
<br><span></span><span></span><span></span><span></span>}
 +
<br><span></span><span></span><span></span><span></span>if (play) {
 +
<br><span></span><span></span><span></span><span></span><span></span>noteVal = noteVal(n);
 +
<br><span></span><span></span><span></span><span></span><span></span>noteVals=append(noteVals, noteVal);
 +
<br><span></span><span></span><span></span><span></span>}
 +
<br><span></span><span></span><span></span><span></span>sc.instrument(instrument(n));
 +
<br><span></span><span></span><span></span><span></span>println(instrument(n));
 +
<br><span></span><span></span><span></span><span></span>sc.playChord(noteVals, volume, 0.25);
 +
<br><span></span><span></span><span></span>}
 +
<br><span></span><span></span>}
 +
 
 +
<br><br><span></span>int instrument(int n){
 +
<br><span></span><span></span>int h=int(hue(color(colors[n][0],colors[n][1],
 +
<br><br><span></span><span></span>colors[n][2]))%6);
 +
<br><span></span><span></span>if (h==0){return 38;}
 +
<br><span></span><span></span>else if (h==1){return 103;}
 +
<br><span></span><span></span>else if (h==2){return 112;}
 +
<br><span></span><span></span>else if (h==3){return 113;}
 +
<br><span></span><span></span>else if (h==4){return 117;}
 +
<br><span></span><span></span>else {return 124;}
 +
<br><span></span>}
 +
 
 +
<br><br><span></span>int noteVal(int n){
 +
<br><span></span><span></span>int h=int(hue(color(colors[n][0],colors[n][1],
 +
<br><span></span><span></span>colors[n][2]))%6);
 +
<br><span></span><span></span>if (h==0){return 14;}
 +
<br><span></span><span></span>else if (h==1){return 20;}
 +
<br><span></span><span></span>else if (h==2){return 24;}
 +
<br><span></span><span></span>else if (h==3){return 60;}
 +
<br><span></span><span></span>else if (h==4){return 96;}
 +
<br><span></span><span></span>else {return 60;}
 +
<br><span></span>}
 +
 
 +
<br><br><span></span><span></span>void volume_up() {
 +
<br><span></span><span></span><span></span>volume=constrain(volume+5, 0, 127);
 +
<br><span></span><span></span>}
 +
 
 +
<br><br><span></span><span></span>void volume_down() {
 +
<br><span></span><span></span><span></span>volume=constrain(volume-5, 0, 127);
 +
<br><span></span><span></span>}
 +
<br><span></span>}
  
 
<br><br>//step sequencer
 
<br><br>//step sequencer
 
<br>class Sequencer {
 
<br>class Sequencer {
  
  <br><br>boolean[] empty;
+
<br><br><span></span>boolean[] empty;
  <br>float[] rgb_list;
+
<br><span></span>float[] rgb_list;
  <br>int grid_num;
+
<br><span></span>int grid_num;
  <br>int grid_size;
+
<br><span></span>int grid_size;
  <br>int interval;
+
<br><span></span>int interval;
  
  <br><br>SoundCipher sc;
+
<br><br><span></span>SoundCipher sc;
  <br>boolean select=false;
+
<br><span></span>boolean select=false;
  <br>int a, b;
+
<br><span></span>int a, b;
  <br>int volume=0;
+
<br><span></span>int volume=0;
  <br>boolean on=true;
+
<br><span></span>boolean on=true;
  <br>float red=0;
+
<br><span></span>float red=0;
  <br>float green=0;  
+
<br><span></span>float green=0;  
  <br>float blue=0;
+
<br><span></span>float blue=0;
  <br>int[] notes = {
+
<br><span></span>int[] notes = {
    <br>96, 93, 91, 89, 86, 84, 81, 79, 77, 74, 72, 69, 67, 65, 62, 60
+
<br><span></span><span></span>96, 93, 91, 89, 86, 84, 81, 79, 77, 74, 72, 69, 67, 65, 62, 60
  <br>};
+
<br><span></span>};
  <br>boolean[] sequence;
+
<br><span></span>boolean[] sequence;
  
  <br><br>Sequencer(SoundCipher _sc,  
+
<br><br><span></span>Sequencer(SoundCipher _sc,  
  <br>int _grid_num, int _grid_size, int _interval, int _a, int _b) {
+
<br><span></span>int _grid_num, int _grid_size, int _interval, int _a, int _b) {
    <br>sc=_sc;
+
<br><span></span><span></span>sc=_sc;
  <br>grid_num=_grid_num;
+
<br><span></span><span></span>grid_num=_grid_num;
    <br>grid_size=_grid_size;
+
<br><span></span><span></span>grid_size=_grid_size;
    <br>interval=_interval;
+
<br><span></span><span></span>interval=_interval;
  
    <br><br>a=_a;
+
<br><br><span></span><span></span>a=_a;
    <br>b=_b;
+
<br><span></span><span></span>b=_b;
  
  
    <br><br>sequence=new boolean[grid_num*grid_num];
+
<br><br><span></span><span></span>sequence=new boolean[grid_num*grid_num];
    <br>for (int i=0; i<sequence.length; i++) {
+
<br><span></span><span></span>for (int i=0; i < sequence.length; i++) {
      <br>sequence[i]=false;
+
<br><span></span><span></span><span></span>sequence[i]=false;
    <br>}
+
<br><span></span><span></span>}
  
    <br><br>empty=new boolean[grid_num*grid_num];
+
<br><br><span></span><span></span>empty=new boolean[grid_num*grid_num];
    <br>for (int i=0; i<sequence.length; i++) {
+
<br><span></span><span></span>for (int i=0; i < sequence.length; i++) {
      <br>empty[i]=false;
+
<br><span></span><span></span><span></span>empty[i]=false;
    <br>}
+
<br><span></span><span></span>}
  <br>}
+
<br><span></span>}
  
  <br><br>void get_sequence(boolean[] _sequence) {
+
<br><br><span></span>void get_sequence(boolean[] _sequence) {
    <br>sequence=_sequence;
+
<br><span></span><span></span>sequence=_sequence;
  <br>}
+
<br><span></span>}
  
  <br><br>void get_color(float[] _rgb_list) {
+
<br><br><span></span>void get_color(float[] _rgb_list) {
    <br>rgb_list=_rgb_list;
+
<br><span></span><span></span>rgb_list=_rgb_list;
    <br>red=rgb_list[0];
+
<br><span></span><span></span>red=rgb_list[0];
    <br>green=rgb_list[1];
+
<br><span></span><span></span>green=rgb_list[1];
    <br>blue=rgb_list[2];
+
<br><span></span><span></span>blue=rgb_list[2];
  <br>}
+
<br><span></span>}
  
  <br><br>void draw_grid() {
+
<br><br><span></span>void draw_grid() {
    <br>pushMatrix();
+
<br><span></span><span></span>pushMatrix();
    <br>translate(a, b);
+
<br><span></span><span></span>translate(a, b);
    <br>rectMode(CORNER);
+
<br><span></span><span></span>rectMode(CORNER);
    <br>int x=0;
+
<br><span></span><span></span>int x=0;
    <br>int y=0;
+
<br><span></span><span></span>int y=0;
   
+
<br><span></span><span></span>
  <br><br>//black background
+
<br><br><span></span><span></span>//black background
    <br>noStroke();
+
<br><span></span><span></span>noStroke();
    <br>fill(0);
+
<br><span></span><span></span>fill(0);
    <br>rect(-interval, -interval, (grid_size+interval)*grid_num+interval*2,  
+
<br><span></span><span></span>rect(-interval, -interval, (grid_size+interval)*grid_num+interval*2,  
    <br>(grid_size+interval)*grid_num+interval*2);
+
<br><span></span><span></span>(grid_size+interval)*grid_num+interval*2);
   
+
<br><span></span><span></span>
    <br><br>for (int i=0; i<sequence.length; i++) {
+
<br><span></span><span></span>for (int i=0; i < sequence.length; i++) {
      <br>x=(grid_size+interval)*(i%grid_num);
+
<br><span></span><span></span><span></span>x=(grid_size+interval)*(i%grid_num);
      <br>y=(grid_size+interval)*(i/grid_num);
+
<br><span></span><span></span><span></span>y=(grid_size+interval)*(i/grid_num);
      <br>if (sequence[i]) {
+
<br><span></span><span></span><span></span>if (sequence[i]) {
        <br>fill(red, green, blue);
+
<br><span></span><span></span><span></span><span></span>fill(red, green, blue);
      <br>} else {
+
<br><span></span><span></span><span></span>} else {
        <br>if (select){fill(100);}
+
<br><span></span><span></span><span></span><span></span>if (select){fill(100);}
        <br>else {fill(70);}
+
<br><span></span><span></span><span></span><span></span>else {fill(70);}
      <br>}
+
<br><span></span><span></span><span></span>}
      <br>rect(x, y, grid_size, grid_size);
+
<br><span></span><span></span><span></span>rect(x, y, grid_size, grid_size);
    <br>}
+
<br><span></span><span></span>}
  
    <br><br>popMatrix();
 
  <br>}
 
  
  <br><br>void glow(int n) {
+
<br><br><span></span><span></span>popMatrix();
    <br>pushMatrix();
+
<br><span></span>}
    <br>translate(a, b);
+
    <br><br>rectMode(CORNER);
+
    <br>for (int m=0; m<grid_num; m++) {
+
      <br>if (sequence[m*grid_num+n]) {
+
        <br>for (int p=-1; p<2; p++) {
+
          <br>for (int q=-1; q<2; q++) {
+
            <br>if (n+p>=0&&n+p<grid_num&&m+q>=0&&
+
              <br>m+q<grid_num) {
+
              <br>noStroke();
+
              <br>fill(255, 255, 255, 20);
+
            <br>rect((n+p)*(interval+grid_size), (m+q)*(interval+grid_size),
+
              <br>grid_size, grid_size);
+
            <br>}
+
            <br>if (p==0&&q==0){
+
              <br>fill(red, green, blue);
+
              <br>rect(n*(interval+grid_size)-interval/2, m*(interval+grid_size)-interval/2,
+
              <br>grid_size+interval, grid_size+interval);
+
              <br>fill(255, 255, 255, 30);
+
              <br>rect(n*(interval+grid_size)-interval/2, m*(interval+grid_size)-interval/2,
+
              <br>grid_size+interval, grid_size+interval);
+
            <br>}
+
          <br>}
+
        <br>}
+
      <br>}
+
    <br>}
+
    <br>popMatrix();
+
  <br>}
+
  
 +
<br><br><span></span>void glow(int n) {
 +
<br><span></span><span></span>pushMatrix();
 +
<br><span></span><span></span>translate(a, b);
 +
<br><br><span></span><span></span>rectMode(CORNER);
 +
<br><span></span><span></span>for (int m=0; m < grid_num; m++) {
 +
<br><span></span><span></span><span></span>if (sequence[m*grid_num+n]) {
 +
<br><span></span><span></span><span></span><span></span>for (int p=-1; p < 2; p++) {
 +
<br><span></span><span></span><span></span><span></span><span></span>for (int q=-1; q < 2; q++) {
 +
<br><span></span><span></span><span></span><span></span><span></span><span></span>if (n+p>=0&&n+p < grid_num&&m+q>=0&&
 +
<br><span></span><span></span><span></span><span></span><span></span><span></span><span></span>m+q < grid_num) {
 +
<br><span></span><span></span><span></span><span></span><span></span><span></span><span></span>noStroke();
 +
<br><span></span><span></span><span></span><span></span><span></span><span></span><span></span>fill(255, 255, 255, 20);
 +
<br><span></span><span></span><span></span><span></span><span></span><span></span><span></span>rect((n+p)*(interval+grid_size), (m+q)*(interval+grid_size),
 +
<br><span></span><span></span><span></span><span></span><span></span><span></span><span></span>grid_size, grid_size);
 +
<br><span></span><span></span><span></span><span></span><span></span><span></span>}
 +
<br><span></span><span></span><span></span><span></span><span></span><span></span>if (p==0&&q==0){
 +
<br><span></span><span></span><span></span><span></span><span></span><span></span><span></span>fill(red, green, blue);
 +
<br><span></span><span></span><span></span><span></span><span></span><span></span><span></span>rect(n*(interval+grid_size)-interval/2, m*(interval+grid_size)-interval/2,
 +
<br><span></span><span></span><span></span><span></span><span></span><span></span><span></span>grid_size+interval, grid_size+interval);
 +
<br><span></span><span></span><span></span><span></span><span></span><span></span><span></span>fill(255, 255, 255, 30);
 +
<br><span></span><span></span><span></span><span></span><span></span><span></span><span></span>rect(n*(interval+grid_size)-interval/2, m*(interval+grid_size)-interval/2,
 +
<br><span></span><span></span><span></span><span></span><span></span><span></span><span></span>grid_size+interval, grid_size+interval);
 +
<br><span></span><span></span><span></span><span></span><span></span><span></span>}
 +
<br><span></span><span></span><span></span><span></span><span></span>}
 +
<br><span></span><span></span><span></span><span></span>}
 +
<br><span></span><span></span><span></span>}
 +
<br><span></span><span></span>}
 +
<br><span></span><span></span>popMatrix();
 +
<br><span></span>}
  
  <br><br>void play_sounds(int n) {
 
    <br>float noteVal;
 
    <br>float[] noteVals=new float[0];
 
  
    <br><br>for (int i=0; i<grid_num; i++) {
+
<br><br><span></span>void play_sounds(int n) {
 +
<br><span></span><span></span>float noteVal;
 +
<br><span></span><span></span>float[] noteVals=new float[0];
  
      <br><br>// if the data text file has a "1" play note
+
<br><br><span></span><span></span>for (int i=0; i < grid_num; i++) {
      <br>if (sequence[i*grid_num+n]) {
+
        <br>noteVal = float(notes[i]);
+
        <br>noteVals=append(noteVals, noteVal);
+
      <br>}
+
     
+
    <br><br>}
+
    <br>sc.instrument(instrument());
+
    <br>sc.playChord(noteVals, volume, 0.25);
+
  <br>}
+
 
+
  <br><br>int instrument(){
+
    <br>int h=int(hue(color(red,green,blue))%8);
+
    <br>if (h==0){return 2;}
+
    <br>else if (h==1){return 3;}
+
    <br>else if (h==2){return 38;}
+
    <br>else if (h==3){return 46;}
+
    <br>else if (h==4){return 47;}
+
    <br>else if (h==5){return 55;}
+
    <br>else if (h==6){return 116;}
+
    <br>else {return 120;}
+
  <br>}
+
  
  <br><br>void select(boolean _select) {
+
<br><br><span></span><span></span><span></span>// if the data text file has a "1" play note
    <br>select=_select;
+
<br><span></span><span></span><span></span>if (sequence[i*grid_num+n]) {
  <br>}
+
<br><span></span><span></span><span></span><span></span>noteVal = float(notes[i]);
 +
<br><span></span><span></span><span></span><span></span>noteVals=append(noteVals, noteVal);
 +
<br><span></span><span></span><span></span>}
  
  <br><br>void set_volume(int _volume) {
+
<br><br><span></span><span></span>}
    <br>volume=constrain(_volume, 0, 127);
+
<br><span></span><span></span>sc.instrument(instrument());
  <br>}
+
<br><span></span><span></span>sc.playChord(noteVals, volume, 0.25);
 +
<br><span></span>}
  
  <br><br>void delete() {
+
<br><br><span></span>int instrument(){
    <br>sequence=empty;
+
<br><span></span><span></span>int h=int(hue(color(red,green,blue))%8);
  <br>}
+
<br><span></span><span></span>if (h==0){return 2;}
 +
<br><span></span><span></span>else if (h==1){return 3;}
 +
<br><span></span><span></span>else if (h==2){return 38;}
 +
<br><span></span><span></span>else if (h==3){return 46;}
 +
<br><span></span><span></span>else if (h==4){return 47;}
 +
<br><span></span><span></span>else if (h==5){return 55;}
 +
<br><span></span><span></span>else if (h==6){return 116;}
 +
<br><span></span><span></span>else {return 120;}
 +
<br><span></span>}
 +
 
 +
<br><br><span></span>void select(boolean _select) {
 +
<br><span></span><span></span>select=_select;
 +
<br><span></span>}
 +
 
 +
<br><br><span></span>void set_volume(int _volume) {
 +
<br><span></span><span></span>volume=constrain(_volume, 0, 127);
 +
<br><span></span>}
 +
 
 +
<br><br><span></span>void delete() {
 +
<br><span></span><span></span>sequence=empty;
 +
<br><span></span>}
 
<br>}
 
<br>}
 
<br>//step sequencer video
 
<br>//step sequencer video
 
<br>class Sequencer_video {
 
<br>class Sequencer_video {
  <br>Capture video;
+
<br><span></span>Capture video;
  <br>SoundCipher sc;
+
<br><span></span>SoundCipher sc;
  <br>BlobDetection theBlobDetection;
+
<br><span></span>BlobDetection theBlobDetection;
  <br>boolean newFrame=false;
+
<br><span></span>boolean newFrame=false;
  <br>PImage img;
+
<br><span></span>PImage img;
  <br>int a, b;
+
<br><span></span>int a, b;
  <br>int grid_size;
+
<br><span></span>int grid_size;
  <br>int grid_num;
+
<br><span></span>int grid_num;
  <br>int interval;
+
<br><span></span>int interval;
  <br>int block_size;
+
<br><span></span>int block_size;
  <br>int volume=0;
+
<br><span></span>int volume=0;
  <br>float[][] blob_color;
+
<br><span></span>float[][] blob_color;
  <br>float[] avg_color=new float[3];
+
<br><span></span>float[] avg_color=new float[3];
  <br>float[][] blobs;
+
<br><span></span>float[][] blobs;
  <br>float[][][] raw_color;  
+
<br><span></span>float[][][] raw_color;  
  <br>float threshold=0.5;
+
<br><span></span>float threshold=0.5;
  <br>boolean draw_grid=false;
+
<br><span></span>boolean draw_grid=false;
  <br>boolean[] sequence;
+
<br><span></span>boolean[] sequence;
  <br>int[] notes = {
+
<br><span></span>int[] notes = {
    <br>, 93, 91, 89, 86, 84, 81, 79, 77, 74, 72, 69, 67, 65, 62, 60
+
<br><span></span><span></span>, 93, 91, 89, 86, 84, 81, 79, 77, 74, 72, 69, 67, 65, 62, 60
  <br>};
+
<br><span></span>};
  <br>int radius=180;
+
<br><span></span>int radius=180;
  
  <br><br>Sequencer_video(Capture _video, SoundCipher _sc, int _grid_num,  
+
<br><br><span></span>Sequencer_video(Capture _video, SoundCipher _sc, int _grid_num,  
  <br>int _grid_size,int _interval) {
+
<br><span></span>int _grid_size,int _interval) {
    <br>colorMode(RGB, 255, 255, 255, 100);
+
<br><span></span><span></span>colorMode(RGB, 255, 255, 255, 100);
    <br>video=_video;
+
<br><span></span><span></span>video=_video;
    <br>sc=_sc;
+
<br><span></span><span></span>sc=_sc;
    <br>grid_num=_grid_num;
+
<br><span></span><span></span>grid_num=_grid_num;
    <br>grid_size=_grid_size;
+
<br><span></span><span></span>grid_size=_grid_size;
    <br>interval=_interval;
+
<br><span></span><span></span>interval=_interval;
    <br>block_size=(interval+grid_size)*grid_num;
+
<br><span></span><span></span>block_size=(interval+grid_size)*grid_num;
   
+
    <br>sequence=new boolean[grid_num*grid_num];
+
    <br>img = new PImage(grid_num*(grid_size+interval)-interval,
+
    <br>grid_num*(grid_size+interval)-interval);
+
    <br>theBlobDetection = new BlobDetection(img.width, img.height);
+
    <br>theBlobDetection.setPosDiscrimination(true);
+
  <br>}
+
  
  <br><br>void threshold_up() {
+
<br><span></span><span></span>sequence=new boolean[grid_num*grid_num];
    <br>threshold=constrain(threshold+0.02, 0, 1);
+
<br><span></span><span></span>img = new PImage(grid_num*(grid_size+interval)-interval,
    <br>println(threshold);
+
<br><span></span><span></span>grid_num*(grid_size+interval)-interval);
  <br>}
+
<br><span></span><span></span>theBlobDetection = new BlobDetection(img.width, img.height);
 +
<br><span></span><span></span>theBlobDetection.setPosDiscrimination(true);
 +
<br><span></span>}
  
  <br><br>void threshold_down() {
+
<br><br><span></span>void threshold_up() {
    <br>threshold=constrain(threshold-0.02, 0, 1);
+
<br><span></span><span></span>threshold=constrain(threshold+0.02, 0, 1);
    <br>println(threshold);
+
<br><span></span><span></span>println(threshold);
  <br>}
+
<br><span></span>}
  
  <br><br>void position(int _a, int _b) {
+
<br><br><span></span>void threshold_down() {
    <br>a=_a;
+
<br><span></span><span></span>threshold=constrain(threshold-0.02, 0, 1);
    <br>b=_b;
+
<br><span></span><span></span>println(threshold);
  <br>}
+
<br><span></span>}
  
  <br><br>void grid_on() {
+
<br><br><span></span>void position(int _a, int _b) {
    <br>draw_grid=true;
+
<br><span></span><span></span>a=_a;
  <br>}
+
<br><span></span><span></span>b=_b;
 
+
<br><span></span>}
  <br><br>void grid_off(){
+
    <br>draw_grid=false;
+
  <br>}
+
  
  <br><br>void bd() {
+
<br><br><span></span>void grid_on() {
    <br>if (video.available()) {
+
<br><span></span><span></span>draw_grid=true;
      <br>theBlobDetection.setThreshold(threshold);
+
<br><span></span>}
      <br>video.read();
+
      <br>img.copy(video, (video.width-video.height)/2, 0, video.height,
+
    <br>video.height, 0, 0, img.width, img.height);
+
      <br>image(img, a, b, img.width+interval, img.height+interval);
+
      <br>fastblur(img, 2);
+
      <br>theBlobDetection.computeBlobs(img.pixels);
+
      <br>save_blob();
+
      <br>blob_color();
+
      <br>convert();
+
    <br>}
+
  <br>}
+
  
  <br>void bd_draw(int n) {
+
<br><br><span></span>void grid_off(){
    <br>if (draw_grid) {
+
<br><span></span><span></span>draw_grid=false;
     
+
<br><span></span>}
      <br>draw_grid();
+
      <br>glow(n);
+
      <br>play_sounds(n);
+
    <br>} else {
+
      <br>drawBlobsAndEdges(true, false);
+
    <br>}
+
  <br>}
+
  
  <br><br>void blob_color() {
+
<br><br><span></span>void bd() {
    <br>float red=0;
+
<br><span></span><span></span>if (video.available()) {
    <br>float blue=0;
+
<br><span></span><span></span><span></span>theBlobDetection.setThreshold(threshold);
    <br>float green=0;
+
<br><span></span><span></span><span></span>video.read();
    <br>int total=theBlobDetection.getBlobNb ();
+
<br><span></span><span></span><span></span>img.copy(video, (video.width-video.height)/2, 0, video.height,
    <br>for (int n=0; n<total; n++) {
+
<br><span></span><span></span><span></span>video.height, 0, 0, img.width, img.height);
 +
<br><span></span><span></span><span></span>image(img, a, b, img.width+interval, img.height+interval);
 +
<br><span></span><span></span><span></span>fastblur(img, 2);
 +
<br><span></span><span></span><span></span>theBlobDetection.computeBlobs(img.pixels);
 +
<br><span></span><span></span><span></span>save_blob();
 +
<br><span></span><span></span><span></span>blob_color();
 +
<br><span></span><span></span><span></span>convert();
 +
<br><span></span><span></span>}
 +
<br><span></span>}
  
      <br><br>//get the color
+
<br><span></span>void bd_draw(int n) {
      <br><br><br>blob_color=new float[total][3];
+
<br><span></span><span></span>if (draw_grid) {
      <br><br><br><br>int centerX = int(blobs[n][0]+0.5*blobs[n][2]);
+
<br><span></span><span></span><span></span>
      <br>int centerY = int(blobs[n][1]+0.5*blobs[n][3]);
+
<br><span></span><span></span><span></span>draw_grid();
 +
<br><span></span><span></span><span></span>glow(n);
 +
<br><span></span><span></span><span></span>play_sounds(n);
 +
<br><span></span><span></span>} else {
 +
<br><span></span><span></span><span></span>drawBlobsAndEdges(true, false);
 +
<br><span></span><span></span>}
 +
<br><span></span>}
  
      <br><br>color c = get(centerX+a, centerY+b);
+
<br><br><span></span>void blob_color() {
      <br>blob_color[n][0] = red(c);
+
<br><span></span><span></span>float red=0;
      <br><br>blob_color[n][1] = green(c);
+
<br><span></span><span></span>float blue=0;
      <br>blob_color[n][2] = blue(c);
+
<br><span></span><span></span>float green=0;
 
+
<br><span></span><span></span>int total=theBlobDetection.getBlobNb ();
      <br><br>red+=blob_color[n][0];
+
<br><span></span><span></span>for (int n=0; n < total; n++) {
      <br>green+=blob_color[n][1];
+
      <br>blue+=blob_color[n][2];
+
         
+
  
    <br>}
+
<br><br><span></span><span></span><span></span>//get the color
    <br>avg_color[0]=constrain(red/total*1.2,0,255);
+
<br><br><br><span></span><span></span><span></span>blob_color=new float[total][3];
    <br>avg_color[1]=constrain(green/total*1.2,0,255);
+
<br><br><br><br><span></span><span></span><span></span>int centerX = int(blobs[n][0]+0.5*blobs[n][2]);
    <br>avg_color[2]=constrain(blue/total*1.2,0,255);
+
<br><span></span><span></span><span></span>int centerY = int(blobs[n][1]+0.5*blobs[n][3]);
  
  <br>}
+
<br><br><span></span><span></span><span></span>color c = get(centerX+a, centerY+b);
 +
<br><span></span><span></span><span></span>blob_color[n][0] = red(c);
 +
<br><br><span></span><span></span><span></span>blob_color[n][1] = green(c);
 +
<br><span></span><span></span><span></span>blob_color[n][2] = blue(c);
  
  <br><br>void drawBlobsAndEdges(boolean drawBlobs, boolean drawEdges) {
+
<br><br><span></span><span></span><span></span>red+=blob_color[n][0];
    <br>pushMatrix();
+
<br><span></span><span></span><span></span>green+=blob_color[n][1];
    <br><br>translate(a, b);
+
<br><span></span><span></span><span></span>blue+=blob_color[n][2];
    <br><br><br>noFill();
+
    <br><br><br><br>rectMode(CORNER);
+
    <br>Blob b;
+
    <br>EdgeVertex eA, eB;
+
   
+
    <br><br>for (int n=0; n<theBlobDetection.getBlobNb (); n++)
+
    <br>{
+
      <br>b=theBlobDetection.getBlob(n);
+
      <br>if (b!=null)
+
      <br>{
+
        <br>// Edges
+
        <br>if (drawEdges)
+
        <br>{
+
          <br>strokeWeight(3);
+
          <br><br>stroke(0, 255, 0);
+
          <br>for (int m=0; m<b.getEdgeNb (); m++)
+
          <br>{
+
            <br>eA = b.getEdgeVertexA(m);
+
            <br>eB = b.getEdgeVertexB(m);
+
            <br>if (eA !=null && eB !=null)
+
              <br>line(
+
              <br><br>eA.x*block_size, eA.y*block_size,
+
              <br><br><br>eB.x*block_size, eB.y*block_size
+
                <br>);
+
          <br>}
+
        <br>}
+
  
        <br><br>// Blobs
+
<br><span></span><span></span>}
        <br>if (dist(block_size/2,block_size/2,b.xMin*block_size,
+
<br><span></span><span></span>avg_color[0]=constrain(red/total*1.2,0,255);
        <br>b.yMin*block_size)<radius
+
<br><span></span><span></span>avg_color[1]=constrain(green/total*1.2,0,255);
        <br>&&drawBlobs&&b.w*block_size>5&&b.w*block_size<25&&
+
<br><span></span><span></span>avg_color[2]=constrain(blue/total*1.2,0,255);
        <br>b.h*block_size>5&&b.h*block_size<25)
+
        <br>{
+
          <br>strokeWeight(3);
+
          <br>stroke(255, 0, 0);
+
       
+
          <br><br>rect(
+
          <br><br><br>b.xMin*block_size, b.yMin*block_size,  
+
          <br><br><br><br>b.w*block_size, b.h*block_size
+
            <br>);
+
        <br>}
+
      <br>}
+
    <br>}
+
  <br> popMatrix();
+
  <br><br>}
+
  
  <br><br>void fastblur(PImage img, int radius)
+
<br><span></span>}
  <br>{
+
    <br>if (radius<1) {
+
      <br>return;
+
    <br>}
+
    <br>int w=img.width;
+
    <br>int h=img.height;
+
    <br>int wm=w-1;
+
    <br>int hm=h-1;
+
    <br>int wh=w*h;
+
    <br>int div=radius+radius+1;
+
    <br>int r[]=new int[wh];
+
    <br>int g[]=new int[wh];
+
    <br>int b[]=new int[wh];
+
    <br>int rsum, gsum, bsum, x, y, i, p, p1, p2, yp, yi, yw;
+
    <br>int vmin[] = new int[max(w, h)];
+
    <br>int vmax[] = new int[max(w, h)];
+
    <br>int[] pix=img.pixels;
+
    <br>int dv[]=new int[256*div];
+
    <br>for (i=0; i<256*div; i++) {
+
      <br>dv[i]=(i/div);
+
    <br>}
+
  
    <br><br>yw=yi=0;
+
<br><br><span></span>void drawBlobsAndEdges(boolean drawBlobs, boolean drawEdges) {
 +
<br><span></span><span></span>pushMatrix();
 +
<br><span></span><span></span>translate(a, b);
 +
<br><span></span><span></span>noFill();
 +
<br><span></span><span></span>rectMode(CORNER);
 +
<br><span></span><span></span>Blob b;
 +
<br><span></span><span></span>EdgeVertex eA, eB;
  
    <br><br>for (y=0; y<h; y++) {
+
<br><br><span></span><span></span>for (int n=0; n < theBlobDetection.getBlobNb (); n++)
      <br>rsum=gsum=bsum=0;
+
<br><span></span><span></span>{
      <br>for (i=-radius; i<=radius; i++) {
+
<br><span></span><span></span><span></span>b=theBlobDetection.getBlob(n);
        <br>p=pix[yi+min(wm, max(i, 0))];
+
<br><span></span><span></span><span></span>if (b!=null)
        <br>rsum+=(p & 0xff0000)>>16;
+
<br><span></span><span></span><span></span>{
        <br>gsum+=(p & 0x00ff00)>>8;
+
<br><span></span><span></span><span></span><span></span>// Edges
        <br>bsum+= p & 0x0000ff;
+
<br><span></span><span></span><span></span><span></span>if (drawEdges)
      <br>}
+
<br><span></span><span></span><span></span><span></span>{
      <br>for (x=0; x<w; x++) {
+
<br><span></span><span></span><span></span><span></span><span></span>strokeWeight(3);
 +
<br><br><span></span><span></span><span></span><span></span><span></span>stroke(0, 255, 0);
 +
<br><span></span><span></span><span></span><span></span><span></span>for (int m=0; m < b.getEdgeNb (); m++)
 +
<br><span></span><span></span><span></span><span></span><span></span>{
 +
<br><span></span><span></span><span></span><span></span><span></span><span></span>eA = b.getEdgeVertexA(m);
 +
<br><span></span><span></span><span></span><span></span><span></span><span></span>eB = b.getEdgeVertexB(m);
 +
<br><span></span><span></span><span></span><span></span><span></span><span></span>if (eA !=null && eB !=null)
 +
<br><span></span><span></span><span></span><span></span><span></span><span></span><span></span>line(
 +
<br><br><span></span><span></span><span></span><span></span><span></span><span></span><span></span>eA.x*block_size, eA.y*block_size,
 +
<br><br><br><span></span><span></span><span></span><span></span><span></span><span></span><span></span>eB.x*block_size, eB.y*block_size
 +
<br><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span>);
 +
<br><span></span><span></span><span></span><span></span><span></span>}
 +
<br><span></span><span></span><span></span><span></span>}
  
        <br><br>r[yi]=dv[rsum];
+
<br><br><span></span><span></span><span></span><span></span>// Blobs
        <br>g[yi]=dv[gsum];
+
<br><span></span><span></span><span></span><span></span>if (dist(block_size/2,block_size/2,b.xMin*block_size,
        <br>b[yi]=dv[bsum];
+
<br><span></span><span></span><span></span><span></span>b.yMin*block_size) < radius
 +
<br><span></span><span></span><span></span><span></span>&&drawBlobs&&b.w*block_size>5&&b.w*block_size < 25&&
 +
<br><span></span><span></span><span></span><span></span>b.h*block_size>5&&b.h*block_size < 25)
 +
<br><span></span><span></span><span></span><span></span>{
 +
<br><span></span><span></span><span></span><span></span><span></span>strokeWeight(3);
 +
<br><span></span><span></span><span></span><span></span><span></span>stroke(255, 0, 0);
  
      <br><br>if (y==0) {
+
<br><br><span></span><span></span><span></span><span></span><span></span>rect(
          <br>vmin[x]=min(x+radius+1, wm);
+
<br><span></span><span></span><span></span><span></span><span></span>b.xMin*block_size, b.yMin*block_size,  
        <br>vmax[x]=max(x-radius, 0);
+
<br><span></span><span></span><span></span><span></span><span></span>b.w*block_size, b.h*block_size
        <br>}
+
<br><span></span><span></span><span></span><span></span><span></span><span></span>);
        <br>p1=pix[yw+vmin[x]];
+
<br><span></span><span></span><span></span><span></span>}
        <br><br>p2=pix[yw+vmax[x]];
+
<br><span></span><span></span><span></span>}
 +
<br><span></span><span></span>}
 +
<br><span></span><span></span>popMatrix();
 +
<br><br><span></span>}
  
        <br><br>rsum+=((p1 & 0xff0000)-(p2 & 0xff0000))>>16;
+
<br><br><span></span>void fastblur(PImage img, int radius)
        <br>gsum+=((p1 & 0x00ff00)-(p2 & 0x00ff00))>>8;
+
<br><span></span>{
        <br><br><br>bsum+= (p1 & 0x0000ff)-(p2 & 0x0000ff);
+
<br><span></span><span></span>if (radius < 1) {
        <br>yi++;
+
<br><span></span><span></span><span></span>return;
      <br>}
+
<br><span></span><span></span>}
      <br>yw+=w;
+
<br><span></span><span></span>int w=img.width;
  <br> }
+
<br><span></span><span></span>int h=img.height;
 +
<br><span></span><span></span>int wm=w-1;
 +
<br><span></span><span></span>int hm=h-1;
 +
<br><span></span><span></span>int wh=w*h;
 +
<br><span></span><span></span>int div=radius+radius+1;
 +
<br><span></span><span></span>int r[]=new int[wh];
 +
<br><span></span><span></span>int g[]=new int[wh];
 +
<br><span></span><span></span>int b[]=new int[wh];
 +
<br><span></span><span></span>int rsum, gsum, bsum, x, y, i, p, p1, p2, yp, yi, yw;
 +
<br><span></span><span></span>int vmin[] = new int[max(w, h)];
 +
<br><span></span><span></span>int vmax[] = new int[max(w, h)];
 +
<br><span></span><span></span>int[] pix=img.pixels;
 +
<br><span></span><span></span>int dv[]=new int[256*div];
 +
<br><span></span><span></span>for (i=0; i < 256*div; i++) {
 +
<br><span></span><span></span><span></span>dv[i]=(i/div);
 +
<br><span></span><span></span>}
  
    <br><br>for (x=0; x<w; x++) {
+
<br><br><span></span><span></span>yw=yi=0;
      <br>rsum=gsum=bsum=0;
+
      <br>yp=-radius*w;
+
      <br>for (i=-radius; i<=radius; i++) {
+
        <br>yi=max(0, yp)+x;
+
        <br>rsum+=r[yi];
+
        <br>gsum+=g[yi];
+
        <br>bsum+=b[yi];
+
        <br>yp+=w;
+
      <br>}
+
      <br>yi=x;
+
      <br>for (y=0; y<h; y++) {
+
        <br>pix[yi]=0xff000000 | (dv[rsum]<<16) | (dv[gsum]<<8) | dv[bsum];
+
        <br>if (x==0) {
+
          <br>vmin[y]=min(y+radius+1, hm)*w;
+
          <br>vmax[y]=max(y-radius, 0)*w;
+
        <br>}
+
        <br>p1=x+vmin[y];
+
        <br>p2=x+vmax[y];
+
  
        <br><br>rsum+=r[p1]-r[p2];
+
<br><br><span></span><span></span>for (y=0; y < h; y++) {
        <br>gsum+=g[p1]-g[p2];
+
<br><span></span><span></span><span></span>rsum=gsum=bsum=0;
        <br>bsum+=b[p1]-b[p2];
+
<br><span></span><span></span><span></span>for (i=-radius; i<=radius; i++) {
 +
<br><span></span><span></span><span></span><span></span>p=pix[yi+min(wm, max(i, 0))];
 +
<br><span></span><span></span><span></span><span></span>rsum+=(p & 0xff0000)>>16;
 +
<br><span></span><span></span><span></span><span></span>gsum+=(p & 0x00ff00)>>8;
 +
<br><span></span><span></span><span></span><span></span>bsum+= p & 0x0000ff;
 +
<br><span></span><span></span><span></span>}
 +
<br><span></span><span></span><span></span>for (x=0; x < w; x++) {
  
        <br><br>yi+=w;
+
<br><br><span></span><span></span><span></span><span></span>r[yi]=dv[rsum];
      <br>}
+
<br><span></span><span></span><span></span><span></span>g[yi]=dv[gsum];
    <br>}
+
<br><span></span><span></span><span></span><span></span>b[yi]=dv[bsum];
  <br>}
+
  
  <br><br>void save_blob() {
+
<br><br><span></span><span></span><span></span><span></span>if (y==0) {
 +
<br><span></span><span></span><span></span><span></span><span></span>vmin[x]=min(x+radius+1, wm);
 +
<br><span></span><span></span><span></span><span></span><span></span>vmax[x]=max(x-radius, 0);
 +
<br><span></span><span></span><span></span><span></span>}
 +
<br><span></span><span></span><span></span><span></span>p1=pix[yw+vmin[x]];
 +
<br><br><span></span><span></span><span></span><span></span>p2=pix[yw+vmax[x]];
  
    <br><br>Blob b;
+
<br><br><span></span><span></span><span></span><span></span>rsum+=((p1 & 0xff0000)-(p2 & 0xff0000))>>16;
    <br>blobs=new float[theBlobDetection.getBlobNb ()][4];
+
<br><span></span><span></span><span></span><span></span>gsum+=((p1 & 0x00ff00)-(p2 & 0x00ff00))>>8;
    <br>for (int n=0; n<theBlobDetection.getBlobNb (); n++)
+
<br><span></span><span></span><span></span><span></span>bsum+= (p1 & 0x0000ff)-(p2 & 0x0000ff);
    <br>{
+
<br><span></span><span></span><span></span><span></span>yi++;
      <br>b=theBlobDetection.getBlob(n);
+
<br><span></span><span></span><span></span>}
      <br>if (dist(block_size/2,block_size/2,b.xMin*block_size,
+
<br><span></span><span></span><span></span>yw+=w;
        <br>b.yMin*block_size)<radius
+
<br><span></span> }
      <br>&&b.w*block_size>5&&b.w*block_size<25&&
+
      <br>b.h*block_size>5&&b.h*block_size<25){
+
      <br>blobs[n][0]=b.xMin*block_size;
+
      <br>blobs[n][1]=b.yMin*block_size;
+
      <br>blobs[n][2]=b.w*block_size;
+
      <br>blobs[n][3]=b.h*block_size;
+
    <br>}
+
    <br>}
+
  <br>}
+
  
  <br><br>void convert() {
+
<br><br><span></span><span></span>for (x=0; x<w; x++) {
    <br>int row, col, i;
+
<br><span></span><span></span><span></span>rsum=gsum=bsum=0;
    <br>for (int n=0; n<sequence.length; n++) {
+
<br><br><span></span><span></span><span></span>yp=-radius*w;
      <br>sequence[n]=false;
+
<br><span></span><span></span><span></span>for (i=-radius; i<=radius; i++) {
    <br>}
+
<br><span></span><span></span><span></span><span></span>yi=max(0, yp)+x;
    <br>for (int n=0; n<blobs.length; n++) {
+
<br><span></span><span></span><span></span><span></span>rsum+=r[yi];
      <br>row=int(blobs[n][0]+blobs[n][2]*0.5)/grid_size;
+
<br><span></span><span></span><span></span><span></span>gsum+=g[yi];
      <br>col=int(blobs[n][1]+blobs[n][3]*0.5)/grid_size;
+
<br><span></span><span></span><span></span><span></span>bsum+=b[yi];
      <br>i=row+col*grid_num;
+
<br><span></span><span></span><span></span><span></span>yp+=w;
    <br>if (i>0&&i<grid_num*grid_num) {
+
<br><span></span><span></span><span></span>}
        <br>sequence[i]=true;
+
<br><span></span><span></span><span></span>yi=x;
      <br>}
+
<br><span></span><span></span><span></span>for (y=0; y < h; y++) {
    <br>}
+
<br><span></span><span></span><span></span><span></span>pix[yi]=0xff000000 | (dv[rsum]<< 16) | (dv[gsum]<< 8) | dv[bsum];
  <br>}
+
<br><span></span><span></span><span></span><span></span>if (x==0) {
 +
<br><span></span><span></span><span></span><span></span><span></span>vmin[y]=min(y+radius+1, hm)*w;
 +
<br><span></span><span></span><span></span><span></span><span></span>vmax[y]=max(y-radius, 0)*w;
 +
<br><span></span><span></span><span></span><span></span>}
 +
<br><span></span><span></span><span></span><span></span>p1=x+vmin[y];
 +
<br><span></span><span></span><span></span><span></span>p2=x+vmax[y];
  
  <br><br>void draw_grid() {
+
<br><br><span></span><span></span><span></span><span></span>\rsum+=r[p1]-r[p2];
    <br>pushMatrix();
+
<br><span></span><span></span><span></span><span></span>gsum+=g[p1]-g[p2];
    <br>translate(a, b);
+
<br><span></span><span></span><span></span><span></span>bsum+=b[p1]-b[p2];
    <br>rectMode(CORNER);
+
    <br>int x=0;
+
    <br>int y=0;
+
    <br>noStroke();
+
    <br>fill(0);
+
    <br>rect(-interval,-interval,(grid_size+interval)*grid_num+interval*2,
+
    <br>(grid_size+interval)*grid_num+interval*2);
+
    <br>for (int i=0; i<sequence.length; i++) {
+
      <br>x=(grid_size+interval)*(i%grid_num);
+
      <br>y=(grid_size+interval)*(i/grid_num);
+
  
        <br><br>noStroke();
+
<br><br><span></span><span></span><span></span><span></span>yi+=w;
     
+
<br><span></span><span></span><span></span>}
      <br><br>if (sequence[i]) {
+
<br><span></span><span></span>}
        <br>fill(avg_color[0], avg_color[1], avg_color[2]);
+
<br><span></span>}
      <br>} else {
+
      <br>fill(70);
+
      <br>}
+
      <br>rect(x, y, grid_size, grid_size);
+
    <br>}
+
    <br>popMatrix();
+
  <br>}
+
  
  <br><br>void glow(int n) {
+
<br><br><span></span>void save_blob() {
    <br>pushMatrix();
+
    <br>translate(a, b);
+
    <br>rectMode(CORNER);
+
    <br>for (int m=0; m<grid_num; m++) {
+
      <br>if (sequence[m*grid_num+n]) {
+
        <br>for (int p=-1; p<2; p++) {
+
          <br>for (int q=-1; q<2; q++) {
+
            <br>if (n+p>=0&&n+p<grid_num&&m+q>=0&&
+
              <br>m+q<grid_num) {
+
              <br>noStroke();
+
              <br><br>fill(255, 255, 255, 20);
+
              <br>rect((n+p)*(interval+grid_size), (m+q)*(interval+grid_size),
+
              <br><br>grid_size, grid_size);
+
            <br>}
+
            <br>if (p==0&&q==0){
+
              <br>fill(255, 255, 255, 30);
+
              <br>rect(n*(interval+grid_size), m*(interval+grid_size),
+
              <br>grid_size, grid_size);
+
            <br>}
+
          <br>}
+
        <br>}
+
      <br>}
+
    <br>}
+
    <br>popMatrix();
+
  <br>}
+
  
<br> void play_sounds(int n) {
+
<br><br><span></span><span></span>Blob b;
    <br>float noteVal;
+
<br><span></span><span></span>blobs=new float[theBlobDetection.getBlobNb ()][4];
    <br>float[] noteVals=new float[0];
+
<br><span></span><span></span>for (int n=0; n < theBlobDetection.getBlobNb (); n++)
    <br>for (int i=0; i<grid_num; i++) {
+
<br><span></span><span></span>{
      <br>if (sequence[i*grid_num+n]) {
+
<br><span></span><span></span><span></span>b=theBlobDetection.getBlob(n);
        <br>noteVal = float(notes[i]);
+
<br><span></span><span></span><span></span>if (dist(block_size/2,block_size/2,b.xMin*block_size,
        <br>noteVals=append(noteVals, noteVal);
+
<br><span></span><span></span><span></span><span></span>b.yMin*block_size)< radius
      <br>}
+
<br><span></span><span></span><span></span>&&b.w*block_size>5&&b.w*block_size< 25&&
    <br>}
+
<br><span></span><span></span><span></span>b.h*block_size>5&&b.h*block_size< 25){
  <br>sc.instrument(instrument());
+
<br><span></span><span></span><span></span>blobs[n][0]=b.xMin*block_size;
  <br>sc.playChord(noteVals, volume, 0.25);
+
<br><span></span><span></span><span></span>blobs[n][1]=b.yMin*block_size;
  <br>}
+
<br><span></span><span></span><span></span>blobs[n][2]=b.w*block_size;
 +
<br><span></span><span></span><span></span>blobs[n][3]=b.h*block_size;
 +
<br><span></span><span></span>}
 +
<br><span></span><span></span>}
 +
<br><span></span>}
  
  <br><br>float[] grid_color() {
+
<br><br><span></span>void convert() {
    <br>float[] color_return=new float[3];
+
<br><span></span><span></span>int row, col, i;
    <br>arrayCopy(avg_color, color_return);
+
<br><span></span><span></span>for (int n=0; n< sequence.length; n++) {
    <br>return color_return;
+
<br><span></span><span></span><span></span>sequence[n]=false;
  <br>}
+
<br><span></span><span></span>}
 +
<br><span></span><span></span>for (int n=0; n< blobs.length; n++) {
 +
<br><span></span><span></span><span></span>row=int(blobs[n][0]+blobs[n][2]*0.5)/grid_size;
 +
<br><span></span><span></span><span></span>col=int(blobs[n][1]+blobs[n][3]*0.5)/grid_size;
 +
<br><span></span><span></span><span></span>i=row+col*grid_num;
 +
<br><span></span><span></span>if (i>0&&i< grid_num*grid_num) {
 +
<br><span></span><span></span><span></span><span></span>sequence[i]=true;
 +
<br><span></span><span></span><span></span>}
 +
<br><span></span><span></span>}
 +
<br><span></span>}
  
  <br><br>boolean[] sequence() {
+
<br><br><span></span>void draw_grid() {
    <br>boolean[] to_return=new boolean[sequence.length];
+
<br><span></span><span></span>pushMatrix();
    <br>arrayCopy(sequence, to_return);
+
<br><span></span><span></span>translate(a, b);
    <br>return to_return;
+
<br><span></span><span></span>rectMode(CORNER);
  <br>}
+
<br><span></span><span></span>int x=0;
 +
<br><span></span><span></span>int y=0;
 +
<br><span></span><span></span>noStroke();
 +
<br><span></span><span></span>fill(0);
 +
<br><span></span><span></span>rect(-interval,-interval,(grid_size+interval)*grid_num+interval*2,
 +
<br><span></span><span></span>(grid_size+interval)*grid_num+interval*2);
 +
<br><span></span><span></span>for (int i=0; i< sequence.length; i++) {
 +
<br><span></span><span></span><span></span>x=(grid_size+interval)*(i%grid_num);
 +
<br><span></span><span></span><span></span>y=(grid_size+interval)*(i/grid_num);
  
  <br><br><br>int instrument(){
+
<br><br><span></span><span></span><span></span><span></span>noStroke();
    <br>int h=int(hue(color(avg_color[0],avg_color[1],
+
<span></span><span></span><span></span>
    <br>avg_color[2]))%8);
+
<br><br><span></span><span></span><span></span>if (sequence[i]) {
    <br>if (h==0){return 2;}
+
<br><span></span><span></span><span></span><span></span><br>fill(avg_color[0], avg_color[1], avg_color[2]);
    <br>else if (h==1){return 3;}
+
<br><span></span><span></span><span></span>} else {
    <br>else if (h==2){return 38;}
+
<br><span></span><span></span><span></span> fill(70);
    <br>else if (h==3){return 46;}
+
<br><span></span><span></span><span></span>}
    <br>else if (h==4){return 47;}
+
<br><span></span><span></span><span></span>rect(x, y, grid_size, grid_size);
    <br>else if (h==5){return 55;}
+
<br><span></span><span></span>}
    <br>else if (h==6){return 116;}
+
<br><span></span><span></span>popMatrix();
    <br>else {return 120;}
+
<br><span></span><br>}
  <br>}
+
 
 
+
<br><br><span></span><br><br>void glow(int n) {
  <br><br>void set_volume(int _volume) {
+
<br><span></span><span></span>pushMatrix();
    <br>volume=constrain(_volume, 0, 127);
+
<br><span></span><span></span>translate(a, b);
  <br>}
+
<br><span></span><span></span>rectMode(CORNER);
 +
<br><span></span><span></span>for (int m=0; m< grid_num; m++) {
 +
<br><span></span><span></span><span></span>if (sequence[m*grid_num+n]) {
 +
<br><span></span><span></span><span></span><span></span>for (int p=-1; p< 2; p++) {
 +
<br><span></span><span></span><span></span><span></span><span></span>for (int q=-1; q< 2; q++) {
 +
<br><span></span><span></span><span></span><span></span><span></span><span></span>if (n+p>=0&&n+p< grid_num&&m+q>=0&&
 +
<br><span></span><span></span><span></span><span></span><span></span><span></span><span></span>m+q< grid_num) {
 +
<br><span></span><span></span><span></span><span></span><span></span><span></span><span></span>noStroke();
 +
<br><br><span></span><span></span><span></span><span></span><span></span><span></span><span></span>fill(255, 255, 255, 20);
 +
<br><span></span><span></span><span></span><span></span><span></span><span></span><span></span>rect((n+p)*(interval+grid_size), (m+q)*(interval+grid_size),
 +
<br><br><span></span><span></span><span></span><span></span><span></span><span></span><span></span>grid_size, grid_size);
 +
<br><span></span><span></span><span></span><span></span><span></span><span></span>}
 +
<br><span></span><span></span><span></span><span></span><span></span><span></span>if (p==0&&q==0){
 +
<br><span></span><span></span><span></span><span></span><span></span><span></span><span></span>fill(255, 255, 255, 30);
 +
<br><span></span><span></span><span></span><span></span><span></span><span></span><span></span>rect(n*(interval+grid_size), m*(interval+grid_size),
 +
<br><span></span><span></span><span></span><span></span><span></span><span></span><span></span>grid_size, grid_size);
 +
<br><span></span><span></span><span></span><span></span><span></span><span></span>}
 +
<br><span></span><span></span><span></span><span></span><span></span>}
 +
<br><span></span><span></span><span></span><span></span>}
 +
<br><span></span><span></span><span></span>}
 +
<br><span></span><span></span>}
 +
<br><span></span><span></span>popMatrix();
 +
<br><span></span>}
 +
 
 +
<br><span></span>void play_sounds(int n) {
 +
<br><span></span><span></span>float noteVal;
 +
<br><span></span><span></span>float[] noteVals=new float[0];
 +
<br><span></span><span></span>for (int i=0; i< grid_num; i++) {
 +
<br> <span></span><span></span><span></span>if (sequence[i*grid_num+n]) {
 +
<br><span></span><span></span><span></span><span></span>noteVal = float(notes[i]);
 +
<br><span></span><span></span><span></span><span></span>noteVals=append(noteVals, noteVal);
 +
<br><span></span><span></span><span></span>}
 +
<br><span></span><span></span>}
 +
<br><span></span> sc.instrument(instrument());
 +
<br><span></span> sc.playChord(noteVals, volume, 0.25);
 +
<br><span></span>}
 +
 
 +
<br><span></span><br>float[] grid_color() {
 +
<br><span></span><span></span>float[] color_return=new float[3];
 +
<br><span></span><span></span>arrayCopy(avg_color, color_return);
 +
<br><span></span><span></span>return color_return;
 +
<br><span></span>}
 +
 
 +
<br><br><span></span>boolean[] sequence() {
 +
<br><span></span><span></span>boolean[] to_return=new boolean[sequence.length];
 +
<br><span></span><span></span>arrayCopy(sequence, to_return);
 +
<br><span></span><span></span>return to_return;
 +
<br><span></span>}
 +
 
 +
<br><br><br><span></span>int instrument(){
 +
<br><span></span><span></span>int h=int(hue(color(avg_color[0],avg_color[1],
 +
<br><span></span><span></span>avg_color[2]))%8);
 +
<br><span></span><span></span>if (h==0){return 2;}
 +
<br><span></span><span></span>else if (h==1){return 3;}
 +
<br><span></span><span></span>else if (h==2){return 38;}
 +
<br><span></span><span></span>else if (h==3){return 46;}
 +
<br><span></span><span></span>else if (h==4){return 47;}
 +
<br><span></span><span></span>else if (h==5){return 55;}
 +
<br><span></span><span></span>else if (h==6){return 116;}
 +
<br><span></span>}
 +
<span></span>
 +
<br><br><span></span>void set_volume(int _volume) {
 +
<br><span></span><span></span>volume=constrain(_volume, 0, 127);
 +
<br><span></span>}
 
<br>}
 
<br>}
  
Line 1,012: Line 1,020:
  
 
<br><br>soundcipher
 
<br><br>soundcipher
http://explodingart.com/soundcipher/
+
<br>http://explodingart.com/soundcipher/
  
 
   </p>
 
   </p>
 
</div>
 
</div>
<div id="Button"class="collapsed" onclick="expandButton()">
+
<div id="Button" class="collapsed">
   <h5 style="display:inline-block"><span class="noselect">Button Control</span></h5>
+
   <h5 style="display:inline-block" onclick="expandButton()"><span class="noselect">Button Control</span></h5>
 
   <br>
 
   <br>
 
   <p id="ButtonText" style="display:none">
 
   <p id="ButtonText" style="display:none">
  <br>int slidervolumes[] = {0, 0, 0, 0, 0};
+
<br>int slidervolumes[] = {0, 0, 0, 0, 0};
 
<br>int lastButtonState[] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
 
<br>int lastButtonState[] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
  
 
<br><br>void setup() {
 
<br><br>void setup() {
  <br>// put your setup code here, to run once:
+
<br><span></span>// put your setup code here, to run once:
  <br>Serial.begin(9600);
+
<br><span></span>Serial.begin(9600);
  <br>Keyboard.begin();
+
<br><span></span>Keyboard.begin();
 
<br>}
 
<br>}
  
 
<br><br>void loop() {
 
<br><br>void loop() {
  
  <br><br>// incomplete code.
+
<br><br><span></span>// incomplete code.
  <br>//instructions: pass pin number, up key, down key, to read_slider, for example
+
<br><span></span>//instructions: pass pin number, up key, down key, to read_slider, for example
  <br>read_slider(0, 't', 'y');
+
<br><span></span>read_slider(0, 't', 'y');
  <br>read_slider(1, 'g', 'h');
+
<br><span></span>read_slider(1, 'g', 'h');
  <br>read_slider(2, 'b', 'n');
+
<br><span></span>read_slider(2, 'b', 'n');
  <br>read_slider(3, KEY_DOWN_ARROW, KEY_UP_ARROW);
+
<br><span></span>read_slider(3, KEY_DOWN_ARROW, KEY_UP_ARROW);
  <br>read_slider(4, KEY_RIGHT_ARROW, KEY_LEFT_ARROW);
+
<br><span></span>read_slider(4, KEY_RIGHT_ARROW, KEY_LEFT_ARROW);
  
  <br><br>//pass pin number, highkey, lowkey to control button
+
<br><br><span></span>//pass pin number, highkey, lowkey to control button
  <br>//for example
+
<br><span></span>//for example
  <br>control_button(2, 'q', 'w');
+
<br><span></span>control_button(2, 'q', 'w');
  <br>control_button(3, 'e', 'r');
+
<br><span></span>control_button(3, 'e', 'r');
  <br>control_button(4, 'a', 's');
+
<br><span></span>control_button(4, 'a', 's');
  <br>control_button(5, 'd', 'f');
+
<br><span></span>control_button(5, 'd', 'f');
  <br>control_button(6, 'z', 'x');
+
<br><span></span>control_button(6, 'z', 'x');
  <br>control_button(7, 'c', 'v');
+
<br><span></span>control_button(7, 'c', 'v');
  <br>control_button(8, 'o', 'p');
+
<br><span></span>control_button(8, 'o', 'p');
  
  <br><br>// this should all be done in loop
+
<br><br><span></span>// this should all be done in loop
 
<br>}  
 
<br>}  
  
 
<br><br>void read_slider(int slider_number, char upkey, char downkey) {
 
<br><br>void read_slider(int slider_number, char upkey, char downkey) {
  <br>int val = analogRead(slider_number);     //Read slider value from analog 0
+
<br><span></span>int val = analogRead(slider_number);<span></span><span></span><span></span>//Read slider value from analog 0
  <br>int newvolume = map(val, 0, 1023, 0, 27); //map slider value to [0,2]
+
<br><span></span>int newvolume = map(val, 0, 1023, 0, 27); //map slider value to [0,2]
  <br>if (newvolume != slidervolumes[slider_number]) {
+
<br><span></span>if (newvolume != slidervolumes[slider_number]) {
    <br>Serial.println("volume changed!");
+
<br><span></span><span></span>Serial.println("volume changed!");
    <br>control_slider(slider_number, slidervolumes[slider_number], newvolume, upkey, downkey);
+
<br><span></span><span></span>control_slider(slider_number, slidervolumes[slider_number], newvolume, upkey, downkey);
    <br>slidervolumes[slider_number] = newvolume; //change old value for comparison next time
+
<br><span></span><span></span>slidervolumes[slider_number] = newvolume; //change old value for comparison next time
  <br>}
+
<br><span></span>}
 
<br>}
 
<br>}
  
 
<br><br>void control_slider(int slider_number, int original_vol, int new_vol, char upkey, char downkey) {
 
<br><br>void control_slider(int slider_number, int original_vol, int new_vol, char upkey, char downkey) {
  <br>int keypress = original_vol - new_vol; //we get the num differences between the two tracks
+
<br><span></span>int keypress = original_vol - new_vol; //we get the num differences between the two tracks
  <br>if (keypress < 0) {
+
<br><span></span>if (keypress < 0) {
    <br>for (int i = 0; i < abs(keypress); i++) {
+
<br><span></span><span></span>for (int i = 0; i < abs(keypress); i++) {
      <br>Keyboard.write(downkey);
+
<br><span></span><span></span><span></span>Keyboard.write(downkey);
    <br>}
+
<br><span></span><span></span>}
  <br>} else {
+
<br><span></span>} else {
    <br>for (int i = 0; i < abs(keypress); i++) {
+
<br><span></span><span></span>for (int i = 0; i < abs(keypress); i++) {
      <br>Keyboard.write(upkey);
+
<br><span></span><span></span><span></span>Keyboard.write(upkey);
    <br>}
+
<br><span></span><span></span>}
  <br>}
+
<br><span></span>}
 
<br>}
 
<br>}
  
Line 1,079: Line 1,087:
  
 
<br><br>void control_button(int button_number, char highkey, char lowkey) {
 
<br><br>void control_button(int button_number, char highkey, char lowkey) {
  <br>int button_state = digitalRead(button_number);
+
<br><span></span>int button_state = digitalRead(button_number);
  
  <br><br>if (button_state != lastButtonState[button_number]) {
+
<br><br><span></span>if (button_state != lastButtonState[button_number]) {
    <br>// if the state has changed, increment the counter
+
<br><span></span><span></span>// if the state has changed, increment the counter
    <br>if (button_state == HIGH) {
+
<br><span></span><span></span>if (button_state == HIGH) {
      <br>Serial.println("1");
+
<br><span></span><span></span><span></span>Serial.println("1");
      <br>Keyboard.write(highkey);
+
<br><span></span><span></span><span></span>Keyboard.write(highkey);
      <br>delay(500);
+
<br><span></span><span></span><span></span>delay(500);
    <br>}
+
<br><span></span><span></span>}
    <br>else {
+
<br><span></span><span></span>else {
      <br>Keyboard.write(lowkey);
+
<br><span></span><span></span><span></span>Keyboard.write(lowkey);
    <br>}
+
<br><span></span><span></span>}
    <br>//no pressed = 0
+
<br><span></span><span></span>//no pressed = 0
    <br>//pressed = 1
+
<br><span></span><span></span>//pressed = 1
    <br>lastButtonState[button_number] = button_state;
+
<br><span></span><span></span>lastButtonState[button_number] = button_state;
  <br>}
+
<br><span></span>}
 
<br>}
 
<br>}
 
+
</font>
 +
</dl>
  
  
Line 1,103: Line 1,112:
  
  
<style type="text/css">
+
</html>
  #sponsors a img {
+
  opacity: 0.6;
+
  display: inline;
+
        width: 180px;
+
  }
+
  #sponsors a:hover img {
+
  opacity: 1.0;
+
  }
+
</style>
+
  
<div id="sponsors">
+
{{NYU_Shanghai/Sponsors}}
<a href="#">
+
  <img src="https://static.igem.org/mediawiki/2015/thumb/1/13/NYU_Shanghai_Logo.jpg/600px-NYU_Shanghai_Logo.jpg" />
+
  </a><a href="#">
+
  <img src="https://static.igem.org/mediawiki/2015/thumb/b/bb/NYU_Shanghai_Safegreen.jpg/631px-NYU_Shanghai_Safegreen.jpg" />
+
  </a><a href="#">
+
  <img src="https://static.igem.org/mediawiki/2015/thumb/a/a8/NYU_Shanghai_speedycloud.png/600px-NYU_Shanghai_speedycloud.png" />
+
  </a><a href="#">
+
  <img src="https://static.igem.org/mediawiki/2015/d/d9/NYU_Shanghai_Sangon2.png" />
+
  </a><a href="#">
+
  <img src="https://static.igem.org/mediawiki/2015/thumb/2/24/NYU_Shanghai_DF_Robot5.jpg/800px-NYU_Shanghai_DF_Robot5.jpg" />
+
  </a><a href="#">
+
  <img src="https://static.igem.org/mediawiki/2012/8/80/IDT_logo.png" />
+
  </a>
+
</div>
+
 
+
 
+
</html>
+

Latest revision as of 15:16, 18 September 2015

Code