comparison 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
comparison
equal deleted inserted replaced
534:3f2072b8e457 535:2de44c6184ee
578 :voice-2 (midi-track->mini-midi-voice midi-file (nth targets 1)) 578 :voice-2 (midi-track->mini-midi-voice midi-file (nth targets 1))
579 :noise (midi-track->mini-midi-noise midi-file (nth targets 2)) 579 :noise (midi-track->mini-midi-noise midi-file (nth targets 2))
580 :duty (zipmap (map :out duty-info) 580 :duty (zipmap (map :out duty-info)
581 (map #(get % :duty 0) duty-info))})) 581 (map #(get % :duty 0) duty-info))}))
582 582
583 (defn play-midi [#^File midi-file] 583 (defn midi-bytes [^File midi-file]
584 (let [voice-1-target 0xA000 584 (let [voice-1-target 0xA000
585 voice-2-target 0xB000 585 voice-2-target 0xB000
586 noise-target 0xA900 586 noise-target 0xA900
587 program-target 0xC000 587 program-target 0xC000
588 mini-midi (midi->mini-midi midi-file) 588 mini-midi (midi->mini-midi midi-file)
589 long-silence (flatten (note-codes 20 0 20001)) 589 long-silence (flatten (note-codes 20 0 5000))
590 long-noise-silence 590 long-noise-silence
591 (interleave (range 500) (repeat 0x00) (repeat 255)) 591 (interleave (range 100) (repeat 0x00) (repeat 255))
592
593 voice-1 (flatten (:voice-1 mini-midi)) 592 voice-1 (flatten (:voice-1 mini-midi))
594 wave-duty-1 ((:duty mini-midi) 0 0) 593 wave-duty-1 ((:duty mini-midi) 0 0)
595 594
596 voice-2 (flatten (:voice-2 mini-midi)) 595 voice-2 (flatten (:voice-2 mini-midi))
597 wave-duty-2 ((:duty mini-midi) 1 0) 596 wave-duty-2 ((:duty mini-midi) 1 0)
598 597
599 noise (flatten (:noise mini-midi)) 598 noise (flatten (:noise mini-midi))
600 ] 599 kernel (music-kernel wave-duty-1 wave-duty-2)]
601 600
601 {:voice-1 {:address voice-1-target
602 :data (concat voice-1 long-silence)}
603 :voice-2 {:address voice-2-target
604 :data (concat voice-2 long-silence)}
605 :noise {:address noise-target
606 :data (concat noise long-noise-silence)}
607 :kernel {:address program-target
608 :data (music-kernel wave-duty-1 wave-duty-2)}}))
609
610 (defn play-midi [^File midi-file]
611 (let [bytes (midi-bytes midi-file)]
602 (-> (second (music-base)) 612 (-> (second (music-base))
603 (set-memory-range voice-1-target long-silence)
604 (set-memory-range voice-2-target long-silence)
605 (set-memory-range noise-target long-noise-silence)
606 (set-memory-range voice-1-target voice-1)
607 (set-memory-range voice-2-target voice-2)
608 (set-memory-range noise-target noise)
609 (set-memory-range 613 (set-memory-range
610 program-target 614 (:address (:voice-1 bytes)) (:data (:voice-1 bytes)))
611 (music-kernel wave-duty-1 wave-duty-2)) 615 (set-memory-range
612 (PC! program-target)))) 616 (:address (:voice-2 bytes)) (:data (:voice-2 bytes)))
617 (set-memory-range
618 (:address (:noise bytes)) (:data (:noise bytes)))
619 (set-memory-range
620 (:address (:kernel bytes)) (:data (:kernel bytes)))
621 (PC! (:address (:kernel bytes))))))
613 622
614 (defn test-noise [] 623 (defn test-noise []
615 (let [noise-pattern 624 (let [noise-pattern
616 (concat (interleave (range 0x100) (repeat 0xF0) (repeat 255)) 625 (concat (interleave (range 0x100) (repeat 0xF0) (repeat 255))
617 (interleave (range 10) (repeat 0x00) (repeat 255)))] 626 (interleave (range 10) (repeat 0x00) (repeat 255)))]