Создание базового музыкального секвенсора с минимальной библиотекой в ​​обработке - проблемы с зацикливанием

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

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


person technicsthermo    schedule 22.11.2016    source источник
comment
Добавьте ссылку между перекрестными сообщениями: forum.processing .org / two / обсуждение / 19217 /   -  person Kevin Workman    schedule 22.11.2016


Ответы (1)


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

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

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

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

person Kevin Workman    schedule 22.11.2016