Difference between revisions of "Team:NYU Shanghai/Code"
(6 intermediate revisions by 2 users not shown) | |||
Line 543: | Line 543: | ||
<br><span></span><span></span> | <br><span></span><span></span> | ||
<br><br><span></span><span></span>//black background | <br><br><span></span><span></span>//black background | ||
− | <br><span></span><span></span | + | <br><span></span><span></span>noStroke(); |
− | <br><span></span><span></span | + | <br><span></span><span></span>fill(0); |
− | <br><span></span><span></span | + | <br><span></span><span></span>rect(-interval, -interval, (grid_size+interval)*grid_num+interval*2, |
− | <br><span></span><span></span | + | <br><span></span><span></span>(grid_size+interval)*grid_num+interval*2); |
<br><span></span><span></span> | <br><span></span><span></span> | ||
− | <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 | + | <br><span></span><span></span><span></span>x=(grid_size+interval)*(i%grid_num); |
− | <br><span></span><span></span><span></span | + | <br><span></span><span></span><span></span>y=(grid_size+interval)*(i/grid_num); |
− | <br><span></span><span></span><span></span | + | <br><span></span><span></span><span></span>if (sequence[i]) { |
− | <br><span></span><span></span><span></span><span></span | + | <br><span></span><span></span><span></span><span></span>fill(red, green, blue); |
− | <br><span></span><span></span><span></span | + | <br><span></span><span></span><span></span>} else { |
− | <br><span></span><span></span><span></span><span></span | + | <br><span></span><span></span><span></span><span></span>if (select){fill(100);} |
− | <br><span></span><span></span><span></span><span></span | + | <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>} |
− | <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>} |
<br><br><span></span><span></span>popMatrix(); | <br><br><span></span><span></span>popMatrix(); | ||
− | < | + | <br><span></span>} |
− | < | + | <br><br><span></span>void glow(int n) { |
− | <span></span><span></span | + | <br><span></span><span></span>pushMatrix(); |
− | <span></span><span></span | + | <br><span></span><span></span>translate(a, b); |
− | < | + | <br><br><span></span><span></span>rectMode(CORNER); |
− | <span></span><span></span | + | <br><span></span><span></span>for (int m=0; m < grid_num; m++) { |
− | <span> </span><span></span><span></span | + | <br><span></span><span></span><span></span>if (sequence[m*grid_num+n]) { |
− | <span></span><span></span><span></span><span></span | + | <br><span></span><span></span><span></span><span></span>for (int p=-1; p < 2; p++) { |
− | <span></span><span></span><span></span><span></span><span></span | + | <br><span></span><span></span><span></span><span></span><span></span>for (int q=-1; q < 2; q++) { |
− | <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 (n+p>=0&&n+p < grid_num&&m+q>=0&& |
− | <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><span></span><span></span>m+q < grid_num) { |
− | <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><span></span><span></span>noStroke(); |
− | <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><span></span><span></span>fill(255, 255, 255, 20); |
− | <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><span></span>rect((n+p)*(interval+grid_size), (m+q)*(interval+grid_size), |
− | <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><span></span><span></span>grid_size, grid_size); |
− | <span></span><span></span><span></span><span></span><span></span><span></span><br> | + | <br><span></span><span></span><span></span><span></span><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><span></span>if (p==0&&q==0){ |
− | <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><span></span><span></span>fill(red, green, blue); |
− | <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><span></span><span></span>rect(n*(interval+grid_size)-interval/2, m*(interval+grid_size)-interval/2, |
− | <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><span></span><span></span>grid_size+interval, grid_size+interval); |
− | <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><span></span><span></span>fill(255, 255, 255, 30); |
− | <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><span></span><span></span>rect(n*(interval+grid_size)-interval/2, m*(interval+grid_size)-interval/2, |
− | <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><span></span><span></span>grid_size+interval, grid_size+interval); |
− | <span></span><span></span><span></span><span></span><span></span><span></span><br> | + | <br><span></span><span></span><span></span><span></span><span></span><span></span>} |
− | <span></span><span></span><span></span><span></span><span></span><br> | + | <br><span></span><span></span><span></span><span></span><span></span>} |
− | <span></span><span></span><span></span><span></span><br> | + | <br><span></span><span></span><span></span><span></span>} |
− | <span></span><span></span><span></span><br> | + | <br><span></span><span></span><span></span>} |
− | <span></span><span></span><br> | + | <br><span></span><span></span>} |
− | <span></span><span></span | + | <br><span></span><span></span>popMatrix(); |
− | <span></span | + | <br><span></span>} |
− | < | + | <br><br><span></span>void play_sounds(int n) { |
− | <span></span><span></span | + | <br><span></span><span></span>float noteVal; |
− | <span></span><span></span | + | <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 |
− | <span></span><span></span><span></span | + | <br><span></span><span></span><span></span>if (sequence[i*grid_num+n]) { |
− | <span></span><span></span><span></span><span></span | + | <br><span></span><span></span><span></span><span></span>noteVal = float(notes[i]); |
− | <span></span><span></span><span></span><span></span | + | <br><span></span><span></span><span></span><span></span>noteVals=append(noteVals, noteVal); |
− | + | <br><span></span><span></span><span></span>} | |
− | <span></span><span></span><span></span | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | <span></span>< | + | <br><br><span></span><span></span>} |
− | <span></span><span></span><br> | + | <br><span></span><span></span>sc.instrument(instrument()); |
− | <span></span><br>} | + | <br><span></span><span></span>sc.playChord(noteVals, volume, 0.25); |
+ | <br><span></span>} | ||
− | <span></span><br><br> | + | <br><br><span></span>int instrument(){ |
− | <span></span><span></span><br> | + | <br><span></span><span></span>int h=int(hue(color(red,green,blue))%8); |
− | <span></span><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>} | ||
− | <span></span><br><br>void | + | <br><br><span></span>void select(boolean _select) { |
− | <span></span><span></span><br>sequence=empty; | + | <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 { | ||
− | <span></span | + | <br><span></span>Capture video; |
− | <span></span | + | <br><span></span>SoundCipher sc; |
− | <span></span | + | <br><span></span>BlobDetection theBlobDetection; |
− | <span></span | + | <br><span></span>boolean newFrame=false; |
− | <span></span | + | <br><span></span>PImage img; |
− | <span></span | + | <br><span></span>int a, b; |
− | <span></span | + | <br><span></span>int grid_size; |
− | <span></span | + | <br><span></span>int grid_num; |
− | <span></span | + | <br><span></span>int interval; |
− | <span></span | + | <br><span></span>int block_size; |
− | <span></span | + | <br><span></span>int volume=0; |
− | <span></span | + | <br><span></span>float[][] blob_color; |
− | < | + | <br><span></span>float[] avg_color=new float[3]; |
− | <span></span | + | <br><span></span>float[][] blobs; |
− | < | + | <br><span></span>float[][][] raw_color; |
− | <span></span | + | <br><span></span>float threshold=0.5; |
− | <span></span | + | <br><span></span>boolean draw_grid=false; |
− | < | + | <br><span></span>boolean[] sequence; |
− | <span></span | + | <br><span></span>int[] notes = { |
− | <span></span><span></span | + | <br><span></span><span></span>, 93, 91, 89, 86, 84, 81, 79, 77, 74, 72, 69, 67, 65, 62, 60 |
− | <span></span | + | <br><span></span>}; |
− | < | + | <br><span></span>int radius=180; |
− | < | + | <br><br><span></span>Sequencer_video(Capture _video, SoundCipher _sc, int _grid_num, |
− | <span></span | + | <br><span></span>int _grid_size,int _interval) { |
− | <span></span><span></span | + | <br><span></span><span></span>colorMode(RGB, 255, 255, 255, 100); |
− | <span></span><span></span | + | <br><span></span><span></span>video=_video; |
− | <span></span><span></span | + | <br><span></span><span></span>sc=_sc; |
− | <span></span><span></span | + | <br><span></span><span></span>grid_num=_grid_num; |
− | <span></span><span></span | + | <br><span></span><span></span>grid_size=_grid_size; |
− | <span></span><span></span | + | <br><span></span><span></span>interval=_interval; |
− | <span></span><span></span | + | <br><span></span><span></span>block_size=(interval+grid_size)*grid_num; |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | <span></span>< | + | <br><span></span><span></span>sequence=new boolean[grid_num*grid_num]; |
− | <span></span><span></span><br> | + | <br><span></span><span></span>img = new PImage(grid_num*(grid_size+interval)-interval, |
− | <span></span><span></span> | + | <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() { |
− | <span></span><span></span | + | <br><span></span><span></span>threshold=constrain(threshold+0.02, 0, 1); |
− | <span></span><span></span | + | <br><span></span><span></span>println(threshold); |
− | < | + | <br><span></span>} |
− | < | + | <br><br><span></span>void threshold_down() { |
− | <span></span><span></span> | + | <br><span></span><span></span>threshold=constrain(threshold-0.02, 0, 1); |
− | <span></span><span></span><br> | + | <br><span></span><span></span>println(threshold); |
− | <span></span | + | <br><span></span>} |
− | < | + | <br><br><span></span>void position(int _a, int _b) { |
− | + | <br><span></span><span></span>a=_a; | |
− | <span></span> | + | <br><span></span><span></span>b=_b; |
− | <span></span> | + | <br><span></span>} |
− | + | ||
− | <span></span><span></span> | + | |
− | < | + | |
− | + | <br><br><span></span>void grid_on() { | |
− | <span></span> | + | <br><span></span><span></span>draw_grid=true; |
− | + | <br><span></span>} | |
− | <span></span><span></span> | + | |
− | + | ||
− | <span></span | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | < | + | <br><br><span></span>void grid_off(){ |
− | <span></span> | + | <br><span></span><span></span>draw_grid=false; |
− | < | + | <br><span></span>} |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | <span></span | + | |
− | <span></span><br>< | + | <br><br><span></span>void bd() { |
− | <span></span><span></span><br> | + | <br><span></span><span></span>if (video.available()) { |
− | <span></span><span></span><br> | + | <br><span></span><span></span><span></span>theBlobDetection.setThreshold(threshold); |
− | <span></span><span></span>< | + | <br><span></span><span></span><span></span>video.read(); |
− | <span></span><span></span><br> | + | <br><span></span><span></span><span></span>img.copy(video, (video.width-video.height)/2, 0, video.height, |
− | <span></span><span></span>< | + | <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>} | ||
− | <span></span><span></span><span></span><br>< | + | <br><span></span>void bd_draw(int n) { |
− | <span></span><span></span><span></span>< | + | <br><span></span><span></span>if (draw_grid) { |
− | <span></span><span></span><span></span><br>< | + | <br><span></span><span></span><span></span> |
− | <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() { | |
− | <span></span> | + | <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 (); |
− | <span></span><span></span> | + | <br><span></span><span></span>for (int n=0; n < total; n++) { |
− | < | + | |
− | < | + | |
− | + | ||
− | <span></span><span></span>< | + | <br><br><span></span><span></span><span></span>//get the color |
− | <span></span><span></span>< | + | <br><br><br><span></span><span></span><span></span>blob_color=new float[total][3]; |
− | <span></span><span></span>< | + | <br><br><br><br><span></span><span></span><span></span>int centerX = int(blobs[n][0]+0.5*blobs[n][2]); |
− | <span></span><span></span>< | + | <br><span></span><span></span><span></span>int centerY = int(blobs[n][1]+0.5*blobs[n][3]); |
− | <span></span><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><span></span><span></span><span></span>red+=blob_color[n][0]; | |
− | <span></span><span></span> | + | <br><span></span><span></span><span></span>green+=blob_color[n][1]; |
− | <span></span> | + | <br><span></span><span></span><span></span>blue+=blob_color[n][2]; |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | <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>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); | |
− | <span></span><span></span> | + | |
− | + | ||
− | + | ||
− | + | ||
− | < | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | <br><span></span>} | |
− | <span></span | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | <span></span><span></span><br><br> | + | <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++) |
− | <span></span><span></span><span></span><br> | + | <br><span></span><span></span>{ |
− | <span></span><span></span><span></span><br>for ( | + | <br><span></span><span></span><span></span>b=theBlobDetection.getBlob(n); |
− | <span></span><span></span><span></span><span></span><br> | + | <br><span></span><span></span><span></span>if (b!=null) |
− | <span></span><span></span><span></span><span></span>< | + | <br><span></span><span></span><span></span>{ |
− | <span></span><span></span><span></span><span></span>< | + | <br><span></span><span></span><span></span><span></span>// Edges |
− | <span></span><span></span><span></span><span></span><br> | + | <br><span></span><span></span><span></span><span></span>if (drawEdges) |
− | <span></span><span></span><span></span><br>} | + | <br><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>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>} | ||
− | <span></span><span></span><span></span><span></span><br><br> | + | <br><br><span></span><span></span><span></span><span></span>// Blobs |
− | <span></span><span></span><span></span><span></span><br> | + | <br><span></span><span></span><span></span><span></span>if (dist(block_size/2,block_size/2,b.xMin*block_size, |
− | <span></span><span></span><span></span><span></span><br> | + | <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); | ||
− | <span></span><span></span><span></span> < | + | <br><br><span></span><span></span><span></span><span></span><span></span>rect( |
− | <span></span><span></span><span></span><span></span><span></span><br> | + | <br><span></span><span></span><span></span><span></span><span></span>b.xMin*block_size, b.yMin*block_size, |
− | <span></span><span></span><span></span><span></span> < | + | <br><span></span><span></span><span></span><span></span><span></span>b.w*block_size, b.h*block_size |
− | <span></span><span></span><span></span><span></span>< | + | <br><span></span><span></span><span></span><span></span><span></span><span></span>); |
− | <span></span><span></span><span></span><span></span><br> | + | <br><span></span><span></span><span></span><span></span>} |
− | <span></span><span></span><span></span><span></span><br><br> | + | <br><span></span><span></span><span></span>} |
+ | <br><span></span><span></span>} | ||
+ | <br><span></span><span></span>popMatrix(); | ||
+ | <br><br><span></span>} | ||
− | <span></span><span></span><span></span><span></span><br>< | + | <br><br><span></span>void fastblur(PImage img, int radius) |
− | <span></span><span></span><span></span><span></span><br> | + | <br><span></span>{ |
− | <span></span><span></span><span></span><span></span><br>< | + | <br><span></span><span></span>if (radius < 1) { |
− | <span></span><span></span><span></span><span></span><br>yi | + | <br><span></span><span></span><span></span>return; |
− | <span></span><span></span><span></span>< | + | <br><span></span><span></span>} |
− | <span></span><span></span><span></span><br> | + | <br><span></span><span></span>int w=img.width; |
− | <span></span> <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><span></span><span></span>yw=yi=0; | |
− | <span></span><span></span> | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | <span></span><span></span><span></span><span></span>< | + | <br><br><span></span><span></span>for (y=0; y < h; y++) { |
− | <span></span><span></span><span></span><span></span><br>gsum+= | + | <br><span></span><span></span><span></span>rsum=gsum=bsum=0; |
− | <span></span><span></span><span></span><span></span><br> | + | <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]; |
− | <span></span><span></span><span></span>< | + | <br><span></span><span></span><span></span><span></span>g[yi]=dv[gsum]; |
− | <span></span><span></span>< | + | <br><span></span><span></span><span></span><span></span>b[yi]=dv[bsum]; |
− | <span>< | + | |
− | <span></span><br><br> | + | <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; | |
− | <span></span><span></span> | + | <br><span></span><span></span><span></span><span></span>gsum+=((p1 & 0x00ff00)-(p2 & 0x00ff00))>>8; |
− | <span></span><span></span> | + | <br><span></span><span></span><span></span><span></span>bsum+= (p1 & 0x0000ff)-(p2 & 0x0000ff); |
− | < | + | <br><span></span><span></span><span></span><span></span>yi++; |
− | <span></span><span></span><span></span> | + | <br><span></span><span></span><span></span>} |
− | + | <br><span></span><span></span><span></span>yw+=w; | |
− | <span></span><span></span><span></span><span></span> | + | <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><br><span></span><span></span>for (x=0; x<w; x++) { |
− | <span></span><span></span>< | + | <br><span></span><span></span><span></span>rsum=gsum=bsum=0; |
− | <span></span><span></span><br>for ( | + | <br><br><span></span><span></span><span></span>yp=-radius*w; |
− | <span></span><span></span><span></span><br> | + | <br><span></span><span></span><span></span>for (i=-radius; i<=radius; i++) { |
− | <span></span><span></span><br>} | + | <br><span></span><span></span><span></span><span></span>yi=max(0, yp)+x; |
− | <span></span><span></span><br>for ( | + | <br><span></span><span></span><span></span><span></span>rsum+=r[yi]; |
− | <span></span><span></span><span></span>< | + | <br><span></span><span></span><span></span><span></span>gsum+=g[yi]; |
− | <span></span><span></span><span></span>< | + | <br><span></span><span></span><span></span><span></span>bsum+=b[yi]; |
− | <span></span><span></span><span></span>< | + | <br><span></span><span></span><span></span><span></span>yp+=w; |
− | <span></span><span></span> < | + | <br><span></span><span></span><span></span>} |
− | <span></span><span></span><span></span><span></span><br> | + | <br><span></span><span></span><span></span>yi=x; |
− | <span></span><span></span><span></span>< | + | <br><span></span><span></span><span></span>for (y=0; y < h; y++) { |
− | <span></span><span></span>< | + | <br><span></span><span></span><span></span><span></span>pix[yi]=0xff000000 | (dv[rsum]<< 16) | (dv[gsum]<< 8) | dv[bsum]; |
− | <span>< | + | <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]; | |
− | <span></span><span></span> | + | <br><span></span><span></span><span></span><span></span>gsum+=g[p1]-g[p2]; |
− | <span></span><span></span> | + | <br><span></span><span></span><span></span><span></span>bsum+=b[p1]-b[p2]; |
− | + | ||
− | <span></span><span></span> | + | |
− | <span></span><span></span> | + | |
− | + | ||
− | <span></span><span></span> | + | |
− | <span></span><span></span> | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | <span></span><span></span><span></span><span></span><br><br>noStroke(); | + | <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> | <span></span><span></span><span></span> | ||
− | < | + | <br><br><span></span><span></span><span></span>if (sequence[i]) { |
− | <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><span></span><br>fill(avg_color[0], avg_color[1], avg_color[2]); |
− | <span></span><span></span><span></span | + | <br><span></span><span></span><span></span>} else { |
− | <span></span><span></span><span></span | + | <br><span></span><span></span><span></span> fill(70); |
− | <span></span><span></span><span></span><br> | + | <br><span></span><span></span><span></span>} |
− | <span></span><span></span><span></span | + | <br><span></span><span></span><span></span>rect(x, y, grid_size, grid_size); |
− | <span></span><span></span><br> | + | <br><span></span><span></span>} |
− | <span></span><span></span | + | <br><span></span><span></span>popMatrix(); |
− | <span></span><br>} | + | <br><span></span><br>} |
− | <span></span><br><br>void glow(int n) { | + | <br><br><span></span><br><br>void glow(int n) { |
− | <span></span><span></span | + | <br><span></span><span></span>pushMatrix(); |
− | <span></span><span></span | + | <br><span></span><span></span>translate(a, b); |
− | <span></span><span></span | + | <br><span></span><span></span>rectMode(CORNER); |
− | <span></span><span></span | + | <br><span></span><span></span>for (int m=0; m< grid_num; m++) { |
− | <span></span><span></span><span></span | + | <br><span></span><span></span><span></span>if (sequence[m*grid_num+n]) { |
− | <span></span><span></span><span></span><span></span | + | <br><span></span><span></span><span></span><span></span>for (int p=-1; p< 2; p++) { |
− | <span></span><span></span><span></span><span></span><span></span | + | <br><span></span><span></span><span></span><span></span><span></span>for (int q=-1; q< 2; q++) { |
− | <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 (n+p>=0&&n+p< grid_num&&m+q>=0&& |
− | <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><span></span><span></span>m+q< grid_num) { |
− | <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><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); |
− | <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><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><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>} | ||
Line 978: | Line 977: | ||
<br><span></span><span></span>float noteVal; | <br><span></span><span></span>float noteVal; | ||
<br><span></span><span></span>float[] noteVals=new float[0]; | <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>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>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>noteVal = float(notes[i]); | ||
Line 1,019: | Line 1,018: | ||
<br><br>Source: blob detection | <br><br>Source: blob detection | ||
http://www.v3ga.net/processing/BlobDetection/ | http://www.v3ga.net/processing/BlobDetection/ | ||
+ | |||
<br><br>soundcipher | <br><br>soundcipher | ||
<br>http://explodingart.com/soundcipher/ | <br>http://explodingart.com/soundcipher/ |
Latest revision as of 15:16, 18 September 2015