Проблема здесь: StdDraw.nextKeyTyped();
документация гласит:
Какой следующий ключ был введен пользователем?Этот метод возвращает символ Unicode, соответствующий введенному ключу (например, «a» или «A»).Он не может идентифицировать клавиши действий (например, клавиши F1 и клавиши со стрелками) или клавиши-модификаторы (например, управление).
key
- это символ, а не индекс в этой строке.Вместо этого выполните следующее:
int charIndexInKeyboard = keyboard.indexOf(key);
if(charIndexInKeyboard == -1) // char not recognized
nextnote = keyboard.charAt(charIndexInKeyboard );
nextnote
теперь должен содержать нужный символ.
РЕДАКТИРОВАТЬ: Вот как теперь должен выглядеть ваш цикл while
while (true) {
// check if the user has typed a key; if so, process it
if (StdDraw.hasNextKeyTyped()) {
char key = StdDraw.nextKeyTyped();
int charIndexInKeyboard = keyboard.indexOf(key);
if(charIndexInKeyboard == -1){
// Not recognized, just continue to next
continue;
}
nextnote = keyboard.charAt(charIndexInKeyboard);
// pluck string and compute the superposition of samples
strings[nextnote].pluck();
double sample = strings[firstnote].sample()
+strings[nextnote].sample();
StdAudio.play(sample);
// advance the simulation of each guitar string by one step
strings[nextnote].tic();
firstnote=nextnote;
}
}