108 lines
3.9 KiB
OpenEdge ABL
108 lines
3.9 KiB
OpenEdge ABL
resetAudio LDWI 0x0000
|
|
STW midiCommand
|
|
STW midiDelay
|
|
STW midiNote
|
|
LDWI giga_soundChan1
|
|
STW midiScratch
|
|
LDWI title_screenMidi00 ; midi score
|
|
STW midiStreamPtr
|
|
|
|
LDI 0x04
|
|
ST ii
|
|
|
|
resetA_loop LDI giga_soundChan1 ; reset low byte
|
|
ST midiScratch
|
|
LDWI 0x0200
|
|
DOKE midiScratch ; wavA and wavX
|
|
INC midiScratch
|
|
INC midiScratch
|
|
LDWI 0x0000
|
|
DOKE midiScratch ; keyL and keyH
|
|
INC midiScratch
|
|
INC midiScratch
|
|
DOKE midiScratch ; oscL and oscH
|
|
INC midiScratch + 1 ; increment high byte
|
|
LoopCounter ii resetA_loop
|
|
RET
|
|
|
|
|
|
playMidi LDI 0x05 ; keep pumping soundTimer, so that global sound stays alive
|
|
ST giga_soundTimer
|
|
LD giga_frameCount
|
|
SUBW midiDelay
|
|
BEQ playM_start
|
|
RET
|
|
|
|
playM_start PUSH
|
|
playM_process LDW midiStreamPtr
|
|
PEEK ; get midi stream byte
|
|
STW midiCommand
|
|
LDW midiStreamPtr
|
|
ADDI 0x01
|
|
STW midiStreamPtr
|
|
LDI 0xF0
|
|
ANDW midiCommand
|
|
XORI 0x90 ; check for start note
|
|
BNE playM_endnote
|
|
|
|
CALL midiStartNote ; start note
|
|
BRA playM_process
|
|
|
|
playM_endnote XORI 0x10 ; check for end note
|
|
BNE playM_segment
|
|
|
|
CALL midiEndNote ; end note
|
|
BRA playM_process
|
|
|
|
|
|
playM_segment XORI 0x50 ; check for new segment
|
|
BNE playM_delay
|
|
|
|
LDW midiStreamPtr ; midi score
|
|
DEEK
|
|
STW midiStreamPtr ; 0xD0 new midi segment address
|
|
BRA playM_process
|
|
|
|
playM_delay LD giga_frameCount ; midiDelay = (midiCommand + peek(frameCount)) & 0x00FF
|
|
ADDW midiCommand
|
|
ST midiDelay
|
|
POP
|
|
RET
|
|
|
|
|
|
midiStartNote LDWI giga_notesTable ; note table in ROM
|
|
STW midiScratch
|
|
LDW midiStreamPtr ; midi score
|
|
PEEK
|
|
SUBI 11
|
|
LSLW
|
|
ADDW midiScratch
|
|
STW midiScratch
|
|
LUP 0x00 ; get ROM midi note low byte
|
|
ST midiNote
|
|
LDW midiScratch
|
|
LUP 0x01 ; get ROM midi note high byte
|
|
ST midiNote + 1
|
|
LDW midiCommand
|
|
ANDI 0x03 ; get channel
|
|
ADDI 0x01
|
|
ST midiScratch + 1
|
|
LDI 0xFC
|
|
ST midiScratch ; channels address 0x01FC <-> 0x04FC
|
|
LDW midiNote
|
|
DOKE midiScratch ; set note
|
|
LDW midiStreamPtr
|
|
ADDI 0x01 ; midiStreamPtr++
|
|
STW midiStreamPtr
|
|
RET
|
|
|
|
|
|
midiEndNote LDW midiCommand
|
|
ANDI 0x03 ; get channel
|
|
ADDI 0x01
|
|
ST midiScratch + 1
|
|
LDI 0xFC
|
|
ST midiScratch ; channels address 0x01FC <-> 0x04FC
|
|
LDWI 0x0000
|
|
DOKE midiScratch ; end note
|
|
RET |