Java 为什么赢了';我的音频剪辑播放不一致吗?

Java 为什么赢了';我的音频剪辑播放不一致吗?,java,audio,Java,Audio,我正在尝试制作一个drum循环编辑器,我有一个名为Sounds的类和一个运行我的主方法的类,目前使用的只是测试Sounds类 以下是我的主要课程: private static Sounds sounds; public static void main(String args[]){ while(true){ //yes, i realize I shouldn't do this. it's only for testing sounds.play(Sounds.B

我正在尝试制作一个drum循环编辑器,我有一个名为Sounds的类和一个运行我的主方法的类,目前使用的只是测试Sounds类

以下是我的主要课程:

private static Sounds sounds;

public static void main(String args[]){
    while(true){ //yes, i realize I shouldn't do this. it's only for testing
        sounds.play(Sounds.BASS);
        sounds.play(Sounds.CLOSED_HIHAT);
        pause(500);
        sounds.play(Sounds.CLOSED_HIHAT);
        pause(500);
        sounds.play(Sounds.SNARE);
        sounds.play(Sounds.CLOSED_HIHAT);
        pause(500);
        sounds.play(Sounds.OPEN_HIHAT);
        pause(500);
    }
}

public static void pause(long time){
    try{
        Thread.sleep(time);
    }catch(Exception ex){}
}
这是我的声音课:

import java.applet.Applet;
import java.applet.AudioClip;

public class Sounds{

    static AudioClip[] sounds ={
        Applet.newAudioClip(Sounds.class.getResource("bass.wav")),
        Applet.newAudioClip(Sounds.class.getResource("snare.wav")),
        Applet.newAudioClip(Sounds.class.getResource("closed hihat.wav")),
        Applet.newAudioClip(Sounds.class.getResource("closed hihat.wav")),
        Applet.newAudioClip(Sounds.class.getResource("open hihat.wav")),
        Applet.newAudioClip(Sounds.class.getResource("low floor tom.wav")),
        Applet.newAudioClip(Sounds.class.getResource("high floor tom.wav")),
        Applet.newAudioClip(Sounds.class.getResource("low tom.wav")),
        Applet.newAudioClip(Sounds.class.getResource("low mid tom.wav")),
        Applet.newAudioClip(Sounds.class.getResource("high mid tom.wav")),
        Applet.newAudioClip(Sounds.class.getResource("high tom.wav")),
        Applet.newAudioClip(Sounds.class.getResource("crash 1.wav")),
        Applet.newAudioClip(Sounds.class.getResource("crash 2.wav")),
        Applet.newAudioClip(Sounds.class.getResource("ride.wav")),
        Applet.newAudioClip(Sounds.class.getResource("ride bell.wav")),
        Applet.newAudioClip(Sounds.class.getResource("china.wav")),
        Applet.newAudioClip(Sounds.class.getResource("splash.wav"))
    };
    //index constants
    protected static int BASS=0;
    protected static int SNARE=1;
    protected static int CLOSED_HIHAT=2;
    protected static int PEDAL_HIHAT=3;
    protected static int OPEN_HIHAT=4;
    protected static int TOM1=5;
    protected static int TOM2=6;
    protected static int TOM3=7;
    protected static int TOM4=8;
    protected static int TOM5=9;
    protected static int TOM6=10;
    protected static int CRASH1=11;
    protected static int CRASH2=12;
    protected static int RIDE=13;
    protected static int RIDE_BELL=14;
    protected static int CHINA=15;
    protected static int SPLASH=16;


    public void play(int soundIndex){
        sounds[soundIndex].play();
        if(soundIndex == Sounds.CLOSED_HIHAT || soundIndex == Sounds.PEDAL_HIHAT){
            sounds[Sounds.OPEN_HIHAT].stop();
        }
        if(soundIndex == Sounds.RIDE_BELL){
            sounds[Sounds.RIDE].stop();
        }
    }       
}
我的问题是声音会播放,但不是每次都播放。通常会有一个hihat完全被忽略,主要是在有圈套或贝司演奏的节拍中

如果您打算自己复制我的项目来解决问题,您可以在这里获得我正在使用的wav文件的zip文件夹:


提前感谢您的反馈。

让一切顺利进行,不要停止

最后再睡几分钟,让一切都结束

您需要将文件剪切到播放所需的程度,并让播放全部内容-不是在wav中有5分钟,而是想播放2.5-这是不可预测的

因此,将文件缩减到所需的大小,并按您需要的顺序播放它们

否则,您必须更详细地测量文件的长度,播放需要多少字节等


补充:您可以转到AudioSystem,javax.sound.sampled包有点复杂,所以您需要阅读-

让一切都播放出来,不要停止

最后再睡几分钟,让一切都结束

您需要将文件剪切到播放所需的程度,并让播放全部内容-不是在wav中有5分钟,而是想播放2.5-这是不可预测的

因此,将文件缩减到所需的大小,并按您需要的顺序播放它们

否则,您必须更详细地测量文件的长度,播放需要多少字节等


补充:您可以访问AudioSystem和javax.sound.sampled软件包,因为它有点复杂,所以您需要阅读-

我不能在每个节拍之间留出几分钟,因为那样的话,程序实际上就无法使用了,我不能让打开的hihat在关闭的hihat或踏板hihat播放后继续播放,因为这不是鼓的工作方式。我的意思是在主旋律的和处睡眠(),所以没有遗漏任何东西。播放停止是不可预测的,它可能会被切断,这取决于运行时间而不是实际的持续时间-有没有更可靠的类,我可以使用声音,而不是音频剪辑?我需要精度和速度来实现我对这个项目的愿景,因为我基本上想制作一个完整的音乐编辑器,它允许无限的测量,可以以不同的节奏播放,具有不同的时间特征,并且可以有从整音符到32音符的任何地方,可以是点音符或三元组。你可以访问AudioSystem javax.sound.sampledI无法让AudioSystem为我工作,但是在研究它的过程中,我确实从javax.sound中找到了midi功能,我可能可以使用它,所以感谢您为我指出了正确的大致方向(javax.sound)。我不能在每个节拍之间留出几分钟,因为那样的话,程序实际上就无法使用了,我不能让打开的hihat在关闭的hihat或踏板hihat播放后继续播放,因为这不是鼓的工作方式。我的意思是在主旋律的和处睡眠(),所以没有遗漏任何东西。播放停止是不可预测的,它可能会被切断,这取决于运行时间而不是实际的持续时间-有没有更可靠的类,我可以使用声音,而不是音频剪辑?我需要精度和速度来实现我对这个项目的愿景,因为我基本上想制作一个完整的音乐编辑器,它允许无限的测量,可以以不同的节奏播放,具有不同的时间特征,并且可以有从整音符到32音符的任何地方,可以是点音符或三元组。你可以访问AudioSystem javax.sound.sampledI无法让AudioSystem为我工作,但是在研究它的过程中,我确实从javax.sound中找到了midi特性,我可能可以使用它,所以感谢您为我指出了正确的方向(javax.sound)。