comparison clojure/com/aurellem/run/music.clj @ 537:04f61ade7879

allow repositioning of music data.
author Robert McIntyre <rlm@mit.edu>
date Mon, 25 Jun 2012 14:50:28 -0500
parents 2de44c6184ee
children cd557c922cec
comparison
equal deleted inserted replaced
536:c2ee7222a3c4 537:04f61ade7879
323 ])) 323 ]))
324 324
325 (def music-1 0x11) 325 (def music-1 0x11)
326 (def music-2 0x16) 326 (def music-2 0x16)
327 327
328 (defn music-kernel [wave-duty-1 wave-duty-2] 328 (defn music-kernel
329 [voice-1-address
330 voice-2-address
331 noise-address
332 voice-1-wave-duty
333 voice-2-wave-duty]
329 (flatten 334 (flatten
330 [;; global initilization section 335 [;; global initilization section
331 (clear-music-registers) 336 (clear-music-registers)
332 337
333 0x3E 338 0x3E
340 0xE0 345 0xE0
341 0x07 ;; set TAC to 65536 Hz and activate timer 346 0x07 ;; set TAC to 65536 Hz and activate timer
342 347
343 ;; initialize frame 1 348 ;; initialize frame 1
344 0x21 349 0x21
345 0x00 350 (reverse (disect-bytes-2 voice-1-address))
346 0xA0 ;; set HL to 0xA000 == music-start 1 351 ;; set HL to voice-1-address
347 0x0E 352 0x0E
348 0x00 ;; 0->C 353 0x00 ;; 0->C
349 0x06 354 0x06
350 0x00 ;; 0->B 355 0x00 ;; 0->B
351 356
355 0xC5 ;; push CB 360 0xC5 ;; push CB
356 0xE5 ;; push HL 361 0xE5 ;; push HL
357 362
358 ;; initialize frame 2 363 ;; initialize frame 2
359 0x21 364 0x21
360 0x00 365 (reverse (disect-bytes-2 voice-2-address))
361 0xB0 ;; set HL to 0xB000 == music-start 2 366 ;; set HL to voice-2-address
362 367
363 0xF5 ;; push AF 368 0xF5 ;; push AF
364 0xC5 ;; push CB 369 0xC5 ;; push CB
365 0xE5 ;; push HL 370 0xE5 ;; push HL
366 371
367 372
368 ;; initialize frame 3 (noise) 373 ;; initialize frame 3 (noise)
369 0x21 374 0x21
370 0x00 375 (reverse (disect-bytes-2 noise-address))
371 0xA9 ;; 0xA9OO -> HL 376 ;; set HL to noise-address
372 377
373 0xF5 ;; push AF 378 0xF5 ;; push AF
374 0xC5 ;; push CB 379 0xC5 ;; push CB
375 0xE5 ;; push HL 380 0xE5 ;; push HL
376 381
377 ;; main music loop 382 ;; main music loop
378 383
379 0xE8 ;; SP + 12; activate frame 1 384 0xE8 ;; SP + 12; activate frame 1
380 12 385 12
381 (music-step music-1 wave-duty-1 false) 386 (music-step music-1 voice-1-wave-duty false)
382 387
383 0xE8 ;; SP - 6; activate frame 2 388 0xE8 ;; SP - 6; activate frame 2
384 (->signed-8-bit -6) 389 (->signed-8-bit -6)
385 (music-step music-2 wave-duty-2 false) 390 (music-step music-2 voice-1-wave-duty false)
386 391
387 0xE8 ;; SP - 6; activate frame 3 392 0xE8 ;; SP - 6; activate frame 3
388 (->signed-8-bit -6) 393 (->signed-8-bit -6)
389 (music-step nil nil true) 394 (music-step nil nil true)
390 395
579 :noise (midi-track->mini-midi-noise midi-file (nth targets 2)) 584 :noise (midi-track->mini-midi-noise midi-file (nth targets 2))
580 :duty (zipmap (map :out duty-info) 585 :duty (zipmap (map :out duty-info)
581 (map #(get % :duty 0) duty-info))})) 586 (map #(get % :duty 0) duty-info))}))
582 587
583 (defn midi-bytes [^File midi-file] 588 (defn midi-bytes [^File midi-file]
584 (let [voice-1-target 0xA000 589 (let [voice-1-target 0xC400
585 voice-2-target 0xB000 590 voice-2-target 0xC800
586 noise-target 0xA900 591 noise-target 0xCC00
587 program-target 0xC000 592 program-target 0xC000
588 mini-midi (midi->mini-midi midi-file) 593 mini-midi (midi->mini-midi midi-file)
589 long-silence (flatten (note-codes 20 0 5000)) 594 long-silence (flatten (note-codes 20 0 3000))
590 long-noise-silence 595 long-noise-silence
591 (interleave (range 100) (repeat 0x00) (repeat 255)) 596 (interleave (range 20) (repeat 0x00) (repeat 255))
592 voice-1 (flatten (:voice-1 mini-midi)) 597 voice-1 (flatten (:voice-1 mini-midi))
593 wave-duty-1 ((:duty mini-midi) 0 0) 598 wave-duty-1 ((:duty mini-midi) 0 0)
594 599
595 voice-2 (flatten (:voice-2 mini-midi)) 600 voice-2 (flatten (:voice-2 mini-midi))
596 wave-duty-2 ((:duty mini-midi) 1 0) 601 wave-duty-2 ((:duty mini-midi) 1 0)
597 602
598 noise (flatten (:noise mini-midi)) 603 noise (flatten (:noise mini-midi))
599 kernel (music-kernel wave-duty-1 wave-duty-2)] 604 kernel (music-kernel
605 voice-1-target
606 voice-2-target
607 noise-target
608 wave-duty-1 wave-duty-2)]
600 609
601 {:voice-1 {:address voice-1-target 610 {:voice-1 {:address voice-1-target
602 :data (concat voice-1 long-silence)} 611 :data (concat voice-1 long-silence)}
603 :voice-2 {:address voice-2-target 612 :voice-2 {:address voice-2-target
604 :data (concat voice-2 long-silence)} 613 :data (concat voice-2 long-silence)}
605 :noise {:address noise-target 614 :noise {:address noise-target
606 :data (concat noise long-noise-silence)} 615 :data (concat noise long-noise-silence)}
607 :kernel {:address program-target 616 :kernel {:address program-target
608 :data (music-kernel wave-duty-1 wave-duty-2)}})) 617 :data kernel}}))
609 618
610 (defn play-midi [^File midi-file] 619 (defn play-midi [^File midi-file]
611 (let [bytes (midi-bytes midi-file)] 620 (let [bytes (midi-bytes midi-file)]
612 (-> (second (music-base)) 621 (-> (second (music-base))
613 (set-memory-range 622 (set-memory-range