*
* Lemmings GS : Midi routines
*
* (c) 1997, Brutal Deluxe
*

nbMUSIC = 13

dpSEQ = $80

seqOFFSET = $006
seqTEMPO = $18A
seqTPB = $190

*--------------------------------------

musicMEMORY PushWord #0
 _MSStatus
 pla
 beq musicMEMORY1

 inc fgMIDI
 inc fgSOUND
 sec
 rts

musicMEMORY1 PushLong #0
 PushLong #$10000
 PushWord myID
 PushWord #%11000000_00011100
 PushLong #0
 _NewHandle
 phd
 tsc
 tcd
 lda [3]
 sta ptrSEQ
 ldy #2
 lda [3],y
 sta ptrSEQ+2
 pld
 pla
 pla
 bcc musicMEMORY2

 inc fgMIDI

musicMEMORY2 PushLong #0
 PushLong #$10000
 PushWord myID
 PushWord #%11000000_00011100
 PushLong #0
 _NewHandle
 phd
 tsc
 tcd
 lda [3]
 sta ptrSOUND
 ldy #2
 lda [3],y
 sta ptrSOUND+2
 pld
 pla
 pla
 bcc musicMEMORY3

 inc fgMIDI
 inc fgSOUND
 sec
 rts

musicMEMORY3 lda ptrSOUND
 clc
 adc #$d000
 sta ptrBNK
 lda ptrSOUND+2
 adc #0
 sta ptrBNK+2

 PushLong #0
 PushLong #$10000
 PushWord myID
 PushWord #%11000000_00011100
 PushLong #0
 _NewHandle
 phd
 tsc
 tcd
 lda [3]
 sta ptrWAV
 ldy #2
 lda [3],y
 sta ptrWAV+2
 pld
 pla
 pla
 bcc musicMEMORY4

 inc fgMIDI
 sec
 rts

musicMEMORY4 stz fgMIDI
 stz fgSOUND

 clc
 rts

*--------------------------------------

initMIDI lda fgMIDI
 beq initMIDI1
 rts

initMIDI1 pha ; Check for AppleTalk
 _GetIRQEnable
 pla
 and #$20
 beq initMIDI2

 PushWord #0
 PushLong #aptkSTR1
 PushLong #aptkSTR2
 PushLong #aptkSTR3
 PushLong #aptkSTR4
 _TLTextMountVolume
 pla
 cmp #1
 beq initMIDI2

 inc fgMIDI
 rts

initMIDI2 lda myDP
 clc
 adc #512
 pha
 _SoundStartUp
 bcs initMIDI3

 PushWord #35 ; Load MidiSynth
 PushWord #$0000
 _LoadOneTool
 bcs initMIDI4

 _MSStartUp
 bcs initMIDI4

 rts

initMIDI3 inc fgSOUND
initMIDI4 inc fgMIDI
 rts

*--------------------------------------

stopMIDI lda fgMIDI
 bne stopMIDI1

 _KillAllNotes ; Stop MidiSynth
 _MSShutDown

 PushWord #35 ; unload MidiSynth
 _UnloadOneTool

stopMIDI1 lda fgSOUND
 bne stopMIDI2

 PushWord #$ffff ; Stop sounds
 _FFStopSound
 _SoundShutDown

stopMIDI2 rts

*--------------------------------------
* Les donnees des instruments
* qui seront en ram son
*

loadWAV lda fgMIDI
 beq loadWAV1
 sec
 rts

loadWAV1 lda #pWAV
 sta proOPEN+4
 lda #^pWAV
 sta proOPEN+6

 jsl proDOS
 dw $2010
 adrl proOPEN
 sta proERR

 lda proOPEN+2
 sta proSETMARK+2
 sta proREAD+2
 sta proCLOSE+2

 jsl proDOS
 dw $2016
 adrl proSETMARK

 lda ptrWAV
 sta proREAD+4
 lda ptrWAV+2
 sta proREAD+6

 lda #0
 sta proREAD+8
 lda #1
 sta proREAD+10

 jsl proDOS
 dw $2012
 adrl proREAD
 sta proERR

 jsl proDOS
 dw $2014
 adrl proCLOSE

