当前位置: 首页 > 面试题库 >

为什么Mac上的Java Midi Synth停止播放笔记

贾实
2023-03-14
问题内容

我正在尝试制作一个简单的应用程序,该应用程序可从Midi端口(硬件)读取并将事件转发到软件合成器。除了软合成器会不时播放之外,它通常可以正常工作。我可以看到在日志中转发了midi消息,可以在debug中进行跟踪,并看到该事件到达了synth接收器中的本机代码,但是由于某种原因,该synth不会播放该音符。如果您等待,则声音会再次播放,然后停止,然后再次播放…

这是一个演示问题的演示应用程序。如果按住控制台中的Enter键,您将反复听到一个音符。一段时间(可能不到一分钟)后,声音将停止(如果您按住该按钮,则会发生此事件),然后声音会回来。

import java.io.BufferedReader;
import java.io.InputStreamReader;

import javax.sound.midi.MidiSystem;
import javax.sound.midi.Synthesizer;

public class TestMidi2 {

    public static void main( String[] args ) throws Exception {
        Synthesizer synth = MidiSystem.getSynthesizer();
        synth.open();

        BufferedReader in = new BufferedReader( new InputStreamReader( System.in ) );
        boolean on = true;
        while ( in.readLine() != null ) {
            if ( on ) {
                synth.getChannels()[0].noteOn( 45, 127 );
            } else {
                synth.getChannels()[0].noteOff( 45 );
            }
            on = !on;
        }
    }

}

如果这有所作为,我在MacOS X Lion上(我猜确实如此)。

任何想法?解决方法?我想尝试其他软件合成器,但找不到任何软件。我也愿意尝试硬件Midi合成器,只要它们可以弹奏基本的钢琴,长笛和吉他即可(我不需要任何专业知识,只需像样的声音即可)。

谢谢!


问题答案:

这是一个狮子问题。我正在开发一种将MIDI发送到不同端口并在许多平台上对其进行测试的工具。Java声音合成器适用于Lion以外的所有OS
X-版本。似乎合成器的缓冲区溢出了。发出一些音符后,它会停止播放,如果我发送一拳音符,它将再次开始工作,然后又停止。

但是,可悲的是Java Sound Synthesizer是旧的东西,似乎没有人再支持它了。

除了将其发送给第三方音序器外,有人知道通过Java播放MIDI声音的其他可能性吗?如果只有另一个通用MIDI库,那就太好了。

谢谢,谢谢!



 类似资料:
  • 我创建的Android应用程序包含2个按钮,点击每个按钮播放mp3文件。问题是,当我播放按钮1时,它播放声音1,当我单击按钮2时,它播放声音2。 我检查其他玩家的每个按钮是否正常工作,然后停止并播放单击的按钮 但是,如果我两次单击同一个按钮,则会将第一个音频保持在后台播放,然后再次播放另一个音频 我试图检查并停止它,但它不起作用! 我想,如果我点击按钮1,它将播放声音,如果再次点击它,它将停止播放

  • ap.stopBackgroundAudio(CALLBACK) 停止播放音乐。 代码示例 <script src="https://gw.alipayobjects.com/as/g/h5-lib/alipayjsapi/3.1.1/alipayjsapi.inc.min.js"></script> <style>.output{ display:block; max-width: 100%;

  • 我正在尝试用js制作一架简单的钢琴,但我不想使用音频样本,而是想以编程方式生成声音。要播放单个声音,我正在使用此博客中的此代码 https://marcgg.com/blog/2016/11/01/javascript-audio/ 我发现在玩了大约50次之后,这种方法停止工作。运行此代码时不播放声音, 不会更改并保持 0。如何在不停止播放声音的情况下修复它?

  • 如何在曲目播放期间添加CSS类“playSound”?

  • 函数名称:停止播放音频 函数功能: 停止播放音频 函数方法 media.stop() 返回值 类型 说明 flag boolean true - 正在播放音频,false - 未播放 函数用例 media.playAudio("/sdcard/TouchSprite/res/1.mp3") mSleep(2000) media.stop() flag = media.isPlaying() if

  • 我试图通过使用寻求酒吧听众播放一首歌。但是当我尝试拖动进度条时,它会从歌曲的开头播放。它需要从那个被拖动的位置演奏。 这是我的代码: 如何解决这个问题。提前谢谢。。