播放短片(小于0:00:500秒)声音片段

时间:2018-03-06 23:01:55

标签: java android-studio soundpool

我在使用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();
    }
}

问题:我正在撰写关于" AI"在古典音乐的创作中实施。有三种不同的音符(从持续时间的角度来看) - 一半(1.2秒),四分之一(0.6秒)和八分之一(0.3秒)。这段代码以正确的方式播放Half和Querter音符,但是,当涉及到Eighth音符时,它只是跳过它们。

即:

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)

... ... ...

解决方案可能会增加durationInSeconds,但是,它会扩展所有声音而我不想这样做。

另外我想找出适应android: 即我想按顺序播放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();

    }
}

我得到的是所有声音片段同时播放。如何解决?

1 个答案:

答案 0 :(得分:0)

找到了解决方案。不知道它是否是破碎的代码,但是,我的项目完美无缺

    try
            {
                Thread.sleep(1000);
            }
            catch(InterruptedException ex)
            {
                Thread.currentThread().interrupt();
            }