                            (or (= "k" (get m 1)) (= "-k" (get m 1)))
                            {:message-type ShortMessage/NOTE_ON
                             :tie (cond
-                                   (= "-k" (get m 1)) :end
-                                   (= "-" (get m 5)) :begin
+                                   (= "_k" (get m 1)) :end
+                                   (= "_" (get m 5)) :begin
                                    :else nil)
                             param value
                             :param param}

           [com.sun.media.sound SF2Soundbank]))

(defn ratio [value]
  (toRatio value))

(defn env [num-points values & args]
  (let [args (if (empty? args) '(:cubic) args)
        interp (apply interpolate-parametric values args)
        fix-type (cond
                   (every? ratio? values) toRatio
                   (every? integer? values) int
                   :else double)]
    (map #(fix-type (interp %)) (range 0 1 (/ 1.0 num-points)))))

(defn vec-rest [coll]
  (if (vector? coll)

;;    - get a unique set of channels from the intersecting notes
;;    - choose to play on the next available channel on the channel list
;;    - if no channels are available, play on the next channel/least used channel
;;   :time-signature [4 4]
;;   add shortcuts for intervals, chords, key signatures, dynamics
;;   DAW recording interface for capturing param values / performances
;;   convenient meta message functions
;;   convenient sysex function
;;   SMPTE time
