Oops.
[AROS-Contrib.git] / Games / Doom / doomsound.library.s
blob586cefeeebff00cfe7717b56183b1b4afde4a37b
1 ;------------------------------------------------------------------------
2 ; Sound Library for DOOM - by Joseph Fenton
4 ; Functions:
5 ; Sfx_SetVol - pass in the new sound effects volume in d0.
6 ; Sfx_Start - pass in new sound effect to play. a0 = wave,
7 ; d0 = cnum, d1 = pitch, d2 = vol, d3 = sep, d4 =
8 ; length.
9 ; Sfx_Update - pass in new settings for a sfx. a0 = data,
10 ; d0 = cnum, d1 = pitch, d2 = vol, d3 = sep.
11 ; Sfx_Stop - stop a playing sound effect. d0 = cnum.
12 ; Sfx_Done - check if sound effect playing. d0 = cnum; returns
13 ; d0 = 0 if not playing/current index if playing.
14 ; Mus_SetVol - pass in the new music volume in d0.
15 ; Mus_Register - pass in pointer to MUS data to register in
16 ; a0. Returns handle in d0.
17 ; Mus_Unregister - pass in handle to music to unregister in d0.
18 ; Mus_Play - pass in handle to music to start playing in d0,
19 ; pass the looping flag in d1.
20 ; Mus_Stop - pass in handle to music to stop playing in d0.
21 ; Mus_Pause - pass in handle to music to pause in d0.
22 ; Mus_Resume - pass in handle to music to resume in d0.
23 ; Mus_Done - return d0 = 0 if music not playing
25 ;------------------------------------------------------------------------
28 _custom equ $DFF000
30 ;------------------------------------------------------------------------
32 include devpac:system.gs ; all includes/LVOs
34 ; include "exec/exec.i"
35 ; include "exec/funcdef.i"
36 ; include "exec/exec_lib.i"
37 ; include "dos/dos.i"
38 ; include "dos/dos_lib.i"
39 ; include "graphics/gfxbase.i"
40 ; include "devices/audio.i"
41 ; include "hardware/custom.i"
42 ; include "hardware/intbits.i"
43 ; include "hardware/dmabits.i"
45 ;CALLSYS macro
46 ; jsr (_LVO\1,a6)
47 ; endm
49 ;CALLDOS macro
50 ; movea.l (_DOSBase,pc),a6
51 ; jsr (_LVO\1,a6)
52 ; endm
54 output libs:doomsound.library
56 ;------------------------------------------------------------------------
58 VERSION equ 37 ;Version #
59 REVISION equ 0 ;revision of the version
61 _VER equ (VERSION/10)
62 VERHIGH equ _VER|$30
63 VERLOW equ (VERSION-(_VER*10))|$30
64 _REV equ (REVISION/10)
65 REVHIGH equ _REV|$30
66 REVLOW equ (REVISION-(_REV*10))|$30
68 OUTPUT_VER MACRO
69 ifge VERHIGH-$31
70 dc.b VERHIGH
71 endc
72 dc.b VERLOW
73 dc.b '.'
74 ifge REVHIGH-$31
75 dc.b REVHIGH
76 endc
77 dc.b REVLOW
78 ENDM
80 OUTPUT_DATE MACRO
81 dc.b ' (29.3.98)'
82 ENDM
85 ;--------------------------------------------------------------------
86 ; in case of idiots
88 moveq #0,d0
89 rts
91 ;--------------------------------------------------------------------
92 ; standard library header
95 InitDescript dc.w $4AFC ;this is the magic cookie
96 dc.l InitDescript
97 dc.l EndCode ;end of code to checksum
98 dc.b RTF_AUTOINIT
99 dc.b VERSION ;version #
100 dc.b NT_LIBRARY ;node type (library)
101 dc.b 0 ;node priority
102 dc.l Name ;pointer to the library name
103 dc.l IDString ;pointer to ID string
104 dc.l Init ;pointer to initialization data
107 Name dc.b 'doomsound.library',0
108 even
110 IDString dc.b 'doomsound.library '
111 OUTPUT_VER
112 OUTPUT_DATE
113 dc.b ' ©1998 by Joe Fenton.',0
114 even
117 CNOP 0,4
119 Init dc.l LIB_SIZE
120 dc.l FuncTable
121 dc.l DataTable
122 dc.l InitRoutine
125 FuncTable dc.l OpenLib ; -6
126 dc.l CloseLib ; -12
127 dc.l Expunge ; -18
128 dc.l Reserved ; -24
130 dc.l Sfx_SetVol ; -30
131 dc.l Sfx_Start ; -36
132 dc.l Sfx_Update ; -42
133 dc.l Sfx_Stop ; -48
134 dc.l Sfx_Done ; -54
136 dc.l Mus_SetVol ; -60
137 dc.l Mus_Register ; -66
138 dc.l Mus_Unregister ; -72
139 dc.l Mus_Play ; -78
140 dc.l Mus_Stop ; -84
141 dc.l Mus_Pause ; -90
142 dc.l Mus_Resume ; -96
143 dc.l Mus_Done ; -102
145 dc.l -1
148 DataTable INITBYTE LN_TYPE,NT_LIBRARY
149 INITLONG LN_NAME,Name
150 INITBYTE LIB_FLAGS,LIBF_SUMUSED+LIBF_CHANGED
151 INITWORD LIB_VERSION,VERSION
152 INITWORD LIB_REVISION,REVISION
153 INITLONG LIB_IDSTRING,IDString
154 dc.l 0
157 ;--------------------------------------
158 ; A0 = library segment list
159 ; A6 = ExecBase
160 ; D0 = library pointer
162 ; D0 -> library base or NULL
164 CNOP 0,16
166 InitRoutine move.l a6,_ExecBase
167 move.l a5,-(a7) ;save a5
168 movea.l d0,a5 ;library base pointer
169 move.l a0,SegList ;save library seglist
171 bsr InitServer ;setup sound server
172 bne.b .err
174 move.l a5,d0 ;success ...
175 movea.l (a7)+,a5
178 .err moveq #0,d0 ;error
179 movea.l (a7)+,a5
183 ;--------------------------------------
185 CNOP 0,16
187 OpenLib addq.w #1,LIB_OPENCNT(a6)
188 move.l a6,d0
192 ;--------------------------------------
193 ; this library is auto-expunging
195 CNOP 0,16
197 CloseLib subq.w #1,LIB_OPENCNT(a6)
198 beq.b Expunge
199 ;still open
200 moveq #0,d0 ;no seglist
204 ;--------------------------------------
205 ; A6 = library base
207 ; D0 -> seglist or NULL
209 CNOP 0,16
211 Expunge tst.w LIB_OPENCNT(a6) ;library still open?
212 bne .LibStillOpen ;yes
214 bsr ExitServer ;cleanup sound server
216 IFND TESTING
217 move.l SegList,d0 ;get the seglist
218 movem.l d0/a5-a6,-(a7) ;delayed save
219 movea.l a6,a5 ;library base => A5
220 movea.l a5,a1 ;library node
221 movea.l _ExecBase,a6
222 CALLSYS Remove ;unlink msmmu.library
224 movea.l a5,a1 ;calculate lib size
225 moveq #0,d0 ;and free memory
226 move.w LIB_NEGSIZE(a5),d0 ;backward extent
227 suba.w d0,a1 ;low memory extent
228 add.w LIB_POSSIZE(a5),d0 ;forward extent
229 CALLSYS FreeMem ;give it back
230 movem.l (a7)+,d0/a5-a6 ;seglist=>D0
231 ENDC
235 .LibStillOpen moveq #0,d0 ;no seglist
239 ;--------------------------------------
241 CNOP 0,4
243 Reserved moveq.l #0,d0
247 EndCode:
249 ;--------------------------------------------------------------------
251 dc.b 'This sound library uses the Amiga audio.device and',0
252 dc.b '11KHz samples; it supports full stereo panning on',0
253 dc.b 'sound effects and music. Up to 16 sound effects and',0
254 dc.b '16 channels of music can be palying at any time.',0
256 ;--------------------------------------------------------------------
258 CNOP 0,16
260 InitServer movem.l d1-d7/a0-a6,-(a7)
261 movea.l _ExecBase,a6
263 moveq #0,d0
264 lea DOSName,a1
265 CALLSYS OpenLibrary
266 move.l d0,_DOSBase
267 beq .err ; couldn't open dos.library
269 moveq #39,d0
270 lea GfxName,a1
271 CALLSYS OpenLibrary
272 tst.l d0
273 beq.b .2 ; leave at default (NTSC)
274 move.l d0,a1
275 btst #REALLY_PALn,gb_DisplayFlags(a1)
276 beq.b .1 ; crystal is NTSC
277 move.w #322,period ; PAL sample rate
278 .1 CALLSYS CloseLibrary
280 .2 move.l #128*256,d0
281 move.l #MEMF_CLEAR+MEMF_FAST+MEMF_PUBLIC,d1
282 CALLSYS AllocVec
283 move.l d0,LookupMem
284 beq .err0 ; no memory for vol_lookup
285 move.l d0,vol_lookup
286 movea.l d0,a0
288 moveq #0,d2
289 moveq #0,d1
290 .3 move.b d1,d3
291 ext.w d3
292 muls.w d2,d3
293 divs.w #127,d3 ; i*j/127
294 move.b d3,(a0)+
295 addq.b #1,d1
296 bne.b .3
297 addq.b #1,d2
298 cmpi.b #128,d2
299 bne.b .3
301 CALLSYS CreateMsgPort
302 move.l d0,AudioPort
303 beq .err1 ; couldn't create port
304 movea.l d0,a0
305 move.l #ioa_SIZEOF,d0
306 CALLSYS CreateIORequest
307 move.l d0,AudioIO
308 beq .err2 ; couldn't create io
310 movea.l d0,a1
311 moveq #0,d0
312 moveq #0,d1
313 lea AudioName,a0
314 CALLSYS OpenDevice
315 tst.l d0
316 bne .err3 ; couldn't open audio.device
318 movea.l AudioIO,a1
319 move.w #ADCMD_ALLOCATE,IO_COMMAND(a1)
320 move.b #ADIOF_NOWAIT+IOF_QUICK,IO_FLAGS(a1)
321 move.l #AudioAlloc,ioa_Data(a1)
322 move.l #1,ioa_Length(a1)
323 movea.l IO_DEVICE(a1),a6
324 jsr DEV_BEGINIO(a6)
325 movea.l _ExecBase,a6
326 tst.l d0
327 bne .err4 ; couldn't allocate channels
329 movea.l AudioIO,a1
330 move.w #ADCMD_LOCK,IO_COMMAND(a1)
331 CALLSYS SendIO
333 lea _custom,a0
334 move.w #$0780,intena(a0) ; kill int enable
335 move.w #$0780,intreq(a0) ; kill request
336 move.w #$00FF,adkcon(a0) ; kill modulation
337 move.w #$000F,dmacon(a0) ; disable dma
339 move.l #ClearBuf,aud0(a0)
340 move.w #40,aud0+ac_len(a0)
341 move.w period,aud0+ac_per(a0)
342 move.w #0,aud0+ac_vol(a0)
344 move.l #ClearBuf,aud1(a0)
345 move.w #40,aud1+ac_len(a0)
346 move.w period,aud1+ac_per(a0)
347 move.w #0,aud1+ac_vol(a0)
349 move.l #ClearBuf,aud2(a0)
350 move.w #40,aud2+ac_len(a0)
351 move.w period,aud2+ac_per(a0)
352 move.w #0,aud2+ac_vol(a0)
354 move.l #ClearBuf,aud3(a0)
355 move.w #40,aud3+ac_len(a0)
356 move.w period,aud3+ac_per(a0)
357 move.w #0,aud3+ac_vol(a0)
359 moveq #INTB_AUD0,d0
360 lea AInt0,a1
361 CALLSYS SetIntVector
362 move.l d0,OldAInt0
364 move.l #QuietInst,Channel0
365 move.l #QuietInst,Channel1
366 move.l #QuietInst,Channel2
367 move.l #QuietInst,Channel3
368 move.l #QuietInst,Channel4
369 move.l #QuietInst,Channel5
370 move.l #QuietInst,Channel6
371 move.l #QuietInst,Channel7
372 move.l #QuietInst,Channel8
373 move.l #QuietInst,Channel9
374 move.l #QuietInst,Channel10
375 move.l #QuietInst,Channel11
376 move.l #QuietInst,Channel12
377 move.l #QuietInst,Channel13
378 move.l #QuietInst,Channel14
379 move.l #QuietInst,Channel15
381 clr.b mus_playing
382 clr.b mus_looping
384 clr.l MusDelay ; MusDelay = 0
385 clr.l VoiceAvail ; all voices available
387 CALLSYS Disable
388 lea _custom,a0
389 move.w #$8080,intena(a0) ; int enable
390 move.w #$800F,dmacon(a0) ; enable dma
391 bsr AudioINT0 ; start audio
392 CALLSYS Enable
394 movem.l (a7)+,d1-d7/a0-a6
395 moveq #0,d0 ; okay
398 .err4 movea.l AudioIO,a1
399 CALLSYS CloseDevice
401 .err3 movea.l AudioIO,a0
402 CALLSYS DeleteIORequest
404 .err2 movea.l AudioPort,a0
405 CALLSYS DeleteMsgPort
407 .err1 movea.l LookupMem,a1
408 CALLSYS FreeVec
410 .err0 movea.l _DOSBase,a1
411 CALLSYS CloseLibrary
413 .err movem.l (a7)+,d1-d7/a0-a6
414 moveq #-1,d0 ; error
417 ;--------------------------------------
419 CNOP 0,16
421 ExitServer movem.l d1-d7/a0-a6,-(a7)
423 lea _custom,a0
424 move.w #$0780,intena(a0) ; kill int enable
425 move.w #$0780,intreq(a0) ; kill request
426 move.w #$000F,dmacon(a0) ; dma off
428 moveq #INTB_AUD0,d0
429 movea.l OldAInt0,a1
430 movea.l _ExecBase,a6
431 CALLSYS SetIntVector
433 movea.l AudioIO,a1
434 move.w #ADCMD_FREE,IO_COMMAND(a1)
435 move.b #IOF_QUICK,IO_FLAGS(a1)
436 movea.l IO_DEVICE(a1),a6
437 jsr DEV_BEGINIO(a6)
439 movea.l _ExecBase,a6
441 movea.l AudioIO,a1
442 CALLSYS CloseDevice
444 movea.l AudioIO,a0
445 CALLSYS DeleteIORequest
447 movea.l AudioPort,a0
448 CALLSYS DeleteMsgPort
450 movea.l LookupMem,a1
451 CALLSYS FreeVec
453 movea.l _DOSBase,a1
454 CALLSYS CloseLibrary
456 movem.l (a7)+,d1-d7/a0-a6
457 moveq #0,d0
460 ;--------------------------------------
462 CNOP 0,16
464 Sfx_SetVol move.w d0,sfx_volume
467 ;--------------------------------------
469 CNOP 0,16
471 Sfx_Start movem.l d0-d4/a0-a2,-(a7)
472 lea sfxVoiceTbl,a1
473 movea.l (a1,d0.w*4),a1
474 lea 8(a0),a0
475 subq.l #8,d4
476 move.l a0,vc_Wave(a1)
477 clr.l vc_Index(a1)
478 swap d1
479 clr.w d1
480 divu.l #11025,d1
481 move.l d1,vc_Step(a1)
482 clr.l vc_Loop(a1)
483 lsl.l #8,d4
484 move.l d4,vc_Length(a1)
486 addq.w #1,d3 ; sep += 1
487 move.w d2,d4
488 muls.w d3,d4
489 muls.w d3,d4
490 clr.w d4
491 swap d4
492 neg.w d4
493 add.w d2,d4 ; ltvol = vol - vol * (sep+1)^2 / 256^2
494 lsl.l #8,d4
495 move.l d4,vc_LtVol(a1)
497 subi.l #257,d3 ; sep -= 257
498 move.w d2,d4
499 muls.w d3,d4
500 muls.w d3,d4
501 clr.w d4
502 swap d4
503 neg.w d4
504 add.w d2,d4 ; rtvol = vol - vol * (sep-257)^2 / 256^2
505 lsl.l #8,d4
506 move.l d4,vc_RtVol(a1)
508 move.b #$81,vc_Flags(a1)
509 movem.l (a7)+,d0-d4/a0-a2
512 ;--------------------------------------
514 CNOP 0,16
516 Sfx_Update movem.l d0-d4/a0-a2,-(a7)
517 lea sfxVoiceTbl,a1
518 movea.l (a1,d0.w*4),a1
519 swap d1
520 clr.w d1
521 divu.l #11025,d1
522 move.l d1,vc_Step(a1)
524 addq.w #1,d3 ; sep += 1
525 move.w d2,d4
526 muls.w d3,d4
527 muls.w d3,d4
528 clr.w d4
529 swap d4
530 neg.w d4
531 add.w d2,d4 ; ltvol = vol - vol * (sep+1)^2 / 256^2
532 lsl.l #8,d4
533 move.l d4,vc_LtVol(a1)
535 subi.l #257,d3 ; sep -= 257
536 move.w d2,d4
537 muls.w d3,d4
538 muls.w d3,d4
539 clr.w d4
540 swap d4
541 neg.w d4
542 add.w d2,d4 ; rtvol = vol - vol * (sep-257)^2 / 256^2
543 lsl.l #8,d4
544 move.l d4,vc_RtVol(a1)
546 movem.l (a7)+,d0-d4/a0-a2
549 ;--------------------------------------
551 CNOP 0,16
553 Sfx_Stop move.l a0,-(a7)
554 lea sfxVoiceTbl,a0
555 movea.l (a0,d0.w*4),a0
556 bclr #0,vc_Flags(a0)
557 movea.l (a7)+,a0
560 ;--------------------------------------
562 CNOP 0,16
564 Sfx_Done move.l a0,-(a7)
565 lea sfxVoiceTbl,a0
566 movea.l (a0,d0.w*4),a0
567 moveq #0,d0
568 btst #0,vc_Flags(a0)
569 beq.b .1 ; not playing
570 move.l vc_Index(a0),d0
571 addq.l #1,d0 ; for safety
572 .1 movea.l (a7)+,a0
575 ;--------------------------------------
577 CNOP 0,16
579 Mus_SetVol move.w d0,mus_volume
582 ;--------------------------------------
584 CNOP 0,16
586 Mus_Register movem.l d1-d7/a0-a6,-(sp)
587 bsr Mus_Unregister
589 move.l a0,MUSMemPtr
591 cmpi.l #$4D55531A,(a0) ; "MUS",26
592 bne .err0 ; not a mus file
594 move.l MUSMemPtr,MusPtr
596 bsr TestMUSFile
597 beq .err0
599 move.l InstrFile,d1
600 move.l #MODE_OLDFILE,d2
601 CALLDOS Open
602 move.l d0,InstrHandle
603 beq .err0
605 move.l #MEMF_CLEAR,d0 ; any memory
606 move.l #65536,d1 ; puddle size
607 move.l #32768,d2 ; threshold size
608 bsr CreatePool
609 move.l a0,InstrPool
610 beq .err1
612 movea.l a0,a2
613 movea.l MusPtr,a3
615 move.w #255,d0
616 lea Instruments,a0
617 .setinstr move.l #QuietInst,(a0)+
618 dbra d0,.setinstr
620 move.w $C(a3),d4 ; instrCnt
621 ror.w #8,d4
622 subq.w #1,d4 ; for dbra
624 lea $10(a3),a3 ; instruments[]
626 .instrloop moveq #14,d0
627 movea.l a2,a0
628 bsr AllocPooled
630 moveq #0,d2
631 move.b (a3)+,d2 ; instrument #
632 moveq #0,d1
633 move.b (a3)+,d1 ; offset to next instr. #
634 adda.l d1,a3 ; skip it (whatever it is?)
636 lea Instruments,a0
637 move.l d0,(a0,d2.w*4)
638 beq .err2
640 movea.l d0,a4 ; instrument record
642 bftst (validInstr){d2:1}
643 beq .next ; no instrument
645 move.l InstrHandle,d1
646 lsl.l #2,d2
647 moveq #OFFSET_BEGINNING,d3
648 CALLDOS Seek
650 move.l InstrHandle,d1
651 move.l a4,d2
652 moveq #4,d3
653 CALLSYS Read ; get instrument offset
654 addq.l #1,d0
655 beq .err2 ; can't read file
657 move.l InstrHandle,d1
658 move.l (a4),d2
659 moveq #OFFSET_BEGINNING,d3
660 CALLSYS Seek
662 move.l InstrHandle,d1
663 move.l a4,d2
664 moveq #14,d3
665 CALLSYS Read ; get instrument header
666 addq.l #1,d0
667 beq .err2 ; can't read file
669 move.l in_Length(a4),d0
670 swap d0
671 movea.l a2,a0
672 bsr AllocPooled
673 move.l d0,in_Wave(a4) ; wave data buffer
674 beq .err2
676 move.l InstrHandle,d1
677 move.l d0,d2
678 move.l in_Length(a4),d3
679 swap d3
680 CALLDOS Read ; get instrument samples
681 addq.l #1,d0
682 beq .err2 ; can't read file
684 move.b #1,in_Flags(a4)
685 .next dbra d4,.instrloop
687 move.l InstrHandle,d1
688 CALLDOS Close
689 clr.l InstrHandle
691 moveq #1,d0 ; return handle=1
692 movem.l (sp)+,d1-d7/a0-a6
695 .err2 movea.l InstrPool,a0
696 bsr DeletePool
697 clr.l InstrPool
699 .err1 move.l InstrHandle,d1
700 CALLDOS Close
701 clr.l InstrHandle
703 .err0 moveq #0,d0 ; return handle=0
704 movem.l (sp)+,d1-d7/a0-a6
707 ;--------------------------------------
709 CNOP 0,16
711 Mus_Unregister movem.l d0-d7/a0-a6,-(a7)
712 bsr Mus_Stop
714 clr.l MUSMemPtr
715 clr.l MUSMemSize
717 tst.l InstrPool
718 beq.b .1
719 movea.l InstrPool,a0
720 bsr DeletePool
721 clr.l InstrPool
723 .1 movem.l (a7)+,d0-d7/a0-a6
726 ;--------------------------------------
728 CNOP 0,16
730 Mus_Play move.b d1,mus_looping
731 move.b #2,mus_playing ; 2 = play from start
734 ;--------------------------------------
736 CNOP 0,16
738 Mus_Stop tst.b mus_playing
739 beq.b .2
740 st mus_playing ; -1 = stop playing
741 .1 tst.b mus_playing
742 bne.b .1
744 .2 move.l #QuietInst,Channel0
745 move.l #QuietInst,Channel1
746 move.l #QuietInst,Channel2
747 move.l #QuietInst,Channel3
748 move.l #QuietInst,Channel4
749 move.l #QuietInst,Channel5
750 move.l #QuietInst,Channel6
751 move.l #QuietInst,Channel7
752 move.l #QuietInst,Channel8
753 move.l #QuietInst,Channel9
754 move.l #QuietInst,Channel10
755 move.l #QuietInst,Channel11
756 move.l #QuietInst,Channel12
757 move.l #QuietInst,Channel13
758 move.l #QuietInst,Channel14
759 move.l #QuietInst,Channel15
761 clr.b Voice0+vc_Flags ; disable voices
762 clr.b Voice1+vc_Flags
763 clr.b Voice2+vc_Flags
764 clr.b Voice3+vc_Flags
765 clr.b Voice4+vc_Flags
766 clr.b Voice5+vc_Flags
767 clr.b Voice6+vc_Flags
768 clr.b Voice7+vc_Flags
769 clr.b Voice8+vc_Flags
770 clr.b Voice9+vc_Flags
771 clr.b Voice10+vc_Flags
772 clr.b Voice11+vc_Flags
773 clr.b Voice12+vc_Flags
774 clr.b Voice13+vc_Flags
775 clr.b Voice14+vc_Flags
776 clr.b Voice15+vc_Flags
778 clr.b mus_looping
779 clr.l MusDelay ; MusDelay = 0
780 clr.l VoiceAvail ; all voices available
783 ;--------------------------------------
785 CNOP 0,16
787 Mus_Pause clr.b mus_playing ; 0 = not playing
790 ;--------------------------------------
792 CNOP 0,16
794 Mus_Resume move.b #1,mus_playing ; 1 = play
797 ;--------------------------------------
799 CNOP 0,16
801 Mus_Done moveq #0,d0
802 move.b mus_playing,d0
805 ;------------------------------------------------------------------------
807 CNOP 0,16
809 TestMUSFile movea.l MusPtr,a0
810 move.l MUSMemSize,d3 ; d3 = total file size
811 moveq #0,d0
812 move.w 4(a0),d0
813 beq .fail
814 ror.w #8,d0 ; score length
815 moveq #0,d1
816 move.w 6(a0),d1
817 ror.w #8,d1 ; score start
818 cmpi.w #18,d1 ; start < 18? (1 instr.)
819 blt .fail
820 add.l d1,d0 ; d0 = total size
822 move.l d0,d3
823 move.l d3,MUSMemSize
825 move.w 12(a0),d2
826 beq.b .fail
827 ror.w #8,d2 ; d2 = instr. count
828 subq.w #1,d2
829 lea 16(a0),a1 ; a1 = * instr. list
830 .loop addq.l #1,a1 ; skip instr. value
831 moveq #0,d0
832 move.b (a1)+,d0 ; d0 = offset to next instr.
833 adda.l d0,a1 ; skip info (?)
834 dbra d2,.loop ; next
835 move.l a1,d0 ; d0 = * data following list
836 sub.l a0,d0 ; - file start
837 cmp.l d0,d1 ; = start?
838 bne.b .fail
839 move.b -1(a0,d3.l),d0 ; get last byte
840 lsr.b #4,d0
841 cmpi.b #6,d0 ; last byte = $6x? (end)
842 bne.b .fail
843 moveq #1,d0 ; file okay
846 .fail moveq #0,d0 ; yikes!
849 ;------------------------------------------------------------------------
851 cnop 0,16
853 AudioINT0 movem.l d2-d7/a2-a6,-(a7)
854 move.l chip_offset,d0
855 add.l d0,chip_buffer ; switch buffers
856 neg.l d0
857 move.l d0,chip_offset
859 lea _custom,a0
860 move.w #$0780,intreq(a0) ; clear int requests
862 tst.b mus_playing
863 bgt.b .domus
864 beq.b .musoff
865 addq.b #1,mus_playing ; now off
867 .musoff move.l #ClearBuf,aud3(a0)
868 move.w #40,aud3+ac_len(a0)
869 move.w period,aud3+ac_per(a0)
870 move.w #0,aud3+ac_vol(a0)
872 move.l #ClearBuf,aud2(a0)
873 move.w #40,aud2+ac_len(a0)
874 move.w period,aud2+ac_per(a0)
875 move.w #0,aud2+ac_vol(a0)
877 bra .dosfx
879 .domus cmpi.b #2,mus_playing
880 bne.b .musnxt
881 subq.b #1,mus_playing
883 movea.l MusPtr,a1
884 moveq #0,d1
885 move.w 6(a1),d1 ; score start
886 ror.w #8,d1
887 adda.l d1,a1 ; a1 = start
888 move.l a1,MusIndex ; store index
890 .musnxt subq.l #1,MusDelay
891 bpl.b .fillmus
893 bsr NextEvent
895 .fillmus lea Voice0,a0 ; music voices
896 movea.l chip_buffer,a2
897 bsr FillBuffer
899 lea _custom,a0
901 move.l chip_buffer,d0
902 move.l d0,aud3(a0) ; left mus
903 move.w #40,aud3+ac_len(a0) ; 80 samples
904 move.w period,aud3+ac_per(a0)
905 move.w mus_volume,aud3+ac_vol(a0)
907 addi.l #128,d0
908 move.l d0,aud2(a0) ; right mus
909 move.w #40,aud2+ac_len(a0) ; 80 samples
910 move.w period,aud2+ac_per(a0)
911 move.w mus_volume,aud2+ac_vol(a0)
913 .dosfx lea Voice16,a0 ; sound effect voices
914 movea.l chip_buffer,a2
915 lea 256(a2),a2
916 bsr FillBuffer
918 lea _custom,a0
920 move.l chip_buffer,d0
921 addi.l #256,d0
922 move.l d0,aud0(a0) ; left sfx
923 move.w #40,aud0+ac_len(a0) ; 80 samples
924 move.w period,aud0+ac_per(a0)
925 move.w sfx_volume,aud0+ac_vol(a0)
927 addi.l #128,d0
928 move.l d0,aud1(a0) ; right sfx
929 move.w #40,aud1+ac_len(a0) ; 80 samples
930 move.w period,aud1+ac_per(a0)
931 move.w sfx_volume,aud1+ac_vol(a0)
933 .exit movem.l (a7)+,d2-d7/a2-a6
934 moveq #0,d0
937 ;------------------------------------------------------------------------
939 CNOP 0,16
941 FillBuffer movea.l a2,a4
942 lea tempAudio,a1
943 moveq #4,d0
944 .lcloop clr.l (a1)+
945 clr.l (a1)+
946 clr.l (a1)+
947 clr.l (a1)+
948 dbra d0,.lcloop
950 lea tempAudio+128,a1
951 moveq #4,d0
952 .rcloop clr.l (a1)+
953 clr.l (a1)+
954 clr.l (a1)+
955 clr.l (a1)+
956 dbra d0,.rcloop
957 bra.b .1stvoice
959 .next move.l vc_Next(a0),d0 ; next voice
960 bne.b .chkvoice
962 lea 128(a4),a2
963 lea tempAudio,a1
964 moveq #4,d0
965 .lmloop move.l (a1)+,(a4)+
966 move.l (a1)+,(a4)+
967 move.l (a1)+,(a4)+
968 move.l (a1)+,(a4)+
969 dbra d0,.lmloop
971 lea tempAudio+128,a1
972 moveq #4,d0
973 .rmloop move.l (a1)+,(a2)+
974 move.l (a1)+,(a2)+
975 move.l (a1)+,(a2)+
976 move.l (a1)+,(a2)+
977 dbra d0,.rmloop
980 .chkvoice movea.l d0,a0
981 .1stvoice btst #0,vc_Flags(a0)
982 beq.b .next ; not enabled
984 ;------------------
985 ; do voice
986 btst #7,vc_Flags(a0)
987 bne .5 ; sfx
989 btst #1,vc_Flags(a0)
990 beq.b .1 ; not releasing
992 tst.l vc_LtVol(a0)
993 beq.b .0
994 subi.l #256,vc_LtVol(a0)
996 .0 tst.l vc_RtVol(a0)
997 beq.b .1
998 subi.l #256,vc_RtVol(a0)
1000 .1 move.l vc_LtVol(a0),d6
1001 move.l vc_RtVol(a0),d7
1002 tst.l d6
1003 bne.b .2 ; not off yet
1004 tst.l d7
1005 bne.b .2 ; not off yet
1007 clr.b vc_Flags(a0) ; voice off
1008 bra .next
1010 .2 lea tempAudio,a1 ; left buffer
1011 movea.l vol_lookup,a5
1013 movem.l vc_Index(a0),d1-d4 ; index,step,loop,length
1015 movea.l vc_Channel(a0),a3
1016 move.l ch_Pitch(a3),d0
1017 muls.l d0,d5:d2
1018 move.w d5,d2
1019 swap d2
1020 add.l vc_Step(a0),d2 ; final sample rate
1022 movea.l vc_Wave(a0),a3 ; sample data
1024 moveq #79,d5 ; 80 samples
1025 .floop move.l d1,d0
1026 swap d0
1027 move.b (a3,d0.w),d6 ; sample
1028 move.b d6,d7
1029 move.b (a5,d6.l),d6 ; convert
1030 move.b (a5,d7.l),d7 ; convert
1031 asr.b #2,d6
1032 asr.b #2,d7
1033 add.b d6,(a1)+ ; left sample
1034 add.b d7,127(a1) ; right sample
1036 add.l d2,d1
1037 cmp.l d4,d1
1038 blo.b .3
1039 sub.l d4,d1
1040 add.l d3,d1
1041 tst.l d3
1042 beq.b .4 ; no looping
1043 .3 dbra d5,.floop
1044 bra.b .done ; done with voice
1046 ; ran out of data
1047 .4 clr.b vc_Flags(a0) ; voice off
1049 .done move.l d1,vc_Index(a0)
1050 bra .next
1052 ; do sfx voice
1054 .5 move.l vc_LtVol(a0),d6
1055 move.l vc_RtVol(a0),d7
1057 lea tempAudio,a1 ; left buffer
1058 movea.l vol_lookup,a5
1060 movem.l vc_Index(a0),d1-d4 ; index,step,loop,length
1062 move.l vc_Step(a0),d2 ; sample rate
1063 lsr.l #8,d2
1065 movea.l vc_Wave(a0),a3 ; sample data
1067 moveq #79,d5 ; 80 samples
1068 .sfloop move.l d1,d0
1069 lsr.l #8,d0
1070 move.b (a3,d0.l),d6 ; sample
1071 move.b d6,d7
1072 move.b (a5,d6.l),d6 ; convert
1073 move.b (a5,d7.l),d7 ; convert
1074 asr.b #2,d6
1075 asr.b #2,d7
1076 add.b d6,(a1)+ ; left sample
1077 add.b d7,127(a1) ; right sample
1079 add.l d2,d1
1080 cmp.l d4,d1
1081 bhs.b .4 ; ran out of data
1082 dbra d5,.sfloop
1083 bra .done ; done with voice
1085 ;------------------------------------------------------------------------
1087 CNOP 0,16
1089 NextEvent movea.l MusIndex,a1
1091 .0 move.b (a1)+,d0 ; get next event
1092 move.b d0,d1
1093 lsr.b #3,d1
1094 andi.w #$E,d1 ; d1 = event type * 2
1095 lea EventTable,a0
1096 move.w (a0,d1.w),d1
1097 jsr (a0,d1.w) ; do event
1098 tst.b d0
1099 bpl.b .0 ; more events
1101 moveq #0,d1 ; time = 0
1102 .1 move.b (a1)+,d0 ; get byte
1103 bpl.b .2
1105 andi.w #$7F,d0 ; kill sign bit
1106 or.b d0,d1 ; time = time + 7 bits
1107 lsl.l #7,d1 ; * 128
1108 bra.b .1 ; get next 7 bits
1110 .2 or.b d0,d1 ; time = time + last 7 bits
1111 subq.l #1,d1 ; delay = time - 1
1112 bmi.b .0 ; (no delay)
1114 move.l d1,MusDelay ; store delay
1115 move.l a1,MusIndex ; store index
1118 ;------------------------------------------------------------------------
1120 Release moveq #15,d1
1121 and.b d0,d1 ; d1 = channel
1123 lea Channels,a0
1124 movea.l (a0,d1.w*4),a0 ; channel record
1125 movea.l ch_Map(a0),a0 ; channel map
1127 move.b (a1)+,d1 ; note #
1128 moveq #0,d2
1129 move.b (a0,d1.w),d2 ; voice #
1130 beq.b .exit ; no mapping
1132 clr.b (a0,d1.w) ; clear mapping
1133 move.l VoiceAvail,d3
1134 bclr d2,d3 ; voice free for use
1135 move.l d3,VoiceAvail
1137 lea Voices,a0
1138 movea.l (a0,d2.w*4),a0 ; voice
1139 bset #1,vc_Flags(a0) ; do release
1141 .exit rts
1143 ;------------------------------------------------------------------------
1145 PlayNote moveq #15,d1
1146 and.b d0,d1 ; d1 = channel
1148 lea Channels,a0
1149 movea.l (a0,d1.w*4),a2 ; channel record
1150 movea.l ch_Map(a2),a0 ; channel map
1152 moveq #-1,d2 ; no volume change
1153 move.b (a1)+,d1 ; note #
1154 bclr #7,d1
1155 beq.b .getvc ; no volume
1157 moveq #0,d2
1158 move.b (a1)+,d2 ; volume
1160 .getvc moveq #0,d3
1161 move.l VoiceAvail,d4
1162 .vloop bset d3,d4
1163 beq.b .foundfree
1164 addq.b #1,d3
1165 cmpi.b #16,d3
1166 bne.b .vloop
1167 ; no free voices
1171 .foundfree move.b d3,(a0,d1.w) ; voice mapping
1172 move.l d4,VoiceAvail
1174 lea Voices,a0
1175 movea.l (a0,d3.w*4),a3 ; voice
1177 tst.b d2
1178 bmi.b .skip
1180 ; new channel volume
1182 move.b d2,ch_Vol(a2)
1183 moveq #0,d3
1184 move.b ch_Pan(a2),d3
1185 addq.w #1,d3 ; sep += 1
1186 move.w d2,d4
1187 muls.w d3,d4
1188 muls.w d3,d4
1189 clr.w d4
1190 swap d4
1191 neg.w d4
1192 add.w d2,d4 ; ltvol = vol - vol * (sep+1)^2 / 256^2
1193 lsl.l #8,d4
1194 move.l d4,ch_LtVol(a2)
1196 subi.l #257,d3 ; sep -= 257
1197 move.w d2,d4
1198 muls.w d3,d4
1199 muls.w d3,d4
1200 clr.w d4
1201 swap d4
1202 neg.w d4
1203 add.w d2,d4 ; rtvol = vol - vol * (sep-257)^2 / 256^2
1204 lsl.l #8,d4
1205 move.l d4,ch_RtVol(a2)
1207 .skip move.l ch_LtVol(a2),vc_LtVol(a3)
1208 move.l ch_RtVol(a2),vc_RtVol(a3)
1210 moveq #15,d2
1211 and.b d0,d2
1212 cmpi.b #15,d2
1213 beq.b .percussion
1215 move.l ch_Instr(a2),a4 ; instrument record
1217 lea NoteTable,a0
1218 moveq #72,d2 ; one octave above middle c
1219 sub.b in_Base(a4),d2
1220 add.b d1,d2
1221 move.l (a0,d2.w*4),vc_Step(a3) ; step value for note
1223 clr.l vc_Index(a3)
1225 move.l a2,vc_Channel(a3) ; back link (for pitch wheel)
1227 move.l in_Wave(a4),vc_Wave(a3)
1228 move.l in_Loop(a4),vc_Loop(a3)
1229 move.l in_Length(a4),vc_Length(a3)
1230 move.b in_Flags(a4),vc_Flags(a3)
1231 .exit rts
1233 ; for the percussion channel, the note played sets the percussion instrument
1235 .percussion move.l #65536,vc_Step(a3) ; sample rate always 1.0
1237 clr.l vc_Index(a3)
1239 move.l a2,vc_Channel(a3) ; back link
1241 addi.b #100,d1 ; percussion instruments
1243 lea Instruments,a0
1244 move.l (a0,d1.w*4),a0 ; instrument record
1245 move.l in_Wave(a0),vc_Wave(a3)
1246 move.l in_Loop(a0),vc_Loop(a3)
1247 move.l in_Length(a0),vc_Length(a3)
1248 move.b in_Flags(a0),vc_Flags(a3)
1251 ;------------------------------------------------------------------------
1253 Pitch moveq #15,d1
1254 and.b d0,d1 ; d1 = channel
1256 lea Channels,a0
1257 movea.l (a0,d1.w*4),a2 ; channel record
1259 moveq #0,d1
1260 move.b (a1)+,d1 ; pitch wheel setting
1261 lea PitchTable,a0
1262 move.l (a0,d1.w*4),ch_Pitch(a2)
1265 ;------------------------------------------------------------------------
1267 Tempo addq.l #1,a1 ; skip value
1270 ;------------------------------------------------------------------------
1272 ChangeCtrl moveq #15,d1
1273 and.b d0,d1 ; d1 = channel
1275 lea Channels,a0
1276 movea.l (a0,d1.w*4),a2 ; channel
1278 move.b (a1)+,d1 ; get controller
1280 moveq #0,d2
1281 move.b (a1)+,d2 ; value
1283 tst.b d1
1284 bne.b .1
1286 ; set channel instrument
1288 lea Instruments,a0
1289 move.l (a0,d2.w*4),ch_Instr(a2)
1290 bne.b .0
1291 move.l #QuietInst,ch_Instr(a2)
1292 .0 rts
1294 .1 cmpi.b #3,d1 ; volume?
1295 bne.b .2
1297 ; set channel volume
1299 move.b d2,ch_Vol(a2)
1300 moveq #0,d3
1301 move.b ch_Pan(a2),d3
1302 addq.w #1,d3 ; sep += 1
1303 move.w d2,d4
1304 muls.w d3,d4
1305 muls.w d3,d4
1306 clr.w d4
1307 swap d4
1308 neg.w d4
1309 add.w d2,d4 ; ltvol = vol - vol * (sep+1)^2 / 256^2
1310 lsl.l #8,d4
1311 move.l d4,ch_LtVol(a2)
1313 subi.w #257,d3 ; sep -= 257
1314 move.w d2,d4
1315 muls.w d3,d4
1316 muls.w d3,d4
1317 clr.w d4
1318 swap d4
1319 neg.w d4
1320 add.w d2,d4 ; rtvol = vol - vol * (sep-257)^2 / 256^2
1321 lsl.l #8,d4
1322 move.l d4,ch_RtVol(a2)
1325 .2 cmpi.b #4,d1 ; pan?
1326 bne.b .exit
1328 ; set channel pan
1330 add.b d2,d2 ; pan -> sep
1331 move.b d2,ch_Pan(a2)
1332 move.b ch_Vol(a2),d2
1333 moveq #0,d3
1334 move.b ch_Pan(a2),d3
1335 addq.w #1,d3 ; sep += 1
1336 move.w d2,d4
1337 muls.w d3,d4
1338 muls.w d3,d4
1339 clr.w d4
1340 swap d4
1341 neg.w d4
1342 add.w d2,d4 ; ltvol = vol - vol * (sep+1)^2 / 256^2
1343 lsl.l #8,d4
1344 move.l d4,ch_LtVol(a2)
1346 subi.w #257,d3 ; sep -= 257
1347 move.w d2,d4
1348 muls.w d3,d4
1349 muls.w d3,d4
1350 clr.w d4
1351 swap d4
1352 neg.w d4
1353 add.w d2,d4 ; rtvol = vol - vol * (sep-257)^2 / 256^2
1354 lsl.l #8,d4
1355 move.l d4,ch_RtVol(a2)
1356 .exit rts
1358 ;------------------------------------------------------------------------
1360 NoEvent rts
1362 ;------------------------------------------------------------------------
1364 EndScore tst.b mus_looping ; loop?
1365 bne .loop
1367 move.l #QuietInst,Channel0
1368 move.l #QuietInst,Channel1
1369 move.l #QuietInst,Channel2
1370 move.l #QuietInst,Channel3
1371 move.l #QuietInst,Channel4
1372 move.l #QuietInst,Channel5
1373 move.l #QuietInst,Channel6
1374 move.l #QuietInst,Channel7
1375 move.l #QuietInst,Channel8
1376 move.l #QuietInst,Channel9
1377 move.l #QuietInst,Channel10
1378 move.l #QuietInst,Channel11
1379 move.l #QuietInst,Channel12
1380 move.l #QuietInst,Channel13
1381 move.l #QuietInst,Channel14
1382 move.l #QuietInst,Channel15
1384 clr.b Voice0+vc_Flags ; disable voices
1385 clr.b Voice1+vc_Flags
1386 clr.b Voice2+vc_Flags
1387 clr.b Voice3+vc_Flags
1388 clr.b Voice4+vc_Flags
1389 clr.b Voice5+vc_Flags
1390 clr.b Voice6+vc_Flags
1391 clr.b Voice7+vc_Flags
1392 clr.b Voice8+vc_Flags
1393 clr.b Voice9+vc_Flags
1394 clr.b Voice10+vc_Flags
1395 clr.b Voice11+vc_Flags
1396 clr.b Voice12+vc_Flags
1397 clr.b Voice13+vc_Flags
1398 clr.b Voice14+vc_Flags
1399 clr.b Voice15+vc_Flags
1401 clr.l MusDelay ; MusDelay = 0
1402 clr.l VoiceAvail ; all voices available
1403 clr.b mus_playing
1404 addq.l #4,a7 ; pop NextEvent
1407 .loop movea.l MusPtr,a1
1408 moveq #0,d1
1409 move.w 6(a1),d1 ; score start
1410 ror.w #8,d1
1411 adda.l d1,a1 ; a1 = start
1414 ;------------------------------------------------------------------------
1415 cnop 0,4
1417 EventTable dc.w Release-EventTable
1418 dc.w PlayNote-EventTable
1419 dc.w Pitch-EventTable
1420 dc.w Tempo-EventTable
1421 dc.w ChangeCtrl-EventTable
1422 dc.w NoEvent-EventTable
1423 dc.w EndScore-EventTable
1424 dc.w NoEvent-EventTable
1426 ;------------------------------------------------------------------------
1427 ;--------------------------------------------------------------------
1429 cnop 0,4
1431 CreatePool movea.l _ExecBase,a1
1432 cmpi.w #39,LIB_VERSION(a1)
1433 blt.b .nopools ; change to bra for debugging
1435 move.l a6,-(sp)
1436 movea.l a1,a6
1437 CALLSYS CreatePool
1438 movea.l (sp)+,a6
1441 .nopools movem.l d2-d7/a2-a6,-(sp)
1442 move.l d0,d4 ; memory attributes
1443 move.l d1,d3 ; amount to allocate when low
1444 move.l d2,d5 ; size of when not to use pool
1446 exg.l d0,d1 ; swap flags and size
1447 movea.l a1,a6
1448 CALLSYS AllocMem ; get first block
1449 movea.l d0,a0
1450 tst.l d0
1451 beq.b .exit ; no memory!
1453 movem.l d3-d5,(a0) ; puddleSize, Flags,Threshold
1454 clr.l 12(a0) ; no next block
1455 lea 24(a0),a1 ; first free location here
1456 move.l a1,16(a0)
1457 subi.l #24,d3 ; for header info
1458 move.l d3,20(a0) ; amount free in this block
1460 .exit movem.l (sp)+,d2-d7/a2-a6
1463 cnop 0,4
1465 DeletePool movea.l _ExecBase,a1
1466 cmpi.w #39,LIB_VERSION(a1)
1467 blt.b .nopools ; change to bra for debugging
1469 move.l a6,-(sp)
1470 movea.l a1,a6
1471 CALLSYS DeletePool
1472 movea.l (sp)+,a6
1475 .nopools movem.l d2-d7/a2-a6,-(sp)
1476 move.l a0,d2 ; first block
1477 beq.b .exit ; safety check
1479 movea.l a1,a6
1481 .loop movea.l d2,a1 ; pointer to block
1482 move.l (a1),d0 ; size of block
1483 move.l 12(a1),d2 ; next block
1484 CALLSYS FreeMem
1485 tst.l d2
1486 bne.b .loop
1488 .exit movem.l (sp)+,d2-d7/a2-a6
1491 cnop 0,4
1493 AllocPooled movea.l _ExecBase,a1
1494 cmpi.w #39,LIB_VERSION(a1)
1495 blt.b .nopools ; change to bra for debugging
1497 move.l a6,-(sp)
1498 movea.l a1,a6
1499 CALLSYS AllocPooled
1500 movea.l (sp)+,a6
1503 .nopools movem.l d2-d7/a2-a6,-(sp)
1504 move.l a0,d2
1505 beq.b .exit ; safety check
1507 addq.l #3,d0
1508 andi.b #$FC,d0 ; long align size
1510 movea.l a1,a6
1512 cmp.l 8(a0),d0 ; check threshold
1513 blt.b .chkpuddles ; allocate from puddles
1515 addi.l #24,d0 ; for header
1516 move.l d0,d3 ; save size
1517 move.l 4(a0),d1 ; mem attrs
1518 CALLSYS AllocMem
1519 movea.l d0,a0
1520 tst.l d0
1521 beq.b .exit ; no memory
1523 move.l d3,(a0) ; size of block
1524 clr.l 20(a0) ; no free space in here
1526 movea.l d2,a1 ; pool header
1527 move.l 12(a1),d1
1528 move.l a0,12(a1) ; splice in block
1529 move.l d1,12(a0) ; relink next block
1530 lea 24(a0),a0 ; skip over header
1532 .exit move.l a0,d0
1533 movem.l (sp)+,d2-d7/a2-a6
1536 cnop 0,4
1538 .chkpuddles cmp.l 20(a0),d0 ; check free space
1539 blt.b .gotspace
1541 movea.l 12(a0),a0 ; next block
1542 move.l a0,d1
1543 bne.b .chkpuddles
1545 ; not enough free space in existing puddles, create another
1547 move.l d0,d6 ; save size
1549 movea.l d2,a0 ; pool header
1550 movem.l (a0),d3-d5
1551 movem.l (a0),d0-d1
1552 CALLSYS AllocMem ; get block
1553 movea.l d0,a0
1554 tst.l d0
1555 beq.b .out ; no memory!
1557 movea.l d2,a1 ; pool header
1558 movem.l d3-d5,(a0) ; puddleSize, Flags,Threshold
1559 move.l 12(a1),12(a0) ; next block
1560 move.l a0,12(a1) ; splice in block
1561 lea 24(a0),a1 ; first free location here
1562 move.l a1,16(a0)
1563 subi.l #24,d3 ; for header info
1564 move.l d3,20(a0) ; amount free in this block
1566 move.l d6,d0 ; restore size
1568 .gotspace sub.l d0,20(a0) ; sub from amount free
1569 bmi.b .err ; threshold >= puddlesize!
1571 move.l 16(a0),a1 ; free space
1572 add.l d0,16(a0) ; next free space
1574 movea.l a1,a0
1575 bra.b .out
1577 .err add.l d0,20(a0) ; restore free space
1578 moveq #0,d0
1579 suba.l a0,a0 ; no memory
1581 .out move.l a0,d0
1582 movem.l (sp)+,d2-d7/a2-a6
1585 ;------------------------------------------------------------------------
1586 ;------------------------------------------------------------------------
1588 cnop 0,4
1590 MUSMemPtr dc.l 0
1591 MUSMemSize dc.l 0
1593 SegList dc.l 0
1594 _ExecBase dc.l 0
1595 _DOSBase dc.l 0
1596 LookupMem dc.l 0
1597 vol_lookup dc.l 0
1599 ;------------------------------------------------------------------------
1601 period dc.w 325 ; NTSC 11025 KHz
1602 sfx_volume dc.w 64
1603 mus_volume dc.w 64
1604 mus_playing dc.b 0
1605 mus_looping dc.b 0
1607 ;------------------------------------------------------------------------
1609 cnop 0,4
1611 AudioPort dc.l 0
1612 AudioIO dc.l 0
1614 AInt0 dc.l 0,0
1615 dc.b NT_INTERRUPT,0 ; LN_TYPE, LN_PRI
1616 dc.l AIntName ; LN_NAME
1617 dc.l 0 ; IS_DATA
1618 dc.l AudioINT0 ; IS_CODE
1620 MusPtr dc.l 0
1621 MusIndex dc.l 0
1622 MusDelay dc.l 0
1623 OldAInt0 dc.l 0
1625 AudioAlloc dc.b $0F ; Amiga channels to allocate
1627 GfxName dc.b 'graphics.library',0
1628 DOSName dc.b 'dos.library',0
1629 AudioName dc.b 'audio.device',0
1630 AIntName dc.b 'DOOM Sound Server',0
1632 ;--------------------------------------
1634 CNOP 0,4
1636 ; bit set if voice is in use (0-15=music voices,16-31=sfx voices)
1638 VoiceAvail dc.l 0
1640 chip_buffer dc.l chipBuffer
1641 chip_offset dc.l 512
1643 ;--------------------------------------------------------------------
1645 CNOP 0,4
1647 NoteTable dc.l 65536/64,69433/64,73562/64,77936/64,82570/64,87480/64,92682/64,98193/64,104032/64,110218/64,116772/64,123715/64
1648 dc.l 65536/32,69433/32,73562/32,77936/32,82570/32,87480/32,92682/32,98193/32,104032/32,110218/32,116772/32,123715/32
1649 dc.l 65536/16,69433/16,73562/16,77936/16,82570/16,87480/16,92682/16,98193/16,104032/16,110218/16,116772/16,123715/16
1650 dc.l 65536/8,69433/8,73562/8,77936/8,82570/8,87480/8,92682/8,98193/8,104032/8,110218/8,116772/8,123715/8
1651 dc.l 65536/4,69433/4,73562/4,77936/4,82570/4,87480/4,92682/4,98193/4,104032/4,110218/4,116772/4,123715/4
1652 dc.l 65536/2,69433/2,73562/2,77936/2,82570/2,87480/2,92682/2,98193/2,104032/2,110218/2,116772/2,123715/2
1653 dc.l 65536,69433,73562,77936,82570,87480,92682,98193,104032,110218,116772,123715
1654 dc.l 65536*2,69433*2,73562*2,77936*2,82570*2,87480*2,92682*2,98193*2,104032*2,110218*2,116772*2,123715*2
1655 dc.l 65536*4,69433*4,73562*4,77936*4,82570*4,87480*4,92682*4,98193*4,104032*4,110218*4,116772*4,123715*4
1656 dc.l 65536*8,69433*8,73562*8,77936*8,82570*8,87480*8,92682*8,98193*8,104032*8,110218*8,116772*8,123715*8
1657 dc.l 65536*16,69433*16,73562*16,77936*16,82570*16,87480*16,92682*16,98193*16
1659 ;------------------------------------------------------------------------
1661 PitchTable:
1663 pitch_ix SET 128
1665 REPT 128
1666 dc.l -3678*pitch_ix/64
1667 pitch_ix SET pitch_ix-1
1668 ENDR
1670 REPT 128
1671 dc.l 3897*pitch_ix/64
1672 pitch_ix SET pitch_ix+1
1673 ENDR
1675 ;------------------------------------------------------------------------
1677 STRUCTURE MusChannel,0
1678 APTR ch_Instr
1679 APTR ch_Map
1680 ULONG ch_Pitch
1681 APTR ch_LtVol
1682 APTR ch_RtVol
1683 BYTE ch_Vol
1684 BYTE ch_Pan
1687 CNOP 0,4
1689 Channels dc.l Channel0,Channel1,Channel2,Channel3
1690 dc.l Channel4,Channel5,Channel6,Channel7
1691 dc.l Channel8,Channel9,Channel10,Channel11
1692 dc.l Channel12,Channel13,Channel14,Channel15
1695 CNOP 0,4
1697 Channel0 dc.l 0 ; instrument
1698 dc.l Channel0Map ; note to voice map
1699 dc.l 0 ; pitch wheel setting
1700 dc.l 0 ; left volume table
1701 dc.l 0 ; right volume table
1702 dc.b 0 ; volume
1703 dc.b 0 ; pan setting
1705 CNOP 0,4
1707 Channel1 dc.l 0 ; instrument
1708 dc.l Channel1Map ; note to voice map
1709 dc.l 0 ; pitch wheel setting
1710 dc.l 0 ; left volume table
1711 dc.l 0 ; right volume table
1712 dc.b 0 ; volume
1713 dc.b 0 ; pan setting
1715 CNOP 0,4
1717 Channel2 dc.l 0 ; instrument
1718 dc.l Channel2Map ; note to voice map
1719 dc.l 0 ; pitch wheel setting
1720 dc.l 0 ; left volume table
1721 dc.l 0 ; right volume table
1722 dc.b 0 ; volume
1723 dc.b 0 ; pan setting
1725 CNOP 0,4
1727 Channel3 dc.l 0 ; instrument
1728 dc.l Channel3Map ; note to voice map
1729 dc.l 0 ; pitch wheel setting
1730 dc.l 0 ; left volume table
1731 dc.l 0 ; right volume table
1732 dc.b 0 ; volume
1733 dc.b 0 ; pan setting
1735 CNOP 0,4
1737 Channel4 dc.l 0 ; instrument
1738 dc.l Channel4Map ; note to voice map
1739 dc.l 0 ; pitch wheel setting
1740 dc.l 0 ; left volume table
1741 dc.l 0 ; right volume table
1742 dc.b 0 ; volume
1743 dc.b 0 ; pan setting
1745 CNOP 0,4
1747 Channel5 dc.l 0 ; instrument
1748 dc.l Channel5Map ; note to voice map
1749 dc.l 0 ; pitch wheel setting
1750 dc.l 0 ; left volume table
1751 dc.l 0 ; right volume table
1752 dc.b 0 ; volume
1753 dc.b 0 ; pan setting
1755 CNOP 0,4
1757 Channel6 dc.l 0 ; instrument
1758 dc.l Channel6Map ; note to voice map
1759 dc.l 0 ; pitch wheel setting
1760 dc.l 0 ; left volume table
1761 dc.l 0 ; right volume table
1762 dc.b 0 ; volume
1763 dc.b 0 ; pan setting
1765 CNOP 0,4
1767 Channel7 dc.l 0 ; instrument
1768 dc.l Channel7Map ; note to voice map
1769 dc.l 0 ; pitch wheel setting
1770 dc.l 0 ; left volume table
1771 dc.l 0 ; right volume table
1772 dc.b 0 ; volume
1773 dc.b 0 ; pan setting
1775 CNOP 0,4
1777 Channel8 dc.l 0 ; instrument
1778 dc.l Channel8Map ; note to voice map
1779 dc.l 0 ; pitch wheel setting
1780 dc.l 0 ; left volume table
1781 dc.l 0 ; right volume table
1782 dc.b 0 ; volume
1783 dc.b 0 ; pan setting
1785 CNOP 0,4
1787 Channel9 dc.l 0 ; instrument
1788 dc.l Channel9Map ; note to voice map
1789 dc.l 0 ; pitch wheel setting
1790 dc.l 0 ; left volume table
1791 dc.l 0 ; right volume table
1792 dc.b 0 ; volume
1793 dc.b 0 ; pan setting
1795 CNOP 0,4
1797 Channel10 dc.l 0 ; instrument
1798 dc.l Channel10Map ; note to voice map
1799 dc.l 0 ; pitch wheel setting
1800 dc.l 0 ; left volume table
1801 dc.l 0 ; right volume table
1802 dc.b 0 ; volume
1803 dc.b 0 ; pan setting
1805 CNOP 0,4
1807 Channel11 dc.l 0 ; instrument
1808 dc.l Channel11Map ; note to voice map
1809 dc.l 0 ; pitch wheel setting
1810 dc.l 0 ; left volume table
1811 dc.l 0 ; right volume table
1812 dc.b 0 ; volume
1813 dc.b 0 ; pan setting
1815 CNOP 0,4
1817 Channel12 dc.l 0 ; instrument
1818 dc.l Channel12Map ; note to voice map
1819 dc.l 0 ; pitch wheel setting
1820 dc.l 0 ; left volume table
1821 dc.l 0 ; right volume table
1822 dc.b 0 ; volume
1823 dc.b 0 ; pan setting
1825 CNOP 0,4
1827 Channel13 dc.l 0 ; instrument
1828 dc.l Channel13Map ; note to voice map
1829 dc.l 0 ; pitch wheel setting
1830 dc.l 0 ; left volume table
1831 dc.l 0 ; right volume table
1832 dc.b 0 ; volume
1833 dc.b 0 ; pan setting
1835 CNOP 0,4
1837 Channel14 dc.l 0 ; instrument
1838 dc.l Channel14Map ; note to voice map
1839 dc.l 0 ; pitch wheel setting
1840 dc.l 0 ; left volume table
1841 dc.l 0 ; right volume table
1842 dc.b 0 ; volume
1843 dc.b 0 ; pan setting
1845 CNOP 0,4
1847 Channel15 dc.l 0 ; instrument
1848 dc.l Channel15Map ; note to voice map
1849 dc.l 0 ; pitch wheel setting
1850 dc.l 0 ; left volume table
1851 dc.l 0 ; right volume table
1852 dc.b 0 ; volume
1853 dc.b 0 ; pan setting
1856 CNOP 0,4
1858 Channel0Map dcb.b 128,0
1859 Channel1Map dcb.b 128,0
1860 Channel2Map dcb.b 128,0
1861 Channel3Map dcb.b 128,0
1862 Channel4Map dcb.b 128,0
1863 Channel5Map dcb.b 128,0
1864 Channel6Map dcb.b 128,0
1865 Channel7Map dcb.b 128,0
1866 Channel8Map dcb.b 128,0
1867 Channel9Map dcb.b 128,0
1868 Channel10Map dcb.b 128,0
1869 Channel11Map dcb.b 128,0
1870 Channel12Map dcb.b 128,0
1871 Channel13Map dcb.b 128,0
1872 Channel14Map dcb.b 128,0
1873 Channel15Map dcb.b 128,0
1875 ;--------------------------------------
1877 STRUCTURE AudioVoice,0
1878 APTR vc_Next
1879 APTR vc_Channel
1880 APTR vc_Wave
1881 ULONG vc_Index
1882 ULONG vc_Step
1883 ULONG vc_Loop
1884 ULONG vc_Length
1885 APTR vc_LtVol
1886 APTR vc_RtVol
1887 BYTE vc_Flags ; b7 = SFX, b1 = RLS, b0 = EN
1889 CNOP 0,4
1891 Voices dc.l Voice0,Voice1,Voice2,Voice3
1892 dc.l Voice4,Voice5,Voice6,Voice7
1893 dc.l Voice8,Voice9,Voice10,Voice11
1894 dc.l Voice12,Voice13,Voice14,Voice15
1896 sfxVoiceTbl dc.l Voice16,Voice17,Voice18,Voice19
1897 dc.l Voice20,Voice21,Voice22,Voice23
1898 dc.l Voice24,Voice25,Voice26,Voice27
1899 dc.l Voice28,Voice29,Voice30,Voice31
1901 ; Music Voices
1903 CNOP 0,4
1905 Voice0 dc.l Voice1
1906 dc.l 0 ; channel back-link
1907 dc.l 0 ; instrument wave data
1908 dc.l 0 ; sample index
1909 dc.l 0 ; sample rate
1910 dc.l 0 ; instrument loop point
1911 dc.l 0 ; instrument data length
1912 dc.l 0 ; left volume table
1913 dc.l 0 ; right volume table
1914 dc.b 0 ; voice flags
1916 CNOP 0,4
1918 Voice1 dc.l Voice2
1919 dc.l 0 ; channel back-link
1920 dc.l 0 ; instrument wave data
1921 dc.l 0 ; sample index
1922 dc.l 0 ; sample rate
1923 dc.l 0 ; instrument loop point
1924 dc.l 0 ; instrument data length
1925 dc.l 0 ; left volume table
1926 dc.l 0 ; right volume table
1927 dc.b 0 ; voice flags
1929 CNOP 0,4
1931 Voice2 dc.l Voice3
1932 dc.l 0 ; channel back-link
1933 dc.l 0 ; instrument wave data
1934 dc.l 0 ; sample index
1935 dc.l 0 ; sample rate
1936 dc.l 0 ; instrument loop point
1937 dc.l 0 ; instrument data length
1938 dc.l 0 ; left volume table
1939 dc.l 0 ; right volume table
1940 dc.b 0 ; voice flags
1942 CNOP 0,4
1944 Voice3 dc.l Voice4
1945 dc.l 0 ; channel back-link
1946 dc.l 0 ; instrument wave data
1947 dc.l 0 ; sample index
1948 dc.l 0 ; sample rate
1949 dc.l 0 ; instrument loop point
1950 dc.l 0 ; instrument data length
1951 dc.l 0 ; left volume table
1952 dc.l 0 ; right volume table
1953 dc.b 0 ; voice flags
1955 CNOP 0,4
1957 Voice4 dc.l Voice5
1958 dc.l 0 ; channel back-link
1959 dc.l 0 ; instrument wave data
1960 dc.l 0 ; sample index
1961 dc.l 0 ; sample rate
1962 dc.l 0 ; instrument loop point
1963 dc.l 0 ; instrument data length
1964 dc.l 0 ; left volume table
1965 dc.l 0 ; right volume table
1966 dc.b 0 ; voice flags
1968 CNOP 0,4
1970 Voice5 dc.l Voice6
1971 dc.l 0 ; channel back-link
1972 dc.l 0 ; instrument wave data
1973 dc.l 0 ; sample index
1974 dc.l 0 ; sample rate
1975 dc.l 0 ; instrument loop point
1976 dc.l 0 ; instrument data length
1977 dc.l 0 ; left volume table
1978 dc.l 0 ; right volume table
1979 dc.b 0 ; voice flags
1981 CNOP 0,4
1983 Voice6 dc.l Voice7
1984 dc.l 0 ; channel back-link
1985 dc.l 0 ; instrument wave data
1986 dc.l 0 ; sample index
1987 dc.l 0 ; sample rate
1988 dc.l 0 ; instrument loop point
1989 dc.l 0 ; instrument data length
1990 dc.l 0 ; left volume table
1991 dc.l 0 ; right volume table
1992 dc.b 0 ; voice flags
1994 CNOP 0,4
1996 Voice7 dc.l Voice8
1997 dc.l 0 ; channel back-link
1998 dc.l 0 ; instrument wave data
1999 dc.l 0 ; sample index
2000 dc.l 0 ; sample rate
2001 dc.l 0 ; instrument loop point
2002 dc.l 0 ; instrument data length
2003 dc.l 0 ; left volume table
2004 dc.l 0 ; right volume table
2005 dc.b 0 ; voice flags
2007 CNOP 0,4
2009 Voice8 dc.l Voice9
2010 dc.l 0 ; channel back-link
2011 dc.l 0 ; instrument wave data
2012 dc.l 0 ; sample index
2013 dc.l 0 ; sample rate
2014 dc.l 0 ; instrument loop point
2015 dc.l 0 ; instrument data length
2016 dc.l 0 ; left volume table
2017 dc.l 0 ; right volume table
2018 dc.b 0 ; voice flags
2020 CNOP 0,4
2022 Voice9 dc.l Voice10
2023 dc.l 0 ; channel back-link
2024 dc.l 0 ; instrument wave data
2025 dc.l 0 ; sample index
2026 dc.l 0 ; sample rate
2027 dc.l 0 ; instrument loop point
2028 dc.l 0 ; instrument data length
2029 dc.l 0 ; left volume table
2030 dc.l 0 ; right volume table
2031 dc.b 0 ; voice flags
2033 CNOP 0,4
2035 Voice10 dc.l Voice11
2036 dc.l 0 ; channel back-link
2037 dc.l 0 ; instrument wave data
2038 dc.l 0 ; sample index
2039 dc.l 0 ; sample rate
2040 dc.l 0 ; instrument loop point
2041 dc.l 0 ; instrument data length
2042 dc.l 0 ; left volume table
2043 dc.l 0 ; right volume table
2044 dc.b 0 ; voice flags
2046 CNOP 0,4
2048 Voice11 dc.l Voice12
2049 dc.l 0 ; channel back-link
2050 dc.l 0 ; instrument wave data
2051 dc.l 0 ; sample index
2052 dc.l 0 ; sample rate
2053 dc.l 0 ; instrument loop point
2054 dc.l 0 ; instrument data length
2055 dc.l 0 ; left volume table
2056 dc.l 0 ; right volume table
2057 dc.b 0 ; voice flags
2059 CNOP 0,4
2061 Voice12 dc.l Voice13
2062 dc.l 0 ; channel back-link
2063 dc.l 0 ; instrument wave data
2064 dc.l 0 ; sample index
2065 dc.l 0 ; sample rate
2066 dc.l 0 ; instrument loop point
2067 dc.l 0 ; instrument data length
2068 dc.l 0 ; left volume table
2069 dc.l 0 ; right volume table
2070 dc.b 0 ; voice flags
2072 CNOP 0,4
2074 Voice13 dc.l Voice14
2075 dc.l 0 ; channel back-link
2076 dc.l 0 ; instrument wave data
2077 dc.l 0 ; sample index
2078 dc.l 0 ; sample rate
2079 dc.l 0 ; instrument loop point
2080 dc.l 0 ; instrument data length
2081 dc.l 0 ; left volume table
2082 dc.l 0 ; right volume table
2083 dc.b 0 ; voice flags
2085 CNOP 0,4
2087 Voice14 dc.l Voice15
2088 dc.l 0 ; channel back-link
2089 dc.l 0 ; instrument wave data
2090 dc.l 0 ; sample index
2091 dc.l 0 ; sample rate
2092 dc.l 0 ; instrument loop point
2093 dc.l 0 ; instrument data length
2094 dc.l 0 ; left volume table
2095 dc.l 0 ; right volume table
2096 dc.b 0 ; voice flags
2098 CNOP 0,4
2100 Voice15 dc.l 0
2101 dc.l 0 ; channel back-link
2102 dc.l 0 ; instrument wave data
2103 dc.l 0 ; sample index
2104 dc.l 0 ; sample rate
2105 dc.l 0 ; instrument loop point
2106 dc.l 0 ; instrument data length
2107 dc.l 0 ; left volume table
2108 dc.l 0 ; right volume table
2109 dc.b 0 ; voice flags
2111 ; Sound Effect Voices
2113 CNOP 0,4
2115 Voice16 dc.l Voice17
2116 dc.l 0 ; channel back-link
2117 dc.l 0 ; instrument wave data
2118 dc.l 0 ; sample index
2119 dc.l 0 ; sample rate
2120 dc.l 0 ; instrument loop point
2121 dc.l 0 ; instrument data length
2122 dc.l 0 ; left volume table
2123 dc.l 0 ; right volume table
2124 dc.b 0 ; voice flags
2126 CNOP 0,4
2128 Voice17 dc.l Voice18
2129 dc.l 0 ; channel back-link
2130 dc.l 0 ; instrument wave data
2131 dc.l 0 ; sample index
2132 dc.l 0 ; sample rate
2133 dc.l 0 ; instrument loop point
2134 dc.l 0 ; instrument data length
2135 dc.l 0 ; left volume table
2136 dc.l 0 ; right volume table
2137 dc.b 0 ; voice flags
2139 CNOP 0,4
2141 Voice18 dc.l Voice19
2142 dc.l 0 ; channel back-link
2143 dc.l 0 ; instrument wave data
2144 dc.l 0 ; sample index
2145 dc.l 0 ; sample rate
2146 dc.l 0 ; instrument loop point
2147 dc.l 0 ; instrument data length
2148 dc.l 0 ; left volume table
2149 dc.l 0 ; right volume table
2150 dc.b 0 ; voice flags
2152 CNOP 0,4
2154 Voice19 dc.l Voice20
2155 dc.l 0 ; channel back-link
2156 dc.l 0 ; instrument wave data
2157 dc.l 0 ; sample index
2158 dc.l 0 ; sample rate
2159 dc.l 0 ; instrument loop point
2160 dc.l 0 ; instrument data length
2161 dc.l 0 ; left volume table
2162 dc.l 0 ; right volume table
2163 dc.b 0 ; voice flags
2165 CNOP 0,4
2167 Voice20 dc.l Voice21
2168 dc.l 0 ; channel back-link
2169 dc.l 0 ; instrument wave data
2170 dc.l 0 ; sample index
2171 dc.l 0 ; sample rate
2172 dc.l 0 ; instrument loop point
2173 dc.l 0 ; instrument data length
2174 dc.l 0 ; left volume table
2175 dc.l 0 ; right volume table
2176 dc.b 0 ; voice flags
2178 CNOP 0,4
2180 Voice21 dc.l Voice22
2181 dc.l 0 ; channel back-link
2182 dc.l 0 ; instrument wave data
2183 dc.l 0 ; sample index
2184 dc.l 0 ; sample rate
2185 dc.l 0 ; instrument loop point
2186 dc.l 0 ; instrument data length
2187 dc.l 0 ; left volume table
2188 dc.l 0 ; right volume table
2189 dc.b 0 ; voice flags
2191 CNOP 0,4
2193 Voice22 dc.l Voice23
2194 dc.l 0 ; channel back-link
2195 dc.l 0 ; instrument wave data
2196 dc.l 0 ; sample index
2197 dc.l 0 ; sample rate
2198 dc.l 0 ; instrument loop point
2199 dc.l 0 ; instrument data length
2200 dc.l 0 ; left volume table
2201 dc.l 0 ; right volume table
2202 dc.b 0 ; voice flags
2204 CNOP 0,4
2206 Voice23 dc.l Voice24
2207 dc.l 0 ; channel back-link
2208 dc.l 0 ; instrument wave data
2209 dc.l 0 ; sample index
2210 dc.l 0 ; sample rate
2211 dc.l 0 ; instrument loop point
2212 dc.l 0 ; instrument data length
2213 dc.l 0 ; left volume table
2214 dc.l 0 ; right volume table
2215 dc.b 0 ; voice flags
2217 CNOP 0,4
2219 Voice24 dc.l Voice25
2220 dc.l 0 ; channel back-link
2221 dc.l 0 ; instrument wave data
2222 dc.l 0 ; sample index
2223 dc.l 0 ; sample rate
2224 dc.l 0 ; instrument loop point
2225 dc.l 0 ; instrument data length
2226 dc.l 0 ; left volume table
2227 dc.l 0 ; right volume table
2228 dc.b 0 ; voice flags
2230 CNOP 0,4
2232 Voice25 dc.l Voice26
2233 dc.l 0 ; channel back-link
2234 dc.l 0 ; instrument wave data
2235 dc.l 0 ; sample index
2236 dc.l 0 ; sample rate
2237 dc.l 0 ; instrument loop point
2238 dc.l 0 ; instrument data length
2239 dc.l 0 ; left volume table
2240 dc.l 0 ; right volume table
2241 dc.b 0 ; voice flags
2243 CNOP 0,4
2245 Voice26 dc.l Voice27
2246 dc.l 0 ; channel back-link
2247 dc.l 0 ; instrument wave data
2248 dc.l 0 ; sample index
2249 dc.l 0 ; sample rate
2250 dc.l 0 ; instrument loop point
2251 dc.l 0 ; instrument data length
2252 dc.l 0 ; left volume table
2253 dc.l 0 ; right volume table
2254 dc.b 0 ; voice flags
2256 CNOP 0,4
2258 Voice27 dc.l Voice28
2259 dc.l 0 ; channel back-link
2260 dc.l 0 ; instrument wave data
2261 dc.l 0 ; sample index
2262 dc.l 0 ; sample rate
2263 dc.l 0 ; instrument loop point
2264 dc.l 0 ; instrument data length
2265 dc.l 0 ; left volume table
2266 dc.l 0 ; right volume table
2267 dc.b 0 ; voice flags
2269 CNOP 0,4
2271 Voice28 dc.l Voice29
2272 dc.l 0 ; channel back-link
2273 dc.l 0 ; instrument wave data
2274 dc.l 0 ; sample index
2275 dc.l 0 ; sample rate
2276 dc.l 0 ; instrument loop point
2277 dc.l 0 ; instrument data length
2278 dc.l 0 ; left volume table
2279 dc.l 0 ; right volume table
2280 dc.b 0 ; voice flags
2282 CNOP 0,4
2284 Voice29 dc.l Voice30
2285 dc.l 0 ; channel back-link
2286 dc.l 0 ; instrument wave data
2287 dc.l 0 ; sample index
2288 dc.l 0 ; sample rate
2289 dc.l 0 ; instrument loop point
2290 dc.l 0 ; instrument data length
2291 dc.l 0 ; left volume table
2292 dc.l 0 ; right volume table
2293 dc.b 0 ; voice flags
2295 CNOP 0,4
2297 Voice30 dc.l Voice31
2298 dc.l 0 ; channel back-link
2299 dc.l 0 ; instrument wave data
2300 dc.l 0 ; sample index
2301 dc.l 0 ; sample rate
2302 dc.l 0 ; instrument loop point
2303 dc.l 0 ; instrument data length
2304 dc.l 0 ; left volume table
2305 dc.l 0 ; right volume table
2306 dc.b 0 ; voice flags
2308 CNOP 0,4
2310 Voice31 dc.l 0
2311 dc.l 0 ; channel back-link
2312 dc.l 0 ; instrument wave data
2313 dc.l 0 ; sample index
2314 dc.l 0 ; sample rate
2315 dc.l 0 ; instrument loop point
2316 dc.l 0 ; instrument data length
2317 dc.l 0 ; left volume table
2318 dc.l 0 ; right volume table
2319 dc.b 0 ; voice flags
2321 ;--------------------------------------
2323 STRUCTURE InstrumentRec,0
2324 APTR in_Wave
2325 ULONG in_Loop
2326 ULONG in_Length
2327 BYTE in_Flags
2328 BYTE in_Base
2331 CNOP 0,4
2333 Instruments dcb.l 256,0
2335 CNOP 0,4
2337 QuietInst dc.l 0
2338 dc.l 0
2339 dc.l 0
2340 dc.b 0
2341 dc.b 0
2344 CNOP 0,4
2346 InstrHandle dc.l 0
2347 InstrFile dc.l InstrName
2348 InstrPool dc.l 0
2350 InstrName dc.b 'MIDI_Instruments',0
2352 CNOP 0,4
2354 validInstr dc.b %11111111 ; (00-07) Piano
2355 dc.b %11111111 ; (08-0F) Chrom Perc
2356 dc.b %11111111 ; (10-17) Organ
2357 dc.b %11111111 ; (18-1F) Guitar
2358 dc.b %11111111 ; (20-27) Bass
2359 dc.b %11111111 ; (28-2F) Strings
2360 dc.b %11111111 ; (30-37) Ensemble
2361 dc.b %11111111 ; (38-3F) Brass
2362 dc.b %11111111 ; (40-47) Reed
2363 dc.b %11111111 ; (48-4F) Pipe
2364 dc.b %11111111 ; (50-57) Synth Lead
2365 dc.b %11111111 ; (58-5F) Synth Pad
2366 dc.b %11111111 ; (60-67) Synth Effects
2367 dc.b %11111111 ; (68-6F) Ethnic
2368 dc.b %11111111 ; (70-77) Percussive
2369 dc.b %11111111 ; (78-7F) SFX
2370 dc.b %00000001 ; (80-87) invalid,Drum
2371 dc.b %11111111 ; (88-8F) Drums/Clap/Hi-Hat
2372 dc.b %11111111 ; (90-97) Hi-Hats/Toms/Cymb1
2373 dc.b %11111111 ; (98-9F) Cymbals/Bells/Slap
2374 dc.b %11111111 ; (A0-A7) Bongos/Congas/Timb
2375 dc.b %11111111 ; (A8-AF) Agogo/Whistles/Gui
2376 dc.b %11111100 ; (B0-B7) Claves/Block/Trian
2377 dc.b %00000000 ; (B8-BF) invalid
2378 dc.b %00000000 ; (C0-C7)
2379 dc.b %00000000 ; (C8-CF)
2380 dc.b %00000000 ; (D0-D7)
2381 dc.b %00000000 ; (D8-DF)
2382 dc.b %00000000 ; (E0-E7)
2383 dc.b %00000000 ; (E8-EF)
2384 dc.b %00000000 ; (F0-F7)
2385 dc.b %00000000 ; (F8-FF)
2387 ;--------------------------------------------------------------------
2388 section PlayMusChip,data_c
2390 chipBuffer dcb.b 1024,0
2392 ClearBuf dcb.b 160,0
2394 ;------------------------------------------------------------------------
2395 section PlayMusBSS,bss
2397 tempAudio ds.b 256
2399 ;------------------------------------------------------------------------