在Processing中使用Minim库创建基本音乐音序器 - 循环问题

时间:2016-11-22 13:23:01

标签: processing minim

我已经开始了一个项目来创建一个音乐音序器,使用乐器类和playNote函数等。我有一系列音符工作正常,但我无法循环它们。这是主要代码:

import ddf.minim.*;
import ddf.minim.ugens.*;

Minim       minim;
AudioOutput out;
Delay myDelay;
int i;
int endSeq;

public void settings() {
  size(800, 300, P2D);
}

void setup() {

  minim = new Minim(this);
  out = minim.getLineOut();
  myDelay = new Delay(1.5,0.5, false,false);
  bassSeq(); // starts bass sequence function
  chordSeq(); // starts chord sequence function
}

void draw() {
}

这是bassSeq函数,它描述了整个低音序列:

void bassSeq(){
float[] stepArray = {0.00, 0.75, 2.00, 2.5, 2.75, 3.5, 4, 4.5};
float[] decayArray = {1.0, 0.5, 0.5, 0.5, 0.5, 0.2, 0.5, 1.0};
float[] noteArray = {C2, F2, E2, G2, B2, C2, C2, B2};

for (i = 0; i <= 7; i++){

  out.pauseNotes();
  out.setTempo(125);
  out.playNote(stepArray[i], decayArray[i], new BassInstr(noteArray[i], 0.5, out ) );
  out.resumeNotes();

}
}

问题是,如果我将这些功能放入设置中,它们只会播放一次。理想情况下,我想要做的是迭代回到i = 0的开始,这样它就可以在完成一个循环后从数组的开头给出仪器序列。如果我将序列函数放在绘制循环中,它会非常快速地发送乐器音符(如果这是绘制的默认值,则大约为60fps)。我在绘制循环中放了一个delay()函数,它实际上会在一段时间之后循环播放音乐但是没有办法给出延迟一个完全准确的数字,所以它可以准确地循环。

一些帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您可以使用frameCount变量和模%运算符每X帧执行一次操作。有关这两者的更多信息,请参阅the reference

这是一个每60帧绘制一个随机圆圈的小例子:

void draw(){
  if(frameCount % 60 == 0){
   ellipse(random(width), random(height), 15, 15);   
  }
}

你可以做类似的事情,而不是画圆圈,你会玩纸币。