17
edits
Changes
Jump to navigation
Jump to search
uint32_t uint16_t start_offsets[num_channels]; // offsets to channel opcode data
The interpretation of the first parameter may change to depth depending on 0xF3.
The interpretation of the first parameter may change to depth depending on 0xF3.
== 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 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
}
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
};
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.
|-
|[[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.
|-
|[[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.
|}