2011-10-13 43 views
4

我正在試圖製作一個簡單的應用程序,可以從midi端口(硬件)讀取並將事件轉發到軟件合成器。它主要工作,除了軟合成器不時播放。我可以看到midi消息在日誌中轉發,我可以在調試中跟蹤並查看事件到達合成器接收器中的本機代碼,但由於某種原因,合成器不會播放該註釋。如果你等待聲音再次播放,然後停止,然後再播放...爲什麼mac midi合成器在mac上停止播放音符

這是一個演示應用程序,顯示問題。如果您在控制檯中按住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獅子,如果這有所作爲(我猜是這樣)。

有什麼想法?解決方法?我想嘗試其他軟件合成器,但找不到任何。我也願意嘗試硬件midi合成器,只要他們可以演奏基本的鋼琴,長笛和吉他(我不需要任何東西,只是體面的聲音)。

謝謝!

回答

2

這是一個獅子問題。我正在開發一個工具,它將MIDI發送到不同的端口並在多個平臺上進行測試。 Java Sound Synthesizer適用於除Lion之外的所有OS X版本。在那裏看起來像合成器的緩衝區溢出。幾個音符後,它停止播放,如果我發送筆記一拳它再次開始工作,並再次停止,..

不幸的是,Java聲音合成器是一箇舊東西,似乎沒有人再支持它。

有誰知道通過Java播放MIDI聲音的其他可能性,除了將它發送給第三方音序器嗎?如果會有另一個通用MIDI庫那樣會很好。

謝謝你和格力!

+0

感謝您的答覆。我所做的是使用「音頻MIDI設置」實用程序設置虛擬MIDI連接,並使用邏輯表達式作爲合成器。缺點是你需要一個外部軟件合成器($$,除非你使用的車庫頻帶是有限的,因爲它讀取所有midi輸入設備),但是你的聲音比一般midi音色庫中的更好。 –

+0

該死的我以爲這只是我!有一天我提交了一個關於這個問題的錯誤報告。 – Ben

+0

自Java 6以來,有一種替代品可用:Gervill。 它工作正常,可以加載soundbanks,因此,提供了很大的靈活性。 在Java <7中,它可以通過以下VM參數激活: -Dsun.sound.useNewAudioEngine = true Java 7不再需要此參數。 –

0

你的問題是不是與MIDI,它與此:

while (in.readLine() != null)

你按住Enter鍵,這使得環路非常快速地執行多次。你的代碼將打開和關閉註釋的速度與輸入緩衝區可以接收數據的速度一樣快,並且它會連續發出聲音,但我敢打賭,如果你要讀取midi信號,你將會有數百個跨度幾秒鐘。您的聲音可能會停止,因爲合成器無法處理您饋送的大量MIDI數據。

嘗試只按一次輸入,看看是否保持連續的音符去。

我會研究一種更好的方法來讀取您的程序中的密鑰。請參閱this SO question以獲取可能的方法。

+0

這只是一個演示代碼。實際的軟件從硬件設備(鼓墊)讀取midi,即使我玩的很慢,我也會得到相同的結果。在那裏只能得到一個快速和骯髒的輸入法。無論如何,感謝您的答覆... –