Anonymous

Changes

From Final Fantasy Inside

FF7/PSX/Sound/AKAO sequence

303 bytes removed, 22:24, 31 October 2020
no edit summary
=== Header (size: 16 bytes) ===
struct AkaoHeaderAkaoSeqHeader
{
static const uint8_t magic[4]; // "AKAO" C-string
uint16_t length; // data length - sizeof(header)
uint16_t reverb_type; // reverb type (range from 0 to 9)
struct AkaoTimeStamp timestamp; // creation time }; struct AkaoTimeStamp { uint8_t year_bcd; // year (in binary coded decimal) uint8_t month_bcd; // month (in binary coded decimal, between 0x01 - 0x12) uint8_t day_bcd; // day (in binary coded decimal, between 0x01 - 0x31) uint8_t hours_bcd; // hours (in binary coded decimal, between 0x00 - 0x23) uint8_t minutes_bcd; // minutes (in binary coded decimal, between 0x00 - 0x59) uint8_t seconds_bcd; // seconds (in binary coded decimal, between 0x00 - 0x59) } timestamp;
};
=== Channel info Info (size: 4 bytes + 2 bytes * <channels count>) ===
struct AkaoChannelInfo
{
uint32_t mask; // represents bitmask of used channels in this song
uint32_t uint16_t start_offsets[num_channels]; // offsets to channel opcode data
};
int num_channels = 0;
while (int bit = 0; bit < 24; bit++) if ((info.mask & 0xFFFFFF) & (1 << bit)) != 0; bit++) num_channels++;
First there is 32-bit number (offset 0x10), which represents bitmask of used channels in this song.
After this bitmask, there is <channels count> offsets to channel opcode data counting from current offset. Each offsets is a relative offset based on the address *next to* the offset itself. (This is a general rule for early versions of AKAO to interpret relative offsets.)
 
=== Channel Commands [AKAO Opcodes] ===
For every channels in an AKAO sequence, there is a set of commands to perform. This is similar to Field opcodes. Here I will call this sound commands "opcodes". Every opcode has its own number of arguments (from no-arguments, to 3 arguments).
=== Drum Instrument Map Table === When a song uses a drum kit with [[FF7/PSX/Sound/Opcodes/0xeced|opcode 0xEC]], a drum instrument map table will be placed at the end of the sequence. The table determines the instrument, channel volume and pan for each keys. The table consists of a repetition of 5-byte items.  struct AkaoDrumKeyAttr { uint8_t instrument; // corresponding to opcode 0xA1 uint8_t key; // note number when playing the drum note uint16_t volume; // corresponding to opcode 0xA8 (lower 8bit is a fractional part of the volume) uint8_t pan; // corresponding to opcode 0xAA } == Example (homeHome-created Created AKAO sequenceSequence): ==
=== Header ===
'''41 4b 41 4f''' - AKAO string
=== Channel info Info ===
'''01 00 00 00''' - this indicates, that used only one channel
=== Channel commands Commands ===
'''e8 a8 66''' - sets tempo, parameter 0x66a8
== Sound Opcode list List ==
{| class="wikitable"
|Load Instrument
|2
|instrument: byte(0-127)
|
|-
|-
|[[FF7/PSX/Sound/Opcodes/0xb4b5|0xB4]]
|Vibrato (Channel Pitch LFO (Vibrato)
|4
|delay: byte, rate: byte, type: byte (0-15)
|When <code>rate</code> is 0, it will be translated to 256 ticks.
The interpretation of the first parameter may change to depth depending on 0xF3.
|-
|[[FF7/PSX/Sound/Opcodes/0xb4b5|0xB5]]
|Channel Pitch LFO Vibrato Depth
|2
|depth: byte
|-
|[[FF7/PSX/Sound/Opcodes/0xb4b5|0xB6]]
|Turn Off Channel Pitch LFOVibrato
|1
|
|-
|[[FF7/PSX/Sound/Opcodes/0xb8b9|0xB8]]
|Tremolo (Channel Volume LFO (Tremolo)
|4
|delay: byte, rate: byte, type: byte (0-15)
|When <code>rate</code> is 0, it will be translated to 256 ticks.
The interpretation of the first parameter may change to depth depending on 0xF3.
|-
|[[FF7/PSX/Sound/Opcodes/0xb8b9|0xB9]]
|Channel Volume LFO Tremolo Depth
|2
|depth: byte
|-
|[[FF7/PSX/Sound/Opcodes/0xb8b9|0xBA]]
|Turn Off Channel Volume LFOTremolo
|1
|
|-
|[[FF7/PSX/Sound/Opcodes/0xdd|0xDD]]
|Channel Pitch LFO Vibrato Depth Slide
|3
|length: byte, depth: byte
|-
|[[FF7/PSX/Sound/Opcodes/0xde|0xDE]]
|Channel Volume LFO Tremolo Depth Slide
|3
|length: byte, depth: byte
|-
|[[FF7/PSX/Sound/Opcodes/0xf3|0xF3]]
|Use No Delay for Channel Pitch/Volume LFOUnknown
|1
|
|Specific to FF7. This instruction changes the interpretation of the 0xB4 and 0xB8 parameters. There is no actual use in music.
|-
|[[FF7/PSX/Sound/Opcodes/0xf4f5|0xF4]]
|-
|[[FF7/PSX/Sound/Opcodes/0xf4f5|0xF6]]
|Overlay Volume Balance of Overlay Voice
|2
|balance: byte (0-127)
|-
|[[FF7/PSX/Sound/Opcodes/0xf4f5|0xF7]]
|Overlay Volume Balance Slide of Overlay Voice
|3
|length: byte, balance: byte (0-127)
|[[FF7/PSX/Sound/Opcodes/0xfe|0xFE]]
|Measure Number
|23|measure: byteshort
|
|-
|Code-referenced to 0xA0. Should not be used.
|}
 
== Drum Instrument Map Table ==
 
When a song uses a drum kit with [[FF7/PSX/Sound/Opcodes/0xeced|opcode 0xEC]], a drum instrument map table will be placed at the end of the sequence. The table determines the instrument, channel volume and pan for each keys.
 
The table consists of a repetition of 5-byte items.
 
struct AkaoDrumNoteAttr
{
uint8_t instrument; // corresponding to opcode 0xA1
uint8_t note_number; // note number when playing the drum note
uint16_t volume; // corresponding to opcode 0xA8 (lower 8bit is a fractional part of the volume)
uint8_t pan; // corresponding to opcode 0xAA
}
17
edits