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