我正在尋找使用Javasound編寫簡單的MIDI驅動音頻音序器。在Javasound中播放多個樣本
我有多個樣本(每個MIDI音高一個)作爲(全局訪問)Map<MidiPitch,AudioInputStream>
加載到內存中。
的javax.sound.midi.Receiver
自定義子類響應輸入的MIDI事件如下:
如果事件是音符上,獲得並播放剪輯如下:
Clip clip = AudioSystem.getClip();
clip.open(lookupAIS(pitch));
clip.start();
剪輯是那麼添加到全球可訪問的Map<MidiPitch,List<Clip>>
,代表開始的剪輯,即其上的start()
已被如上調用但尚未收到音符關事件的剪輯。
如果事件是註銷,的對應列表開始剪輯是從上面的地圖中獲得的。清單頭部的剪輯被刪除,並調用stop()
和close()
。
以上Receiver
以通常的方式連接到MidiSystem.getSequencer()
,那麼以下稱爲:
sequencer.setSequence(MidiSystem.getSequence(new File(myMidFile)))
sequencer.open()
sequencer.start()
Thread.sleep(aLongTime())
sequencer.stop()
sequencer.close()
上述工作當驅動MIDI序列是一個緩慢的節奏,但在更高的節奏,簡單的標誌掛(即使是包含非常少量音符的音序)。
我的理解是clip.start()
在Javaound API的幕後由一個單獨的線程運行。
任何人都可以提出爲什麼會發生這種情況嗎?這可能是同步問題嗎?
編輯:'掛',我的意思是一些筆記被卡住,儘管事實上日誌輸出報告,相應的'停止'方法已被調用。
編輯2:它看起來好像當第二次播放給定音符時掛起的第一個音符發生。即使MIDI序列是單聲道的,即前一個音符已停止,也會發生這種情況。
「掛」是否意味着一些剪輯繼續播放?你能證明(例如,記錄)你的代碼實際上試圖停止該剪輯嗎? –
@CL上面已闡明。 – NietzscheanAI
嗯,我們不會玩猜謎遊戲只是發佈你的代碼你在每一步做什麼都是未知的 - 理論上一切正常 – gpasch