Различные аудиофайлы не воспроизводятся - PullRequest
0 голосов
/ 27 апреля 2019

Предполагается, что я ввожу ноты, а программа воспроизводит соответствующие ноты для фортепиано. Единственная проблема заключается в том, что первая нота работает, но остальные ноты не воспроизводятся. Таким образом, если я введу «ABC», нота A будет играть, а ноты B и C - нет. Это потому что файл статический?

public class SnapMusic {    

static File file = new File("");

static void setUp() {

    try {

    Clip clip = AudioSystem.getClip();
    clip.open(AudioSystem.getAudioInputStream(file));
    clip.start();
    Thread.sleep(clip.getMicrosecondLength());
         }

    catch (Exception e) {
        System.err.println(e.getMessage());
       }
   }

public static void main (String[] arrgs) {

    Scanner scan = new Scanner(System.in);
    String notes = scan.next();

    for (int i = 0; i < notes.length(); i++) {

        if (notes.charAt(i) == 'A') {
            file = new File("src/musictranslator/MidA.wav");
            setUp();
        }
        else if (notes.charAt(i) == 'B') {
            file = new File("src/musictranslator/MidB.wav");
            setUp(); 
        }

        else if (notes.charAt(i) == 'C') {
            file = new File("src/musictranslator/MidC.wav");
            setUp();
        }
        else if (notes.charAt(i) == 'D') {
            file = new File("src/musictranslator/MidD.wav");
            setUp();
        }
}

1 Ответ

1 голос
/ 28 апреля 2019

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

...