2016-04-08 34 views
1

我用下面的代码进行试验:处理:我怎样才能绘制每x帧?

//3D Spectrogram with Microphone Input 
//Modified by kylejanzen 2011 - https://kylejanzen.wordpress.com 
//Based on script wwritten by John Locke 2011 - http://gracefulspoon.com 

//Output .DXF file at any time by pressing "r" on the keyboard 

import processing.dxf.*; 
import ddf.minim.analysis.*; 
import ddf.minim.*; 
import peasy.*; 

PeasyCam cam; 

FFT fftLin; 
FFT fftLog; 

Waveform audio3D; 

Minim minim; 
AudioInput microphone; 

boolean record; 

PFont font; 

float camzoom; 
float maxX = 0;float maxY = 0;float maxZ = 0; 
float minX = 0;float minY = 0;float minZ = 0; 

void setup() 
{ 
    size(1250,750,P3D); //screen proportions 
    noStroke(); 
    minim = new Minim(this); 
    microphone = minim.getLineIn(Minim.STEREO, 4096); //repeat the song 

    cam = new PeasyCam(this, 0, 0, 0, 50); 
    cam.setMinimumDistance(50); 
    cam.setMaximumDistance(500); 

    background(255); 

    fftLog = new FFT(microphone.bufferSize(),microphone.sampleRate()); 
    fftLog.logAverages(1,2); //adjust numbers to adjust spacing; 
    float w = float (width/fftLog.avgSize()); 
    print(fftLog.avgSize()); 
    float x = w; 
    float y = 0; 
    float z = 10; 
    float radius = 100; 
    audio3D = new Waveform(x,y,z,radius); 
} 
void draw() 

{ 
    background(0); 
    // ambientLight(102,102,102); 

    if (frameCount>0) 
    { 
    for(int i = 0; i < fftLog.avgSize(); i++){ 
     float zoom = 1; 
     float jitter = (fftLog.getAvg(i)*2); 
     //println(jitter); 
     PVector foc = new PVector(audio3D.x+jitter, audio3D.y+jitter, 0); 
     PVector cam = new PVector(zoom, zoom, -zoom); 
     // camera(foc.x+cam.x+50,foc.y+cam.y+50,foc.z+cam.z+100,foc.x+30,foc.y+30,foc.z+100,0,0,1); 
    } 
    } 
    //play the song 
    fftLog.forward(microphone.mix); 

    audio3D.update(); 
    // audio3D.textdraw(); 

    if(record) 
    { 
    beginRaw(DXF, "output.dxf"); 
    } 
    audio3D.plotTrace(); 

    if(record) 
    { 
    endRaw(); 
    record = false; 
    println("It's Done Bitches! Find your DXF!"); 
    } 
} 
void stop() 
{ 
    // always close Minim audio classes when you finish with them 
    microphone.close(); 
    // always stop Minim before exiting 
    minim.stop(); 
    super.stop(); 
} 
class Waveform 
{ 
    float x,y,z; 
    float radius; 

    PVector[] pts = new PVector[fftLog.avgSize()]; 

    PVector[] trace = new PVector[0]; 

    Waveform(float incomingX, float incomingY, float incomingZ, float incomingRadius) 
    { 
    x = incomingX; 
    y = incomingY; 
    z = incomingZ; 
    radius = incomingRadius; 
    } 
    void update() 
    { 
    plot(); 
    } 
    void plot() 
    { 
    for(int i = 1; i < fftLog.avgSize(); i++) 
    { 
     int w = int(width/fftLog.avgSize()); 

     x = i*w; 
     y = frameCount*5; // CHANGE THE SPEED 
     z = height/4-fftLog.getAvg(i)*4; //change multiplier to reduces height default '10' 

     stroke(0); 
     point(x, y, z); 
     pts[i] = new PVector(x, y, z); 
     //increase size of array trace by length+1 
     trace = (PVector[]) expand(trace, trace.length+1); 
     //always get the next to last 
     trace[trace.length-1] = new PVector(pts[i].x, pts[i].y, pts[i].z); 
    } 
    } 
    /* void textdraw() 
    { 
    for(int i =0; i<fftLog.avgSize(); i++){ 
     pushMatrix(); 
     translate(pts[i].x, pts[i].y, pts[i].z); 
     rotateY(PI/2); 
     rotateZ(PI/2); 

     fill(255,255); 
     text(round(fftLog.getAvg(i)*100),0,0,0); 
     popMatrix(); 
    } 
    } */ 
    void plotTrace() 
    { 
    stroke(255,100); 
    int inc = fftLog.avgSize(); 

    for(int i=1; i<trace.length-inc; i++) 
    { 
     if(i%inc != 0) 
     { 
     beginShape(POINTS); 
     strokeWeight(2); 
     fill(0, 0, 0, 100); 
     vertex(trace[i].x, trace[i].y, trace[i].z); 
     vertex(trace[i-1].x, trace[i-1].y, trace[i-1].z); 
     vertex(trace[i+inc].x, trace[i+inc].y, trace[i+inc].z); 
     vertex(trace[i-1+inc].x, trace[i-1+inc].y, trace[i-1+inc].z); 
     endShape(CLOSE); 
     } 
    } 
    } 
} 
void keyPressed() 
{ 
    if (key == 'r') record = true; 
} 

我公司目前正在努力实现的是减少对(移动)(Y-)轴产生点的数量。目前看来,每一帧,一个点都会产生。因此,我的问题非常简单:我怎样才能让它只画画每5帧?我无法找到管理它的价值。

非常感谢。

+0

未来,请提供[mcve],而不是张贴您的整个草图。你的问题可以归结为简单的事情,比如每X帧打印一些东西给控制台,所有额外的代码让我们很难帮助你。 –

回答

3

你有三种选择:

选项1:调用frameRate()功能,以减少获得每秒绘制的帧数。

void setup(){ 
    size(500, 500); 
    frameRate(5); 
} 

void draw(){ 
    background(0); 
    ellipse(mouseX, mouseY, 20, 20); 
} 

选项2:使用frameCount变量和modulus % operator确定何时X帧已经过去。

void setup(){ 
    size(500, 500); 
} 

void draw(){ 
    if(frameCount % 5 == 0){ 
    background(0); 
    ellipse(mouseX, mouseY, 20, 20); 
    } 
} 

方案3:你可以创建自己的变量存储已经过去的帧数。

int framesElapsed = 0; 

void setup(){ 
    size(500, 500); 
} 

void draw(){ 
    framesElapsed++; 

    if(framesElapsed == 5){ 
    background(0); 
    ellipse(mouseX, mouseY, 20, 20); 
    framesElapsed = 0; 
    } 
} 

请注意,对于简单的情况,这只是做选项2中的模数运算符正在做什么。在这种情况下,模量可能会更好。但是,如果你想在不同的时间发生不同的事情,这会变得很有用。在这种情况下,你会有多个变量来跟踪任何你想跟踪的“生命周期”。

但对于你的例子,选项2可能是最好的选择。

+1

涵盖多种选择的好答案(+1) –