Я рекомендую стандартную технику отладки - ввод System.out.println()
для проверки значения в file
перед каждым setUp()
вызовом, чтобы убедиться, что вы действительно получаете на каждый вызов уникальное значение файла.
Я предполагаю, что вы никогда не достигнете второй итерации цикла синтаксического анализа из-за большого количества времени сна. Значение, полученное из clip.getMicrosecondLength()
, будет на три порядка больше, чем число миллисекунд, поэтому вам нужно разделить его, чтобы получить количество миллисекунд. Но я не много разбираю файлы и не проверял ваш код, поэтому обеспечение правильных вызовов было бы моим первым шагом к отладке.
Наконец, для правильного использования Clips
(в будущем, я предполагаю, что это всего лишь тест для знакомства с Clips
), могу ли я предложить создать массив под названием clips
всех возможных заметок, и сделать, чтобы первая часть вашего кода загружала каждый из файлов клипа?
Затем при чтении файла вызовите его со значением, в котором входящая строка для имени заметки преобразуется в соответствующее значение массива clips []. Например, если аудиофайл «A» находится в клипах [0], вы бы назвали следующее с «0» в качестве аргумента.
private void playClip(int idx)
{
clips[idx].setFramePosition(0);
clips[idx].play();
Thread.sleep(clips[idx].getMicrosecondLength()/1000);
}
Clips
предназначены для звука, который хранится в памяти и используется повторно. Если вы предпочитаете читать из файлов, SourceDataLine
более эффективен, так как он начнет воспроизводиться, как только загрузит буфер данных, где Clips
не начнет воспроизводиться, пока не будет загружен весь файл.