diff --git a/asm/non_matchings/code/audio_load/func_800E12DC.s b/asm/non_matchings/code/audio_load/Audio_DmaSampleData.s similarity index 99% rename from asm/non_matchings/code/audio_load/func_800E12DC.s rename to asm/non_matchings/code/audio_load/Audio_DmaSampleData.s index f50c04d9b8..dfea00d6e8 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 9a46dd4962..0000000000 --- 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 c8bf3bf594..0000000000 --- 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 similarity index 100% rename from asm/non_matchings/code/audio_synthesis/pad_800DACB0.s rename to asm/non_matchings/code/ucode_disas/pad_800DACB0.s diff --git a/include/functions.h b/include/functions.h index e53a5a98b1..b00e402a11 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 0b008d10f1..ca85e79026 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 dabbf26d62..c3652c487d 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) \ +#define aEnvMixer(pkt, dmemi, count, swapLR, x0, x1, x2, x3, m, bits) \ { \ 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) \ -{ \ - 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 aab78500b2..1b9ad9caba 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 8c4ea64f75..1d264a1e77 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 62ffc50a56..3fa8a07882 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 a9ce8e9c2c..970aaf8f2e 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 = ¬e->playbackState.attributes; + attrs = ¬e->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 c4940a6b6a..64b8b95314 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 8e07ef0d89..cd686bf0b0 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); +#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); + extern s16 D_8012FBAA[]; +extern u32 D_801304A0; +extern u32 D_801304A4; +extern u32 D_801304A8; +extern u32 D_801304AC; +extern u8 D_801304C0[]; -// 4 nops, part of ucode_disas? -#pragma GLOBAL_ASM("asm/non_matchings/code/audio_synthesis/pad_800DACB0.s") - -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; - s32 temp_v1_5; - 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; - s32 phi_s3; - s32 phi_s1; - s32 phi_a1; - s32 phi_t1_3; - s32 phi_t0; - s32 phi_s4; - s32 phi_s0; - s32 phi_s5; +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_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; + s32 temp_v1_5; + s32 sp120; + s32 temp_v1_6; + 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 spCC; + s32 spC8; + u8* phi_a1; + s32 nParts; + s32 curPart; + s32 phi_t0; + 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; - sp8C = noteSubEu->bitField1.s.bookOffset; - sp88 = noteSubEu->bitField0.s.finished; - sp9C = &gAudioContext.notes[noteIdx]; - sp138 = 0; + bookOffset = noteSubEu->bitField1.s.bookOffset; + finished = noteSubEu->bitField0.s.finished; + note = &gAudioContext.notes[noteIndex]; + flags = A_CONTINUE; - if (noteSubEu->bitField0.s.needsInit == 1) { + 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; - - // OLD BLOCK 94 + 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 { - 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); + } + + 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 { + // 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; + spCC = 0x10; + spC8 = 0; + break; case 3: - spCC = 0x10; - spC8 = 0; 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; - break; - // OLD BLOCK 71 - // OLD BLOCK 78 - + nAdpcmSamplesProcessed = samplesLenAdjusted; + s5 = samplesLenAdjusted; + goto skip; 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_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 (synthState->restart) { - aSetLoop(cmd++, sp150->loop); - sp138 = 2; - synthState->restart = 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 (sp104 != 0) { - aDMEMMove(cmd++, phi_s4 + (phi_s3 * 2) + 0x580, phi_s5 + 0x580, - (((phi_s0 + phi_s6) - phi_s7) * 2)); - } - - 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; - } - - sp138 = 0; - break; - } + 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); - } else { - if (sp13C != 0) { - synthState->restart = 1; - synthState->samplePosInt = sp14C->start; + 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 { - synthState->samplePosInt += spFC; + phi_a1 = + Audio_DmaSampleData((u32)(spC8 + temp_mult + sampleAddr), ALIGN16((phi_s1 * spD4) + 0x10), + flags, &synthState->sampleDmaIndex, audioBankSample->medium); + } + + if (phi_a1 == NULL) { + return cmd; + } + + 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 (synthState->restart) { + aSetLoop(cmd++, audioBankSample->loop->state); + flags = A_LOOP; + synthState->restart = false; + } + + 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; + } + + if (nAdpcmSamplesProcessed != 0) { + aDMEMMove(cmd++, DMEM_UNCOMPRESSED_NOTE + phi_s4 + (phi_s3 * 2), DMEM_UNCOMPRESSED_NOTE + s5, + nSamplesInThisIteration * 2); + } + + 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; + } + + 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 (restart) { + synthState->restart = true; + synthState->samplePosInt = loopInfo->start; + } else { + 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; - - sp50 = synthState->samplePosFrac; - phi_t1 = sp50 & 0x7F; - - if (sp50 != reverVol) { - sp52 = (((reverVol & 0x7F) - phi_t1) << 9) / (aiBufLen >> 3); - synthState->samplePosFrac = reverVol; + if (targetVolLeft != curVolLeft) { + rampLeft = (targetVolLeft - curVolLeft) / (aiBufLen >> 3); } else { - sp52 = 0; + rampLeft = 0; + } + if (targetVolRight != curVolRight) { + rampRight = (targetVolRight - curVolRight) / (aiBufLen >> 3); + } else { + rampRight = 0; } - synthState->curVolLeft = curVolLeft + (phi_a3 * (aiBufLen >> 3)); - synthState->curVolRight = curVolRight + (phi_t0 * (aiBufLen >> 3)); + sourceReverbVol = synthState->reverbVol; + phi_t1 = sourceReverbVol & 0x7F; - if (noteSubEu->bitField1.s.hasTwoAdpcmParts) { - func_800DBB9C(cmd++, 0x5C0, 0x1A0); - func_800DBCD4(cmd++, phi_t1 * 2, sp52, phi_a3, phi_t0); + if (sourceReverbVol != reverbVol) { + rampReverb = (((reverbVol & 0x7F) - phi_t1) << 9) / (aiBufLen >> 3); + synthState->reverbVol = reverbVol; + } else { + rampReverb = 0; + } + + synthState->curVolLeft = curVolLeft + (rampLeft * (aiBufLen >> 3)); + synthState->curVolRight = curVolRight + (rampRight * (aiBufLen >> 3)); + + 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 70c4ab979c..b36cd0bdc2 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 7b9ee43877..e107dd93aa 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 81301f2ccd..00335dd20f 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")