Mercurial > vba-clojure
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