如何更改上面显示的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;
}
答案 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
}