1

javax.sound.midiライブラリを使用して MIDI ファイルを再生するClojure コードの短いスニペットがあります。問題は、再生時にシーケンスが頻繁に約 20 ~ 30 秒間再生を一時停止してから再開することです。コードのスニペットは次のとおりです。

;; given a string representing path to midi file, evaluate to a Sequence object
(defn read-midi-file [s]
  (if (nil? (re-matches #"[^\r\n]+.(mid|midi)" s))
    (throw (InvalidMidiDataException. "Invalid MIDI file."))
    (try
      (MidiSystem/getSequence (java.io.File. s))
      (catch Exception e
        (throw (IOException. "Could not read MIDI file."))))))

;; play the midi sequence back
(defn play-midi-file [mseq]
  (let [sequencer (MidiSystem/getSequencer)]
    (.open sequencer)
    (.setSequence sequencer mseq)
    (.start sequencer)))  ; TODO: add MetaEventListener to determine when to stop

(play-midi-file (read-midi-file "/path/to/file/test.mid"))

念のためjavax.sound.midi.Synthesizer、REPL でのオブジェクトのレイテンシーを確認しました。

user> (* 0.001 (.getLatency (javax.sound.midi.MidiSystem/getSynthesizer)))
11.61

これらのライブラリを使用した MIDI 再生の経験がある人はいますか?もしそうなら、再生が断続的に一時停止する原因は何ですか? システム情報は次のとおりです。

user> (-> (javax.sound.midi.MidiSystem/getSynthesizer) .getDeviceInfo bean)
{:version "Version 1.0", :vendor "Sun Microsystems", :name "Java Sound Synthesizer", :description \
"Software wavetable synthesizer and receiver", :class com.sun.media.sound.MixerSynth$MixerSynthInf\
o}

user> (map #(System/getProperty %) ["java.version" "java.vm.version" "os.name"])
("1.6.0_51" "20.51-b01-457" "Mac OS X")
4

0 に答える 0