summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzelda2774 <69368340+zelda2774@users.noreply.github.com>2021-09-01 00:53:35 +0200
committerGitHub <noreply@github.com>2021-08-31 18:53:35 -0400
commit4444c5ea35a272e9e9ea157df92d7bb3eac8fc05 (patch)
tree169ac947769558790055b7ee54fce13d5d154812
parent430a172183fe6f7fe5781325386803e3f1f975cd (diff)
audio_synthesis OK + partially documented (#920)
* Match func_800DDB64 * Match func_800DC910 * remove stack comments * Move nop padding to ucode_disas * Partially label audio_synthesis To some extent copied from sm64. * cleanup * Reverb and ReverbBits have nothing to do with reverbs * review * naming * Undo changes to permuter_settings.toml Co-authored-by: zelda2774 <zelda2774@invalid>
-rw-r--r--asm/non_matchings/code/audio_load/Audio_DmaSampleData.s (renamed from asm/non_matchings/code/audio_load/func_800E12DC.s)2
-rw-r--r--asm/non_matchings/code/audio_synthesis/func_800DC910.s930
-rw-r--r--asm/non_matchings/code/audio_synthesis/func_800DDB64.s189
-rw-r--r--asm/non_matchings/code/ucode_disas/pad_800DACB0.s (renamed from asm/non_matchings/code/audio_synthesis/pad_800DACB0.s)0
-rw-r--r--include/functions.h52
-rw-r--r--include/macros.h1
-rw-r--r--include/ultra64/abi.h58
-rw-r--r--include/z64audio.h276
-rw-r--r--src/code/audio_heap.c50
-rw-r--r--src/code/audio_load.c60
-rw-r--r--src/code/audio_playback.c128
-rw-r--r--src/code/audio_seqplayer.c28
-rw-r--r--src/code/audio_synthesis.c1220
-rw-r--r--src/code/code_800E4FE0.c10
-rw-r--r--src/code/code_800EC960.c22
-rw-r--r--src/code/ucode_disas.c5
16 files changed, 921 insertions, 2110 deletions
diff --git a/asm/non_matchings/code/audio_load/func_800E12DC.s b/asm/non_matchings/code/audio_load/Audio_DmaSampleData.s
index f50c04d9b..dfea00d6e 100644
--- a/asm/non_matchings/code/audio_load/func_800E12DC.s
+++ b/asm/non_matchings/code/audio_load/Audio_DmaSampleData.s
@@ -4,7 +4,7 @@ glabel D_80149420
.balign 4
.text
-glabel func_800E12DC
+glabel Audio_DmaSampleData
/* B5847C 800E12DC 27BDFFB0 */ addiu $sp, $sp, -0x50
/* B58480 800E12E0 AFB10030 */ sw $s1, 0x30($sp)
/* B58484 800E12E4 AFB0002C */ sw $s0, 0x2c($sp)
diff --git a/asm/non_matchings/code/audio_synthesis/func_800DC910.s b/asm/non_matchings/code/audio_synthesis/func_800DC910.s
deleted file mode 100644
index 9a46dd496..000000000
--- a/asm/non_matchings/code/audio_synthesis/func_800DC910.s
+++ /dev/null
@@ -1,930 +0,0 @@
-.late_rodata
-glabel jtbl_801493D0
- .word L800DCCE4
- .word L800DCD0C
- .word L800DCD20
- .word L800DCCF8
- .word L800DCDA0
- .word L800DCD60
-
-.text
-glabel func_800DC910
-/* B53AB0 800DC910 27BDFEA0 */ addiu $sp, $sp, -0x160
-/* B53AB4 800DC914 AFBF004C */ sw $ra, 0x4c($sp)
-/* B53AB8 800DC918 AFBE0048 */ sw $fp, 0x48($sp)
-/* B53ABC 800DC91C AFB70044 */ sw $s7, 0x44($sp)
-/* B53AC0 800DC920 AFB60040 */ sw $s6, 0x40($sp)
-/* B53AC4 800DC924 AFB5003C */ sw $s5, 0x3c($sp)
-/* B53AC8 800DC928 AFB40038 */ sw $s4, 0x38($sp)
-/* B53ACC 800DC92C AFB30034 */ sw $s3, 0x34($sp)
-/* B53AD0 800DC930 AFB20030 */ sw $s2, 0x30($sp)
-/* B53AD4 800DC934 AFB1002C */ sw $s1, 0x2c($sp)
-/* B53AD8 800DC938 AFB00028 */ sw $s0, 0x28($sp)
-/* B53ADC 800DC93C AFA40160 */ sw $a0, 0x160($sp)
-/* B53AE0 800DC940 AFA7016C */ sw $a3, 0x16c($sp)
-/* B53AE4 800DC944 8CA30000 */ lw $v1, ($a1)
-/* B53AE8 800DC948 0004C8C0 */ sll $t9, $a0, 3
-/* B53AEC 800DC94C 3C0C8017 */ lui $t4, %hi(gAudioContext+0x352c) # $t4, 0x8017
-/* B53AF0 800DC950 000372C0 */ sll $t6, $v1, 0xb
-/* B53AF4 800DC954 8D8C26AC */ lw $t4, %lo(gAudioContext+0x352c)($t4)
-/* B53AF8 800DC958 000E7F82 */ srl $t7, $t6, 0x1e
-/* B53AFC 800DC95C 0324C823 */ subu $t9, $t9, $a0
-/* B53B00 800DC960 00036840 */ sll $t5, $v1, 1
-/* B53B04 800DC964 240A0001 */ li $t2, 1
-/* B53B08 800DC968 0019C940 */ sll $t9, $t9, 5
-/* B53B0C 800DC96C 000D77C2 */ srl $t6, $t5, 0x1f
-/* B53B10 800DC970 00035880 */ sll $t3, $v1, 2
-/* B53B14 800DC974 00C08025 */ move $s0, $a2
-/* B53B18 800DC978 00A08825 */ move $s1, $a1
-/* B53B1C 800DC97C AFAF008C */ sw $t7, 0x8c($sp)
-/* B53B20 800DC980 000B5FC2 */ srl $t3, $t3, 0x1f
-/* B53B24 800DC984 00004825 */ move $t1, $zero
-/* B53B28 800DC988 154E0014 */ bne $t2, $t6, .L800DC9DC
-/* B53B2C 800DC98C 032C3821 */ addu $a3, $t9, $t4
-/* B53B30 800DC990 A0C00000 */ sb $zero, ($a2)
-/* B53B34 800DC994 8CEF00BC */ lw $t7, 0xbc($a3)
-/* B53B38 800DC998 A4C00006 */ sh $zero, 6($a2)
-/* B53B3C 800DC99C A4C00010 */ sh $zero, 0x10($a2)
-/* B53B40 800DC9A0 A4C00012 */ sh $zero, 0x12($a2)
-/* B53B44 800DC9A4 A0C00002 */ sb $zero, 2($a2)
-/* B53B48 800DC9A8 A0C00003 */ sb $zero, 3($a2)
-/* B53B4C 800DC9AC ACCF0008 */ sw $t7, 8($a2)
-/* B53B50 800DC9B0 90B80005 */ lbu $t8, 5($a1)
-/* B53B54 800DC9B4 24190001 */ li $t9, 1
-/* B53B58 800DC9B8 A0C00005 */ sb $zero, 5($a2)
-/* B53B5C 800DC9BC A0D9001A */ sb $t9, 0x1a($a2)
-/* B53B60 800DC9C0 A0D80004 */ sb $t8, 4($a2)
-/* B53B64 800DC9C4 90EC00C0 */ lbu $t4, 0xc0($a3)
-/* B53B68 800DC9C8 01404825 */ move $t1, $t2
-/* B53B6C 800DC9CC 00005825 */ move $t3, $zero
-/* B53B70 800DC9D0 318DFFDF */ andi $t5, $t4, 0xffdf
-/* B53B74 800DC9D4 A0ED00C0 */ sb $t5, 0xc0($a3)
-/* B53B78 800DC9D8 8CA30000 */ lw $v1, ($a1)
-.L800DC9DC:
-/* B53B7C 800DC9DC 962E000C */ lhu $t6, 0xc($s1)
-/* B53B80 800DC9E0 8FB80170 */ lw $t8, 0x170($sp)
-/* B53B84 800DC9E4 00032380 */ sll $a0, $v1, 0xe
-/* B53B88 800DC9E8 31CFFFFF */ andi $t7, $t6, 0xffff
-/* B53B8C 800DC9EC 01F80019 */ multu $t7, $t8
-/* B53B90 800DC9F0 A7AE0136 */ sh $t6, 0x136($sp)
-/* B53B94 800DC9F4 960D0006 */ lhu $t5, 6($s0)
-/* B53B98 800DC9F8 92020005 */ lbu $v0, 5($s0)
-/* B53B9C 800DC9FC 000427C2 */ srl $a0, $a0, 0x1f
-/* B53BA0 800DCA00 24840001 */ addiu $a0, $a0, 1
-/* B53BA4 800DCA04 0000C812 */ mflo $t9
-/* B53BA8 800DCA08 00196040 */ sll $t4, $t9, 1
-/* B53BAC 800DCA0C 018D4021 */ addu $t0, $t4, $t5
-/* B53BB0 800DCA10 15420001 */ bne $t2, $v0, .L800DCA18
-/* B53BB4 800DCA14 A6080006 */ sh $t0, 6($s0)
-.L800DCA18:
-/* B53BB8 800DCA18 A2040005 */ sb $a0, 5($s0)
-/* B53BBC 800DCA1C 8E230000 */ lw $v1, ($s1)
-/* B53BC0 800DCA20 0003C340 */ sll $t8, $v1, 0xd
-/* B53BC4 800DCA24 07030018 */ bgezl $t8, .L800DCA88
-/* B53BC8 800DCA28 8E380010 */ lw $t8, 0x10($s1)
-/* B53BCC 800DCA2C 00083C02 */ srl $a3, $t0, 0x10
-/* B53BD0 800DCA30 8FA40174 */ lw $a0, 0x174($sp)
-/* B53BD4 800DCA34 AFA70050 */ sw $a3, 0x50($sp)
-/* B53BD8 800DCA38 02202825 */ move $a1, $s1
-/* B53BDC 800DCA3C 02003025 */ move $a2, $s0
-/* B53BE0 800DCA40 AFB00168 */ sw $s0, 0x168($sp)
-/* B53BE4 800DCA44 0C03767D */ jal func_800DD9F4
-/* B53BE8 800DCA48 AFB10164 */ sw $s1, 0x164($sp)
-/* B53BEC 800DCA4C 8FA40168 */ lw $a0, 0x168($sp)
-/* B53BF0 800DCA50 8FAD0050 */ lw $t5, 0x50($sp)
-/* B53BF4 800DCA54 240A0001 */ li $t2, 1
-/* B53BF8 800DCA58 8C860008 */ lw $a2, 8($a0)
-/* B53BFC 800DCA5C 0006C840 */ sll $t9, $a2, 1
-/* B53C00 800DCA60 272C0580 */ addiu $t4, $t9, 0x580
-/* B53C04 800DCA64 A7AC00AE */ sh $t4, 0xae($sp)
-/* B53C08 800DCA68 00CD7021 */ addu $t6, $a2, $t5
-/* B53C0C 800DCA6C AC8E0008 */ sw $t6, 8($a0)
-/* B53C10 800DCA70 8FB10164 */ lw $s1, 0x164($sp)
-/* B53C14 800DCA74 8FB00168 */ lw $s0, 0x168($sp)
-/* B53C18 800DCA78 8E230000 */ lw $v1, ($s1)
-/* B53C1C 800DCA7C 1000022D */ b .L800DD334
-/* B53C20 800DCA80 AFA20174 */ sw $v0, 0x174($sp)
-/* B53C24 800DCA84 8E380010 */ lw $t8, 0x10($s1)
-.L800DCA88:
-/* B53C28 800DCA88 00086C02 */ srl $t5, $t0, 0x10
-/* B53C2C 800DCA8C 8F020000 */ lw $v0, ($t8)
-/* B53C30 800DCA90 8C450008 */ lw $a1, 8($v0)
-/* B53C34 800DCA94 8CB90004 */ lw $t9, 4($a1)
-/* B53C38 800DCA98 AFB90100 */ sw $t9, 0x100($sp)
-/* B53C3C 800DCA9C 8C4C0004 */ lw $t4, 4($v0)
-/* B53C40 800DCAA0 AFA000B0 */ sw $zero, 0xb0($sp)
-/* B53C44 800DCAA4 AFA000BC */ sw $zero, 0xbc($sp)
-/* B53C48 800DCAA8 18800222 */ blez $a0, .L800DD334
-/* B53C4C 800DCAAC AFAC0110 */ sw $t4, 0x110($sp)
-/* B53C50 800DCAB0 AFAB0088 */ sw $t3, 0x88($sp)
-/* B53C54 800DCAB4 02005825 */ move $t3, $s0
-/* B53C58 800DCAB8 AFAD0050 */ sw $t5, 0x50($sp)
-/* B53C5C 800DCABC AFA20150 */ sw $v0, 0x150($sp)
-/* B53C60 800DCAC0 AFA400C0 */ sw $a0, 0xc0($sp)
-/* B53C64 800DCAC4 AFA5014C */ sw $a1, 0x14c($sp)
-/* B53C68 800DCAC8 AFA7009C */ sw $a3, 0x9c($sp)
-/* B53C6C 800DCACC AFA90138 */ sw $t1, 0x138($sp)
-/* B53C70 800DCAD0 AFB00168 */ sw $s0, 0x168($sp)
-/* B53C74 800DCAD4 AFB10164 */ sw $s1, 0x164($sp)
-/* B53C78 800DCAD8 8FB20174 */ lw $s2, 0x174($sp)
-/* B53C7C 800DCADC 8FAA00D4 */ lw $t2, 0xd4($sp)
-/* B53C80 800DCAE0 00801825 */ move $v1, $a0
-.L800DCAE4:
-/* B53C84 800DCAE4 8FAE0150 */ lw $t6, 0x150($sp)
-/* B53C88 800DCAE8 24010001 */ li $at, 1
-/* B53C8C 800DCAEC 00004825 */ move $t1, $zero
-/* B53C90 800DCAF0 8DC70000 */ lw $a3, ($t6)
-/* B53C94 800DCAF4 0000A825 */ move $s5, $zero
-/* B53C98 800DCAF8 14610003 */ bne $v1, $at, .L800DCB08
-/* B53C9C 800DCAFC 00073F02 */ srl $a3, $a3, 0x1c
-/* B53CA0 800DCB00 1000000B */ b .L800DCB30
-/* B53CA4 800DCB04 8FBE0050 */ lw $fp, 0x50($sp)
-.L800DCB08:
-/* B53CA8 800DCB08 8FAF0050 */ lw $t7, 0x50($sp)
-/* B53CAC 800DCB0C 8FAC00BC */ lw $t4, 0xbc($sp)
-/* B53CB0 800DCB10 8FBE0050 */ lw $fp, 0x50($sp)
-/* B53CB4 800DCB14 31F80001 */ andi $t8, $t7, 1
-/* B53CB8 800DCB18 13000005 */ beqz $t8, .L800DCB30
-/* B53CBC 800DCB1C 000C6840 */ sll $t5, $t4, 1
-/* B53CC0 800DCB20 2401FFFE */ li $at, -2
-/* B53CC4 800DCB24 01E1C824 */ and $t9, $t7, $at
-/* B53CC8 800DCB28 10000001 */ b .L800DCB30
-/* B53CCC 800DCB2C 032DF021 */ addu $fp, $t9, $t5
-.L800DCB30:
-/* B53CD0 800DCB30 10E00003 */ beqz $a3, .L800DCB40
-/* B53CD4 800DCB34 24010003 */ li $at, 3
-/* B53CD8 800DCB38 14E1002C */ bne $a3, $at, .L800DCBEC
-/* B53CDC 800DCB3C 00000000 */ nop
-.L800DCB40:
-/* B53CE0 800DCB40 8FAE0150 */ lw $t6, 0x150($sp)
-/* B53CE4 800DCB44 3C188017 */ lui $t8, %hi(gAudioContext+0x10) # $t8, 0x8017
-/* B53CE8 800DCB48 8F18F190 */ lw $t8, %lo(gAudioContext+0x10)($t8)
-/* B53CEC 800DCB4C 8DC2000C */ lw $v0, 0xc($t6)
-/* B53CF0 800DCB50 8FAF008C */ lw $t7, 0x8c($sp)
-/* B53CF4 800DCB54 24010001 */ li $at, 1
-/* B53CF8 800DCB58 24420008 */ addiu $v0, $v0, 8
-/* B53CFC 800DCB5C 13020023 */ beq $t8, $v0, .L800DCBEC
-/* B53D00 800DCB60 00000000 */ nop
-/* B53D04 800DCB64 11E10008 */ beq $t7, $at, .L800DCB88
-/* B53D08 800DCB68 3C0C8013 */ lui $t4, %hi(D_8012FBAA) # $t4, 0x8013
-/* B53D0C 800DCB6C 24010002 */ li $at, 2
-/* B53D10 800DCB70 11E10009 */ beq $t7, $at, .L800DCB98
-/* B53D14 800DCB74 24010003 */ li $at, 3
-/* B53D18 800DCB78 11E10007 */ beq $t7, $at, .L800DCB98
-/* B53D1C 800DCB7C 00000000 */ nop
-/* B53D20 800DCB80 10000005 */ b .L800DCB98
-/* B53D24 800DCB84 00000000 */ nop
-.L800DCB88:
-/* B53D28 800DCB88 258CFBAA */ addiu $t4, %lo(D_8012FBAA) # addiu $t4, $t4, -0x456
-/* B53D2C 800DCB8C 3C018017 */ lui $at, %hi(gAudioContext+0x10) # $at, 0x8017
-/* B53D30 800DCB90 10000003 */ b .L800DCBA0
-/* B53D34 800DCB94 AC2CF190 */ sw $t4, %lo(gAudioContext+0x10)($at)
-.L800DCB98:
-/* B53D38 800DCB98 3C018017 */ lui $at, %hi(gAudioContext+0x10) # $at, 0x8017
-/* B53D3C 800DCB9C AC22F190 */ sw $v0, %lo(gAudioContext+0x10)($at)
-.L800DCBA0:
-/* B53D40 800DCBA0 8FB90150 */ lw $t9, 0x150($sp)
-/* B53D44 800DCBA4 3C0100FF */ lui $at, (0x00FFFFFF >> 16) # lui $at, 0xff
-/* B53D48 800DCBA8 3421FFFF */ ori $at, (0x00FFFFFF & 0xFFFF) # ori $at, $at, 0xffff
-/* B53D4C 800DCBAC 8F22000C */ lw $v0, 0xc($t9)
-/* B53D50 800DCBB0 02401825 */ move $v1, $s2
-/* B53D54 800DCBB4 3C198017 */ lui $t9, %hi(gAudioContext+0x10) # $t9, 0x8017
-/* B53D58 800DCBB8 8C4D0000 */ lw $t5, ($v0)
-/* B53D5C 800DCBBC 8C580004 */ lw $t8, 4($v0)
-/* B53D60 800DCBC0 26520008 */ addiu $s2, $s2, 8
-/* B53D64 800DCBC4 000D7100 */ sll $t6, $t5, 4
-/* B53D68 800DCBC8 01D80019 */ multu $t6, $t8
-/* B53D6C 800DCBCC 00002012 */ mflo $a0
-/* B53D70 800DCBD0 00817824 */ and $t7, $a0, $at
-/* B53D74 800DCBD4 3C010B00 */ lui $at, 0xb00
-/* B53D78 800DCBD8 01E16025 */ or $t4, $t7, $at
-/* B53D7C 800DCBDC AC6C0000 */ sw $t4, ($v1)
-/* B53D80 800DCBE0 8F39F190 */ lw $t9, %lo(gAudioContext+0x10)($t9)
-/* B53D84 800DCBE4 AC790004 */ sw $t9, 4($v1)
-/* B53D88 800DCBE8 8FA300C0 */ lw $v1, 0xc0($sp)
-.L800DCBEC:
-/* B53D8C 800DCBEC 53C0017F */ beql $fp, $zero, .L800DD1EC
-/* B53D90 800DCBF0 24010001 */ li $at, 1
-/* B53D94 800DCBF4 AFA00140 */ sw $zero, 0x140($sp)
-.L800DCBF8:
-/* B53D98 800DCBF8 AFA0013C */ sw $zero, 0x13c($sp)
-/* B53D9C 800DCBFC 8D660008 */ lw $a2, 8($t3)
-/* B53DA0 800DCC00 8FAE0150 */ lw $t6, 0x150($sp)
-/* B53DA4 800DCC04 03C92023 */ subu $a0, $fp, $t1
-/* B53DA8 800DCC08 AFA400FC */ sw $a0, 0xfc($sp)
-/* B53DAC 800DCC0C 8FAD0100 */ lw $t5, 0x100($sp)
-/* B53DB0 800DCC10 8DC80000 */ lw $t0, ($t6)
-/* B53DB4 800DCC14 30D3000F */ andi $s3, $a2, 0xf
-/* B53DB8 800DCC18 0000A025 */ move $s4, $zero
-/* B53DBC 800DCC1C 01A61823 */ subu $v1, $t5, $a2
-/* B53DC0 800DCC20 16600005 */ bnez $s3, .L800DCC38
-/* B53DC4 800DCC24 00083F02 */ srl $a3, $t0, 0x1c
-/* B53DC8 800DCC28 91780000 */ lbu $t8, ($t3)
-/* B53DCC 800DCC2C 57000003 */ bnezl $t8, .L800DCC3C
-/* B53DD0 800DCC30 240F0010 */ li $t7, 16
-/* B53DD4 800DCC34 24130010 */ li $s3, 16
-.L800DCC38:
-/* B53DD8 800DCC38 240F0010 */ li $t7, 16
-.L800DCC3C:
-/* B53DDC 800DCC3C 01F32823 */ subu $a1, $t7, $s3
-/* B53DE0 800DCC40 0083082A */ slt $at, $a0, $v1
-/* B53DE4 800DCC44 1020000C */ beqz $at, .L800DCC78
-/* B53DE8 800DCC48 00A0B025 */ move $s6, $a1
-/* B53DEC 800DCC4C 00851023 */ subu $v0, $a0, $a1
-/* B53DF0 800DCC50 2442000F */ addiu $v0, $v0, 0xf
-/* B53DF4 800DCC54 04410002 */ bgez $v0, .L800DCC60
-/* B53DF8 800DCC58 00400821 */ addu $at, $v0, $zero
-/* B53DFC 800DCC5C 2441000F */ addiu $at, $v0, 0xf
-.L800DCC60:
-/* B53E00 800DCC60 00011103 */ sra $v0, $at, 4
-/* B53E04 800DCC64 00028100 */ sll $s0, $v0, 4
-/* B53E08 800DCC68 00B06021 */ addu $t4, $a1, $s0
-/* B53E0C 800DCC6C 00408825 */ move $s1, $v0
-/* B53E10 800DCC70 10000014 */ b .L800DCCC4
-/* B53E14 800DCC74 0184B823 */ subu $s7, $t4, $a0
-.L800DCC78:
-/* B53E18 800DCC78 00658023 */ subu $s0, $v1, $a1
-/* B53E1C 800DCC7C 1E000003 */ bgtz $s0, .L800DCC8C
-/* B53E20 800DCC80 0000B825 */ move $s7, $zero
-/* B53E24 800DCC84 00008025 */ move $s0, $zero
-/* B53E28 800DCC88 0060B025 */ move $s6, $v1
-.L800DCC8C:
-/* B53E2C 800DCC8C 8FB9014C */ lw $t9, 0x14c($sp)
-/* B53E30 800DCC90 2611000F */ addiu $s1, $s0, 0xf
-/* B53E34 800DCC94 06210002 */ bgez $s1, .L800DCCA0
-/* B53E38 800DCC98 02200821 */ addu $at, $s1, $zero
-/* B53E3C 800DCC9C 2621000F */ addiu $at, $s1, 0xf
-.L800DCCA0:
-/* B53E40 800DCCA0 00018903 */ sra $s1, $at, 4
-/* B53E44 800DCCA4 8F2D0008 */ lw $t5, 8($t9)
-/* B53E48 800DCCA8 240E0001 */ li $t6, 1
-/* B53E4C 800DCCAC 24180001 */ li $t8, 1
-/* B53E50 800DCCB0 51A00004 */ beql $t5, $zero, .L800DCCC4
-/* B53E54 800DCCB4 AFB80140 */ sw $t8, 0x140($sp)
-/* B53E58 800DCCB8 10000002 */ b .L800DCCC4
-/* B53E5C 800DCCBC AFAE013C */ sw $t6, 0x13c($sp)
-/* B53E60 800DCCC0 AFB80140 */ sw $t8, 0x140($sp)
-.L800DCCC4:
-/* B53E64 800DCCC4 2CE10006 */ sltiu $at, $a3, 6
-/* B53E68 800DCCC8 10200035 */ beqz $at, .L800DCDA0
-/* B53E6C 800DCCCC 00077880 */ sll $t7, $a3, 2
-/* B53E70 800DCCD0 3C018015 */ lui $at, %hi(jtbl_801493D0)
-/* B53E74 800DCCD4 002F0821 */ addu $at, $at, $t7
-/* B53E78 800DCCD8 8C2F93D0 */ lw $t7, %lo(jtbl_801493D0)($at)
-/* B53E7C 800DCCDC 01E00008 */ jr $t7
-/* B53E80 800DCCE0 00000000 */ nop
-glabel L800DCCE4
-/* B53E84 800DCCE4 240C0010 */ li $t4, 16
-/* B53E88 800DCCE8 240A0009 */ li $t2, 9
-/* B53E8C 800DCCEC AFAC00CC */ sw $t4, 0xcc($sp)
-/* B53E90 800DCCF0 1000002B */ b .L800DCDA0
-/* B53E94 800DCCF4 AFA000C8 */ sw $zero, 0xc8($sp)
-glabel L800DCCF8
-/* B53E98 800DCCF8 24190010 */ li $t9, 16
-/* B53E9C 800DCCFC 240A0005 */ li $t2, 5
-/* B53EA0 800DCD00 AFB900CC */ sw $t9, 0xcc($sp)
-/* B53EA4 800DCD04 10000026 */ b .L800DCDA0
-/* B53EA8 800DCD08 AFA000C8 */ sw $zero, 0xc8($sp)
-glabel L800DCD0C
-/* B53EAC 800DCD0C 240D0010 */ li $t5, 16
-/* B53EB0 800DCD10 240A0010 */ li $t2, 16
-/* B53EB4 800DCD14 AFAD00CC */ sw $t5, 0xcc($sp)
-/* B53EB8 800DCD18 10000021 */ b .L800DCDA0
-/* B53EBC 800DCD1C AFA000C8 */ sw $zero, 0xc8($sp)
-glabel L800DCD20
-/* B53EC0 800DCD20 02402025 */ move $a0, $s2
-/* B53EC4 800DCD24 001E3040 */ sll $a2, $fp, 1
-/* B53EC8 800DCD28 24C60020 */ addiu $a2, $a2, 0x20
-/* B53ECC 800DCD2C 26520008 */ addiu $s2, $s2, 8
-/* B53ED0 800DCD30 24050580 */ li $a1, 1408
-/* B53ED4 800DCD34 AFA00138 */ sw $zero, 0x138($sp)
-/* B53ED8 800DCD38 AFA00120 */ sw $zero, 0x120($sp)
-/* B53EDC 800DCD3C 03C04825 */ move $t1, $fp
-/* B53EE0 800DCD40 03C0A825 */ move $s5, $fp
-/* B53EE4 800DCD44 AFBE0104 */ sw $fp, 0x104($sp)
-/* B53EE8 800DCD48 0C036EE7 */ jal func_800DBB9C
-/* B53EEC 800DCD4C AFAA00D4 */ sw $t2, 0xd4($sp)
-/* B53EF0 800DCD50 8FA90104 */ lw $t1, 0x104($sp)
-/* B53EF4 800DCD54 8FAA00D4 */ lw $t2, 0xd4($sp)
-/* B53EF8 800DCD58 100000FE */ b .L800DD154
-/* B53EFC 800DCD5C 8FAB0168 */ lw $t3, 0x168($sp)
-glabel L800DCD60
-/* B53F00 800DCD60 02402025 */ move $a0, $s2
-/* B53F04 800DCD64 001E3040 */ sll $a2, $fp, 1
-/* B53F08 800DCD68 24C60020 */ addiu $a2, $a2, 0x20
-/* B53F0C 800DCD6C 26520008 */ addiu $s2, $s2, 8
-/* B53F10 800DCD70 24050580 */ li $a1, 1408
-/* B53F14 800DCD74 AFA00138 */ sw $zero, 0x138($sp)
-/* B53F18 800DCD78 AFA00120 */ sw $zero, 0x120($sp)
-/* B53F1C 800DCD7C 03C04825 */ move $t1, $fp
-/* B53F20 800DCD80 03C0A825 */ move $s5, $fp
-/* B53F24 800DCD84 AFBE0104 */ sw $fp, 0x104($sp)
-/* B53F28 800DCD88 0C036EE7 */ jal func_800DBB9C
-/* B53F2C 800DCD8C AFAA00D4 */ sw $t2, 0xd4($sp)
-/* B53F30 800DCD90 8FA90104 */ lw $t1, 0x104($sp)
-/* B53F34 800DCD94 8FAA00D4 */ lw $t2, 0xd4($sp)
-/* B53F38 800DCD98 100000EE */ b .L800DD154
-/* B53F3C 800DCD9C 8FAB0168 */ lw $t3, 0x168($sp)
-glabel L800DCDA0
-.L800DCDA0:
-/* B53F40 800DCDA0 12200044 */ beqz $s1, .L800DCEB4
-/* B53F44 800DCDA4 8FAE00CC */ lw $t6, 0xcc($sp)
-/* B53F48 800DCDA8 00CEC021 */ addu $t8, $a2, $t6
-/* B53F4C 800DCDAC 03131823 */ subu $v1, $t8, $s3
-/* B53F50 800DCDB0 04610002 */ bgez $v1, .L800DCDBC
-/* B53F54 800DCDB4 00600821 */ addu $at, $v1, $zero
-/* B53F58 800DCDB8 2461000F */ addiu $at, $v1, 0xf
-.L800DCDBC:
-/* B53F5C 800DCDBC 00011903 */ sra $v1, $at, 4
-/* B53F60 800DCDC0 00081100 */ sll $v0, $t0, 4
-/* B53F64 800DCDC4 00021782 */ srl $v0, $v0, 0x1e
-/* B53F68 800DCDC8 14400008 */ bnez $v0, .L800DCDEC
-/* B53F6C 800DCDCC 24010001 */ li $at, 1
-/* B53F70 800DCDD0 006A0019 */ multu $v1, $t2
-/* B53F74 800DCDD4 8FAF00C8 */ lw $t7, 0xc8($sp)
-/* B53F78 800DCDD8 8FAD0110 */ lw $t5, 0x110($sp)
-/* B53F7C 800DCDDC 00006012 */ mflo $t4
-/* B53F80 800DCDE0 01ECC821 */ addu $t9, $t7, $t4
-/* B53F84 800DCDE4 1000001A */ b .L800DCE50
-/* B53F88 800DCDE8 032D2821 */ addu $a1, $t9, $t5
-.L800DCDEC:
-/* B53F8C 800DCDEC 14410003 */ bne $v0, $at, .L800DCDFC
-/* B53F90 800DCDF0 00000000 */ nop
-/* B53F94 800DCDF4 10000201 */ b .L800DD5FC
-/* B53F98 800DCDF8 02401025 */ move $v0, $s2
-.L800DCDFC:
-/* B53F9C 800DCDFC 006A0019 */ multu $v1, $t2
-/* B53FA0 800DCE00 8FAE00C8 */ lw $t6, 0xc8($sp)
-/* B53FA4 800DCE04 8FAC0110 */ lw $t4, 0x110($sp)
-/* B53FA8 800DCE08 2401FFF0 */ li $at, -16
-/* B53FAC 800DCE0C 8FA60138 */ lw $a2, 0x138($sp)
-/* B53FB0 800DCE10 25670001 */ addiu $a3, $t3, 1
-/* B53FB4 800DCE14 AFA20010 */ sw $v0, 0x10($sp)
-/* B53FB8 800DCE18 AFA90104 */ sw $t1, 0x104($sp)
-/* B53FBC 800DCE1C AFAA00D4 */ sw $t2, 0xd4($sp)
-/* B53FC0 800DCE20 0000C012 */ mflo $t8
-/* B53FC4 800DCE24 01D87821 */ addu $t7, $t6, $t8
-/* B53FC8 800DCE28 01EC2021 */ addu $a0, $t7, $t4
-/* B53FCC 800DCE2C 022A0019 */ multu $s1, $t2
-/* B53FD0 800DCE30 00002812 */ mflo $a1
-/* B53FD4 800DCE34 24A5001F */ addiu $a1, $a1, 0x1f
-/* B53FD8 800DCE38 0C0384B7 */ jal func_800E12DC
-/* B53FDC 800DCE3C 00A12824 */ and $a1, $a1, $at
-/* B53FE0 800DCE40 8FA90104 */ lw $t1, 0x104($sp)
-/* B53FE4 800DCE44 8FAA00D4 */ lw $t2, 0xd4($sp)
-/* B53FE8 800DCE48 8FAB0168 */ lw $t3, 0x168($sp)
-/* B53FEC 800DCE4C 00402825 */ move $a1, $v0
-.L800DCE50:
-/* B53FF0 800DCE50 14A00003 */ bnez $a1, .L800DCE60
-/* B53FF4 800DCE54 00000000 */ nop
-/* B53FF8 800DCE58 100001E8 */ b .L800DD5FC
-/* B53FFC 800DCE5C 02401025 */ move $v0, $s2
-.L800DCE60:
-/* B54000 800DCE60 022A0019 */ multu $s1, $t2
-/* B54004 800DCE64 3C011400 */ lui $at, 0x1400
-/* B54008 800DCE68 240F0940 */ li $t7, 2368
-/* B5400C 800DCE6C 30A8000F */ andi $t0, $a1, 0xf
-/* B54010 800DCE70 02402025 */ move $a0, $s2
-/* B54014 800DCE74 00A86023 */ subu $t4, $a1, $t0
-/* B54018 800DCE78 AC8C0004 */ sw $t4, 4($a0)
-/* B5401C 800DCE7C 26520008 */ addiu $s2, $s2, 8
-/* B54020 800DCE80 00001012 */ mflo $v0
-/* B54024 800DCE84 2442001F */ addiu $v0, $v0, 0x1f
-/* B54028 800DCE88 3042FFF0 */ andi $v0, $v0, 0xfff0
-/* B5402C 800DCE8C 0002C903 */ sra $t9, $v0, 4
-/* B54030 800DCE90 332D00FF */ andi $t5, $t9, 0xff
-/* B54034 800DCE94 000D7400 */ sll $t6, $t5, 0x10
-/* B54038 800DCE98 01C1C025 */ or $t8, $t6, $at
-/* B5403C 800DCE9C 01E26823 */ subu $t5, $t7, $v0
-/* B54040 800DCEA0 31AEFFFF */ andi $t6, $t5, 0xffff
-/* B54044 800DCEA4 030E7825 */ or $t7, $t8, $t6
-/* B54048 800DCEA8 AC8F0000 */ sw $t7, ($a0)
-/* B5404C 800DCEAC 10000004 */ b .L800DCEC0
-/* B54050 800DCEB0 91660000 */ lbu $a2, ($t3)
-.L800DCEB4:
-/* B54054 800DCEB4 00008025 */ move $s0, $zero
-/* B54058 800DCEB8 00004025 */ move $t0, $zero
-/* B5405C 800DCEBC 91660000 */ lbu $a2, ($t3)
-.L800DCEC0:
-/* B54060 800DCEC0 10C0000B */ beqz $a2, .L800DCEF0
-/* B54064 800DCEC4 02401025 */ move $v0, $s2
-/* B54068 800DCEC8 3C190F00 */ lui $t9, 0xf00
-/* B5406C 800DCECC AC590000 */ sw $t9, ($v0)
-/* B54070 800DCED0 8FAD0150 */ lw $t5, 0x150($sp)
-/* B54074 800DCED4 240F0002 */ li $t7, 2
-/* B54078 800DCED8 26520008 */ addiu $s2, $s2, 8
-/* B5407C 800DCEDC 8DB80008 */ lw $t8, 8($t5)
-/* B54080 800DCEE0 270E0010 */ addiu $t6, $t8, 0x10
-/* B54084 800DCEE4 AC4E0004 */ sw $t6, 4($v0)
-/* B54088 800DCEE8 AFAF0138 */ sw $t7, 0x138($sp)
-/* B5408C 800DCEEC A1600000 */ sb $zero, ($t3)
-.L800DCEF0:
-/* B54090 800DCEF0 8FAC0150 */ lw $t4, 0x150($sp)
-/* B54094 800DCEF4 0013C840 */ sll $t9, $s3, 1
-/* B54098 800DCEF8 2401FFF0 */ li $at, -16
-/* B5409C 800DCEFC 8D870000 */ lw $a3, ($t4)
-/* B540A0 800DCF00 15200003 */ bnez $t1, .L800DCF10
-/* B540A4 800DCF04 00073F02 */ srl $a3, $a3, 0x1c
-/* B540A8 800DCF08 10000003 */ b .L800DCF18
-/* B540AC 800DCF0C AFB90120 */ sw $t9, 0x120($sp)
-.L800DCF10:
-/* B540B0 800DCF10 26B4001F */ addiu $s4, $s5, 0x1f
-/* B540B4 800DCF14 0281A024 */ and $s4, $s4, $at
-.L800DCF18:
-/* B540B8 800DCF18 10E00007 */ beqz $a3, .L800DCF38
-/* B540BC 800DCF1C 24010001 */ li $at, 1
-/* B540C0 800DCF20 10E10042 */ beq $a3, $at, .L800DD02C
-/* B540C4 800DCF24 24010003 */ li $at, 3
-/* B540C8 800DCF28 10E10021 */ beq $a3, $at, .L800DCFB0
-/* B540CC 800DCF2C 00000000 */ nop
-/* B540D0 800DCF30 10000059 */ b .L800DD098
-/* B540D4 800DCF34 00000000 */ nop
-.L800DCF38:
-/* B540D8 800DCF38 022A0019 */ multu $s1, $t2
-/* B540DC 800DCF3C 240F0940 */ li $t7, 2368
-/* B540E0 800DCF40 3C010800 */ lui $at, 0x800
-/* B540E4 800DCF44 02401025 */ move $v0, $s2
-/* B540E8 800DCF48 26990580 */ addiu $t9, $s4, 0x580
-/* B540EC 800DCF4C 26520008 */ addiu $s2, $s2, 8
-/* B540F0 800DCF50 02401825 */ move $v1, $s2
-/* B540F4 800DCF54 26520008 */ addiu $s2, $s2, 8
-/* B540F8 800DCF58 00006812 */ mflo $t5
-/* B540FC 800DCF5C 25B8001F */ addiu $t8, $t5, 0x1f
-/* B54100 800DCF60 330EFFF0 */ andi $t6, $t8, 0xfff0
-/* B54104 800DCF64 01EE6823 */ subu $t5, $t7, $t6
-/* B54108 800DCF68 01A8C021 */ addu $t8, $t5, $t0
-/* B5410C 800DCF6C 330FFFFF */ andi $t7, $t8, 0xffff
-/* B54110 800DCF70 01E17025 */ or $t6, $t7, $at
-/* B54114 800DCF74 0010C040 */ sll $t8, $s0, 1
-/* B54118 800DCF78 330FFFFF */ andi $t7, $t8, 0xffff
-/* B5411C 800DCF7C AC4E0000 */ sw $t6, ($v0)
-/* B54120 800DCF80 00196C00 */ sll $t5, $t9, 0x10
-/* B54124 800DCF84 01AF7025 */ or $t6, $t5, $t7
-/* B54128 800DCF88 AC4E0004 */ sw $t6, 4($v0)
-/* B5412C 800DCF8C 8FAC0138 */ lw $t4, 0x138($sp)
-/* B54130 800DCF90 3C010100 */ lui $at, 0x100
-/* B54134 800DCF94 319900FF */ andi $t9, $t4, 0xff
-/* B54138 800DCF98 0019C400 */ sll $t8, $t9, 0x10
-/* B5413C 800DCF9C 03016825 */ or $t5, $t8, $at
-/* B54140 800DCFA0 AC6D0000 */ sw $t5, ($v1)
-/* B54144 800DCFA4 8D6F000C */ lw $t7, 0xc($t3)
-/* B54148 800DCFA8 1000003B */ b .L800DD098
-/* B5414C 800DCFAC AC6F0004 */ sw $t7, 4($v1)
-.L800DCFB0:
-/* B54150 800DCFB0 022A0019 */ multu $s1, $t2
-/* B54154 800DCFB4 24180940 */ li $t8, 2368
-/* B54158 800DCFB8 3C010800 */ lui $at, 0x800
-/* B5415C 800DCFBC 02401025 */ move $v0, $s2
-/* B54160 800DCFC0 268F0580 */ addiu $t7, $s4, 0x580
-/* B54164 800DCFC4 26520008 */ addiu $s2, $s2, 8
-/* B54168 800DCFC8 02401825 */ move $v1, $s2
-/* B5416C 800DCFCC 26520008 */ addiu $s2, $s2, 8
-/* B54170 800DCFD0 00007012 */ mflo $t6
-/* B54174 800DCFD4 25CC001F */ addiu $t4, $t6, 0x1f
-/* B54178 800DCFD8 3199FFF0 */ andi $t9, $t4, 0xfff0
-/* B5417C 800DCFDC 03197023 */ subu $t6, $t8, $t9
-/* B54180 800DCFE0 01C86021 */ addu $t4, $t6, $t0
-/* B54184 800DCFE4 3198FFFF */ andi $t8, $t4, 0xffff
-/* B54188 800DCFE8 0301C825 */ or $t9, $t8, $at
-/* B5418C 800DCFEC 00106040 */ sll $t4, $s0, 1
-/* B54190 800DCFF0 3198FFFF */ andi $t8, $t4, 0xffff
-/* B54194 800DCFF4 AC590000 */ sw $t9, ($v0)
-/* B54198 800DCFF8 000F7400 */ sll $t6, $t7, 0x10
-/* B5419C 800DCFFC 01D8C825 */ or $t9, $t6, $t8
-/* B541A0 800DD000 AC590004 */ sw $t9, 4($v0)
-/* B541A4 800DD004 8FAD0138 */ lw $t5, 0x138($sp)
-/* B541A8 800DD008 3C010100 */ lui $at, 0x100
-/* B541AC 800DD00C 35AF0004 */ ori $t7, $t5, 4
-/* B541B0 800DD010 31EC00FF */ andi $t4, $t7, 0xff
-/* B541B4 800DD014 000C7400 */ sll $t6, $t4, 0x10
-/* B541B8 800DD018 01C1C025 */ or $t8, $t6, $at
-/* B541BC 800DD01C AC780000 */ sw $t8, ($v1)
-/* B541C0 800DD020 8D79000C */ lw $t9, 0xc($t3)
-/* B541C4 800DD024 1000001C */ b .L800DD098
-/* B541C8 800DD028 AC790004 */ sw $t9, 4($v1)
-.L800DD02C:
-/* B541CC 800DD02C 022A0019 */ multu $s1, $t2
-/* B541D0 800DD030 240E0940 */ li $t6, 2368
-/* B541D4 800DD034 02402025 */ move $a0, $s2
-/* B541D8 800DD038 26520008 */ addiu $s2, $s2, 8
-/* B541DC 800DD03C 00002825 */ move $a1, $zero
-/* B541E0 800DD040 26870580 */ addiu $a3, $s4, 0x580
-/* B541E4 800DD044 AFA90104 */ sw $t1, 0x104($sp)
-/* B541E8 800DD048 AFAA00D4 */ sw $t2, 0xd4($sp)
-/* B541EC 800DD04C 00006812 */ mflo $t5
-/* B541F0 800DD050 25AF001F */ addiu $t7, $t5, 0x1f
-/* B541F4 800DD054 31ECFFF0 */ andi $t4, $t7, 0xfff0
-/* B541F8 800DD058 01CCC023 */ subu $t8, $t6, $t4
-/* B541FC 800DD05C 0018CC00 */ sll $t9, $t8, 0x10
-/* B54200 800DD060 00196C03 */ sra $t5, $t9, 0x10
-/* B54204 800DD064 00107840 */ sll $t7, $s0, 1
-/* B54208 800DD068 AFAF0010 */ sw $t7, 0x10($sp)
-/* B5420C 800DD06C 0C036F08 */ jal AudioSynth_SetBuffer
-/* B54210 800DD070 01A83021 */ addu $a2, $t5, $t0
-/* B54214 800DD074 8FAB0168 */ lw $t3, 0x168($sp)
-/* B54218 800DD078 02402025 */ move $a0, $s2
-/* B5421C 800DD07C 26520008 */ addiu $s2, $s2, 8
-/* B54220 800DD080 8FA50138 */ lw $a1, 0x138($sp)
-/* B54224 800DD084 0C036F65 */ jal AudioSynth_UnkCmd17
-/* B54228 800DD088 8D66000C */ lw $a2, 0xc($t3)
-/* B5422C 800DD08C 8FA90104 */ lw $t1, 0x104($sp)
-/* B54230 800DD090 8FAA00D4 */ lw $t2, 0xd4($sp)
-/* B54234 800DD094 8FAB0168 */ lw $t3, 0x168($sp)
-.L800DD098:
-/* B54238 800DD098 11200013 */ beqz $t1, .L800DD0E8
-/* B5423C 800DD09C 02401025 */ move $v0, $s2
-/* B54240 800DD0A0 00137040 */ sll $t6, $s3, 1
-/* B54244 800DD0A4 028E6021 */ addu $t4, $s4, $t6
-/* B54248 800DD0A8 3C0100FF */ lui $at, (0x00FFFFFF >> 16) # lui $at, 0xff
-/* B5424C 800DD0AC 3421FFFF */ ori $at, (0x00FFFFFF & 0xFFFF) # ori $at, $at, 0xffff
-/* B54250 800DD0B0 25980580 */ addiu $t8, $t4, 0x580
-/* B54254 800DD0B4 0301C824 */ and $t9, $t8, $at
-/* B54258 800DD0B8 3C010A00 */ lui $at, 0xa00
-/* B5425C 800DD0BC 03216825 */ or $t5, $t9, $at
-/* B54260 800DD0C0 0216C021 */ addu $t8, $s0, $s6
-/* B54264 800DD0C4 0317C823 */ subu $t9, $t8, $s7
-/* B54268 800DD0C8 AC4D0000 */ sw $t5, ($v0)
-/* B5426C 800DD0CC 00196840 */ sll $t5, $t9, 1
-/* B54270 800DD0D0 26AE0580 */ addiu $t6, $s5, 0x580
-/* B54274 800DD0D4 000E6400 */ sll $t4, $t6, 0x10
-/* B54278 800DD0D8 31AFFFFF */ andi $t7, $t5, 0xffff
-/* B5427C 800DD0DC 018F7025 */ or $t6, $t4, $t7
-/* B54280 800DD0E0 AC4E0004 */ sw $t6, 4($v0)
-/* B54284 800DD0E4 26520008 */ addiu $s2, $s2, 8
-.L800DD0E8:
-/* B54288 800DD0E8 8FB90138 */ lw $t9, 0x138($sp)
-/* B5428C 800DD0EC 0216C021 */ addu $t8, $s0, $s6
-/* B54290 800DD0F0 03171823 */ subu $v1, $t8, $s7
-/* B54294 800DD0F4 24010001 */ li $at, 1
-/* B54298 800DD0F8 13210007 */ beq $t9, $at, .L800DD118
-/* B5429C 800DD0FC 01234821 */ addu $t1, $t1, $v1
-/* B542A0 800DD100 3B220002 */ xori $v0, $t9, 2
-/* B542A4 800DD104 2C420001 */ sltiu $v0, $v0, 1
-/* B542A8 800DD108 14400009 */ bnez $v0, .L800DD130
-/* B542AC 800DD10C AFA00138 */ sw $zero, 0x138($sp)
-/* B542B0 800DD110 1000000A */ b .L800DD13C
-/* B542B4 800DD114 00037840 */ sll $t7, $v1, 1
-.L800DD118:
-/* B542B8 800DD118 240D0020 */ li $t5, 32
-/* B542BC 800DD11C 0010A840 */ sll $s5, $s0, 1
-/* B542C0 800DD120 AFAD0120 */ sw $t5, 0x120($sp)
-/* B542C4 800DD124 26B50020 */ addiu $s5, $s5, 0x20
-/* B542C8 800DD128 1000000A */ b .L800DD154
-/* B542CC 800DD12C AFA00138 */ sw $zero, 0x138($sp)
-.L800DD130:
-/* B542D0 800DD130 00036040 */ sll $t4, $v1, 1
-/* B542D4 800DD134 10000007 */ b .L800DD154
-/* B542D8 800DD138 0195A821 */ addu $s5, $t4, $s5
-.L800DD13C:
-/* B542DC 800DD13C 52A00004 */ beql $s5, $zero, .L800DD150
-/* B542E0 800DD140 0263A821 */ addu $s5, $s3, $v1
-/* B542E4 800DD144 10000003 */ b .L800DD154
-/* B542E8 800DD148 01F5A821 */ addu $s5, $t7, $s5
-/* B542EC 800DD14C 0263A821 */ addu $s5, $s3, $v1
-.L800DD150:
-/* B542F0 800DD150 0015A840 */ sll $s5, $s5, 1
-.L800DD154:
-/* B542F4 800DD154 8FAE0140 */ lw $t6, 0x140($sp)
-/* B542F8 800DD158 8FAF013C */ lw $t7, 0x13c($sp)
-/* B542FC 800DD15C 8FAC00FC */ lw $t4, 0xfc($sp)
-/* B54300 800DD160 11C00014 */ beqz $t6, .L800DD1B4
-/* B54304 800DD164 02402025 */ move $a0, $s2
-/* B54308 800DD168 03C93023 */ subu $a2, $fp, $t1
-/* B5430C 800DD16C 24180001 */ li $t8, 1
-/* B54310 800DD170 AFB80088 */ sw $t8, 0x88($sp)
-/* B54314 800DD174 00063040 */ sll $a2, $a2, 1
-/* B54318 800DD178 26520008 */ addiu $s2, $s2, 8
-/* B5431C 800DD17C 26A50580 */ addiu $a1, $s5, 0x580
-/* B54320 800DD180 0C036EE7 */ jal func_800DBB9C
-/* B54324 800DD184 AFAA00D4 */ sw $t2, 0xd4($sp)
-/* B54328 800DD188 8FA2009C */ lw $v0, 0x9c($sp)
-/* B5432C 800DD18C 904D00C0 */ lbu $t5, 0xc0($v0)
-/* B54330 800DD190 35AC0020 */ ori $t4, $t5, 0x20
-/* B54334 800DD194 A04C00C0 */ sb $t4, 0xc0($v0)
-/* B54338 800DD198 8FA50160 */ lw $a1, 0x160($sp)
-/* B5433C 800DD19C 0C036CB0 */ jal func_800DB2C0
-/* B54340 800DD1A0 8FA40178 */ lw $a0, 0x178($sp)
-/* B54344 800DD1A4 8FAA00D4 */ lw $t2, 0xd4($sp)
-/* B54348 800DD1A8 8FAB0168 */ lw $t3, 0x168($sp)
-/* B5434C 800DD1AC 1000000E */ b .L800DD1E8
-/* B54350 800DD1B0 8FA300C0 */ lw $v1, 0xc0($sp)
-.L800DD1B4:
-/* B54354 800DD1B4 11E00006 */ beqz $t7, .L800DD1D0
-/* B54358 800DD1B8 240E0001 */ li $t6, 1
-/* B5435C 800DD1BC A16E0000 */ sb $t6, ($t3)
-/* B54360 800DD1C0 8FB8014C */ lw $t8, 0x14c($sp)
-/* B54364 800DD1C4 8F190000 */ lw $t9, ($t8)
-/* B54368 800DD1C8 10000004 */ b .L800DD1DC
-/* B5436C 800DD1CC AD790008 */ sw $t9, 8($t3)
-.L800DD1D0:
-/* B54370 800DD1D0 8D6D0008 */ lw $t5, 8($t3)
-/* B54374 800DD1D4 01AC7821 */ addu $t7, $t5, $t4
-/* B54378 800DD1D8 AD6F0008 */ sw $t7, 8($t3)
-.L800DD1DC:
-/* B5437C 800DD1DC 553EFE86 */ bnel $t1, $fp, .L800DCBF8
-/* B54380 800DD1E0 AFA00140 */ sw $zero, 0x140($sp)
-/* B54384 800DD1E4 8FA300C0 */ lw $v1, 0xc0($sp)
-.L800DD1E8:
-/* B54388 800DD1E8 24010001 */ li $at, 1
-.L800DD1EC:
-/* B5438C 800DD1EC 10610006 */ beq $v1, $at, .L800DD208
-/* B54390 800DD1F0 8FAE0120 */ lw $t6, 0x120($sp)
-/* B54394 800DD1F4 24010002 */ li $at, 2
-/* B54398 800DD1F8 10610006 */ beq $v1, $at, .L800DD214
-/* B5439C 800DD1FC 8FB900BC */ lw $t9, 0xbc($sp)
-/* B543A0 800DD200 1000003B */ b .L800DD2F0
-/* B543A4 800DD204 8FAF0088 */ lw $t7, 0x88($sp)
-.L800DD208:
-/* B543A8 800DD208 25D80580 */ addiu $t8, $t6, 0x580
-/* B543AC 800DD20C 10000037 */ b .L800DD2EC
-/* B543B0 800DD210 A7B800AE */ sh $t8, 0xae($sp)
-.L800DD214:
-/* B543B4 800DD214 13200006 */ beqz $t9, .L800DD230
-/* B543B8 800DD218 02402025 */ move $a0, $s2
-/* B543BC 800DD21C 24010001 */ li $at, 1
-/* B543C0 800DD220 13210021 */ beq $t9, $at, .L800DD2A8
-/* B543C4 800DD224 02402025 */ move $a0, $s2
-/* B543C8 800DD228 10000031 */ b .L800DD2F0
-/* B543CC 800DD22C 8FAF0088 */ lw $t7, 0x88($sp)
-.L800DD230:
-/* B543D0 800DD230 8FA50120 */ lw $a1, 0x120($sp)
-/* B543D4 800DD234 240D03E0 */ li $t5, 992
-/* B543D8 800DD238 A7AD00AE */ sh $t5, 0xae($sp)
-/* B543DC 800DD23C 240603E0 */ li $a2, 992
-/* B543E0 800DD240 26520008 */ addiu $s2, $s2, 8
-/* B543E4 800DD244 AFAA00D4 */ sw $t2, 0xd4($sp)
-/* B543E8 800DD248 24A50580 */ addiu $a1, $a1, 0x580
-/* B543EC 800DD24C 07C10003 */ bgez $fp, .L800DD25C
-/* B543F0 800DD250 001E3843 */ sra $a3, $fp, 1
-/* B543F4 800DD254 27C10001 */ addiu $at, $fp, 1
-/* B543F8 800DD258 00013843 */ sra $a3, $at, 1
-.L800DD25C:
-/* B543FC 800DD25C 2401FFF8 */ li $at, -8
-/* B54400 800DD260 24E70007 */ addiu $a3, $a3, 7
-/* B54404 800DD264 0C036F2C */ jal AudioSynth_InterL
-/* B54408 800DD268 00E13824 */ and $a3, $a3, $at
-/* B5440C 800DD26C 8FAC0088 */ lw $t4, 0x88($sp)
-/* B54410 800DD270 8FAA00D4 */ lw $t2, 0xd4($sp)
-/* B54414 800DD274 8FAB0168 */ lw $t3, 0x168($sp)
-/* B54418 800DD278 11800009 */ beqz $t4, .L800DD2A0
-/* B5441C 800DD27C AFBE00B0 */ sw $fp, 0xb0($sp)
-/* B54420 800DD280 02402025 */ move $a0, $s2
-/* B54424 800DD284 26520008 */ addiu $s2, $s2, 8
-/* B54428 800DD288 27C503E0 */ addiu $a1, $fp, 0x3e0
-/* B5442C 800DD28C 27C60010 */ addiu $a2, $fp, 0x10
-/* B54430 800DD290 0C036EE7 */ jal func_800DBB9C
-/* B54434 800DD294 AFAA00D4 */ sw $t2, 0xd4($sp)
-/* B54438 800DD298 8FAA00D4 */ lw $t2, 0xd4($sp)
-/* B5443C 800DD29C 8FAB0168 */ lw $t3, 0x168($sp)
-.L800DD2A0:
-/* B54440 800DD2A0 10000012 */ b .L800DD2EC
-/* B54444 800DD2A4 8FA300C0 */ lw $v1, 0xc0($sp)
-.L800DD2A8:
-/* B54448 800DD2A8 8FA50120 */ lw $a1, 0x120($sp)
-/* B5444C 800DD2AC 8FA600B0 */ lw $a2, 0xb0($sp)
-/* B54450 800DD2B0 26520008 */ addiu $s2, $s2, 8
-/* B54454 800DD2B4 AFAA00D4 */ sw $t2, 0xd4($sp)
-/* B54458 800DD2B8 24A50580 */ addiu $a1, $a1, 0x580
-/* B5445C 800DD2BC 24C603E0 */ addiu $a2, $a2, 0x3e0
-/* B54460 800DD2C0 07C10003 */ bgez $fp, .L800DD2D0
-/* B54464 800DD2C4 001E3843 */ sra $a3, $fp, 1
-/* B54468 800DD2C8 27C10001 */ addiu $at, $fp, 1
-/* B5446C 800DD2CC 00013843 */ sra $a3, $at, 1
-.L800DD2D0:
-/* B54470 800DD2D0 2401FFF8 */ li $at, -8
-/* B54474 800DD2D4 24E70007 */ addiu $a3, $a3, 7
-/* B54478 800DD2D8 0C036F2C */ jal AudioSynth_InterL
-/* B5447C 800DD2DC 00E13824 */ and $a3, $a3, $at
-/* B54480 800DD2E0 8FAA00D4 */ lw $t2, 0xd4($sp)
-/* B54484 800DD2E4 8FAB0168 */ lw $t3, 0x168($sp)
-/* B54488 800DD2E8 8FA300C0 */ lw $v1, 0xc0($sp)
-.L800DD2EC:
-/* B5448C 800DD2EC 8FAF0088 */ lw $t7, 0x88($sp)
-.L800DD2F0:
-/* B54490 800DD2F0 8FB800BC */ lw $t8, 0xbc($sp)
-/* B54494 800DD2F4 11E00007 */ beqz $t7, .L800DD314
-/* B54498 800DD2F8 27190001 */ addiu $t9, $t8, 1
-/* B5449C 800DD2FC 8FB10164 */ lw $s1, 0x164($sp)
-/* B544A0 800DD300 8FB00168 */ lw $s0, 0x168($sp)
-/* B544A4 800DD304 240A0001 */ li $t2, 1
-/* B544A8 800DD308 8E230000 */ lw $v1, ($s1)
-/* B544AC 800DD30C 10000009 */ b .L800DD334
-/* B544B0 800DD310 AFB20174 */ sw $s2, 0x174($sp)
-.L800DD314:
-/* B544B4 800DD314 1723FDF3 */ bne $t9, $v1, .L800DCAE4
-/* B544B8 800DD318 AFB900BC */ sw $t9, 0xbc($sp)
-/* B544BC 800DD31C 8FB10164 */ lw $s1, 0x164($sp)
-/* B544C0 800DD320 AFAA00D4 */ sw $t2, 0xd4($sp)
-/* B544C4 800DD324 240A0001 */ li $t2, 1
-/* B544C8 800DD328 8E230000 */ lw $v1, ($s1)
-/* B544CC 800DD32C AFB20174 */ sw $s2, 0x174($sp)
-/* B544D0 800DD330 8FB00168 */ lw $s0, 0x168($sp)
-.L800DD334:
-/* B544D4 800DD334 00036040 */ sll $t4, $v1, 1
-/* B544D8 800DD338 000C7FC2 */ srl $t7, $t4, 0x1f
-/* B544DC 800DD33C 8FB20174 */ lw $s2, 0x174($sp)
-/* B544E0 800DD340 154F0005 */ bne $t2, $t7, .L800DD358
-/* B544E4 800DD344 00004825 */ move $t1, $zero
-/* B544E8 800DD348 922E0000 */ lbu $t6, ($s1)
-/* B544EC 800DD34C 24090001 */ li $t1, 1
-/* B544F0 800DD350 31D8FFBF */ andi $t8, $t6, 0xffbf
-/* B544F4 800DD354 A2380000 */ sb $t8, ($s1)
-.L800DD358:
-/* B544F8 800DD358 8FB40170 */ lw $s4, 0x170($sp)
-/* B544FC 800DD35C 97B900AE */ lhu $t9, 0xae($sp)
-/* B54500 800DD360 02402025 */ move $a0, $s2
-/* B54504 800DD364 0014A040 */ sll $s4, $s4, 1
-/* B54508 800DD368 02803025 */ move $a2, $s4
-/* B5450C 800DD36C 02002825 */ move $a1, $s0
-/* B54510 800DD370 97A70136 */ lhu $a3, 0x136($sp)
-/* B54514 800DD374 AFA90014 */ sw $t1, 0x14($sp)
-/* B54518 800DD378 AFA90138 */ sw $t1, 0x138($sp)
-/* B5451C 800DD37C AFB00168 */ sw $s0, 0x168($sp)
-/* B54520 800DD380 AFB10164 */ sw $s1, 0x164($sp)
-/* B54524 800DD384 0C03758B */ jal func_800DD62C
-/* B54528 800DD388 AFB90010 */ sw $t9, 0x10($sp)
-/* B5452C 800DD38C 8FAD008C */ lw $t5, 0x8c($sp)
-/* B54530 800DD390 24010003 */ li $at, 3
-/* B54534 800DD394 00409025 */ move $s2, $v0
-/* B54538 800DD398 15A10007 */ bne $t5, $at, .L800DD3B8
-/* B5453C 800DD39C 00402025 */ move $a0, $v0
-/* B54540 800DD3A0 240503C0 */ li $a1, 960
-/* B54544 800DD3A4 240603C0 */ li $a2, 960
-/* B54548 800DD3A8 02803825 */ move $a3, $s4
-/* B5454C 800DD3AC AFA00010 */ sw $zero, 0x10($sp)
-/* B54550 800DD3B0 0C036F79 */ jal AudioSynth_UnkCmd19
-/* B54554 800DD3B4 24520008 */ addiu $s2, $v0, 8
-.L800DD3B8:
-/* B54558 800DD3B8 8FAC008C */ lw $t4, 0x8c($sp)
-/* B5455C 800DD3BC 24010002 */ li $at, 2
-/* B54560 800DD3C0 02402025 */ move $a0, $s2
-/* B54564 800DD3C4 15810005 */ bne $t4, $at, .L800DD3DC
-/* B54568 800DD3C8 240503C0 */ li $a1, 960
-/* B5456C 800DD3CC 240603C0 */ li $a2, 960
-/* B54570 800DD3D0 02803825 */ move $a3, $s4
-/* B54574 800DD3D4 0C036F8E */ jal AudioSynth_UnkCmd3
-/* B54578 800DD3D8 26520008 */ addiu $s2, $s2, 8
-.L800DD3DC:
-/* B5457C 800DD3DC 8FB60164 */ lw $s6, 0x164($sp)
-/* B54580 800DD3E0 02402025 */ move $a0, $s2
-/* B54584 800DD3E4 240603C0 */ li $a2, 960
-/* B54588 800DD3E8 92C50002 */ lbu $a1, 2($s6)
-/* B5458C 800DD3EC 00003825 */ move $a3, $zero
-/* B54590 800DD3F0 268F0020 */ addiu $t7, $s4, 0x20
-/* B54594 800DD3F4 10A00007 */ beqz $a1, .L800DD414
-/* B54598 800DD3F8 28A10010 */ slti $at, $a1, 0x10
-/* B5459C 800DD3FC 10200002 */ beqz $at, .L800DD408
-/* B545A0 800DD400 26520008 */ addiu $s2, $s2, 8
-/* B545A4 800DD404 24050010 */ li $a1, 16
-.L800DD408:
-/* B545A8 800DD408 0C036F6C */ jal AudioSynth_HiLoGain
-/* B545AC 800DD40C AFAF0010 */ sw $t7, 0x10($sp)
-/* B545B0 800DD410 8FB60164 */ lw $s6, 0x164($sp)
-.L800DD414:
-/* B545B4 800DD414 8EC60014 */ lw $a2, 0x14($s6)
-/* B545B8 800DD418 02402025 */ move $a0, $s2
-/* B545BC 800DD41C 02802825 */ move $a1, $s4
-/* B545C0 800DD420 50C0000D */ beql $a2, $zero, .L800DD458
-/* B545C4 800DD424 8FB10168 */ lw $s1, 0x168($sp)
-/* B545C8 800DD428 0C036FA6 */ jal AudioSynth_SetFilterCount
-/* B545CC 800DD42C 26520008 */ addiu $s2, $s2, 8
-/* B545D0 800DD430 8FAE0168 */ lw $t6, 0x168($sp)
-/* B545D4 800DD434 02402025 */ move $a0, $s2
-/* B545D8 800DD438 26520008 */ addiu $s2, $s2, 8
-/* B545DC 800DD43C 8DC7000C */ lw $a3, 0xc($t6)
-/* B545E0 800DD440 8FA50138 */ lw $a1, 0x138($sp)
-/* B545E4 800DD444 240603C0 */ li $a2, 960
-/* B545E8 800DD448 0C036F9D */ jal AudioSynth_SetFilter
-/* B545EC 800DD44C 24E70040 */ addiu $a3, $a3, 0x40
-/* B545F0 800DD450 8FB60164 */ lw $s6, 0x164($sp)
-/* B545F4 800DD454 8FB10168 */ lw $s1, 0x168($sp)
-.L800DD458:
-/* B545F8 800DD458 92D00007 */ lbu $s0, 7($s6)
-/* B545FC 800DD45C 96C3000E */ lhu $v1, 0xe($s6)
-/* B54600 800DD460 8E33000C */ lw $s3, 0xc($s1)
-/* B54604 800DD464 24180001 */ li $t8, 1
-/* B54608 800DD468 0060A825 */ move $s5, $v1
-/* B5460C 800DD46C 12000034 */ beqz $s0, .L800DD540
-/* B54610 800DD470 267300E0 */ addiu $s3, $s3, 0xe0
-/* B54614 800DD474 10600032 */ beqz $v1, .L800DD540
-/* B54618 800DD478 02402025 */ move $a0, $s2
-/* B5461C 800DD47C 240503C0 */ li $a1, 960
-/* B54620 800DD480 24060760 */ li $a2, 1888
-/* B54624 800DD484 02803825 */ move $a3, $s4
-/* B54628 800DD488 0C036F19 */ jal AudioSynth_DMemMove
-/* B5462C 800DD48C 26520008 */ addiu $s2, $s2, 8
-/* B54630 800DD490 8FB80168 */ lw $t8, 0x168($sp)
-/* B54634 800DD494 240F0760 */ li $t7, 1888
-/* B54638 800DD498 01F08823 */ subu $s1, $t7, $s0
-/* B5463C 800DD49C 9319001A */ lbu $t9, 0x1a($t8)
-/* B54640 800DD4A0 02202825 */ move $a1, $s1
-/* B54644 800DD4A4 02402025 */ move $a0, $s2
-/* B54648 800DD4A8 1320000B */ beqz $t9, .L800DD4D8
-/* B5464C 800DD4AC 02003025 */ move $a2, $s0
-/* B54650 800DD4B0 240D0760 */ li $t5, 1888
-/* B54654 800DD4B4 01B08823 */ subu $s1, $t5, $s0
-/* B54658 800DD4B8 02402025 */ move $a0, $s2
-/* B5465C 800DD4BC 26520008 */ addiu $s2, $s2, 8
-/* B54660 800DD4C0 02202825 */ move $a1, $s1
-/* B54664 800DD4C4 0C036EE7 */ jal func_800DBB9C
-/* B54668 800DD4C8 02003025 */ move $a2, $s0
-/* B5466C 800DD4CC 8FAC0168 */ lw $t4, 0x168($sp)
-/* B54670 800DD4D0 10000004 */ b .L800DD4E4
-/* B54674 800DD4D4 A180001A */ sb $zero, 0x1a($t4)
-.L800DD4D8:
-/* B54678 800DD4D8 02603825 */ move $a3, $s3
-/* B5467C 800DD4DC 0C036F44 */ jal func_800DBD10
-/* B54680 800DD4E0 26520008 */ addiu $s2, $s2, 8
-.L800DD4E4:
-/* B54684 800DD4E4 02402025 */ move $a0, $s2
-/* B54688 800DD4E8 02902823 */ subu $a1, $s4, $s0
-/* B5468C 800DD4EC 24A503C0 */ addiu $a1, $a1, 0x3c0
-/* B54690 800DD4F0 26520008 */ addiu $s2, $s2, 8
-/* B54694 800DD4F4 02003025 */ move $a2, $s0
-/* B54698 800DD4F8 0C036F4E */ jal func_800DBD38
-/* B5469C 800DD4FC 02603825 */ move $a3, $s3
-/* B546A0 800DD500 02402025 */ move $a0, $s2
-/* B546A4 800DD504 26520008 */ addiu $s2, $s2, 8
-/* B546A8 800DD508 00142903 */ sra $a1, $s4, 4
-/* B546AC 800DD50C 02A03025 */ move $a2, $s5
-/* B546B0 800DD510 24070760 */ li $a3, 1888
-/* B546B4 800DD514 0C036EF5 */ jal func_800DBBD4
-/* B546B8 800DD518 AFB10010 */ sw $s1, 0x10($sp)
-/* B546BC 800DD51C 02402025 */ move $a0, $s2
-/* B546C0 800DD520 26520008 */ addiu $s2, $s2, 8
-/* B546C4 800DD524 02202825 */ move $a1, $s1
-/* B546C8 800DD528 240603C0 */ li $a2, 960
-/* B546CC 800DD52C 0C036F19 */ jal AudioSynth_DMemMove
-/* B546D0 800DD530 02803825 */ move $a3, $s4
-/* B546D4 800DD534 8FB10168 */ lw $s1, 0x168($sp)
-/* B546D8 800DD538 10000002 */ b .L800DD544
-/* B546DC 800DD53C 8FB60164 */ lw $s6, 0x164($sp)
-.L800DD540:
-/* B546E0 800DD540 A238001A */ sb $t8, 0x1a($s1)
-.L800DD544:
-/* B546E4 800DD544 92D90003 */ lbu $t9, 3($s6)
-/* B546E8 800DD548 02402025 */ move $a0, $s2
-/* B546EC 800DD54C 02C02825 */ move $a1, $s6
-/* B546F0 800DD550 17200004 */ bnez $t9, .L800DD564
-/* B546F4 800DD554 02203025 */ move $a2, $s1
-/* B546F8 800DD558 922D0002 */ lbu $t5, 2($s1)
-/* B546FC 800DD55C 51A00004 */ beql $t5, $zero, .L800DD570
-/* B54700 800DD560 92CC0004 */ lbu $t4, 4($s6)
-.L800DD564:
-/* B54704 800DD564 1000000A */ b .L800DD590
-/* B54708 800DD568 24100001 */ li $s0, 1
-/* B5470C 800DD56C 92CC0004 */ lbu $t4, 4($s6)
-.L800DD570:
-/* B54710 800DD570 15800005 */ bnez $t4, .L800DD588
-/* B54714 800DD574 00000000 */ nop
-/* B54718 800DD578 922F0003 */ lbu $t7, 3($s1)
-/* B5471C 800DD57C 00008025 */ move $s0, $zero
-/* B54720 800DD580 11E00003 */ beqz $t7, .L800DD590
-/* B54724 800DD584 00000000 */ nop
-.L800DD588:
-/* B54728 800DD588 10000001 */ b .L800DD590
-/* B5472C 800DD58C 24100002 */ li $s0, 2
-.L800DD590:
-/* B54730 800DD590 8FB80138 */ lw $t8, 0x138($sp)
-/* B54734 800DD594 240E03C0 */ li $t6, 960
-/* B54738 800DD598 AFAE0010 */ sw $t6, 0x10($sp)
-/* B5473C 800DD59C 8FA70170 */ lw $a3, 0x170($sp)
-/* B54740 800DD5A0 AFB00014 */ sw $s0, 0x14($sp)
-/* B54744 800DD5A4 0C0375B3 */ jal func_800DD6CC
-/* B54748 800DD5A8 AFB80018 */ sw $t8, 0x18($sp)
-/* B5474C 800DD5AC 8FB90164 */ lw $t9, 0x164($sp)
-/* B54750 800DD5B0 8FAF0138 */ lw $t7, 0x138($sp)
-/* B54754 800DD5B4 00409025 */ move $s2, $v0
-/* B54758 800DD5B8 972D0000 */ lhu $t5, ($t9)
-/* B5475C 800DD5BC 02402025 */ move $a0, $s2
-/* B54760 800DD5C0 02803825 */ move $a3, $s4
-/* B54764 800DD5C4 31AC0001 */ andi $t4, $t5, 1
-/* B54768 800DD5C8 1180000B */ beqz $t4, .L800DD5F8
-/* B5476C 800DD5CC 31EE0001 */ andi $t6, $t7, 1
-/* B54770 800DD5D0 55C00003 */ bnezl $t6, .L800DD5E0
-/* B54774 800DD5D4 8FB80138 */ lw $t8, 0x138($sp)
-/* B54778 800DD5D8 AFA00138 */ sw $zero, 0x138($sp)
-/* B5477C 800DD5DC 8FB80138 */ lw $t8, 0x138($sp)
-.L800DD5E0:
-/* B54780 800DD5E0 8FA50164 */ lw $a1, 0x164($sp)
-/* B54784 800DD5E4 8FA60168 */ lw $a2, 0x168($sp)
-/* B54788 800DD5E8 AFB00014 */ sw $s0, 0x14($sp)
-/* B5478C 800DD5EC 0C0376D9 */ jal func_800DDB64
-/* B54790 800DD5F0 AFB80010 */ sw $t8, 0x10($sp)
-/* B54794 800DD5F4 00409025 */ move $s2, $v0
-.L800DD5F8:
-/* B54798 800DD5F8 02401025 */ move $v0, $s2
-.L800DD5FC:
-/* B5479C 800DD5FC 8FBF004C */ lw $ra, 0x4c($sp)
-/* B547A0 800DD600 8FB00028 */ lw $s0, 0x28($sp)
-/* B547A4 800DD604 8FB1002C */ lw $s1, 0x2c($sp)
-/* B547A8 800DD608 8FB20030 */ lw $s2, 0x30($sp)
-/* B547AC 800DD60C 8FB30034 */ lw $s3, 0x34($sp)
-/* B547B0 800DD610 8FB40038 */ lw $s4, 0x38($sp)
-/* B547B4 800DD614 8FB5003C */ lw $s5, 0x3c($sp)
-/* B547B8 800DD618 8FB60040 */ lw $s6, 0x40($sp)
-/* B547BC 800DD61C 8FB70044 */ lw $s7, 0x44($sp)
-/* B547C0 800DD620 8FBE0048 */ lw $fp, 0x48($sp)
-/* B547C4 800DD624 03E00008 */ jr $ra
-/* B547C8 800DD628 27BD0160 */ addiu $sp, $sp, 0x160
-
diff --git a/asm/non_matchings/code/audio_synthesis/func_800DDB64.s b/asm/non_matchings/code/audio_synthesis/func_800DDB64.s
deleted file mode 100644
index c8bf3bf59..000000000
--- a/asm/non_matchings/code/audio_synthesis/func_800DDB64.s
+++ /dev/null
@@ -1,189 +0,0 @@
-glabel func_800DDB64
-/* B54D04 800DDB64 8FAE0014 */ lw $t6, 0x14($sp)
-/* B54D08 800DDB68 24090001 */ li $t1, 1
-/* B54D0C 800DDB6C 24010002 */ li $at, 2
-/* B54D10 800DDB70 11C90005 */ beq $t6, $t1, .L800DDB88
-/* B54D14 800DDB74 24080940 */ li $t0, 2368
-/* B54D18 800DDB78 11C10008 */ beq $t6, $at, .L800DDB9C
-/* B54D1C 800DDB7C 24080AE0 */ li $t0, 2784
-/* B54D20 800DDB80 03E00008 */ jr $ra
-/* B54D24 800DDB84 00801025 */ move $v0, $a0
-
-.L800DDB88:
-/* B54D28 800DDB88 90A30003 */ lbu $v1, 3($a1)
-/* B54D2C 800DDB8C 90C20002 */ lbu $v0, 2($a2)
-/* B54D30 800DDB90 A0C00003 */ sb $zero, 3($a2)
-/* B54D34 800DDB94 10000008 */ b .L800DDBB8
-/* B54D38 800DDB98 A0C30002 */ sb $v1, 2($a2)
-.L800DDB9C:
-/* B54D3C 800DDB9C 90A30004 */ lbu $v1, 4($a1)
-/* B54D40 800DDBA0 90C20003 */ lbu $v0, 3($a2)
-/* B54D44 800DDBA4 A0C00002 */ sb $zero, 2($a2)
-/* B54D48 800DDBA8 10000003 */ b .L800DDBB8
-/* B54D4C 800DDBAC A0C30003 */ sb $v1, 3($a2)
-/* B54D50 800DDBB0 03E00008 */ jr $ra
-/* B54D54 800DDBB4 00801025 */ move $v0, $a0
-
-.L800DDBB8:
-/* B54D58 800DDBB8 8FAF0010 */ lw $t7, 0x10($sp)
-/* B54D5C 800DDBBC 3C180200 */ lui $t8, (0x020005C0 >> 16) # lui $t8, 0x200
-/* B54D60 800DDBC0 3C0103C0 */ lui $at, 0x3c0
-/* B54D64 800DDBC4 11E9005D */ beq $t7, $t1, .L800DDD3C
-/* B54D68 800DDBC8 371805C0 */ ori $t8, (0x020005C0 & 0xFFFF) # ori $t8, $t8, 0x5c0
-/* B54D6C 800DDBCC 00404825 */ move $t1, $v0
-/* B54D70 800DDBD0 1043002B */ beq $v0, $v1, .L800DDC80
-/* B54D74 800DDBD4 00602825 */ move $a1, $v1
-/* B54D78 800DDBD8 00E51021 */ addu $v0, $a3, $a1
-/* B54D7C 800DDBDC 00495023 */ subu $t2, $v0, $t1
-/* B54D80 800DDBE0 3159FFFF */ andi $t9, $t2, 0xffff
-/* B54D84 800DDBE4 3C0103C0 */ lui $at, 0x3c0
-/* B54D88 800DDBE8 03216825 */ or $t5, $t9, $at
-/* B54D8C 800DDBEC 3C180800 */ lui $t8, (0x080005C0 >> 16) # lui $t8, 0x800
-/* B54D90 800DDBF0 000773C0 */ sll $t6, $a3, 0xf
-/* B54D94 800DDBF4 371805C0 */ ori $t8, (0x080005C0 & 0xFFFF) # ori $t8, $t8, 0x5c0
-/* B54D98 800DDBF8 00805825 */ move $t3, $a0
-/* B54D9C 800DDBFC AD780000 */ sw $t8, ($t3)
-/* B54DA0 800DDC00 AD6D0004 */ sw $t5, 4($t3)
-/* B54DA4 800DDC04 2559FFFE */ addiu $t9, $t2, -2
-/* B54DA8 800DDC08 24840008 */ addiu $a0, $a0, 8
-/* B54DAC 800DDC0C 00806025 */ move $t4, $a0
-/* B54DB0 800DDC10 AD800004 */ sw $zero, 4($t4)
-/* B54DB4 800DDC14 24840008 */ addiu $a0, $a0, 8
-/* B54DB8 800DDC18 05C10003 */ bgez $t6, .L800DDC28
-/* B54DBC 800DDC1C 000E7843 */ sra $t7, $t6, 1
-/* B54DC0 800DDC20 25C10001 */ addiu $at, $t6, 1
-/* B54DC4 800DDC24 00017843 */ sra $t7, $at, 1
-.L800DDC28:
-/* B54DC8 800DDC28 25F8FFFF */ addiu $t8, $t7, -1
-/* B54DCC 800DDC2C 07210003 */ bgez $t9, .L800DDC3C
-/* B54DD0 800DDC30 00196843 */ sra $t5, $t9, 1
-/* B54DD4 800DDC34 27210001 */ addiu $at, $t9, 1
-/* B54DD8 800DDC38 00016843 */ sra $t5, $at, 1
-.L800DDC3C:
-/* B54DDC 800DDC3C 030D001A */ div $zero, $t8, $t5
-/* B54DE0 800DDC40 15A00002 */ bnez $t5, .L800DDC4C
-/* B54DE4 800DDC44 00000000 */ nop
-/* B54DE8 800DDC48 0007000D */ break 7
-.L800DDC4C:
-/* B54DEC 800DDC4C 2401FFFF */ li $at, -1
-/* B54DF0 800DDC50 15A10004 */ bne $t5, $at, .L800DDC64
-/* B54DF4 800DDC54 3C018000 */ lui $at, 0x8000
-/* B54DF8 800DDC58 17010002 */ bne $t8, $at, .L800DDC64
-/* B54DFC 800DDC5C 00000000 */ nop
-/* B54E00 800DDC60 0006000D */ break 6
-.L800DDC64:
-/* B54E04 800DDC64 00007012 */ mflo $t6
-/* B54E08 800DDC68 31CFFFFF */ andi $t7, $t6, 0xffff
-/* B54E0C 800DDC6C 31F9FFFF */ andi $t9, $t7, 0xffff
-/* B54E10 800DDC70 3C010600 */ lui $at, 0x600
-/* B54E14 800DDC74 0321C025 */ or $t8, $t9, $at
-/* B54E18 800DDC78 1000000B */ b .L800DDCA8
-/* B54E1C 800DDC7C AD980000 */ sw $t8, ($t4)
-.L800DDC80:
-/* B54E20 800DDC80 00805025 */ move $t2, $a0
-/* B54E24 800DDC84 3C0D0A00 */ lui $t5, (0x0A0005C0 >> 16) # lui $t5, 0xa00
-/* B54E28 800DDC88 30EEFFFF */ andi $t6, $a3, 0xffff
-/* B54E2C 800DDC8C 3C0103C0 */ lui $at, 0x3c0
-/* B54E30 800DDC90 01C17825 */ or $t7, $t6, $at
-/* B54E34 800DDC94 35AD05C0 */ ori $t5, (0x0A0005C0 & 0xFFFF) # ori $t5, $t5, 0x5c0
-/* B54E38 800DDC98 AD4D0000 */ sw $t5, ($t2)
-/* B54E3C 800DDC9C AD4F0004 */ sw $t7, 4($t2)
-/* B54E40 800DDCA0 24840008 */ addiu $a0, $a0, 8
-/* B54E44 800DDCA4 00E51021 */ addu $v0, $a3, $a1
-.L800DDCA8:
-/* B54E48 800DDCA8 1120001B */ beqz $t1, .L800DDD18
-/* B54E4C 800DDCAC 3C180A00 */ lui $t8, 0xa00
-/* B54E50 800DDCB0 2539000F */ addiu $t9, $t1, 0xf
-/* B54E54 800DDCB4 3338FFF0 */ andi $t8, $t9, 0xfff0
-/* B54E58 800DDCB8 00186903 */ sra $t5, $t8, 4
-/* B54E5C 800DDCBC 31AE00FF */ andi $t6, $t5, 0xff
-/* B54E60 800DDCC0 000E7C00 */ sll $t7, $t6, 0x10
-/* B54E64 800DDCC4 3C011400 */ lui $at, 0x1400
-/* B54E68 800DDCC8 01E1C825 */ or $t9, $t7, $at
-/* B54E6C 800DDCCC 373805C0 */ ori $t8, $t9, 0x5c0
-/* B54E70 800DDCD0 00805025 */ move $t2, $a0
-/* B54E74 800DDCD4 AD580000 */ sw $t8, ($t2)
-/* B54E78 800DDCD8 8CCD000C */ lw $t5, 0xc($a2)
-/* B54E7C 800DDCDC 24840008 */ addiu $a0, $a0, 8
-/* B54E80 800DDCE0 3C0F0A00 */ lui $t7, (0x0A0003C0 >> 16) # lui $t7, 0xa00
-/* B54E84 800DDCE4 25AE00A0 */ addiu $t6, $t5, 0xa0
-/* B54E88 800DDCE8 AD4E0004 */ sw $t6, 4($t2)
-/* B54E8C 800DDCEC 35EF03C0 */ ori $t7, (0x0A0003C0 & 0xFFFF) # ori $t7, $t7, 0x3c0
-/* B54E90 800DDCF0 00805825 */ move $t3, $a0
-/* B54E94 800DDCF4 AD6F0000 */ sw $t7, ($t3)
-/* B54E98 800DDCF8 00497023 */ subu $t6, $v0, $t1
-/* B54E9C 800DDCFC 253805C0 */ addiu $t8, $t1, 0x5c0
-/* B54EA0 800DDD00 00186C00 */ sll $t5, $t8, 0x10
-/* B54EA4 800DDD04 31CFFFFF */ andi $t7, $t6, 0xffff
-/* B54EA8 800DDD08 01AFC825 */ or $t9, $t5, $t7
-/* B54EAC 800DDD0C AD790004 */ sw $t9, 4($t3)
-/* B54EB0 800DDD10 10000020 */ b .L800DDD94
-/* B54EB4 800DDD14 24840008 */ addiu $a0, $a0, 8
-.L800DDD18:
-/* B54EB8 800DDD18 00804825 */ move $t1, $a0
-/* B54EBC 800DDD1C 304EFFFF */ andi $t6, $v0, 0xffff
-/* B54EC0 800DDD20 3C0105C0 */ lui $at, 0x5c0
-/* B54EC4 800DDD24 01C16825 */ or $t5, $t6, $at
-/* B54EC8 800DDD28 371803C0 */ ori $t8, $t8, 0x3c0
-/* B54ECC 800DDD2C AD380000 */ sw $t8, ($t1)
-/* B54ED0 800DDD30 AD2D0004 */ sw $t5, 4($t1)
-/* B54ED4 800DDD34 10000017 */ b .L800DDD94
-/* B54ED8 800DDD38 24840008 */ addiu $a0, $a0, 8
-.L800DDD3C:
-/* B54EDC 800DDD3C 00804825 */ move $t1, $a0
-/* B54EE0 800DDD40 3C0F0A00 */ lui $t7, (0x0A0005C0 >> 16) # lui $t7, 0xa00
-/* B54EE4 800DDD44 30E2FFFF */ andi $v0, $a3, 0xffff
-/* B54EE8 800DDD48 0041C825 */ or $t9, $v0, $at
-/* B54EEC 800DDD4C 35EF05C0 */ ori $t7, (0x0A0005C0 & 0xFFFF) # ori $t7, $t7, 0x5c0
-/* B54EF0 800DDD50 24840008 */ addiu $a0, $a0, 8
-/* B54EF4 800DDD54 AD2F0000 */ sw $t7, ($t1)
-/* B54EF8 800DDD58 AD390004 */ sw $t9, 4($t1)
-/* B54EFC 800DDD5C 00805025 */ move $t2, $a0
-/* B54F00 800DDD60 24840008 */ addiu $a0, $a0, 8
-/* B54F04 800DDD64 AD580000 */ sw $t8, ($t2)
-/* B54F08 800DDD68 00805825 */ move $t3, $a0
-/* B54F0C 800DDD6C 246F05C0 */ addiu $t7, $v1, 0x5c0
-/* B54F10 800DDD70 AD430004 */ sw $v1, 4($t2)
-/* B54F14 800DDD74 000FCC00 */ sll $t9, $t7, 0x10
-/* B54F18 800DDD78 3C0E0A00 */ lui $t6, (0x0A0003C0 >> 16) # lui $t6, 0xa00
-/* B54F1C 800DDD7C 35CE03C0 */ ori $t6, (0x0A0003C0 & 0xFFFF) # ori $t6, $t6, 0x3c0
-/* B54F20 800DDD80 0322C025 */ or $t8, $t9, $v0
-/* B54F24 800DDD84 AD780004 */ sw $t8, 4($t3)
-/* B54F28 800DDD88 AD6E0000 */ sw $t6, ($t3)
-/* B54F2C 800DDD8C 24840008 */ addiu $a0, $a0, 8
-/* B54F30 800DDD90 00602825 */ move $a1, $v1
-.L800DDD94:
-/* B54F34 800DDD94 10600010 */ beqz $v1, .L800DDDD8
-/* B54F38 800DDD98 00801025 */ move $v0, $a0
-/* B54F3C 800DDD9C 24AE000F */ addiu $t6, $a1, 0xf
-/* B54F40 800DDDA0 31CDFFF0 */ andi $t5, $t6, 0xfff0
-/* B54F44 800DDDA4 000D7903 */ sra $t7, $t5, 4
-/* B54F48 800DDDA8 31F900FF */ andi $t9, $t7, 0xff
-/* B54F4C 800DDDAC 0019C400 */ sll $t8, $t9, 0x10
-/* B54F50 800DDDB0 24ED05C0 */ addiu $t5, $a3, 0x5c0
-/* B54F54 800DDDB4 3C011500 */ lui $at, 0x1500
-/* B54F58 800DDDB8 03017025 */ or $t6, $t8, $at
-/* B54F5C 800DDDBC 31AFFFFF */ andi $t7, $t5, 0xffff
-/* B54F60 800DDDC0 01CFC825 */ or $t9, $t6, $t7
-/* B54F64 800DDDC4 AC590000 */ sw $t9, ($v0)
-/* B54F68 800DDDC8 8CD8000C */ lw $t8, 0xc($a2)
-/* B54F6C 800DDDCC 24840008 */ addiu $a0, $a0, 8
-/* B54F70 800DDDD0 270D00A0 */ addiu $t5, $t8, 0xa0
-/* B54F74 800DDDD4 AC4D0004 */ sw $t5, 4($v0)
-.L800DDDD8:
-/* B54F78 800DDDD8 24EE003F */ addiu $t6, $a3, 0x3f
-/* B54F7C 800DDDDC 31CFFFC0 */ andi $t7, $t6, 0xffc0
-/* B54F80 800DDDE0 000FC903 */ sra $t9, $t7, 4
-/* B54F84 800DDDE4 333800FF */ andi $t8, $t9, 0xff
-/* B54F88 800DDDE8 00186C00 */ sll $t5, $t8, 0x10
-/* B54F8C 800DDDEC 3C010400 */ lui $at, 0x400
-/* B54F90 800DDDF0 01A17025 */ or $t6, $t5, $at
-/* B54F94 800DDDF4 3C0105C0 */ lui $at, 0x5c0
-/* B54F98 800DDDF8 3119FFFF */ andi $t9, $t0, 0xffff
-/* B54F9C 800DDDFC 0321C025 */ or $t8, $t9, $at
-/* B54FA0 800DDE00 35CF7FFF */ ori $t7, $t6, 0x7fff
-/* B54FA4 800DDE04 AC8F0000 */ sw $t7, ($a0)
-/* B54FA8 800DDE08 AC980004 */ sw $t8, 4($a0)
-/* B54FAC 800DDE0C 24820008 */ addiu $v0, $a0, 8
-/* B54FB0 800DDE10 03E00008 */ jr $ra
-/* B54FB4 800DDE14 00000000 */ nop \ No newline at end of file
diff --git a/asm/non_matchings/code/audio_synthesis/pad_800DACB0.s b/asm/non_matchings/code/ucode_disas/pad_800DACB0.s
index 9998efcca..9998efcca 100644
--- a/asm/non_matchings/code/audio_synthesis/pad_800DACB0.s
+++ b/asm/non_matchings/code/ucode_disas/pad_800DACB0.s
diff --git a/include/functions.h b/include/functions.h
index e53a5a98b..b00e402a1 100644
--- a/include/functions.h
+++ b/include/functions.h
@@ -1891,51 +1891,7 @@ void UCodeDisas_Destroy(UCodeDisas*);
void UCodeDisas_Disassemble(UCodeDisas*, Gfx*);
void UCodeDisas_RegisterUCode(UCodeDisas*, s32, UCodeInfo*);
void UCodeDisas_SetCurUCode(UCodeDisas*, void*);
-// ? func_800DACC0(?);
-// ? func_800DB03C(?);
Acmd* AudioSynth_Update(Acmd* cmdStart, s32* cmdCnt, s16* aiStart, s32 aiBufLen);
-// ? func_800DB2C0(?);
-// ? func_800DB330(?);
-// ? func_800DB3D8(?);
-// ? func_800DB480(?);
-// ? func_800DB4E4(?);
-// ? func_800DB680(?);
-// ? func_800DB828(?);
-// ? func_800DBA40(?);
-// ? func_800DBAE8(?);
-// ? func_800DBB9C(?);
-// ? func_800DBBD4(?);
-// ? AudioSynth_SetBuffer(?);
-// ? AudioSynth_DMemMove(?);
-// ? AudioSynth_InterL(?);
-// ? func_800DBCD4(?);
-// ? func_800DBD10(?);
-// ? AudioSynth_SaveBuffer(?);
-// ? AudioSynth_EnvSetup2(?);
-// ? AudioSynth_UnkCmd17(?);
-// ? AudioSynth_HiLoGain(?);
-// ? AudioSynth_UnkCmd19(?);
-// ? AudioSynth_UnkCmd3(?);
-// ? AudioSynth_SetFilter(?);
-// ? AudioSynth_SetFilterCount(?);
-// ? func_800DBEB0(?);
-// ? func_800DBF5C(?);
-// ? AudioSynth_LoadRingBuffer(?);
-// ? AudioSynth_SaveRingBuffer(?);
-// ? AudioSynth_SaveBuffer(?);
-// ? func_800DC124(?);
-// ? func_800DC164(?);
-// ? func_800DC1D8(?);
-// ? func_800DC2DC(?);
-// ? func_800DC384(?);
-// ? func_800DC910(?);
-// ? func_800DD62C(?);
-// ? func_800DD6CC(?);
-// ? func_800DD9F4(?);
-// ? func_800DDB64(?);
-f32 func_800DDE20(f32 arg0);
-void func_800DDE3C(void);
-void Audio_ResetLoadStatus(void);
void Audio_DiscardBank(s32 bankId);
void Audio_DiscardSequence(s32 seqId);
void func_800DE238(void* mem, u32 size);
@@ -1980,7 +1936,7 @@ void func_800E0E90(s32 id);
void func_800E0EB4(s32 arg0, s32 id);
void func_800E1148(void);
void func_800E11F0(void);
-s32 func_800E12DC(s32 arg0, s32 arg1, s32 arg2, u8* arg3, s32 arg4);
+void* Audio_DmaSampleData(u32 arg0, s32 arg1, s32 arg2, u8* arg3, s32 arg4);
void func_800E1618(s32 arg0);
s32 Audio_IsBankLoadComplete(s32 bankId);
s32 Audio_IsSeqLoadComplete(s32 seqId);
@@ -1993,8 +1949,8 @@ void Audio_AudioTableAsyncLoad(s32 arg0, s32 arg1, s32 arg2, OSMesgQueue* arg3);
void Audio_AudioBankAsyncLoad(s32 arg0, s32 arg1, s32 arg2, OSMesgQueue* arg3);
u8* func_800E1F38(s32 arg0, u32* arg1);
void func_800E1F7C(s32 arg0);
-s32 func_800E20D4(s32 playerIdx, s32 seqId, s32 arg2);
-s32 func_800E2124(s32 playerIdx, s32 seqId, s32 arg2);
+s32 func_800E20D4(s32 playerIndex, s32 seqId, s32 arg2);
+s32 func_800E2124(s32 playerIndex, s32 seqId, s32 arg2);
void Audio_ProcessLoads(s32 resetStatus);
void func_800E301C(void* callback);
void Audio_ContextInit(void* heap, u32 heapSize);
@@ -2023,7 +1979,7 @@ void Audio_InitMesgQueues(void);
void Audio_osInvalDCache(void* buf, s32 size);
void Audio_osWritebackDCache(void* mem, s32 size);
s32 osAiSetNextBuffer(void*, u32);
-void Audio_NoteSetVelPanReverb(Note* note, NoteSubEu* sub, Reverb* reverb);
+void Audio_InitNoteSub(Note* note, NoteSubEu* sub, NoteSubAttributes* attrs);
void Audio_NoteSetResamplingRate(NoteSubEu* noteSubEu, f32 resamplingRateInput);
void Audio_NoteInit(Note* note);
void Audio_NoteDisable(Note* note);
diff --git a/include/macros.h b/include/macros.h
index 0b008d10f..ca85e7902 100644
--- a/include/macros.h
+++ b/include/macros.h
@@ -10,6 +10,7 @@
#define ALIGN16(val) (((val) + 0xF) & ~0xF)
#define ALIGN32(val) (((val) + 0x1F) & ~0x1F)
+#define ALIGN64(val) (((val) + 0x3F) & ~0x3F)
#define ALIGN256(val) (((val) + 0xFF) & ~0xFF)
#define SQ(x) ((x)*(x))
diff --git a/include/ultra64/abi.h b/include/ultra64/abi.h
index dabbf26d6..c3652c487 100644
--- a/include/ultra64/abi.h
+++ b/include/ultra64/abi.h
@@ -43,7 +43,7 @@
#define A_LOADBUFF 20
#define A_SAVEBUFF 21
#define A_ENVSETUP2 22
-#define A_UNK17 23
+#define A_S8DEC 23
#define A_UNK19 25
#define ACMD_SIZE 32
@@ -323,11 +323,11 @@ typedef short ENVMIX_STATE[40];
_a->words.w1 = _SHIFTL(a3, 16, 16) | _SHIFTL(a4, 0, 16); \
}
-#define aUnkCmd17(pkt, a1, a2) \
+#define aS8Dec(pkt, a1, a2) \
{ \
Acmd *_a = (Acmd *)pkt; \
\
- _a->words.w0 = _SHIFTL(A_UNK17, 24, 8) | _SHIFTL(a1, 16, 8); \
+ _a->words.w0 = _SHIFTL(A_S8DEC, 24, 8) | _SHIFTL(a1, 16, 8); \
_a->words.w1 = (unsigned int)(a2); \
}
@@ -339,45 +339,23 @@ typedef short ENVMIX_STATE[40];
_a->words.w1 = (unsigned int)(c); \
}
-/*
-#define aEnvMixer(pkt, f, s) \
-{ \
- Acmd *_a = (Acmd *)pkt; \
- \
- _a->words.w0 = _SHIFTL(A_ENVMIXER, 24, 8) | _SHIFTL(f, 16, 8); \
- _a->words.w1 = (unsigned int)(s); \
-}
-*/
-
-extern u32 D_801304A0;
-
-#define aEnvMixer(pkt, dmemi, count, swapLR, x0, x1, x2, x3, m) \
+#define aEnvMixer(pkt, dmemi, count, swapLR, x0, x1, x2, x3, m, bits) \
{ \
Acmd *_a = (Acmd *)pkt; \
\
- _a->words.w0 = (D_801304A0 | _SHIFTL(dmemi >> 4, 16, 8) | \
+ _a->words.w0 = (bits | _SHIFTL(dmemi >> 4, 16, 8) | \
_SHIFTL(count, 8, 8) | _SHIFTL(swapLR, 4, 1) | \
_SHIFTL(x0, 3, 1) | _SHIFTL(x1, 2, 1) | \
_SHIFTL(x2, 1, 1) | _SHIFTL(x3, 0, 1)); \
_a->words.w1 = (unsigned int)(m); \
}
-/*
-#define aInterleave(pkt, l, r) \
-{ \
- Acmd *_a = (Acmd *)pkt; \
- \
- _a->words.w0 = _SHIFTL(A_INTERLEAVE, 24, 8); \
- _a->words.w1 = _SHIFTL(l, 16, 16) | _SHIFTL(r, 0, 16); \
-}
-*/
-
-#define aInterleave(pkt, count, d, l, r) \
+#define aInterleave(pkt, o, l, r, c) \
{ \
Acmd *_a = (Acmd *)pkt; \
\
_a->words.w0 = (_SHIFTL(A_INTERLEAVE, 24, 8) | \
- _SHIFTL(count >> 4, 16, 8) | _SHIFTL(d, 0, 16)); \
+ _SHIFTL(c >> 4, 16, 8) | _SHIFTL(o, 0, 16)); \
_a->words.w1 = _SHIFTL(l, 16, 16) | _SHIFTL(r, 0, 16); \
}
@@ -390,16 +368,6 @@ extern u32 D_801304A0;
_a->words.w1 = _SHIFTL(dmemi, 16, 16) | _SHIFTL(dmemo, 0, 16); \
}
-/*
-#define aLoadBuffer(pkt, s) \
-{ \
- Acmd *_a = (Acmd *)pkt; \
- \
- _a->words.w0 = _SHIFTL(A_LOADBUFF, 24, 8); \
- _a->words.w1 = (unsigned int)(s); \
-}
-*/
-
#define aLoadBuffer(pkt, s, d, c) \
{ \
Acmd *_a = (Acmd *)pkt; \
@@ -436,16 +404,6 @@ extern u32 D_801304A0;
_a->words.w1 = (unsigned int)(s); \
}
-/*
-#define aSaveBuffer(pkt, s) \
-{ \
- Acmd *_a = (Acmd *)pkt; \
- \
- _a->words.w0 = _SHIFTL(A_SAVEBUFF, 24, 8); \
- _a->words.w1 = (unsigned int)(s); \
-}
-*/
-
#define aSaveBuffer(pkt, s, d, c) \
{ \
Acmd *_a = (Acmd *)pkt; \
@@ -561,7 +519,7 @@ extern u32 D_801304A0;
_a->words.w1 = _SHIFTL(dmemi, 16, 16) | _SHIFTL(dmemo, 0, 16); \
}
-#define aResampleZOH(pkt, pitch, pitchAccu) \
+#define aResampleZoh(pkt, pitch, pitchAccu) \
{ \
Acmd *_a = (Acmd *)pkt; \
\
diff --git a/include/z64audio.h b/include/z64audio.h
index aab78500b..1b9ad9cab 100644
--- a/include/z64audio.h
+++ b/include/z64audio.h
@@ -5,7 +5,7 @@
/**
* Structs in this repository have primarily been imported from the SM64 Decompilation.
- * Many struct members are wrong; the symbol '?' next to an offset means the member is a guess.
+ * Some struct members may be wrong; the symbol '?' next to an offset means the member is a guess.
*/
#define NO_LAYER ((SequenceChannelLayer*)(-1))
@@ -32,6 +32,9 @@
#define AIBUF_LEN 0xB00
+#define CODEC_ADPCM 0
+#define CODEC_S8 1
+
struct Note;
struct NotePool;
struct SequenceChannel;
@@ -73,38 +76,33 @@ typedef struct {
} Portamento; // size = 0xC
typedef struct {
- /*?0x0 */ s16 delay;
- /*?0x2 */ s16 arg;
-} AdsrEnvelope; // size = 0x4?
+ /* 0x0 */ s16 delay;
+ /* 0x2 */ s16 arg;
+} AdsrEnvelope; // size = 0x4
typedef struct {
- /*?0x00 */ u32 start;
+ /* 0x00 */ u32 start;
/* 0x04 */ u32 end;
- /*?0x08 */ u32 count;
- /*?0x0C */ char unk_0C[0x4];
- /*?0x10 */ s16 state[16]; // only exists if count != 0. 8-byte aligned
-} AdpcmLoop; // size = 0x30
+ /* 0x08 */ u32 count;
+ /* 0x0C */ char unk_0C[0x4];
+ /* 0x10 */ s16 state[16]; // only exists if count != 0. 8-byte aligned
+} AdpcmLoop; // size = 0x30 (or 0x10)
typedef struct {
- /*?0x00 */ s32 order;
- /*?0x04 */ s32 npredictors;
- /*?0x08 */ s16 book[1]; // size 8 * order * npredictors. 8-byte aligned
-} AdpcmBook;
+ /* 0x00 */ s32 order;
+ /* 0x04 */ s32 npredictors;
+ /* 0x08 */ s16 book[1]; // size 8 * order * npredictors. 8-byte aligned
+} AdpcmBook; // size >= 0x8
typedef struct {
- union{
- struct {
- /* 0x00 */ u32 bits4 : 4;
- /* 0x00 */ u32 bits2 : 2;
- /* 0x00 */ u32 unk_bits26 : 1;
- /* 0x00 */ u32 unk_bits25 : 1;
- /* 0x01 */ u32 size : 24;
- };
- u32 bits;
- };
+ /* 0x00 */ u32 codec : 4;
+ /* 0x00 */ u32 medium : 2;
+ /* 0x00 */ u32 unk_bits26 : 1;
+ /* 0x00 */ u32 unk_bits25 : 1;
+ /* 0x01 */ u32 size : 24;
/* 0x04 */ u8* sampleAddr;
/* 0x08 */ AdpcmLoop* loop;
- /*?0x0C */ AdpcmBook* book;
+ /* 0x0C */ AdpcmBook* book;
} AudioBankSample; // size = 0x10
typedef struct {
@@ -113,17 +111,16 @@ typedef struct {
} AudioBankSound; // size = 0x8
typedef struct {
- /*?0x00 */ s16 numSamplesAfterDownsampling;
- /*?0x02 */ s16 chunkLen; // never read
+ /* 0x00 */ s16 numSamplesAfterDownsampling; // never read
+ /* 0x02 */ s16 chunkLen; // never read
/* 0x04 */ s16* toDownsampleLeft;
/* 0x08 */ s16* toDownsampleRight; // data pointed to by left and right are adjacent in memory
- /*?0x0C */ s32 startPos; // start pos in ring buffer
- /*?0x10 */ s16 lengthA; // first length in ring buffer (from startPos, at most until end)
- /*?0x12 */ s16 lengthB; // second length in ring buffer (from pos 0)
+ /* 0x0C */ s32 startPos; // start pos in ring buffer
+ /* 0x10 */ s16 lengthA; // first length in ring buffer (from startPos, at most until end)
+ /* 0x12 */ s16 lengthB; // second length in ring buffer (from pos 0)
/* 0x14 */ u16 unk_14;
/* 0x16 */ u16 unk_16;
/* 0x18 */ u16 unk_18;
- /* 0x1A */ char unk_1A[2];
} ReverbRingBufferItem; // size = 0x1C
typedef struct {
@@ -138,11 +135,10 @@ typedef struct {
/* 0x00A */ s16 unk_0A;
/* 0x00C */ u16 unk_0C;
/* 0x00E */ u16 unk_0E;
- /* 0x010 */ s16 unk_10;
- /* 0x012 */ s16 unk_12;
+ /* 0x010 */ s16 leakRtl;
+ /* 0x012 */ s16 leakLtr;
/* 0x014 */ u16 unk_14;
/* 0x016 */ s16 unk_16;
-
/* 0x018 */ u8 unk_18;
/* 0x019 */ u8 unk_19;
/* 0x01A */ u8 unk_1A;
@@ -156,20 +152,19 @@ typedef struct {
/* 0x034 */ void* unk_34;
/* 0x038 */ void* unk_38;
/* 0x03C */ void* unk_3C;
-
/* 0x040 */ ReverbRingBufferItem items[2][5];
- /*?0x158 */ ReverbRingBufferItem items2[2][5];
- /* 0x270 */ s16* unk_270;
- /* 0x274 */ s16* unk_274;
- /* 0x278 */ void* unk_278;
- /* 0x27C */ void* unk_27C;
+ /* 0x158 */ ReverbRingBufferItem items2[2][5];
+ /* 0x270 */ s16* filterLeft;
+ /* 0x274 */ s16* filterRight;
+ /* 0x278 */ s16* filterLeftState;
+ /* 0x27C */ s16* filterRightState;
/* 0x280 */ AudioBankSound sound;
/* 0x288 */ AudioBankSample sample;
/* 0x298 */ AdpcmLoop loop;
} SynthesisReverb; // size = 0x2C8
typedef struct {
- /*?0x00 */ u8 loaded;
+ /* 0x00 */ u8 loaded;
/* 0x01 */ u8 normalRangeLo;
/* 0x02 */ u8 normalRangeHi;
/* 0x03 */ u8 releaseRate;
@@ -177,15 +172,15 @@ typedef struct {
/* 0x08 */ AudioBankSound lowNotesSound;
/* 0x10 */ AudioBankSound normalNotesSound;
/* 0x18 */ AudioBankSound highNotesSound;
-} Instrument; // size >= 0x20
+} Instrument; // size = 0x20
typedef struct {
/* 0x00 */ u8 releaseRate;
/* 0x01 */ u8 pan;
- /*?0x02 */ u8 loaded;
+ /* 0x02 */ u8 loaded;
/* 0x04 */ AudioBankSound sound;
/* 0x14 */ AdsrEnvelope* envelope;
-} Drum; // size >= 0x14
+} Drum; // size = 0x14
typedef struct {
/* 0x00 */ u8 numInstruments;
@@ -206,40 +201,23 @@ typedef struct {
/* 0x19 */ s8 value;
} M64ScriptState; // size = 0x1C
-// Also known as a Group, according to sm64 debug strings.
+// Also known as a Group, according to debug strings.
typedef struct {
- union {
- s32 playerState;
- struct {
- /* 0x000 */ u8 enabled : 1;
- /*?0x000 */ u8 finished : 1;
- /* 0x000 */ u8 muted : 1;
- /* 0x000 */ u8 seqDmaInProgress : 1;
- /* 0x000 */ u8 bankDmaInProgress : 1;
- /*?0x000 */ u8 recalculateVolume : 1;
- /* 0x000 */ u8 unk_0b2 : 1;
- /* 0x000 */ u8 unk_0b1 : 1;
- /* 0x001 */ u8 state;
- /* 0x002 */ u8 noteAllocPolicy;
- union {
- /* 0x003 */ u8 muteBehavior;
- struct {
- u8 mute_u00 : 1;
- u8 mute_u01 : 1;
- u8 mute_u02 : 1;
- u8 mute_u03 : 1;
- u8 mute_u04 : 1;
- u8 mute_u05 : 1;
- u8 mute_u06 : 1;
- u8 mute_u07 : 1;
- };
- };
- };
- };
+ /* 0x000 */ u8 enabled : 1;
+ /* 0x000 */ u8 finished : 1;
+ /* 0x000 */ u8 muted : 1;
+ /* 0x000 */ u8 seqDmaInProgress : 1;
+ /* 0x000 */ u8 bankDmaInProgress : 1;
+ /*?0x000 */ u8 recalculateVolume : 1;
+ /* 0x000 */ u8 unk_0b2 : 1;
+ /* 0x000 */ u8 unk_0b1 : 1;
+ /* 0x001 */ u8 state;
+ /* 0x002 */ u8 noteAllocPolicy;
+ /* 0x003 */ u8 muteBehavior;
/* 0x004 */ u8 seqId;
/* 0x005 */ u8 defaultBank;
- /*?0x006 */ u8 loadingBankId;
- /*?0x007 */ s8 seqVariationEu;
+ /* 0x006 */ u8 unk_06[1];
+ /* 0x007 */ s8 playerIndex;
/* 0x008 */ u16 tempo; // tatums per minute
/* 0x00A */ u16 tempoAcc;
/* 0x00C */ u16 unk_0C;
@@ -247,7 +225,6 @@ typedef struct {
/* 0x010 */ u16 delay;
/* 0x012 */ u16 fadeTimer;
/* 0x014 */ u16 fadeTimerUnkEu;
- /* 0x016 */ char unk_16[0x2];
/* 0x018 */ u8* seqData;
/* 0x01C */ f32 fadeVolume;
/* 0x020 */ f32 fadeVelocity;
@@ -257,7 +234,7 @@ typedef struct {
/* 0x030 */ f32 appliedFadeVolume;
/* 0x034 */ f32 unk_34;
/* 0x038 */ struct SequenceChannel* channels[16];
- /*?0x078 */ M64ScriptState scriptState;
+ /* 0x078 */ M64ScriptState scriptState;
/* 0x094 */ u8* shortNoteVelocityTable;
/* 0x098 */ u8* shortNoteDurationTable;
/* 0x09C */ NotePool notePool;
@@ -305,59 +282,54 @@ typedef struct {
} AdsrState;
typedef struct {
- /* 0x00 */ u8 bit0 : 1;
- /* 0x00 */ u8 bit1 : 1;
+ /* 0x00 */ u8 bit0 : 1; // unused?
+ /* 0x00 */ u8 bit1 : 1; // unused?
/* 0x00 */ u8 bit2 : 2;
/* 0x00 */ u8 strongRight : 1;
/* 0x00 */ u8 strongLeft : 1;
/* 0x00 */ u8 stereoHeadsetEffects : 1;
/* 0x00 */ u8 usesHeadsetPanEffects : 1;
-} ReverbBitsData;
+} StereoData;
typedef union {
- /* 0x00 */ ReverbBitsData s;
+ /* 0x00 */ StereoData s;
/* 0x00 */ u8 asByte;
-} ReverbBits;
+} Stereo;
typedef struct {
/* 0x00 */ u8 reverb;
/* 0x01 */ u8 unk_1;
/* 0x02 */ u8 pan;
- /* 0x03 */ ReverbBits reverbBits;
+ /* 0x03 */ Stereo stereo;
/* 0x04 */ u8 unk_4;
/* 0x06 */ u16 unk_6;
/* 0x08 */ f32 freqScale;
/* 0x0C */ f32 velocity;
- /* 0x10 */ s16* unk_10;
- /* 0x14 */ s16 unk_14[8];
+ /* 0x10 */ s16* filter;
+ /* 0x14 */ s16 filterBuf[8];
} NoteAttributes; // size = 0x24
-// Also known as a SubTrack, according to sm64 debug strings.
+// Also known as a SubTrack, according to debug strings.
// Confusingly, a SubTrack is a container of Tracks.
typedef struct SequenceChannel {
+ /* 0x00 */ u8 enabled : 1;
+ /* 0x00 */ u8 finished : 1;
+ /* 0x00 */ u8 stopScript : 1;
+ /* 0x00 */ u8 stopSomething2 : 1; // sets SequenceChannelLayer.stopSomething
+ /* 0x00 */ u8 hasInstrument : 1;
+ /* 0x00 */ u8 stereoHeadsetEffects : 1;
+ /* 0x00 */ u8 largeNotes : 1; // notes specify duration and velocity
+ /* 0x00 */ u8 unused : 1;
union {
- s32 channelState;
struct {
- /* 0x00 */ u8 enabled : 1;
- /* 0x00 */ u8 finished : 1;
- /* 0x00 */ u8 stopScript : 1;
- /* 0x00 */ u8 stopSomething2 : 1; // sets SequenceChannelLayer.stopSomething
- /* 0x00 */ u8 hasInstrument : 1;
- /* 0x00 */ u8 stereoHeadsetEffects : 1;
- /* 0x00 */ u8 largeNotes : 1; // notes specify duration and velocity
- /* 0x00 */ u8 unused : 1; // still unused?
- union {
- struct {
- /* 0x01 */ u8 freqScale : 1;
- /* 0x01 */ u8 volume : 1;
- /* 0x01 */ u8 pan : 1;
- } s;
- /* 0x01 */ u8 asByte;
- } changes;
- /* 0x02 */ u8 noteAllocPolicy;
- /* 0x03 */ u8 muteBehavior;
- };
- };
+ /* 0x01 */ u8 freqScale : 1;
+ /* 0x01 */ u8 volume : 1;
+ /* 0x01 */ u8 pan : 1;
+ } s;
+ /* 0x01 */ u8 asByte;
+ } changes;
+ /* 0x02 */ u8 noteAllocPolicy;
+ /* 0x03 */ u8 muteBehavior;
/* 0x04 */ u8 reverb; // or dry/wet mix
/* 0x05 */ u8 notePriority; // 0-3
/* 0x06 */ u8 someOtherPriority;
@@ -388,9 +360,9 @@ typedef struct SequenceChannel {
/* 0x30 */ s32 pan;
/* 0x34 */ f32 appliedVolume;
/* 0x38 */ f32 freqScale;
- /*?0x3C */ u8 (*dynTable)[][2];
- /* 0x40 */ struct Note* noteUnused; // still unused?
- /*?0x44 */ struct SequenceChannelLayer* layerUnused; // still unused?
+ /* 0x3C */ u8 (*dynTable)[][2];
+ /* 0x40 */ struct Note* noteUnused;
+ /* 0x44 */ struct SequenceChannelLayer* layerUnused;
/* 0x48 */ Instrument* instrument;
/* 0x4C */ SequencePlayer* seqPlayer;
/* 0x50 */ struct SequenceChannelLayer* layers[4];
@@ -398,11 +370,11 @@ typedef struct SequenceChannel {
/* 0x7C */ AdsrSettings adsr;
/* 0x84 */ NotePool notePool;
/* 0xC4 */ s8 soundScriptIO[8]; // bridge between sound script and audio lib
- /* 0xCC */ s16* unk_CC;
- /* 0xD0 */ ReverbBits reverbBits;
+ /* 0xCC */ s16* filter;
+ /* 0xD0 */ Stereo stereo;
} SequenceChannel; // size = 0xD4
-// Also known as a Track, according to sm64 debug strings.
+// Also known as a Track, according to debug strings.
typedef struct SequenceChannelLayer {
/* 0x00 */ u8 enabled : 1;
/* 0x00 */ u8 finished : 1;
@@ -412,7 +384,7 @@ typedef struct SequenceChannelLayer {
/* 0x00 */ u8 ignoreDrumPan : 1;
/* 0x00 */ u8 bit1 : 1; // "has initialized continuous notes"?
/* 0x00 */ u8 notePropertiesNeedInit : 1;
- /* 0x01 */ ReverbBits reverbBits;
+ /* 0x01 */ Stereo stereo;
/* 0x02 */ u8 instOrWave;
/* 0x03 */ u8 noteDuration;
/* 0x04 */ u8 semitone;
@@ -454,17 +426,17 @@ typedef struct {
} NoteSynthesisBuffers; // size = 0x110
typedef struct {
- /*?0x00 */ u8 restart;
- /*?0x01 */ u8 sampleDmaIndex;
- /*?0x02 */ u8 prevHeadsetPanRight;
- /*?0x03 */ u8 prevHeadsetPanLeft;
- /*?0x04 */ u8 samplePosFrac;
- /* 0x05 */ u8 unk_05;
- /* 0x06 */ u16 unk_06;
- /*?0x08 */ s32 samplePosInt;
+ /* 0x00 */ u8 restart;
+ /* 0x01 */ u8 sampleDmaIndex;
+ /* 0x02 */ u8 prevHeadsetPanRight;
+ /* 0x03 */ u8 prevHeadsetPanLeft;
+ /* 0x04 */ u8 reverbVol;
+ /* 0x05 */ u8 numAdpcmParts;
+ /* 0x06 */ u16 samplePosFrac;
+ /* 0x08 */ s32 samplePosInt;
/* 0x0C */ NoteSynthesisBuffers* synthesisBuffers;
- /*?0x10 */ s16 curVolLeft;
- /*?0x12 */ s16 curVolRight;
+ /* 0x10 */ s16 curVolLeft;
+ /* 0x12 */ s16 curVolRight;
/* 0x14 */ u16 unk_14;
/* 0x16 */ u16 unk_16;
/* 0x18 */ u16 unk_18;
@@ -480,7 +452,7 @@ typedef struct {
/* 0x0C */ f32 extent;
/* 0x10 */ f32 rate;
/* 0x14 */ u8 active;
- /*!0x16 */ u16 rateChangeTimer;
+ /* 0x16 */ u16 rateChangeTimer;
/* 0x18 */ u16 extentChangeTimer;
/* 0x1A */ u16 delay;
} VibratoState; // size = 0x1C
@@ -495,7 +467,7 @@ typedef struct {
/* 0x06 */ s16 adsrVolScale; // unused?
/* 0x08 */ f32 portamentoFreqScale;
/* 0x0C */ f32 vibratoFreqScale;
- /*?0x10 */ SequenceChannelLayer* prevParentLayer;
+ /* 0x10 */ SequenceChannelLayer* prevParentLayer;
/* 0x14 */ SequenceChannelLayer* parentLayer;
/* 0x18 */ SequenceChannelLayer* wantedParentLayer;
/* 0x1C */ NoteAttributes attributes;
@@ -510,45 +482,45 @@ typedef struct {
/* 0x00 */ vu8 enabled : 1;
/* 0x00 */ u8 needsInit : 1;
/*?0x00 */ u8 finished : 1;
- /*?0x00 */ u8 envMixerNeedsInit : 1;
+ /* 0x00 */ u8 unused : 1;
/* 0x00 */ u8 stereoStrongRight : 1;
/* 0x00 */ u8 stereoStrongLeft : 1;
/* 0x00 */ u8 stereoHeadsetEffects : 1;
- /* 0x00 */ u8 usesHeadsetPanEffects : 1;
+ /*?0x00 */ u8 usesHeadsetPanEffects : 1;
} s;
- /*?0x00 */ u8 asByte;
+ /* 0x00 */ u8 asByte; // likely does not exist
} bitField0;
union {
struct {
- /*?0x01 */ u8 reverbIndex : 3;
+ /* 0x01 */ u8 reverbIndex : 3;
/* 0x01 */ u8 bookOffset : 2;
- /*?0x01 */ u8 bit2 : 1;
- /*?0x01 */ u8 isSyntheticWave : 1;
- /*?0x01 */ u8 hasTwoAdpcmParts : 1;
+ /* 0x01 */ u8 isSyntheticWave : 1;
+ /* 0x01 */ u8 hasTwoAdpcmParts : 1;
+ /* 0x01 */ u8 usesHeadsetPanEffects2 : 1;
} s;
- /*?0x01 */ u8 asByte;
+ /* 0x01 */ u8 asByte; // likely does not exist
} bitField1;
/* 0x02 */ u8 unk_2;
- /*?0x03 */ u8 headsetPanRight;
- /*?0x04 */ u8 headsetPanLeft;
- /*?0x05 */ u8 reverbVol;
+ /* 0x03 */ u8 headsetPanRight;
+ /* 0x04 */ u8 headsetPanLeft;
+ /* 0x05 */ u8 reverbVol;
/* 0x06 */ u8 unk_06;
/* 0x07 */ u8 unk_07;
/* 0x08 */ u16 targetVolLeft;
/* 0x0A */ u16 targetVolRight;
- /*?0x0C */ u16 resamplingRateFixedPoint; // stored as signed but loaded as u16
- /* 0x0E */ s16 unk_10;
+ /* 0x0C */ u16 resamplingRateFixedPoint;
+ /* 0x0E */ u16 unk_0E;
/* 0x10 */ union {
- s16* samples;
AudioBankSound* audioBankSound;
- } sound; // not sure if actually a union
- /* 0x14 */ s16* unk_14;
+ s16* samples; // used for synthetic waves
+ } sound;
+ /* 0x14 */ s16* filter;
/* 0x18 */ char pad_18[0x8];
} NoteSubEu; // size = 0x20
typedef struct Note {
/* 0x00 */ AudioListItem listItem;
- /*?0x10 */ NoteSynthesisState synthesisState;
+ /* 0x10 */ NoteSynthesisState synthesisState;
/* 0x30 */ NotePlaybackState playbackState;
/* 0x90 */ Portamento portamento;
/* 0x9C */ VibratoState vibratoState;
@@ -564,8 +536,8 @@ typedef struct {
/* 0x06 */ u16 unk_6;
/* 0x08 */ u16 unk_8;
/* 0x0A */ u16 unk_A;
- /* 0x0C */ u16 unk_C;
- /* 0x0E */ u16 unk_E;
+ /* 0x0C */ u16 leakRtl;
+ /* 0x0E */ u16 leakLtr;
/* 0x10 */ s8 unk_10;
/* 0x12 */ u16 unk_12;
/* 0x14 */ s16 unk_14;
@@ -573,8 +545,8 @@ typedef struct {
} ReverbSettings; // size = 0x18
typedef struct {
- /*?0x00 */ u32 frequency;
- /*?0x04 */ u8 unk_04;
+ /* 0x00 */ u32 frequency;
+ /* 0x04 */ u8 unk_04;
/* 0x05 */ u8 maxSimultaneousNotes;
/* 0x06 */ u8 numSequencePlayers;
/* 0x07 */ u8 unk_07[0x2];
@@ -620,7 +592,7 @@ typedef struct {
} SoundAllocPool; // size = 0x10
typedef struct {
- /* 0x0 */ u8 *ptr;
+ /* 0x0 */ u8* ptr;
/* 0x4 */ u32 size;
/* 0x8 */ s16 poolIndex;
/* 0xA */ s16 id; // seqId or bankId
@@ -878,7 +850,7 @@ typedef struct {
/* 0x0002 */ u16 unk_2;
/* 0x0004 */ u16 unk_4;
/* 0x0006 */ char unk_0006[0x0A];
- /* 0x0000 */ s32 unk_0x10;
+ /* 0x0010 */ s16* curLoadedBook;
/* 0x0014 */ NoteSubEu* noteSubsEu;
/* 0x0018 */ SynthesisReverb synthesisReverbs[4];
/* 0x0B38 */ char unk_0B38[0x30];
@@ -1005,17 +977,17 @@ typedef struct {
} AudioContext; // size = 0x6450
typedef struct {
- /* 0x00 */ u8 reverb; // i.e. volume
+ /* 0x00 */ u8 reverbVol;
/* 0x01 */ u8 unk_1;
/* 0x02 */ u8 pan;
- /* 0x03 */ ReverbBits reverbBits;
+ /* 0x03 */ Stereo stereo;
/* 0x04 */ f32 frequency;
/* 0x08 */ f32 velocity;
/* 0x0C */ char unk_0C[0x4];
- /* 0x10 */ s16* unk_10;
+ /* 0x10 */ s16* filter;
/* 0x14 */ u8 unk_14;
/* 0x16 */ u16 unk_16;
-} Reverb; // size >= 0x18
+} NoteSubAttributes; // size = 0x18
typedef struct {
/* 0x0000 */ u32 heap;
diff --git a/src/code/audio_heap.c b/src/code/audio_heap.c
index 8c4ea64f7..1d264a1e7 100644
--- a/src/code/audio_heap.c
+++ b/src/code/audio_heap.c
@@ -621,46 +621,46 @@ void func_800DF1D8(f32 arg0, f32 arg1, u16* arg2) {
}
}
-void func_800DF5AC(s16* arg0) {
+void func_800DF5AC(s16* filter) {
s32 i;
for (i = 0; i < 8; i++) {
- arg0[i] = 0;
+ filter[i] = 0;
}
}
-void func_800DF5DC(s16* arg0, s32 arg1) {
+void func_800DF5DC(s16* filter, s32 arg1) {
s32 i;
s16* ptr = &D_80130228[8 * arg1];
for (i = 0; i < 8; i++) {
- arg0[i] = ptr[i];
+ filter[i] = ptr[i];
}
}
-void func_800DF630(s16* arg0, s32 arg1) {
+void func_800DF630(s16* filter, s32 arg1) {
s32 i;
s16* ptr = &D_80130328[8 * (arg1 - 1)];
for (i = 0; i < 8; i++) {
- arg0[i] = ptr[i];
+ filter[i] = ptr[i];
}
}
-void func_800DF688(s16* arg0, s32 arg1, s32 arg2) {
+void func_800DF688(s16* filter, s32 arg1, s32 arg2) {
s32 i;
if (arg1 == 0 && arg2 == 0) {
- func_800DF5DC(arg0, 0);
+ func_800DF5DC(filter, 0);
} else if (arg2 == 0) {
- func_800DF5DC(arg0, arg1);
+ func_800DF5DC(filter, arg1);
} else if (arg1 == 0) {
- func_800DF630(arg0, arg2);
+ func_800DF630(filter, arg2);
} else {
s16* ptr1 = &D_80130228[8 * arg1];
s16* ptr2 = &D_80130328[8 * (arg2 - 1)];
for (i = 0; i < 8; i++) {
- arg0[i] = (ptr1[i] + ptr2[i]) / 2;
+ filter[i] = (ptr1[i] + ptr2[i]) / 2;
}
}
}
@@ -898,8 +898,8 @@ void Audio_InitHeap(void) {
reverb->unk_14 = settings->unk_6 * 64;
reverb->unk_16 = settings->unk_8;
reverb->unk_18 = 0;
- reverb->unk_10 = settings->unk_C;
- reverb->unk_12 = settings->unk_E;
+ reverb->leakRtl = settings->leakRtl;
+ reverb->leakLtr = settings->leakLtr;
reverb->unk_05 = settings->unk_10;
reverb->unk_08 = settings->unk_12;
reverb->useReverb = 8;
@@ -914,8 +914,8 @@ void Audio_InitHeap(void) {
reverb->sound.sample = &reverb->sample;
reverb->sample.loop = &reverb->loop;
reverb->sound.tuning = 1.0f;
- reverb->sample.bits4 = 4;
- reverb->sample.bits2 = 0;
+ reverb->sample.codec = 4;
+ reverb->sample.medium = 0;
reverb->sample.size = reverb->windowSize * 2;
reverb->sample.sampleAddr = (u8*)reverb->leftRingBuf;
reverb->loop.start = 0;
@@ -939,19 +939,19 @@ void Audio_InitHeap(void) {
}
if (settings->unk_14 != 0) {
- reverb->unk_278 = Audio_AllocDmaMemoryZeroed(&gAudioContext.notesAndBuffersPool, 0x40);
- reverb->unk_270 = Audio_AllocDmaMemory(&gAudioContext.notesAndBuffersPool, 8 * sizeof(s16));
- func_800DF5DC(reverb->unk_270, settings->unk_14);
+ reverb->filterLeftState = Audio_AllocDmaMemoryZeroed(&gAudioContext.notesAndBuffersPool, 0x40);
+ reverb->filterLeft = Audio_AllocDmaMemory(&gAudioContext.notesAndBuffersPool, 8 * sizeof(s16));
+ func_800DF5DC(reverb->filterLeft, settings->unk_14);
} else {
- reverb->unk_270 = NULL;
+ reverb->filterLeft = NULL;
}
if (settings->unk_16 != 0) {
- reverb->unk_27C = Audio_AllocDmaMemoryZeroed(&gAudioContext.notesAndBuffersPool, 0x40);
- reverb->unk_274 = Audio_AllocDmaMemory(&gAudioContext.notesAndBuffersPool, 8 * sizeof(s16));
- func_800DF5DC(reverb->unk_274, settings->unk_16);
+ reverb->filterRightState = Audio_AllocDmaMemoryZeroed(&gAudioContext.notesAndBuffersPool, 0x40);
+ reverb->filterRight = Audio_AllocDmaMemory(&gAudioContext.notesAndBuffersPool, 8 * sizeof(s16));
+ func_800DF5DC(reverb->filterRight, settings->unk_16);
} else {
- reverb->unk_274 = NULL;
+ reverb->filterRight = NULL;
}
}
@@ -1181,7 +1181,7 @@ void func_800E0BB4(UnkHeapEntry* entry, AudioBankSample* sample) {
if (sample != NULL) {
if (sample->sampleAddr == entry->unk_08) {
sample->sampleAddr = entry->unk_0C;
- sample->bits2 = entry->unk_01;
+ sample->medium = entry->unk_01;
}
}
}
@@ -1251,7 +1251,7 @@ void func_800E0E0C(Struct_800E0E0C* arg0, AudioBankSample* sample) {
u8* sampleAddr = sample->sampleAddr;
if (start <= sampleAddr && sampleAddr < end) {
sample->sampleAddr = sampleAddr - start + arg0->unk_4;
- sample->bits2 = arg0->unk_C & 0xFF;
+ sample->medium = arg0->unk_C & 0xFF;
}
}
}
diff --git a/src/code/audio_load.c b/src/code/audio_load.c
index 62ffc50a5..3fa8a0788 100644
--- a/src/code/audio_load.c
+++ b/src/code/audio_load.c
@@ -6,7 +6,7 @@ typedef enum { LOAD_STATUS_WAITING, LOAD_STATUS_START, LOAD_STATUS_LOADING, LOAD
#define RELOC(v, base) (reloc = (void*)((u32)v + (u32)base))
/* forward declarations */
-s32 func_800E217C(s32 playerIdx, s32, s32);
+s32 func_800E217C(s32 playerIndex, s32, s32);
unk_ldr* func_800E2454(u32 bankId);
AudioBankSample* Audio_GetBankSample(s32 bankId, s32 sfxId);
void Audio_ProcessAsyncLoads(s32 arg0);
@@ -72,7 +72,7 @@ void func_800E11F0(void) {
gAudioContext.unk_2628 = 0;
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/audio_load/func_800E12DC.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/audio_load/Audio_DmaSampleData.s")
void func_800E1618(s32 arg0) {
SampleDmaReq* temp_s0;
@@ -268,18 +268,18 @@ s32 func_800E1C78(AudioBankSample* sample, s32 arg1) {
void* sampleAddr;
if (sample->unk_bits25 == 1) {
- if (sample->bits2 != 0) {
- sampleAddr = func_800E05C4(sample->size, arg1, (void*)sample->sampleAddr, sample->bits2, 1);
+ if (sample->medium != 0) {
+ sampleAddr = func_800E05C4(sample->size, arg1, (void*)sample->sampleAddr, sample->medium, 1);
if (sampleAddr == NULL) {
return -1;
}
- if (sample->bits2 == 1) {
+ if (sample->medium == 1) {
func_800E2BCC(sample->sampleAddr, sampleAddr, sample->size, gAudioContext.audioTable->header.unk_02);
} else {
- Audio_DMAFastCopy(sample->sampleAddr, sampleAddr, sample->size, sample->bits2);
+ Audio_DMAFastCopy(sample->sampleAddr, sampleAddr, sample->size, sample->medium);
}
- sample->bits2 = 0;
+ sample->medium = 0;
sample->sampleAddr = sampleAddr;
}
}
@@ -381,27 +381,27 @@ void func_800E202C(s32 arg0) {
Audio_DiscardBank(arg0);
}
-s32 func_800E20D4(s32 playerIdx, s32 seqId, s32 arg2) {
+s32 func_800E20D4(s32 playerIndex, s32 seqId, s32 arg2) {
if (gAudioContext.resetTimer != 0) {
return 0;
} else {
- gAudioContext.seqPlayers[playerIdx].unk_DC = 0;
- return func_800E217C(playerIdx, seqId, arg2);
+ gAudioContext.seqPlayers[playerIndex].unk_DC = 0;
+ return func_800E217C(playerIndex, seqId, arg2);
}
}
-s32 func_800E2124(s32 playerIdx, s32 seqId, s32 arg2) {
+s32 func_800E2124(s32 playerIndex, s32 seqId, s32 arg2) {
if (gAudioContext.resetTimer != 0) {
return 0;
}
- gAudioContext.seqPlayers[playerIdx].unk_DC = arg2;
- return func_800E217C(playerIdx, seqId, 0);
+ gAudioContext.seqPlayers[playerIndex].unk_DC = arg2;
+ return func_800E217C(playerIndex, seqId, 0);
}
// InitSeqPlayer
-s32 func_800E217C(s32 playerIdx, s32 seqId, s32 arg2) {
- SequencePlayer* seqPlayer = &gAudioContext.seqPlayers[playerIdx];
+s32 func_800E217C(s32 playerIndex, s32 seqId, s32 arg2) {
+ SequencePlayer* seqPlayer = &gAudioContext.seqPlayers[playerIndex];
u8* seqData;
s32 phi_s0;
s32 phi_s1;
@@ -437,7 +437,7 @@ s32 func_800E217C(s32 playerIdx, s32 seqId, s32 arg2) {
seqPlayer->scriptState.depth = 0;
seqPlayer->delay = 0;
seqPlayer->finished = 0;
- seqPlayer->seqVariationEu = playerIdx;
+ seqPlayer->playerIndex = playerIndex;
Audio_ProcessSequence(seqPlayer);
}
@@ -1055,7 +1055,7 @@ s32 Audio_SyncLoadSample(s32 arg0, s32 arg1, u8* isDone) {
return -1;
}
- if (sample->bits2 == 0) {
+ if (sample->medium == 0) {
*isDone = 2;
return 0;
}
@@ -1067,10 +1067,10 @@ s32 Audio_SyncLoadSample(s32 arg0, s32 arg1, u8* isDone) {
syncLoad->sample = *sample;
syncLoad->isDone = isDone;
- syncLoad->ramAddr = func_800E05C4(sample->size, arg0, sample->sampleAddr, sample->bits2, 0);
+ syncLoad->ramAddr = func_800E05C4(sample->size, arg0, sample->sampleAddr, sample->medium, 0);
if (syncLoad->ramAddr == NULL) {
- if (sample->bits2 == 1 || sample->bits4 == 2) {
+ if (sample->medium == 1 || sample->codec == 2) {
*isDone = 0;
return -1;
} else {
@@ -1083,7 +1083,7 @@ s32 Audio_SyncLoadSample(s32 arg0, s32 arg1, u8* isDone) {
syncLoad->size = ALIGN16(sample->size);
syncLoad->unk_10 = syncLoad->ramAddr;
syncLoad->devAddr = sample->sampleAddr;
- syncLoad->unk_00 = sample->bits2;
+ syncLoad->unk_00 = sample->medium;
syncLoad->unk_01 = arg0;
syncLoad->unk_02 = arg1;
if (syncLoad->unk_00 == 1) {
@@ -1136,7 +1136,7 @@ void func_800E3678(AudioSyncLoad* syncLoad) {
syncLoad->sample = *sample;
sample->sampleAddr = syncLoad->unk_10;
- sample->bits2 = 0;
+ sample->medium = 0;
}
void Audio_ProcessSyncLoads(s32 resetStatus) {
@@ -1430,14 +1430,14 @@ void Audio_SampleReloc(AudioBankSound* sound, u32 arg1, RelocInfo* arg2) {
if (sample->size != 0 && sample->unk_bits25 != 1) {
sample->loop = RELOC(sample->loop, arg1);
sample->book = RELOC(sample->book, arg1);
- switch (sample->bits2) {
+ switch (sample->medium) {
case 0:
sample->sampleAddr = RELOC(sample->sampleAddr, arg2->unk_08);
- sample->bits2 = arg2->unk_10;
+ sample->medium = arg2->unk_10;
break;
case 1:
sample->sampleAddr = RELOC(sample->sampleAddr, arg2->unk_0C);
- sample->bits2 = arg2->unk_14;
+ sample->medium = arg2->unk_14;
break;
case 2:
case 3:
@@ -1445,7 +1445,7 @@ void Audio_SampleReloc(AudioBankSound* sound, u32 arg1, RelocInfo* arg2) {
}
sample->unk_bits25 = 1;
- if (sample->unk_bits26 && (sample->bits2 != 0)) {
+ if (sample->unk_bits26 && (sample->medium != 0)) {
gAudioContext.unk_B68[gAudioContext.unk_1768++] = sample;
}
}
@@ -1477,10 +1477,10 @@ s32 func_800E4590(s32 resetStatus) {
if (item->isFree == false) {
sample = item->sample;
- key = (u32)sample->sampleAddr + sample->size + sample->bits2;
+ key = (u32)sample->sampleAddr + sample->size + sample->medium;
if (key == item->endAndMediumKey) {
sample->sampleAddr = item->ramAddr;
- sample->bits2 = 0;
+ sample->medium = 0;
}
item->isFree = true;
}
@@ -1497,12 +1497,12 @@ s32 func_800E4590(s32 resetStatus) {
sample = item->sample;
unk = (sample->size >> 12) + 1;
- key = (u32)sample->sampleAddr + sample->size + sample->bits2;
+ key = (u32)sample->sampleAddr + sample->size + sample->medium;
if (key != item->endAndMediumKey) {
item->isFree = true;
gAudioContext.unk_176C--;
} else {
- Audio_InitAsyncReq((u32)sample->sampleAddr, item->ramAddr, sample->size, sample->bits2, unk,
+ Audio_InitAsyncReq((u32)sample->sampleAddr, item->ramAddr, sample->size, sample->medium, unk,
&gAudioContext.unk_1E78, item->encodedInfo);
break;
}
@@ -1563,7 +1563,7 @@ s32 func_800E478C(s32 bankId, AudioBankSample** sampleList) {
void func_800E48C0(AudioBankSound* sound) {
AudioBankSample* sample = sound->sample;
- if ((sample->size != 0) && (sample->unk_bits26) && (sample->bits2)) {
+ if ((sample->size != 0) && (sample->unk_bits26) && (sample->medium)) {
gAudioContext.unk_B68[gAudioContext.unk_1768++] = sample;
}
}
diff --git a/src/code/audio_playback.c b/src/code/audio_playback.c
index a9ce8e9c2..970aaf8f2 100644
--- a/src/code/audio_playback.c
+++ b/src/code/audio_playback.c
@@ -1,6 +1,6 @@
#include "global.h"
-void Audio_NoteSetVelPanReverb(Note* note, NoteSubEu* sub, Reverb* reverb) {
+void Audio_InitNoteSub(Note* note, NoteSubEu* sub, NoteSubAttributes* attrs) {
f32 volRight, volLeft;
s32 smallPanIndex;
u64 pad;
@@ -9,20 +9,20 @@ void Audio_NoteSetVelPanReverb(Note* note, NoteSubEu* sub, Reverb* reverb) {
f32 vel;
u8 pan;
u8 reverbVol;
- ReverbBitsData sp24;
+ StereoData sp24;
s32 stereoHeadsetEffects = note->playbackState.stereoHeadsetEffects;
- vel = reverb->velocity;
- pan = reverb->pan;
- reverbVol = reverb->reverb;
- sp24 = reverb->reverbBits.s;
+ vel = attrs->velocity;
+ pan = attrs->pan;
+ reverbVol = attrs->reverbVol;
+ sp24 = attrs->stereo.s;
sub->bitField0.s = note->noteSubEu.bitField0.s;
sub->bitField1.s = note->noteSubEu.bitField1.s;
sub->sound.samples = note->noteSubEu.sound.samples;
sub->unk_06 = note->noteSubEu.unk_06;
- Audio_NoteSetResamplingRate(sub, reverb->frequency);
+ Audio_NoteSetResamplingRate(sub, attrs->frequency);
pan &= 0x7F;
@@ -38,7 +38,7 @@ void Audio_NoteSetVelPanReverb(Note* note, NoteSubEu* sub, Reverb* reverb) {
sub->headsetPanLeft = gHeadsetPanQuantization[smallPanIndex];
sub->headsetPanRight = gHeadsetPanQuantization[0x3f - smallPanIndex];
- sub->bitField1.s.hasTwoAdpcmParts = true;
+ sub->bitField1.s.usesHeadsetPanEffects2 = true;
volLeft = gHeadsetPanVolume[pan];
volRight = gHeadsetPanVolume[0x7f - pan];
@@ -46,7 +46,7 @@ void Audio_NoteSetVelPanReverb(Note* note, NoteSubEu* sub, Reverb* reverb) {
strongLeft = strongRight = 0;
sub->headsetPanRight = 0;
sub->headsetPanLeft = 0;
- sub->bitField1.s.hasTwoAdpcmParts = false;
+ sub->bitField1.s.usesHeadsetPanEffects2 = false;
volLeft = gStereoPanVolume[pan];
volRight = gStereoPanVolume[0x7f - pan];
@@ -94,10 +94,10 @@ void Audio_NoteSetVelPanReverb(Note* note, NoteSubEu* sub, Reverb* reverb) {
sub->targetVolLeft = (s32)((vel * volLeft) * 4095.999f);
sub->targetVolRight = (s32)((vel * volRight) * 4095.999f);
- sub->unk_2 = reverb->unk_1;
- sub->unk_14 = reverb->unk_10;
- sub->unk_07 = reverb->unk_14;
- sub->unk_10 = reverb->unk_16;
+ sub->unk_2 = attrs->unk_1;
+ sub->filter = attrs->filter;
+ sub->unk_07 = attrs->unk_14;
+ sub->unk_0E = attrs->unk_16;
sub->reverbVol = reverbVol;
}
@@ -105,7 +105,7 @@ void Audio_NoteSetResamplingRate(NoteSubEu* noteSubEu, f32 resamplingRateInput)
f32 resamplingRate = 0.0f;
if (resamplingRateInput < 2.0f) {
- noteSubEu->bitField1.s.isSyntheticWave = false;
+ noteSubEu->bitField1.s.hasTwoAdpcmParts = false;
if (1.99998f < resamplingRateInput) {
resamplingRate = 1.99998f;
@@ -114,7 +114,7 @@ void Audio_NoteSetResamplingRate(NoteSubEu* noteSubEu, f32 resamplingRateInput)
}
} else {
- noteSubEu->bitField1.s.isSyntheticWave = true;
+ noteSubEu->bitField1.s.hasTwoAdpcmParts = true;
if (3.99996f < resamplingRateInput) {
resamplingRate = 1.99998f;
} else {
@@ -154,12 +154,12 @@ void Audio_NoteDisable(Note* note) {
void Audio_ProcessNotes(void) {
s32 pad[2];
- NoteAttributes* attributes;
+ NoteAttributes* attrs;
NoteSubEu* noteSubEu2;
NoteSubEu* noteSubEu;
Note* note;
NotePlaybackState* playbackState;
- Reverb reverb;
+ NoteSubAttributes subAttrs;
u8 bookOffset;
f32 scale;
s32 i;
@@ -248,47 +248,47 @@ void Audio_ProcessNotes(void) {
scale = Audio_AdsrUpdate(&playbackState->adsr);
Audio_NoteVibratoUpdate(note);
- attributes = &playbackState->attributes;
+ attrs = &playbackState->attributes;
if (playbackState->unk_04 == 1 || playbackState->unk_04 == 2) {
- reverb.frequency = attributes->freqScale;
- reverb.velocity = attributes->velocity;
- reverb.pan = attributes->pan;
- reverb.reverb = attributes->reverb;
- reverb.reverbBits = attributes->reverbBits;
- reverb.unk_1 = attributes->unk_1;
- reverb.unk_10 = attributes->unk_10;
- reverb.unk_14 = attributes->unk_4;
- reverb.unk_16 = attributes->unk_6;
+ subAttrs.frequency = attrs->freqScale;
+ subAttrs.velocity = attrs->velocity;
+ subAttrs.pan = attrs->pan;
+ subAttrs.reverbVol = attrs->reverb;
+ subAttrs.stereo = attrs->stereo;
+ subAttrs.unk_1 = attrs->unk_1;
+ subAttrs.filter = attrs->filter;
+ subAttrs.unk_14 = attrs->unk_4;
+ subAttrs.unk_16 = attrs->unk_6;
bookOffset = noteSubEu->bitField1.s.bookOffset;
} else {
SequenceChannelLayer* layer = playbackState->parentLayer;
SequenceChannel* channel = layer->seqChannel;
- reverb.frequency = layer->noteFreqScale;
- reverb.velocity = layer->noteVelocity;
- reverb.pan = layer->notePan;
- if (layer->reverbBits.asByte == 0) {
- reverb.reverbBits = channel->reverbBits;
+ subAttrs.frequency = layer->noteFreqScale;
+ subAttrs.velocity = layer->noteVelocity;
+ subAttrs.pan = layer->notePan;
+ if (layer->stereo.asByte == 0) {
+ subAttrs.stereo = channel->stereo;
} else {
- reverb.reverbBits = layer->reverbBits;
+ subAttrs.stereo = layer->stereo;
}
- reverb.reverb = channel->reverb;
- reverb.unk_1 = channel->unk_0C;
- reverb.unk_10 = channel->unk_CC;
- reverb.unk_14 = channel->unk_0F;
- reverb.unk_16 = channel->unk_20;
+ subAttrs.reverbVol = channel->reverb;
+ subAttrs.unk_1 = channel->unk_0C;
+ subAttrs.filter = channel->filter;
+ subAttrs.unk_14 = channel->unk_0F;
+ subAttrs.unk_16 = channel->unk_20;
bookOffset = channel->bookOffset & 0x7;
if (channel->seqPlayer->muted && (channel->muteBehavior & 8)) {
- reverb.frequency = 0.0f;
- reverb.velocity = 0.0f;
+ subAttrs.frequency = 0.0f;
+ subAttrs.velocity = 0.0f;
}
}
- reverb.frequency *= playbackState->vibratoFreqScale * playbackState->portamentoFreqScale;
- reverb.frequency *= gAudioContext.audioBufferParameters.resampleRate;
- reverb.velocity *= scale;
- Audio_NoteSetVelPanReverb(note, noteSubEu2, &reverb);
+ subAttrs.frequency *= playbackState->vibratoFreqScale * playbackState->portamentoFreqScale;
+ subAttrs.frequency *= gAudioContext.audioBufferParameters.resampleRate;
+ subAttrs.velocity *= scale;
+ Audio_InitNoteSub(note, noteSubEu2, &subAttrs);
noteSubEu->bitField1.s.bookOffset = bookOffset;
skip:;
}
@@ -432,7 +432,7 @@ s32 func_800E7744(s32 instrument, s32 bankId, s32 instId, void* arg3) {
void Audio_SeqChanLayerDecayRelease(SequenceChannelLayer* seqLayer, s32 target) {
Note* note;
- NoteAttributes* attributes;
+ NoteAttributes* attrs;
SequenceChannel* chan;
s32 i;
@@ -447,7 +447,7 @@ void Audio_SeqChanLayerDecayRelease(SequenceChannelLayer* seqLayer, s32 target)
}
note = seqLayer->note;
- attributes = &note->playbackState.attributes;
+ attrs = &note->playbackState.attributes;
if (note->playbackState.wantedParentLayer == seqLayer) {
note->playbackState.wantedParentLayer = NO_LAYER;
@@ -463,37 +463,37 @@ void Audio_SeqChanLayerDecayRelease(SequenceChannelLayer* seqLayer, s32 target)
}
if (note->playbackState.adsr.action.s.state != ADSR_STATE_DECAY) {
- attributes->freqScale = seqLayer->noteFreqScale;
- attributes->velocity = seqLayer->noteVelocity;
- attributes->pan = seqLayer->notePan;
+ attrs->freqScale = seqLayer->noteFreqScale;
+ attrs->velocity = seqLayer->noteVelocity;
+ attrs->pan = seqLayer->notePan;
if (seqLayer->seqChannel != NULL) {
chan = seqLayer->seqChannel;
- attributes->reverb = chan->reverb;
- attributes->unk_1 = chan->unk_0C;
- attributes->unk_10 = chan->unk_CC;
+ attrs->reverb = chan->reverb;
+ attrs->unk_1 = chan->unk_0C;
+ attrs->filter = chan->filter;
- if (attributes->unk_10 != NULL) {
+ if (attrs->filter != NULL) {
for (i = 0; i < 8; i++) {
- attributes->unk_14[i] = attributes->unk_10[i];
+ attrs->filterBuf[i] = attrs->filter[i];
}
- attributes->unk_10 = attributes->unk_14;
+ attrs->filter = attrs->filterBuf;
}
- attributes->unk_6 = chan->unk_20;
- attributes->unk_4 = chan->unk_0F;
+ attrs->unk_6 = chan->unk_20;
+ attrs->unk_4 = chan->unk_0F;
if (chan->seqPlayer->muted && (chan->muteBehavior & 8)) {
note->noteSubEu.bitField0.s.finished = true;
}
- if (seqLayer->reverbBits.asByte == 0) {
- attributes->reverbBits = chan->reverbBits;
+ if (seqLayer->stereo.asByte == 0) {
+ attrs->stereo = chan->stereo;
} else {
- attributes->reverbBits = seqLayer->reverbBits;
+ attrs->stereo = seqLayer->stereo;
}
note->playbackState.priority = chan->someOtherPriority;
} else {
- attributes->reverbBits = seqLayer->reverbBits;
+ attrs->stereo = seqLayer->stereo;
note->playbackState.priority = 1;
}
@@ -767,12 +767,12 @@ void Audio_NoteInitForLayer(Note* note, SequenceChannelLayer* seqLayer) {
sub->sound.audioBankSound = seqLayer->sound;
if (instId >= 0x80 && instId < 0xC0) {
- sub->bitField1.s.bit2 = true;
+ sub->bitField1.s.isSyntheticWave = true;
} else {
- sub->bitField1.s.bit2 = false;
+ sub->bitField1.s.isSyntheticWave = false;
}
- if (sub->bitField1.s.bit2) {
+ if (sub->bitField1.s.isSyntheticWave) {
Audio_BuildSyntheticWave(note, seqLayer, instId);
}
diff --git a/src/code/audio_seqplayer.c b/src/code/audio_seqplayer.c
index c4940a6b6..64b8b9531 100644
--- a/src/code/audio_seqplayer.c
+++ b/src/code/audio_seqplayer.c
@@ -120,7 +120,7 @@ void Audio_SequenceChannelInit(SequenceChannel* seqChannel) {
seqChannel->transposition = 0;
seqChannel->largeNotes = false;
seqChannel->bookOffset = 0;
- seqChannel->reverbBits.asByte = 0;
+ seqChannel->stereo.asByte = 0;
seqChannel->changes.asByte = 0xFF;
seqChannel->scriptState.depth = 0;
seqChannel->newPan = 0x40;
@@ -144,7 +144,7 @@ void Audio_SequenceChannelInit(SequenceChannel* seqChannel) {
seqChannel->vibratoRateChangeDelay = 0;
seqChannel->vibratoExtentChangeDelay = 0;
seqChannel->vibratoDelay = 0;
- seqChannel->unk_CC = NULL;
+ seqChannel->filter = NULL;
seqChannel->unk_20 = 0;
seqChannel->unk_0F = 0;
seqChannel->volume = 1.0f;
@@ -186,7 +186,7 @@ s32 Audio_SeqChannelSetLayer(SequenceChannel* seqChannel, s32 layerIdx) {
layer->ignoreDrumPan = false;
layer->bit1 = false;
layer->notePropertiesNeedInit = false;
- layer->reverbBits.asByte = 0;
+ layer->stereo.asByte = 0;
layer->portamento.mode = 0;
layer->scriptState.depth = 0;
layer->noteDuration = 0x80;
@@ -427,8 +427,8 @@ void func_800E9ED8(SequenceChannelLayer* layer) {
}
s32 func_800E9F64(SequenceChannelLayer* layer, s32 arg1) {
- if (!layer->stopSomething && layer->sound != NULL && layer->sound->sample->bits4 == 2 &&
- layer->sound->sample->bits2 != 0) {
+ if (!layer->stopSomething && layer->sound != NULL && layer->sound->sample->codec == 2 &&
+ layer->sound->sample->medium != 0) {
layer->stopSomething = true;
return -1;
}
@@ -587,7 +587,7 @@ s32 func_800EA0C0(SequenceChannelLayer* layer) {
break;
case 0xCD:
- layer->reverbBits.asByte = Audio_M64ReadU8(state);
+ layer->stereo.asByte = Audio_M64ReadU8(state);
break;
case 0xCE: {
@@ -1212,7 +1212,7 @@ void Audio_SequenceChannelProcessScript(SequenceChannel* channel) {
} else {
channel->stereoHeadsetEffects = false;
}
- channel->reverbBits.asByte = command & 0x7F;
+ channel->stereo.asByte = command & 0x7F;
break;
case 0xD1:
command = (u8)parameters[0];
@@ -1275,7 +1275,7 @@ void Audio_SequenceChannelProcessScript(SequenceChannel* channel) {
channel->vibratoRateTarget = 0;
channel->vibratoRateStart = 0;
channel->vibratoRateChangeDelay = 0;
- channel->unk_CC = NULL;
+ channel->filter = NULL;
channel->unk_0C = 0;
channel->adsr.sustain = 0;
channel->velocityRandomVariance = 0;
@@ -1295,18 +1295,18 @@ void Audio_SequenceChannelProcessScript(SequenceChannel* channel) {
case 0xB0:
offset = (u16)parameters[0];
data = seqPlayer->seqData + offset;
- channel->unk_CC = (s16*)data;
+ channel->filter = (s16*)data;
break;
case 0xB1:
- channel->unk_CC = NULL;
+ channel->filter = NULL;
break;
case 0xB3:
command = parameters[0];
- if (channel->unk_CC != NULL) {
+ if (channel->filter != NULL) {
lowBits = (command >> 4) & 0xF;
command &= 0xF;
- func_800DF688(channel->unk_CC, lowBits, command);
+ func_800DF688(channel->filter, lowBits, command);
}
break;
case 0xB2:
@@ -1676,11 +1676,11 @@ void Audio_SequencePlayerProcessSequence(SequencePlayer* seqPlayer) {
case 0xC4:
command = Audio_M64ReadU8(seqScript);
if (command == 0xFF) {
- command = seqPlayer->seqVariationEu;
+ command = seqPlayer->playerIndex;
}
commandLow = Audio_M64ReadU8(seqScript);
func_800E20D4(command, commandLow, 0);
- if (command == (u8)seqPlayer->seqVariationEu) {
+ if (command == (u8)seqPlayer->playerIndex) {
return;
}
break;
diff --git a/src/code/audio_synthesis.c b/src/code/audio_synthesis.c
index 8e07ef0d8..cd686bf0b 100644
--- a/src/code/audio_synthesis.c
+++ b/src/code/audio_synthesis.c
@@ -1,25 +1,46 @@
#include "ultra64.h"
#include "global.h"
-Acmd* AudioSynth_LoadRingBuffer(Acmd* arg0, u16 arg1, u16 arg2, s32 arg3, SynthesisReverb* arg4);
-Acmd* AudioSynth_SaveBuffer(Acmd* arg0, u16 arg1, u16 arg2, s32 arg3, s16* arg4);
-Acmd* AudioSynth_SaveRingBuffer(Acmd* arg0, u16 arg1, u16 arg2, s32 arg3, SynthesisReverb* arg4);
-Acmd* func_800DC384(s16* aiBuf, s32 aiBufLen, Acmd* cmd, s32 updateIdx);
-Acmd* func_800DC910(s32 noteIdx, NoteSubEu* noteSubEu, NoteSynthesisState* synthState, s16* aiBuf, s32 aiBufLen,
- Acmd* cmd, s32 updateIdx);
-Acmd* func_800DD9F4(Acmd* arg0, NoteSubEu* arg1, NoteSynthesisState* arg2, s32 arg3);
-Acmd* func_800DDB64(Acmd* cmd, NoteSubEu* noteSubEu, NoteSynthesisState* synthState, s32 arg3, s32 arg4, s32 arg5);
-Acmd* func_800DD6CC(Acmd* cmd, NoteSubEu* noteSubEu, NoteSynthesisState* synthState, s32 aiBufLen, u16, s32, s32);
-Acmd* func_800DD62C(Acmd* cmd, NoteSynthesisState* synthState, s32 count, u16 pitch, u16 inpDmem, s32 resampleFlags);
-extern s16 D_8012FBAA[];
+#define DEFAULT_LEN_1CH 0x1A0
+#define DEFAULT_LEN_2CH 0x340
+
+#define DMEM_TEMP 0x3C0
+#define DMEM_UNCOMPRESSED_NOTE 0x580
+#define DMEM_NOTE_PAN_TEMP 0x5C0
+#define DMEM_SCRATCH2 0x760 // = DMEM_TEMP + DEFAULT_LEN_2CH + a bit more
+#define DMEM_COMPRESSED_ADPCM_DATA 0x940 // = DMEM_LEFT_CH
+#define DMEM_LEFT_CH 0x940
+#define DMEM_RIGHT_CH 0xAE0
+#define DMEM_WET_TEMP 0x3E0
+#define DMEM_WET_SCRATCH 0x720 // = DMEM_WET_TEMP + DEFAULT_LEN_2CH
+#define DMEM_WET_LEFT_CH 0xC80
+#define DMEM_WET_RIGHT_CH 0xE20 // = DMEM_WET_LEFT_CH + DEFAULT_LEN_1CH
+
+Acmd* AudioSynth_LoadRingBufferPart(Acmd* cmd, u16 dmem, u16 startPos, s32 length, SynthesisReverb* reverb);
+Acmd* AudioSynth_SaveBufferOffset(Acmd* cmd, u16 dmem, u16 offset, s32 length, s16* buf);
+Acmd* AudioSynth_SaveRingBufferPart(Acmd* cmd, u16 dmem, u16 startPos, s32 length, SynthesisReverb* reverb);
+Acmd* AudioSynth_DoOneAudioUpdate(s16* aiBuf, s32 aiBufLen, Acmd* cmd, s32 updateIndex);
+Acmd* AudioSynth_ProcessNote(s32 noteIndex, NoteSubEu* noteSubEu, NoteSynthesisState* synthState, s16* aiBuf,
+ s32 aiBufLen, Acmd* cmd, s32 updateIndex);
+Acmd* AudioSynth_LoadWaveSamples(Acmd* cmd, NoteSubEu* noteSubEu, NoteSynthesisState* synthState, s32 nSamplesToLoad);
+Acmd* AudioSynth_NoteApplyHeadsetPanEffects(Acmd* cmd, NoteSubEu* noteSubEu, NoteSynthesisState* synthState, s32 bufLen,
+ s32 flags, s32 side);
+Acmd* AudioSynth_ProcessEnvelope(Acmd* cmd, NoteSubEu* noteSubEu, NoteSynthesisState* synthState, s32 aiBufLen,
+ u16 inBuf, s32 headsetPanSettings, s32 flags);
+Acmd* AudioSynth_FinalResample(Acmd* cmd, NoteSynthesisState* synthState, s32 count, u16 pitch, u16 inpDmem,
+ s32 resampleFlags);
-// 4 nops, part of ucode_disas?
-#pragma GLOBAL_ASM("asm/non_matchings/code/audio_synthesis/pad_800DACB0.s")
+extern s16 D_8012FBAA[];
+extern u32 D_801304A0;
+extern u32 D_801304A4;
+extern u32 D_801304A8;
+extern u32 D_801304AC;
+extern u8 D_801304C0[];
-void AudioSynth_InitNextRingBuf(s32 chunkSize, s32 bufIdx, s32 reverbIdx) {
+void AudioSynth_InitNextRingBuf(s32 chunkLen, s32 bufIndex, s32 reverbIndex) {
ReverbRingBufferItem* bufItem;
s32 pad[3];
- SynthesisReverb* reverb = &gAudioContext.synthesisReverbs[reverbIdx];
+ SynthesisReverb* reverb = &gAudioContext.synthesisReverbs[reverbIndex];
s32 temp_a0_2;
s32 temp_a0_4;
s32 sampleCnt;
@@ -29,9 +50,8 @@ void AudioSynth_InitNextRingBuf(s32 chunkSize, s32 bufIdx, s32 reverbIdx) {
if (reverb->downsampleRate >= 2) {
if (reverb->framesToIgnore == 0) {
- bufItem = &reverb->items[reverb->curFrame][bufIdx];
- // inval dcache
- Audio_osInvalDCache(bufItem->toDownsampleLeft, 0x340);
+ bufItem = &reverb->items[reverb->curFrame][bufIndex];
+ Audio_osInvalDCache(bufItem->toDownsampleLeft, DEFAULT_LEN_2CH);
for (j = 0, i = 0; i < bufItem->lengthA / 2; j += reverb->downsampleRate, i++) {
reverb->leftRingBuf[bufItem->startPos + i] = bufItem->toDownsampleLeft[j];
@@ -45,8 +65,8 @@ void AudioSynth_InitNextRingBuf(s32 chunkSize, s32 bufIdx, s32 reverbIdx) {
}
}
- bufItem = &reverb->items[reverb->curFrame][bufIdx];
- sampleCnt = chunkSize / reverb->downsampleRate;
+ bufItem = &reverb->items[reverb->curFrame][bufIndex];
+ sampleCnt = chunkLen / reverb->downsampleRate;
extraSamples = (sampleCnt + reverb->nextRingBufPos) - reverb->bufSizePerChan;
temp_a0_2 = reverb->nextRingBufPos;
if (extraSamples < 0) {
@@ -62,15 +82,15 @@ void AudioSynth_InitNextRingBuf(s32 chunkSize, s32 bufIdx, s32 reverbIdx) {
}
bufItem->numSamplesAfterDownsampling = sampleCnt;
- bufItem->chunkLen = chunkSize;
+ bufItem->chunkLen = chunkLen;
if (reverb->unk_14 != 0) {
temp_a0_4 = reverb->unk_14 + temp_a0_2;
if (temp_a0_4 >= reverb->bufSizePerChan) {
temp_a0_4 -= reverb->bufSizePerChan;
}
- bufItem = &reverb->items2[reverb->curFrame][bufIdx];
- sampleCnt = chunkSize / reverb->downsampleRate;
+ bufItem = &reverb->items2[reverb->curFrame][bufIndex];
+ sampleCnt = chunkLen / reverb->downsampleRate;
extraSamples = (temp_a0_4 + sampleCnt) - reverb->bufSizePerChan;
if (extraSamples < 0) {
bufItem->lengthA = sampleCnt * 2;
@@ -82,24 +102,24 @@ void AudioSynth_InitNextRingBuf(s32 chunkSize, s32 bufIdx, s32 reverbIdx) {
bufItem->startPos = temp_a0_4;
}
bufItem->numSamplesAfterDownsampling = sampleCnt;
- bufItem->chunkLen = chunkSize;
+ bufItem->chunkLen = chunkLen;
}
}
void func_800DB03C(s32 arg0) {
- NoteSubEu* temp_v0_2;
NoteSubEu* subEu;
- s32 t;
+ NoteSubEu* subEu2;
+ s32 baseIndex;
s32 i;
- t = gAudioContext.maxSimultaneousNotes * arg0;
+ baseIndex = gAudioContext.maxSimultaneousNotes * arg0;
for (i = 0; i < gAudioContext.maxSimultaneousNotes; i++) {
subEu = &gAudioContext.notes[i].noteSubEu;
- temp_v0_2 = &gAudioContext.noteSubsEu[t + i];
+ subEu2 = &gAudioContext.noteSubsEu[baseIndex + i];
if (subEu->bitField0.s.enabled) {
- subEu->bitField0.s.needsInit = 0;
+ subEu->bitField0.s.needsInit = false;
} else {
- temp_v0_2->bitField0.s.enabled = 0;
+ subEu2->bitField0.s.enabled = false;
}
subEu->unk_06 = 0;
@@ -107,7 +127,7 @@ void func_800DB03C(s32 arg0) {
}
Acmd* AudioSynth_Update(Acmd* cmdStart, s32* cmdCnt, s16* aiStart, s32 aiBufLen) {
- s32 chunkSize;
+ s32 chunkLen;
s16* aiBufP;
Acmd* cmdP;
s32 i;
@@ -121,27 +141,28 @@ Acmd* AudioSynth_Update(Acmd* cmdStart, s32* cmdCnt, s16* aiStart, s32 aiBufLen)
}
aiBufP = aiStart;
- gAudioContext.unk_0x10 = 0;
+ gAudioContext.curLoadedBook = NULL;
for (i = gAudioContext.audioBufferParameters.updatesPerFrame; i > 0; i--) {
if (i == 1) {
- chunkSize = aiBufLen;
+ chunkLen = aiBufLen;
} else if ((aiBufLen / i) >= gAudioContext.audioBufferParameters.samplesPerUpdateMax) {
- chunkSize = gAudioContext.audioBufferParameters.samplesPerUpdateMax;
+ chunkLen = gAudioContext.audioBufferParameters.samplesPerUpdateMax;
} else if (gAudioContext.audioBufferParameters.samplesPerUpdateMin >= (aiBufLen / i)) {
- chunkSize = gAudioContext.audioBufferParameters.samplesPerUpdateMin;
+ chunkLen = gAudioContext.audioBufferParameters.samplesPerUpdateMin;
} else {
- chunkSize = gAudioContext.audioBufferParameters.samplesPerUpdate;
+ chunkLen = gAudioContext.audioBufferParameters.samplesPerUpdate;
}
for (j = 0; j < gAudioContext.numSynthesisReverbs; j++) {
if (gAudioContext.synthesisReverbs[j].useReverb) {
- AudioSynth_InitNextRingBuf(chunkSize, gAudioContext.audioBufferParameters.updatesPerFrame - i, j);
+ AudioSynth_InitNextRingBuf(chunkLen, gAudioContext.audioBufferParameters.updatesPerFrame - i, j);
}
}
- cmdP = func_800DC384(aiBufP, chunkSize, cmdP, gAudioContext.audioBufferParameters.updatesPerFrame - i);
- aiBufLen -= chunkSize;
- aiBufP += chunkSize * 2;
+ cmdP = AudioSynth_DoOneAudioUpdate(aiBufP, chunkLen, cmdP,
+ gAudioContext.audioBufferParameters.updatesPerFrame - i);
+ aiBufLen -= chunkLen;
+ aiBufP += chunkLen * 2;
}
for (j = 0; j < gAudioContext.numSynthesisReverbs; j++) {
@@ -155,12 +176,12 @@ Acmd* AudioSynth_Update(Acmd* cmdStart, s32* cmdCnt, s16* aiStart, s32 aiBufLen)
return cmdP;
}
-void func_800DB2C0(s32 arg0, s32 arg1) {
+void func_800DB2C0(s32 updateIndexStart, s32 noteIndex) {
NoteSubEu* temp_v1;
s32 i;
- for (i = arg0 + 1; i < gAudioContext.audioBufferParameters.updatesPerFrame; i++) {
- temp_v1 = &gAudioContext.noteSubsEu[(gAudioContext.maxSimultaneousNotes * i) + arg1];
+ for (i = updateIndexStart + 1; i < gAudioContext.audioBufferParameters.updatesPerFrame; i++) {
+ temp_v1 = &gAudioContext.noteSubsEu[(gAudioContext.maxSimultaneousNotes * i) + noteIndex];
if (!temp_v1->bitField0.s.needsInit) {
temp_v1->bitField0.s.enabled = 0;
} else {
@@ -169,128 +190,132 @@ void func_800DB2C0(s32 arg0, s32 arg1) {
}
}
-Acmd* func_800DB330(Acmd* arg0, SynthesisReverb* reverb, s16 arg2) {
- ReverbRingBufferItem* bufItem = &reverb->items[reverb->curFrame][arg2];
+Acmd* AudioSynth_LoadRingBuffer1AtTemp(Acmd* cmd, SynthesisReverb* reverb, s16 bufIndex) {
+ ReverbRingBufferItem* bufItem = &reverb->items[reverb->curFrame][bufIndex];
- arg0 = AudioSynth_LoadRingBuffer(arg0, 0x3E0, bufItem->startPos, bufItem->lengthA, reverb);
+ cmd = AudioSynth_LoadRingBufferPart(cmd, DMEM_WET_TEMP, bufItem->startPos, bufItem->lengthA, reverb);
if (bufItem->lengthB != 0) {
- arg0 = AudioSynth_LoadRingBuffer(arg0, bufItem->lengthA + 0x3E0, 0, bufItem->lengthB, reverb);
+ // Ring buffer wrapped
+ cmd = AudioSynth_LoadRingBufferPart(cmd, DMEM_WET_TEMP + bufItem->lengthA, 0, bufItem->lengthB, reverb);
}
- return arg0;
+ return cmd;
}
-Acmd* func_800DB3D8(Acmd* arg0, SynthesisReverb* arg1, s16 arg2) {
- ReverbRingBufferItem* temp_v1;
+Acmd* AudioSynth_SaveRingBuffer1AtTemp(Acmd* cmd, SynthesisReverb* reverb, s16 bufIndex) {
+ ReverbRingBufferItem* bufItem = &reverb->items[reverb->curFrame][bufIndex];
- temp_v1 = &arg1->items[arg1->curFrame][arg2];
- arg0 = AudioSynth_SaveRingBuffer(arg0, 0x3E0, temp_v1->startPos, temp_v1->lengthA, arg1);
- if (temp_v1->lengthB != 0) {
- arg0 = AudioSynth_SaveRingBuffer(arg0, temp_v1->lengthA + 0x3E0, 0, temp_v1->lengthB, arg1);
+ cmd = AudioSynth_SaveRingBufferPart(cmd, DMEM_WET_TEMP, bufItem->startPos, bufItem->lengthA, reverb);
+ if (bufItem->lengthB != 0) {
+ // Ring buffer wrapped
+ cmd = AudioSynth_SaveRingBufferPart(cmd, DMEM_WET_TEMP + bufItem->lengthA, 0, bufItem->lengthB, reverb);
}
- return arg0;
+ return cmd;
}
-Acmd* func_800DB480(Acmd* arg0, SynthesisReverb* arg1) {
- void* temp_a2;
- void* temp_a3;
-
- aDMEMMove(arg0++, 0xC80, 0x720, 0x1A0);
- aMix(arg0++, 0x1A, arg1->unk_10, 0xE20, 0xC80);
- aMix(arg0++, 0x1A, arg1->unk_12, 0x720, 0xE20);
- return arg0;
+Acmd* AudioSynth_LeakReverb(Acmd* cmd, SynthesisReverb* reverb) {
+ // Leak some audio from the left reverb channel into the right reverb channel and vice versa (pan)
+ aDMEMMove(cmd++, DMEM_WET_LEFT_CH, DMEM_WET_SCRATCH, DEFAULT_LEN_1CH);
+ aMix(cmd++, 0x1A, reverb->leakRtl, DMEM_WET_RIGHT_CH, DMEM_WET_LEFT_CH);
+ aMix(cmd++, 0x1A, reverb->leakLtr, DMEM_WET_SCRATCH, DMEM_WET_RIGHT_CH);
+ return cmd;
}
-Acmd* func_800DB4E4(Acmd* arg0, s32 arg1, SynthesisReverb* arg2, s16 arg3) {
- ReverbRingBufferItem* temp_v1;
- s16 temp_t0_2;
- s16 temp_t1_2;
+Acmd* func_800DB4E4(Acmd* cmd, s32 arg1, SynthesisReverb* reverb, s16 arg3) {
+ ReverbRingBufferItem* item = &reverb->items[reverb->curFrame][arg3];
+ s16 offsetA;
+ s16 offsetB;
- temp_v1 = &arg2->items[arg2->curFrame][arg3];
- temp_t0_2 = (temp_v1->startPos & 7) * 2;
- temp_t1_2 = ALIGN16(temp_t0_2 + temp_v1->lengthA);
- arg0 = AudioSynth_LoadRingBuffer(arg0, 0x3E0, temp_v1->startPos - (temp_t0_2 / 2), 0x1A0, arg2);
- if (temp_v1->lengthB != 0) {
- arg0 = AudioSynth_LoadRingBuffer(arg0, temp_t1_2 + 0x3E0, 0, 0x1A0 - temp_t1_2, arg2);
+ offsetA = (item->startPos & 7) * 2;
+ offsetB = ALIGN16(offsetA + item->lengthA);
+ cmd = AudioSynth_LoadRingBufferPart(cmd, DMEM_WET_TEMP, item->startPos - (offsetA / 2), DEFAULT_LEN_1CH, reverb);
+ if (item->lengthB != 0) {
+ // Ring buffer wrapped
+ cmd = AudioSynth_LoadRingBufferPart(cmd, DMEM_WET_TEMP + offsetB, 0, DEFAULT_LEN_1CH - offsetB, reverb);
}
- aSetBuffer(arg0++, 0, temp_t0_2 + 0x3E0, 0xC80, arg1 * 2);
- aResample(arg0++, arg2->resampleFlags, arg2->unk_0E, arg2->unk_30);
- aSetBuffer(arg0++, 0, temp_t0_2 + 0x580, 0xE20, arg1 * 2);
- aResample(arg0++, arg2->resampleFlags, arg2->unk_0E, arg2->unk_34);
- return arg0;
+ aSetBuffer(cmd++, 0, DMEM_WET_TEMP + offsetA, DMEM_WET_LEFT_CH, arg1 * 2);
+ aResample(cmd++, reverb->resampleFlags, reverb->unk_0E, reverb->unk_30);
+ aSetBuffer(cmd++, 0, DMEM_WET_TEMP + DEFAULT_LEN_1CH + offsetA, DMEM_WET_RIGHT_CH, arg1 * 2);
+ aResample(cmd++, reverb->resampleFlags, reverb->unk_0E, reverb->unk_34);
+ return cmd;
}
-Acmd* func_800DB680(Acmd* cmd, SynthesisReverb* reverb, s16 bufIdx) {
- ReverbRingBufferItem* bufItem = &reverb->items[reverb->curFrame][bufIdx];
+Acmd* func_800DB680(Acmd* cmd, SynthesisReverb* reverb, s16 bufIndex) {
+ ReverbRingBufferItem* bufItem = &reverb->items[reverb->curFrame][bufIndex];
- aSetBuffer(cmd++, 0, 0xC80, 0x720, bufItem->unk_18 * 2);
+ aSetBuffer(cmd++, 0, DMEM_WET_LEFT_CH, DMEM_WET_SCRATCH, bufItem->unk_18 * 2);
aResample(cmd++, reverb->resampleFlags, bufItem->unk_16, reverb->unk_38);
- cmd = AudioSynth_SaveBuffer(cmd, 0x720, bufItem->startPos, bufItem->lengthA, reverb->leftRingBuf);
+ cmd = AudioSynth_SaveBufferOffset(cmd, DMEM_WET_SCRATCH, bufItem->startPos, bufItem->lengthA, reverb->leftRingBuf);
if (bufItem->lengthB != 0) {
- cmd = AudioSynth_SaveBuffer(cmd, bufItem->lengthA + 0x720, 0, bufItem->lengthB, reverb->leftRingBuf);
+ // Ring buffer wrapped
+ cmd = AudioSynth_SaveBufferOffset(cmd, DMEM_WET_SCRATCH + bufItem->lengthA, 0, bufItem->lengthB,
+ reverb->leftRingBuf);
}
- aSetBuffer(cmd++, 0, 0xE20, 0x720, bufItem->unk_18 * 2);
+ aSetBuffer(cmd++, 0, DMEM_WET_RIGHT_CH, DMEM_WET_SCRATCH, bufItem->unk_18 * 2);
aResample(cmd++, reverb->resampleFlags, bufItem->unk_16, reverb->unk_3C);
- cmd = AudioSynth_SaveBuffer(cmd, 0x720, bufItem->startPos, bufItem->lengthA, reverb->rightRingBuf);
+ cmd = AudioSynth_SaveBufferOffset(cmd, DMEM_WET_SCRATCH, bufItem->startPos, bufItem->lengthA, reverb->rightRingBuf);
if (bufItem->lengthB != 0) {
- cmd = AudioSynth_SaveBuffer(cmd, bufItem->lengthA + 0x720, 0, bufItem->lengthB, reverb->rightRingBuf);
+ // Ring buffer wrapped
+ cmd = AudioSynth_SaveBufferOffset(cmd, DMEM_WET_SCRATCH + bufItem->lengthA, 0, bufItem->lengthB,
+ reverb->rightRingBuf);
}
return cmd;
}
-Acmd* func_800DB828(Acmd* arg0, s32 arg1, SynthesisReverb* arg2, s16 arg3) {
- ReverbRingBufferItem* temp_v1;
- s16 temp_t1;
- s16 temp_t2_2;
+Acmd* func_800DB828(Acmd* cmd, s32 arg1, SynthesisReverb* reverb, s16 arg3) {
+ ReverbRingBufferItem* item = &reverb->items[reverb->curFrame][arg3];
+ s16 offsetA;
+ s16 offsetB;
- temp_v1 = &arg2->items[arg2->curFrame][arg3];
- temp_v1->unk_14 = (temp_v1->unk_18 << 0xF) / arg1;
- temp_t1 = (temp_v1->startPos & 7) * 2;
- temp_v1->unk_16 = (arg1 << 0xF) / temp_v1->unk_18;
- temp_t2_2 = ALIGN16(temp_t1 + temp_v1->lengthA);
- arg0 = AudioSynth_LoadRingBuffer(arg0, 0x3E0, temp_v1->startPos - (temp_t1 / 2), 0x1A0, arg2);
- if (temp_v1->lengthB != 0) {
- arg0 = AudioSynth_LoadRingBuffer(arg0, temp_t2_2 + 0x3E0, 0, 0x1A0 - temp_t2_2, arg2);
+ item->unk_14 = (item->unk_18 << 0xF) / arg1;
+ offsetA = (item->startPos & 7) * 2;
+ item->unk_16 = (arg1 << 0xF) / item->unk_18;
+ offsetB = ALIGN16(offsetA + item->lengthA);
+ cmd = AudioSynth_LoadRingBufferPart(cmd, DMEM_WET_TEMP, item->startPos - (offsetA / 2), DEFAULT_LEN_1CH, reverb);
+ if (item->lengthB != 0) {
+ // Ring buffer wrapped
+ cmd = AudioSynth_LoadRingBufferPart(cmd, DMEM_WET_TEMP + offsetB, 0, DEFAULT_LEN_1CH - offsetB, reverb);
}
- aSetBuffer(arg0++, 0, temp_t1 + 0x3E0, 0xC80, arg1 * 2);
- aResample(arg0++, arg2->resampleFlags, temp_v1->unk_14, arg2->unk_30);
- aSetBuffer(arg0++, 0, temp_t1 + 0x580, 0xE20, arg1 * 2);
- aResample(arg0++, arg2->resampleFlags, temp_v1->unk_14, arg2->unk_34);
- return arg0;
+ aSetBuffer(cmd++, 0, DMEM_WET_TEMP + offsetA, DMEM_WET_LEFT_CH, arg1 * 2);
+ aResample(cmd++, reverb->resampleFlags, item->unk_14, reverb->unk_30);
+ aSetBuffer(cmd++, 0, DMEM_WET_TEMP + DEFAULT_LEN_1CH + offsetA, DMEM_WET_RIGHT_CH, arg1 * 2);
+ aResample(cmd++, reverb->resampleFlags, item->unk_14, reverb->unk_34);
+ return cmd;
}
-Acmd* func_800DBA40(Acmd* arg0, s32 arg1, SynthesisReverb* arg2) {
- if (arg2->unk_270 != NULL) {
- aFilter(arg0++, 2, arg1, arg2->unk_270);
- aFilter(arg0++, arg2->resampleFlags, 0xC80, arg2->unk_278);
+Acmd* AudioSynth_FilterReverb(Acmd* cmd, s32 count, SynthesisReverb* reverb) {
+ // Apply a filter (convolution) to each reverb channel.
+ if (reverb->filterLeft != NULL) {
+ aFilter(cmd++, 2, count, reverb->filterLeft);
+ aFilter(cmd++, reverb->resampleFlags, DMEM_WET_LEFT_CH, reverb->filterLeftState);
}
- if (arg2->unk_274 != NULL) {
- aFilter(arg0++, 2, arg1, arg2->unk_274);
- aFilter(arg0++, arg2->resampleFlags, 0xE20, arg2->unk_27C);
+ if (reverb->filterRight != NULL) {
+ aFilter(cmd++, 2, count, reverb->filterRight);
+ aFilter(cmd++, reverb->resampleFlags, DMEM_WET_RIGHT_CH, reverb->filterRightState);
}
- return arg0;
+ return cmd;
}
-Acmd* func_800DBAE8(Acmd* arg0, SynthesisReverb* arg1, s32 arg2) {
+Acmd* AudioSynth_MaybeMixRingBuffer1(Acmd* cmd, SynthesisReverb* reverb, s32 arg2) {
SynthesisReverb* temp_a3;
- temp_a3 = &gAudioContext.synthesisReverbs[arg1->unk_05];
+ temp_a3 = &gAudioContext.synthesisReverbs[reverb->unk_05];
if (temp_a3->downsampleRate == 1) {
- arg0 = func_800DB330(arg0, temp_a3, arg2);
- aMix(arg0++, 0x34, arg1->unk_08, 0xC80, 0x3E0);
- arg0 = func_800DB3D8(arg0, temp_a3, arg2);
+ cmd = AudioSynth_LoadRingBuffer1AtTemp(cmd, temp_a3, arg2);
+ aMix(cmd++, 0x34, reverb->unk_08, DMEM_WET_LEFT_CH, DMEM_WET_TEMP);
+ cmd = AudioSynth_SaveRingBuffer1AtTemp(cmd, temp_a3, arg2);
}
- return arg0;
+ return cmd;
}
void func_800DBB94(void) {
}
-void func_800DBB9C(Acmd* arg0, s32 arg1, s32 arg2) {
- aClearBuffer(arg0, arg1, arg2);
+void AudioSynth_ClearBuffer(Acmd* cmd, s32 arg1, s32 arg2) {
+ aClearBuffer(cmd, arg1, arg2);
}
void func_800DBBBC(void) {
@@ -302,8 +327,8 @@ void func_800DBBC4(void) {
void func_800DBBCC(void) {
}
-void func_800DBBD4(Acmd* arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4) {
- aMix(arg0, arg1, arg2, arg3, arg4);
+void AudioSynth_Mix(Acmd* cmd, s32 arg1, s32 arg2, s32 arg3, s32 arg4) {
+ aMix(cmd, arg1, arg2, arg3, arg4);
}
void func_800DBC08(void) {
@@ -315,8 +340,8 @@ void func_800DBC10(void) {
void func_800DBC18(void) {
}
-void AudioSynth_SetBuffer(Acmd* cmd, s32 flag, s32 dmemIn, s32 dmemOut, s32 count) {
- aSetBuffer(cmd, flag, dmemIn, dmemOut, count);
+void AudioSynth_SetBuffer(Acmd* cmd, s32 flags, s32 dmemIn, s32 dmemOut, s32 count) {
+ aSetBuffer(cmd, flags, dmemIn, dmemOut, count);
}
void func_800DBC54(void) {
@@ -348,19 +373,19 @@ void AudioSynth_InterL(Acmd* cmd, s32 dmemIn, s32 dmemOut, s32 count) {
cmd->words.w1 = _SHIFTL(dmemIn, 16, 16) | _SHIFTL(dmemOut, 0, 16);
}
-void func_800DBCD4(Acmd* arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4) {
- aEnvSetup1(arg0, arg1, arg2, arg3, arg4);
+void AudioSynth_EnvSetup1(Acmd* cmd, s32 arg1, s32 arg2, s32 arg3, s32 arg4) {
+ aEnvSetup1(cmd, arg1, arg2, arg3, arg4);
}
void func_800DBD08(void) {
}
-void func_800DBD10(Acmd* arg0, s32 arg1, s32 arg2, s32 arg3) {
- aLoadBuffer(arg0, arg3, arg1, arg2);
+void AudioSynth_LoadBuffer(Acmd* cmd, s32 arg1, s32 arg2, s32 arg3) {
+ aLoadBuffer(cmd, arg3, arg1, arg2);
}
-void func_800DBD38(Acmd* arg0, s32 arg1, s32 arg2, s32 arg3) {
- aSaveBuffer(arg0, arg1, arg3, arg2);
+void AudioSynth_SaveBuffer(Acmd* cmd, s32 arg1, s32 arg2, s32 arg3) {
+ aSaveBuffer(cmd, arg1, arg3, arg2);
}
void AudioSynth_EnvSetup2(Acmd* cmd, s32 volLeft, s32 volRight) {
@@ -377,8 +402,8 @@ void func_800DBD84(void) {
void func_800DBD8C(void) {
}
-void AudioSynth_UnkCmd17(Acmd* arg0, s32 arg1, s32 arg2) {
- aUnkCmd17(arg0, arg1, arg2);
+void AudioSynth_S8Dec(Acmd* cmd, s32 flags, s16* state) {
+ aS8Dec(cmd, flags, state);
}
void AudioSynth_HiLoGain(Acmd* cmd, s32 gain, s32 dmemIn, s32 dmemOut, s32 count) {
@@ -425,58 +450,63 @@ void AudioSynth_SetFilterCount(Acmd* cmd, s32 count, s32 addr) {
aFilter(cmd, 2, count, addr);
}
-Acmd* func_800DBEB0(Acmd* cmd, s32 arg1, SynthesisReverb* reverb, s16 arg3) {
- ReverbRingBufferItem* ringBufferItem = &reverb->items[reverb->curFrame][arg3];
+Acmd* AudioSynth_LoadRingBuffer1(Acmd* cmd, s32 arg1, SynthesisReverb* reverb, s16 bufIndex) {
+ ReverbRingBufferItem* ringBufferItem = &reverb->items[reverb->curFrame][bufIndex];
- cmd = AudioSynth_LoadRingBuffer(cmd, 0xC80, ringBufferItem->startPos, ringBufferItem->lengthA, reverb);
+ cmd =
+ AudioSynth_LoadRingBufferPart(cmd, DMEM_WET_LEFT_CH, ringBufferItem->startPos, ringBufferItem->lengthA, reverb);
if (ringBufferItem->lengthB != 0) {
- cmd = AudioSynth_LoadRingBuffer(cmd, ringBufferItem->lengthA + 0xC80, 0, ringBufferItem->lengthB, reverb);
+ // Ring buffer wrapped
+ cmd = AudioSynth_LoadRingBufferPart(cmd, DMEM_WET_LEFT_CH + ringBufferItem->lengthA, 0, ringBufferItem->lengthB,
+ reverb);
}
return cmd;
}
-Acmd* func_800DBF5C(Acmd* cmd, s32 arg1, SynthesisReverb* reverb, s16 bufIdx) {
- ReverbRingBufferItem* bufItem = &reverb->items2[reverb->curFrame][bufIdx];
+Acmd* AudioSynth_LoadRingBuffer2(Acmd* cmd, s32 arg1, SynthesisReverb* reverb, s16 bufIndex) {
+ ReverbRingBufferItem* bufItem = &reverb->items2[reverb->curFrame][bufIndex];
- cmd = AudioSynth_LoadRingBuffer(cmd, 0xC80, bufItem->startPos, bufItem->lengthA, reverb);
+ cmd = AudioSynth_LoadRingBufferPart(cmd, DMEM_WET_LEFT_CH, bufItem->startPos, bufItem->lengthA, reverb);
if (bufItem->lengthB != 0) {
- cmd = AudioSynth_LoadRingBuffer(cmd, bufItem->lengthA + 0xC80, 0, bufItem->lengthB, reverb);
+ // Ring buffer wrapped
+ cmd = AudioSynth_LoadRingBufferPart(cmd, DMEM_WET_LEFT_CH + bufItem->lengthA, 0, bufItem->lengthB, reverb);
}
return cmd;
}
-Acmd* AudioSynth_LoadRingBuffer(Acmd* cmd, u16 dmem, u16 startPos, s32 length, SynthesisReverb* reverb) {
+Acmd* AudioSynth_LoadRingBufferPart(Acmd* cmd, u16 dmem, u16 startPos, s32 length, SynthesisReverb* reverb) {
aLoadBuffer(cmd++, &reverb->leftRingBuf[startPos], dmem, length);
- aLoadBuffer(cmd++, &reverb->rightRingBuf[startPos], dmem + 0x1A0, length);
+ aLoadBuffer(cmd++, &reverb->rightRingBuf[startPos], dmem + DEFAULT_LEN_1CH, length);
return cmd;
}
-Acmd* AudioSynth_SaveRingBuffer(Acmd* cmd, u16 dmem, u16 startPos, s32 length, SynthesisReverb* reverb) {
+Acmd* AudioSynth_SaveRingBufferPart(Acmd* cmd, u16 dmem, u16 startPos, s32 length, SynthesisReverb* reverb) {
aSaveBuffer(cmd++, dmem, &reverb->leftRingBuf[startPos], length);
- aSaveBuffer(cmd++, dmem + 0x1A0, &reverb->rightRingBuf[startPos], length);
+ aSaveBuffer(cmd++, dmem + DEFAULT_LEN_1CH, &reverb->rightRingBuf[startPos], length);
return cmd;
}
-Acmd* AudioSynth_SaveBuffer(Acmd* cmd, u16 dmem, u16 offset, s32 length, s16* buf) {
+Acmd* AudioSynth_SaveBufferOffset(Acmd* cmd, u16 dmem, u16 offset, s32 length, s16* buf) {
aSaveBuffer(cmd++, dmem, &buf[offset], length);
return cmd;
}
-Acmd* func_800DC124(Acmd* cmd, s32 arg1, SynthesisReverb* reverb, s16 arg3) {
+Acmd* AudioSynth_MaybeLoadRingBuffer2(Acmd* cmd, s32 arg1, SynthesisReverb* reverb, s16 bufIndex) {
if (reverb->downsampleRate == 1) {
- cmd = func_800DBF5C(cmd, arg1, reverb, arg3);
+ cmd = AudioSynth_LoadRingBuffer2(cmd, arg1, reverb, bufIndex);
}
return cmd;
}
Acmd* func_800DC164(Acmd* cmd, s32 arg1, SynthesisReverb* reverb, s16 arg3) {
+ // Sets DMEM_WET_{LEFT,RIGHT}_CH, clobbers DMEM_TEMP
if (reverb->downsampleRate == 1) {
if (reverb->unk_18 != 0) {
cmd = func_800DB828(cmd, arg1, reverb, arg3);
} else {
- cmd = func_800DBEB0(cmd, arg1, reverb, arg3);
+ cmd = AudioSynth_LoadRingBuffer1(cmd, arg1, reverb, arg3);
}
} else {
cmd = func_800DB4E4(cmd, arg1, reverb, arg3);
@@ -484,107 +514,116 @@ Acmd* func_800DC164(Acmd* cmd, s32 arg1, SynthesisReverb* reverb, s16 arg3) {
return cmd;
}
-Acmd* func_800DC1D8(Acmd* cmd, SynthesisReverb* reverb, s16 bufIdx) {
- ReverbRingBufferItem* bufItem = &reverb->items[reverb->curFrame][bufIdx];
+Acmd* AudioSynth_SaveReverbSamples(Acmd* cmd, SynthesisReverb* reverb, s16 bufIndex) {
+ ReverbRingBufferItem* bufItem = &reverb->items[reverb->curFrame][bufIndex];
if (reverb->downsampleRate == 1) {
if (reverb->unk_18 != 0) {
- cmd = func_800DB680(cmd, reverb, bufIdx);
+ cmd = func_800DB680(cmd, reverb, bufIndex);
} else {
- cmd = AudioSynth_SaveRingBuffer(cmd, 0xC80, bufItem->startPos, bufItem->lengthA, reverb);
+ // Put the oldest samples in the ring buffer into the wet channels
+ cmd = AudioSynth_SaveRingBufferPart(cmd, DMEM_WET_LEFT_CH, bufItem->startPos, bufItem->lengthA, reverb);
if (bufItem->lengthB != 0) {
- cmd = AudioSynth_SaveRingBuffer(cmd, bufItem->lengthA + 0xC80, 0, bufItem->lengthB, reverb);
+ // Ring buffer wrapped
+ cmd = AudioSynth_SaveRingBufferPart(cmd, DMEM_WET_LEFT_CH + bufItem->lengthA, 0, bufItem->lengthB,
+ reverb);
}
}
} else {
- func_800DBD38(cmd++, 0xC80, 0x340, reverb->items[reverb->curFrame][bufIdx].toDownsampleLeft);
+ // Downsampling is done later by CPU when RSP is done, therefore we need to have
+ // double buffering. Left and right buffers are adjacent in memory.
+ AudioSynth_SaveBuffer(cmd++, DMEM_WET_LEFT_CH, DEFAULT_LEN_2CH,
+ reverb->items[reverb->curFrame][bufIndex].toDownsampleLeft);
}
reverb->resampleFlags = 0;
return cmd;
}
-Acmd* func_800DC2DC(Acmd* cmd, SynthesisReverb* reverb, s16 bufIdx) {
- ReverbRingBufferItem* bufItem = &reverb->items2[reverb->curFrame][bufIdx];
+Acmd* AudioSynth_SaveRingBuffer2(Acmd* cmd, SynthesisReverb* reverb, s16 bufIndex) {
+ ReverbRingBufferItem* bufItem = &reverb->items2[reverb->curFrame][bufIndex];
- cmd = AudioSynth_SaveRingBuffer(cmd, 0xC80, bufItem->startPos, bufItem->lengthA, reverb);
+ cmd = AudioSynth_SaveRingBufferPart(cmd, DMEM_WET_LEFT_CH, bufItem->startPos, bufItem->lengthA, reverb);
if (bufItem->lengthB != 0) {
- cmd = AudioSynth_SaveRingBuffer(cmd, bufItem->lengthA + 0xC80, 0, bufItem->lengthB, reverb);
+ // Ring buffer wrapped
+ cmd = AudioSynth_SaveRingBufferPart(cmd, DMEM_WET_LEFT_CH + bufItem->lengthA, 0, bufItem->lengthB, reverb);
}
return cmd;
}
-Acmd* func_800DC384(s16* aiBuf, s32 aiBufLen, Acmd* cmd, s32 updateIdx) {
- u8 sp9C[0x5C];
- s16 phi_s2;
- s16 phi_s4;
- SynthesisReverb* temp_t8;
+Acmd* AudioSynth_DoOneAudioUpdate(s16* aiBuf, s32 aiBufLen, Acmd* cmd, s32 updateIndex) {
+ u8 noteIndices[0x5C];
+ s16 count;
+ s16 reverbIndex;
+ SynthesisReverb* reverb;
s32 useReverb;
s32 t;
s32 i;
- NoteSubEu* phi_v0;
- NoteSubEu* phi_v0_2;
+ NoteSubEu* noteSubEu;
+ NoteSubEu* noteSubEu2;
s32 unk14;
- t = gAudioContext.maxSimultaneousNotes * updateIdx;
- phi_s2 = 0;
+ t = gAudioContext.maxSimultaneousNotes * updateIndex;
+ count = 0;
if (gAudioContext.numSynthesisReverbs == 0) {
for (i = 0; i < gAudioContext.maxSimultaneousNotes; i++) {
if (gAudioContext.noteSubsEu[t + i].bitField0.s.enabled) {
- sp9C[phi_s2++] = i;
+ noteIndices[count++] = i;
}
}
} else {
- for (phi_s4 = 0; phi_s4 < gAudioContext.numSynthesisReverbs; phi_s4++) {
+ for (reverbIndex = 0; reverbIndex < gAudioContext.numSynthesisReverbs; reverbIndex++) {
for (i = 0; i < gAudioContext.maxSimultaneousNotes; i++) {
- phi_v0 = &gAudioContext.noteSubsEu[t + i];
- if (phi_v0->bitField0.s.enabled && phi_v0->bitField1.s.reverbIndex == phi_s4) {
- sp9C[phi_s2++] = i;
+ noteSubEu = &gAudioContext.noteSubsEu[t + i];
+ if (noteSubEu->bitField0.s.enabled && noteSubEu->bitField1.s.reverbIndex == reverbIndex) {
+ noteIndices[count++] = i;
}
}
}
for (i = 0; i < gAudioContext.maxSimultaneousNotes; i++) {
- phi_v0 = &gAudioContext.noteSubsEu[t + i];
- if (phi_v0->bitField0.s.enabled && phi_v0->bitField1.s.reverbIndex >= gAudioContext.numSynthesisReverbs) {
- sp9C[phi_s2++] = i;
+ noteSubEu = &gAudioContext.noteSubsEu[t + i];
+ if (noteSubEu->bitField0.s.enabled &&
+ noteSubEu->bitField1.s.reverbIndex >= gAudioContext.numSynthesisReverbs) {
+ noteIndices[count++] = i;
}
}
}
- aClearBuffer(cmd++, 0x940, 0x340);
+ aClearBuffer(cmd++, DMEM_LEFT_CH, DEFAULT_LEN_2CH);
i = 0;
- for (phi_s4 = 0; phi_s4 < gAudioContext.numSynthesisReverbs; phi_s4++) {
- temp_t8 = &gAudioContext.synthesisReverbs[phi_s4];
- useReverb = temp_t8->useReverb;
+ for (reverbIndex = 0; reverbIndex < gAudioContext.numSynthesisReverbs; reverbIndex++) {
+ reverb = &gAudioContext.synthesisReverbs[reverbIndex];
+ useReverb = reverb->useReverb;
if (useReverb) {
- cmd = func_800DC164(cmd, aiBufLen, temp_t8, updateIdx);
- aMix(cmd++, 0x34, temp_t8->unk_0A, 0xC80, 0x940);
- unk14 = temp_t8->unk_14;
+ cmd = func_800DC164(cmd, aiBufLen, reverb, updateIndex);
+ aMix(cmd++, 0x34, reverb->unk_0A, DMEM_WET_LEFT_CH, DMEM_LEFT_CH);
+ unk14 = reverb->unk_14;
if (unk14) {
- aDMEMMove(cmd++, 0xC80, 0x3E0, 0x340);
+ aDMEMMove(cmd++, DMEM_WET_LEFT_CH, DMEM_WET_TEMP, DEFAULT_LEN_2CH);
}
- aMix(cmd++, 0x34, temp_t8->unk_0C + 0x8000, 0xC80, 0xC80);
- if ((temp_t8->unk_10 != 0) || (temp_t8->unk_12 != 0)) {
- cmd = func_800DB480(cmd, temp_t8);
+ aMix(cmd++, 0x34, reverb->unk_0C + 0x8000, DMEM_WET_LEFT_CH, DMEM_WET_LEFT_CH);
+ if (reverb->leakRtl != 0 || reverb->leakLtr != 0) {
+ cmd = AudioSynth_LeakReverb(cmd, reverb);
}
if (unk14) {
- cmd = func_800DC1D8(cmd, temp_t8, updateIdx);
- if (temp_t8->unk_05 != -1) {
- cmd = func_800DBAE8(cmd, temp_t8, updateIdx);
+ cmd = AudioSynth_SaveReverbSamples(cmd, reverb, updateIndex);
+ if (reverb->unk_05 != -1) {
+ cmd = AudioSynth_MaybeMixRingBuffer1(cmd, reverb, updateIndex);
}
- cmd = func_800DC124(cmd, aiBufLen, temp_t8, updateIdx);
- aMix(cmd++, 0x34, temp_t8->unk_16, 0x3E0, 0xC80);
+ cmd = AudioSynth_MaybeLoadRingBuffer2(cmd, aiBufLen, reverb, updateIndex);
+ aMix(cmd++, 0x34, reverb->unk_16, DMEM_WET_TEMP, DMEM_WET_LEFT_CH);
}
}
- while (i < phi_s2) {
- phi_v0_2 = &gAudioContext.noteSubsEu[sp9C[i] + t];
- if (phi_v0_2->bitField1.s.reverbIndex == phi_s4) {
- cmd = func_800DC910(sp9C[i], phi_v0_2, &gAudioContext.notes[sp9C[i]].synthesisState, aiBuf, aiBufLen,
- cmd, updateIdx);
+ while (i < count) {
+ noteSubEu2 = &gAudioContext.noteSubsEu[noteIndices[i] + t];
+ if (noteSubEu2->bitField1.s.reverbIndex == reverbIndex) {
+ cmd = AudioSynth_ProcessNote(noteIndices[i], noteSubEu2,
+ &gAudioContext.notes[noteIndices[i]].synthesisState, aiBuf, aiBufLen, cmd,
+ updateIndex);
} else {
break;
}
@@ -592,394 +631,383 @@ Acmd* func_800DC384(s16* aiBuf, s32 aiBufLen, Acmd* cmd, s32 updateIdx) {
}
if (useReverb) {
- if ((temp_t8->unk_270 != NULL) || (temp_t8->unk_274 != NULL)) {
- cmd = func_800DBA40(cmd, aiBufLen * 2, temp_t8);
+ if (reverb->filterLeft != NULL || reverb->filterRight != NULL) {
+ cmd = AudioSynth_FilterReverb(cmd, aiBufLen * 2, reverb);
}
if (unk14) {
- cmd = func_800DC2DC(cmd, temp_t8, updateIdx);
+ cmd = AudioSynth_SaveRingBuffer2(cmd, reverb, updateIndex);
} else {
- cmd = func_800DC1D8(cmd, temp_t8, updateIdx);
- if (temp_t8->unk_05 != -1) {
- cmd = func_800DBAE8(cmd, temp_t8, updateIdx);
+ cmd = AudioSynth_SaveReverbSamples(cmd, reverb, updateIndex);
+ if (reverb->unk_05 != -1) {
+ cmd = AudioSynth_MaybeMixRingBuffer1(cmd, reverb, updateIndex);
}
}
}
}
- while (i < phi_s2) {
- cmd = func_800DC910(sp9C[i], &gAudioContext.noteSubsEu[t + sp9C[i]],
- &gAudioContext.notes[sp9C[i]].synthesisState, aiBuf, aiBufLen, cmd, updateIdx);
+ while (i < count) {
+ cmd = AudioSynth_ProcessNote(noteIndices[i], &gAudioContext.noteSubsEu[t + noteIndices[i]],
+ &gAudioContext.notes[noteIndices[i]].synthesisState, aiBuf, aiBufLen, cmd,
+ updateIndex);
i++;
}
- updateIdx = aiBufLen * 2;
- aInterleave(cmd++, updateIdx, 0x3C0, 0x940, 0xAE0);
- aSaveBuffer(cmd++, 0x3C0, aiBuf, updateIdx * 2);
+ updateIndex = aiBufLen * 2;
+ aInterleave(cmd++, DMEM_TEMP, DMEM_LEFT_CH, DMEM_RIGHT_CH, updateIndex);
+ aSaveBuffer(cmd++, DMEM_TEMP, aiBuf, updateIndex * 2);
return cmd;
}
-#ifdef NON_EQUIVALENT
-Acmd* func_800DC910(s32 noteIdx, NoteSubEu* noteSubEu, NoteSynthesisState* synthState, s16* aiBuf, s32 aiBufLen,
- Acmd* cmd, s32 updateIdx) {
- AudioBankSample* sp150;
- AdpcmLoop* sp14C;
- s32 sp140;
- s32 sp13C;
- s32 sp138;
- u16 sp136;
- s32 sp120;
- s32 sp110;
- s32 sp104;
- s32 sp100;
- s32 spFC;
- s32 spD4;
- s32 spCC;
- s32 spC8;
- s32 spC0;
- s32 spBC;
- s32 spB0;
- u16 spAE;
- Note* sp9C;
- u32 sp8C;
- u32 sp88;
- u32 sp50;
- Acmd* temp_a0_3;
- Acmd* temp_v0;
- Acmd* temp_v0_10;
- Acmd* temp_v0_11;
- Acmd* temp_v0_12;
- Acmd* temp_v0_13;
- Acmd* temp_v0_8;
- Acmd* temp_v0_9;
- Acmd* temp_v1_3;
- NoteSubEu* temp_a1;
- NoteSynthesisState* temp_a2;
- s32 temp_a1_3;
- s32 temp_a2_2;
- s32 temp_a2_3;
- s32 temp_a2_4;
- s32 temp_s1;
- s32 temp_s1_2;
- s32 temp_s1_3;
- s32 temp_s4;
- s32 temp_t0_3;
- s32 temp_t1;
- s32 temp_t9;
- s32 temp_v0_3;
- s32 temp_v0_5;
- s32 temp_v0_7;
- s32 temp_v1;
- s32 temp_v1_4;
+Acmd* AudioSynth_ProcessNote(s32 noteIndex, NoteSubEu* noteSubEu, NoteSynthesisState* synthState, s16* aiBuf,
+ s32 aiBufLen, Acmd* cmd, s32 updateIndex) {
+ s32 pad1[3];
+ AudioBankSample* audioBankSample;
+ AdpcmLoop* loopInfo;
+ s32 samplesRemaining;
+ s32 nSamplesInThisIteration;
+ s32 noteFinished;
+ s32 restart;
+ s32 flags;
+ u16 resamplingRateFixedPoint;
+ s32 phi_s6;
+ s32 phi_s7;
+ s32 phi_a1_2;
s32 temp_v1_5;
+ s32 sp120;
s32 temp_v1_6;
- s32 temp_t0;
- u16 temp_t6;
- u16 temp_v1_7;
- u32 temp_a3;
- u32 temp_a3_3;
- u32 temp_a3_4;
- u32 temp_a3_5;
- u32 temp_t0_2;
- u32 temp_v0_6;
- u8 temp_a1_4;
- AdpcmLoop* temp_a1_2;
- AudioBankSample* temp_v0_2;
- AdpcmBook* temp_v0_4;
- s32 phi_t1;
- u8 phi_v1;
- s32 phi_fp;
- s32 phi_t1_2;
+ void* buf;
+ s32 phi_s0;
+ s32 sampleAddr;
+ u32 samplesLenFixedPoint;
+ s32 samplesLenAdjusted;
+ s32 nAdpcmSamplesProcessed;
+ s32 endPos;
+ s32 nSamplesToProcess;
+ s32 phi_s4;
s32 phi_s3;
+ s32 pad2[7];
+ s32 spD4;
s32 phi_s1;
- s32 phi_a1;
- s32 phi_t1_3;
+ s32 spCC;
+ s32 spC8;
+ u8* phi_a1;
+ s32 nParts;
+ s32 curPart;
s32 phi_t0;
- s32 phi_s4;
- s32 phi_s0;
- s32 phi_s5;
- s32 phi_s6;
- s32 phi_s7;
- s32 phi_t1_4;
- s32 phi_v1_2;
- u8 phi_v1_3;
- s32 phi_v1_4;
- s32 phi_t1_5;
- s32 phi_a1_2;
- NoteSubEu* phi_s6_2;
- s32 phi_s1_2;
- NoteSubEu* phi_s6_3;
-
- sp8C = noteSubEu->bitField1.s.bookOffset;
- sp88 = noteSubEu->bitField0.s.finished;
- sp9C = &gAudioContext.notes[noteIdx];
- sp138 = 0;
-
- if (noteSubEu->bitField0.s.needsInit == 1) {
+ s32 side;
+ s32 resampledTempLen;
+ u16 noteSamplesDmemAddrBeforeResampling;
+ s32 temp_mult;
+ s32 thing;
+ s32 s5;
+ Note* note;
+ u32 nSamplesToLoad;
+ u16 unk7;
+ u16 unkE;
+ s16* filter;
+ s32 bookOffset;
+ s32 finished;
+ s32 aligned;
+ s16 addr;
+ u16 unused;
+
+ bookOffset = noteSubEu->bitField1.s.bookOffset;
+ finished = noteSubEu->bitField0.s.finished;
+ note = &gAudioContext.notes[noteIndex];
+ flags = A_CONTINUE;
+
+ if (noteSubEu->bitField0.s.needsInit == true) {
+ flags = A_INIT;
synthState->restart = 0;
- synthState->unk_06 = 0;
+ synthState->samplePosInt = note->unk_BC;
+ synthState->samplePosFrac = 0;
synthState->curVolLeft = 0;
synthState->curVolRight = 0;
- synthState->samplePosInt = sp9C->unk_BC;
- synthState->samplePosFrac = noteSubEu->reverbVol;
- synthState->unk_05 = 0;
synthState->prevHeadsetPanRight = 0;
synthState->prevHeadsetPanLeft = 0;
+ synthState->reverbVol = noteSubEu->reverbVol;
+ synthState->numAdpcmParts = 0;
synthState->unk_1A = 1;
- sp9C->noteSubEu.bitField0.s.finished = 0;
- sp88 = 0;
- sp138 = 1;
+ note->noteSubEu.bitField0.s.finished = false;
+ finished = false;
}
- sp136 = noteSubEu->resamplingRateFixedPoint;
- spC0 = noteSubEu->bitField1.s.isSyntheticWave + 1;
- temp_t0 = (sp136 * aiBufLen * 2) + synthState->unk_06;
- synthState->unk_06 = temp_t0;
- if (1 != synthState->unk_05) {}
- synthState->unk_05 = spC0;
- if (noteSubEu->bitField1.s.bit2) {
- sp50 = temp_t0 >> 0x10;
- cmd = func_800DD9F4(cmd, noteSubEu, synthState, sp50);
- spAE = (synthState->samplePosInt * 2) + 0x580;
- synthState->samplePosInt += sp50;
+ resamplingRateFixedPoint = noteSubEu->resamplingRateFixedPoint;
+ nParts = noteSubEu->bitField1.s.hasTwoAdpcmParts + 1;
+ samplesLenFixedPoint = (resamplingRateFixedPoint * aiBufLen * 2) + synthState->samplePosFrac;
+ nSamplesToLoad = samplesLenFixedPoint >> 16;
+ synthState->samplePosFrac = samplesLenFixedPoint & 0xFFFF;
+
+ // Partially-optimized out no-op ifs required for matching. SM64 decomp
+ // makes it clear that this is how it should look.
+ if (synthState->numAdpcmParts == 1 && nParts == 2) {
+ } else if (synthState->numAdpcmParts == 2 && nParts == 1) {
+ } else {
+ }
- // OLD BLOCK 94
+ synthState->numAdpcmParts = nParts;
+ if (noteSubEu->bitField1.s.isSyntheticWave) {
+ cmd = AudioSynth_LoadWaveSamples(cmd, noteSubEu, synthState, nSamplesToLoad);
+ noteSamplesDmemAddrBeforeResampling = DMEM_UNCOMPRESSED_NOTE + (synthState->samplePosInt * 2);
+ synthState->samplePosInt += nSamplesToLoad;
} else {
- sp50 = temp_t0 >> 0x10;
- sp150 = noteSubEu->sound.audioBankSound->sample;
- sp14C = sp150->loop;
- sp100 = sp14C->end;
- spB0 = 0;
- spBC = 0;
- sp110 = sp150->sampleAddr;
- for (spBC = 0; !sp88 && spBC < spC0; spBC++) {
- if (spC0 == 1) {
- phi_fp = sp50;
- } else if (sp50 & 1) {
- phi_fp = (sp50 & ~1) + (spBC * 2);
+ // ADPCM note
+ audioBankSample = noteSubEu->sound.audioBankSound->sample;
+ loopInfo = audioBankSample->loop;
+ endPos = loopInfo->end;
+ sampleAddr = audioBankSample->sampleAddr;
+ resampledTempLen = 0;
+
+ for (curPart = 0; curPart < nParts; curPart++) {
+ // reordering in the loop prelude
+ nAdpcmSamplesProcessed = 0;
+ s5 = 0;
+
+ if (nParts == 1) {
+ samplesLenAdjusted = nSamplesToLoad;
+ } else if (nSamplesToLoad & 1) {
+ samplesLenAdjusted = (nSamplesToLoad & ~1) + (curPart * 2);
} else {
- phi_fp = sp50;
+ samplesLenAdjusted = nSamplesToLoad;
}
- if (sp150->bits4 == 0 || sp150->bits4 == 3) {
- if (gAudioContext.unk_0x10 != sp150->bits4 + 8) {
- switch (sp8C) {
+ if (audioBankSample->codec == 0 || audioBankSample->codec == 3) {
+ if (gAudioContext.curLoadedBook != (*audioBankSample->book).book) {
+ u32 nEntries;
+ switch (bookOffset) {
case 1:
- gAudioContext.unk_0x10 = D_8012FBAA;
- ;
+ gAudioContext.curLoadedBook = D_8012FBAA;
break;
case 2:
- gAudioContext.unk_0x10 = sp150->bits4 + 8;
- break;
case 3:
default:
+ gAudioContext.curLoadedBook = (*audioBankSample->book).book;
break;
}
-
- aLoadADPCM(cmd++, sp150->book->order * 0x10 * sp150->book->npredictors, gAudioContext.unk_0x10);
+ if (1) {}
+ if (1) {}
+ if (1) {}
+ nEntries = 16 * audioBankSample->book->order * audioBankSample->book->npredictors;
+ aLoadADPCM(cmd++, nEntries, gAudioContext.curLoadedBook);
}
}
- sp104 = 0;
- phi_s5 = 0;
- while (sp104 != phi_fp) {
- sp140 = 0;
- sp13C = 0;
- spFC = phi_fp - sp104;
+
+ while (nAdpcmSamplesProcessed != samplesLenAdjusted) {
+ noteFinished = false;
+ restart = false;
+ phi_s4 = 0;
+
phi_s3 = synthState->samplePosInt & 0xF;
- if (phi_s3 == 0 && synthState->restart == 0) {
- phi_s3 = 0x10;
+ samplesRemaining = endPos - synthState->samplePosInt;
+ nSamplesToProcess = samplesLenAdjusted - nAdpcmSamplesProcessed;
+
+ if (phi_s3 == 0 && synthState->restart == false) {
+ phi_s3 = 16;
}
- if (spFC < (sp14C->end - synthState->samplePosInt)) {
- phi_s1 = (s32)((spFC - (0x10 - phi_s3)) + 0xF) / 0x10;
- phi_s0 = phi_s1 * 0x10;
- phi_s6 = (0x10 - phi_s3);
- phi_s7 = ((0x10 - phi_s3) + phi_s0) - spFC;
+ phi_s6 = 16 - phi_s3;
+
+ if (nSamplesToProcess < samplesRemaining) {
+ phi_s1 = (s32)(nSamplesToProcess - phi_s6 + 15) / 16;
+ phi_s0 = phi_s1 * 16;
+ phi_s7 = phi_s6 + phi_s0 - nSamplesToProcess;
} else {
- phi_s0 = (sp14C->end - synthState->samplePosInt) - (0x10 - phi_s3);
- phi_s6 = (0x10 - phi_s3);
+ phi_s0 = samplesRemaining - phi_s6;
+ phi_s7 = 0;
if (phi_s0 <= 0) {
phi_s0 = 0;
- phi_s6 = (sp14C->end - synthState->samplePosInt);
+ phi_s6 = samplesRemaining;
}
- phi_s1 = (s32)(phi_s0 + 0xF) / 0x10;
- if (sp14C->count != 0) {
- sp13C = 1;
- phi_s7 = 0;
+ phi_s1 = (phi_s0 + 15) / 16;
+ if (loopInfo->count != 0) {
+ // Loop around and restart
+ restart = true;
} else {
- sp140 = 1;
- phi_s7 = 0;
+ noteFinished = true;
}
}
- switch (sp150->bits4) {
- case 0:
- spCC = 0x10;
- spC8 = 0;
+
+ switch (audioBankSample->codec) {
+ case CODEC_ADPCM:
spD4 = 9;
- goto block_39;
- case 3:
spCC = 0x10;
spC8 = 0;
+ break;
+ case 3:
spD4 = 5;
- goto block_39;
- case 1:
spCC = 0x10;
spC8 = 0;
+ break;
+ case CODEC_S8:
spD4 = 0x10;
- goto block_39;
+ spCC = 0x10;
+ spC8 = 0;
+ break;
case 2:
- sp138 = 0;
+ AudioSynth_ClearBuffer(cmd++, DMEM_UNCOMPRESSED_NOTE, (samplesLenAdjusted * 2) + 0x20);
+ flags = A_CONTINUE;
sp120 = 0;
- sp104 = phi_fp;
- func_800DBB9C(cmd++, 0x580, (phi_fp * 2) + 0x20);
- phi_s5 = phi_fp;
- break;
+ nAdpcmSamplesProcessed = samplesLenAdjusted;
+ s5 = samplesLenAdjusted;
+ goto skip;
case 5:
- sp138 = 0;
+ AudioSynth_ClearBuffer(cmd++, DMEM_UNCOMPRESSED_NOTE, (samplesLenAdjusted * 2) + 0x20);
+ flags = A_CONTINUE;
sp120 = 0;
- sp104 = phi_fp;
- func_800DBB9C(cmd++, 0x580, (phi_fp * 2) + 0x20);
- phi_s5 = phi_fp;
+ nAdpcmSamplesProcessed = samplesLenAdjusted;
+ s5 = samplesLenAdjusted;
+ goto skip;
+ case 4:
break;
- // OLD BLOCK 71
- // OLD BLOCK 78
+ }
- case 4:
- block_39:
- if (phi_s1 != 0) {
- temp_v1_5 = (s32)((synthState->samplePosInt + spCC) - phi_s3) / 0x10;
- if (sp150->bits2 == 0) {
- phi_a1 = spC8 + (temp_v1_5 * spD4) + sp110;
- } else if (sp150->bits2 != 1) {
- phi_a1 =
- func_800E12DC(spC8 + (temp_v1_5 * spD4) + sp110, ((phi_s1 * spD4) + 0x1F) & ~0xF,
- sp138, &synthState->sampleDmaIndex, sp150->bits2);
- } else {
- return cmd;
- }
+ if (phi_s1 != 0) {
+ temp_v1_5 = (synthState->samplePosInt + spCC - phi_s3) / 16;
+ temp_mult = (temp_v1_5 * spD4);
+ if (audioBankSample->medium == 0) {
+ phi_a1 = spC8 + temp_mult + sampleAddr;
+ } else if (audioBankSample->medium == 1) {
+ return cmd;
+ } else {
+ phi_a1 =
+ Audio_DmaSampleData((u32)(spC8 + temp_mult + sampleAddr), ALIGN16((phi_s1 * spD4) + 0x10),
+ flags, &synthState->sampleDmaIndex, audioBankSample->medium);
+ }
- if (phi_a1 != 0) {
- phi_t0 = phi_a1 & 0xF;
- temp_v0_7 = ((phi_s1 * spD4) + 0x1F) & 0xFFF0;
- aLoadBuffer(cmd++, phi_a1 - phi_t0, 0x940 - temp_v0_7, temp_v0_7);
- } else {
- phi_t0 = 0;
- phi_s0 = 0;
- }
+ if (phi_a1 == NULL) {
+ return cmd;
+ }
- if (synthState->restart) {
- aSetLoop(cmd++, sp150->loop);
- sp138 = 2;
- synthState->restart = 0;
- }
+ phi_t0 = (u32)phi_a1 & 0xF;
+ aligned = ALIGN16((phi_s1 * spD4) + 16);
+ addr = DMEM_COMPRESSED_ADPCM_DATA - aligned;
+ aLoadBuffer(cmd++, phi_a1 - phi_t0, addr, aligned);
+ } else {
+ phi_s0 = 0;
+ phi_t0 = 0;
+ }
- if (sp104 == 0) {
- sp120 = phi_s3 * 2;
- phi_s4 = 0;
- } else {
- phi_s4 = (phi_s5 + 0x1F) & ~0xF;
- }
- switch (sp150->bits4) {
- case 0:
- aSetBuffer(cmd++, 0, ((0x940 - (((phi_s1 * spD4) + 0x1F) & 0xFFF0)) + phi_t0),
- phi_s4 + 0x580, phi_s0 * 2);
- aADPCMdec(cmd++, sp138, synthState->synthesisBuffers);
- break;
- case 3:
- aSetBuffer(cmd++, 0, ((0x940 - (((phi_s1 * spD4) + 0x1F) & 0xFFF0)) + phi_t0),
- phi_s4 + 0x580, phi_s0 * 2);
- aADPCMdec(cmd++, sp138 | 4, synthState->synthesisBuffers);
- break;
- case 1:
- AudioSynth_SetBuffer(cmd++, 0, 0x940 - (((phi_s1 * spD4) + 0x1F) & 0xFFF0) + phi_t0,
- phi_s4 + 0x580, phi_s0 * 2);
- AudioSynth_UnkCmd17(cmd++, sp138, (s32)synthState->synthesisBuffers);
- break;
- }
+ if (synthState->restart) {
+ aSetLoop(cmd++, audioBankSample->loop->state);
+ flags = A_LOOP;
+ synthState->restart = false;
+ }
- if (sp104 != 0) {
- aDMEMMove(cmd++, phi_s4 + (phi_s3 * 2) + 0x580, phi_s5 + 0x580,
- (((phi_s0 + phi_s6) - phi_s7) * 2));
- }
+ nSamplesInThisIteration = phi_s0 + phi_s6 - phi_s7;
+ if (nAdpcmSamplesProcessed == 0) {
+ if (1) {}
+ sp120 = phi_s3 * 2;
+ } else {
+ phi_s4 = ALIGN16(s5 + 16);
+ }
+ switch (audioBankSample->codec) {
+ case CODEC_ADPCM:
+ aligned = ALIGN16((phi_s1 * spD4) + 0x10);
+ addr = DMEM_COMPRESSED_ADPCM_DATA - aligned;
+ aSetBuffer(cmd++, 0, addr + phi_t0, DMEM_UNCOMPRESSED_NOTE + phi_s4, phi_s0 * 2);
+ aADPCMdec(cmd++, flags, synthState->synthesisBuffers->adpcmdecState);
+ break;
+ case 3:
+ aligned = ALIGN16((phi_s1 * spD4) + 0x10);
+ addr = DMEM_COMPRESSED_ADPCM_DATA - aligned;
+ aSetBuffer(cmd++, 0, addr + phi_t0, DMEM_UNCOMPRESSED_NOTE + phi_s4, phi_s0 * 2);
+ aADPCMdec(cmd++, flags | 4, synthState->synthesisBuffers->adpcmdecState);
+ break;
+ case CODEC_S8:
+ aligned = ALIGN16((phi_s1 * spD4) + 0x10);
+ addr = DMEM_COMPRESSED_ADPCM_DATA - aligned;
+ AudioSynth_SetBuffer(cmd++, 0, addr + phi_t0, DMEM_UNCOMPRESSED_NOTE + phi_s4, phi_s0 * 2);
+ AudioSynth_S8Dec(cmd++, flags, synthState->synthesisBuffers->adpcmdecState);
+ break;
+ }
- temp_v1_6 = (phi_s0 + phi_s6) - phi_s7;
- temp_t1 = sp104 + temp_v1_6;
-
- switch (sp138) {
- case 1:
- sp120 = 0x20;
- phi_s5 = (phi_s0 * 2) + 0x20;
- break;
- case 2:
- phi_s5 += (temp_v1_6 * 2);
- break;
- default:
- if (phi_s5 != 0) {
- phi_s5 += (temp_v1_6 * 2);
- } else {
- phi_s5 = (phi_s3 + temp_v1_6) * 2;
- }
- break;
- }
+ if (nAdpcmSamplesProcessed != 0) {
+ aDMEMMove(cmd++, DMEM_UNCOMPRESSED_NOTE + phi_s4 + (phi_s3 * 2), DMEM_UNCOMPRESSED_NOTE + s5,
+ nSamplesInThisIteration * 2);
+ }
- sp138 = 0;
- break;
+ nAdpcmSamplesProcessed += nSamplesInThisIteration;
+
+ switch (flags) {
+ case A_INIT:
+ sp120 = 0x20;
+ s5 = (phi_s0 + 0x10) * 2;
+ break;
+ case A_LOOP:
+ s5 = nSamplesInThisIteration * 2 + s5;
+ break;
+ default:
+ if (s5 != 0) {
+ s5 = nSamplesInThisIteration * 2 + s5;
+ } else {
+ s5 = (phi_s3 + nSamplesInThisIteration) * 2;
}
+ break;
}
- if (sp140 != 0) {
- sp88 = 1;
- func_800DBB9C(cmd++, phi_s5 + 0x580, (phi_fp - sp104) * 2);
- sp9C->noteSubEu.bitField0.s.finished = 1;
- func_800DB2C0(updateIdx, noteIdx);
+ flags = A_CONTINUE;
+
+ skip:
+ if (noteFinished) {
+ AudioSynth_ClearBuffer(cmd++, DMEM_UNCOMPRESSED_NOTE + s5,
+ (samplesLenAdjusted - nAdpcmSamplesProcessed) * 2);
+ finished = true;
+ note->noteSubEu.bitField0.s.finished = true;
+ func_800DB2C0(updateIndex, noteIndex);
+ break;
} else {
- if (sp13C != 0) {
- synthState->restart = 1;
- synthState->samplePosInt = sp14C->start;
+ if (restart) {
+ synthState->restart = true;
+ synthState->samplePosInt = loopInfo->start;
} else {
- synthState->samplePosInt += spFC;
+ synthState->samplePosInt += nSamplesToProcess;
}
}
- phi_v1_2 = spC0;
}
- switch (spC0) {
+ switch (nParts) {
case 1:
- spAE = sp120 + 0x580;
+ noteSamplesDmemAddrBeforeResampling = DMEM_UNCOMPRESSED_NOTE + sp120;
break;
case 2:
- break;
- default:
- switch (spBC) {
+ switch (curPart) {
case 0:
- spAE = 0x3E0;
- AudioSynth_InterL(cmd++, sp120 + 0x580, 0x3E0, ((phi_fp / 2) + 7) & ~7);
- spB0 = phi_fp;
- if (sp88 != 0) {
- func_800DBB9C(cmd++, phi_fp + 0x3E0, phi_fp + 0x10);
+ AudioSynth_InterL(cmd++, DMEM_UNCOMPRESSED_NOTE + sp120, DMEM_TEMP + 0x20,
+ ((samplesLenAdjusted / 2) + 7) & ~7);
+ resampledTempLen = samplesLenAdjusted;
+ noteSamplesDmemAddrBeforeResampling = DMEM_TEMP + 0x20;
+ if (finished) {
+ AudioSynth_ClearBuffer(cmd++, noteSamplesDmemAddrBeforeResampling + resampledTempLen,
+ samplesLenAdjusted + 0x10);
}
break;
case 1:
- AudioSynth_InterL(cmd++, sp120 + 0x580, spB0 + 0x3E0, ((phi_fp / 2) + 7) & ~7);
+ AudioSynth_InterL(cmd++, DMEM_UNCOMPRESSED_NOTE + sp120,
+ DMEM_TEMP + 0x20 + resampledTempLen, ((samplesLenAdjusted / 2) + 7) & ~7);
break;
}
}
+ if (finished) {
+ break;
+ }
}
}
- sp138 = 0;
- if (noteSubEu->bitField0.s.needsInit == 1) {
- noteSubEu->bitField0.s.needsInit = 0;
- sp138 = 1;
+ flags = A_CONTINUE;
+ if (noteSubEu->bitField0.s.needsInit == true) {
+ noteSubEu->bitField0.s.needsInit = false;
+ flags = A_INIT;
}
- cmd = func_800DD62C(cmd++, synthState, aiBufLen * 2, sp136, spAE, sp138);
- if (sp8C == 3) {
- AudioSynth_UnkCmd19(cmd++, 0x3C0, 0x3C0, aiBufLen * 2, 0);
+ cmd = AudioSynth_FinalResample(cmd, synthState, aiBufLen * 2, resamplingRateFixedPoint,
+ noteSamplesDmemAddrBeforeResampling, flags);
+ if (bookOffset == 3) {
+ AudioSynth_UnkCmd19(cmd++, DMEM_TEMP, DMEM_TEMP, aiBufLen * 2, 0);
}
- if (sp8C == 2) {
- AudioSynth_UnkCmd3(cmd++, 0x3C0, 0x3C0, aiBufLen * 2);
+ if (bookOffset == 2) {
+ AudioSynth_UnkCmd3(cmd++, DMEM_TEMP, DMEM_TEMP, aiBufLen * 2);
}
phi_a1_2 = noteSubEu->unk_2;
@@ -987,109 +1015,114 @@ Acmd* func_800DC910(s32 noteIdx, NoteSubEu* noteSubEu, NoteSynthesisState* synth
if (phi_a1_2 < 0x10) {
phi_a1_2 = 0x10;
}
- AudioSynth_HiLoGain(cmd++, phi_a1_2, 0x3C0, 0, (aiBufLen * 2) + 0x20);
+ AudioSynth_HiLoGain(cmd++, phi_a1_2, DMEM_TEMP, 0, (aiBufLen * 2) + 0x20);
}
- if (noteSubEu->unk_14 != 0) {
- AudioSynth_SetFilterCount(cmd++, aiBufLen * 2, noteSubEu->unk_14);
- AudioSynth_SetFilter(cmd++, sp138, 0x3C0, synthState->synthesisBuffers->mixEnvelopeState);
+ filter = noteSubEu->filter;
+ if (filter != 0) {
+ AudioSynth_SetFilterCount(cmd++, aiBufLen * 2, filter);
+ AudioSynth_SetFilter(cmd++, flags, DMEM_TEMP, synthState->synthesisBuffers->mixEnvelopeState);
}
- if (noteSubEu->unk_07 != 0 && noteSubEu->unk_10 != 0) {
- AudioSynth_DMemMove(cmd++, 0x3C0, 0x760, aiBufLen * 2);
+ unk7 = noteSubEu->unk_07;
+ unkE = noteSubEu->unk_0E;
+ buf = &synthState->synthesisBuffers->panSamplesBuffer[0x18];
+ if (unk7 != 0 && noteSubEu->unk_0E != 0) {
+ AudioSynth_DMemMove(cmd++, DMEM_TEMP, DMEM_SCRATCH2, aiBufLen * 2);
+ thing = DMEM_SCRATCH2 - unk7;
if (synthState->unk_1A != 0) {
- func_800DBB9C(cmd++, 0x760 - noteSubEu->unk_07, noteSubEu->unk_07);
+ AudioSynth_ClearBuffer(cmd++, thing, unk7);
synthState->unk_1A = 0;
} else {
- func_800DBD10(cmd++, 0x760 - noteSubEu->unk_07, noteSubEu->unk_07,
- &synthState->synthesisBuffers->panSamplesBuffer[0x18]);
+ AudioSynth_LoadBuffer(cmd++, thing, unk7, buf);
}
- AudioSynth_SaveBuffer(cmd++, ((aiBufLen * 2) - noteSubEu->unk_07) + 0x3C0, noteSubEu->unk_07,
- &synthState->synthesisBuffers->panSamplesBuffer[0x18], NULL);
- func_800DBBD4(cmd++, (aiBufLen * 2) >> 4, noteSubEu->unk_10, 0x760, 0x760 - noteSubEu->unk_07);
- AudioSynth_DMemMove(cmd++, 0x760 - noteSubEu->unk_07, 0x3C0, aiBufLen * 2);
+ AudioSynth_SaveBuffer(cmd++, DMEM_TEMP + (aiBufLen * 2) - unk7, unk7, buf);
+ AudioSynth_Mix(cmd++, (aiBufLen * 2) >> 4, unkE, DMEM_SCRATCH2, thing);
+ AudioSynth_DMemMove(cmd++, thing, DMEM_TEMP, aiBufLen * 2);
} else {
synthState->unk_1A = 1;
}
- if ((noteSubEu->headsetPanRight != 0) || (synthState->prevHeadsetPanRight != 0)) {
- phi_s0 = 1;
- } else if ((noteSubEu->headsetPanLeft != 0) || synthState->prevHeadsetPanLeft != 0) {
- phi_s0 = 2;
+ if (noteSubEu->headsetPanRight != 0 || synthState->prevHeadsetPanRight != 0) {
+ side = 1;
+ } else if (noteSubEu->headsetPanLeft != 0 || synthState->prevHeadsetPanLeft != 0) {
+ side = 2;
} else {
- phi_s0 = 0;
+ side = 0;
}
- cmd = func_800DD6CC(cmd, noteSubEu, synthState, aiBufLen, 0x3C0, phi_s0, sp138);
- if (noteSubEu->bitField0.s.usesHeadsetPanEffects) {
- if (!(sp138 & 1)) {
- sp138 = 0;
+ cmd = AudioSynth_ProcessEnvelope(cmd, noteSubEu, synthState, aiBufLen, DMEM_TEMP, side, flags);
+ if (noteSubEu->bitField1.s.usesHeadsetPanEffects2) {
+ if (!(flags & A_INIT)) {
+ flags = A_CONTINUE;
}
- cmd = func_800DDB64(cmd, noteSubEu, synthState, aiBufLen * 2, sp138, phi_s0);
+ cmd = AudioSynth_NoteApplyHeadsetPanEffects(cmd, noteSubEu, synthState, aiBufLen * 2, flags, side);
}
return cmd;
}
-#else
-#pragma GLOBAL_ASM("asm/non_matchings/code/audio_synthesis/func_800DC910.s")
-#endif
-Acmd* func_800DD62C(Acmd* cmd, NoteSynthesisState* synthState, s32 count, u16 pitch, u16 inpDmem, s32 resampleFlags) {
+Acmd* AudioSynth_FinalResample(Acmd* cmd, NoteSynthesisState* synthState, s32 count, u16 pitch, u16 inpDmem,
+ s32 resampleFlags) {
if (pitch == 0) {
- func_800DBB9C(cmd++, 0x3C0, count);
+ AudioSynth_ClearBuffer(cmd++, DMEM_TEMP, count);
} else {
- aSetBuffer(cmd++, 0, inpDmem, 0x3C0, count);
+ aSetBuffer(cmd++, 0, inpDmem, DMEM_TEMP, count);
aResample(cmd++, resampleFlags, pitch, synthState->synthesisBuffers->finalResampleState);
}
return cmd;
}
-extern u32 D_801304A4;
-extern u32 D_801304A8;
-extern u32 D_801304AC;
-
-Acmd* func_800DD6CC(Acmd* cmd, NoteSubEu* noteSubEu, NoteSynthesisState* synthState, s32 aiBufLen, u16 arg4, s32 arg5,
- s32 arg6) {
+Acmd* AudioSynth_ProcessEnvelope(Acmd* cmd, NoteSubEu* noteSubEu, NoteSynthesisState* synthState, s32 aiBufLen,
+ u16 inBuf, s32 headsetPanSettings, s32 flags) {
u32 phi_a1;
u16 curVolLeft;
u16 targetVolLeft;
s32 phi_t1;
- s16 reverVol;
+ s16 reverbVol;
u16 curVolRight;
- s16 phi_a3;
- s16 phi_t0;
- s16 sp52;
- s16 sp50;
+ s16 rampLeft;
+ s16 rampRight;
+ s16 rampReverb;
+ s16 sourceReverbVol;
u16 targetVolRight;
s32 pad;
curVolLeft = synthState->curVolLeft;
targetVolLeft = noteSubEu->targetVolLeft;
- targetVolLeft *= 0x10;
- reverVol = noteSubEu->reverbVol;
+ targetVolLeft <<= 4;
+ reverbVol = noteSubEu->reverbVol;
curVolRight = synthState->curVolRight;
targetVolRight = noteSubEu->targetVolRight;
- targetVolRight *= 0x10;
+ targetVolRight <<= 4;
- phi_a3 = targetVolLeft != curVolLeft ? (targetVolLeft - curVolLeft) / (aiBufLen >> 3) : 0;
- phi_t0 = targetVolRight != curVolRight ? (targetVolRight - curVolRight) / (aiBufLen >> 3) : 0;
+ if (targetVolLeft != curVolLeft) {
+ rampLeft = (targetVolLeft - curVolLeft) / (aiBufLen >> 3);
+ } else {
+ rampLeft = 0;
+ }
+ if (targetVolRight != curVolRight) {
+ rampRight = (targetVolRight - curVolRight) / (aiBufLen >> 3);
+ } else {
+ rampRight = 0;
+ }
- sp50 = synthState->samplePosFrac;
- phi_t1 = sp50 & 0x7F;
+ sourceReverbVol = synthState->reverbVol;
+ phi_t1 = sourceReverbVol & 0x7F;
- if (sp50 != reverVol) {
- sp52 = (((reverVol & 0x7F) - phi_t1) << 9) / (aiBufLen >> 3);
- synthState->samplePosFrac = reverVol;
+ if (sourceReverbVol != reverbVol) {
+ rampReverb = (((reverbVol & 0x7F) - phi_t1) << 9) / (aiBufLen >> 3);
+ synthState->reverbVol = reverbVol;
} else {
- sp52 = 0;
+ rampReverb = 0;
}
- synthState->curVolLeft = curVolLeft + (phi_a3 * (aiBufLen >> 3));
- synthState->curVolRight = curVolRight + (phi_t0 * (aiBufLen >> 3));
+ synthState->curVolLeft = curVolLeft + (rampLeft * (aiBufLen >> 3));
+ synthState->curVolRight = curVolRight + (rampRight * (aiBufLen >> 3));
- if (noteSubEu->bitField1.s.hasTwoAdpcmParts) {
- func_800DBB9C(cmd++, 0x5C0, 0x1A0);
- func_800DBCD4(cmd++, phi_t1 * 2, sp52, phi_a3, phi_t0);
+ if (noteSubEu->bitField1.s.usesHeadsetPanEffects2) {
+ AudioSynth_ClearBuffer(cmd++, DMEM_NOTE_PAN_TEMP, DEFAULT_LEN_1CH);
+ AudioSynth_EnvSetup1(cmd++, phi_t1 * 2, rampReverb, rampLeft, rampRight);
AudioSynth_EnvSetup2(cmd++, curVolLeft, curVolRight);
- switch (arg5) {
+ switch (headsetPanSettings) {
case 1:
phi_a1 = D_801304A4;
break;
@@ -1101,95 +1134,100 @@ Acmd* func_800DD6CC(Acmd* cmd, NoteSubEu* noteSubEu, NoteSynthesisState* synthSt
break;
}
} else {
- aEnvSetup1(cmd++, phi_t1 * 2, sp52, phi_a3, phi_t0);
+ aEnvSetup1(cmd++, phi_t1 * 2, rampReverb, rampLeft, rampRight);
aEnvSetup2(cmd++, curVolLeft, curVolRight);
phi_a1 = D_801304AC;
}
- aEnvMixer(cmd++, arg4, aiBufLen, (sp50 & 0x80) >> 7, noteSubEu->bitField0.s.stereoHeadsetEffects,
+ aEnvMixer(cmd++, inBuf, aiBufLen, (sourceReverbVol & 0x80) >> 7, noteSubEu->bitField0.s.stereoHeadsetEffects,
noteSubEu->bitField0.s.usesHeadsetPanEffects, noteSubEu->bitField0.s.stereoStrongRight,
- noteSubEu->bitField0.s.stereoStrongLeft, phi_a1);
+ noteSubEu->bitField0.s.stereoStrongLeft, phi_a1, D_801304A0);
return cmd;
}
-extern u8 D_801304C0[];
-Acmd* func_800DD9F4(Acmd* cmd, NoteSubEu* noteSubEu, NoteSynthesisState* synthState, s32 arg3) {
+Acmd* AudioSynth_LoadWaveSamples(Acmd* cmd, NoteSubEu* noteSubEu, NoteSynthesisState* synthState, s32 nSamplesToLoad) {
s32 temp_v0;
- s32 temp_t0;
- s32 samplePosInt;
+ s32 unk6 = noteSubEu->unk_06;
+ s32 samplePosInt = synthState->samplePosInt;
+ s32 repeats;
- temp_t0 = noteSubEu->unk_06;
- samplePosInt = synthState->samplePosInt;
if (noteSubEu->bitField1.s.bookOffset != 0) {
- func_800DBD10(cmd++, 0x580, ALIGN16(arg3 * 2), gWaveSamples[8]);
- gWaveSamples[8] += arg3 * 2;
+ AudioSynth_LoadBuffer(cmd++, DMEM_UNCOMPRESSED_NOTE, ALIGN16(nSamplesToLoad * 2), gWaveSamples[8]);
+ gWaveSamples[8] += nSamplesToLoad * 2;
return cmd;
} else {
- aLoadBuffer(cmd++, noteSubEu->sound.samples, 0x580, 0x80);
- if (temp_t0 != 0) {
- samplePosInt = (samplePosInt * D_801304C0[temp_t0 >> 2]) / D_801304C0[temp_t0 & 3];
+ aLoadBuffer(cmd++, noteSubEu->sound.samples, DMEM_UNCOMPRESSED_NOTE, 0x80);
+ if (unk6 != 0) {
+ samplePosInt = (samplePosInt * D_801304C0[unk6 >> 2]) / D_801304C0[unk6 & 3];
}
samplePosInt &= 0x3F;
temp_v0 = 0x40 - samplePosInt;
- if (temp_v0 < arg3 && ((arg3 - temp_v0 + 0x3F) / 0x40) != 0) {
- aDuplicate(cmd++, ((arg3 - temp_v0 + 0x3F) / 0x40), 0x580, 0x600, 0x80);
+ if (temp_v0 < nSamplesToLoad) {
+ repeats = ((nSamplesToLoad - temp_v0 + 0x3F) / 0x40);
+ if (repeats != 0) {
+ aDuplicate(cmd++, repeats, DMEM_UNCOMPRESSED_NOTE, DMEM_UNCOMPRESSED_NOTE + 0x80, 0x80);
+ }
}
synthState->samplePosInt = samplePosInt;
}
return cmd;
}
-#ifdef NON_MATCHING
-Acmd* func_800DDB64(Acmd* cmd, NoteSubEu* noteSubEu, NoteSynthesisState* synthState, s32 arg3, s32 arg4, s32 arg5) {
- s32 phi_v0;
- s32 phi_v1;
- s32 phi_t0;
+Acmd* AudioSynth_NoteApplyHeadsetPanEffects(Acmd* cmd, NoteSubEu* noteSubEu, NoteSynthesisState* synthState, s32 bufLen,
+ s32 flags, s32 side) {
+ u16 dest;
+ u16 pitch;
+ u8 prevPanShift;
+ u8 panShift;
- switch (arg5) {
+ switch (side) {
case 1:
- phi_t0 = 0x940;
- phi_v1 = noteSubEu->headsetPanRight;
- phi_v0 = synthState->prevHeadsetPanRight;
+ dest = DMEM_LEFT_CH;
+ panShift = noteSubEu->headsetPanRight;
+ prevPanShift = synthState->prevHeadsetPanRight;
synthState->prevHeadsetPanLeft = 0;
- synthState->prevHeadsetPanRight = phi_v1;
+ synthState->prevHeadsetPanRight = panShift;
break;
case 2:
- phi_t0 = 0xAE0;
- phi_v1 = noteSubEu->headsetPanLeft;
- phi_v0 = synthState->prevHeadsetPanLeft;
- synthState->prevHeadsetPanLeft = phi_v1;
+ dest = DMEM_RIGHT_CH;
+ panShift = noteSubEu->headsetPanLeft;
+ prevPanShift = synthState->prevHeadsetPanLeft;
+ synthState->prevHeadsetPanLeft = panShift;
synthState->prevHeadsetPanRight = 0;
break;
default:
return cmd;
}
- if (arg4 != 1) {
- if (phi_v0 != phi_v1) {
- aSetBuffer(cmd++, 0, 0x5C0, 0x3C0, arg3 + phi_v1 - phi_v0);
- aResampleZOH(cmd++, (u16)((((arg3 << 0xF) / 2) - 1) / ((arg3 + phi_v1 - phi_v0 - 2) / 2)), 0);
+ if (flags != A_INIT) {
+ // Slightly adjust the sample rate in order to fit a change in pan shift
+ if (panShift != prevPanShift) {
+ pitch = (((bufLen << 0xF) / 2) - 1) / ((bufLen + panShift - prevPanShift - 2) / 2);
+ aSetBuffer(cmd++, 0, DMEM_NOTE_PAN_TEMP, DMEM_TEMP, bufLen + panShift - prevPanShift);
+ aResampleZoh(cmd++, pitch, 0);
} else {
- aDMEMMove(cmd++, 0x5C0, 0x3C0, arg3);
+ aDMEMMove(cmd++, DMEM_NOTE_PAN_TEMP, DMEM_TEMP, bufLen);
}
- if (phi_v0 != 0) {
- aLoadBuffer(cmd++, &synthState->synthesisBuffers->panResampleState[0x8], 0x5C0, ALIGN16(phi_v0));
- aDMEMMove(cmd++, 0x3C0, 0x5C0 + phi_v0, arg3 + phi_v1 - phi_v0);
+ if (prevPanShift != 0) {
+ aLoadBuffer(cmd++, &synthState->synthesisBuffers->panResampleState[0x8], DMEM_NOTE_PAN_TEMP,
+ ALIGN16(prevPanShift));
+ aDMEMMove(cmd++, DMEM_TEMP, DMEM_NOTE_PAN_TEMP + prevPanShift, bufLen + panShift - prevPanShift);
} else {
- aDMEMMove(cmd++, 0x3C0, 0x5C0, arg3 + phi_v1);
+ aDMEMMove(cmd++, DMEM_TEMP, DMEM_NOTE_PAN_TEMP, bufLen + panShift);
}
} else {
- aDMEMMove(cmd++, 0x5C0, 0x3C0, arg3);
- aClearBuffer(cmd++, 0x5C0, phi_v1);
- aDMEMMove(cmd++, 0x3C0, 0x5C0 + phi_v1, arg3);
+ // Just shift right
+ aDMEMMove(cmd++, DMEM_NOTE_PAN_TEMP, DMEM_TEMP, bufLen);
+ aClearBuffer(cmd++, DMEM_NOTE_PAN_TEMP, panShift);
+ aDMEMMove(cmd++, DMEM_TEMP, DMEM_NOTE_PAN_TEMP + panShift, bufLen);
}
- if (phi_v1 != 0) {
- aSaveBuffer(cmd++, 0x5C0 + arg3, &synthState->synthesisBuffers->panResampleState[0x8], ALIGN16(phi_v1));
+ if (panShift) {
+ // Save excessive samples for next iteration
+ aSaveBuffer(cmd++, DMEM_NOTE_PAN_TEMP + bufLen, &synthState->synthesisBuffers->panResampleState[0x8],
+ ALIGN16(panShift));
}
- aAddMixer(cmd++, ((arg3 + 0x3F) & ~0x3F), 0x5C0, phi_t0, 0x7FFF);
+ aAddMixer(cmd++, ALIGN64(bufLen), DMEM_NOTE_PAN_TEMP, dest, 0x7FFF);
return cmd;
}
-#else
-#pragma GLOBAL_ASM("asm/non_matchings/code/audio_synthesis/func_800DDB64.s")
-#endif
diff --git a/src/code/code_800E4FE0.c b/src/code/code_800E4FE0.c
index 70c4ab979..b36cd0bdc 100644
--- a/src/code/code_800E4FE0.c
+++ b/src/code/code_800E4FE0.c
@@ -18,7 +18,7 @@ typedef enum {
CHAN_UPD_VIBE_X32, // 11
CHAN_UPD_UNK_0F, // 12
CHAN_UPD_UNK_20, // 13
- CHAN_UPD_REVERB_FLG // 14
+ CHAN_UPD_STEREO // 14
} ChannelUpdateType;
void func_800E6300(SequenceChannel* channel, AudioCmd* arg1);
@@ -704,8 +704,8 @@ void func_800E6300(SequenceChannel* channel, AudioCmd* cmd) {
case CHAN_UPD_UNK_20:
channel->unk_20 = cmd->asUShort;
return;
- case CHAN_UPD_REVERB_FLG:
- channel->reverbBits.asByte = cmd->asUbyte;
+ case CHAN_UPD_STEREO:
+ channel->stereo.asByte = cmd->asUbyte;
return;
}
}
@@ -792,10 +792,10 @@ s32 func_800E66C0(s32 arg0) {
if (temp_a2->adsr.action.s.state != 0) {
if (arg0 >= 2) {
sound = temp_a3->sound.audioBankSound;
- if (sound == NULL || temp_a3->bitField1.s.bit2) {
+ if (sound == NULL || temp_a3->bitField1.s.isSyntheticWave) {
continue;
}
- if (sound->sample->bits2 == 0) {
+ if (sound->sample->medium == 0) {
continue;
}
}
diff --git a/src/code/code_800EC960.c b/src/code/code_800EC960.c
index 7b9ee4387..e107dd93a 100644
--- a/src/code/code_800EC960.c
+++ b/src/code/code_800EC960.c
@@ -6,7 +6,7 @@ typedef struct {
f32 freqScale;
s8 reverb;
s8 panSigned;
- s8 reverbFlg;
+ s8 stereoBits;
u8 unk_0B;
u8 unk_0C;
} unk_s1;
@@ -2754,7 +2754,7 @@ void Audio_SetSoundProperties(u8 bankIdx, u8 entryIdx, u8 channelIdx) {
s8 reverb = 0;
f32 freqScale = 1.0f;
s8 panSigned = 0x40;
- u8 reverbFlg = 0;
+ u8 stereoBits = 0;
u8 sp39 = 0;
s8 sp38 = 0;
f32 sp34;
@@ -2781,17 +2781,17 @@ void Audio_SetSoundProperties(u8 bankIdx, u8 entryIdx, u8 channelIdx) {
sp34 = D_801305C4[(entry->unk_26 & 0x400) >> 10];
if (!(entry->unk_26 & 0x800)) {
if (*entry->posZ < sp34) {
- reverbFlg = 0x10;
+ stereoBits = 0x10;
}
- if ((D_8016B8B8[channelIdx].reverbFlg ^ reverbFlg) & 0x10) {
+ if ((D_8016B8B8[channelIdx].stereoBits ^ stereoBits) & 0x10) {
if (panSigned < 0x40) {
- reverbFlg = D_8016B8B8[channelIdx].reverbFlg ^ 0x14;
+ stereoBits = D_8016B8B8[channelIdx].stereoBits ^ 0x14;
} else {
- reverbFlg = D_8016B8B8[channelIdx].reverbFlg ^ 0x18;
+ stereoBits = D_8016B8B8[channelIdx].stereoBits ^ 0x18;
}
} else {
- reverbFlg = D_8016B8B8[channelIdx].reverbFlg;
+ stereoBits = D_8016B8B8[channelIdx].stereoBits;
}
}
}
@@ -2828,9 +2828,9 @@ void Audio_SetSoundProperties(u8 bankIdx, u8 entryIdx, u8 channelIdx) {
Audio_QueueCmdF32(0x4020000 | (channelIdx << 8), freqScale);
D_8016B8B8[channelIdx].freqScale = freqScale;
}
- if (reverbFlg != D_8016B8B8[channelIdx].reverbFlg) {
- Audio_QueueCmdS8(0xE020000 | (channelIdx << 8), reverbFlg | 0x10);
- D_8016B8B8[channelIdx].reverbFlg = reverbFlg;
+ if (stereoBits != D_8016B8B8[channelIdx].stereoBits) {
+ Audio_QueueCmdS8(0xE020000 | (channelIdx << 8), stereoBits | 0x10);
+ D_8016B8B8[channelIdx].stereoBits = stereoBits;
}
if (sp39 != D_8016B8B8[channelIdx].unk_0B) {
// CHAN_UPD_SCRIPT_IO (slot 3)
@@ -2860,7 +2860,7 @@ void func_800F3ED4(void) {
t->freqScale = 1.0f;
t->reverb = 0;
t->panSigned = 0x40;
- t->reverbFlg = 0;
+ t->stereoBits = 0;
t->unk_0B = 0xFF;
t->unk_0C = 0xFF;
}
diff --git a/src/code/ucode_disas.c b/src/code/ucode_disas.c
index 81301f2cc..00335dd20 100644
--- a/src/code/ucode_disas.c
+++ b/src/code/ucode_disas.c
@@ -283,3 +283,8 @@ void UCodeDisas_RegisterUCode(UCodeDisas* this, s32 count, UCodeInfo* ucodeArray
void UCodeDisas_SetCurUCode(UCodeDisas* this, void* ptr) {
UCodeDisas_SetCurUCodeImpl(this, ptr);
}
+
+// 4 bytes of nops, separating this file from audio_synthesis and padding .text
+// to a 32-byte boundary. Unclear what this comes from... maybe the audio
+// library was built separately and aligned to 32 bytes?
+#pragma GLOBAL_ASM("asm/non_matchings/code/ucode_disas/pad_800DACB0.s")