Clojureでmidiを再生してみた。

Clojureでmidiを再生するブログエントリを見つけたので、やってみました。

javax.sound.のラッパー?、clojure-soundを使います。

参考元はこちら↓

まず、Leiningenでプロジェクトを作成。

lein new clojure-sound

project.cljにclojure-soundを追加

  :dependencies [[org.clojure/clojure "1.10.3"]
+               [org.uncomplicate/clojure-sound "0.1.0"]]

nsのrequireにcoreとmidiを追加。

:require で、(2段までだが)ネストして書けるらしい。初めて知ったかも。

 (ns clojure-sound.core
+  (:require [uncomplicate.clojure-sound
+             [core :refer :all]
+             [midi :refer :all]]
+            [uncomplicate.commons.core :refer [close!]]
+            [clojure.java.io :as io]))

適当なmidiファイルを用意。プロジェクトフォルダ/resourcesにコピー。

(def gym (sequence (clojure.java.io/resource "gymnopedies.mid")))
=>{:ticks 114240, :id 545108160}

今回は、以下のサイトからジムノペディiを使わせてもらいました。

シーケンサーを作成して、open!でオープン、sequence!でシーケンサーにシーケンス(楽譜)をセット、start!で再生。

(def sqcr (sequencer))
(open! sqcr)
(sequence! sqcr gym)
(start! sqcr)

ジムノペディが流れました!

曲を途中で止めるなら、stop!でシーケンサーを停止。

終了時は、close! でシーケンサーを閉じる。

(stop! sqcr)
(close! sqcr)

マクロの勉強にwith-open みたいなマクロを作ってみるのも良いかも?