0

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

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() 函数,它实际上在时间之后循环播放音乐,但没有办法给延迟一个完全准确的数字,因此它可以准确循环。

一些帮助将不胜感激。

4

1 回答 1

0

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

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

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

你可以做类似的事情,只不过不是画圆圈,而是弹奏音符。

于 2016-11-22T14:09:07.637 回答