Создание базового музыкального секвенсора с библиотекой Minim в 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, чтобы он давал инструментам последовательность от начала массива после его завершения за один цикл. Если я помещаю функции последовательности в цикл рисования, он отправляет ноты инструмента невероятно быстро (вероятно, около 60 кадров в секунду, если это значение по умолчанию для рисования). Я поместил функцию delay() в цикл отрисовки, который фактически зацикливает музыку по прошествии некоторого времени, но нет никакого способа дать задержке абсолютно точное число, поэтому оно зацикливается точно.

Некоторая помощь будет оценена.

1 ответ

Вы можете использовать frameCount переменная и по модулю % Оператор предпринимает действия каждые X кадров. Более подробную информацию об обоих можно найти в ссылке.

Вот небольшой пример, который рисует случайный круг каждые 60 кадров:

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

Вы можете сделать что-то подобное, только вместо того, чтобы рисовать круги, вы будете играть ноты.

Другие вопросы по тегам