# HG changeset patch # User Robert McIntyre # Date 1336120472 18000 # Node ID 32375de697e5b7d29789b1753b52b40d1e1b5550 # Parent a2ae4213deb7eff8f434d35bf0be04706dfe22c3 implememted automatic detection of tracks. diff -r a2ae4213deb7 -r 32375de697e5 clojure/com/aurellem/run/music.clj --- a/clojure/com/aurellem/run/music.clj Fri May 04 03:01:28 2012 -0500 +++ b/clojure/com/aurellem/run/music.clj Fri May 04 03:34:32 2012 -0500 @@ -402,6 +402,25 @@ :duration length :volume 0}) +(defn track-info [#^File midi-file] + (let [events (parse-midi midi-file) + track-titles (commands :Title_t events) + track-info + (map #(read-string (read-string (:args %))) track-titles) + track-map + (zipmap track-info track-titles)] + track-map)) + +(defn target-tracks + "return the track-numbers in the form [voice-0 voice-1 noise]" + [#^File midi-file] + (let [track-data (track-info midi-file) + track-order + (zipmap (map :out (keys track-data)) + (vals track-data)) + channel-nums (map (comp :channel track-order) (range 3))] + channel-nums)) + (defn commands "return all events where #(= (:command %) command)" [command s] @@ -415,7 +434,7 @@ select-channel (fn [n s] - (sort-by :time (filter #(= n (:channel (:args %))) s))) + (sort-by :time (filter #(= n (:channel %)) s))) channel-on (select-channel track-num note-on-events) @@ -465,8 +484,29 @@ (defn midi->mini-midi [#^File midi-file] - {:track-1 (flatten (midi-track->mini-midi midi-file 0)) - :track-2 (flatten (midi-track->mini-midi midi-file 1))}) + (let [targets (target-tracks midi-file) + get-track (fn [n] + (if (not (nil? n)) + (midi-track->mini-midi midi-file n) + []))] + {:voice-1 (get-track (nth targets 0)) + :voice-2 (get-track (nth targets 1)) + :noise (get-track (nth targets 2))})) + + ;; {:track-1 (flatten (midi-track->mini-midi midi-file 0)) + ;; :track-2 (flatten (midi-track->mini-midi midi-file 1))}) + + + + + +(defn wave-duty + "get desired wave-duty from the file for the particular channel." + [#^File midi-file channel] + + + ) + (defn play-midi [#^File midi-file] (let [track-1-target 0xA000 @@ -475,14 +515,14 @@ mini-midi (midi->mini-midi midi-file) long-silence (flatten (note-codes 20 0 9001)) wave-duty-1 2 - wave-duty-2 2 + wave-duty-2 3 ] (-> (second (music-base)) (set-memory-range track-1-target long-silence) (set-memory-range track-2-target long-silence) - (set-memory-range track-1-target (:track-1 mini-midi)) - (set-memory-range track-2-target (:track-2 mini-midi)) + (set-memory-range track-1-target (flatten (:voice-1 mini-midi))) + (set-memory-range track-2-target (flatten (:voice-2 mini-midi))) (set-memory-range program-target (music-kernel wave-duty-1 wave-duty-2)) diff -r a2ae4213deb7 -r 32375de697e5 music/Friendship is Magic (MLP Theme Song).rg Binary file music/Friendship is Magic (MLP Theme Song).rg has changed diff -r a2ae4213deb7 -r 32375de697e5 music/pony-title.csv --- a/music/pony-title.csv Fri May 04 03:01:28 2012 -0500 +++ b/music/pony-title.csv Fri May 04 03:34:32 2012 -0500 @@ -7,7 +7,7 @@ 1, 0, Time_signature, 4, 2, 24, 8 1, 55680, End_track 2, 0, Start_track -2, 0, Title_t, "main melody" +2, 0, Title_t, "{:voice 0 :duty 2}" 2, 0, Control_c, 0, 91, 0 2, 0, Control_c, 0, 10, 64 2, 0, Control_c, 0, 7, 100 @@ -210,7 +210,7 @@ 2, 55680, Note_off_c, 0, 62, 127 2, 55680, End_track 3, 0, Start_track -3, 0, Title_t, "base" +3, 0, Title_t, "{:voice 1 :duty 3}" 3, 0, Program_c, 1, 18 3, 0, Control_c, 1, 7, 100 3, 0, Control_c, 1, 91, 30 diff -r a2ae4213deb7 -r 32375de697e5 music/pony-title.mid Binary file music/pony-title.mid has changed