mirror of
https://github.com/pret/pokepinballrs.git
synced 2026-03-21 17:24:13 -05:00
update m4a library
This commit is contained in:
parent
840dc3e1c2
commit
b97a0894bf
577
asm/m4a_3.s
577
asm/m4a_3.s
|
|
@ -1,577 +0,0 @@
|
|||
.include "asm/macros.inc"
|
||||
.include "constants/gba_constants.inc"
|
||||
.include "constants/m4a_constants.inc"
|
||||
|
||||
.syntax unified
|
||||
|
||||
@ extern
|
||||
.set gCgb3Vol, 0x0852DAFC
|
||||
|
||||
.text
|
||||
|
||||
thumb_func_start CgbSound
|
||||
CgbSound: @ 8054920
|
||||
push {r4-r7,lr}
|
||||
mov r7, r10
|
||||
mov r6, r9
|
||||
mov r5, r8
|
||||
push {r5-r7}
|
||||
sub sp, 0x1C
|
||||
ldr r0, =SOUND_INFO_PTR
|
||||
ldr r0, [r0]
|
||||
str r0, [sp, 0x4]
|
||||
ldrb r0, [r0, 0xA]
|
||||
cmp r0, 0
|
||||
beq _08054944
|
||||
subs r0, 0x1
|
||||
ldr r1, [sp, 0x4]
|
||||
strb r0, [r1, 0xA]
|
||||
b _0805494A
|
||||
.pool
|
||||
_08054944:
|
||||
movs r0, 0xE
|
||||
ldr r2, [sp, 0x4]
|
||||
strb r0, [r2, 0xA]
|
||||
_0805494A:
|
||||
movs r6, 0x1
|
||||
ldr r0, [sp, 0x4]
|
||||
ldr r4, [r0, 0x1C]
|
||||
_08054950:
|
||||
ldrb r1, [r4]
|
||||
movs r0, 0xC7
|
||||
ands r0, r1
|
||||
adds r2, r6, 0x1
|
||||
mov r10, r2
|
||||
movs r2, 0x40
|
||||
adds r2, r4
|
||||
mov r9, r2
|
||||
cmp r0, 0
|
||||
bne _08054966
|
||||
b _08054D50
|
||||
_08054966:
|
||||
cmp r6, 0x2
|
||||
beq _08054988
|
||||
cmp r6, 0x2
|
||||
bgt _08054974
|
||||
cmp r6, 0x1
|
||||
beq _0805497A
|
||||
b _080549D0
|
||||
_08054974:
|
||||
cmp r6, 0x3
|
||||
beq _080549B0
|
||||
b _080549D0
|
||||
_0805497A:
|
||||
ldr r0, =REG_NR10
|
||||
str r0, [sp, 0x8]
|
||||
ldr r7, =REG_NR11
|
||||
ldr r2, =REG_NR12
|
||||
str r2, [sp, 0xC]
|
||||
adds r0, 0x4
|
||||
str r0, [sp, 0x10]
|
||||
adds r2, 0x2
|
||||
b _080549E0
|
||||
.pool
|
||||
_08054988:
|
||||
ldr r0, =REG_NR10 + 1
|
||||
str r0, [sp, 0x8]
|
||||
ldr r7, =REG_NR21
|
||||
ldr r2, =REG_NR22
|
||||
b _080549D8
|
||||
.pool
|
||||
_080549B0:
|
||||
ldr r0, =REG_NR30
|
||||
str r0, [sp, 0x8]
|
||||
ldr r7, =REG_NR31
|
||||
ldr r2, =REG_NR32
|
||||
str r2, [sp, 0xC]
|
||||
adds r0, 0x4
|
||||
str r0, [sp, 0x10]
|
||||
adds r2, 0x2
|
||||
b _080549E0
|
||||
.pool
|
||||
_080549D0:
|
||||
ldr r0, =REG_NR30 + 1
|
||||
str r0, [sp, 0x8]
|
||||
ldr r7, =REG_NR41
|
||||
ldr r2, =REG_NR42
|
||||
_080549D8:
|
||||
str r2, [sp, 0xC]
|
||||
adds r0, 0xB
|
||||
str r0, [sp, 0x10]
|
||||
adds r2, 0x4
|
||||
_080549E0:
|
||||
str r2, [sp, 0x14]
|
||||
ldr r0, [sp, 0x4]
|
||||
ldrb r0, [r0, 0xA]
|
||||
str r0, [sp]
|
||||
ldr r2, [sp, 0xC]
|
||||
ldrb r0, [r2]
|
||||
mov r8, r0
|
||||
adds r2, r1, 0
|
||||
movs r0, 0x80
|
||||
ands r0, r2
|
||||
cmp r0, 0
|
||||
beq _08054AD6
|
||||
movs r3, 0x40
|
||||
adds r0, r3, 0
|
||||
ands r0, r2
|
||||
lsls r0, 24
|
||||
lsrs r5, r0, 24
|
||||
adds r0, r6, 0x1
|
||||
mov r10, r0
|
||||
movs r1, 0x40
|
||||
adds r1, r4
|
||||
mov r9, r1
|
||||
cmp r5, 0
|
||||
bne _08054AFA
|
||||
movs r0, 0x3
|
||||
strb r0, [r4]
|
||||
strb r0, [r4, 0x1D]
|
||||
adds r0, r4, 0
|
||||
str r3, [sp, 0x18]
|
||||
bl CgbModVol
|
||||
ldr r3, [sp, 0x18]
|
||||
cmp r6, 0x2
|
||||
beq _08054A48
|
||||
cmp r6, 0x2
|
||||
bgt _08054A3C
|
||||
cmp r6, 0x1
|
||||
beq _08054A42
|
||||
b _08054A9C
|
||||
.pool
|
||||
_08054A3C:
|
||||
cmp r6, 0x3
|
||||
beq _08054A54
|
||||
b _08054A9C
|
||||
_08054A42:
|
||||
ldrb r0, [r4, 0x1F]
|
||||
ldr r2, [sp, 0x8]
|
||||
strb r0, [r2]
|
||||
_08054A48:
|
||||
ldr r0, [r4, 0x24]
|
||||
lsls r0, 6
|
||||
ldrb r1, [r4, 0x1E]
|
||||
adds r0, r1, r0
|
||||
strb r0, [r7]
|
||||
b _08054AA8
|
||||
_08054A54:
|
||||
ldr r1, [r4, 0x24]
|
||||
ldr r0, [r4, 0x28]
|
||||
cmp r1, r0
|
||||
beq _08054A7C
|
||||
ldr r2, [sp, 0x8]
|
||||
strb r3, [r2]
|
||||
ldr r1, =REG_WAVE_RAM
|
||||
ldr r2, [r4, 0x24]
|
||||
ldr r0, [r2]
|
||||
str r0, [r1]
|
||||
adds r1, 0x4
|
||||
ldr r0, [r2, 0x4]
|
||||
str r0, [r1]
|
||||
adds r1, 0x4
|
||||
ldr r0, [r2, 0x8]
|
||||
str r0, [r1]
|
||||
adds r1, 0x4
|
||||
ldr r0, [r2, 0xC]
|
||||
str r0, [r1]
|
||||
str r2, [r4, 0x28]
|
||||
_08054A7C:
|
||||
ldr r0, [sp, 0x8]
|
||||
strb r5, [r0]
|
||||
ldrb r0, [r4, 0x1E]
|
||||
strb r0, [r7]
|
||||
ldrb r0, [r4, 0x1E]
|
||||
cmp r0, 0
|
||||
beq _08054A94
|
||||
movs r0, 0xC0
|
||||
b _08054AB6
|
||||
.pool
|
||||
_08054A94:
|
||||
movs r1, 0x80
|
||||
negs r1, r1
|
||||
strb r1, [r4, 0x1A]
|
||||
b _08054AB8
|
||||
_08054A9C:
|
||||
ldrb r0, [r4, 0x1E]
|
||||
strb r0, [r7]
|
||||
ldr r0, [r4, 0x24]
|
||||
lsls r0, 3
|
||||
ldr r2, [sp, 0x10]
|
||||
strb r0, [r2]
|
||||
_08054AA8:
|
||||
ldrb r0, [r4, 0x4]
|
||||
adds r0, 0x8
|
||||
mov r8, r0
|
||||
ldrb r0, [r4, 0x1E]
|
||||
cmp r0, 0
|
||||
beq _08054AB6
|
||||
movs r0, 0x40
|
||||
_08054AB6:
|
||||
strb r0, [r4, 0x1A]
|
||||
_08054AB8:
|
||||
ldrb r1, [r4, 0x4]
|
||||
movs r2, 0
|
||||
strb r1, [r4, 0xB]
|
||||
movs r0, 0xFF
|
||||
ands r0, r1
|
||||
adds r1, r6, 0x1
|
||||
mov r10, r1
|
||||
movs r1, 0x40
|
||||
adds r1, r4
|
||||
mov r9, r1
|
||||
cmp r0, 0
|
||||
bne _08054AD2
|
||||
b _08054C0E
|
||||
_08054AD2:
|
||||
strb r2, [r4, 0x9]
|
||||
b _08054C3C
|
||||
_08054AD6:
|
||||
movs r0, 0x4
|
||||
ands r0, r2
|
||||
cmp r0, 0
|
||||
beq _08054B08
|
||||
ldrb r0, [r4, 0xD]
|
||||
subs r0, 0x1
|
||||
strb r0, [r4, 0xD]
|
||||
movs r2, 0xFF
|
||||
ands r0, r2
|
||||
lsls r0, 24
|
||||
adds r1, r6, 0x1
|
||||
mov r10, r1
|
||||
movs r2, 0x40
|
||||
adds r2, r4
|
||||
mov r9, r2
|
||||
cmp r0, 0
|
||||
ble _08054AFA
|
||||
b _08054C4E
|
||||
_08054AFA:
|
||||
lsls r0, r6, 24
|
||||
lsrs r0, 24
|
||||
bl CgbOscOff
|
||||
movs r0, 0
|
||||
strb r0, [r4]
|
||||
b _08054D4C
|
||||
_08054B08:
|
||||
movs r0, 0x40
|
||||
ands r0, r1
|
||||
adds r2, r6, 0x1
|
||||
mov r10, r2
|
||||
movs r2, 0x40
|
||||
adds r2, r4
|
||||
mov r9, r2
|
||||
cmp r0, 0
|
||||
beq _08054B48
|
||||
movs r0, 0x3
|
||||
ands r0, r1
|
||||
cmp r0, 0
|
||||
beq _08054B48
|
||||
movs r0, 0xFC
|
||||
ands r0, r1
|
||||
movs r2, 0
|
||||
strb r0, [r4]
|
||||
ldrb r1, [r4, 0x7]
|
||||
strb r1, [r4, 0xB]
|
||||
movs r0, 0xFF
|
||||
ands r0, r1
|
||||
cmp r0, 0
|
||||
beq _08054B7A
|
||||
movs r0, 0x1
|
||||
ldrb r1, [r4, 0x1D]
|
||||
orrs r0, r1
|
||||
strb r0, [r4, 0x1D]
|
||||
cmp r6, 0x3
|
||||
beq _08054C3C
|
||||
ldrb r2, [r4, 0x7]
|
||||
mov r8, r2
|
||||
b _08054C3C
|
||||
_08054B48:
|
||||
ldrb r0, [r4, 0xB]
|
||||
cmp r0, 0
|
||||
bne _08054C3C
|
||||
cmp r6, 0x3
|
||||
bne _08054B5A
|
||||
movs r0, 0x1
|
||||
ldrb r1, [r4, 0x1D]
|
||||
orrs r0, r1
|
||||
strb r0, [r4, 0x1D]
|
||||
_08054B5A:
|
||||
adds r0, r4, 0
|
||||
bl CgbModVol
|
||||
movs r0, 0x3
|
||||
ldrb r2, [r4]
|
||||
ands r0, r2
|
||||
cmp r0, 0
|
||||
bne _08054BAE
|
||||
ldrb r0, [r4, 0x9]
|
||||
subs r0, 0x1
|
||||
strb r0, [r4, 0x9]
|
||||
movs r1, 0xFF
|
||||
ands r0, r1
|
||||
lsls r0, 24
|
||||
cmp r0, 0
|
||||
bgt _08054BAA
|
||||
_08054B7A:
|
||||
ldrb r2, [r4, 0xC]
|
||||
ldrb r1, [r4, 0xA]
|
||||
adds r0, r2, 0
|
||||
muls r0, r1
|
||||
adds r0, 0xFF
|
||||
asrs r0, 8
|
||||
movs r1, 0
|
||||
strb r0, [r4, 0x9]
|
||||
lsls r0, 24
|
||||
cmp r0, 0
|
||||
beq _08054AFA
|
||||
movs r0, 0x4
|
||||
ldrb r2, [r4]
|
||||
orrs r0, r2
|
||||
strb r0, [r4]
|
||||
movs r0, 0x1
|
||||
ldrb r1, [r4, 0x1D]
|
||||
orrs r0, r1
|
||||
strb r0, [r4, 0x1D]
|
||||
cmp r6, 0x3
|
||||
beq _08054C4E
|
||||
movs r2, 0x8
|
||||
mov r8, r2
|
||||
b _08054C4E
|
||||
_08054BAA:
|
||||
ldrb r0, [r4, 0x7]
|
||||
b _08054C3A
|
||||
_08054BAE:
|
||||
cmp r0, 0x1
|
||||
bne _08054BBA
|
||||
_08054BB2:
|
||||
ldrb r0, [r4, 0x19]
|
||||
strb r0, [r4, 0x9]
|
||||
movs r0, 0x7
|
||||
b _08054C3A
|
||||
_08054BBA:
|
||||
cmp r0, 0x2
|
||||
bne _08054BFE
|
||||
ldrb r0, [r4, 0x9]
|
||||
subs r0, 0x1
|
||||
strb r0, [r4, 0x9]
|
||||
movs r1, 0xFF
|
||||
ands r0, r1
|
||||
lsls r0, 24
|
||||
ldrb r2, [r4, 0x19]
|
||||
lsls r1, r2, 24
|
||||
cmp r0, r1
|
||||
bgt _08054BFA
|
||||
_08054BD2:
|
||||
ldrb r0, [r4, 0x6]
|
||||
cmp r0, 0
|
||||
bne _08054BE2
|
||||
movs r0, 0xFC
|
||||
ldrb r1, [r4]
|
||||
ands r0, r1
|
||||
strb r0, [r4]
|
||||
b _08054B7A
|
||||
_08054BE2:
|
||||
ldrb r0, [r4]
|
||||
subs r0, 0x1
|
||||
strb r0, [r4]
|
||||
movs r0, 0x1
|
||||
ldrb r2, [r4, 0x1D]
|
||||
orrs r0, r2
|
||||
strb r0, [r4, 0x1D]
|
||||
cmp r6, 0x3
|
||||
beq _08054BB2
|
||||
movs r0, 0x8
|
||||
mov r8, r0
|
||||
b _08054BB2
|
||||
_08054BFA:
|
||||
ldrb r0, [r4, 0x5]
|
||||
b _08054C3A
|
||||
_08054BFE:
|
||||
ldrb r0, [r4, 0x9]
|
||||
adds r0, 0x1
|
||||
strb r0, [r4, 0x9]
|
||||
movs r1, 0xFF
|
||||
ands r0, r1
|
||||
ldrb r2, [r4, 0xA]
|
||||
cmp r0, r2
|
||||
bcc _08054C38
|
||||
_08054C0E:
|
||||
ldrb r0, [r4]
|
||||
subs r0, 0x1
|
||||
movs r2, 0
|
||||
strb r0, [r4]
|
||||
ldrb r1, [r4, 0x5]
|
||||
strb r1, [r4, 0xB]
|
||||
movs r0, 0xFF
|
||||
ands r0, r1
|
||||
cmp r0, 0
|
||||
beq _08054BD2
|
||||
movs r0, 0x1
|
||||
ldrb r1, [r4, 0x1D]
|
||||
orrs r0, r1
|
||||
strb r0, [r4, 0x1D]
|
||||
ldrb r0, [r4, 0xA]
|
||||
strb r0, [r4, 0x9]
|
||||
cmp r6, 0x3
|
||||
beq _08054C3C
|
||||
ldrb r2, [r4, 0x5]
|
||||
mov r8, r2
|
||||
b _08054C3C
|
||||
_08054C38:
|
||||
ldrb r0, [r4, 0x4]
|
||||
_08054C3A:
|
||||
strb r0, [r4, 0xB]
|
||||
_08054C3C:
|
||||
ldrb r0, [r4, 0xB]
|
||||
subs r0, 0x1
|
||||
strb r0, [r4, 0xB]
|
||||
ldr r0, [sp]
|
||||
cmp r0, 0
|
||||
bne _08054C4E
|
||||
subs r0, 0x1
|
||||
str r0, [sp]
|
||||
b _08054B48
|
||||
_08054C4E:
|
||||
movs r0, 0x2
|
||||
ldrb r1, [r4, 0x1D]
|
||||
ands r0, r1
|
||||
cmp r0, 0
|
||||
beq _08054CC6
|
||||
cmp r6, 0x3
|
||||
bgt _08054C8E
|
||||
movs r0, 0x8
|
||||
ldrb r2, [r4, 0x1]
|
||||
ands r0, r2
|
||||
cmp r0, 0
|
||||
beq _08054C8E
|
||||
ldr r0, =REG_SOUNDBIAS + 1
|
||||
ldrb r0, [r0]
|
||||
cmp r0, 0x3F
|
||||
bgt _08054C80
|
||||
ldr r0, [r4, 0x20]
|
||||
adds r0, 0x2
|
||||
ldr r1, =0x000007fc
|
||||
b _08054C8A
|
||||
.pool
|
||||
_08054C80:
|
||||
cmp r0, 0x7F
|
||||
bgt _08054C8E
|
||||
ldr r0, [r4, 0x20]
|
||||
adds r0, 0x1
|
||||
ldr r1, =0x000007fe
|
||||
_08054C8A:
|
||||
ands r0, r1
|
||||
str r0, [r4, 0x20]
|
||||
_08054C8E:
|
||||
cmp r6, 0x4
|
||||
beq _08054CA0
|
||||
ldr r0, [r4, 0x20]
|
||||
ldr r1, [sp, 0x10]
|
||||
strb r0, [r1]
|
||||
b _08054CAE
|
||||
.pool
|
||||
_08054CA0:
|
||||
ldr r2, [sp, 0x10]
|
||||
ldrb r0, [r2]
|
||||
movs r1, 0x8
|
||||
ands r1, r0
|
||||
ldr r0, [r4, 0x20]
|
||||
orrs r0, r1
|
||||
strb r0, [r2]
|
||||
_08054CAE:
|
||||
movs r0, 0xC0
|
||||
ldrb r1, [r4, 0x1A]
|
||||
ands r0, r1
|
||||
adds r1, r4, 0
|
||||
adds r1, 0x21
|
||||
ldrb r1, [r1]
|
||||
adds r0, r1, r0
|
||||
strb r0, [r4, 0x1A]
|
||||
movs r2, 0xFF
|
||||
ands r0, r2
|
||||
ldr r1, [sp, 0x14]
|
||||
strb r0, [r1]
|
||||
_08054CC6:
|
||||
movs r0, 0x1
|
||||
ldrb r2, [r4, 0x1D]
|
||||
ands r0, r2
|
||||
cmp r0, 0
|
||||
beq _08054D4C
|
||||
ldr r1, =REG_NR51
|
||||
ldrb r0, [r1]
|
||||
ldrb r2, [r4, 0x1C]
|
||||
bics r0, r2
|
||||
ldrb r2, [r4, 0x1B]
|
||||
orrs r0, r2
|
||||
strb r0, [r1]
|
||||
cmp r6, 0x3
|
||||
bne _08054D18
|
||||
ldr r0, =gCgb3Vol
|
||||
ldrb r1, [r4, 0x9]
|
||||
adds r0, r1, r0
|
||||
ldrb r0, [r0]
|
||||
ldr r2, [sp, 0xC]
|
||||
strb r0, [r2]
|
||||
movs r1, 0x80
|
||||
adds r0, r1, 0
|
||||
ldrb r2, [r4, 0x1A]
|
||||
ands r0, r2
|
||||
cmp r0, 0
|
||||
beq _08054D4C
|
||||
ldr r0, [sp, 0x8]
|
||||
strb r1, [r0]
|
||||
ldrb r0, [r4, 0x1A]
|
||||
ldr r1, [sp, 0x14]
|
||||
strb r0, [r1]
|
||||
movs r0, 0x7F
|
||||
ldrb r2, [r4, 0x1A]
|
||||
ands r0, r2
|
||||
strb r0, [r4, 0x1A]
|
||||
b _08054D4C
|
||||
.pool
|
||||
_08054D18:
|
||||
movs r0, 0xF
|
||||
mov r1, r8
|
||||
ands r1, r0
|
||||
mov r8, r1
|
||||
ldrb r2, [r4, 0x9]
|
||||
lsls r0, r2, 4
|
||||
add r0, r8
|
||||
ldr r1, [sp, 0xC]
|
||||
strb r0, [r1]
|
||||
movs r2, 0x80
|
||||
ldrb r0, [r4, 0x1A]
|
||||
orrs r0, r2
|
||||
ldr r1, [sp, 0x14]
|
||||
strb r0, [r1]
|
||||
cmp r6, 0x1
|
||||
bne _08054D4C
|
||||
ldr r0, [sp, 0x8]
|
||||
ldrb r1, [r0]
|
||||
movs r0, 0x8
|
||||
ands r0, r1
|
||||
cmp r0, 0
|
||||
bne _08054D4C
|
||||
ldrb r0, [r4, 0x1A]
|
||||
orrs r0, r2
|
||||
ldr r1, [sp, 0x14]
|
||||
strb r0, [r1]
|
||||
_08054D4C:
|
||||
movs r0, 0
|
||||
strb r0, [r4, 0x1D]
|
||||
_08054D50:
|
||||
mov r6, r10
|
||||
mov r4, r9
|
||||
cmp r6, 0x4
|
||||
bgt _08054D5A
|
||||
b _08054950
|
||||
_08054D5A:
|
||||
add sp, 0x1C
|
||||
pop {r3-r5}
|
||||
mov r8, r3
|
||||
mov r9, r4
|
||||
mov r10, r5
|
||||
pop {r4-r7}
|
||||
pop {r0}
|
||||
bx r0
|
||||
thumb_func_end CgbSound
|
||||
|
||||
.align 2, 0 @ Don't pad with nop.
|
||||
|
|
@ -5,7 +5,7 @@ gMPlayJumpTable
|
|||
gCgbChans
|
||||
gPokemonCryTracks
|
||||
gPokemonCrySong
|
||||
gMPlayInfo_02032EE0
|
||||
gMPlayInfo_BGM
|
||||
gMPlayInfo_SE1
|
||||
gMPlayInfo_SE2
|
||||
gMPlayMemAccArea
|
||||
|
|
@ -16,83 +16,6 @@ void sub_11F0(int arg0);
|
|||
void sub_11FC(void);
|
||||
void sub_1340(void);
|
||||
|
||||
// src/m4a_2.c
|
||||
|
||||
/*
|
||||
u32 MidiKeyToFreq(struct WaveData *wav, u8 key, u8 fineAdjust);
|
||||
void UnusedDummyFunc();
|
||||
void MPlayContinue(struct MusicPlayerInfo *mplayInfo);
|
||||
void MPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed);
|
||||
void m4aSoundInit(void);
|
||||
void m4aSoundMain(void);
|
||||
void m4aSongNumStart(u16 n);
|
||||
void m4aSongNumStartOrChange(u16 n);
|
||||
void m4aSongNumStartOrContinue(u16 n);
|
||||
void m4aSongNumStop(u16 n);
|
||||
void m4aSongNumContinue(u16 n);
|
||||
void m4aMPlayAllStop(void);
|
||||
void m4aMPlayContinue(struct MusicPlayerInfo *mplayInfo);
|
||||
void m4aMPlayAllContinue(void);
|
||||
void m4aMPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed);
|
||||
void m4aMPlayFadeOutTemporarily(struct MusicPlayerInfo *mplayInfo, u16 speed);
|
||||
void m4aMPlayFadeIn(struct MusicPlayerInfo *mplayInfo, u16 speed);
|
||||
void m4aMPlayImmInit(struct MusicPlayerInfo *mplayInfo);
|
||||
void MPlayExtender(struct CgbChannel *cgbChans);
|
||||
void MusicPlayerJumpTableCopy(void);
|
||||
void ClearChain(void *x);
|
||||
void Clear64byte(void *x);
|
||||
void SoundInit(struct SoundInfo *soundInfo);
|
||||
void SampleFreqSet(u32 freq);
|
||||
void m4aSoundMode(u32 mode);
|
||||
void SoundClear(void);
|
||||
void m4aSoundVSyncOff(void);
|
||||
void m4aSoundVSyncOn(void);
|
||||
void MPlayOpen(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *tracks, u8 trackCount);
|
||||
void MPlayStart(struct MusicPlayerInfo *mplayInfo, struct SongHeader *songHeader);
|
||||
void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo);
|
||||
void FadeOutBody(struct MusicPlayerInfo *mplayInfo);
|
||||
void TrkVolPitSet(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
|
||||
u32 MidiKeyToCgbFreq(u8 chanNum, u8 key, u8 fineAdjust);
|
||||
void CgbOscOff(u8 chanNum);
|
||||
void CgbModVol(struct CgbChannel *chan);
|
||||
|
||||
// src/m4a_4.c
|
||||
|
||||
void m4aMPlayTempoControl(struct MusicPlayerInfo *mplayInfo, u16 tempo);
|
||||
void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 volume);
|
||||
void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s16 pitch);
|
||||
void m4aMPlayPanpotControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s8 pan);
|
||||
void ClearModM(struct MusicPlayerTrack *track);
|
||||
void m4aMPlayModDepthSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 modDepth);
|
||||
void m4aMPlayLFOSpeedSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 lfoSpeed);
|
||||
void ply_memacc(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
|
||||
void ply_xcmd(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
|
||||
void ply_xxx(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
|
||||
void ply_xwave(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
|
||||
void ply_xtype(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
|
||||
void ply_xatta(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
|
||||
void ply_xdeca(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
|
||||
void ply_xsust(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
|
||||
void ply_xrele(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
|
||||
void ply_xiecv(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
|
||||
void ply_xiecl(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
|
||||
void ply_xleng(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
|
||||
void ply_xswee(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
|
||||
void ply_xcmd_0C(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
|
||||
void ply_xcmd_0D(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
|
||||
void DummyFunc(void);
|
||||
void SetPokemonCryVolume(u8 val);
|
||||
void SetPokemonCryPanpot(s8 val);
|
||||
void SetPokemonCryPitch(s16 val);
|
||||
void SetPokemonCryLength(u16 val);
|
||||
void SetPokemonCryRelease(u8 val);
|
||||
void SetPokemonCryProgress(u32 val);
|
||||
int IsPokemonCryPlaying(struct MusicPlayerInfo *mplayInfo);
|
||||
void SetPokemonCryChorus(s8 val);
|
||||
void SetPokemonCryStereo(u32 val);
|
||||
void SetPokemonCryPriority(u8 val);
|
||||
*/
|
||||
|
||||
// src/main.c
|
||||
|
||||
void AgbMain(void);
|
||||
|
|
|
|||
|
|
@ -100,7 +100,7 @@ struct CgbChannel
|
|||
u8 le;
|
||||
u8 sw;
|
||||
u32 fr;
|
||||
u32 wp;
|
||||
u32 *wp;
|
||||
u32 cp;
|
||||
u32 tp;
|
||||
u32 pp;
|
||||
|
|
|
|||
|
|
@ -3,15 +3,13 @@
|
|||
|
||||
#include "gba/m4a_internal.h"
|
||||
|
||||
// TODO: import m4a library from pokeemerald
|
||||
|
||||
void m4aSoundVSync(void);
|
||||
void m4aSoundVSyncOn(void);
|
||||
|
||||
void m4aSoundInit(void);
|
||||
void m4aSoundMain(void);
|
||||
void m4aSongNumStart(u16);
|
||||
void m4aSongNumStop(u16 n);
|
||||
void m4aSongNumStart(u16 n);
|
||||
void m4aSongNumStartOrChange(u16 n);
|
||||
void m4aMPlayAllStop(void);
|
||||
void m4aMPlayContinue(struct MusicPlayerInfo *mplayInfo);
|
||||
void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 volume);
|
||||
|
|
@ -20,7 +18,9 @@ void m4aMPlayFadeOutTemporarily(struct MusicPlayerInfo *mplayInfo, u16 speed);
|
|||
void m4aMPlayFadeIn(struct MusicPlayerInfo *mplayInfo, u16 speed);
|
||||
void m4aMPlayImmInit(struct MusicPlayerInfo *mplayInfo);
|
||||
|
||||
extern struct MusicPlayerInfo gMPlayInfo_02032EE0;
|
||||
extern struct MusicPlayerInfo gMPlayInfo_BGM;
|
||||
extern struct MusicPlayerInfo gMPlayInfo_SE1;
|
||||
extern struct MusicPlayerInfo gMPlayInfo_SE2;
|
||||
extern struct SoundInfo gSoundInfo;
|
||||
|
||||
#endif //GUARD_M4A_H
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ extern u8 gUnknown_02002808[];
|
|||
//extern ? gCgbChans;
|
||||
//extern ? gPokemonCryTracks;
|
||||
//extern ? gPokemonCrySong;
|
||||
//extern ? gMPlayInfo_02032EE0;
|
||||
//extern ? gMPlayInfo_BGM;
|
||||
//extern ? gMPlayMemAccArea;
|
||||
extern const u16 gWildMonLocations[][2][8];
|
||||
extern const s16 gUnknown_08055C44[];
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ SECTIONS
|
|||
/* .bss starts at 0x3000000 */
|
||||
<BSS>
|
||||
/* .bss.code starts at 0x3007400 */
|
||||
src/m4a_2.o(.bss.code);
|
||||
src/m4a.o(.bss.code);
|
||||
|
||||
. = 0x8000;
|
||||
}
|
||||
|
|
@ -48,9 +48,7 @@ SECTIONS
|
|||
asm/options.o(.text);
|
||||
asm/rom_528AC.o(.text);
|
||||
asm/m4a_1.o(.text);
|
||||
src/m4a_2.o(.text);
|
||||
asm/m4a_3.o(.text);
|
||||
src/m4a_4.o(.text);
|
||||
src/m4a.o(.text);
|
||||
asm/libagbsyscall.o(.text);
|
||||
asm/unknown_lib.o(.text);
|
||||
*libgcc.a:_call_via_rX.o(.text);
|
||||
|
|
|
|||
|
|
@ -1,5 +1,8 @@
|
|||
#include <string.h>
|
||||
#include "gba/m4a_internal.h"
|
||||
|
||||
extern const u8 gCgb3Vol[];
|
||||
|
||||
#define BSS_CODE __attribute__((section(".bss.code")))
|
||||
|
||||
asm(".set gScaleTable, 0x0852D928"); // TODO:
|
||||
|
|
@ -13,6 +16,8 @@ asm(".set gNoiseTable, 0x0852DAC0"); // TODO:
|
|||
asm(".set gCgbScaleTable, 0x0852DA24"); // TODO:
|
||||
asm(".set gCgbFreqTable, 0x0852DAA8"); // TODO:
|
||||
asm(".set gNumMusicPlayers, 0x4"); // TODO:
|
||||
asm(".set gCgb3Vol, 0x0852DAFC"); // TODO:
|
||||
asm(".set gXcmdTable, 0x0852DB74"); // TODO:
|
||||
|
||||
BSS_CODE ALIGNED(4) char SoundMainRAM_Buffer[0x800] = {0};
|
||||
|
||||
|
|
@ -23,7 +28,7 @@ void *gMPlayJumpTable[36];
|
|||
struct CgbChannel gCgbChans[4];
|
||||
struct MusicPlayerTrack gPokemonCryTracks[MAX_POKEMON_CRIES * 2];
|
||||
struct PokemonCrySong gPokemonCrySong;
|
||||
struct MusicPlayerInfo gMPlayInfo_02032EE0;
|
||||
struct MusicPlayerInfo gMPlayInfo_BGM;
|
||||
struct MusicPlayerInfo gMPlayInfo_SE1;
|
||||
struct MusicPlayerInfo gMPlayInfo_SE2;
|
||||
u8 gMPlayMemAccArea[0x10];
|
||||
|
|
@ -49,7 +54,7 @@ u32 MidiKeyToFreq(struct WaveData *wav, u8 key, u8 fineAdjust)
|
|||
return umul3232H32(wav->freq, val1 + umul3232H32(val2 - val1, fineAdjustShifted));
|
||||
}
|
||||
|
||||
void UnusedDummyFunc()
|
||||
void UnusedDummyFunc(void)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -787,12 +792,11 @@ void TrkVolPitSet(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *tr
|
|||
if (track->flags & MPT_FLG_PITSET)
|
||||
{
|
||||
s32 bend = track->bend * track->bendRange;
|
||||
register s32 x asm("r1") = track->tune;
|
||||
x += bend;
|
||||
x *= 4;
|
||||
x += (track->keyShift << 8);
|
||||
x += (track->keyShiftX << 8);
|
||||
x += track->pitX;
|
||||
s32 x = (track->tune + bend)
|
||||
* 4
|
||||
+ (track->keyShift << 8)
|
||||
+ (track->keyShiftX << 8)
|
||||
+ track->pitX;
|
||||
|
||||
if (track->modT == 0)
|
||||
x += 16 * track->modM;
|
||||
|
|
@ -921,3 +925,867 @@ void CgbModVol(struct CgbChannel *chan)
|
|||
chan->sg = (chan->eg * chan->su + 15) >> 4;
|
||||
chan->pan &= chan->panMask;
|
||||
}
|
||||
|
||||
void CgbSound(void)
|
||||
{
|
||||
s32 ch;
|
||||
struct CgbChannel *channels;
|
||||
s32 evAdd;
|
||||
s32 prevC15;
|
||||
struct SoundInfo *soundInfo = SOUND_INFO_PTR;
|
||||
vu8 *nrx0ptr;
|
||||
vu8 *nrx1ptr;
|
||||
vu8 *nrx2ptr;
|
||||
vu8 *nrx3ptr;
|
||||
vu8 *nrx4ptr;
|
||||
|
||||
// Most comparision operations that cast to s8 perform 'and' by 0xFF.
|
||||
int mask = 0xff;
|
||||
|
||||
if (soundInfo->c15)
|
||||
soundInfo->c15--;
|
||||
else
|
||||
soundInfo->c15 = 14;
|
||||
|
||||
for (ch = 1, channels = soundInfo->cgbChans; ch <= 4; ch++, channels++)
|
||||
{
|
||||
if (!(channels->sf & 0xc7))
|
||||
continue;
|
||||
|
||||
switch (ch)
|
||||
{
|
||||
case 1:
|
||||
nrx0ptr = (vu8 *)(REG_ADDR_NR10);
|
||||
nrx1ptr = (vu8 *)(REG_ADDR_NR11);
|
||||
nrx2ptr = (vu8 *)(REG_ADDR_NR12);
|
||||
nrx3ptr = (vu8 *)(REG_ADDR_NR13);
|
||||
nrx4ptr = (vu8 *)(REG_ADDR_NR14);
|
||||
break;
|
||||
case 2:
|
||||
nrx0ptr = (vu8 *)(REG_ADDR_NR10+1);
|
||||
nrx1ptr = (vu8 *)(REG_ADDR_NR21);
|
||||
nrx2ptr = (vu8 *)(REG_ADDR_NR22);
|
||||
nrx3ptr = (vu8 *)(REG_ADDR_NR23);
|
||||
nrx4ptr = (vu8 *)(REG_ADDR_NR24);
|
||||
break;
|
||||
case 3:
|
||||
nrx0ptr = (vu8 *)(REG_ADDR_NR30);
|
||||
nrx1ptr = (vu8 *)(REG_ADDR_NR31);
|
||||
nrx2ptr = (vu8 *)(REG_ADDR_NR32);
|
||||
nrx3ptr = (vu8 *)(REG_ADDR_NR33);
|
||||
nrx4ptr = (vu8 *)(REG_ADDR_NR34);
|
||||
break;
|
||||
default:
|
||||
nrx0ptr = (vu8 *)(REG_ADDR_NR30+1);
|
||||
nrx1ptr = (vu8 *)(REG_ADDR_NR41);
|
||||
nrx2ptr = (vu8 *)(REG_ADDR_NR42);
|
||||
nrx3ptr = (vu8 *)(REG_ADDR_NR43);
|
||||
nrx4ptr = (vu8 *)(REG_ADDR_NR44);
|
||||
break;
|
||||
}
|
||||
|
||||
prevC15 = soundInfo->c15;
|
||||
evAdd = *nrx2ptr;
|
||||
|
||||
if (channels->sf & 0x80)
|
||||
{
|
||||
if (!(channels->sf & 0x40))
|
||||
{
|
||||
channels->sf = 3;
|
||||
channels->mo = 3;
|
||||
CgbModVol(channels);
|
||||
switch (ch)
|
||||
{
|
||||
case 1:
|
||||
*nrx0ptr = channels->sw;
|
||||
// fallthrough
|
||||
case 2:
|
||||
*nrx1ptr = ((u32)channels->wp << 6) + channels->le;
|
||||
goto loc_82E0E30;
|
||||
case 3:
|
||||
if ((u32)channels->wp != channels->cp)
|
||||
{
|
||||
*nrx0ptr = 0x40;
|
||||
REG_WAVE_RAM0 = channels->wp[0];
|
||||
REG_WAVE_RAM1 = channels->wp[1];
|
||||
REG_WAVE_RAM2 = channels->wp[2];
|
||||
REG_WAVE_RAM3 = channels->wp[3];
|
||||
channels->cp = (u32)channels->wp;
|
||||
}
|
||||
*nrx0ptr = 0;
|
||||
*nrx1ptr = channels->le;
|
||||
if (channels->le)
|
||||
channels->n4 = -64;
|
||||
else
|
||||
channels->n4 = -128;
|
||||
break;
|
||||
default:
|
||||
*nrx1ptr = channels->le;
|
||||
*nrx3ptr = (u32)channels->wp << 3;
|
||||
loc_82E0E30:
|
||||
evAdd = channels->at + 8;
|
||||
if (channels->le)
|
||||
channels->n4 = 64;
|
||||
else
|
||||
channels->n4 = 0;
|
||||
break;
|
||||
}
|
||||
channels->ec = channels->at;
|
||||
if ((s8)(channels->at & mask))
|
||||
{
|
||||
channels->ev = 0;
|
||||
goto EC_MINUS;
|
||||
}
|
||||
else
|
||||
{
|
||||
goto loc_82E0F96;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
goto loc_82E0E82;
|
||||
}
|
||||
}
|
||||
else if (channels->sf & 0x04)
|
||||
{
|
||||
channels->echoLength--;
|
||||
if ((s8)(channels->echoLength & mask) <= 0)
|
||||
{
|
||||
loc_82E0E82:
|
||||
CgbOscOff(ch);
|
||||
channels->sf = 0;
|
||||
goto LAST_LABEL;
|
||||
}
|
||||
goto loc_82E0FD6;
|
||||
}
|
||||
else if ((channels->sf & 0x40) && (channels->sf & 0x03))
|
||||
{
|
||||
channels->sf &= 0xfc;
|
||||
channels->ec = channels->re;
|
||||
if ((s8)(channels->re & mask))
|
||||
{
|
||||
channels->mo |= 1;
|
||||
if (ch != 3)
|
||||
{
|
||||
evAdd = channels->re;
|
||||
}
|
||||
goto EC_MINUS;
|
||||
}
|
||||
else
|
||||
{
|
||||
goto loc_82E0F02;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
loc_82E0ED0:
|
||||
if (channels->ec == 0)
|
||||
{
|
||||
if (ch == 3)
|
||||
{
|
||||
channels->mo |= 1;
|
||||
}
|
||||
CgbModVol(channels);
|
||||
if ((channels->sf & 0x3) == 0)
|
||||
{
|
||||
channels->ev--;
|
||||
if ((s8)(channels->ev & mask) <= 0)
|
||||
{
|
||||
loc_82E0F02:
|
||||
channels->ev = ((channels->eg * channels->echoVolume) + 0xFF) >> 8;
|
||||
if (channels->ev)
|
||||
{
|
||||
channels->sf |= 0x4;
|
||||
channels->mo |= 1;
|
||||
if (ch != 3)
|
||||
{
|
||||
evAdd = 8;
|
||||
}
|
||||
goto loc_82E0FD6;
|
||||
}
|
||||
else
|
||||
{
|
||||
goto loc_82E0E82;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
channels->ec = channels->re;
|
||||
}
|
||||
}
|
||||
else if ((channels->sf & 0x3) == 1)
|
||||
{
|
||||
loc_82E0F3A:
|
||||
channels->ev = channels->sg;
|
||||
channels->ec = 7;
|
||||
}
|
||||
else if ((channels->sf & 0x3) == 2)
|
||||
{
|
||||
int ev, sg;
|
||||
|
||||
channels->ev--;
|
||||
ev = (s8)(channels->ev & mask);
|
||||
sg = (s8)(channels->sg);
|
||||
if (ev <= sg)
|
||||
{
|
||||
loc_82E0F5A:
|
||||
if (channels->su == 0)
|
||||
{
|
||||
channels->sf &= 0xfc;
|
||||
goto loc_82E0F02;
|
||||
}
|
||||
else
|
||||
{
|
||||
channels->sf--;
|
||||
channels->mo |= 1;
|
||||
if (ch != 3)
|
||||
{
|
||||
evAdd = 8;
|
||||
}
|
||||
goto loc_82E0F3A;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
channels->ec = channels->de;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
channels->ev++;
|
||||
if ((u8)(channels->ev & mask) >= channels->eg)
|
||||
{
|
||||
loc_82E0F96:
|
||||
channels->sf--;
|
||||
channels->ec = channels->de;
|
||||
if ((u8)(channels->ec & mask))
|
||||
{
|
||||
channels->mo |= 1;
|
||||
channels->ev = channels->eg;
|
||||
if (ch != 3)
|
||||
{
|
||||
evAdd = channels->de;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
goto loc_82E0F5A;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
channels->ec = channels->at;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
EC_MINUS:
|
||||
channels->ec--;
|
||||
if (prevC15 == 0)
|
||||
{
|
||||
prevC15--;
|
||||
goto loc_82E0ED0;
|
||||
}
|
||||
|
||||
loc_82E0FD6:
|
||||
if (channels->mo & 0x2)
|
||||
{
|
||||
if (ch < 4 && (channels->ty & 0x08))
|
||||
{
|
||||
int biasH = REG_SOUNDBIAS_H;
|
||||
|
||||
if (biasH < 64)
|
||||
{
|
||||
channels->fr = (channels->fr + 2) & 0x7fc;
|
||||
}
|
||||
else if (biasH < 128)
|
||||
{
|
||||
channels->fr = (channels->fr + 1) & 0x7fe;
|
||||
}
|
||||
}
|
||||
if (ch != 4)
|
||||
{
|
||||
*nrx3ptr = channels->fr;
|
||||
}
|
||||
else
|
||||
{
|
||||
*nrx3ptr = (*nrx3ptr & 0x08) | channels->fr;
|
||||
}
|
||||
channels->n4 = (channels->n4 & 0xC0) + (*((u8*)(&channels->fr) + 1));
|
||||
*nrx4ptr = (s8)(channels->n4 & mask);
|
||||
}
|
||||
|
||||
if (channels->mo & 1)
|
||||
{
|
||||
REG_NR51 = (REG_NR51 & ~channels->panMask) | channels->pan;
|
||||
if (ch == 3)
|
||||
{
|
||||
*nrx2ptr = gCgb3Vol[channels->ev];
|
||||
if (channels->n4 & 0x80)
|
||||
{
|
||||
*nrx0ptr = 0x80;
|
||||
*nrx4ptr = channels->n4;
|
||||
channels->n4 &= 0x7f;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
evAdd &= 0xf;
|
||||
*nrx2ptr = (channels->ev << 4) + evAdd;
|
||||
*nrx4ptr = channels->n4 | 0x80;
|
||||
if (ch == 1 && !(*nrx0ptr & 0x08))
|
||||
{
|
||||
*nrx4ptr = channels->n4 | 0x80;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LAST_LABEL:
|
||||
channels->mo = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void m4aMPlayTempoControl(struct MusicPlayerInfo *mplayInfo, u16 tempo)
|
||||
{
|
||||
if (mplayInfo->ident == ID_NUMBER)
|
||||
{
|
||||
mplayInfo->ident++;
|
||||
mplayInfo->tempoU = tempo;
|
||||
mplayInfo->tempoI = (mplayInfo->tempoD * mplayInfo->tempoU) >> 8;
|
||||
mplayInfo->ident = ID_NUMBER;
|
||||
}
|
||||
}
|
||||
|
||||
void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 volume)
|
||||
{
|
||||
s32 i;
|
||||
u32 bit;
|
||||
struct MusicPlayerTrack *track;
|
||||
|
||||
if (mplayInfo->ident != ID_NUMBER)
|
||||
return;
|
||||
|
||||
mplayInfo->ident++;
|
||||
|
||||
i = mplayInfo->trackCount;
|
||||
track = mplayInfo->tracks;
|
||||
bit = 1;
|
||||
|
||||
while (i > 0)
|
||||
{
|
||||
if (trackBits & bit)
|
||||
{
|
||||
if (track->flags & MPT_FLG_EXIST)
|
||||
{
|
||||
track->volX = volume / 4;
|
||||
track->flags |= MPT_FLG_VOLCHG;
|
||||
}
|
||||
}
|
||||
|
||||
i--;
|
||||
track++;
|
||||
bit <<= 1;
|
||||
}
|
||||
|
||||
mplayInfo->ident = ID_NUMBER;
|
||||
}
|
||||
|
||||
void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s16 pitch)
|
||||
{
|
||||
s32 i;
|
||||
u32 bit;
|
||||
struct MusicPlayerTrack *track;
|
||||
|
||||
if (mplayInfo->ident != ID_NUMBER)
|
||||
return;
|
||||
|
||||
mplayInfo->ident++;
|
||||
|
||||
i = mplayInfo->trackCount;
|
||||
track = mplayInfo->tracks;
|
||||
bit = 1;
|
||||
|
||||
while (i > 0)
|
||||
{
|
||||
if (trackBits & bit)
|
||||
{
|
||||
if (track->flags & MPT_FLG_EXIST)
|
||||
{
|
||||
track->keyShiftX = pitch >> 8;
|
||||
track->pitX = pitch;
|
||||
track->flags |= MPT_FLG_PITCHG;
|
||||
}
|
||||
}
|
||||
|
||||
i--;
|
||||
track++;
|
||||
bit <<= 1;
|
||||
}
|
||||
|
||||
mplayInfo->ident = ID_NUMBER;
|
||||
}
|
||||
|
||||
void m4aMPlayPanpotControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s8 pan)
|
||||
{
|
||||
s32 i;
|
||||
u32 bit;
|
||||
struct MusicPlayerTrack *track;
|
||||
|
||||
if (mplayInfo->ident != ID_NUMBER)
|
||||
return;
|
||||
|
||||
mplayInfo->ident++;
|
||||
|
||||
i = mplayInfo->trackCount;
|
||||
track = mplayInfo->tracks;
|
||||
bit = 1;
|
||||
|
||||
while (i > 0)
|
||||
{
|
||||
if (trackBits & bit)
|
||||
{
|
||||
if (track->flags & MPT_FLG_EXIST)
|
||||
{
|
||||
track->panX = pan;
|
||||
track->flags |= MPT_FLG_VOLCHG;
|
||||
}
|
||||
}
|
||||
|
||||
i--;
|
||||
track++;
|
||||
bit <<= 1;
|
||||
}
|
||||
|
||||
mplayInfo->ident = ID_NUMBER;
|
||||
}
|
||||
|
||||
void ClearModM(struct MusicPlayerTrack *track)
|
||||
{
|
||||
track->lfoSpeedC = 0;
|
||||
track->modM = 0;
|
||||
|
||||
if (track->modT == 0)
|
||||
track->flags |= MPT_FLG_PITCHG;
|
||||
else
|
||||
track->flags |= MPT_FLG_VOLCHG;
|
||||
}
|
||||
|
||||
void m4aMPlayModDepthSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 modDepth)
|
||||
{
|
||||
s32 i;
|
||||
u32 bit;
|
||||
struct MusicPlayerTrack *track;
|
||||
|
||||
if (mplayInfo->ident != ID_NUMBER)
|
||||
return;
|
||||
|
||||
mplayInfo->ident++;
|
||||
|
||||
i = mplayInfo->trackCount;
|
||||
track = mplayInfo->tracks;
|
||||
bit = 1;
|
||||
|
||||
while (i > 0)
|
||||
{
|
||||
if (trackBits & bit)
|
||||
{
|
||||
if (track->flags & MPT_FLG_EXIST)
|
||||
{
|
||||
track->mod = modDepth;
|
||||
|
||||
if (!track->mod)
|
||||
ClearModM(track);
|
||||
}
|
||||
}
|
||||
|
||||
i--;
|
||||
track++;
|
||||
bit <<= 1;
|
||||
}
|
||||
|
||||
mplayInfo->ident = ID_NUMBER;
|
||||
}
|
||||
|
||||
void m4aMPlayLFOSpeedSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 lfoSpeed)
|
||||
{
|
||||
s32 i;
|
||||
u32 bit;
|
||||
struct MusicPlayerTrack *track;
|
||||
|
||||
if (mplayInfo->ident != ID_NUMBER)
|
||||
return;
|
||||
|
||||
mplayInfo->ident++;
|
||||
|
||||
i = mplayInfo->trackCount;
|
||||
track = mplayInfo->tracks;
|
||||
bit = 1;
|
||||
|
||||
while (i > 0)
|
||||
{
|
||||
if (trackBits & bit)
|
||||
{
|
||||
if (track->flags & MPT_FLG_EXIST)
|
||||
{
|
||||
track->lfoSpeed = lfoSpeed;
|
||||
|
||||
if (!track->lfoSpeed)
|
||||
ClearModM(track);
|
||||
}
|
||||
}
|
||||
|
||||
i--;
|
||||
track++;
|
||||
bit <<= 1;
|
||||
}
|
||||
|
||||
mplayInfo->ident = ID_NUMBER;
|
||||
}
|
||||
|
||||
#define MEMACC_COND_JUMP(cond) \
|
||||
if (cond) \
|
||||
goto cond_true; \
|
||||
else \
|
||||
goto cond_false; \
|
||||
|
||||
void ply_memacc(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
|
||||
{
|
||||
u32 op;
|
||||
u8 *addr;
|
||||
u8 data;
|
||||
|
||||
op = *track->cmdPtr;
|
||||
track->cmdPtr++;
|
||||
|
||||
addr = mplayInfo->memAccArea + *track->cmdPtr;
|
||||
track->cmdPtr++;
|
||||
|
||||
data = *track->cmdPtr;
|
||||
track->cmdPtr++;
|
||||
|
||||
switch (op)
|
||||
{
|
||||
case 0:
|
||||
*addr = data;
|
||||
return;
|
||||
case 1:
|
||||
*addr += data;
|
||||
return;
|
||||
case 2:
|
||||
*addr -= data;
|
||||
return;
|
||||
case 3:
|
||||
*addr = mplayInfo->memAccArea[data];
|
||||
return;
|
||||
case 4:
|
||||
*addr += mplayInfo->memAccArea[data];
|
||||
return;
|
||||
case 5:
|
||||
*addr -= mplayInfo->memAccArea[data];
|
||||
return;
|
||||
case 6:
|
||||
MEMACC_COND_JUMP(*addr == data)
|
||||
return;
|
||||
case 7:
|
||||
MEMACC_COND_JUMP(*addr != data)
|
||||
return;
|
||||
case 8:
|
||||
MEMACC_COND_JUMP(*addr > data)
|
||||
return;
|
||||
case 9:
|
||||
MEMACC_COND_JUMP(*addr >= data)
|
||||
return;
|
||||
case 10:
|
||||
MEMACC_COND_JUMP(*addr <= data)
|
||||
return;
|
||||
case 11:
|
||||
MEMACC_COND_JUMP(*addr < data)
|
||||
return;
|
||||
case 12:
|
||||
MEMACC_COND_JUMP(*addr == mplayInfo->memAccArea[data])
|
||||
return;
|
||||
case 13:
|
||||
MEMACC_COND_JUMP(*addr != mplayInfo->memAccArea[data])
|
||||
return;
|
||||
case 14:
|
||||
MEMACC_COND_JUMP(*addr > mplayInfo->memAccArea[data])
|
||||
return;
|
||||
case 15:
|
||||
MEMACC_COND_JUMP(*addr >= mplayInfo->memAccArea[data])
|
||||
return;
|
||||
case 16:
|
||||
MEMACC_COND_JUMP(*addr <= mplayInfo->memAccArea[data])
|
||||
return;
|
||||
case 17:
|
||||
MEMACC_COND_JUMP(*addr < mplayInfo->memAccArea[data])
|
||||
return;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
cond_true:
|
||||
{
|
||||
void (*func)(struct MusicPlayerInfo *, struct MusicPlayerTrack *) = *(&gMPlayJumpTable[1]);
|
||||
func(mplayInfo, track);
|
||||
return;
|
||||
}
|
||||
|
||||
cond_false:
|
||||
track->cmdPtr += 4;
|
||||
}
|
||||
|
||||
void ply_xcmd(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
|
||||
{
|
||||
u32 n = *track->cmdPtr;
|
||||
track->cmdPtr++;
|
||||
|
||||
gXcmdTable[n](mplayInfo, track);
|
||||
}
|
||||
|
||||
void ply_xxx(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
|
||||
{
|
||||
void (*func)(struct MusicPlayerInfo *, struct MusicPlayerTrack *) = *(&gMPlayJumpTable[0]);
|
||||
func(mplayInfo, track);
|
||||
}
|
||||
|
||||
#define READ_XCMD_BYTE(var, n) \
|
||||
{ \
|
||||
u32 byte = track->cmdPtr[(n)]; \
|
||||
byte <<= n * 8; \
|
||||
(var) &= ~(0xFF << (n * 8)); \
|
||||
(var) |= byte; \
|
||||
}
|
||||
|
||||
void ply_xwave(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
|
||||
{
|
||||
u32 wav;
|
||||
|
||||
READ_XCMD_BYTE(wav, 0) // UB: uninitialized variable
|
||||
READ_XCMD_BYTE(wav, 1)
|
||||
READ_XCMD_BYTE(wav, 2)
|
||||
READ_XCMD_BYTE(wav, 3)
|
||||
|
||||
track->tone.wav = (struct WaveData *)wav;
|
||||
track->cmdPtr += 4;
|
||||
}
|
||||
|
||||
void ply_xtype(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
|
||||
{
|
||||
track->tone.type = *track->cmdPtr;
|
||||
track->cmdPtr++;
|
||||
}
|
||||
|
||||
void ply_xatta(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
|
||||
{
|
||||
track->tone.attack = *track->cmdPtr;
|
||||
track->cmdPtr++;
|
||||
}
|
||||
|
||||
void ply_xdeca(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
|
||||
{
|
||||
track->tone.decay = *track->cmdPtr;
|
||||
track->cmdPtr++;
|
||||
}
|
||||
|
||||
void ply_xsust(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
|
||||
{
|
||||
track->tone.sustain = *track->cmdPtr;
|
||||
track->cmdPtr++;
|
||||
}
|
||||
|
||||
void ply_xrele(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
|
||||
{
|
||||
track->tone.release = *track->cmdPtr;
|
||||
track->cmdPtr++;
|
||||
}
|
||||
|
||||
void ply_xiecv(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
|
||||
{
|
||||
track->echoVolume = *track->cmdPtr;
|
||||
track->cmdPtr++;
|
||||
}
|
||||
|
||||
void ply_xiecl(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
|
||||
{
|
||||
track->echoLength = *track->cmdPtr;
|
||||
track->cmdPtr++;
|
||||
}
|
||||
|
||||
void ply_xleng(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
|
||||
{
|
||||
track->tone.length = *track->cmdPtr;
|
||||
track->cmdPtr++;
|
||||
}
|
||||
|
||||
void ply_xswee(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
|
||||
{
|
||||
track->tone.pan_sweep = *track->cmdPtr;
|
||||
track->cmdPtr++;
|
||||
}
|
||||
|
||||
void ply_xcmd_0C(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
|
||||
{
|
||||
u32 unk;
|
||||
|
||||
READ_XCMD_BYTE(unk, 0) // UB: uninitialized variable
|
||||
READ_XCMD_BYTE(unk, 1)
|
||||
|
||||
if (track->unk_3A < (u16)unk)
|
||||
{
|
||||
track->unk_3A++;
|
||||
track->cmdPtr -= 2;
|
||||
track->wait = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
track->unk_3A = 0;
|
||||
track->cmdPtr += 2;
|
||||
}
|
||||
}
|
||||
|
||||
void ply_xcmd_0D(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
|
||||
{
|
||||
u32 unk;
|
||||
|
||||
READ_XCMD_BYTE(unk, 0) // UB: uninitialized variable
|
||||
READ_XCMD_BYTE(unk, 1)
|
||||
READ_XCMD_BYTE(unk, 2)
|
||||
READ_XCMD_BYTE(unk, 3)
|
||||
|
||||
track->unk_3C = unk;
|
||||
track->cmdPtr += 4;
|
||||
}
|
||||
|
||||
void DummyFunc(void)
|
||||
{
|
||||
}
|
||||
|
||||
struct MusicPlayerInfo *SetPokemonCryTone(struct ToneData *tone)
|
||||
{
|
||||
u32 maxClock = 0;
|
||||
s32 maxClockIndex = 0;
|
||||
s32 i;
|
||||
struct MusicPlayerInfo *mplayInfo;
|
||||
|
||||
for (i = 0; i < MAX_POKEMON_CRIES; i++)
|
||||
{
|
||||
struct MusicPlayerTrack *track = &gPokemonCryTracks[i * 2];
|
||||
|
||||
if (!track->flags && (!track->chan || track->chan->track != track))
|
||||
goto start_song;
|
||||
|
||||
if (maxClock < gPokemonCryMusicPlayers[i].clock)
|
||||
{
|
||||
maxClock = gPokemonCryMusicPlayers[i].clock;
|
||||
maxClockIndex = i;
|
||||
}
|
||||
}
|
||||
|
||||
i = maxClockIndex;
|
||||
|
||||
start_song:
|
||||
mplayInfo = &gPokemonCryMusicPlayers[i];
|
||||
mplayInfo->ident++;
|
||||
|
||||
#define CRY ((s32)&gPokemonCrySongs + i * sizeof(struct PokemonCrySong))
|
||||
#define CRY_OFS(field) offsetof(struct PokemonCrySong, field)
|
||||
|
||||
memcpy((void *)CRY, &gPokemonCrySong, sizeof(struct PokemonCrySong));
|
||||
|
||||
*(u32 *)(CRY + CRY_OFS(tone)) = (u32)tone;
|
||||
*(u32 *)(CRY + CRY_OFS(part)) = CRY + CRY_OFS(part0);
|
||||
*(u32 *)(CRY + CRY_OFS(part) + 4) = CRY + CRY_OFS(part1);
|
||||
*(u32 *)(CRY + CRY_OFS(gotoTarget)) = CRY + CRY_OFS(cont);
|
||||
|
||||
#undef CRY_OFS
|
||||
#undef CRY
|
||||
|
||||
mplayInfo->ident = ID_NUMBER;
|
||||
|
||||
MPlayStart(mplayInfo, (struct SongHeader *)(&gPokemonCrySongs[i]));
|
||||
|
||||
return mplayInfo;
|
||||
}
|
||||
|
||||
void SetPokemonCryVolume(u8 val)
|
||||
{
|
||||
gPokemonCrySong.volumeValue = val & 0x7F;
|
||||
}
|
||||
|
||||
void SetPokemonCryPanpot(s8 val)
|
||||
{
|
||||
gPokemonCrySong.panValue = (val + C_V) & 0x7F;
|
||||
}
|
||||
|
||||
void SetPokemonCryPitch(s16 val)
|
||||
{
|
||||
s16 b = val + 0x80;
|
||||
u8 a = gPokemonCrySong.tuneValue2 - gPokemonCrySong.tuneValue;
|
||||
gPokemonCrySong.tieKeyValue = (b >> 8) & 0x7F;
|
||||
gPokemonCrySong.tuneValue = (b >> 1) & 0x7F;
|
||||
gPokemonCrySong.tuneValue2 = (a + ((b >> 1) & 0x7F)) & 0x7F;
|
||||
}
|
||||
|
||||
void SetPokemonCryLength(u16 val)
|
||||
{
|
||||
gPokemonCrySong.unkCmd0CParam = val;
|
||||
}
|
||||
|
||||
void SetPokemonCryRelease(u8 val)
|
||||
{
|
||||
gPokemonCrySong.releaseValue = val;
|
||||
}
|
||||
|
||||
void SetPokemonCryProgress(u32 val)
|
||||
{
|
||||
gPokemonCrySong.unkCmd0DParam = val;
|
||||
}
|
||||
|
||||
int IsPokemonCryPlaying(struct MusicPlayerInfo *mplayInfo)
|
||||
{
|
||||
struct MusicPlayerTrack *track = mplayInfo->tracks;
|
||||
|
||||
if (track->chan && track->chan->track == track)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
void SetPokemonCryChorus(s8 val)
|
||||
{
|
||||
if (val)
|
||||
{
|
||||
gPokemonCrySong.trackCount = 2;
|
||||
gPokemonCrySong.tuneValue2 = (val + gPokemonCrySong.tuneValue) & 0x7F;
|
||||
}
|
||||
else
|
||||
{
|
||||
gPokemonCrySong.trackCount = 1;
|
||||
}
|
||||
}
|
||||
|
||||
void SetPokemonCryStereo(u32 val)
|
||||
{
|
||||
struct SoundInfo *soundInfo = SOUND_INFO_PTR;
|
||||
|
||||
if (val)
|
||||
{
|
||||
REG_SOUNDCNT_H = SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT
|
||||
| SOUND_A_TIMER_0 | SOUND_A_RIGHT_OUTPUT
|
||||
| SOUND_ALL_MIX_FULL;
|
||||
soundInfo->mode &= ~1;
|
||||
}
|
||||
else
|
||||
{
|
||||
REG_SOUNDCNT_H = SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT | SOUND_B_RIGHT_OUTPUT
|
||||
| SOUND_A_TIMER_0 | SOUND_A_LEFT_OUTPUT | SOUND_A_RIGHT_OUTPUT
|
||||
| SOUND_B_MIX_HALF | SOUND_A_MIX_HALF | SOUND_CGB_MIX_FULL;
|
||||
soundInfo->mode |= 1;
|
||||
}
|
||||
}
|
||||
|
||||
void SetPokemonCryPriority(u8 val)
|
||||
{
|
||||
gPokemonCrySong.priority = val;
|
||||
}
|
||||
547
src/m4a_4.c
547
src/m4a_4.c
|
|
@ -1,547 +0,0 @@
|
|||
#include "gba/m4a_internal.h"
|
||||
|
||||
asm(".set gXcmdTable, 0x0852DB74"); // TODO:
|
||||
|
||||
void m4aMPlayTempoControl(struct MusicPlayerInfo *mplayInfo, u16 tempo)
|
||||
{
|
||||
if (mplayInfo->ident == ID_NUMBER)
|
||||
{
|
||||
mplayInfo->ident++;
|
||||
mplayInfo->tempoU = tempo;
|
||||
mplayInfo->tempoI = (mplayInfo->tempoD * mplayInfo->tempoU) >> 8;
|
||||
mplayInfo->ident = ID_NUMBER;
|
||||
}
|
||||
}
|
||||
|
||||
void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 volume)
|
||||
{
|
||||
s32 i;
|
||||
u32 bit;
|
||||
struct MusicPlayerTrack *track;
|
||||
|
||||
if (mplayInfo->ident != ID_NUMBER)
|
||||
return;
|
||||
|
||||
mplayInfo->ident++;
|
||||
|
||||
i = mplayInfo->trackCount;
|
||||
track = mplayInfo->tracks;
|
||||
bit = 1;
|
||||
|
||||
while (i > 0)
|
||||
{
|
||||
if (trackBits & bit)
|
||||
{
|
||||
if (track->flags & MPT_FLG_EXIST)
|
||||
{
|
||||
track->volX = volume / 4;
|
||||
track->flags |= MPT_FLG_VOLCHG;
|
||||
}
|
||||
}
|
||||
|
||||
i--;
|
||||
track++;
|
||||
bit <<= 1;
|
||||
}
|
||||
|
||||
mplayInfo->ident = ID_NUMBER;
|
||||
}
|
||||
|
||||
void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s16 pitch)
|
||||
{
|
||||
s32 i;
|
||||
u32 bit;
|
||||
struct MusicPlayerTrack *track;
|
||||
|
||||
if (mplayInfo->ident != ID_NUMBER)
|
||||
return;
|
||||
|
||||
mplayInfo->ident++;
|
||||
|
||||
i = mplayInfo->trackCount;
|
||||
track = mplayInfo->tracks;
|
||||
bit = 1;
|
||||
|
||||
while (i > 0)
|
||||
{
|
||||
if (trackBits & bit)
|
||||
{
|
||||
if (track->flags & MPT_FLG_EXIST)
|
||||
{
|
||||
track->keyShiftX = pitch >> 8;
|
||||
track->pitX = pitch;
|
||||
track->flags |= MPT_FLG_PITCHG;
|
||||
}
|
||||
}
|
||||
|
||||
i--;
|
||||
track++;
|
||||
bit <<= 1;
|
||||
}
|
||||
|
||||
mplayInfo->ident = ID_NUMBER;
|
||||
}
|
||||
|
||||
void m4aMPlayPanpotControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s8 pan)
|
||||
{
|
||||
s32 i;
|
||||
u32 bit;
|
||||
struct MusicPlayerTrack *track;
|
||||
|
||||
if (mplayInfo->ident != ID_NUMBER)
|
||||
return;
|
||||
|
||||
mplayInfo->ident++;
|
||||
|
||||
i = mplayInfo->trackCount;
|
||||
track = mplayInfo->tracks;
|
||||
bit = 1;
|
||||
|
||||
while (i > 0)
|
||||
{
|
||||
if (trackBits & bit)
|
||||
{
|
||||
if (track->flags & MPT_FLG_EXIST)
|
||||
{
|
||||
track->panX = pan;
|
||||
track->flags |= MPT_FLG_VOLCHG;
|
||||
}
|
||||
}
|
||||
|
||||
i--;
|
||||
track++;
|
||||
bit <<= 1;
|
||||
}
|
||||
|
||||
mplayInfo->ident = ID_NUMBER;
|
||||
}
|
||||
|
||||
void ClearModM(struct MusicPlayerTrack *track)
|
||||
{
|
||||
track->lfoSpeedC = 0;
|
||||
track->modM = 0;
|
||||
|
||||
if (track->modT == 0)
|
||||
track->flags |= MPT_FLG_PITCHG;
|
||||
else
|
||||
track->flags |= MPT_FLG_VOLCHG;
|
||||
}
|
||||
|
||||
void m4aMPlayModDepthSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 modDepth)
|
||||
{
|
||||
s32 i;
|
||||
u32 bit;
|
||||
struct MusicPlayerTrack *track;
|
||||
|
||||
if (mplayInfo->ident != ID_NUMBER)
|
||||
return;
|
||||
|
||||
mplayInfo->ident++;
|
||||
|
||||
i = mplayInfo->trackCount;
|
||||
track = mplayInfo->tracks;
|
||||
bit = 1;
|
||||
|
||||
while (i > 0)
|
||||
{
|
||||
if (trackBits & bit)
|
||||
{
|
||||
if (track->flags & MPT_FLG_EXIST)
|
||||
{
|
||||
track->mod = modDepth;
|
||||
|
||||
if (!track->mod)
|
||||
ClearModM(track);
|
||||
}
|
||||
}
|
||||
|
||||
i--;
|
||||
track++;
|
||||
bit <<= 1;
|
||||
}
|
||||
|
||||
mplayInfo->ident = ID_NUMBER;
|
||||
}
|
||||
|
||||
void m4aMPlayLFOSpeedSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 lfoSpeed)
|
||||
{
|
||||
s32 i;
|
||||
u32 bit;
|
||||
struct MusicPlayerTrack *track;
|
||||
|
||||
if (mplayInfo->ident != ID_NUMBER)
|
||||
return;
|
||||
|
||||
mplayInfo->ident++;
|
||||
|
||||
i = mplayInfo->trackCount;
|
||||
track = mplayInfo->tracks;
|
||||
bit = 1;
|
||||
|
||||
while (i > 0)
|
||||
{
|
||||
if (trackBits & bit)
|
||||
{
|
||||
if (track->flags & MPT_FLG_EXIST)
|
||||
{
|
||||
track->lfoSpeed = lfoSpeed;
|
||||
|
||||
if (!track->lfoSpeed)
|
||||
ClearModM(track);
|
||||
}
|
||||
}
|
||||
|
||||
i--;
|
||||
track++;
|
||||
bit <<= 1;
|
||||
}
|
||||
|
||||
mplayInfo->ident = ID_NUMBER;
|
||||
}
|
||||
|
||||
#define MEMACC_COND_JUMP(cond) \
|
||||
if (cond) \
|
||||
goto cond_true; \
|
||||
else \
|
||||
goto cond_false; \
|
||||
|
||||
void ply_memacc(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
|
||||
{
|
||||
u32 op;
|
||||
u8 *addr;
|
||||
u8 data;
|
||||
|
||||
op = *track->cmdPtr;
|
||||
track->cmdPtr++;
|
||||
|
||||
addr = mplayInfo->memAccArea + *track->cmdPtr;
|
||||
track->cmdPtr++;
|
||||
|
||||
data = *track->cmdPtr;
|
||||
track->cmdPtr++;
|
||||
|
||||
switch (op)
|
||||
{
|
||||
case 0:
|
||||
*addr = data;
|
||||
return;
|
||||
case 1:
|
||||
*addr += data;
|
||||
return;
|
||||
case 2:
|
||||
*addr -= data;
|
||||
return;
|
||||
case 3:
|
||||
*addr = mplayInfo->memAccArea[data];
|
||||
return;
|
||||
case 4:
|
||||
*addr += mplayInfo->memAccArea[data];
|
||||
return;
|
||||
case 5:
|
||||
*addr -= mplayInfo->memAccArea[data];
|
||||
return;
|
||||
case 6:
|
||||
MEMACC_COND_JUMP(*addr == data)
|
||||
return;
|
||||
case 7:
|
||||
MEMACC_COND_JUMP(*addr != data)
|
||||
return;
|
||||
case 8:
|
||||
MEMACC_COND_JUMP(*addr > data)
|
||||
return;
|
||||
case 9:
|
||||
MEMACC_COND_JUMP(*addr >= data)
|
||||
return;
|
||||
case 10:
|
||||
MEMACC_COND_JUMP(*addr <= data)
|
||||
return;
|
||||
case 11:
|
||||
MEMACC_COND_JUMP(*addr < data)
|
||||
return;
|
||||
case 12:
|
||||
MEMACC_COND_JUMP(*addr == mplayInfo->memAccArea[data])
|
||||
return;
|
||||
case 13:
|
||||
MEMACC_COND_JUMP(*addr != mplayInfo->memAccArea[data])
|
||||
return;
|
||||
case 14:
|
||||
MEMACC_COND_JUMP(*addr > mplayInfo->memAccArea[data])
|
||||
return;
|
||||
case 15:
|
||||
MEMACC_COND_JUMP(*addr >= mplayInfo->memAccArea[data])
|
||||
return;
|
||||
case 16:
|
||||
MEMACC_COND_JUMP(*addr <= mplayInfo->memAccArea[data])
|
||||
return;
|
||||
case 17:
|
||||
MEMACC_COND_JUMP(*addr < mplayInfo->memAccArea[data])
|
||||
return;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
cond_true:
|
||||
{
|
||||
void (*func)(struct MusicPlayerInfo *, struct MusicPlayerTrack *) = *(&gMPlayJumpTable[1]);
|
||||
func(mplayInfo, track);
|
||||
return;
|
||||
}
|
||||
|
||||
cond_false:
|
||||
track->cmdPtr += 4;
|
||||
}
|
||||
|
||||
void ply_xcmd(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
|
||||
{
|
||||
u32 n = *track->cmdPtr;
|
||||
track->cmdPtr++;
|
||||
|
||||
gXcmdTable[n](mplayInfo, track);
|
||||
}
|
||||
|
||||
void ply_xxx(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
|
||||
{
|
||||
void (*func)(struct MusicPlayerInfo *, struct MusicPlayerTrack *) = *(&gMPlayJumpTable[0]);
|
||||
func(mplayInfo, track);
|
||||
}
|
||||
|
||||
#define READ_XCMD_BYTE(var, n) \
|
||||
{ \
|
||||
u32 byte = track->cmdPtr[(n)]; \
|
||||
byte <<= n * 8; \
|
||||
(var) &= ~(0xFF << (n * 8)); \
|
||||
(var) |= byte; \
|
||||
}
|
||||
|
||||
void ply_xwave(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
|
||||
{
|
||||
u32 wav;
|
||||
|
||||
READ_XCMD_BYTE(wav, 0) // UB: uninitialized variable
|
||||
READ_XCMD_BYTE(wav, 1)
|
||||
READ_XCMD_BYTE(wav, 2)
|
||||
READ_XCMD_BYTE(wav, 3)
|
||||
|
||||
track->tone.wav = (struct WaveData *)wav;
|
||||
track->cmdPtr += 4;
|
||||
}
|
||||
|
||||
void ply_xtype(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
|
||||
{
|
||||
track->tone.type = *track->cmdPtr;
|
||||
track->cmdPtr++;
|
||||
}
|
||||
|
||||
void ply_xatta(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
|
||||
{
|
||||
track->tone.attack = *track->cmdPtr;
|
||||
track->cmdPtr++;
|
||||
}
|
||||
|
||||
void ply_xdeca(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
|
||||
{
|
||||
track->tone.decay = *track->cmdPtr;
|
||||
track->cmdPtr++;
|
||||
}
|
||||
|
||||
void ply_xsust(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
|
||||
{
|
||||
track->tone.sustain = *track->cmdPtr;
|
||||
track->cmdPtr++;
|
||||
}
|
||||
|
||||
void ply_xrele(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
|
||||
{
|
||||
track->tone.release = *track->cmdPtr;
|
||||
track->cmdPtr++;
|
||||
}
|
||||
|
||||
void ply_xiecv(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
|
||||
{
|
||||
track->echoVolume = *track->cmdPtr;
|
||||
track->cmdPtr++;
|
||||
}
|
||||
|
||||
void ply_xiecl(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
|
||||
{
|
||||
track->echoLength = *track->cmdPtr;
|
||||
track->cmdPtr++;
|
||||
}
|
||||
|
||||
void ply_xleng(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
|
||||
{
|
||||
track->tone.length = *track->cmdPtr;
|
||||
track->cmdPtr++;
|
||||
}
|
||||
|
||||
void ply_xswee(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
|
||||
{
|
||||
track->tone.pan_sweep = *track->cmdPtr;
|
||||
track->cmdPtr++;
|
||||
}
|
||||
|
||||
void ply_xcmd_0C(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
|
||||
{
|
||||
u32 unk;
|
||||
|
||||
READ_XCMD_BYTE(unk, 0) // UB: uninitialized variable
|
||||
READ_XCMD_BYTE(unk, 1)
|
||||
|
||||
if (track->unk_3A < (u16)unk)
|
||||
{
|
||||
track->unk_3A++;
|
||||
track->cmdPtr -= 2;
|
||||
track->wait = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
track->unk_3A = 0;
|
||||
track->cmdPtr += 2;
|
||||
}
|
||||
}
|
||||
|
||||
void ply_xcmd_0D(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
|
||||
{
|
||||
u32 unk;
|
||||
|
||||
READ_XCMD_BYTE(unk, 0) // UB: uninitialized variable
|
||||
READ_XCMD_BYTE(unk, 1)
|
||||
READ_XCMD_BYTE(unk, 2)
|
||||
READ_XCMD_BYTE(unk, 3)
|
||||
|
||||
track->unk_3C = unk;
|
||||
track->cmdPtr += 4;
|
||||
}
|
||||
|
||||
void DummyFunc(void)
|
||||
{
|
||||
}
|
||||
|
||||
struct MusicPlayerInfo *SetPokemonCryTone(struct ToneData *tone)
|
||||
{
|
||||
u32 maxClock = 0;
|
||||
s32 maxClockIndex = 0;
|
||||
s32 i;
|
||||
struct MusicPlayerInfo *mplayInfo;
|
||||
|
||||
for (i = 0; i < MAX_POKEMON_CRIES; i++)
|
||||
{
|
||||
struct MusicPlayerTrack *track = &gPokemonCryTracks[i * 2];
|
||||
|
||||
if (!track->flags && (!track->chan || track->chan->track != track))
|
||||
goto start_song;
|
||||
|
||||
if (maxClock < gPokemonCryMusicPlayers[i].clock)
|
||||
{
|
||||
maxClock = gPokemonCryMusicPlayers[i].clock;
|
||||
maxClockIndex = i;
|
||||
}
|
||||
}
|
||||
|
||||
i = maxClockIndex;
|
||||
|
||||
start_song:
|
||||
mplayInfo = &gPokemonCryMusicPlayers[i];
|
||||
mplayInfo->ident++;
|
||||
|
||||
#define CRY ((s32)&gPokemonCrySongs + i * sizeof(struct PokemonCrySong))
|
||||
#define CRY_OFS(field) offsetof(struct PokemonCrySong, field)
|
||||
|
||||
memcpy((void *)CRY, &gPokemonCrySong, sizeof(struct PokemonCrySong));
|
||||
|
||||
*(u32 *)(CRY + CRY_OFS(tone)) = (u32)tone;
|
||||
*(u32 *)(CRY + CRY_OFS(part)) = CRY + CRY_OFS(part0);
|
||||
*(u32 *)(CRY + CRY_OFS(part) + 4) = CRY + CRY_OFS(part1);
|
||||
*(u32 *)(CRY + CRY_OFS(gotoTarget)) = CRY + CRY_OFS(cont);
|
||||
|
||||
#undef CRY_OFS
|
||||
#undef CRY
|
||||
|
||||
mplayInfo->ident = ID_NUMBER;
|
||||
|
||||
MPlayStart(mplayInfo, (struct SongHeader *)(&gPokemonCrySongs[i]));
|
||||
|
||||
return mplayInfo;
|
||||
}
|
||||
|
||||
void SetPokemonCryVolume(u8 val)
|
||||
{
|
||||
gPokemonCrySong.volumeValue = val & 0x7F;
|
||||
}
|
||||
|
||||
void SetPokemonCryPanpot(s8 val)
|
||||
{
|
||||
gPokemonCrySong.panValue = (val + C_V) & 0x7F;
|
||||
}
|
||||
|
||||
void SetPokemonCryPitch(s16 val)
|
||||
{
|
||||
s16 b = val + 0x80;
|
||||
u8 a = gPokemonCrySong.tuneValue2 - gPokemonCrySong.tuneValue;
|
||||
gPokemonCrySong.tieKeyValue = (b >> 8) & 0x7F;
|
||||
gPokemonCrySong.tuneValue = (b >> 1) & 0x7F;
|
||||
gPokemonCrySong.tuneValue2 = (a + ((b >> 1) & 0x7F)) & 0x7F;
|
||||
}
|
||||
|
||||
void SetPokemonCryLength(u16 val)
|
||||
{
|
||||
gPokemonCrySong.unkCmd0CParam = val;
|
||||
}
|
||||
|
||||
void SetPokemonCryRelease(u8 val)
|
||||
{
|
||||
gPokemonCrySong.releaseValue = val;
|
||||
}
|
||||
|
||||
void SetPokemonCryProgress(u32 val)
|
||||
{
|
||||
gPokemonCrySong.unkCmd0DParam = val;
|
||||
}
|
||||
|
||||
int IsPokemonCryPlaying(struct MusicPlayerInfo *mplayInfo)
|
||||
{
|
||||
struct MusicPlayerTrack *track = mplayInfo->tracks;
|
||||
|
||||
if (track->chan && track->chan->track == track)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
void SetPokemonCryChorus(s8 val)
|
||||
{
|
||||
if (val)
|
||||
{
|
||||
gPokemonCrySong.trackCount = 2;
|
||||
gPokemonCrySong.tuneValue2 = (val + gPokemonCrySong.tuneValue) & 0x7F;
|
||||
}
|
||||
else
|
||||
{
|
||||
gPokemonCrySong.trackCount = 1;
|
||||
}
|
||||
}
|
||||
|
||||
void SetPokemonCryStereo(u32 val)
|
||||
{
|
||||
struct SoundInfo *soundInfo = SOUND_INFO_PTR;
|
||||
|
||||
if (val)
|
||||
{
|
||||
REG_SOUNDCNT_H = SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT
|
||||
| SOUND_A_TIMER_0 | SOUND_A_RIGHT_OUTPUT
|
||||
| SOUND_ALL_MIX_FULL;
|
||||
soundInfo->mode &= ~1;
|
||||
}
|
||||
else
|
||||
{
|
||||
REG_SOUNDCNT_H = SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT | SOUND_B_RIGHT_OUTPUT
|
||||
| SOUND_A_TIMER_0 | SOUND_A_LEFT_OUTPUT | SOUND_A_RIGHT_OUTPUT
|
||||
| SOUND_B_MIX_HALF | SOUND_A_MIX_HALF | SOUND_CGB_MIX_FULL;
|
||||
soundInfo->mode |= 1;
|
||||
}
|
||||
}
|
||||
|
||||
void SetPokemonCryPriority(u8 val)
|
||||
{
|
||||
gPokemonCrySong.priority = val;
|
||||
}
|
||||
|
|
@ -169,7 +169,7 @@ void sub_10BB8(void)
|
|||
if (gTitlescreen.idleFramesCounter % 10 == 0)
|
||||
{
|
||||
gTitlescreen.idleFadeoutCounter++;
|
||||
m4aMPlayVolumeControl(&gMPlayInfo_02032EE0, 0xFFFF, 0x100 / gTitlescreen.idleFadeoutCounter);
|
||||
m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x100 / gTitlescreen.idleFadeoutCounter);
|
||||
}
|
||||
|
||||
if (gTitlescreen.idleFadeoutCounter > 9)
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
.include "m4a_2.o"
|
||||
.include "m4a.o"
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user