*---

 lda proERR
 bne loadWAV2

 clc
 rts

loadWAV2 inc fgMIDI
 sec
 rts

*--------------------------------------
* Les donnees des instruments
* pour MidiSynth
*

loadBNK lda fgMIDI
 beq loadBNK1
 sec
 rts

loadBNK1 lda #1
 sta theDISK

 lda #$6060
 sta loadPATCH

 lda #pBNK
 ldx ptrBNK+2
 ldy ptrBNK
 jsr loadFILE

 lda #$eaea
 sta loadPATCH

*---

 lda proERR
 beq loadBNK2

 inc fgMIDI
 sec
 rts

loadBNK2 clc
 rts

*--------------------------------------

loadMUSIC phb
 phk
 plb

 tax

 lda fgMIDI
 beq loadMUSIC1

 plb
 rtl

loadMUSIC1 txa
 clc
 adc #1
loadMUSIC2 cmp #nbMUSIC
 bcc loadMUSIC3
 beq loadMUSIC3
 sec
 sbc #nbMUSIC
 bra loadMUSIC2

*---

loadMUSIC3 pha
 PushLong #strMUSIC
 PushWord #2
 PushWord #0 ; value is not signed
 _Int2Dec

 lda strMUSIC
 ora #'00'
 sta pSEQ+29

*---

 lda #1
 sta theDISK

 lda #$6060
 sta loadPATCH

 lda #pSEQ
 ldx ptrSEQ+2
 ldy ptrSEQ
 jsr loadFILE

 lda #$eaea
 sta loadPATCH

*---

 lda proERR
 sta noMIDI
 beq loadMUSIC4

 plb
 rtl

*--- Previously : playMUSIC

loadMUSIC4 lda fgSOUND
 bne loadMUSIC5

 PushWord #$ffff ; Stop sounds
 _FFStopSound

loadMUSIC5 _KillAllNotes

 phd
 lda myDP
 tcd

 lda ptrSEQ
 sta dpSEQ
 lda ptrSEQ+2
 sta dpSEQ+2

 ldy #seqOFFSET
 lda [dpSEQ],y
 clc
 adc ptrSEQ
 sta seqPlayRec
 lda #0
 adc ptrSEQ+2
 sta seqPlayRec+2

 ldy #seqTEMPO
 lda [dpSEQ],y
 asl
 sec
 sbc #10
 pha
 _SetTempo

 ldy #seqTPB
 lda [dpSEQ],y
 pha
 _SetBeat

*--- Toutes les pistes sont actives

 lda ptrBNK
 clc
 adc #$400
 sta ptrINST
 lda ptrBNK+2
 adc #0
 sta ptrINST+2

 stz monINDICE

]lp PushWord monINDICE
 PushWord #$8000
 _SetPlayTrack

 PushWord monINDICE
 PushWord #-1
 _TrackToChannel

 PushWord monINDICE
 PushWord #2
 _SetTrackOut

 PushLong ptrINST
 PushWord monINDICE
 _SetInstrument

 lda ptrINST
 clc
 adc #$120
 sta ptrINST
 lda ptrINST+2
 adc #0
 sta ptrINST+2

 inc monINDICE
 lda monINDICE
 cmp #16
 bne ]lp

*---

 sei

 PushLong ptrWAV
 PushWord #0 ; docStart
 PushWord #0 ; byteCount (=64ko)
 _WriteRamBlock

 PushLong #callBackRec
 _SetCallBack

 PushWord #0
 PushWord #0
 PushLong seqClock
 PushLong seqPlayRec
 _Locate
 PullLong seqPlayRec

 cli

 pld
 plb
 rtl

*--------------------------------------

playMUSIC phb
 phk
 plb

 lda fgMIDI
 ora noMIDI
 beq playMUSIC1
 plb
 rtl

*---

