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

Posted

技术标签:

【中文标题】播放短(小于 0:00:500 秒)声音片段【英文标题】:Play short (less than 0:00:500 sec) sound clip 【发布时间】:2018-03-06 23:01:54 【问题描述】:

我遇到了用 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 音符,但是,当涉及到八分音符时,它只是跳过它们。

即:

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();

    

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

【问题讨论】:

Reliably playing a short sound in Java的可能重复 我已经尝试了该主题中提出的所有答案,但是,要么根本不起作用,要么卡在第一个条目上 您最好手动生成指定持续时间的波形,或者使用某种更好地支持持续时间的 MIDI 形式 @MadProgrammer 你能扩展一下吗?如果我使用 MIDI,这是否意味着它会给我集成声音或我将能够使用我自己的声音数据库?您能否给我一些有关如何手动生成波形的文档?抱歉,如果这听起来像一个愚蠢的问题,但我是 Java 的初学者 【参考方案1】:

找到了解决办法。不知道是不是代码坏了,因为我的项目完美运行

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

【讨论】:

以上是关于播放短(小于 0:00:500 秒)声音片段的主要内容,如果未能解决你的问题,请参考以下文章

预加载通过 iPhone AudioServices 播放的声音

如何在 Windows Phone 7 上播放在线声音剪辑?

一次只能播放一个声音片段

Linux命令延长音频文件的持续时间

如何在 iPad 上播放系统按钮点击声音?

使用媒体播放器或声音池在片段内的 onClick 中播放声音