Difference between revisions of "Team:NYU Shanghai/Code"
(23 intermediate revisions by 2 users not shown) | |||
Line 35: | Line 35: | ||
#sponsors a:hover { | #sponsors a:hover { | ||
color: goldenrod; | color: goldenrod; | ||
+ | } | ||
+ | #BMGText span, #ButtonText span { | ||
+ | color: white; | ||
+ | width: 10px; | ||
+ | padding: 0 15px; | ||
+ | display: inline; | ||
} | } | ||
</style> | </style> | ||
Line 41: | Line 47: | ||
function expandBMG() { | function expandBMG() { | ||
if (document.getElementById("BMG").className === "collapsed") { | if (document.getElementById("BMG").className === "collapsed") { | ||
− | document.getElementById("BMG").style.color = " | + | 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 52: | Line 58: | ||
function expandButton() { | function expandButton() { | ||
if (document.getElementById("Button").className === "collapsed") { | if (document.getElementById("Button").className === "collapsed") { | ||
− | document.getElementById("Button").style.color = " | + | 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 66: | Line 72: | ||
<h3>Code</h3> | <h3>Code</h3> | ||
</div> | </div> | ||
− | <div id="BMG"class="collapsed | + | <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 | + | <p><font face="helveticaNL"> |
<dl id="BMGText" style="display:none"> //main | <dl id="BMGText" style="display:none"> //main | ||
− | import processing.video.*; | + | //main |
− | import arb.soundcipher.*; | + | <br>import processing.video.*; |
− | import blobDetection.*; | + | <br>import arb.soundcipher.*; |
+ | <br>import blobDetection.*; | ||
− | <br>Capture video_sequencer, video_rack; | + | <br><br>Capture video_sequencer, video_rack; |
− | SoundCipher sc = new SoundCipher(this); | + | <br>SoundCipher sc = new SoundCipher(this); |
− | <br>int grid_size=20; | + | <br><br>int grid_size=20; |
− | int grid_num=16; | + | <br>int grid_num=16; |
− | int window_size; | + | <br>int window_size; |
− | int window_height; | + | <br>int window_height; |
− | int block_number=3; | + | <br>int block_number=3; |
<br><br>int interval=4; | <br><br>int interval=4; | ||
Line 96: | Line 103: | ||
<br>Sequencer_video sequencer_video; | <br>Sequencer_video sequencer_video; | ||
<br>Rack rack; | <br>Rack rack; | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | <br><br>void setup() { | |
+ | <br><span></span>volume[0]=0; | ||
+ | <br><span></span>volume[1]=0; | ||
+ | <br><span></span>volume[2]=0; | ||
+ | <br><span></span>window_size=displayWidth; | ||
+ | <br><span></span>window_height=displayHeight; | ||
− | + | <br><br><span></span>margin=(window_size-(grid_num*(grid_size+interval)+interval) | |
− | + | <br><span></span> *block_number)/(block_number+1); | |
− | + | ||
− | + | ||
− | + | ||
− | + | <br><span></span>size(window_size, window_height); | |
− | + | <br><br><span></span>//empty tracks | |
− | + | <br><span></span>for (int i=0; i < block_number; i++) { | |
− | + | <br><span></span><span></span>camera[i]=false; | |
− | + | <br><span></span><span></span>music[i]=false; | |
− | + | <br><span></span>} | |
− | + | <br><br><span></span>make_empty(); | |
− | + | ||
− | + | ||
− | + | ||
− | + | <br><br><span></span>String[] cameras = Capture.list(); | |
− | } | + | |
+ | <br><br><span></span>video_sequencer = new Capture(this, cameras[0]); | ||
+ | <br><span></span>video_sequencer.start(); | ||
+ | <br><span></span>sequencer_video=new Sequencer_video(video_sequencer, sc, grid_num, grid_size, interval); | ||
+ | |||
+ | <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><span></span>background(0); | |
− | + | <br><span></span>if (tube) { | |
− | + | <br><span></span><span></span>rack.get_color(); | |
− | + | <br><span></span><span></span>rack.draw_rack(); | |
− | + | <br><span></span><span></span>rack.glow(n); | |
− | + | <br><span></span><span></span>rack.play_sounds(n); | |
− | + | <br><span></span>} | |
− | + | <br><br><span></span>for (int i=0; i < block_number; i++) { | |
− | + | <br><span></span><span></span>sequencer[i].draw_grid(); | |
− | + | <br><span></span><span></span>if (camera[i]&&!music[i]) { | |
− | + | <br><span></span><span></span><span></span>sequencer_video.position(pos_x(i), margin); | |
− | + | <br><span></span><span></span><span></span>sequencer_video.grid_off(); | |
− | + | <br><span></span><span></span><span></span>sequencer_video.bd(); | |
− | + | <br><span></span><span></span><span></span>sequencer_video.bd_draw(n); | |
− | + | <br><span></span><span></span>} else if (camera[i]&&music[i]) { | |
− | + | <br><span></span><span></span><span></span>sequencer_video.position(pos_x(i), margin); | |
− | + | <br><span></span><span></span><span></span>sequencer_video.grid_on(); | |
− | + | <br><span></span><span></span><span></span>sequencer_video.bd(); | |
− | + | <br><span></span><span></span><span></span>sequencer_video.bd_draw(n); | |
− | + | <br><span></span><span></span>} else if (!camera[i]&&music[i]) { | |
− | + | <br><span></span><span></span><span></span>sequencer[i].set_volume(volume[i]); | |
− | + | <br><span></span><span></span><span></span>sequencer[i].play_sounds(n); | |
− | + | <br><span></span><span></span><span></span>sequencer[i].glow(n); | |
− | + | <br><span></span><span></span>} | |
− | + | <br><span></span>} | |
− | + | <br><br><span></span>n++; | |
− | + | <br><span></span>if (n>=grid_num) { | |
− | + | <br><span></span><span></span>n=0; | |
− | + | <br><span></span>} | |
<br>} | <br>} | ||
<br><br>void keyPressed() { | <br><br>void keyPressed() { | ||
− | + | <br><span></span>//track 1 | |
− | + | <br><span></span>if (key=='q'||key=='Q') { | |
− | + | <br><span></span><span></span>if (camera[0]==false &&camera[1]==false &&camera[2]==false) { | |
− | + | <br><span></span><span></span><span></span>camera[0]=true; | |
− | + | <br><span></span><span></span>} | |
− | + | <br><span></span>} else if (key=='w'||key=='W') { | |
− | + | <br><span></span><span></span>camera[0]=false; | |
− | + | <br><span></span><span></span>if (music[0]) { | |
− | + | <br><span></span><span></span><span></span>sequencer[0].get_sequence(sequencer_video.sequence()); | |
− | + | <br><span></span><span></span><span></span>sequencer[0].get_color(sequencer_video.grid_color()); | |
− | + | <br><span></span><span></span>} | |
− | + | <br><span></span>} else if (key=='e'||key=='E') { | |
− | + | <br><span></span><span></span>music[0]=true; | |
− | + | <br><span></span>} else if (key=='r'||key=='R') { | |
− | + | <br><span></span><span></span>music[0]=false; | |
− | + | <br><span></span><span></span>sequencer[0].delete(); | |
− | + | <br><span></span>} else if (key=='t'||key=='T') { | |
− | + | <br><span></span><span></span>if (music[0]) { | |
− | + | <br><br><span></span><span></span><span></span>if (camera[0]) { | |
− | + | <br><span></span><span></span><span></span><span></span>sequencer_video.set_volume(volume[0]); | |
− | + | <br><span></span><span></span><span></span>} else { | |
− | + | <br><span></span><span></span><span></span><span></span>sequencer[0].set_volume(volume[0]); | |
− | + | <br><span></span><span></span><span></span>} | |
− | + | <br><span></span><span></span>} | |
− | + | <br><span></span>} else if (key=='y'||key=='Y') { | |
− | + | <br><span></span><span></span>if (music[0]) { | |
− | + | <br><span></span><span></span><span></span>volume[0]=constrain(volume[0]+5, 0, 127); | |
− | + | <br><span></span><span></span><span></span>if (camera[0]) { | |
− | + | <br><span></span><span></span><span></span><span></span>.set_volume(volume[0]); | |
− | + | <br><span></span><span></span><span></span>} else { | |
− | + | <br><span></span><span></span><span></span><span></span>sequencer[0].set_volume(volume[0]); | |
− | + | <br><span></span><span></span><span></span>} | |
− | + | <br><span></span><span></span>} | |
− | + | <br><span></span>} | |
− | + | <br><span></span>//track 2 | |
− | + | <br><span></span>else if (key=='a'||key=='A') { | |
− | + | <br><span></span><span></span>if (camera[0]==false &&camera[1]==false &&camera[2]==false) { | |
− | + | <br><span></span><span></span><span></span>camera[1]=true; | |
− | + | <br><span></span><span></span>} | |
− | + | <br><span></span>} else if (key=='s'||key=='S') { | |
− | + | <br><span></span><span></span>camera[1]=false; | |
− | + | <br><span></span><span></span>if (music[1]) { | |
− | + | <br><span></span><span></span><span></span>sequencer[1].get_sequence(sequencer_video.sequence()); | |
− | + | <br><span></span><span></span><span></span>sequencer[1].get_color(sequencer_video.grid_color()); | |
− | + | <br><span></span><span></span>} | |
− | + | <br><span></span>} else if (key=='d'||key=='D') { | |
− | + | <br><span></span><span></span>music[1]=true; | |
− | + | <br><span></span>} else if (key=='f'||key=='F') { | |
− | + | <br><span></span><span></span>music[1]=false; | |
− | + | <br><span></span><span></span>sequencer[1].delete(); | |
− | + | <br><span></span>} else if (key=='g'||key=='G') { | |
− | + | <br><span></span><span></span>if (music[1]) { | |
− | + | <br><span></span><span></span><span></span>volume[1]=constrain(volume[1]-5, 0, 127); | |
− | + | <br><span></span><span></span><span></span>if (camera[1]) { | |
− | + | <br><span></span><span></span><span></span><span></span>sequencer_video.set_volume(volume[1]); | |
− | + | <br><span></span><span></span><span></span>} else { | |
− | + | <br><span></span><span></span><span></span><span></span>sequencer[1].set_volume(volume[1]); | |
− | + | <br><span></span><span></span><span></span>} | |
− | + | <br><span></span><span></span>} | |
− | + | <br><span></span>} else if (key=='h'||key=='H') { | |
− | + | <br><span></span><span></span>if (music[1]) { | |
− | + | <br><span></span><span></span><span></span>volume[1]=constrain(volume[1]+5, 0, 127); | |
− | + | <br><span></span><span></span><span></span>if (camera[1]) { | |
− | + | <br><span></span><span></span><span></span><span></span>sequencer_video.set_volume(volume[1]); | |
− | + | <br><span></span><span></span><span></span>} else { | |
− | + | <br><span></span><span></span><span></span><span></span>sequencer[1].set_volume(volume[1]); | |
− | + | <br><span></span><span></span><span></span>} | |
− | + | <br>}<span></span><span></span> | |
− | + | <br><span></span>} | |
− | + | <br><span></span>//track 3 | |
− | + | <br><span></span>else if (key=='z'||key=='Z') { | |
− | + | <br><span></span><span></span>if (camera[0]==false &&camera[1]==false &&camera[2]==false) { | |
− | + | <br><span></span><span></span><span></span>camera[2]=true; | |
− | + | <br><span></span><span></span>} | |
− | + | <br><span></span>} else if (key=='x'||key=='X') { | |
− | + | <br><span></span><span></span>camera[2]=false; | |
− | + | <br><span></span><span></span>if (music[2]) { | |
− | + | <br><span></span><span></span><span></span>sequencer[2].get_sequence(sequencer_video.sequence()); | |
− | + | <br><span></span><span></span><span></span>sequencer[2].get_color(sequencer_video.grid_color()); | |
− | + | <br><span></span><span></span>} | |
− | + | <br><span></span>} else if (key=='c'||key=='C') { | |
− | + | <br><span></span><span></span>music[2]=true; | |
− | + | <br><span></span>} else if (key=='v'||key=='V') { | |
− | + | <br><span></span><span></span>music[2]=false; | |
− | + | <br><span></span><span></span>sequencer[2].delete(); | |
− | + | <br><span></span>} else if (key=='b'||key=='B') { | |
− | + | <br><span></span><span></span>if (music[2]) { | |
− | + | <br><span></span><span></span><span></span>volume[2]=constrain(volume[2]-5, 0, 127); | |
− | + | <br><span></span><span></span><span></span>if (camera[2]) { | |
− | + | <br><span></span><span></span><span></span><span></span>sequencer_video.set_volume(volume[2]); | |
− | + | <br><span></span><span></span><span></span>} else { | |
− | + | <br><span></span><span></span><span></span><span></span>sequencer[2].set_volume(volume[2]); | |
− | + | <br><span></span><span></span><span></span>} | |
− | + | <br><span></span><span></span>} | |
− | + | <br><span></span>} else if (key=='n'||key=='N') { | |
− | + | <br><span></span><span></span>if (music[2]) { | |
− | + | <br><span></span><span></span><span></span>volume[2]=constrain(volume[2]+5, 0, 127); | |
− | + | <br><span></span><span></span><span></span>if (camera[2]) { | |
− | + | <br><span></span><span></span><span></span><span></span>sequencer_video.set_volume(volume[2]); | |
− | + | <br><span></span><span></span><span></span>} else { | |
− | + | <br><span></span><span></span><span></span><span></span>sequencer[2].set_volume(volume[2]); | |
− | + | <br><span></span><span></span><span></span>} | |
− | + | <br><span></span><span></span>} | |
− | + | <br><span></span>} else if (key=='o'||key=='O') { | |
− | + | <br><span></span><span></span>tube=true; | |
− | + | <br><span></span>} else if (key=='p'||key=='P') { | |
− | + | <br><span></span><span></span>tube=false; | |
− | + | <br><span></span>} else if (key==CODED) { | |
− | + | <br><span></span><span></span>if (keyCode==LEFT) { | |
− | + | <br><span></span><span></span><span></span>sequencer_video.threshold_down(); | |
− | + | <br><span></span><span></span>} else if (keyCode==RIGHT) { | |
− | + | <br><span></span><span></span><span></span>sequencer_video.threshold_up(); | |
− | + | <br><span></span><span></span>} else if (keyCode==UP) { | |
− | + | <br><span></span><span></span><span></span>rack.volume_up(); | |
− | + | <br><span></span><span></span>} else if (keyCode==DOWN) { | |
− | + | <br><span></span><span></span><span></span>rack.volume_down(); | |
− | + | <br><span></span><span></span>} | |
− | + | <br><span></span>} | |
<br>} | <br>} | ||
<br><br>void make_empty() { | <br><br>void make_empty() { | ||
− | + | <br><span></span>for (int i=0; i < block_number; i++) { | |
− | + | <br><span></span><span></span>int x= pos_x(i); | |
− | + | <br><span></span><span></span>int y=margin; | |
− | + | <br><span></span><span></span>sequencer[i]=new Sequencer(sc, grid_num, grid_size, interval, x, y); | |
− | + | <br><span></span>} | |
<br>} | <br>} | ||
<br><br>int pos_x(int i) { | <br><br>int pos_x(int i) { | ||
− | + | <br><span></span>int x=margin+(grid_num*(grid_size+interval)+interval+margin)*i; | |
− | + | <br><span></span>return x; | |
<br>} | <br>} | ||
<br><br>//tube rack | <br><br>//tube rack | ||
<br>class Rack { | <br>class Rack { | ||
− | + | <br><span></span>Capture video; | |
− | + | <br><span></span>int tube_number=8; | |
− | + | <br><span></span>int space_height; | |
− | + | <br><span></span>float[][] colors; | |
− | + | <br><span></span>SoundCipher sc; | |
− | + | <br><span></span>int white=150; | |
− | + | <br><span></span>float bright=1.5; | |
− | + | <br><span></span>int volume=100; | |
− | + | <br><span></span>int rack_width; | |
− | + | <br><span></span>int rack_height; | |
− | + | <br><span></span>int window_size; | |
− | + | <br><span></span>int window_height; | |
− | + | <br><span></span>int tube_height; | |
− | + | <br><span></span>int tube_width; | |
− | + | <br><span></span>int rack_x; | |
− | + | <br><span></span>int rack_y; | |
− | + | <br><span></span>int margin; | |
− | + | <br><br><span></span>Rack(Capture _video, SoundCipher _sc, int _window_size, | |
− | + | <br><span></span>int _window_height, int _space_height) { | |
− | + | <br><span></span><span></span>video=_video; | |
− | + | <br><span></span><span></span>window_size=_window_size; | |
− | + | <br><span></span><span></span>window_height=_window_height; | |
− | + | <br><span></span><span></span>space_height=_space_height; | |
− | + | <br><span></span><span></span>sc=_sc; | |
− | + | <br><span></span><span></span>rack_width=int(window_size*0.75); | |
− | + | <br><span></span><span></span>rack_height=space_height/2; | |
− | + | <br><span></span><span></span>tube_height=int(space_height*0.6); | |
− | + | <br><span></span><span></span>tube_width=int(rack_width/(tube_number*3)); | |
− | + | <br><span></span><span></span>rack_x=(window_size-rack_width)/2; | |
− | + | <br><span></span><span></span>rack_y=int(space_height*0.3); | |
− | + | <br><span></span><span></span>margin=(rack_width-tube_number*tube_width)/(tube_number+1); | |
− | + | <br><span></span>} | |
− | + | <br><br><span></span>void play(int n) { | |
− | + | <br><span></span><span></span>get_color(); | |
− | + | <br><span></span><span></span>draw_rack(); | |
− | + | <br><span></span><span></span>glow(n); | |
− | + | <br><span></span><span></span>play_sounds(n); | |
− | + | <br><span></span>} | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | <br><br><span></span>void get_color() { | |
− | + | <br><span></span><span></span>if (video.available()) { | |
− | + | <br><span></span><span></span><span></span>video.read(); | |
− | + | <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><span></span><span></span><span></span><span></span>// Where are we, pixel-wise? | |
− | + | <br><span></span><span></span><span></span><span></span>int x = int(width*loc_x[i]) ; | |
− | + | <br><br><span></span><span></span><span></span><span></span>int y = int(video.height*0.7); | |
− | + | <br><span></span><span></span><span></span><span></span>int loc = x + y*video.width; | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | <br><br><span></span><span></span><span></span><span></span>colors[i][0] = red(video.pixels[loc]); | |
− | + | <br><span></span><span></span><span></span><span></span>colors[i][1]= green(video.pixels[loc]); | |
− | + | <br><span></span><span></span><span></span><span></span>colors[i][2]= blue(video.pixels[loc]); | |
− | + | <br><span></span><span></span><span></span>} | |
− | + | <br><span></span><span></span>} | |
− | + | <br><span></span>} | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | <br><br><span></span>void draw_rack() { | |
− | + | <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>noFill(); | |
− | + | <br><span></span><span></span><span></span>stroke(255); | |
− | + | <br><span></span><span></span><span></span>strokeWeight(3); | |
− | + | <br><span></span><span></span><span></span>rect(rack_x, rack_y, | |
− | + | <br><span></span><span></span><span></span>rack_width, rack_height, rack_height/10); | |
− | + | <br><span></span><span></span><span></span>pushMatrix(); | |
− | + | <br><span></span><span></span><span></span>translate(rack_x, rack_y); | |
− | + | <br><span></span><span></span><span></span>for (int i = 0; i < tube_number; i++) { | |
− | + | <br><span></span><span></span><span></span><span></span>pushMatrix(); | |
− | + | <br><span></span><span></span><span></span><span></span>translate(margin*(i+1)+tube_width*i, -rack_y*0.6); | |
− | + | <br><span></span><span></span><span></span><span></span>if ((colors[i][0]+colors[i][1]+colors[i][2])/3 < white) { | |
− | + | <br><span></span><span></span><span></span><span></span><span></span>noStroke(); | |
− | + | <br><span></span><span></span><span></span><span></span><span></span>fill(constrain(colors[i][0]*1.1,0,255), | |
− | + | <br><span></span><span></span><span></span><span></span><span></span>constrain(colors[i][1]*1.1,0,255), | |
− | + | <br><span></span><span></span><span></span><span></span><span></span>constrain(colors[i][2]*1.1,0,255)); | |
− | + | <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>} 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><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><span></span>popMatrix(); | |
− | + | <br><span></span><span></span>} | |
− | + | <br><span></span>} | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | <br><br><span></span>void glow(int n) { | |
− | + | <br><span></span><span></span>n=n%tube_number; | |
− | + | <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><span></span><span></span>void play_sounds(int n) { | |
− | + | <br><span></span><span></span><span></span>n=n%tube_number; | |
− | + | <br><span></span><span></span><span></span>if (colors!=null) { | |
− | + | <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><span></span>boolean[] empty; | |
− | + | <br><span></span>float[] rgb_list; | |
− | + | <br><span></span>int grid_num; | |
− | + | <br><span></span>int grid_size; | |
− | + | <br><span></span>int interval; | |
− | + | <br><br><span></span>SoundCipher sc; | |
− | + | <br><span></span>boolean select=false; | |
− | + | <br><span></span>int a, b; | |
− | + | <br><span></span>int volume=0; | |
− | + | <br><span></span>boolean on=true; | |
− | + | <br><span></span>float red=0; | |
− | + | <br><span></span>float green=0; | |
− | + | <br><span></span>float blue=0; | |
− | + | <br><span></span>int[] notes = { | |
− | + | <br><span></span><span></span>96, 93, 91, 89, 86, 84, 81, 79, 77, 74, 72, 69, 67, 65, 62, 60 | |
− | + | <br><span></span>}; | |
− | + | <br><span></span>boolean[] sequence; | |
− | + | <br><br><span></span>Sequencer(SoundCipher _sc, | |
− | + | <br><span></span>int _grid_num, int _grid_size, int _interval, int _a, int _b) { | |
− | + | <br><span></span><span></span>sc=_sc; | |
− | + | <br><span></span><span></span>grid_num=_grid_num; | |
− | + | <br><span></span><span></span>grid_size=_grid_size; | |
− | + | <br><span></span><span></span>interval=_interval; | |
− | + | <br><br><span></span><span></span>a=_a; | |
− | + | <br><span></span><span></span>b=_b; | |
− | + | <br><br><span></span><span></span>sequence=new boolean[grid_num*grid_num]; | |
− | + | <br><span></span><span></span>for (int i=0; i < sequence.length; i++) { | |
− | + | <br><span></span><span></span><span></span>sequence[i]=false; | |
− | + | <br><span></span><span></span>} | |
− | + | <br><br><span></span><span></span>empty=new boolean[grid_num*grid_num]; | |
− | + | <br><span></span><span></span>for (int i=0; i < sequence.length; i++) { | |
− | + | <br><span></span><span></span><span></span>empty[i]=false; | |
− | + | <br><span></span><span></span>} | |
− | + | <br><span></span>} | |
− | + | <br><br><span></span>void get_sequence(boolean[] _sequence) { | |
− | + | <br><span></span><span></span>sequence=_sequence; | |
− | + | <br><span></span>} | |
− | + | <br><br><span></span>void get_color(float[] _rgb_list) { | |
− | + | <br><span></span><span></span>rgb_list=_rgb_list; | |
− | + | <br><span></span><span></span>red=rgb_list[0]; | |
− | + | <br><span></span><span></span>green=rgb_list[1]; | |
− | + | <br><span></span><span></span>blue=rgb_list[2]; | |
− | + | <br><span></span>} | |
− | + | <br><br><span></span>void draw_grid() { | |
− | + | <br><span></span><span></span>pushMatrix(); | |
− | + | <br><span></span><span></span>translate(a, b); | |
− | + | <br><span></span><span></span>rectMode(CORNER); | |
− | + | <br><span></span><span></span>int x=0; | |
− | + | <br><span></span><span></span>int y=0; | |
− | + | <br><span></span><span></span> | |
− | + | <br><br><span></span><span></span>//black background | |
− | + | <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> | |
− | + | <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><span></span><span></span><span></span>if (sequence[i]) { | |
− | + | <br><span></span><span></span><span></span><span></span>fill(red, green, blue); | |
− | + | <br><span></span><span></span><span></span>} else { | |
− | + | <br><span></span><span></span><span></span><span></span>if (select){fill(100);} | |
− | + | <br><span></span><span></span><span></span><span></span>else {fill(70);} | |
− | + | <br><span></span><span></span><span></span>} | |
− | + | <br><span></span><span></span><span></span>rect(x, y, grid_size, grid_size); | |
− | + | <br><span></span><span></span>} | |
− | |||
− | |||
− | + | <br><br><span></span><span></span>popMatrix(); | |
− | + | <br><span></span>} | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
+ | <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><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><span></span><span></span>for (int i=0; i < grid_num; i++) { | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | <br><br><span></span><span></span><span></span>// if the data text file has a "1" play note | |
− | + | <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><br><span></span><span></span>} | |
− | + | <br><span></span><span></span>sc.instrument(instrument()); | |
− | + | <br><span></span><span></span>sc.playChord(noteVals, volume, 0.25); | |
+ | <br><span></span>} | ||
− | + | <br><br><span></span>int instrument(){ | |
− | + | <br><span></span><span></span>int h=int(hue(color(red,green,blue))%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>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><span></span>Capture video; | |
− | + | <br><span></span>SoundCipher sc; | |
− | + | <br><span></span>BlobDetection theBlobDetection; | |
− | + | <br><span></span>boolean newFrame=false; | |
− | + | <br><span></span>PImage img; | |
− | + | <br><span></span>int a, b; | |
− | + | <br><span></span>int grid_size; | |
− | + | <br><span></span>int grid_num; | |
− | + | <br><span></span>int interval; | |
− | + | <br><span></span>int block_size; | |
− | + | <br><span></span>int volume=0; | |
− | + | <br><span></span>float[][] blob_color; | |
− | + | <br><span></span>float[] avg_color=new float[3]; | |
− | + | <br><span></span>float[][] blobs; | |
− | + | <br><span></span>float[][][] raw_color; | |
− | + | <br><span></span>float threshold=0.5; | |
− | + | <br><span></span>boolean draw_grid=false; | |
− | + | <br><span></span>boolean[] sequence; | |
− | + | <br><span></span>int[] notes = { | |
− | + | <br><span></span><span></span>, 93, 91, 89, 86, 84, 81, 79, 77, 74, 72, 69, 67, 65, 62, 60 | |
− | + | <br><span></span>}; | |
− | + | <br><span></span>int radius=180; | |
+ | |||
+ | <br><br><span></span>Sequencer_video(Capture _video, SoundCipher _sc, int _grid_num, | ||
+ | <br><span></span>int _grid_size,int _interval) { | ||
+ | <br><span></span><span></span>colorMode(RGB, 255, 255, 255, 100); | ||
+ | <br><span></span><span></span>video=_video; | ||
+ | <br><span></span><span></span>sc=_sc; | ||
+ | <br><span></span><span></span>grid_num=_grid_num; | ||
+ | <br><span></span><span></span>grid_size=_grid_size; | ||
+ | <br><span></span><span></span>interval=_interval; | ||
+ | <br><span></span><span></span>block_size=(interval+grid_size)*grid_num; | ||
+ | |||
+ | <br><span></span><span></span>sequence=new boolean[grid_num*grid_num]; | ||
+ | <br><span></span><span></span>img = new PImage(grid_num*(grid_size+interval)-interval, | ||
+ | <br><span></span><span></span>grid_num*(grid_size+interval)-interval); | ||
+ | <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><span></span>void threshold_up() { | ||
+ | <br><span></span><span></span>threshold=constrain(threshold+0.02, 0, 1); | ||
+ | <br><span></span><span></span>println(threshold); | ||
+ | <br><span></span>} | ||
+ | |||
+ | <br><br><span></span>void threshold_down() { | ||
+ | <br><span></span><span></span>threshold=constrain(threshold-0.02, 0, 1); | ||
+ | <br><span></span><span></span>println(threshold); | ||
+ | <br><span></span>} | ||
+ | |||
+ | <br><br><span></span>void position(int _a, int _b) { | ||
+ | <br><span></span><span></span>a=_a; | ||
+ | <br><span></span><span></span>b=_b; | ||
+ | <br><span></span>} | ||
− | + | <br><br><span></span>void grid_on() { | |
− | + | <br><span></span><span></span>draw_grid=true; | |
− | + | <br><span></span>} | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | <br><br><span></span>void grid_off(){ | |
− | + | <br><span></span><span></span>draw_grid=false; | |
− | + | <br><span></span>} | |
− | + | ||
− | + | <br><br><span></span>void bd() { | |
− | + | <br><span></span><span></span>if (video.available()) { | |
− | + | <br><span></span><span></span><span></span>theBlobDetection.setThreshold(threshold); | |
− | + | <br><span></span><span></span><span></span>video.read(); | |
+ | <br><span></span><span></span><span></span>img.copy(video, (video.width-video.height)/2, 0, video.height, | ||
+ | <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><span></span>void bd_draw(int n) { | |
− | + | <br><span></span><span></span>if (draw_grid) { | |
− | + | <br><span></span><span></span><span></span> | |
− | + | <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><span></span>void blob_color() { | |
− | + | <br><span></span><span></span>float red=0; | |
− | + | <br><span></span><span></span>float blue=0; | |
− | + | <br><span></span><span></span>float green=0; | |
− | + | <br><span></span><span></span>int total=theBlobDetection.getBlobNb (); | |
− | + | <br><span></span><span></span>for (int n=0; n < total; n++) { | |
− | + | ||
− | + | <br><br><span></span><span></span><span></span>//get the color | |
− | + | <br><br><br><span></span><span></span><span></span>blob_color=new float[total][3]; | |
− | + | <br><br><br><br><span></span><span></span><span></span>int centerX = int(blobs[n][0]+0.5*blobs[n][2]); | |
− | + | <br><span></span><span></span><span></span>int centerY = int(blobs[n][1]+0.5*blobs[n][3]); | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | <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><span></span><span></span><span></span>red+=blob_color[n][0]; | |
− | + | <br><span></span><span></span><span></span>green+=blob_color[n][1]; | |
− | + | <br><span></span><span></span><span></span>blue+=blob_color[n][2]; | |
− | + | ||
− | + | ||
− | + | ||
− | + | <br><span></span><span></span>} | |
− | + | <br><span></span><span></span>avg_color[0]=constrain(red/total*1.2,0,255); | |
− | + | <br><span></span><span></span>avg_color[1]=constrain(green/total*1.2,0,255); | |
− | + | <br><span></span><span></span>avg_color[2]=constrain(blue/total*1.2,0,255); | |
− | + | <br><span></span>} | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | <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><span></span><span></span>for (int n=0; n < theBlobDetection.getBlobNb (); n++) | |
+ | <br><span></span><span></span>{ | ||
+ | <br><span></span><span></span><span></span>b=theBlobDetection.getBlob(n); | ||
+ | <br><span></span><span></span><span></span>if (b!=null) | ||
+ | <br><span></span><span></span><span></span>{ | ||
+ | <br><span></span><span></span><span></span><span></span>// Edges | ||
+ | <br><span></span><span></span><span></span><span></span>if (drawEdges) | ||
+ | <br><span></span><span></span><span></span><span></span>{ | ||
+ | <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><span></span><span></span><span></span><span></span>// Blobs | |
− | + | <br><span></span><span></span><span></span><span></span>if (dist(block_size/2,block_size/2,b.xMin*block_size, | |
− | + | <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><span></span><span></span><span></span><span></span><span></span>rect( | |
− | + | <br><span></span><span></span><span></span><span></span><span></span>b.xMin*block_size, b.yMin*block_size, | |
− | + | <br><span></span><span></span><span></span><span></span><span></span>b.w*block_size, b.h*block_size | |
− | + | <br><span></span><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><br><span></span>} | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | <br><br><span></span>void fastblur(PImage img, int radius) | |
− | + | <br><span></span>{ | |
− | + | <br><span></span><span></span>if (radius < 1) { | |
− | + | <br><span></span><span></span><span></span>return; | |
− | + | <br><span></span><span></span>} | |
− | + | <br><span></span><span></span>int w=img.width; | |
− | + | <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><span></span><span></span>yw=yi=0; | |
− | + | <br><br><span></span><span></span>for (y=0; y < h; y++) { | |
− | + | <br><span></span><span></span><span></span>rsum=gsum=bsum=0; | |
− | + | <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><span></span><span></span><span></span><span></span>r[yi]=dv[rsum]; | |
− | + | <br><span></span><span></span><span></span><span></span>g[yi]=dv[gsum]; | |
− | + | <br><span></span><span></span><span></span><span></span>b[yi]=dv[bsum]; | |
− | + | <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><span></span><span></span><span></span><span></span>rsum+=((p1 & 0xff0000)-(p2 & 0xff0000))>>16; | |
− | + | <br><span></span><span></span><span></span><span></span>gsum+=((p1 & 0x00ff00)-(p2 & 0x00ff00))>>8; | |
− | + | <br><span></span><span></span><span></span><span></span>bsum+= (p1 & 0x0000ff)-(p2 & 0x0000ff); | |
− | + | <br><span></span><span></span><span></span><span></span>yi++; | |
− | + | <br><span></span><span></span><span></span>} | |
− | + | <br><span></span><span></span><span></span>yw+=w; | |
− | + | <br><span></span> } | |
− | + | <br><br><span></span><span></span>for (x=0; x<w; x++) { | |
− | + | <br><span></span><span></span><span></span>rsum=gsum=bsum=0; | |
− | + | <br><br><span></span><span></span><span></span>yp=-radius*w; | |
− | + | <br><span></span><span></span><span></span>for (i=-radius; i<=radius; i++) { | |
− | + | <br><span></span><span></span><span></span><span></span>yi=max(0, yp)+x; | |
− | + | <br><span></span><span></span><span></span><span></span>rsum+=r[yi]; | |
− | + | <br><span></span><span></span><span></span><span></span>gsum+=g[yi]; | |
− | + | <br><span></span><span></span><span></span><span></span>bsum+=b[yi]; | |
− | + | <br><span></span><span></span><span></span><span></span>yp+=w; | |
− | + | <br><span></span><span></span><span></span>} | |
− | + | <br><span></span><span></span><span></span>yi=x; | |
− | + | <br><span></span><span></span><span></span>for (y=0; y < h; y++) { | |
− | + | <br><span></span><span></span><span></span><span></span>pix[yi]=0xff000000 | (dv[rsum]<< 16) | (dv[gsum]<< 8) | dv[bsum]; | |
− | + | <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><span></span><span></span><span></span><span></span>\rsum+=r[p1]-r[p2]; | |
− | + | <br><span></span><span></span><span></span><span></span>gsum+=g[p1]-g[p2]; | |
− | + | <br><span></span><span></span><span></span><span></span>bsum+=b[p1]-b[p2]; | |
− | + | <br><br><span></span><span></span><span></span><span></span>yi+=w; | |
− | + | <br><span></span><span></span><span></span>} | |
− | + | <br><span></span><span></span>} | |
− | + | <br><span></span>} | |
− | + | <br><br><span></span>void save_blob() { | |
− | + | <br><br><span></span><span></span>Blob b; | |
− | + | <br><span></span><span></span>blobs=new float[theBlobDetection.getBlobNb ()][4]; | |
− | + | <br><span></span><span></span>for (int n=0; n < theBlobDetection.getBlobNb (); n++) | |
− | + | <br><span></span><span></span>{ | |
− | + | <br><span></span><span></span><span></span>b=theBlobDetection.getBlob(n); | |
− | + | <br><span></span><span></span><span></span>if (dist(block_size/2,block_size/2,b.xMin*block_size, | |
− | + | <br><span></span><span></span><span></span><span></span>b.yMin*block_size)< radius | |
− | + | <br><span></span><span></span><span></span>&&b.w*block_size>5&&b.w*block_size< 25&& | |
− | + | <br><span></span><span></span><span></span>b.h*block_size>5&&b.h*block_size< 25){ | |
− | + | <br><span></span><span></span><span></span>blobs[n][0]=b.xMin*block_size; | |
− | + | <br><span></span><span></span><span></span>blobs[n][1]=b.yMin*block_size; | |
− | + | <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><span></span>void convert() { | |
− | + | <br><span></span><span></span>int row, col, i; | |
− | + | <br><span></span><span></span>for (int n=0; n< sequence.length; n++) { | |
− | + | <br><span></span><span></span><span></span>sequence[n]=false; | |
− | + | <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><span></span>void draw_grid() { | |
− | + | <br><span></span><span></span>pushMatrix(); | |
− | + | <br><span></span><span></span>translate(a, b); | |
− | + | <br><span></span><span></span>rectMode(CORNER); | |
− | + | <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><span></span><span></span><span></span><span></span>noStroke(); | |
− | + | <span></span><span></span><span></span> | |
− | + | <br><br><span></span><span></span><span></span>if (sequence[i]) { | |
− | + | <br><span></span><span></span><span></span><span></span><br>fill(avg_color[0], avg_color[1], avg_color[2]); | |
− | + | <br><span></span><span></span><span></span>} else { | |
− | + | <br><span></span><span></span><span></span> fill(70); | |
− | + | <br><span></span><span></span><span></span>} | |
− | + | <br><span></span><span></span><span></span>rect(x, y, grid_size, grid_size); | |
− | + | <br><span></span><span></span>} | |
− | + | <br><span></span><span></span>popMatrix(); | |
− | + | <br><span></span><br>} | |
− | + | <br><br><span></span><br><br>void glow(int n) { | |
− | + | <br><span></span><span></span>pushMatrix(); | |
− | + | <br><span></span><span></span>translate(a, b); | |
− | + | <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> | + | <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,014: | 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 | + | <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 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><span></span>// put your setup code here, to run once: | |
− | + | <br><span></span>Serial.begin(9600); | |
− | + | <br><span></span>Keyboard.begin(); | |
<br>} | <br>} | ||
<br><br>void loop() { | <br><br>void loop() { | ||
− | + | <br><br><span></span>// incomplete code. | |
− | + | <br><span></span>//instructions: pass pin number, up key, down key, to read_slider, for example | |
− | + | <br><span></span>read_slider(0, 't', 'y'); | |
− | + | <br><span></span>read_slider(1, 'g', 'h'); | |
− | + | <br><span></span>read_slider(2, 'b', 'n'); | |
− | + | <br><span></span>read_slider(3, KEY_DOWN_ARROW, KEY_UP_ARROW); | |
− | + | <br><span></span>read_slider(4, KEY_RIGHT_ARROW, KEY_LEFT_ARROW); | |
− | + | <br><br><span></span>//pass pin number, highkey, lowkey to control button | |
− | + | <br><span></span>//for example | |
− | + | <br><span></span>control_button(2, 'q', 'w'); | |
− | + | <br><span></span>control_button(3, 'e', 'r'); | |
− | + | <br><span></span>control_button(4, 'a', 's'); | |
− | + | <br><span></span>control_button(5, 'd', 'f'); | |
− | + | <br><span></span>control_button(6, 'z', 'x'); | |
− | + | <br><span></span>control_button(7, 'c', 'v'); | |
− | + | <br><span></span>control_button(8, 'o', 'p'); | |
− | + | <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><span></span>int val = analogRead(slider_number);<span></span><span></span><span></span>//Read slider value from analog 0 | |
− | + | <br><span></span>int newvolume = map(val, 0, 1023, 0, 27); //map slider value to [0,2] | |
− | + | <br><span></span>if (newvolume != slidervolumes[slider_number]) { | |
− | + | <br><span></span><span></span>Serial.println("volume changed!"); | |
− | + | <br><span></span><span></span>control_slider(slider_number, slidervolumes[slider_number], newvolume, upkey, downkey); | |
− | + | <br><span></span><span></span>slidervolumes[slider_number] = newvolume; //change old value for comparison next time | |
− | + | <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><span></span>int keypress = original_vol - new_vol; //we get the num differences between the two tracks | |
− | + | <br><span></span>if (keypress < 0) { | |
− | + | <br><span></span><span></span>for (int i = 0; i < abs(keypress); i++) { | |
− | + | <br><span></span><span></span><span></span>Keyboard.write(downkey); | |
− | + | <br><span></span><span></span>} | |
− | + | <br><span></span>} else { | |
− | + | <br><span></span><span></span>for (int i = 0; i < abs(keypress); i++) { | |
− | + | <br><span></span><span></span><span></span>Keyboard.write(upkey); | |
− | + | <br><span></span><span></span>} | |
− | + | <br><span></span>} | |
<br>} | <br>} | ||
Line 1,081: | 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><span></span>int button_state = digitalRead(button_number); | |
− | + | <br><br><span></span>if (button_state != lastButtonState[button_number]) { | |
− | + | <br><span></span><span></span>// if the state has changed, increment the counter | |
− | + | <br><span></span><span></span>if (button_state == HIGH) { | |
− | + | <br><span></span><span></span><span></span>Serial.println("1"); | |
− | + | <br><span></span><span></span><span></span>Keyboard.write(highkey); | |
− | + | <br><span></span><span></span><span></span>delay(500); | |
− | + | <br><span></span><span></span>} | |
− | + | <br><span></span><span></span>else { | |
− | + | <br><span></span><span></span><span></span>Keyboard.write(lowkey); | |
− | + | <br><span></span><span></span>} | |
− | + | <br><span></span><span></span>//no pressed = 0 | |
− | + | <br><span></span><span></span>//pressed = 1 | |
− | + | <br><span></span><span></span>lastButtonState[button_number] = button_state; | |
− | + | <br><span></span>} | |
<br>} | <br>} | ||
</font> | </font> |
Latest revision as of 15:16, 18 September 2015