playMUSIC1 lda #$0100
 sta seqPlay

 PushLong #seqPlayRec
 _SeqPlayer

 plb
 rtl

*--------------------------------------

replayMUSIC lda #1
replayMUSIC1 stal $012000
 rtl

*--------------------------------------

stopMUSIC phb
 phk
 plb

 lda fgMIDI
 beq stopMUSIC1
 plb
 rtl

stopMUSIC1 lda noMIDI
 bne stopMUSIC2

 stz seqPlay

 PushLong #seqPlayRec
 _SeqPlayer

 _KillAllNotes

stopMUSIC2 lda fgSOUND
 bne stopMUSIC3

 PushWord #$ffff ; Stop sounds
 _FFStopSound

stopMUSIC3 plb
 rtl

*--------------------------------------

loadSOUND lda fgSOUND
 beq loadSOUND1
 rts

loadSOUND1 lda #1
 sta theDISK

 lda #$6060
 sta loadPATCH

 lda #pSOUND
 ldx ptrSOUND+2
 ldy ptrSOUND
 jsr loadFILE

 lda #$eaea
 sta loadPATCH

 lda proERR
 beq loadSOUND2

 inc fgSOUND

loadSOUND2 rts

*--------------------------------------

playSOUND phb
 phk
 plb

 dec
 sta curSOUND

 lda fgSOUND
 beq playSOUND1

 plb
 rtl

playSOUND1 lda seqPlay
 beq playSOUND2

 _MSSuspend

playSOUND2 lda curSOUND
 asl
 tax
 lda soundSTART,x
 xba
 clc
 adc ptrSOUND
 sta waveSTART
 lda #0
 adc ptrSOUND+2
 sta waveSTART+2

 lda soundSIZE,x
 sta waveSIZE

 lda soundFREQ,x
 sta waveFREQ

 PushWord #%0000_0000_1000_0000
 _FFStopSound

 PushWord #$0701
 PushLong #waveSTART
 _FFStartSound

 lda seqPlay
 beq playSOUND3

 _MSResume

playSOUND3 plb
 rtl

*-------------------------------------- DATA

monINDICE ds 2

*--- GS/OS Strings

pSEQ strl '1/Lemmings.Data/Music/Music01'
pWAV strl '1/Lemmings.Data/Music/Midi.Wav'
pBNK strl '1/Lemmings.Data/Music/Midi.Bnk'
pSOUND strl '1/Lemmings.Data/Music/Sounds'

strMUSIC asc '  '

*--- Memory

ptrSEQ ds 4
ptrWAV ds 4
ptrBNK ds 4
ptrSOUND ds 4

*--- Flags

fgMIDI dw 1
noMIDI dw -1 ; cannot play current song
fgSOUND dw 1

*--- Donnees Sound Tool Set

waveSTART ds 4 ; waveStart
waveSIZE ds 2 ; waveSize
waveFREQ ds 2 ; freqOffset
 dw $0000 ; docBuffer
 dw $0000 ; bufferSize
 ds 4 ; nextWavePtr
 dw 255 ; volSetting

curSOUND ds 2

*- Offset des sons

soundSTART dw $00,$04,$16,$26,$2A,$3A,$4A,$4E
 dw $62,$72,$8A,$9E,$AD,$BD,$BF

soundSIZE dw $04,$12,$10,$04,$10,$10,$04,$14
 dw $10,$18,$14,$0F,$10,$02,$11

* frequence = ((32 * frequence en Hertz) / 1645)

soundFREQ dw 72,108,144,163,433,144,216,108
 dw 194,137,206,98,163,144,196

*--- Instruments

ptrINST ds 4

*--- MidiSynth

seqPlayRec ds 4
 ds 4
 ds 4
 ds 4
seqPlay ds 2 ; Play
seqClock ds 4

callBackRec adrl replayMUSIC ; When sequence ends !
 ds 4
 ds 4
 ds 4
 ds 4
 ds 4
 ds 4
 ds 4
 ds 4
 ds 4
 ds 4
 ds 4
 ds 4
 ds 4
