Воспроизведение короткого (менее 0:00:500 сек) аудиоклипа

Я столкнулся с проблемой воспроизведения короткого звукового клипа с помощью java. Любой совет?

public static void playAll(String note, String beat, String chord) {

    try {
        AudioInputStream audioInputSoloNote = AudioSystem.getAudioInputStream(new File(
                "C:/java_support/solo_sound/"+note+"_"+beat+".wav").getAbsoluteFile());
        AudioFormat formatNote = audioInputSoloNote.getFormat();

        AudioInputStream audioInputSoloChord = AudioSystem.getAudioInputStream(new File(
                "C:/java_support/solo_chord/"+chord+".wav").getAbsoluteFile());

        Clip clipSolo = AudioSystem.getClip();
        clipSolo.open(audioInputSoloNote);
        clipSolo.start();

        Clip clipChord = AudioSystem.getClip();
        clipChord.open(audioInputSoloChord);
        clipChord.start();

        long frames = audioInputSoloNote.getFrameLength();
        double durationInSeconds = ((frames + 0.0) / formatNote.getFrameRate());

        sleep((long) durationInSeconds * 1000);

        clipSolo.stop();
        clipChord.stop();


    } catch(Exception ex) {
        System.out.println("Error with playing sound.");
        ex.printStackTrace();
    }
}

Проблема: Я пишу заявку на свои исследования по внедрению «ИИ» в создание классической музыки. Существует 3 разных ноты (с точки зрения длительности): половина (1,2 секунды), четверть (0,6 секунды) и восьмая (0,3 секунды). Этот код воспроизводит ноты Half и Querter правильно, однако, когда дело доходит до восьмых нот, он их просто пропускает.

I.e:

C Quarter C --> play (0.6sec duration) 
F Eighth F --> skip (0.3sec)
E Eighth C --> skip (0.3sec)
F Quarter F --> play (0.6sec)
F Quarter Dm --> play (0.6sec)
C Half F --> play (1.2sec)

... ... ...

Решение может увеличить продолжительностьInSeconds, однако это расширит все звуки, и я не хочу этого делать.

Также хотелось бы узнать адаптацию к андроиду: т.е. хочу воспроизвести 7 коротких звуков по порядку.

private void playNotes (ArrayList<Data> list) {

    SoundPool sp = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);

    for (int i = 0; i < list.size(); i++) {

        String note = list.get(i).getNote().toLowerCase()+"_eighth";

        int resID = getResources().getIdentifier(note, "raw",

    getPackageName());

        int soundId = sp.load(this, resID, 1);
        sp.play(soundId);
        MediaPlayer mPlayer = MediaPlayer.create(this, resID);

        mPlayer.start();

    }
}

что я получаю, так это то, что все звуковые клипы воспроизводятся одновременно. Как это исправить?


person Eduardas Šlutas    schedule 06.03.2018    source источник
comment
Возможный дубликат Надежное воспроизведение короткого звука в Java   -  person Bentaye    schedule 07.03.2018
comment
Я пробовал все ответы, предложенные в этой теме, однако либо это вообще не сработало, либо застряло на первой записи.   -  person Eduardas Šlutas    schedule 07.03.2018
comment
Вам лучше либо сгенерировать форму волны вручную для указанной продолжительности, либо использовать какую-либо форму MIDI, которая лучше поддерживает длительность.   -  person MadProgrammer    schedule 08.03.2018
comment
@MadProgrammer, не могли бы вы расширить, пожалуйста? Если я использую MIDI, означает ли это, что он даст мне интегрированные звуки или я смогу использовать свою собственную звуковую базу данных? И не могли бы вы прислать мне документацию о том, как вручную генерировать волну? Извините, если это звучит как глупый вопрос, но я новичок в Java.   -  person Eduardas Šlutas    schedule 08.03.2018


Ответы (1)


Нашли решение. Однако не знаю, сломан ли код, потому что мой проект работает отлично.

    try
            {
                Thread.sleep(1000);
            }
            catch(InterruptedException ex)
            {
                Thread.currentThread().interrupt();
            }
person Eduardas Šlutas    schedule 12.03.2018