Mercurial > vba-clojure
changeset 433:985c90ffa1fe
paramaterized do-message
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Wed, 25 Apr 2012 01:56:39 -0500 |
parents | 8e88366a81b9 |
children | 988f0fda6c93 |
files | clojure/com/aurellem/run/music.clj |
diffstat | 1 files changed, 64 insertions(+), 65 deletions(-) [+] |
line wrap: on
line diff
1.1 --- a/clojure/com/aurellem/run/music.clj Tue Apr 24 23:51:30 2012 -0500 1.2 +++ b/clojure/com/aurellem/run/music.clj Wed Apr 25 01:56:39 2012 -0500 1.3 @@ -114,11 +114,11 @@ 1.4 1.5 (defn clear-music-registers [] 1.6 (flatten 1.7 - [(store (Integer/parseInt "00000000" 2) 0xFF10) 1.8 - (store (Integer/parseInt "00000000" 2) 0xFF11) 1.9 - (store (Integer/parseInt "00000000" 2) 0xFF12) 1.10 - (store (Integer/parseInt "00000000" 2) 0xFF13) 1.11 - (store (Integer/parseInt "00000000" 2) 0xFF14) 1.12 + [(store (Integer/parseInt "00000000" 2) 0xFF10) ;; sweep 1.13 + (store (Integer/parseInt "00000000" 2) 0xFF11) ;; pattern duty 1.14 + (store (Integer/parseInt "00000000" 2) 0xFF12) ;; volume 1.15 + (store (Integer/parseInt "00000000" 2) 0xFF13) ;; frequency-low 1.16 + (store (Integer/parseInt "00000000" 2) 0xFF14) ;; frequency-high 1.17 1.18 (store (Integer/parseInt "00000000" 2) 0xFF16) ;; pattern duty 000000 1.19 (store (Integer/parseInt "00000000" 2) 0xFF17) ;; volume 0000 1.20 @@ -131,10 +131,11 @@ 1.21 (store (Integer/parseInt "00000000" 2) 0xFF1D) 1.22 (store (Integer/parseInt "00000000" 2) 0xFF1E) 1.23 1.24 - (store (Integer/parseInt "00000000" 2) 0xFF20) 1.25 - (store (Integer/parseInt "00000000" 2) 0xFF21) 1.26 - (store (Integer/parseInt "00000000" 2) 0xFF22) 1.27 - (store (Integer/parseInt "00000000" 2) 0xFF23)])) 1.28 + (store (Integer/parseInt "00000000" 2) 0xFF20) ;; length 1.29 + (store (Integer/parseInt "00000000" 2) 0xFF21) ;; volume 1.30 + (store (Integer/parseInt "00000000" 2) 0xFF22) ;; noise-frequency 1.31 + (store (Integer/parseInt "00000000" 2) 0xFF23) ;; control 1.32 + ])) 1.33 1.34 1.35 ;; mini-midi syntax 1.36 @@ -169,69 +170,68 @@ 1.37 "Read the message which starts at the current value of HL and do 1.38 what it says. Duration is left in A, and HL is advanced 1.39 appropraitely." 1.40 - [] 1.41 - (let [switch 1.42 - [0x2A ;; load message code into A, increment HL 1.43 - 1.44 - ;; switch on message 1.45 - 0xFE 1.46 - note-code 1.47 - 1.48 - 0x20 1.49 - :note-length] 1.50 + ([] (do-message 0x16)) 1.51 + ([sound-base-address] 1.52 + (let [switch 1.53 + [0x2A ;; load message code into A, increment HL 1.54 + 1.55 + ;; switch on message 1.56 + 0xFE 1.57 + note-code 1.58 + 1.59 + 0x20 1.60 + :note-length] 1.61 1.62 - play-note 1.63 - [0x2A ;; load volume/frequency-high info 1.64 - 0xF5 ;; push A 1.65 - 0xE6 1.66 - (Integer/parseInt "11110000" 2) ;; volume mask 1.67 - 0xE0 1.68 - 0x17 ;; set volume 1.69 - 0xF1 ;; pop A 1.70 - 0xE6 1.71 - (Integer/parseInt "00000111" 2) ;; frequency-high mask 1.72 - 0xE0 1.73 - 0x19 ;; set frequency-high 1.74 - 1.75 - 0x2A ;; load frequency low-bits 1.76 - 0xE0 1.77 - 0x18 ;; set frequency-low-bits 1.78 - 1.79 - 0x2A]] ;; load duration 1.80 - (replace 1.81 - {:note-length (count play-note)} 1.82 - (concat switch play-note)))) 1.83 + play-note 1.84 + [0x2A ;; load volume/frequency-high info 1.85 + 0xF5 ;; push A 1.86 + 0xE6 1.87 + (Integer/parseInt "11110000" 2) ;; volume mask 1.88 + 0xE0 1.89 + (inc sound-base-address) ;;0x17 ;; set volume 1.90 + 0xF1 ;; pop A 1.91 + 0xE6 1.92 + (Integer/parseInt "00000111" 2) ;; frequency-high mask 1.93 + 0xE0 1.94 + (+ 3 sound-base-address) ;;0x19 ;; set frequency-high 1.95 + 1.96 + 0x2A ;; load frequency low-bits 1.97 + 0xE0 1.98 + (+ 2 sound-base-address) ;;0x18 ;; set frequency-low-bits 1.99 + 0x2A]] ;; load duration 1.100 + (replace 1.101 + {:note-length (count play-note)} 1.102 + (concat switch play-note))))) 1.103 1.104 -(defn play-note 1.105 - "Play the note referenced by HL in the appropiate channel. 1.106 - Leaves desired-duration in A." 1.107 - [] 1.108 - [0x2A ;; load volume/frequency-high info 1.109 - 0xF5 ;; push A 1.110 - 0xE6 1.111 - (Integer/parseInt "11110000" 2) ;; volume mask 1.112 - 0xE0 1.113 - 0x17 ;; set volume 1.114 - 0xF1 ;; pop A 1.115 - 0xE6 1.116 - (Integer/parseInt "00000111" 2) ;; frequency-high mask 1.117 - 0xE0 1.118 - 0x19 ;; set frequency-high 1.119 +;; (defn play-note 1.120 +;; "Play the note referenced by HL in the appropiate channel. 1.121 +;; Leaves desired-duration in A." 1.122 + 1.123 +;; [0x2A ;; load volume/frequency-high info 1.124 +;; 0xF5 ;; push A 1.125 +;; 0xE6 1.126 +;; (Integer/parseInt "11110000" 2) ;; volume mask 1.127 +;; 0xE0 1.128 +;; 0x17 ;; set volume 1.129 +;; 0xF1 ;; pop A 1.130 +;; 0xE6 1.131 +;; (Integer/parseInt "00000111" 2) ;; frequency-high mask 1.132 +;; 0xE0 1.133 +;; 0x19 ;; set frequency-high 1.134 1.135 - 0x2A ;; load frequency low-bits 1.136 - 0xE0 1.137 - 0x18 ;; set frequency-low-bits 1.138 +;; 0x2A ;; load frequency low-bits 1.139 +;; 0xE0 1.140 +;; 0x18 ;; set frequency-low-bits 1.141 1.142 - 0x2A ;; load duration 1.143 - ]) 1.144 +;; 0x2A ;; load duration 1.145 +;; ]) 1.146 1.147 (defn music-step [] 1.148 ;; C == current-ticks 1.149 ;; A == desired-ticks 1.150 1.151 (flatten 1.152 - [ 1.153 - 0xF5 ;; push A 1.154 + [0xF5 ;; push A 1.155 0xF0 1.156 0x05 ;; load current ticks from 0xF005 1.157 0xB8 ;; 1.158 @@ -279,11 +279,10 @@ 1.159 0x00 ;; 0->C 1.160 0x06 1.161 0x00 ;; 0->B 1.162 + 0xAF ;; 0->A 1.163 1.164 1.165 - 1.166 - 0xAF ;; initialiaze A to zero 1.167 - 1.168 + 1.169 1.170 (music-step) 1.171 0x18