diff clojure/com/aurellem/run/music.clj @ 535:2de44c6184ee

refactored functionality of play-midi into midi-bytes for reuse.
author Robert McIntyre <rlm@mit.edu>
date Mon, 25 Jun 2012 14:15:38 -0500
parents a6d060a64246
children 04f61ade7879
line wrap: on
line diff
     1.1 --- a/clojure/com/aurellem/run/music.clj	Mon Jun 25 12:45:57 2012 -0500
     1.2 +++ b/clojure/com/aurellem/run/music.clj	Mon Jun 25 14:15:38 2012 -0500
     1.3 @@ -580,16 +580,15 @@
     1.4       :duty    (zipmap (map :out duty-info)
     1.5                        (map #(get % :duty 0) duty-info))}))
     1.6  
     1.7 -(defn play-midi [#^File midi-file]
     1.8 +(defn midi-bytes [^File midi-file]
     1.9    (let [voice-1-target 0xA000
    1.10          voice-2-target 0xB000
    1.11          noise-target   0xA900
    1.12          program-target 0xC000
    1.13          mini-midi (midi->mini-midi midi-file)
    1.14 -        long-silence (flatten (note-codes 20 0 20001))
    1.15 -        long-noise-silence
    1.16 -        (interleave (range 500) (repeat 0x00) (repeat 255))
    1.17 -        
    1.18 +        long-silence (flatten (note-codes 20 0 5000))
    1.19 +        long-noise-silence 
    1.20 +        (interleave (range 100) (repeat 0x00) (repeat 255))
    1.21          voice-1 (flatten (:voice-1 mini-midi))
    1.22          wave-duty-1 ((:duty mini-midi) 0 0)
    1.23  
    1.24 @@ -597,19 +596,29 @@
    1.25          wave-duty-2 ((:duty mini-midi) 1 0)
    1.26  
    1.27          noise (flatten (:noise mini-midi))
    1.28 -        ]
    1.29 +        kernel (music-kernel wave-duty-1 wave-duty-2)]
    1.30      
    1.31 +    {:voice-1 {:address voice-1-target
    1.32 +               :data  (concat voice-1 long-silence)}
    1.33 +     :voice-2 {:address voice-2-target
    1.34 +               :data (concat voice-2 long-silence)}
    1.35 +     :noise   {:address noise-target
    1.36 +               :data (concat noise long-noise-silence)}
    1.37 +     :kernel  {:address program-target
    1.38 +               :data (music-kernel wave-duty-1 wave-duty-2)}}))
    1.39 +
    1.40 +(defn play-midi [^File midi-file]
    1.41 +  (let [bytes (midi-bytes midi-file)]
    1.42      (-> (second (music-base))
    1.43 -        (set-memory-range voice-1-target long-silence)
    1.44 -        (set-memory-range voice-2-target long-silence)
    1.45 -        (set-memory-range noise-target   long-noise-silence)
    1.46 -        (set-memory-range voice-1-target voice-1)
    1.47 -        (set-memory-range voice-2-target voice-2)
    1.48 -        (set-memory-range noise-target   noise)
    1.49          (set-memory-range
    1.50 -         program-target
    1.51 -         (music-kernel wave-duty-1 wave-duty-2))
    1.52 -        (PC! program-target))))
    1.53 +         (:address (:voice-1 bytes)) (:data (:voice-1 bytes)))
    1.54 +        (set-memory-range
    1.55 +         (:address (:voice-2 bytes)) (:data (:voice-2 bytes)))
    1.56 +        (set-memory-range
    1.57 +         (:address (:noise   bytes)) (:data (:noise   bytes)))
    1.58 +        (set-memory-range
    1.59 +         (:address (:kernel  bytes)) (:data (:kernel bytes)))
    1.60 +        (PC! (:address (:kernel bytes))))))
    1.61  
    1.62  (defn test-noise []
    1.63    (let [noise-pattern