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