【问题标题】:Changing brightness depending on sound (Processing)根据声音改变亮度(处理中)
【发布时间】:2015-10-18 02:57:28
【问题描述】:

我现在正在学习处理,我正在尝试制作一个可以在声音变化时改变颜色的草图。

(当幅度 + , 然后亮度+)

因为改变颜色不需要像 draw() 函数那样快速改变。那么我怎样才能建立一个时钟,这样每次抽奖时颜色都不会改变呢?

这是我现在使用的代码:

import ddf.minim.*;
import ddf.minim.signals.*;
import ddf.minim.analysis.*;
import ddf.minim.effects.*;

Minim minim;
AudioPlayer song;
FFT fft; 
BeatDetect beat;

color start=color(0,0,0);
color finish;
float amt = 0.0;

void setup()
{
  frameRate(50);
  size(600,600,P3D);    
  minim = new Minim(this);
  song = minim.loadFile("song2.mp3", 512);
  song.loop();

  fft = new FFT(song.bufferSize(), song.sampleRate());

   beat = new BeatDetect(song.bufferSize(), song.sampleRate());

}

// draw is run many times
void draw()
{  
  float brightness = map( 0, 0, song.bufferSize(), 0, 255 ); 
  background( brightness );
  // println(song.bufferSize());

  stroke(100);

  // draw the waveforms
  for( int i = 0; i < song.bufferSize() - 1; i++ )
  {
    // find the x position of each buffer value
    float x1  =  map( i, 0, song.bufferSize(), 0, width );
    float x2  =  map( i+1, 0, song.bufferSize(), 0, width );
    // draw a line from one buffer position to the next for both channels
    line( x1, 50 + song.left.get(i)*50, x2, 50 + song.left.get(i+1)*50);
    line( x1, 150 + song.right.get(i)*50, x2, 150 + song.right.get(i+1)*50);
  println(x1);
  }

}

【问题讨论】:

    标签: java audio processing clock void


    【解决方案1】:

    信任 frameRate 来控制时间是可以的,但是当然取决于 frameRate。这意味着如果您的 frameRate 下降,则 timimg 将一起下降。

    为避免这种情况,您可以使用millis() 并将您的时间附加到好时间:)

    这是一个非常简单的计时器示例:

    PFont font;
    String time = "000";
    int initialTime;
    int interval = 1000;//one second
    color bg = color (255);
    
    
    void setup()
    {
      size(300, 300);
      font = createFont("Arial", 30);
      background(255);
      fill(0);
      initialTime = millis();
      frameRate(30);// changed framerate to exemplify
    }
    
    void draw()
    {
      background(bg);
      if (millis() - initialTime > interval)
      {
        time = nf(int(millis()/1000), 3);
        initialTime = millis();
       bg = color (random(255), random(100), random(255));
      }
    
      text(time, width/2, height/2);
    
    
    }
    

    【讨论】:

      【解决方案2】:

      当你调用 frameRate(50);您正在告诉 Processing 每秒 50 次(尝试)更新 draw() 。您可以通过检查内置变量 frameCount 来判断自草图开始以来已经过去了多少帧。

      然后可以将其除以一个数字,该数字表示在执行特殊操作之前要绘制多少帧 - 我会为此使用模数,它将数字相除并返回余数。如果它等于 0,那么这个帧数已经过去了。

          int updateTriggerCount = 10;        
          void setup() {
          ...        
          }
      
          void draw()
          {
             if((frameCount % updateTriggerCount) == 0)
             {
                  // Another 10 frames have passed! Do something special
             }
             ....
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-25
        • 1970-01-01
        • 2012-12-15
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多