                       :notes notes
                       :displacement 0
                       :attack 64
-                      :release 64
+                      :release 0
                       :channel-pressure 0
                       :pitch-bend 8192
                       :key-pressure 0
                       :position (.getTickPosition sequencer)
                       :tie nil
-                      :key 0
+                      :key 60
                       :key-type ShortMessage/NOTE_ON
                       :channel 0
                       :track 0
                       :key-signature {}
+                      :time-signature [4 4]
+                      :transpose 0
                       :octave 4
                       :param :octave
                       :cc-value 0

                      :length (Math/abs (* 4.0 length ppq))
                      :notes (rest notes)})
        (symbol? length)
        (if-let [m (re-matches #"(-|)((?:[dwhqistxofjk]\.*)+)" (name length))]
          (let [length-map {"d" 2 "w" 1 "h" 1/2 "q" 1/4 "i" 1/8 "s" 1/16 "t" 1/32
                            "x" 1/64 "o" 1/128 "f" 1/256 "j" 1/512 "k" 1/1024}]
            (merge state {:key (if (= "-" (get m 1)) nil (:key state))
                          :length (reduce +
                                          (map #(* 4.0
                                                   (get length-map (get % 1))
                                                   (- 2.0 (/ 1.0 (reduce * (repeat (count (get % 2)) 2))))
                                                   ppq)
                                               (re-seq #"\G([dwhqistxofjk])(\.*)" (get m 2))))
                          :notes (rest notes)}))
          (if-let [m (re-matches #"([-=])[-=]*" (name length))]
            (merge state {:length (* (:length state) (count (name length)))

                            :param nil
                            :notes (rest notes)})
              ;; channel pressure, pitch bend, note on/off / key pressure by key number
              (if-let [m (re-matches #"(&&|\^|&k|k|-k)(>+|<+|)(-?(?:[0-9]+|[0-9]*\.[0-9]+|[0-9]+\.[0-9]*)(?:[eE]-?[0-9]+)?|)(-|)" note)]
                (let [max-value (if (= "^" (get m 1)) 16384 128)
                      value (if (re-find #"[.eE]" (get m 3))
                              (max 0 (min max-value (int (* (Double. (get m 3)) max-value))))
                              (mod (if (= "" (get m 3))
                                     (if (= "" (get m 2)) 0 1)
                                     (Integer. (get m 3))) max-value))
                      param ({"&&" :channel-pressure "^" :pitch-bend "&k" :key-pressure "k" :key} (get m 1))
                      old-value (get state param)
                      value (cond
