Java 不播放不同的音频文件

Java 不播放不同的音频文件,java,loops,audio,javasound,playing,Java,Loops,Audio,Javasound,Playing,前提是我正在输入音乐音符,程序会播放相应的钢琴音符。唯一的问题是第一个音符起作用,但其余的音符不起作用。所以,如果我输入“ABC”,音符A将播放,但音符B和C将不播放。是因为文件是静态的吗 public class SnapMusic { static File file = new File(""); static void setUp() { try { Clip clip = AudioSystem.getClip(); clip.open(Audi

前提是我正在输入音乐音符,程序会播放相应的钢琴音符。唯一的问题是第一个音符起作用,但其余的音符不起作用。所以,如果我输入“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();
        }
}
公共类SnapMusic{
静态文件文件=新文件(“”);
静态无效设置(){
试一试{
Clip Clip=AudioSystem.getClip();
open(AudioSystem.getAudioInputStream(文件));
clip.start();
sleep(clip.getMicrosecondLength());
}
捕获(例外e){
System.err.println(e.getMessage());
}
}
公共静态void main(字符串[]arrgs){
扫描仪扫描=新扫描仪(System.in);
String notes=scan.next();
对于(int i=0;i
我建议使用标准的调试技术,在每次调用
setUp()
之前,输入
System.out.println()
,检查
文件中的值,以确保每次调用都有唯一的文件值

我猜由于睡眠时间太长,您永远不会到达扫描解析循环的第二次迭代
将比毫秒数大三个数量级,因此您需要将其除以毫秒数。但我没有做太多的文件解析,也没有测试您的代码,因此确保正确的调用将是调试的第一步

最后,为了更正确地使用
Clips
(接下来,我假设这只是一个熟悉
Clips
的测试),我可以建议为所有可能的注释创建一个名为
Clips
的数组,并让代码的第一部分加载每个clip文件吗

然后,在读取文件时,使用一个值调用该文件,其中注释名称的传入字符串被转换为相应的clips[]数组值。例如,如果“a”音频文件位于clips[0]中,则可以使用“0”作为参数调用以下内容

private void playClip(int idx)
{
    clips[idx].setFramePosition(0);
    clips[idx].play();
    Thread.sleep(clips[idx].getMicrosecondLength()/1000);
}

Clips
被设计为存储在内存中并可重复使用的音频。如果您喜欢从文件中读取,则
SourceDataLine
效率更高,因为它会在加载数据缓冲区后立即开始播放,而
Clips
在加载整个文件之前不会开始播放。

Thread.sleep需要毫秒,而不是micr秒你为什么不声明你的自静态?看看是否有效-我不能进一步减少你的投票数很抱歉我尝试使用毫秒,但它不识别函数(未识别)@BenjaminUrquhart“我尝试使用毫秒,但它不识别函数(未识别)”您是否尝试将返回值除以1000?顺便说一句:添加@BenjaminUrquhart(或任何人,
@
很重要)以通知此人新的评论。