Anonymous

Changes

From Final Fantasy Inside

FF9/Sound/AKAO sequence

427 bytes added, 12:38, 30 July 2020
Fix AkaoChannelInfo mask bits
AkaoSeqHeader *header;
int num_channels = 0;
while (int bit = 0; header->bit < 32; bit++) if (info.mask & (1 << bit)) != 0; bit++) num_channels++;
There is <channels count> offsets to channel opcode data counting from current offset. Each offsets is a relative offset based on the address the offset itself.
|1
|
|The opcode indicates the note key and length. The note will be keyed off 2 ticks before the next note.
|-
|0x9A-0x9F
|-
|[[FF9/Sound/Opcodes/0xb4b5|0xB4]]
|Vibrato (Channel Pitch LFO (Vibrato)
|4
|delay: byte, rate: byte, type: byte (0-15)
|-
|[[FF9/Sound/Opcodes/0xb4b5|0xB5]]
|Channel Pitch LFO Vibrato Depth
|2
|depth: byte
|-
|[[FF9/Sound/Opcodes/0xb4b5|0xB6]]
|Turn Off Channel Pitch LFOVibrato
|1
|
|-
|[[FF9/Sound/Opcodes/0xb8b9|0xB8]]
|Tremolo (Channel Volume LFO (Tremolo)
|4
|delay: byte, rate: byte, type: byte (0-15)
|-
|[[FF9/Sound/Opcodes/0xb8b9|0xB9]]
|Channel Volume LFO Tremolo Depth
|2
|depth: byte
|-
|[[FF9/Sound/Opcodes/0xb8b9|0xBA]]
|Turn Off Channel Volume LFOTremolo
|1
|
|-
|[[FF9/Sound/Opcodes/0xdd|0xDD]]
|Channel Pitch LFO Vibrato Depth Slide
|3
|length: byte, depth: byte
|-
|[[FF9/Sound/Opcodes/0xde|0xDE]]
|Channel Volume LFO Tremolo Depth Slide
|3
|length: byte, depth: byte
|-
|[[FF9/Sound/Opcodes/0xe4|0xE4]]
|Channel Pitch LFO Vibrato Rate Slide
|3
|length: byte, rate: byte
|-
|[[FF9/Sound/Opcodes/0xe5|0xE5]]
|Channel Volume LFO Tremolo Rate Slide
|3
|length: byte, rate: byte
When <code>times</code> is 0, it will be translated to 256 times.
|-
|[[FF9FF7/PSX/Sound/Opcodes/0xa1|0xFE 0x0A]]|Load Instrument (With Some Unknown EffectNo Attack Sample)
|3
|instrument: byte
|Unlike 0xA1, the sample before the loop point is replaced by a short, silence sample.
|-
|[[FF9/Sound/Opcodes/0xfe0b|0xFE 0x0B]]
|-
|[[FF9/Sound/Opcodes/0xfe0e|0xFE 0x0E]]
|Subroutine JumpPattern
|4
|destination_offset: signed int16
|The subroutine Remember the return address and jump to the specified location. It cannot be nested. It will overwrite the return address.
|-
|[[FF9/Sound/Opcodes/0xfe0f|0xFE 0x0F]]
|Return from SubroutineEnd Pattern
|2
|
|Return from opcode 0xFE 0x0E.
|-
|[[FF9/Sound/Opcodes/0xfe10|0xFE 0x10]]
|UnknownAllocate Reserved Voices
|3
|valuecount: byte|Reserve the specified <code>count</code> of hardware voices. Reserved voices will not be used unless explicitly specified in opcode 0xFE 0x1D.
|-
|[[FF9/Sound/Opcodes/0xfe10|0xFE 0x11]]
|UnknownFree Reserved Voices
|2
|
|Clears Set the effect count of opcode 0xFE 0x10reserved voices to 0.
|-
|[[FF9/Sound/Opcodes/0xa3|0xFE 0x12]]
|3
|value: byte
|Obsoleted opcode? It As far as I learned from the assembly code, it probably does nothing.
|-
|[[FF9/Sound/Opcodes/0xfe1d|0xFE 0x1D]]
|UnknownUse Reserved Voices
|2
|
|Turn something onAllow using the reserved voices to play the sound of the current track. If they are all used, the remaining voices will instead be used normally. Use opcode [[FF9/Sound/Opcodes/0xfe10|0xFE 0x10]] to allocate reserved voices.
|-
|[[FF9/Sound/Opcodes/0xfe1e|0xFE 0x1E]]
|UnknownUse No Reserved Voices
|2
|
|Clears Disable the effect of opcode 0xFE 0x1D.
|-
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x1F]]
112
edits