# HG changeset patch # User Robert McIntyre # Date 1335192564 18000 # Node ID c709f4857fa9968f17544e78668fd2379391b2ff # Parent a69c4d0c1a3b5a22f7c7224a56c1123d77323041 correctly handles notes longer than 1 second. diff -r a69c4d0c1a3b -r c709f4857fa9 clojure/com/aurellem/run/music.clj --- a/clojure/com/aurellem/run/music.clj Mon Apr 23 09:40:11 2012 -0500 +++ b/clojure/com/aurellem/run/music.clj Mon Apr 23 09:49:24 2012 -0500 @@ -308,24 +308,23 @@ (defn note-codes [frequency volume duration] (assert (<= 0 volume 0xF)) - (loop [current-duration duration - notes []] - - (if (<= 0 duration 0xFF) - (let [frequency-code - (frequency->frequency-code frequency) - volume&high-frequency - (+ (bit-shift-left volume 4) - (bit-shift-right frequency-code 8)) - low-frequency - (bit-and 0xFF frequency-code)] - [note-code - volume&high-frequency - low-frequency - duration]) - (recur (- current-duration 0xFF) - (conj notes (note-codes frequency volume 0xFF)))))) - + (if (<= duration 0xFF) + (let [frequency-code + (frequency->frequency-code frequency) + volume&high-frequency + (+ (bit-shift-left volume 4) + (bit-shift-right frequency-code 8)) + low-frequency + (bit-and 0xFF frequency-code)] + [note-code + volume&high-frequency + low-frequency + duration]) + (vec + (flatten + [(note-codes frequency volume 0xFF) + (note-codes frequency volume (- duration 0xFF))])))) + (defn midi-code->frequency [midi-code] @@ -411,16 +410,16 @@ (def B4 (partial note-codes 493.88)) (def C5 (partial note-codes 523.3)) -;; (def scale -;; (flatten -;; [(C4 0xF 0x40) -;; (D4 0xF 0x40) -;; (E4 0xF 0x40) -;; (F4 0xF 0x40) -;; (G4 0xF 0x40) -;; (A4 0xF 0x40) -;; (B4 0xF 0x40) -;; (C5 0xF 0x40)])) +(def scale + (flatten + [(C4 0xF 0x40) + (D4 0xF 0x40) + (E4 0xF 0x40) + (F4 0xF 0x40) + (G4 0xF 0x40) + (A4 0xF 0x40) + (B4 0xF 0x40) + (C5 0xF 0x40)])) (defn play-music [music-bytes] (let [program-target 0xC000