在处理过程中,如何在一定时间后停止草图演奏笔记?

时间:2017-04-30 19:09:20

标签: java processing midi

如何更改上面显示的setup()方法,以便它不会只播放一个音符,而是执行以下操作: - 它随机生成0到10之间的浮点值,然后播放尽可能少的音符。等于或等于随机数表示的总持续时间。

例如,如果生成随机值5.2,则应播放前三个音符,因为它们的总持续时间为3.8,小于5.2;如果生成随机值8.7则应播放前六个音符,因为它们的总持续时间等于8.7。

import arb.soundcipher.*;
SoundCipher midi;

String[] note = {"C", "C#", "D", "D#", "E", "F", "F#",
                 "G", "G#", "A", "A#", "B"};
float[] volume = {80,  100,  75,   43,  40,  81,  100,
                  60,   90,  30,   75,  52};
float[] duration = {1.3,   2, 0.5,    3, 0.9,   1, 0.25,
                    0.6, 1.5,   3, 1.25,   2};

void setup() {
  size(200,200);
  midi = new SoundCipher(this);
  int i = (int) random(note.length);
  midi.playNote(MIDIValue(note[i]),volume[i],duration[i]);
}

float MIDIValue(String aNote) {
  float noteMIDIValue = 0.0;
  int i;
  for (i =0; i < note.length && !note[i].equals(aNote) ; i++); 
  if(i < note.length) {
     noteMIDIValue = i+60;
  }
  return noteMIDIValue;
}

1 个答案:

答案 0 :(得分:-1)

为了获得你想要使用Math.random()的随机数,这会生成0到1之间的随机数。为了使它生成0到10之间的随机双数,你需要做那个时间10,所以Math.random() * 10

要使其播放所需的音符,您可以使用此随机数从您的duration列表中“删除”元素,直到这样做会使其低于下一个持续时间。

代码示例如下所示:

    float randomNumber = (float)Math.random() * 10f;
    int currentNote = 0;
    while(randomNumber > duration[currentNote]){
        randomNumber -= duration[currentNote]; // "Chip away" duration
        midi.playNote(MIDIValue(note[currentNote]),volume[currentNote],duration[currentNote]); // Play the note
        currentNote++; // Try out the next note
    }