<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.ffrtt.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Loveemu</id>
	<title>Final Fantasy Inside - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.ffrtt.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Loveemu"/>
	<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php/Special:Contributions/Loveemu"/>
	<updated>2026-08-04T01:30:56Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.32.1</generator>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF9/Sound/AKAO_sequence&amp;diff=5775</id>
		<title>FF9/Sound/AKAO sequence</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF9/Sound/AKAO_sequence&amp;diff=5775"/>
		<updated>2020-07-30T09:38:31Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: Fix AkaoChannelInfo mask bits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
AKAO sequence is similar to MIDI sequence - it's custom tracker format for playing sequence sound, well tuned specially for PSX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
=== Header (size: 64 bytes) ===&lt;br /&gt;
&lt;br /&gt;
 struct AkaoSeqHeader&lt;br /&gt;
 {&lt;br /&gt;
   static const uint8_t magic[4];  // &amp;quot;AKAO&amp;quot; C-string&lt;br /&gt;
   uint16_t id;                    // song ID, used for playing sequence&lt;br /&gt;
   uint16_t length;                // data length (including this header)&lt;br /&gt;
   uint16_t reverb_type;           // reverb type (range from 0 to 9)&lt;br /&gt;
   uint8_t field_0A[6];&lt;br /&gt;
   uint32_t field_10;&lt;br /&gt;
   uint16_t sample_set_id;         // associated sample set ID&lt;br /&gt;
   uint16_t field_12;&lt;br /&gt;
   uint32_t field_14;&lt;br /&gt;
   uint32_t field_18;&lt;br /&gt;
   uint32_t field_1C;&lt;br /&gt;
   uint32_t mask;                  // represents bitmask of used channels in this song&lt;br /&gt;
   uint32_t field_24;&lt;br /&gt;
   uint32_t field_28;&lt;br /&gt;
   uint32_t field_2C;&lt;br /&gt;
   uint32_t instrument_map_offset; // relative offset to custom instrument map (0 if unused)&lt;br /&gt;
   uint32_t drum_map_offset;       // relative offset to custom drum map (0 if unused)&lt;br /&gt;
   uint32_t field_38;&lt;br /&gt;
   uint32_t field_3C;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
=== Channel Offsets (size: 2 bytes * &amp;lt;channels count&amp;gt;) ===&lt;br /&gt;
 struct AkaoChannelInfo&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t start_offsets[num_channels];  // offsets to channel opcode data&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 AkaoSeqHeader *header;&lt;br /&gt;
 int num_channels = 0;&lt;br /&gt;
 while (int bit = 0; bit &amp;lt; 32; bit++)&lt;br /&gt;
   if (info.mask &amp;amp; (1 &amp;lt;&amp;lt; bit)) != 0)&lt;br /&gt;
     num_channels++;&lt;br /&gt;
&lt;br /&gt;
There is &amp;lt;channels count&amp;gt; offsets to channel opcode data counting from current offset. Each offsets is a relative offset based on the address the offset itself.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Channel Commands [AKAO Opcodes] ===&lt;br /&gt;
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 &amp;quot;opcodes&amp;quot;. Every opcode has its own number of arguments.&lt;br /&gt;
&lt;br /&gt;
=== Custom Instrument Map Table ===&lt;br /&gt;
&lt;br /&gt;
When a song uses custom instruments with [[FF9/Sound/Opcodes/0xfe14|opcode 0xFE 0x14]], a custom instrument map table will be placed after the end of AKAO opcode sequence.&lt;br /&gt;
&lt;br /&gt;
This table consists of a collection of zones representing performance settings for a particular key range. A zone is an 8-byte item, and an instrument can have one or more regions.&lt;br /&gt;
&lt;br /&gt;
 struct AkaoInstrumentZoneAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t instrument;   // corresponding to opcode 0xA1&lt;br /&gt;
   uint8_t low_key;      // lowest key (in note number)&lt;br /&gt;
   uint8_t high_key;     // highest key (in note number)&lt;br /&gt;
   uint8_t ar;           // ADSR: attack rate (0-127)&lt;br /&gt;
   uint8_t sr;           // ADSR: sustain rate (0-127)&lt;br /&gt;
   uint8_t s_mode;       // ADSR: sustain mode (1: linear increase, 3: linear decrease, 5: exponential increase, 7: exponential decrease)&lt;br /&gt;
   uint8_t rr;           // ADSR: release rate (0-31)&lt;br /&gt;
   uint8_t volume;       // adjust the note volume to n/128 of the original volume (0 will keep the original volume)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
- Zones must be ordered from low key to high key&lt;br /&gt;
- The final zone of the instrument must be a terminator filled with 0s (more precisely, a zone with ADSR sustain mode of 0 is considered a terminator)&lt;br /&gt;
&lt;br /&gt;
=== Drum Instrument Map Table ===&lt;br /&gt;
&lt;br /&gt;
When a song uses a drum kit with [[FF9/Sound/Opcodes/0xfe04|opcode 0xFE 0x04]], 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.&lt;br /&gt;
&lt;br /&gt;
The table consists of a repetition of 8-byte items.&lt;br /&gt;
&lt;br /&gt;
 struct AkaoDrumKeyAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t instrument;   // corresponding to opcode 0xA1&lt;br /&gt;
   uint8_t key;          // note number when playing the drum note&lt;br /&gt;
   uint8_t ar;           // ADSR: attack rate (0-127)&lt;br /&gt;
   uint8_t sr;           // ADSR: sustain rate (0-127)&lt;br /&gt;
   uint8_t s_mode;       // ADSR: sustain mode (1: linear increase, 3: linear decrease, 5: exponential increase, 7: exponential decrease)&lt;br /&gt;
   uint8_t rr;           // ADSR: release rate (0-31)&lt;br /&gt;
   uint8_t volume;       // adjust the percussion volume to n/128 of the original volume (0 will keep the original volume)&lt;br /&gt;
   uint8_t pan : 7;      // corresponding to opcode 0xAA&lt;br /&gt;
   uint8_t reverb : 1;   // reverb on/off (0: off, 1: on)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sound Opcode List ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Opcode&lt;br /&gt;
! Summary&lt;br /&gt;
! Length&lt;br /&gt;
! Operands&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0x00-0x99]]&lt;br /&gt;
|Note, Tie, Rest&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|The opcode indicates the note key and length.&lt;br /&gt;
|-&lt;br /&gt;
|0x9A-0x9F&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xA0]]&lt;br /&gt;
|Finish Channel&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa1|0xA1]]&lt;br /&gt;
|Load Instrument&lt;br /&gt;
|2&lt;br /&gt;
|instrument: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0xA2]]&lt;br /&gt;
|Overwrite Next Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length: byte&lt;br /&gt;
|Ignores the regular length (delta-time) of the next note and overwrites it with the specified length.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xA3]]&lt;br /&gt;
|Channel Master Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa4|0xA4]]&lt;br /&gt;
|Pitch Bend Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, semitones: signed byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA5]]&lt;br /&gt;
|Set Octave&lt;br /&gt;
|2&lt;br /&gt;
|octave: byte (0-15)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA6]]&lt;br /&gt;
|Increase Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA7]]&lt;br /&gt;
|Decrease Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xA8]]&lt;br /&gt;
|Channel Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa9|0xA9]]&lt;br /&gt;
|Channel Volume Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xAA]]&lt;br /&gt;
|Channel Pan&lt;br /&gt;
|2&lt;br /&gt;
|pan: byte (0-127)&lt;br /&gt;
|64 is the center.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xab|0xAB]]&lt;br /&gt;
|Channel Pan Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, pan: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xac|0xAC]]&lt;br /&gt;
|Noise Clock Frequency&lt;br /&gt;
|2&lt;br /&gt;
|clock: byte (0x00-0x3f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAD]]&lt;br /&gt;
|ADSR: Attack Rate&lt;br /&gt;
|2&lt;br /&gt;
|attack_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAE]]&lt;br /&gt;
|ADSR: Decay Rate&lt;br /&gt;
|2&lt;br /&gt;
|decay_rate: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAF]]&lt;br /&gt;
|ADSR: Sustain Level&lt;br /&gt;
|2&lt;br /&gt;
|sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB0]]&lt;br /&gt;
|ADSR: Decay Rate &amp;amp; Sustain Level&lt;br /&gt;
|3&lt;br /&gt;
|decay_rate: byte (0x00-0x0f), sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB1]]&lt;br /&gt;
|ADSR: Sustain Rate&lt;br /&gt;
|2&lt;br /&gt;
|sustain_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB2]]&lt;br /&gt;
|ADSR: Release Rate&lt;br /&gt;
|2&lt;br /&gt;
|release_rate: byte (0x00-0x1f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB3]]&lt;br /&gt;
|ADSR: Reset ADSR&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB4]]&lt;br /&gt;
|Vibrato (Channel Pitch LFO)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB5]]&lt;br /&gt;
|Vibrato Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|The most significant bit of the &amp;lt;code&amp;gt;depth&amp;lt;/code&amp;gt; determines the amplitude range.&lt;br /&gt;
&lt;br /&gt;
When it is 0, the range is up to about ± 50 cents (amplitude is 15/256 compared with range type 1).&lt;br /&gt;
&lt;br /&gt;
When it is 1, the range is up to about ± 700 cents.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB6]]&lt;br /&gt;
|Turn Off Vibrato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB7]]&lt;br /&gt;
|ADSR: Attack Mode&lt;br /&gt;
|2&lt;br /&gt;
|attack_mode: byte (1 or 5)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xB8]]&lt;br /&gt;
|Tremolo (Channel Volume LFO)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xB9]]&lt;br /&gt;
|Tremolo Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xBA]]&lt;br /&gt;
|Turn Off Tremolo&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xBB]]&lt;br /&gt;
|ADSR: Sustain Mode&lt;br /&gt;
|2&lt;br /&gt;
|sustain_mode: byte (1, 3, 5 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBC]]&lt;br /&gt;
|Channel Pan LFO&lt;br /&gt;
|3&lt;br /&gt;
|rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBD]]&lt;br /&gt;
|Channel Pan LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBE]]&lt;br /&gt;
|Turn Off Channel Pan LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbf|0xBF]]&lt;br /&gt;
|ADSR: Release Mode&lt;br /&gt;
|2&lt;br /&gt;
|release_mode: byte (3 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc0c1|0xC0]]&lt;br /&gt;
|Channel Transpose (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc0c1|0xC1]]&lt;br /&gt;
|Channel Transpose (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc2c3|0xC2]]&lt;br /&gt;
|Turn On Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc2c3|0xC3]]&lt;br /&gt;
|Turn Off Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc4c5|0xC4]]&lt;br /&gt;
|Turn On Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc4c5|0xC5]]&lt;br /&gt;
|Turn Off Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc6c7|0xC6]]&lt;br /&gt;
|Turn On Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc6c7|0xC7]]&lt;br /&gt;
|Turn Off Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xC8]]&lt;br /&gt;
|Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Remember the current offset as a loop point and increase the nesting level of the loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xC9]]&lt;br /&gt;
|Return to Loop Point Up to N Times&lt;br /&gt;
|2&lt;br /&gt;
|times: byte&lt;br /&gt;
|On the Nth repeat, this instruction will end the current loop by decrementing the nesting level of the loop. Otherwise, it will increment the loop counter and return to the loop point.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xCA]]&lt;br /&gt;
|Return to Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will increment the loop counter.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcb|0xCB]]&lt;br /&gt;
|Reset Sound Effects&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Reset sound effects such as noise, frequency modulation, reverb, overlay voice and alternate voice.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcccd|0xCC]]&lt;br /&gt;
|Turn On Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key on and key off performance of the subsequent notes and update the pitch only.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcccd|0xCD]]&lt;br /&gt;
|Turn Off Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcecf|0xCE]]&lt;br /&gt;
|Turn On Noise and Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcecf|0xCF]]&lt;br /&gt;
|Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd0d1|0xD0]]&lt;br /&gt;
|Turn On Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key off performance of the subsequent notes.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd0d1|0xD1]]&lt;br /&gt;
|Turn Off Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd2d3|0xD2]]&lt;br /&gt;
|Turn On Frequency Modulation and Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd2d3|0xD3]]&lt;br /&gt;
|Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd4d5|0xD4]]&lt;br /&gt;
|Turn On Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Duplicate and use the playback frequency of the previous voice channel.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd4d5|0xD5]]&lt;br /&gt;
|Turn Off Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd6d7|0xD6]]&lt;br /&gt;
|Turn On Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Multiply the playback frequency of the previous voice channel to the output volume. Lower pitch will make the volume smaller.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd6d7|0xD7]]&lt;br /&gt;
|Turn Off Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd8d9|0xD8]]&lt;br /&gt;
|Channel Fine Tuning (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The pitch can be changed in the range of one octave above and below.&lt;br /&gt;
The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is the multiplicand for the playback frequency, not a log-based parameter like cents. For example, when the &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is 127, the pitch will be multiplied by 127/128 (about +1 octave). Negative value ​​will lower the pitch.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd8d9|0xD9]]&lt;br /&gt;
|Channel Fine Tuning (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; will be added to the current tuning amount.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdadb|0xDA]]&lt;br /&gt;
|Turn On Portamento&lt;br /&gt;
|2&lt;br /&gt;
|speed: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;speed&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdadb|0xDB]]&lt;br /&gt;
|Turn Off Portamento&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0xDC]]&lt;br /&gt;
|Fix Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length_to_add: signed byte&lt;br /&gt;
|Ignore the regular length (delta-time) of subsequent notes and set to the fixed length. The &amp;lt;code&amp;gt;length_to_add&amp;lt;/code&amp;gt; parameter will be added to the current length value. (the initial value is 0)&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdd|0xDD]]&lt;br /&gt;
|Vibrato Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xde|0xDE]]&lt;br /&gt;
|Tremolo Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdf|0xDF]]&lt;br /&gt;
|Channel Pan LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe0|0xE0]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe1|0xE1]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|value: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe2|0xE2]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Clears the effect of opcode 0xE1&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe3|0xE3]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe4|0xE4]]&lt;br /&gt;
|Vibrato Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe5|0xE5]]&lt;br /&gt;
|Tremolo Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe6|0xE6]]&lt;br /&gt;
|Channel Pan LFO Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xE7-0xEF]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xf0fd|0xF0-0xFD]]&lt;br /&gt;
|Note, Tie, Rest with Length&lt;br /&gt;
|2&lt;br /&gt;
|length: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe00|0xFE 0x00]]&lt;br /&gt;
|Tempo&lt;br /&gt;
|4&lt;br /&gt;
|tempo: uint16&lt;br /&gt;
|bpm = tempo / 218.453333 (approximate)&lt;br /&gt;
More strictly, &amp;lt;code&amp;gt;bpm = 60.0 / (48 * (65536.0 / tempo) * (0x43D1 / (33868800.0 / 8)))&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe00|0xFE 0x01]]&lt;br /&gt;
|Tempo Slide&lt;br /&gt;
|5&lt;br /&gt;
|length: byte, tempo: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe02|0xFE 0x02]]&lt;br /&gt;
|Reverb Depth&lt;br /&gt;
|4&lt;br /&gt;
|depth: uint16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe02|0xFE 0x03]]&lt;br /&gt;
|Reverb Depth Slide&lt;br /&gt;
|5&lt;br /&gt;
|length: byte, depth: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe04|0xFE 0x04]]&lt;br /&gt;
|Turn On Drum Mode&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|The drum map offset is recorded in the file header.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe04|0xFE 0x05]]&lt;br /&gt;
|Turn Off Drum Mode&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe06|0xFE 0x06]]&lt;br /&gt;
|Unconditional Jump&lt;br /&gt;
|4&lt;br /&gt;
|destination_offset: signed int16&lt;br /&gt;
|This instruction can be used to make an infinite loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe07|0xFE 0x07]]&lt;br /&gt;
|CPU-Conditional Jump&lt;br /&gt;
|5&lt;br /&gt;
|condition: byte, destination_offset: signed int16&lt;br /&gt;
|Jump if the condition variable matches &amp;lt;code&amp;gt;condition&amp;lt;/code&amp;gt;. The value of the condition variable can be set from the game program.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe08|0xFE 0x08]]&lt;br /&gt;
|Jump on the Nth Repeat&lt;br /&gt;
|5&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe08|0xFE 0x09]]&lt;br /&gt;
|Break the Loop on the Nth Repeat&lt;br /&gt;
|5&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|Unlike 0xF0, this instruction will end the current loop by decrementing the nesting level of the loop.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa1|0xFE 0x0A]]&lt;br /&gt;
|Load Instrument (No Attack Sample)&lt;br /&gt;
|3&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|Unlike 0xA1, the sample before the loop point is replaced by a short, silence sample.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0b|0xFE 0x0B]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|6&lt;br /&gt;
|offset: signed int16, offset2: signed int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x0C-0x0D]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0e|0xFE 0x0E]]&lt;br /&gt;
|Pattern&lt;br /&gt;
|4&lt;br /&gt;
|destination_offset: signed int16&lt;br /&gt;
|Remember the return address and jump to the specified location. It cannot be nested.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0f|0xFE 0x0F]]&lt;br /&gt;
|End Pattern&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Return from opcode 0xFE 0x0E.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe10|0xFE 0x10]]&lt;br /&gt;
|Allocate Reserved Voices&lt;br /&gt;
|3&lt;br /&gt;
|count: byte&lt;br /&gt;
|Reserve the specified &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; of hardware voices. Reserved voices will not be used unless explicitly specified in opcode 0xFE 0x1D.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe10|0xFE 0x11]]&lt;br /&gt;
|Free Reserved Voices&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Set the count of reserved voices to 0.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa3|0xFE 0x12]]&lt;br /&gt;
|Channel Master Volume Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x13]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe14|0xFE 0x14]]&lt;br /&gt;
|Load Custom Instrument (Key-Split Instrument)&lt;br /&gt;
|3&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|The custom instrument number corresponds to the custom instrument map pointed from the file header. Note that the number is different from the regular sample number used in opcode 0xA1.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe15|0xFE 0x15]]&lt;br /&gt;
|Time Signature&lt;br /&gt;
|4&lt;br /&gt;
|ticks_per_beat: byte, beats_per_measure: byte&lt;br /&gt;
|Note that two parameters can be 0. This pattern is used for initialization.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe16|0xFE 0x16]]&lt;br /&gt;
|Measure Number&lt;br /&gt;
|3&lt;br /&gt;
|measure: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x17-0x18]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa9|0xFE 0x19]]&lt;br /&gt;
|Channel Volume Slide Per Note On&lt;br /&gt;
|4&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|Applies volume slide (opcode 0xA9) for each notes. When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1a|0xFE 0x1A]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Turn something on.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1b|0xFE 0x1B]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Clears the effect of opcode 0xFE 0x1A.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1c|0xFE 0x1C]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|3&lt;br /&gt;
|value: byte&lt;br /&gt;
|Obsoleted opcode? As far as I learned from the assembly code, it probably does nothing.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1d|0xFE 0x1D]]&lt;br /&gt;
|Use Reserved Voices&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Allow 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.&lt;br /&gt;
&lt;br /&gt;
Use opcode [[FF9/Sound/Opcodes/0xfe10|0xFE 0x10]] to allocate reserved voices.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1e|0xFE 0x1E]]&lt;br /&gt;
|Use No Reserved Voices&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Disable the effect of opcode 0xFE 0x1D.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x1F]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|0xFE 0x20-0xFF&lt;br /&gt;
|Unimplemented (Out of Range)&lt;br /&gt;
|n/a&lt;br /&gt;
|&lt;br /&gt;
|Do not use.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFF]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/AKAO_sequence&amp;diff=5774</id>
		<title>FF7/PSX/Sound/AKAO sequence</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/AKAO_sequence&amp;diff=5774"/>
		<updated>2020-07-30T09:36:58Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: Fix AkaoChannelInfo mask bits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
AKAO sequence is the most complicated part of the FF7 sound system. (&amp;quot;AKAO&amp;quot; is the signature string, which implies that the sound format has developed by Square Enix sound programmer Minoru Akao.)&lt;br /&gt;
&lt;br /&gt;
AKAO sequence is similar to MIDI sequence - it's custom tracker format for playing sequence sound, well tuned specially for PSX.&lt;br /&gt;
&lt;br /&gt;
The sequence data can be found in all FF7 game modules: Field, Battle, Worldmap and in minigames.&lt;br /&gt;
&lt;br /&gt;
All files with exension *.SND are AKAO.&lt;br /&gt;
&lt;br /&gt;
* '''MINI/ASERI2.SND''' - Battle Arena theme&lt;br /&gt;
* '''MINI/SENSUI.SND''' - used in Submarine minigame&lt;br /&gt;
* '''ENEMY6/OVER2.SND''' - game over sequence&lt;br /&gt;
* '''ENEMY6/FAN2.SND''' - battle win &amp;quot;fanfare&amp;quot; sequence&lt;br /&gt;
* '''MOVIE/OVER2.SND''' - same game over sequence, don't know, why to duplicate data&lt;br /&gt;
&lt;br /&gt;
Other AKAO sequences are hard-wired in other files.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
=== Header (size: 16 bytes) ===&lt;br /&gt;
&lt;br /&gt;
 struct AkaoSeqHeader&lt;br /&gt;
 {&lt;br /&gt;
   static const uint8_t magic[4];  // &amp;quot;AKAO&amp;quot; C-string&lt;br /&gt;
   uint16_t id;                    // song ID, used for playing sequence&lt;br /&gt;
   uint16_t length;                // data length - sizeof(header)&lt;br /&gt;
   uint16_t reverb_type;           // reverb type (range from 0 to 9)&lt;br /&gt;
   struct AkaoTimeStamp timestamp; // creation time&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoTimeStamp&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t year_bcd;               // year (in binary coded decimal)&lt;br /&gt;
   uint8_t month_bcd;              // month (in binary coded decimal, between 0x01 - 0x12)&lt;br /&gt;
   uint8_t day_bcd;                // day (in binary coded decimal, between 0x01 - 0x31)&lt;br /&gt;
   uint8_t hours_bcd;              // hours (in binary coded decimal, between 0x00 - 0x23)&lt;br /&gt;
   uint8_t minutes_bcd;            // minutes (in binary coded decimal, between 0x00 - 0x59)&lt;br /&gt;
   uint8_t seconds_bcd;            // seconds (in binary coded decimal, between 0x00 - 0x59)&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
=== Channel Info (size: 4 bytes + 2 bytes * &amp;lt;channels count&amp;gt;) ===&lt;br /&gt;
 struct AkaoChannelInfo&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t mask;                         // represents bitmask of used channels in this song&lt;br /&gt;
   uint32_t start_offsets[num_channels];  // offsets to channel opcode data&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 int num_channels = 0;&lt;br /&gt;
 while (int bit = 0; bit &amp;lt; 24; bit++)&lt;br /&gt;
   if ((info.mask &amp;amp; 0xFFFFFF) &amp;amp; (1 &amp;lt;&amp;lt; bit)) != 0)&lt;br /&gt;
     num_channels++;&lt;br /&gt;
&lt;br /&gt;
First there is 32-bit number (offset 0x10), which represents bitmask of used channels in this song.&lt;br /&gt;
&lt;br /&gt;
After this bitmask, there is &amp;lt;channels count&amp;gt; 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.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Channel Commands [AKAO Opcodes] ===&lt;br /&gt;
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 &amp;quot;opcodes&amp;quot;. Every opcode has its own number of arguments (from no-arguments, to 3 arguments).&lt;br /&gt;
&lt;br /&gt;
=== Drum Instrument Map Table ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
The table consists of a repetition of 5-byte items.&lt;br /&gt;
&lt;br /&gt;
 struct AkaoDrumKeyAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t instrument;   // corresponding to opcode 0xA1&lt;br /&gt;
   uint8_t key;          // note number when playing the drum note&lt;br /&gt;
   uint16_t volume;      // corresponding to opcode 0xA8 (lower 8bit is a fractional part of the volume)&lt;br /&gt;
   uint8_t pan;          // corresponding to opcode 0xAA&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Example (Home-Created AKAO Sequence): ==&lt;br /&gt;
=== Header ===&lt;br /&gt;
'''41 4b 41 4f''' - AKAO string&lt;br /&gt;
&lt;br /&gt;
'''34 12''' - song ID: 0x1234&lt;br /&gt;
&lt;br /&gt;
'''16 00''' - data length 0x16 in hex or 22 in decimal&lt;br /&gt;
&lt;br /&gt;
'''04 00''' - reverb type: 4 (large studio)&lt;br /&gt;
&lt;br /&gt;
'''96 12 18 22 46 28''' - created at 1996-12-18 22:46:28&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Channel Info ===&lt;br /&gt;
'''01 00 00 00''' - this indicates, that used only one channel&lt;br /&gt;
&lt;br /&gt;
'''00 00''' - offset to first channel opcodes: in our example 0x00 means that next to this offset is opcodes for first channel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Channel Commands ===&lt;br /&gt;
'''e8 a8 66''' - sets tempo, parameter 0x66a8&lt;br /&gt;
&lt;br /&gt;
'''ea 00 50''' - sets reverb depth&lt;br /&gt;
&lt;br /&gt;
'''a8 55''' - load sample 0x55 from INSTR.ALL to channel&lt;br /&gt;
&lt;br /&gt;
'''aa 40''' - sets channel volume&lt;br /&gt;
&lt;br /&gt;
'''c2''' - turns on reverb effect&lt;br /&gt;
&lt;br /&gt;
'''a1 0c''' - sets volume pan&lt;br /&gt;
&lt;br /&gt;
'''c8''' - sets loop point&lt;br /&gt;
&lt;br /&gt;
'''66''' - 0x66 % 11 = 3 (3 means to take 3rd number from play length table), 0x66 / 11 = 9 (9 means to take pitch[9] from loaded instrument record index)&lt;br /&gt;
&lt;br /&gt;
'''ca''' - returns to saved loop point with opcode c8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This example plays Chocobo &amp;quot;Whoo-Hoo&amp;quot; (instrument number 0x55) repeatedly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sound Opcode List ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Opcode&lt;br /&gt;
! Summary&lt;br /&gt;
! Length&lt;br /&gt;
! Operands&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0x0099|0x00-0x99]]&lt;br /&gt;
|Note, Tie, Rest&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|The opcode indicates the note key and length. The note will be keyed off 2 ticks before the next note.&lt;br /&gt;
|-&lt;br /&gt;
|0x9A-0x9F&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa0|0xA0]]&lt;br /&gt;
|Finish Channel&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa1|0xA1]]&lt;br /&gt;
|Load Instrument&lt;br /&gt;
|2&lt;br /&gt;
|instrument: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0x0099|0xA2]]&lt;br /&gt;
|Overwrite Next Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length: byte&lt;br /&gt;
|Ignores the regular length (delta-time) of the next note and overwrites it with the specified length.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa8aa|0xA3]]&lt;br /&gt;
|Channel Master Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa4|0xA4]]&lt;br /&gt;
|Pitch Bend Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, semitones: signed byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa5|0xA5]]&lt;br /&gt;
|Set Octave&lt;br /&gt;
|2&lt;br /&gt;
|octave: byte (0-15)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa5|0xA6]]&lt;br /&gt;
|Increase Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa5|0xA7]]&lt;br /&gt;
|Decrease Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa8aa|0xA8]]&lt;br /&gt;
|Channel Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa9|0xA9]]&lt;br /&gt;
|Channel Volume Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa8aa|0xAA]]&lt;br /&gt;
|Channel Pan&lt;br /&gt;
|2&lt;br /&gt;
|pan: byte (0-127)&lt;br /&gt;
|64 is the center.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xab|0xAB]]&lt;br /&gt;
|Channel Pan Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, pan: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xac|0xAC]]&lt;br /&gt;
|Noise Clock Frequency&lt;br /&gt;
|2&lt;br /&gt;
|clock: byte (0x00-0x3f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xAD]]&lt;br /&gt;
|ADSR: Attack Rate&lt;br /&gt;
|2&lt;br /&gt;
|attack_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xAE]]&lt;br /&gt;
|ADSR: Decay Rate&lt;br /&gt;
|2&lt;br /&gt;
|decay_rate: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xAF]]&lt;br /&gt;
|ADSR: Sustain Level&lt;br /&gt;
|2&lt;br /&gt;
|sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xB0]]&lt;br /&gt;
|ADSR: Decay Rate &amp;amp; Sustain Level&lt;br /&gt;
|3&lt;br /&gt;
|decay_rate: byte (0x00-0x0f), sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xB1]]&lt;br /&gt;
|ADSR: Sustain Rate&lt;br /&gt;
|2&lt;br /&gt;
|sustain_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xB2]]&lt;br /&gt;
|ADSR: Release Rate&lt;br /&gt;
|2&lt;br /&gt;
|release_rate: byte (0x00-0x1f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xB3]]&lt;br /&gt;
|ADSR: Reset ADSR&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb4b5|0xB4]]&lt;br /&gt;
|Vibrato (Channel Pitch LFO)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb4b5|0xB5]]&lt;br /&gt;
|Vibrato Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|The most significant bit of the &amp;lt;code&amp;gt;depth&amp;lt;/code&amp;gt; determines the amplitude range.&lt;br /&gt;
&lt;br /&gt;
When it is 0, the range is up to about ± 50 cents (amplitude is 15/256 compared with range type 1).&lt;br /&gt;
&lt;br /&gt;
When it is 1, the range is up to about ± 700 cents.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb4b5|0xB6]]&lt;br /&gt;
|Turn Off Vibrato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xB7]]&lt;br /&gt;
|ADSR: Attack Mode&lt;br /&gt;
|2&lt;br /&gt;
|attack_mode: byte (1 or 5)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb8b9|0xB8]]&lt;br /&gt;
|Tremolo (Channel Volume LFO)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb8b9|0xB9]]&lt;br /&gt;
|Tremolo Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb8b9|0xBA]]&lt;br /&gt;
|Turn Off Tremolo&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xBB]]&lt;br /&gt;
|ADSR: Sustain Mode&lt;br /&gt;
|2&lt;br /&gt;
|sustain_mode: byte (1, 3, 5 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xbcbd|0xBC]]&lt;br /&gt;
|Channel Pan LFO&lt;br /&gt;
|3&lt;br /&gt;
|rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xbcbd|0xBD]]&lt;br /&gt;
|Channel Pan LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xbcbd|0xBE]]&lt;br /&gt;
|Turn Off Channel Pan LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xbf|0xBF]]&lt;br /&gt;
|ADSR: Release Mode&lt;br /&gt;
|2&lt;br /&gt;
|release_mode: byte (3 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc0c1|0xC0]]&lt;br /&gt;
|Channel Transpose (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc0c1|0xC1]]&lt;br /&gt;
|Channel Transpose (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc2c3|0xC2]]&lt;br /&gt;
|Turn On Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc2c3|0xC3]]&lt;br /&gt;
|Turn Off Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc4c5|0xC4]]&lt;br /&gt;
|Turn On Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc4c5|0xC5]]&lt;br /&gt;
|Turn Off Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc6c7|0xC6]]&lt;br /&gt;
|Turn On Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc6c7|0xC7]]&lt;br /&gt;
|Turn Off Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc8c9|0xC8]]&lt;br /&gt;
|Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Remember the current offset as a loop point and increase the nesting level of the loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc8c9|0xC9]]&lt;br /&gt;
|Return to Loop Point Up to N Times&lt;br /&gt;
|2&lt;br /&gt;
|times: byte&lt;br /&gt;
|On the Nth repeat, this instruction will end the current loop by decrementing the nesting level of the loop. Otherwise, it will increment the loop counter and return to the loop point.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc8c9|0xCA]]&lt;br /&gt;
|Return to Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will increment the loop counter.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xcb|0xCB]]&lt;br /&gt;
|Reset Sound Effects&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Reset sound effects such as noise, frequency modulation, reverb, overlay voice and alternate voice.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xcccd|0xCC]]&lt;br /&gt;
|Turn On Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key on and key off performance of the subsequent notes and update the pitch only.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xcccd|0xCD]]&lt;br /&gt;
|Turn Off Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xcecf|0xCE]]&lt;br /&gt;
|Turn On Noise and Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xcecf|0xCF]]&lt;br /&gt;
|Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd0d1|0xD0]]&lt;br /&gt;
|Turn On Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key off performance of the subsequent notes.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd0d1|0xD1]]&lt;br /&gt;
|Turn Off Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd2d3|0xD2]]&lt;br /&gt;
|Turn On Frequency Modulation and Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd2d3|0xD3]]&lt;br /&gt;
|Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd4d5|0xD4]]&lt;br /&gt;
|Turn On Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Duplicate and use the playback frequency of the previous voice channel.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd4d5|0xD5]]&lt;br /&gt;
|Turn Off Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd6d7|0xD6]]&lt;br /&gt;
|Turn On Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Multiply the playback frequency of the previous voice channel to the output volume. Lower pitch will make the volume smaller.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd6d7|0xD7]]&lt;br /&gt;
|Turn Off Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd8d9|0xD8]]&lt;br /&gt;
|Channel Fine Tuning (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The pitch can be changed in the range of one octave above and below.&lt;br /&gt;
The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is the multiplicand for the playback frequency, not a log-based parameter like cents. For example, when the &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is 127, the pitch will be multiplied by 127/128 (about +1 octave). Negative value ​​will lower the pitch.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd8d9|0xD9]]&lt;br /&gt;
|Channel Fine Tuning (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; will be added to the current tuning amount.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xdadb|0xDA]]&lt;br /&gt;
|Turn On Portamento&lt;br /&gt;
|2&lt;br /&gt;
|speed: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;speed&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xdadb|0xDB]]&lt;br /&gt;
|Turn Off Portamento&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0x0099|0xDC]]&lt;br /&gt;
|Fix Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length_to_add: signed byte&lt;br /&gt;
|Ignore the regular length (delta-time) of subsequent notes and set to the fixed length. The &amp;lt;code&amp;gt;length_to_add&amp;lt;/code&amp;gt; parameter will be added to the current length value. (the initial value is 0)&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xdd|0xDD]]&lt;br /&gt;
|Vibrato Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xde|0xDE]]&lt;br /&gt;
|Tremolo Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xdf|0xDF]]&lt;br /&gt;
|Channel Pan LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa0|0xE0-0xE7]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xe8e9|0xE8]]&lt;br /&gt;
|Tempo&lt;br /&gt;
|3&lt;br /&gt;
|tempo: uint16&lt;br /&gt;
|bpm = tempo / 214.998204 (approximate)&lt;br /&gt;
More strictly, &amp;lt;code&amp;gt;bpm = 60.0 / (48 * (65536.0 / tempo) * (0x44E8 / (33868800.0 / 8)))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that this coefficient is different from other games with PlayStation AKAO.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xe8e9|0xE9]]&lt;br /&gt;
|Tempo Slide&lt;br /&gt;
|4&lt;br /&gt;
|length: byte, tempo: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xeaeb|0xEA]]&lt;br /&gt;
|Reverb Depth&lt;br /&gt;
|3&lt;br /&gt;
|depth: uint16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xeaeb|0xEB]]&lt;br /&gt;
|Reverb Depth Slide&lt;br /&gt;
|4&lt;br /&gt;
|length: byte, depth: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xeced|0xEC]]&lt;br /&gt;
|Turn On Drum Mode&lt;br /&gt;
|3&lt;br /&gt;
|drum_map_offset: signed int16&lt;br /&gt;
|The &amp;lt;code&amp;gt;drum_map_offset&amp;lt;/code&amp;gt; is a relative offset pointing to the drum instrument map table, which determines the instrument for each keys.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xeced|0xED]]&lt;br /&gt;
|Turn Off Drum Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xee|0xEE]]&lt;br /&gt;
|Unconditional Jump&lt;br /&gt;
|3&lt;br /&gt;
|destination_offset: signed int16&lt;br /&gt;
|This instruction can be used to make an infinite loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xef|0xEF]]&lt;br /&gt;
|CPU-Conditional Jump&lt;br /&gt;
|4&lt;br /&gt;
|condition: byte, destination_offset: signed int16&lt;br /&gt;
|Jump if the condition variable matches &amp;lt;code&amp;gt;condition&amp;lt;/code&amp;gt;. The value of the condition variable can be set from the game program.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf0f1|0xF0]]&lt;br /&gt;
|Jump on the Nth Repeat&lt;br /&gt;
|4&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf0f1|0xF1]]&lt;br /&gt;
|Break the Loop on the Nth Repeat&lt;br /&gt;
|4&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|Unlike 0xF0, this instruction will end the current loop by decrementing the nesting level of the loop.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa1|0xF2]]&lt;br /&gt;
|Load Instrument (No Attack Sample)&lt;br /&gt;
|2&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|Unlike 0xA1, the sample before the loop point is replaced by a short, silence sample.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf3|0xF3]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|There is no actual use in music.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf4f5|0xF4]]&lt;br /&gt;
|Turn On Overlay Voice&lt;br /&gt;
|3&lt;br /&gt;
|instrument: byte, instrument2: byte&lt;br /&gt;
|Play the same melody by different instruments on two voice channels. A free voice channel is required to work. Note that the two channels share the playback rate, and the pitch is not calculated for each instruments.&lt;br /&gt;
Used in the song &amp;quot;Anxious Heart&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf4f5|0xF5]]&lt;br /&gt;
|Turn Off Overlay Voice&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf4f5|0xF6]]&lt;br /&gt;
|Overlay Volume Balance&lt;br /&gt;
|2&lt;br /&gt;
|balance: byte (0-127)&lt;br /&gt;
|When the balance is 0, the volume of the primary voice will be 100% (127/128) of original and that of the secondary voice will be 0%. 127 is the opposite.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf4f5|0xF7]]&lt;br /&gt;
|Overlay Volume Balance Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, balance: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf8f9|0xF8]]&lt;br /&gt;
|Turn On Alternate Voice&lt;br /&gt;
|2&lt;br /&gt;
|release_rate: byte (0x00-0x1f)&lt;br /&gt;
|This instruction allows subsequent notes to be played on two alternating channels. At the same time, the ADSR release rate will be set to the specified value. A free voice channel is required to work. &lt;br /&gt;
Check &amp;quot;Opening - Bombing Mission&amp;quot;, &amp;quot;Tifa's Theme&amp;quot; and &amp;quot;Fortress of the Condor&amp;quot; for actual usage.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf8f9|0xF9]]&lt;br /&gt;
|Turn Off Alternate Voice&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa0|0xFA-0xFC]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xfd|0xFD]]&lt;br /&gt;
|Time Signature&lt;br /&gt;
|3&lt;br /&gt;
|ticks_per_beat: byte, beats_per_measure: byte&lt;br /&gt;
|Note that two parameters can be 0. This pattern is used for initialization.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xfe|0xFE]]&lt;br /&gt;
|Measure Number&lt;br /&gt;
|2&lt;br /&gt;
|measure: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa0|0xFF]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF9/Sound/AKAO_sequence&amp;diff=5773</id>
		<title>FF9/Sound/AKAO sequence</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF9/Sound/AKAO_sequence&amp;diff=5773"/>
		<updated>2020-07-25T07:54:00Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: &amp;quot;The note will be keyed off 2 ticks before the next note.&amp;quot; Lied. This cannot be applied to the late version of AKAO.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
AKAO sequence is similar to MIDI sequence - it's custom tracker format for playing sequence sound, well tuned specially for PSX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
=== Header (size: 64 bytes) ===&lt;br /&gt;
&lt;br /&gt;
 struct AkaoSeqHeader&lt;br /&gt;
 {&lt;br /&gt;
   static const uint8_t magic[4];  // &amp;quot;AKAO&amp;quot; C-string&lt;br /&gt;
   uint16_t id;                    // song ID, used for playing sequence&lt;br /&gt;
   uint16_t length;                // data length (including this header)&lt;br /&gt;
   uint16_t reverb_type;           // reverb type (range from 0 to 9)&lt;br /&gt;
   uint8_t field_0A[6];&lt;br /&gt;
   uint32_t field_10;&lt;br /&gt;
   uint16_t sample_set_id;         // associated sample set ID&lt;br /&gt;
   uint16_t field_12;&lt;br /&gt;
   uint32_t field_14;&lt;br /&gt;
   uint32_t field_18;&lt;br /&gt;
   uint32_t field_1C;&lt;br /&gt;
   uint32_t mask;                  // represents bitmask of used channels in this song&lt;br /&gt;
   uint32_t field_24;&lt;br /&gt;
   uint32_t field_28;&lt;br /&gt;
   uint32_t field_2C;&lt;br /&gt;
   uint32_t instrument_map_offset; // relative offset to custom instrument map (0 if unused)&lt;br /&gt;
   uint32_t drum_map_offset;       // relative offset to custom drum map (0 if unused)&lt;br /&gt;
   uint32_t field_38;&lt;br /&gt;
   uint32_t field_3C;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
=== Channel Offsets (size: 2 bytes * &amp;lt;channels count&amp;gt;) ===&lt;br /&gt;
 struct AkaoChannelInfo&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t start_offsets[num_channels];  // offsets to channel opcode data&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 AkaoSeqHeader *header;&lt;br /&gt;
 int num_channels = 0;&lt;br /&gt;
 while (int bit = 0; header-&amp;gt;mask &amp;amp; (1 &amp;lt;&amp;lt; bit)) != 0; bit++)&lt;br /&gt;
   num_channels++;&lt;br /&gt;
&lt;br /&gt;
There is &amp;lt;channels count&amp;gt; offsets to channel opcode data counting from current offset. Each offsets is a relative offset based on the address the offset itself.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Channel Commands [AKAO Opcodes] ===&lt;br /&gt;
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 &amp;quot;opcodes&amp;quot;. Every opcode has its own number of arguments.&lt;br /&gt;
&lt;br /&gt;
=== Custom Instrument Map Table ===&lt;br /&gt;
&lt;br /&gt;
When a song uses custom instruments with [[FF9/Sound/Opcodes/0xfe14|opcode 0xFE 0x14]], a custom instrument map table will be placed after the end of AKAO opcode sequence.&lt;br /&gt;
&lt;br /&gt;
This table consists of a collection of zones representing performance settings for a particular key range. A zone is an 8-byte item, and an instrument can have one or more regions.&lt;br /&gt;
&lt;br /&gt;
 struct AkaoInstrumentZoneAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t instrument;   // corresponding to opcode 0xA1&lt;br /&gt;
   uint8_t low_key;      // lowest key (in note number)&lt;br /&gt;
   uint8_t high_key;     // highest key (in note number)&lt;br /&gt;
   uint8_t ar;           // ADSR: attack rate (0-127)&lt;br /&gt;
   uint8_t sr;           // ADSR: sustain rate (0-127)&lt;br /&gt;
   uint8_t s_mode;       // ADSR: sustain mode (1: linear increase, 3: linear decrease, 5: exponential increase, 7: exponential decrease)&lt;br /&gt;
   uint8_t rr;           // ADSR: release rate (0-31)&lt;br /&gt;
   uint8_t volume;       // adjust the note volume to n/128 of the original volume (0 will keep the original volume)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
- Zones must be ordered from low key to high key&lt;br /&gt;
- The final zone of the instrument must be a terminator filled with 0s (more precisely, a zone with ADSR sustain mode of 0 is considered a terminator)&lt;br /&gt;
&lt;br /&gt;
=== Drum Instrument Map Table ===&lt;br /&gt;
&lt;br /&gt;
When a song uses a drum kit with [[FF9/Sound/Opcodes/0xfe04|opcode 0xFE 0x04]], 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.&lt;br /&gt;
&lt;br /&gt;
The table consists of a repetition of 8-byte items.&lt;br /&gt;
&lt;br /&gt;
 struct AkaoDrumKeyAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t instrument;   // corresponding to opcode 0xA1&lt;br /&gt;
   uint8_t key;          // note number when playing the drum note&lt;br /&gt;
   uint8_t ar;           // ADSR: attack rate (0-127)&lt;br /&gt;
   uint8_t sr;           // ADSR: sustain rate (0-127)&lt;br /&gt;
   uint8_t s_mode;       // ADSR: sustain mode (1: linear increase, 3: linear decrease, 5: exponential increase, 7: exponential decrease)&lt;br /&gt;
   uint8_t rr;           // ADSR: release rate (0-31)&lt;br /&gt;
   uint8_t volume;       // adjust the percussion volume to n/128 of the original volume (0 will keep the original volume)&lt;br /&gt;
   uint8_t pan : 7;      // corresponding to opcode 0xAA&lt;br /&gt;
   uint8_t reverb : 1;   // reverb on/off (0: off, 1: on)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sound Opcode List ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Opcode&lt;br /&gt;
! Summary&lt;br /&gt;
! Length&lt;br /&gt;
! Operands&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0x00-0x99]]&lt;br /&gt;
|Note, Tie, Rest&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|The opcode indicates the note key and length.&lt;br /&gt;
|-&lt;br /&gt;
|0x9A-0x9F&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xA0]]&lt;br /&gt;
|Finish Channel&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa1|0xA1]]&lt;br /&gt;
|Load Instrument&lt;br /&gt;
|2&lt;br /&gt;
|instrument: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0xA2]]&lt;br /&gt;
|Overwrite Next Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length: byte&lt;br /&gt;
|Ignores the regular length (delta-time) of the next note and overwrites it with the specified length.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xA3]]&lt;br /&gt;
|Channel Master Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa4|0xA4]]&lt;br /&gt;
|Pitch Bend Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, semitones: signed byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA5]]&lt;br /&gt;
|Set Octave&lt;br /&gt;
|2&lt;br /&gt;
|octave: byte (0-15)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA6]]&lt;br /&gt;
|Increase Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA7]]&lt;br /&gt;
|Decrease Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xA8]]&lt;br /&gt;
|Channel Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa9|0xA9]]&lt;br /&gt;
|Channel Volume Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xAA]]&lt;br /&gt;
|Channel Pan&lt;br /&gt;
|2&lt;br /&gt;
|pan: byte (0-127)&lt;br /&gt;
|64 is the center.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xab|0xAB]]&lt;br /&gt;
|Channel Pan Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, pan: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xac|0xAC]]&lt;br /&gt;
|Noise Clock Frequency&lt;br /&gt;
|2&lt;br /&gt;
|clock: byte (0x00-0x3f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAD]]&lt;br /&gt;
|ADSR: Attack Rate&lt;br /&gt;
|2&lt;br /&gt;
|attack_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAE]]&lt;br /&gt;
|ADSR: Decay Rate&lt;br /&gt;
|2&lt;br /&gt;
|decay_rate: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAF]]&lt;br /&gt;
|ADSR: Sustain Level&lt;br /&gt;
|2&lt;br /&gt;
|sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB0]]&lt;br /&gt;
|ADSR: Decay Rate &amp;amp; Sustain Level&lt;br /&gt;
|3&lt;br /&gt;
|decay_rate: byte (0x00-0x0f), sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB1]]&lt;br /&gt;
|ADSR: Sustain Rate&lt;br /&gt;
|2&lt;br /&gt;
|sustain_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB2]]&lt;br /&gt;
|ADSR: Release Rate&lt;br /&gt;
|2&lt;br /&gt;
|release_rate: byte (0x00-0x1f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB3]]&lt;br /&gt;
|ADSR: Reset ADSR&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB4]]&lt;br /&gt;
|Vibrato (Channel Pitch LFO)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB5]]&lt;br /&gt;
|Vibrato Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|The most significant bit of the &amp;lt;code&amp;gt;depth&amp;lt;/code&amp;gt; determines the amplitude range.&lt;br /&gt;
&lt;br /&gt;
When it is 0, the range is up to about ± 50 cents (amplitude is 15/256 compared with range type 1).&lt;br /&gt;
&lt;br /&gt;
When it is 1, the range is up to about ± 700 cents.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB6]]&lt;br /&gt;
|Turn Off Vibrato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB7]]&lt;br /&gt;
|ADSR: Attack Mode&lt;br /&gt;
|2&lt;br /&gt;
|attack_mode: byte (1 or 5)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xB8]]&lt;br /&gt;
|Tremolo (Channel Volume LFO)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xB9]]&lt;br /&gt;
|Tremolo Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xBA]]&lt;br /&gt;
|Turn Off Tremolo&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xBB]]&lt;br /&gt;
|ADSR: Sustain Mode&lt;br /&gt;
|2&lt;br /&gt;
|sustain_mode: byte (1, 3, 5 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBC]]&lt;br /&gt;
|Channel Pan LFO&lt;br /&gt;
|3&lt;br /&gt;
|rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBD]]&lt;br /&gt;
|Channel Pan LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBE]]&lt;br /&gt;
|Turn Off Channel Pan LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbf|0xBF]]&lt;br /&gt;
|ADSR: Release Mode&lt;br /&gt;
|2&lt;br /&gt;
|release_mode: byte (3 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc0c1|0xC0]]&lt;br /&gt;
|Channel Transpose (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc0c1|0xC1]]&lt;br /&gt;
|Channel Transpose (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc2c3|0xC2]]&lt;br /&gt;
|Turn On Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc2c3|0xC3]]&lt;br /&gt;
|Turn Off Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc4c5|0xC4]]&lt;br /&gt;
|Turn On Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc4c5|0xC5]]&lt;br /&gt;
|Turn Off Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc6c7|0xC6]]&lt;br /&gt;
|Turn On Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc6c7|0xC7]]&lt;br /&gt;
|Turn Off Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xC8]]&lt;br /&gt;
|Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Remember the current offset as a loop point and increase the nesting level of the loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xC9]]&lt;br /&gt;
|Return to Loop Point Up to N Times&lt;br /&gt;
|2&lt;br /&gt;
|times: byte&lt;br /&gt;
|On the Nth repeat, this instruction will end the current loop by decrementing the nesting level of the loop. Otherwise, it will increment the loop counter and return to the loop point.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xCA]]&lt;br /&gt;
|Return to Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will increment the loop counter.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcb|0xCB]]&lt;br /&gt;
|Reset Sound Effects&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Reset sound effects such as noise, frequency modulation, reverb, overlay voice and alternate voice.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcccd|0xCC]]&lt;br /&gt;
|Turn On Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key on and key off performance of the subsequent notes and update the pitch only.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcccd|0xCD]]&lt;br /&gt;
|Turn Off Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcecf|0xCE]]&lt;br /&gt;
|Turn On Noise and Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcecf|0xCF]]&lt;br /&gt;
|Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd0d1|0xD0]]&lt;br /&gt;
|Turn On Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key off performance of the subsequent notes.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd0d1|0xD1]]&lt;br /&gt;
|Turn Off Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd2d3|0xD2]]&lt;br /&gt;
|Turn On Frequency Modulation and Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd2d3|0xD3]]&lt;br /&gt;
|Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd4d5|0xD4]]&lt;br /&gt;
|Turn On Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Duplicate and use the playback frequency of the previous voice channel.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd4d5|0xD5]]&lt;br /&gt;
|Turn Off Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd6d7|0xD6]]&lt;br /&gt;
|Turn On Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Multiply the playback frequency of the previous voice channel to the output volume. Lower pitch will make the volume smaller.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd6d7|0xD7]]&lt;br /&gt;
|Turn Off Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd8d9|0xD8]]&lt;br /&gt;
|Channel Fine Tuning (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The pitch can be changed in the range of one octave above and below.&lt;br /&gt;
The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is the multiplicand for the playback frequency, not a log-based parameter like cents. For example, when the &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is 127, the pitch will be multiplied by 127/128 (about +1 octave). Negative value ​​will lower the pitch.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd8d9|0xD9]]&lt;br /&gt;
|Channel Fine Tuning (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; will be added to the current tuning amount.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdadb|0xDA]]&lt;br /&gt;
|Turn On Portamento&lt;br /&gt;
|2&lt;br /&gt;
|speed: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;speed&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdadb|0xDB]]&lt;br /&gt;
|Turn Off Portamento&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0xDC]]&lt;br /&gt;
|Fix Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length_to_add: signed byte&lt;br /&gt;
|Ignore the regular length (delta-time) of subsequent notes and set to the fixed length. The &amp;lt;code&amp;gt;length_to_add&amp;lt;/code&amp;gt; parameter will be added to the current length value. (the initial value is 0)&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdd|0xDD]]&lt;br /&gt;
|Vibrato Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xde|0xDE]]&lt;br /&gt;
|Tremolo Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdf|0xDF]]&lt;br /&gt;
|Channel Pan LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe0|0xE0]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe1|0xE1]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|value: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe2|0xE2]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Clears the effect of opcode 0xE1&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe3|0xE3]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe4|0xE4]]&lt;br /&gt;
|Vibrato Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe5|0xE5]]&lt;br /&gt;
|Tremolo Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe6|0xE6]]&lt;br /&gt;
|Channel Pan LFO Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xE7-0xEF]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xf0fd|0xF0-0xFD]]&lt;br /&gt;
|Note, Tie, Rest with Length&lt;br /&gt;
|2&lt;br /&gt;
|length: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe00|0xFE 0x00]]&lt;br /&gt;
|Tempo&lt;br /&gt;
|4&lt;br /&gt;
|tempo: uint16&lt;br /&gt;
|bpm = tempo / 218.453333 (approximate)&lt;br /&gt;
More strictly, &amp;lt;code&amp;gt;bpm = 60.0 / (48 * (65536.0 / tempo) * (0x43D1 / (33868800.0 / 8)))&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe00|0xFE 0x01]]&lt;br /&gt;
|Tempo Slide&lt;br /&gt;
|5&lt;br /&gt;
|length: byte, tempo: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe02|0xFE 0x02]]&lt;br /&gt;
|Reverb Depth&lt;br /&gt;
|4&lt;br /&gt;
|depth: uint16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe02|0xFE 0x03]]&lt;br /&gt;
|Reverb Depth Slide&lt;br /&gt;
|5&lt;br /&gt;
|length: byte, depth: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe04|0xFE 0x04]]&lt;br /&gt;
|Turn On Drum Mode&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|The drum map offset is recorded in the file header.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe04|0xFE 0x05]]&lt;br /&gt;
|Turn Off Drum Mode&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe06|0xFE 0x06]]&lt;br /&gt;
|Unconditional Jump&lt;br /&gt;
|4&lt;br /&gt;
|destination_offset: signed int16&lt;br /&gt;
|This instruction can be used to make an infinite loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe07|0xFE 0x07]]&lt;br /&gt;
|CPU-Conditional Jump&lt;br /&gt;
|5&lt;br /&gt;
|condition: byte, destination_offset: signed int16&lt;br /&gt;
|Jump if the condition variable matches &amp;lt;code&amp;gt;condition&amp;lt;/code&amp;gt;. The value of the condition variable can be set from the game program.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe08|0xFE 0x08]]&lt;br /&gt;
|Jump on the Nth Repeat&lt;br /&gt;
|5&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe08|0xFE 0x09]]&lt;br /&gt;
|Break the Loop on the Nth Repeat&lt;br /&gt;
|5&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|Unlike 0xF0, this instruction will end the current loop by decrementing the nesting level of the loop.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa1|0xFE 0x0A]]&lt;br /&gt;
|Load Instrument (No Attack Sample)&lt;br /&gt;
|3&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|Unlike 0xA1, the sample before the loop point is replaced by a short, silence sample.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0b|0xFE 0x0B]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|6&lt;br /&gt;
|offset: signed int16, offset2: signed int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x0C-0x0D]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0e|0xFE 0x0E]]&lt;br /&gt;
|Pattern&lt;br /&gt;
|4&lt;br /&gt;
|destination_offset: signed int16&lt;br /&gt;
|Remember the return address and jump to the specified location. It cannot be nested.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0f|0xFE 0x0F]]&lt;br /&gt;
|End Pattern&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Return from opcode 0xFE 0x0E.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe10|0xFE 0x10]]&lt;br /&gt;
|Allocate Reserved Voices&lt;br /&gt;
|3&lt;br /&gt;
|count: byte&lt;br /&gt;
|Reserve the specified &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; of hardware voices. Reserved voices will not be used unless explicitly specified in opcode 0xFE 0x1D.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe10|0xFE 0x11]]&lt;br /&gt;
|Free Reserved Voices&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Set the count of reserved voices to 0.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa3|0xFE 0x12]]&lt;br /&gt;
|Channel Master Volume Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x13]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe14|0xFE 0x14]]&lt;br /&gt;
|Load Custom Instrument (Key-Split Instrument)&lt;br /&gt;
|3&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|The custom instrument number corresponds to the custom instrument map pointed from the file header. Note that the number is different from the regular sample number used in opcode 0xA1.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe15|0xFE 0x15]]&lt;br /&gt;
|Time Signature&lt;br /&gt;
|4&lt;br /&gt;
|ticks_per_beat: byte, beats_per_measure: byte&lt;br /&gt;
|Note that two parameters can be 0. This pattern is used for initialization.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe16|0xFE 0x16]]&lt;br /&gt;
|Measure Number&lt;br /&gt;
|3&lt;br /&gt;
|measure: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x17-0x18]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa9|0xFE 0x19]]&lt;br /&gt;
|Channel Volume Slide Per Note On&lt;br /&gt;
|4&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|Applies volume slide (opcode 0xA9) for each notes. When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1a|0xFE 0x1A]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Turn something on.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1b|0xFE 0x1B]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Clears the effect of opcode 0xFE 0x1A.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1c|0xFE 0x1C]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|3&lt;br /&gt;
|value: byte&lt;br /&gt;
|Obsoleted opcode? As far as I learned from the assembly code, it probably does nothing.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1d|0xFE 0x1D]]&lt;br /&gt;
|Use Reserved Voices&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Allow 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.&lt;br /&gt;
&lt;br /&gt;
Use opcode [[FF9/Sound/Opcodes/0xfe10|0xFE 0x10]] to allocate reserved voices.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1e|0xFE 0x1E]]&lt;br /&gt;
|Use No Reserved Voices&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Disable the effect of opcode 0xFE 0x1D.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x1F]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|0xFE 0x20-0xFF&lt;br /&gt;
|Unimplemented (Out of Range)&lt;br /&gt;
|n/a&lt;br /&gt;
|&lt;br /&gt;
|Do not use.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFF]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF9/Sound/AKAO_sequence&amp;diff=5772</id>
		<title>FF9/Sound/AKAO sequence</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF9/Sound/AKAO_sequence&amp;diff=5772"/>
		<updated>2020-07-12T15:38:59Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
AKAO sequence is similar to MIDI sequence - it's custom tracker format for playing sequence sound, well tuned specially for PSX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
=== Header (size: 64 bytes) ===&lt;br /&gt;
&lt;br /&gt;
 struct AkaoSeqHeader&lt;br /&gt;
 {&lt;br /&gt;
   static const uint8_t magic[4];  // &amp;quot;AKAO&amp;quot; C-string&lt;br /&gt;
   uint16_t id;                    // song ID, used for playing sequence&lt;br /&gt;
   uint16_t length;                // data length (including this header)&lt;br /&gt;
   uint16_t reverb_type;           // reverb type (range from 0 to 9)&lt;br /&gt;
   uint8_t field_0A[6];&lt;br /&gt;
   uint32_t field_10;&lt;br /&gt;
   uint16_t sample_set_id;         // associated sample set ID&lt;br /&gt;
   uint16_t field_12;&lt;br /&gt;
   uint32_t field_14;&lt;br /&gt;
   uint32_t field_18;&lt;br /&gt;
   uint32_t field_1C;&lt;br /&gt;
   uint32_t mask;                  // represents bitmask of used channels in this song&lt;br /&gt;
   uint32_t field_24;&lt;br /&gt;
   uint32_t field_28;&lt;br /&gt;
   uint32_t field_2C;&lt;br /&gt;
   uint32_t instrument_map_offset; // relative offset to custom instrument map (0 if unused)&lt;br /&gt;
   uint32_t drum_map_offset;       // relative offset to custom drum map (0 if unused)&lt;br /&gt;
   uint32_t field_38;&lt;br /&gt;
   uint32_t field_3C;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
=== Channel Offsets (size: 2 bytes * &amp;lt;channels count&amp;gt;) ===&lt;br /&gt;
 struct AkaoChannelInfo&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t start_offsets[num_channels];  // offsets to channel opcode data&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 AkaoSeqHeader *header;&lt;br /&gt;
 int num_channels = 0;&lt;br /&gt;
 while (int bit = 0; header-&amp;gt;mask &amp;amp; (1 &amp;lt;&amp;lt; bit)) != 0; bit++)&lt;br /&gt;
   num_channels++;&lt;br /&gt;
&lt;br /&gt;
There is &amp;lt;channels count&amp;gt; offsets to channel opcode data counting from current offset. Each offsets is a relative offset based on the address the offset itself.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Channel Commands [AKAO Opcodes] ===&lt;br /&gt;
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 &amp;quot;opcodes&amp;quot;. Every opcode has its own number of arguments.&lt;br /&gt;
&lt;br /&gt;
=== Custom Instrument Map Table ===&lt;br /&gt;
&lt;br /&gt;
When a song uses custom instruments with [[FF9/Sound/Opcodes/0xfe14|opcode 0xFE 0x14]], a custom instrument map table will be placed after the end of AKAO opcode sequence.&lt;br /&gt;
&lt;br /&gt;
This table consists of a collection of zones representing performance settings for a particular key range. A zone is an 8-byte item, and an instrument can have one or more regions.&lt;br /&gt;
&lt;br /&gt;
 struct AkaoInstrumentZoneAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t instrument;   // corresponding to opcode 0xA1&lt;br /&gt;
   uint8_t low_key;      // lowest key (in note number)&lt;br /&gt;
   uint8_t high_key;     // highest key (in note number)&lt;br /&gt;
   uint8_t ar;           // ADSR: attack rate (0-127)&lt;br /&gt;
   uint8_t sr;           // ADSR: sustain rate (0-127)&lt;br /&gt;
   uint8_t s_mode;       // ADSR: sustain mode (1: linear increase, 3: linear decrease, 5: exponential increase, 7: exponential decrease)&lt;br /&gt;
   uint8_t rr;           // ADSR: release rate (0-31)&lt;br /&gt;
   uint8_t volume;       // adjust the note volume to n/128 of the original volume (0 will keep the original volume)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
- Zones must be ordered from low key to high key&lt;br /&gt;
- The final zone of the instrument must be a terminator filled with 0s (more precisely, a zone with ADSR sustain mode of 0 is considered a terminator)&lt;br /&gt;
&lt;br /&gt;
=== Drum Instrument Map Table ===&lt;br /&gt;
&lt;br /&gt;
When a song uses a drum kit with [[FF9/Sound/Opcodes/0xfe04|opcode 0xFE 0x04]], 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.&lt;br /&gt;
&lt;br /&gt;
The table consists of a repetition of 8-byte items.&lt;br /&gt;
&lt;br /&gt;
 struct AkaoDrumKeyAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t instrument;   // corresponding to opcode 0xA1&lt;br /&gt;
   uint8_t key;          // note number when playing the drum note&lt;br /&gt;
   uint8_t ar;           // ADSR: attack rate (0-127)&lt;br /&gt;
   uint8_t sr;           // ADSR: sustain rate (0-127)&lt;br /&gt;
   uint8_t s_mode;       // ADSR: sustain mode (1: linear increase, 3: linear decrease, 5: exponential increase, 7: exponential decrease)&lt;br /&gt;
   uint8_t rr;           // ADSR: release rate (0-31)&lt;br /&gt;
   uint8_t volume;       // adjust the percussion volume to n/128 of the original volume (0 will keep the original volume)&lt;br /&gt;
   uint8_t pan : 7;      // corresponding to opcode 0xAA&lt;br /&gt;
   uint8_t reverb : 1;   // reverb on/off (0: off, 1: on)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sound Opcode List ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Opcode&lt;br /&gt;
! Summary&lt;br /&gt;
! Length&lt;br /&gt;
! Operands&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0x00-0x99]]&lt;br /&gt;
|Note, Tie, Rest&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|The opcode indicates the note key and length. The note will be keyed off 2 ticks before the next note.&lt;br /&gt;
|-&lt;br /&gt;
|0x9A-0x9F&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xA0]]&lt;br /&gt;
|Finish Channel&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa1|0xA1]]&lt;br /&gt;
|Load Instrument&lt;br /&gt;
|2&lt;br /&gt;
|instrument: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0xA2]]&lt;br /&gt;
|Overwrite Next Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length: byte&lt;br /&gt;
|Ignores the regular length (delta-time) of the next note and overwrites it with the specified length.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xA3]]&lt;br /&gt;
|Channel Master Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa4|0xA4]]&lt;br /&gt;
|Pitch Bend Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, semitones: signed byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA5]]&lt;br /&gt;
|Set Octave&lt;br /&gt;
|2&lt;br /&gt;
|octave: byte (0-15)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA6]]&lt;br /&gt;
|Increase Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA7]]&lt;br /&gt;
|Decrease Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xA8]]&lt;br /&gt;
|Channel Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa9|0xA9]]&lt;br /&gt;
|Channel Volume Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xAA]]&lt;br /&gt;
|Channel Pan&lt;br /&gt;
|2&lt;br /&gt;
|pan: byte (0-127)&lt;br /&gt;
|64 is the center.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xab|0xAB]]&lt;br /&gt;
|Channel Pan Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, pan: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xac|0xAC]]&lt;br /&gt;
|Noise Clock Frequency&lt;br /&gt;
|2&lt;br /&gt;
|clock: byte (0x00-0x3f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAD]]&lt;br /&gt;
|ADSR: Attack Rate&lt;br /&gt;
|2&lt;br /&gt;
|attack_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAE]]&lt;br /&gt;
|ADSR: Decay Rate&lt;br /&gt;
|2&lt;br /&gt;
|decay_rate: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAF]]&lt;br /&gt;
|ADSR: Sustain Level&lt;br /&gt;
|2&lt;br /&gt;
|sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB0]]&lt;br /&gt;
|ADSR: Decay Rate &amp;amp; Sustain Level&lt;br /&gt;
|3&lt;br /&gt;
|decay_rate: byte (0x00-0x0f), sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB1]]&lt;br /&gt;
|ADSR: Sustain Rate&lt;br /&gt;
|2&lt;br /&gt;
|sustain_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB2]]&lt;br /&gt;
|ADSR: Release Rate&lt;br /&gt;
|2&lt;br /&gt;
|release_rate: byte (0x00-0x1f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB3]]&lt;br /&gt;
|ADSR: Reset ADSR&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB4]]&lt;br /&gt;
|Vibrato (Channel Pitch LFO)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB5]]&lt;br /&gt;
|Vibrato Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|The most significant bit of the &amp;lt;code&amp;gt;depth&amp;lt;/code&amp;gt; determines the amplitude range.&lt;br /&gt;
&lt;br /&gt;
When it is 0, the range is up to about ± 50 cents (amplitude is 15/256 compared with range type 1).&lt;br /&gt;
&lt;br /&gt;
When it is 1, the range is up to about ± 700 cents.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB6]]&lt;br /&gt;
|Turn Off Vibrato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB7]]&lt;br /&gt;
|ADSR: Attack Mode&lt;br /&gt;
|2&lt;br /&gt;
|attack_mode: byte (1 or 5)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xB8]]&lt;br /&gt;
|Tremolo (Channel Volume LFO)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xB9]]&lt;br /&gt;
|Tremolo Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xBA]]&lt;br /&gt;
|Turn Off Tremolo&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xBB]]&lt;br /&gt;
|ADSR: Sustain Mode&lt;br /&gt;
|2&lt;br /&gt;
|sustain_mode: byte (1, 3, 5 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBC]]&lt;br /&gt;
|Channel Pan LFO&lt;br /&gt;
|3&lt;br /&gt;
|rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBD]]&lt;br /&gt;
|Channel Pan LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBE]]&lt;br /&gt;
|Turn Off Channel Pan LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbf|0xBF]]&lt;br /&gt;
|ADSR: Release Mode&lt;br /&gt;
|2&lt;br /&gt;
|release_mode: byte (3 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc0c1|0xC0]]&lt;br /&gt;
|Channel Transpose (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc0c1|0xC1]]&lt;br /&gt;
|Channel Transpose (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc2c3|0xC2]]&lt;br /&gt;
|Turn On Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc2c3|0xC3]]&lt;br /&gt;
|Turn Off Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc4c5|0xC4]]&lt;br /&gt;
|Turn On Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc4c5|0xC5]]&lt;br /&gt;
|Turn Off Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc6c7|0xC6]]&lt;br /&gt;
|Turn On Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc6c7|0xC7]]&lt;br /&gt;
|Turn Off Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xC8]]&lt;br /&gt;
|Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Remember the current offset as a loop point and increase the nesting level of the loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xC9]]&lt;br /&gt;
|Return to Loop Point Up to N Times&lt;br /&gt;
|2&lt;br /&gt;
|times: byte&lt;br /&gt;
|On the Nth repeat, this instruction will end the current loop by decrementing the nesting level of the loop. Otherwise, it will increment the loop counter and return to the loop point.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xCA]]&lt;br /&gt;
|Return to Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will increment the loop counter.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcb|0xCB]]&lt;br /&gt;
|Reset Sound Effects&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Reset sound effects such as noise, frequency modulation, reverb, overlay voice and alternate voice.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcccd|0xCC]]&lt;br /&gt;
|Turn On Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key on and key off performance of the subsequent notes and update the pitch only.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcccd|0xCD]]&lt;br /&gt;
|Turn Off Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcecf|0xCE]]&lt;br /&gt;
|Turn On Noise and Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcecf|0xCF]]&lt;br /&gt;
|Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd0d1|0xD0]]&lt;br /&gt;
|Turn On Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key off performance of the subsequent notes.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd0d1|0xD1]]&lt;br /&gt;
|Turn Off Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd2d3|0xD2]]&lt;br /&gt;
|Turn On Frequency Modulation and Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd2d3|0xD3]]&lt;br /&gt;
|Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd4d5|0xD4]]&lt;br /&gt;
|Turn On Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Duplicate and use the playback frequency of the previous voice channel.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd4d5|0xD5]]&lt;br /&gt;
|Turn Off Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd6d7|0xD6]]&lt;br /&gt;
|Turn On Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Multiply the playback frequency of the previous voice channel to the output volume. Lower pitch will make the volume smaller.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd6d7|0xD7]]&lt;br /&gt;
|Turn Off Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd8d9|0xD8]]&lt;br /&gt;
|Channel Fine Tuning (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The pitch can be changed in the range of one octave above and below.&lt;br /&gt;
The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is the multiplicand for the playback frequency, not a log-based parameter like cents. For example, when the &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is 127, the pitch will be multiplied by 127/128 (about +1 octave). Negative value ​​will lower the pitch.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd8d9|0xD9]]&lt;br /&gt;
|Channel Fine Tuning (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; will be added to the current tuning amount.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdadb|0xDA]]&lt;br /&gt;
|Turn On Portamento&lt;br /&gt;
|2&lt;br /&gt;
|speed: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;speed&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdadb|0xDB]]&lt;br /&gt;
|Turn Off Portamento&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0xDC]]&lt;br /&gt;
|Fix Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length_to_add: signed byte&lt;br /&gt;
|Ignore the regular length (delta-time) of subsequent notes and set to the fixed length. The &amp;lt;code&amp;gt;length_to_add&amp;lt;/code&amp;gt; parameter will be added to the current length value. (the initial value is 0)&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdd|0xDD]]&lt;br /&gt;
|Vibrato Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xde|0xDE]]&lt;br /&gt;
|Tremolo Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdf|0xDF]]&lt;br /&gt;
|Channel Pan LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe0|0xE0]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe1|0xE1]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|value: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe2|0xE2]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Clears the effect of opcode 0xE1&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe3|0xE3]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe4|0xE4]]&lt;br /&gt;
|Vibrato Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe5|0xE5]]&lt;br /&gt;
|Tremolo Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe6|0xE6]]&lt;br /&gt;
|Channel Pan LFO Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xE7-0xEF]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xf0fd|0xF0-0xFD]]&lt;br /&gt;
|Note, Tie, Rest with Length&lt;br /&gt;
|2&lt;br /&gt;
|length: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe00|0xFE 0x00]]&lt;br /&gt;
|Tempo&lt;br /&gt;
|4&lt;br /&gt;
|tempo: uint16&lt;br /&gt;
|bpm = tempo / 218.453333 (approximate)&lt;br /&gt;
More strictly, &amp;lt;code&amp;gt;bpm = 60.0 / (48 * (65536.0 / tempo) * (0x43D1 / (33868800.0 / 8)))&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe00|0xFE 0x01]]&lt;br /&gt;
|Tempo Slide&lt;br /&gt;
|5&lt;br /&gt;
|length: byte, tempo: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe02|0xFE 0x02]]&lt;br /&gt;
|Reverb Depth&lt;br /&gt;
|4&lt;br /&gt;
|depth: uint16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe02|0xFE 0x03]]&lt;br /&gt;
|Reverb Depth Slide&lt;br /&gt;
|5&lt;br /&gt;
|length: byte, depth: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe04|0xFE 0x04]]&lt;br /&gt;
|Turn On Drum Mode&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|The drum map offset is recorded in the file header.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe04|0xFE 0x05]]&lt;br /&gt;
|Turn Off Drum Mode&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe06|0xFE 0x06]]&lt;br /&gt;
|Unconditional Jump&lt;br /&gt;
|4&lt;br /&gt;
|destination_offset: signed int16&lt;br /&gt;
|This instruction can be used to make an infinite loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe07|0xFE 0x07]]&lt;br /&gt;
|CPU-Conditional Jump&lt;br /&gt;
|5&lt;br /&gt;
|condition: byte, destination_offset: signed int16&lt;br /&gt;
|Jump if the condition variable matches &amp;lt;code&amp;gt;condition&amp;lt;/code&amp;gt;. The value of the condition variable can be set from the game program.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe08|0xFE 0x08]]&lt;br /&gt;
|Jump on the Nth Repeat&lt;br /&gt;
|5&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe08|0xFE 0x09]]&lt;br /&gt;
|Break the Loop on the Nth Repeat&lt;br /&gt;
|5&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|Unlike 0xF0, this instruction will end the current loop by decrementing the nesting level of the loop.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa1|0xFE 0x0A]]&lt;br /&gt;
|Load Instrument (No Attack Sample)&lt;br /&gt;
|3&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|Unlike 0xA1, the sample before the loop point is replaced by a short, silence sample.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0b|0xFE 0x0B]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|6&lt;br /&gt;
|offset: signed int16, offset2: signed int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x0C-0x0D]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0e|0xFE 0x0E]]&lt;br /&gt;
|Pattern&lt;br /&gt;
|4&lt;br /&gt;
|destination_offset: signed int16&lt;br /&gt;
|Remember the return address and jump to the specified location. It cannot be nested.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0f|0xFE 0x0F]]&lt;br /&gt;
|End Pattern&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Return from opcode 0xFE 0x0E.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe10|0xFE 0x10]]&lt;br /&gt;
|Allocate Reserved Voices&lt;br /&gt;
|3&lt;br /&gt;
|count: byte&lt;br /&gt;
|Reserve the specified &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; of hardware voices. Reserved voices will not be used unless explicitly specified in opcode 0xFE 0x1D.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe10|0xFE 0x11]]&lt;br /&gt;
|Free Reserved Voices&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Set the count of reserved voices to 0.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa3|0xFE 0x12]]&lt;br /&gt;
|Channel Master Volume Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x13]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe14|0xFE 0x14]]&lt;br /&gt;
|Load Custom Instrument (Key-Split Instrument)&lt;br /&gt;
|3&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|The custom instrument number corresponds to the custom instrument map pointed from the file header. Note that the number is different from the regular sample number used in opcode 0xA1.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe15|0xFE 0x15]]&lt;br /&gt;
|Time Signature&lt;br /&gt;
|4&lt;br /&gt;
|ticks_per_beat: byte, beats_per_measure: byte&lt;br /&gt;
|Note that two parameters can be 0. This pattern is used for initialization.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe16|0xFE 0x16]]&lt;br /&gt;
|Measure Number&lt;br /&gt;
|3&lt;br /&gt;
|measure: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x17-0x18]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa9|0xFE 0x19]]&lt;br /&gt;
|Channel Volume Slide Per Note On&lt;br /&gt;
|4&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|Applies volume slide (opcode 0xA9) for each notes. When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1a|0xFE 0x1A]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Turn something on.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1b|0xFE 0x1B]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Clears the effect of opcode 0xFE 0x1A.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1c|0xFE 0x1C]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|3&lt;br /&gt;
|value: byte&lt;br /&gt;
|Obsoleted opcode? As far as I learned from the assembly code, it probably does nothing.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1d|0xFE 0x1D]]&lt;br /&gt;
|Use Reserved Voices&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Allow 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.&lt;br /&gt;
&lt;br /&gt;
Use opcode [[FF9/Sound/Opcodes/0xfe10|0xFE 0x10]] to allocate reserved voices.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1e|0xFE 0x1E]]&lt;br /&gt;
|Use No Reserved Voices&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Disable the effect of opcode 0xFE 0x1D.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x1F]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|0xFE 0x20-0xFF&lt;br /&gt;
|Unimplemented (Out of Range)&lt;br /&gt;
|n/a&lt;br /&gt;
|&lt;br /&gt;
|Do not use.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFF]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF9/Sound/AKAO_sequence&amp;diff=5771</id>
		<title>FF9/Sound/AKAO sequence</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF9/Sound/AKAO_sequence&amp;diff=5771"/>
		<updated>2020-07-12T15:27:14Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: Add description to 0xFE 0x10, 0x11, 0x1D and 0x1E&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
AKAO sequence is similar to MIDI sequence - it's custom tracker format for playing sequence sound, well tuned specially for PSX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
=== Header (size: 64 bytes) ===&lt;br /&gt;
&lt;br /&gt;
 struct AkaoSeqHeader&lt;br /&gt;
 {&lt;br /&gt;
   static const uint8_t magic[4];  // &amp;quot;AKAO&amp;quot; C-string&lt;br /&gt;
   uint16_t id;                    // song ID, used for playing sequence&lt;br /&gt;
   uint16_t length;                // data length (including this header)&lt;br /&gt;
   uint16_t reverb_type;           // reverb type (range from 0 to 9)&lt;br /&gt;
   uint8_t field_0A[6];&lt;br /&gt;
   uint32_t field_10;&lt;br /&gt;
   uint16_t sample_set_id;         // associated sample set ID&lt;br /&gt;
   uint16_t field_12;&lt;br /&gt;
   uint32_t field_14;&lt;br /&gt;
   uint32_t field_18;&lt;br /&gt;
   uint32_t field_1C;&lt;br /&gt;
   uint32_t mask;                  // represents bitmask of used channels in this song&lt;br /&gt;
   uint32_t field_24;&lt;br /&gt;
   uint32_t field_28;&lt;br /&gt;
   uint32_t field_2C;&lt;br /&gt;
   uint32_t instrument_map_offset; // relative offset to custom instrument map (0 if unused)&lt;br /&gt;
   uint32_t drum_map_offset;       // relative offset to custom drum map (0 if unused)&lt;br /&gt;
   uint32_t field_38;&lt;br /&gt;
   uint32_t field_3C;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
=== Channel Offsets (size: 2 bytes * &amp;lt;channels count&amp;gt;) ===&lt;br /&gt;
 struct AkaoChannelInfo&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t start_offsets[num_channels];  // offsets to channel opcode data&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 AkaoSeqHeader *header;&lt;br /&gt;
 int num_channels = 0;&lt;br /&gt;
 while (int bit = 0; header-&amp;gt;mask &amp;amp; (1 &amp;lt;&amp;lt; bit)) != 0; bit++)&lt;br /&gt;
   num_channels++;&lt;br /&gt;
&lt;br /&gt;
There is &amp;lt;channels count&amp;gt; offsets to channel opcode data counting from current offset. Each offsets is a relative offset based on the address the offset itself.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Channel Commands [AKAO Opcodes] ===&lt;br /&gt;
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 &amp;quot;opcodes&amp;quot;. Every opcode has its own number of arguments.&lt;br /&gt;
&lt;br /&gt;
=== Custom Instrument Map Table ===&lt;br /&gt;
&lt;br /&gt;
When a song uses custom instruments with [[FF9/Sound/Opcodes/0xfe14|opcode 0xFE 0x14]], a custom instrument map table will be placed after the end of AKAO opcode sequence.&lt;br /&gt;
&lt;br /&gt;
This table consists of a collection of zones representing performance settings for a particular key range. A zone is an 8-byte item, and an instrument can have one or more regions.&lt;br /&gt;
&lt;br /&gt;
 struct AkaoInstrumentZoneAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t instrument;   // corresponding to opcode 0xA1&lt;br /&gt;
   uint8_t low_key;      // lowest key (in note number)&lt;br /&gt;
   uint8_t high_key;     // highest key (in note number)&lt;br /&gt;
   uint8_t ar;           // ADSR: attack rate (0-127)&lt;br /&gt;
   uint8_t sr;           // ADSR: sustain rate (0-127)&lt;br /&gt;
   uint8_t s_mode;       // ADSR: sustain mode (1: linear increase, 3: linear decrease, 5: exponential increase, 7: exponential decrease)&lt;br /&gt;
   uint8_t rr;           // ADSR: release rate (0-31)&lt;br /&gt;
   uint8_t volume;       // adjust the note volume to n/128 of the original volume (0 will keep the original volume)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
- Zones must be ordered from low key to high key&lt;br /&gt;
- The final zone of the instrument must be a terminator filled with 0s (more precisely, a zone with ADSR sustain mode of 0 is considered a terminator)&lt;br /&gt;
&lt;br /&gt;
=== Drum Instrument Map Table ===&lt;br /&gt;
&lt;br /&gt;
When a song uses a drum kit with [[FF9/Sound/Opcodes/0xfe04|opcode 0xFE 0x04]], 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.&lt;br /&gt;
&lt;br /&gt;
The table consists of a repetition of 8-byte items.&lt;br /&gt;
&lt;br /&gt;
 struct AkaoDrumKeyAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t instrument;   // corresponding to opcode 0xA1&lt;br /&gt;
   uint8_t key;          // note number when playing the drum note&lt;br /&gt;
   uint8_t ar;           // ADSR: attack rate (0-127)&lt;br /&gt;
   uint8_t sr;           // ADSR: sustain rate (0-127)&lt;br /&gt;
   uint8_t s_mode;       // ADSR: sustain mode (1: linear increase, 3: linear decrease, 5: exponential increase, 7: exponential decrease)&lt;br /&gt;
   uint8_t rr;           // ADSR: release rate (0-31)&lt;br /&gt;
   uint8_t volume;       // adjust the percussion volume to n/128 of the original volume (0 will keep the original volume)&lt;br /&gt;
   uint8_t pan : 7;      // corresponding to opcode 0xAA&lt;br /&gt;
   uint8_t reverb : 1;   // reverb on/off (0: off, 1: on)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sound Opcode List ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Opcode&lt;br /&gt;
! Summary&lt;br /&gt;
! Length&lt;br /&gt;
! Operands&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0x00-0x99]]&lt;br /&gt;
|Note, Tie, Rest&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|The opcode indicates the note key and length. The note will be keyed off 2 ticks before the next note.&lt;br /&gt;
|-&lt;br /&gt;
|0x9A-0x9F&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xA0]]&lt;br /&gt;
|Finish Channel&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa1|0xA1]]&lt;br /&gt;
|Load Instrument&lt;br /&gt;
|2&lt;br /&gt;
|instrument: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0xA2]]&lt;br /&gt;
|Overwrite Next Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length: byte&lt;br /&gt;
|Ignores the regular length (delta-time) of the next note and overwrites it with the specified length.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xA3]]&lt;br /&gt;
|Channel Master Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa4|0xA4]]&lt;br /&gt;
|Pitch Bend Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, semitones: signed byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA5]]&lt;br /&gt;
|Set Octave&lt;br /&gt;
|2&lt;br /&gt;
|octave: byte (0-15)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA6]]&lt;br /&gt;
|Increase Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA7]]&lt;br /&gt;
|Decrease Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xA8]]&lt;br /&gt;
|Channel Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa9|0xA9]]&lt;br /&gt;
|Channel Volume Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xAA]]&lt;br /&gt;
|Channel Pan&lt;br /&gt;
|2&lt;br /&gt;
|pan: byte (0-127)&lt;br /&gt;
|64 is the center.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xab|0xAB]]&lt;br /&gt;
|Channel Pan Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, pan: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xac|0xAC]]&lt;br /&gt;
|Noise Clock Frequency&lt;br /&gt;
|2&lt;br /&gt;
|clock: byte (0x00-0x3f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAD]]&lt;br /&gt;
|ADSR: Attack Rate&lt;br /&gt;
|2&lt;br /&gt;
|attack_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAE]]&lt;br /&gt;
|ADSR: Decay Rate&lt;br /&gt;
|2&lt;br /&gt;
|decay_rate: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAF]]&lt;br /&gt;
|ADSR: Sustain Level&lt;br /&gt;
|2&lt;br /&gt;
|sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB0]]&lt;br /&gt;
|ADSR: Decay Rate &amp;amp; Sustain Level&lt;br /&gt;
|3&lt;br /&gt;
|decay_rate: byte (0x00-0x0f), sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB1]]&lt;br /&gt;
|ADSR: Sustain Rate&lt;br /&gt;
|2&lt;br /&gt;
|sustain_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB2]]&lt;br /&gt;
|ADSR: Release Rate&lt;br /&gt;
|2&lt;br /&gt;
|release_rate: byte (0x00-0x1f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB3]]&lt;br /&gt;
|ADSR: Reset ADSR&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB4]]&lt;br /&gt;
|Vibrato (Channel Pitch LFO)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB5]]&lt;br /&gt;
|Vibrato Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|The most significant bit of the &amp;lt;code&amp;gt;depth&amp;lt;/code&amp;gt; determines the amplitude range.&lt;br /&gt;
&lt;br /&gt;
When it is 0, the range is up to about ± 50 cents (amplitude is 15/256 compared with range type 1).&lt;br /&gt;
&lt;br /&gt;
When it is 1, the range is up to about ± 700 cents.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB6]]&lt;br /&gt;
|Turn Off Vibrato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB7]]&lt;br /&gt;
|ADSR: Attack Mode&lt;br /&gt;
|2&lt;br /&gt;
|attack_mode: byte (1 or 5)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xB8]]&lt;br /&gt;
|Tremolo (Channel Volume LFO)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xB9]]&lt;br /&gt;
|Tremolo Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xBA]]&lt;br /&gt;
|Turn Off Tremolo&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xBB]]&lt;br /&gt;
|ADSR: Sustain Mode&lt;br /&gt;
|2&lt;br /&gt;
|sustain_mode: byte (1, 3, 5 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBC]]&lt;br /&gt;
|Channel Pan LFO&lt;br /&gt;
|3&lt;br /&gt;
|rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBD]]&lt;br /&gt;
|Channel Pan LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBE]]&lt;br /&gt;
|Turn Off Channel Pan LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbf|0xBF]]&lt;br /&gt;
|ADSR: Release Mode&lt;br /&gt;
|2&lt;br /&gt;
|release_mode: byte (3 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc0c1|0xC0]]&lt;br /&gt;
|Channel Transpose (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc0c1|0xC1]]&lt;br /&gt;
|Channel Transpose (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc2c3|0xC2]]&lt;br /&gt;
|Turn On Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc2c3|0xC3]]&lt;br /&gt;
|Turn Off Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc4c5|0xC4]]&lt;br /&gt;
|Turn On Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc4c5|0xC5]]&lt;br /&gt;
|Turn Off Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc6c7|0xC6]]&lt;br /&gt;
|Turn On Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc6c7|0xC7]]&lt;br /&gt;
|Turn Off Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xC8]]&lt;br /&gt;
|Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Remember the current offset as a loop point and increase the nesting level of the loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xC9]]&lt;br /&gt;
|Return to Loop Point Up to N Times&lt;br /&gt;
|2&lt;br /&gt;
|times: byte&lt;br /&gt;
|On the Nth repeat, this instruction will end the current loop by decrementing the nesting level of the loop. Otherwise, it will increment the loop counter and return to the loop point.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xCA]]&lt;br /&gt;
|Return to Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will increment the loop counter.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcb|0xCB]]&lt;br /&gt;
|Reset Sound Effects&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Reset sound effects such as noise, frequency modulation, reverb, overlay voice and alternate voice.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcccd|0xCC]]&lt;br /&gt;
|Turn On Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key on and key off performance of the subsequent notes and update the pitch only.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcccd|0xCD]]&lt;br /&gt;
|Turn Off Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcecf|0xCE]]&lt;br /&gt;
|Turn On Noise and Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcecf|0xCF]]&lt;br /&gt;
|Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd0d1|0xD0]]&lt;br /&gt;
|Turn On Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key off performance of the subsequent notes.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd0d1|0xD1]]&lt;br /&gt;
|Turn Off Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd2d3|0xD2]]&lt;br /&gt;
|Turn On Frequency Modulation and Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd2d3|0xD3]]&lt;br /&gt;
|Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd4d5|0xD4]]&lt;br /&gt;
|Turn On Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Duplicate and use the playback frequency of the previous voice channel.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd4d5|0xD5]]&lt;br /&gt;
|Turn Off Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd6d7|0xD6]]&lt;br /&gt;
|Turn On Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Multiply the playback frequency of the previous voice channel to the output volume. Lower pitch will make the volume smaller.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd6d7|0xD7]]&lt;br /&gt;
|Turn Off Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd8d9|0xD8]]&lt;br /&gt;
|Channel Fine Tuning (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The pitch can be changed in the range of one octave above and below.&lt;br /&gt;
The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is the multiplicand for the playback frequency, not a log-based parameter like cents. For example, when the &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is 127, the pitch will be multiplied by 127/128 (about +1 octave). Negative value ​​will lower the pitch.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd8d9|0xD9]]&lt;br /&gt;
|Channel Fine Tuning (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; will be added to the current tuning amount.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdadb|0xDA]]&lt;br /&gt;
|Turn On Portamento&lt;br /&gt;
|2&lt;br /&gt;
|speed: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;speed&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdadb|0xDB]]&lt;br /&gt;
|Turn Off Portamento&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0xDC]]&lt;br /&gt;
|Fix Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length_to_add: signed byte&lt;br /&gt;
|Ignore the regular length (delta-time) of subsequent notes and set to the fixed length. The &amp;lt;code&amp;gt;length_to_add&amp;lt;/code&amp;gt; parameter will be added to the current length value. (the initial value is 0)&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdd|0xDD]]&lt;br /&gt;
|Vibrato Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xde|0xDE]]&lt;br /&gt;
|Tremolo Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdf|0xDF]]&lt;br /&gt;
|Channel Pan LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe0|0xE0]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe1|0xE1]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|value: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe2|0xE2]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Clears the effect of opcode 0xE1&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe3|0xE3]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe4|0xE4]]&lt;br /&gt;
|Vibrato Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe5|0xE5]]&lt;br /&gt;
|Tremolo Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe6|0xE6]]&lt;br /&gt;
|Channel Pan LFO Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xE7-0xEF]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xf0fd|0xF0-0xFD]]&lt;br /&gt;
|Note, Tie, Rest with Length&lt;br /&gt;
|2&lt;br /&gt;
|length: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe00|0xFE 0x00]]&lt;br /&gt;
|Tempo&lt;br /&gt;
|4&lt;br /&gt;
|tempo: uint16&lt;br /&gt;
|bpm = tempo / 218.453333 (approximate)&lt;br /&gt;
More strictly, &amp;lt;code&amp;gt;bpm = 60.0 / (48 * (65536.0 / tempo) * (0x43D1 / (33868800.0 / 8)))&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe00|0xFE 0x01]]&lt;br /&gt;
|Tempo Slide&lt;br /&gt;
|5&lt;br /&gt;
|length: byte, tempo: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe02|0xFE 0x02]]&lt;br /&gt;
|Reverb Depth&lt;br /&gt;
|4&lt;br /&gt;
|depth: uint16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe02|0xFE 0x03]]&lt;br /&gt;
|Reverb Depth Slide&lt;br /&gt;
|5&lt;br /&gt;
|length: byte, depth: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe04|0xFE 0x04]]&lt;br /&gt;
|Turn On Drum Mode&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|The drum map offset is recorded in the file header.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe04|0xFE 0x05]]&lt;br /&gt;
|Turn Off Drum Mode&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe06|0xFE 0x06]]&lt;br /&gt;
|Unconditional Jump&lt;br /&gt;
|4&lt;br /&gt;
|destination_offset: signed int16&lt;br /&gt;
|This instruction can be used to make an infinite loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe07|0xFE 0x07]]&lt;br /&gt;
|CPU-Conditional Jump&lt;br /&gt;
|5&lt;br /&gt;
|condition: byte, destination_offset: signed int16&lt;br /&gt;
|Jump if the condition variable matches &amp;lt;code&amp;gt;condition&amp;lt;/code&amp;gt;. The value of the condition variable can be set from the game program.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe08|0xFE 0x08]]&lt;br /&gt;
|Jump on the Nth Repeat&lt;br /&gt;
|5&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe08|0xFE 0x09]]&lt;br /&gt;
|Break the Loop on the Nth Repeat&lt;br /&gt;
|5&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|Unlike 0xF0, this instruction will end the current loop by decrementing the nesting level of the loop.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa1|0xFE 0x0A]]&lt;br /&gt;
|Load Instrument (No Attack Sample)&lt;br /&gt;
|3&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|Unlike 0xA1, the sample before the loop point is replaced by a short, silence sample.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0b|0xFE 0x0B]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|6&lt;br /&gt;
|offset: signed int16, offset2: signed int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x0C-0x0D]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0e|0xFE 0x0E]]&lt;br /&gt;
|Pattern&lt;br /&gt;
|4&lt;br /&gt;
|destination_offset: signed int16&lt;br /&gt;
|Remember the return address and jump to the specified location. It cannot be nested.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0f|0xFE 0x0F]]&lt;br /&gt;
|End Pattern&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Return from opcode 0xFE 0x0E.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe10|0xFE 0x10]]&lt;br /&gt;
|Allocate Reserved Voices&lt;br /&gt;
|3&lt;br /&gt;
|count: byte&lt;br /&gt;
|Reserve the specified &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; of hardware voices. Reserved voices will not be used unless explicitly specified in opcode 0xFE 0x1D.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe10|0xFE 0x11]]&lt;br /&gt;
|Free Reserved Voices&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Set the count of reserved voices to 0.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa3|0xFE 0x12]]&lt;br /&gt;
|Channel Master Volume Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x13]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe14|0xFE 0x14]]&lt;br /&gt;
|Load Custom Instrument (Key-Split Instrument)&lt;br /&gt;
|3&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|The custom instrument number corresponds to the custom instrument map pointed from the file header. Note that the number is different from the regular sample number used in opcode 0xA1.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe15|0xFE 0x15]]&lt;br /&gt;
|Time Signature&lt;br /&gt;
|4&lt;br /&gt;
|ticks_per_beat: byte, beats_per_measure: byte&lt;br /&gt;
|Note that two parameters can be 0. This pattern is used for initialization.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe16|0xFE 0x16]]&lt;br /&gt;
|Measure Number&lt;br /&gt;
|3&lt;br /&gt;
|measure: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x17-0x18]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa9|0xFE 0x19]]&lt;br /&gt;
|Channel Volume Slide Per Note On&lt;br /&gt;
|4&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|Applies volume slide (opcode 0xA9) for each notes. When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1a|0xFE 0x1A]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Turn something on.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1b|0xFE 0x1B]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Clears the effect of opcode 0xFE 0x1A.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1c|0xFE 0x1C]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|3&lt;br /&gt;
|value: byte&lt;br /&gt;
|Obsoleted opcode? It probably does nothing.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1d|0xFE 0x1D]]&lt;br /&gt;
|Use Reserved Voices&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Allow 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.&lt;br /&gt;
&lt;br /&gt;
Use opcode [[FF9/Sound/Opcodes/0xfe10|0xFE 0x10]] to allocate reserved voices.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1e|0xFE 0x1E]]&lt;br /&gt;
|Use No Reserved Voices&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Disable the effect of opcode 0xFE 0x1D.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x1F]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|0xFE 0x20-0xFF&lt;br /&gt;
|Unimplemented (Out of Range)&lt;br /&gt;
|n/a&lt;br /&gt;
|&lt;br /&gt;
|Do not use.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFF]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF9/Sound/AKAO_sequence&amp;diff=5770</id>
		<title>FF9/Sound/AKAO sequence</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF9/Sound/AKAO_sequence&amp;diff=5770"/>
		<updated>2020-07-11T22:27:49Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: Rename: Subroutine Jump -&amp;gt; Pattern&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
AKAO sequence is similar to MIDI sequence - it's custom tracker format for playing sequence sound, well tuned specially for PSX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
=== Header (size: 64 bytes) ===&lt;br /&gt;
&lt;br /&gt;
 struct AkaoSeqHeader&lt;br /&gt;
 {&lt;br /&gt;
   static const uint8_t magic[4];  // &amp;quot;AKAO&amp;quot; C-string&lt;br /&gt;
   uint16_t id;                    // song ID, used for playing sequence&lt;br /&gt;
   uint16_t length;                // data length (including this header)&lt;br /&gt;
   uint16_t reverb_type;           // reverb type (range from 0 to 9)&lt;br /&gt;
   uint8_t field_0A[6];&lt;br /&gt;
   uint32_t field_10;&lt;br /&gt;
   uint16_t sample_set_id;         // associated sample set ID&lt;br /&gt;
   uint16_t field_12;&lt;br /&gt;
   uint32_t field_14;&lt;br /&gt;
   uint32_t field_18;&lt;br /&gt;
   uint32_t field_1C;&lt;br /&gt;
   uint32_t mask;                  // represents bitmask of used channels in this song&lt;br /&gt;
   uint32_t field_24;&lt;br /&gt;
   uint32_t field_28;&lt;br /&gt;
   uint32_t field_2C;&lt;br /&gt;
   uint32_t instrument_map_offset; // relative offset to custom instrument map (0 if unused)&lt;br /&gt;
   uint32_t drum_map_offset;       // relative offset to custom drum map (0 if unused)&lt;br /&gt;
   uint32_t field_38;&lt;br /&gt;
   uint32_t field_3C;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
=== Channel Offsets (size: 2 bytes * &amp;lt;channels count&amp;gt;) ===&lt;br /&gt;
 struct AkaoChannelInfo&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t start_offsets[num_channels];  // offsets to channel opcode data&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 AkaoSeqHeader *header;&lt;br /&gt;
 int num_channels = 0;&lt;br /&gt;
 while (int bit = 0; header-&amp;gt;mask &amp;amp; (1 &amp;lt;&amp;lt; bit)) != 0; bit++)&lt;br /&gt;
   num_channels++;&lt;br /&gt;
&lt;br /&gt;
There is &amp;lt;channels count&amp;gt; offsets to channel opcode data counting from current offset. Each offsets is a relative offset based on the address the offset itself.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Channel Commands [AKAO Opcodes] ===&lt;br /&gt;
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 &amp;quot;opcodes&amp;quot;. Every opcode has its own number of arguments.&lt;br /&gt;
&lt;br /&gt;
=== Custom Instrument Map Table ===&lt;br /&gt;
&lt;br /&gt;
When a song uses custom instruments with [[FF9/Sound/Opcodes/0xfe14|opcode 0xFE 0x14]], a custom instrument map table will be placed after the end of AKAO opcode sequence.&lt;br /&gt;
&lt;br /&gt;
This table consists of a collection of zones representing performance settings for a particular key range. A zone is an 8-byte item, and an instrument can have one or more regions.&lt;br /&gt;
&lt;br /&gt;
 struct AkaoInstrumentZoneAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t instrument;   // corresponding to opcode 0xA1&lt;br /&gt;
   uint8_t low_key;      // lowest key (in note number)&lt;br /&gt;
   uint8_t high_key;     // highest key (in note number)&lt;br /&gt;
   uint8_t ar;           // ADSR: attack rate (0-127)&lt;br /&gt;
   uint8_t sr;           // ADSR: sustain rate (0-127)&lt;br /&gt;
   uint8_t s_mode;       // ADSR: sustain mode (1: linear increase, 3: linear decrease, 5: exponential increase, 7: exponential decrease)&lt;br /&gt;
   uint8_t rr;           // ADSR: release rate (0-31)&lt;br /&gt;
   uint8_t volume;       // adjust the note volume to n/128 of the original volume (0 will keep the original volume)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
- Zones must be ordered from low key to high key&lt;br /&gt;
- The final zone of the instrument must be a terminator filled with 0s (more precisely, a zone with ADSR sustain mode of 0 is considered a terminator)&lt;br /&gt;
&lt;br /&gt;
=== Drum Instrument Map Table ===&lt;br /&gt;
&lt;br /&gt;
When a song uses a drum kit with [[FF9/Sound/Opcodes/0xfe04|opcode 0xFE 0x04]], 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.&lt;br /&gt;
&lt;br /&gt;
The table consists of a repetition of 8-byte items.&lt;br /&gt;
&lt;br /&gt;
 struct AkaoDrumKeyAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t instrument;   // corresponding to opcode 0xA1&lt;br /&gt;
   uint8_t key;          // note number when playing the drum note&lt;br /&gt;
   uint8_t ar;           // ADSR: attack rate (0-127)&lt;br /&gt;
   uint8_t sr;           // ADSR: sustain rate (0-127)&lt;br /&gt;
   uint8_t s_mode;       // ADSR: sustain mode (1: linear increase, 3: linear decrease, 5: exponential increase, 7: exponential decrease)&lt;br /&gt;
   uint8_t rr;           // ADSR: release rate (0-31)&lt;br /&gt;
   uint8_t volume;       // adjust the percussion volume to n/128 of the original volume (0 will keep the original volume)&lt;br /&gt;
   uint8_t pan : 7;      // corresponding to opcode 0xAA&lt;br /&gt;
   uint8_t reverb : 1;   // reverb on/off (0: off, 1: on)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sound Opcode List ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Opcode&lt;br /&gt;
! Summary&lt;br /&gt;
! Length&lt;br /&gt;
! Operands&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0x00-0x99]]&lt;br /&gt;
|Note, Tie, Rest&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|The opcode indicates the note key and length. The note will be keyed off 2 ticks before the next note.&lt;br /&gt;
|-&lt;br /&gt;
|0x9A-0x9F&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xA0]]&lt;br /&gt;
|Finish Channel&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa1|0xA1]]&lt;br /&gt;
|Load Instrument&lt;br /&gt;
|2&lt;br /&gt;
|instrument: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0xA2]]&lt;br /&gt;
|Overwrite Next Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length: byte&lt;br /&gt;
|Ignores the regular length (delta-time) of the next note and overwrites it with the specified length.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xA3]]&lt;br /&gt;
|Channel Master Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa4|0xA4]]&lt;br /&gt;
|Pitch Bend Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, semitones: signed byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA5]]&lt;br /&gt;
|Set Octave&lt;br /&gt;
|2&lt;br /&gt;
|octave: byte (0-15)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA6]]&lt;br /&gt;
|Increase Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA7]]&lt;br /&gt;
|Decrease Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xA8]]&lt;br /&gt;
|Channel Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa9|0xA9]]&lt;br /&gt;
|Channel Volume Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xAA]]&lt;br /&gt;
|Channel Pan&lt;br /&gt;
|2&lt;br /&gt;
|pan: byte (0-127)&lt;br /&gt;
|64 is the center.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xab|0xAB]]&lt;br /&gt;
|Channel Pan Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, pan: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xac|0xAC]]&lt;br /&gt;
|Noise Clock Frequency&lt;br /&gt;
|2&lt;br /&gt;
|clock: byte (0x00-0x3f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAD]]&lt;br /&gt;
|ADSR: Attack Rate&lt;br /&gt;
|2&lt;br /&gt;
|attack_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAE]]&lt;br /&gt;
|ADSR: Decay Rate&lt;br /&gt;
|2&lt;br /&gt;
|decay_rate: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAF]]&lt;br /&gt;
|ADSR: Sustain Level&lt;br /&gt;
|2&lt;br /&gt;
|sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB0]]&lt;br /&gt;
|ADSR: Decay Rate &amp;amp; Sustain Level&lt;br /&gt;
|3&lt;br /&gt;
|decay_rate: byte (0x00-0x0f), sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB1]]&lt;br /&gt;
|ADSR: Sustain Rate&lt;br /&gt;
|2&lt;br /&gt;
|sustain_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB2]]&lt;br /&gt;
|ADSR: Release Rate&lt;br /&gt;
|2&lt;br /&gt;
|release_rate: byte (0x00-0x1f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB3]]&lt;br /&gt;
|ADSR: Reset ADSR&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB4]]&lt;br /&gt;
|Vibrato (Channel Pitch LFO)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB5]]&lt;br /&gt;
|Vibrato Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|The most significant bit of the &amp;lt;code&amp;gt;depth&amp;lt;/code&amp;gt; determines the amplitude range.&lt;br /&gt;
&lt;br /&gt;
When it is 0, the range is up to about ± 50 cents (amplitude is 15/256 compared with range type 1).&lt;br /&gt;
&lt;br /&gt;
When it is 1, the range is up to about ± 700 cents.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB6]]&lt;br /&gt;
|Turn Off Vibrato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB7]]&lt;br /&gt;
|ADSR: Attack Mode&lt;br /&gt;
|2&lt;br /&gt;
|attack_mode: byte (1 or 5)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xB8]]&lt;br /&gt;
|Tremolo (Channel Volume LFO)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xB9]]&lt;br /&gt;
|Tremolo Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xBA]]&lt;br /&gt;
|Turn Off Tremolo&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xBB]]&lt;br /&gt;
|ADSR: Sustain Mode&lt;br /&gt;
|2&lt;br /&gt;
|sustain_mode: byte (1, 3, 5 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBC]]&lt;br /&gt;
|Channel Pan LFO&lt;br /&gt;
|3&lt;br /&gt;
|rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBD]]&lt;br /&gt;
|Channel Pan LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBE]]&lt;br /&gt;
|Turn Off Channel Pan LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbf|0xBF]]&lt;br /&gt;
|ADSR: Release Mode&lt;br /&gt;
|2&lt;br /&gt;
|release_mode: byte (3 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc0c1|0xC0]]&lt;br /&gt;
|Channel Transpose (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc0c1|0xC1]]&lt;br /&gt;
|Channel Transpose (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc2c3|0xC2]]&lt;br /&gt;
|Turn On Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc2c3|0xC3]]&lt;br /&gt;
|Turn Off Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc4c5|0xC4]]&lt;br /&gt;
|Turn On Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc4c5|0xC5]]&lt;br /&gt;
|Turn Off Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc6c7|0xC6]]&lt;br /&gt;
|Turn On Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc6c7|0xC7]]&lt;br /&gt;
|Turn Off Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xC8]]&lt;br /&gt;
|Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Remember the current offset as a loop point and increase the nesting level of the loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xC9]]&lt;br /&gt;
|Return to Loop Point Up to N Times&lt;br /&gt;
|2&lt;br /&gt;
|times: byte&lt;br /&gt;
|On the Nth repeat, this instruction will end the current loop by decrementing the nesting level of the loop. Otherwise, it will increment the loop counter and return to the loop point.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xCA]]&lt;br /&gt;
|Return to Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will increment the loop counter.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcb|0xCB]]&lt;br /&gt;
|Reset Sound Effects&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Reset sound effects such as noise, frequency modulation, reverb, overlay voice and alternate voice.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcccd|0xCC]]&lt;br /&gt;
|Turn On Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key on and key off performance of the subsequent notes and update the pitch only.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcccd|0xCD]]&lt;br /&gt;
|Turn Off Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcecf|0xCE]]&lt;br /&gt;
|Turn On Noise and Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcecf|0xCF]]&lt;br /&gt;
|Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd0d1|0xD0]]&lt;br /&gt;
|Turn On Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key off performance of the subsequent notes.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd0d1|0xD1]]&lt;br /&gt;
|Turn Off Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd2d3|0xD2]]&lt;br /&gt;
|Turn On Frequency Modulation and Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd2d3|0xD3]]&lt;br /&gt;
|Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd4d5|0xD4]]&lt;br /&gt;
|Turn On Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Duplicate and use the playback frequency of the previous voice channel.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd4d5|0xD5]]&lt;br /&gt;
|Turn Off Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd6d7|0xD6]]&lt;br /&gt;
|Turn On Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Multiply the playback frequency of the previous voice channel to the output volume. Lower pitch will make the volume smaller.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd6d7|0xD7]]&lt;br /&gt;
|Turn Off Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd8d9|0xD8]]&lt;br /&gt;
|Channel Fine Tuning (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The pitch can be changed in the range of one octave above and below.&lt;br /&gt;
The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is the multiplicand for the playback frequency, not a log-based parameter like cents. For example, when the &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is 127, the pitch will be multiplied by 127/128 (about +1 octave). Negative value ​​will lower the pitch.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd8d9|0xD9]]&lt;br /&gt;
|Channel Fine Tuning (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; will be added to the current tuning amount.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdadb|0xDA]]&lt;br /&gt;
|Turn On Portamento&lt;br /&gt;
|2&lt;br /&gt;
|speed: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;speed&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdadb|0xDB]]&lt;br /&gt;
|Turn Off Portamento&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0xDC]]&lt;br /&gt;
|Fix Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length_to_add: signed byte&lt;br /&gt;
|Ignore the regular length (delta-time) of subsequent notes and set to the fixed length. The &amp;lt;code&amp;gt;length_to_add&amp;lt;/code&amp;gt; parameter will be added to the current length value. (the initial value is 0)&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdd|0xDD]]&lt;br /&gt;
|Vibrato Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xde|0xDE]]&lt;br /&gt;
|Tremolo Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdf|0xDF]]&lt;br /&gt;
|Channel Pan LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe0|0xE0]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe1|0xE1]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|value: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe2|0xE2]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Clears the effect of opcode 0xE1&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe3|0xE3]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe4|0xE4]]&lt;br /&gt;
|Vibrato Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe5|0xE5]]&lt;br /&gt;
|Tremolo Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe6|0xE6]]&lt;br /&gt;
|Channel Pan LFO Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xE7-0xEF]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xf0fd|0xF0-0xFD]]&lt;br /&gt;
|Note, Tie, Rest with Length&lt;br /&gt;
|2&lt;br /&gt;
|length: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe00|0xFE 0x00]]&lt;br /&gt;
|Tempo&lt;br /&gt;
|4&lt;br /&gt;
|tempo: uint16&lt;br /&gt;
|bpm = tempo / 218.453333 (approximate)&lt;br /&gt;
More strictly, &amp;lt;code&amp;gt;bpm = 60.0 / (48 * (65536.0 / tempo) * (0x43D1 / (33868800.0 / 8)))&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe00|0xFE 0x01]]&lt;br /&gt;
|Tempo Slide&lt;br /&gt;
|5&lt;br /&gt;
|length: byte, tempo: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe02|0xFE 0x02]]&lt;br /&gt;
|Reverb Depth&lt;br /&gt;
|4&lt;br /&gt;
|depth: uint16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe02|0xFE 0x03]]&lt;br /&gt;
|Reverb Depth Slide&lt;br /&gt;
|5&lt;br /&gt;
|length: byte, depth: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe04|0xFE 0x04]]&lt;br /&gt;
|Turn On Drum Mode&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|The drum map offset is recorded in the file header.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe04|0xFE 0x05]]&lt;br /&gt;
|Turn Off Drum Mode&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe06|0xFE 0x06]]&lt;br /&gt;
|Unconditional Jump&lt;br /&gt;
|4&lt;br /&gt;
|destination_offset: signed int16&lt;br /&gt;
|This instruction can be used to make an infinite loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe07|0xFE 0x07]]&lt;br /&gt;
|CPU-Conditional Jump&lt;br /&gt;
|5&lt;br /&gt;
|condition: byte, destination_offset: signed int16&lt;br /&gt;
|Jump if the condition variable matches &amp;lt;code&amp;gt;condition&amp;lt;/code&amp;gt;. The value of the condition variable can be set from the game program.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe08|0xFE 0x08]]&lt;br /&gt;
|Jump on the Nth Repeat&lt;br /&gt;
|5&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe08|0xFE 0x09]]&lt;br /&gt;
|Break the Loop on the Nth Repeat&lt;br /&gt;
|5&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|Unlike 0xF0, this instruction will end the current loop by decrementing the nesting level of the loop.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa1|0xFE 0x0A]]&lt;br /&gt;
|Load Instrument (No Attack Sample)&lt;br /&gt;
|3&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|Unlike 0xA1, the sample before the loop point is replaced by a short, silence sample.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0b|0xFE 0x0B]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|6&lt;br /&gt;
|offset: signed int16, offset2: signed int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x0C-0x0D]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0e|0xFE 0x0E]]&lt;br /&gt;
|Pattern&lt;br /&gt;
|4&lt;br /&gt;
|destination_offset: signed int16&lt;br /&gt;
|Remember the return address and jump to the specified location. It cannot be nested.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0f|0xFE 0x0F]]&lt;br /&gt;
|End Pattern&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Return from opcode 0xFE 0x0E.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe10|0xFE 0x10]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|3&lt;br /&gt;
|value: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe10|0xFE 0x11]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Same as 0xFE 0x10 0x00&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa3|0xFE 0x12]]&lt;br /&gt;
|Channel Master Volume Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x13]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe14|0xFE 0x14]]&lt;br /&gt;
|Load Custom Instrument (Key-Split Instrument)&lt;br /&gt;
|3&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|The custom instrument number corresponds to the custom instrument map pointed from the file header. Note that the number is different from the regular sample number used in opcode 0xA1.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe15|0xFE 0x15]]&lt;br /&gt;
|Time Signature&lt;br /&gt;
|4&lt;br /&gt;
|ticks_per_beat: byte, beats_per_measure: byte&lt;br /&gt;
|Note that two parameters can be 0. This pattern is used for initialization.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe16|0xFE 0x16]]&lt;br /&gt;
|Measure Number&lt;br /&gt;
|3&lt;br /&gt;
|measure: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x17-0x18]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa9|0xFE 0x19]]&lt;br /&gt;
|Channel Volume Slide Per Note On&lt;br /&gt;
|4&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|Applies volume slide (opcode 0xA9) for each notes. When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1a|0xFE 0x1A]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Turn something on.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1b|0xFE 0x1B]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Clears the effect of opcode 0xFE 0x1A.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1c|0xFE 0x1C]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|3&lt;br /&gt;
|value: byte&lt;br /&gt;
|Obsoleted opcode? It probably does nothing.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1d|0xFE 0x1D]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Turn something on.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1e|0xFE 0x1E]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Clears the effect of opcode 0xFE 0x1D.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x1F]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|0xFE 0x20-0xFF&lt;br /&gt;
|Unimplemented (Out of Range)&lt;br /&gt;
|n/a&lt;br /&gt;
|&lt;br /&gt;
|Do not use.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFF]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF9/Sound/AKAO_sequence&amp;diff=5769</id>
		<title>FF9/Sound/AKAO sequence</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF9/Sound/AKAO_sequence&amp;diff=5769"/>
		<updated>2020-07-11T22:21:42Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
AKAO sequence is similar to MIDI sequence - it's custom tracker format for playing sequence sound, well tuned specially for PSX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
=== Header (size: 64 bytes) ===&lt;br /&gt;
&lt;br /&gt;
 struct AkaoSeqHeader&lt;br /&gt;
 {&lt;br /&gt;
   static const uint8_t magic[4];  // &amp;quot;AKAO&amp;quot; C-string&lt;br /&gt;
   uint16_t id;                    // song ID, used for playing sequence&lt;br /&gt;
   uint16_t length;                // data length (including this header)&lt;br /&gt;
   uint16_t reverb_type;           // reverb type (range from 0 to 9)&lt;br /&gt;
   uint8_t field_0A[6];&lt;br /&gt;
   uint32_t field_10;&lt;br /&gt;
   uint16_t sample_set_id;         // associated sample set ID&lt;br /&gt;
   uint16_t field_12;&lt;br /&gt;
   uint32_t field_14;&lt;br /&gt;
   uint32_t field_18;&lt;br /&gt;
   uint32_t field_1C;&lt;br /&gt;
   uint32_t mask;                  // represents bitmask of used channels in this song&lt;br /&gt;
   uint32_t field_24;&lt;br /&gt;
   uint32_t field_28;&lt;br /&gt;
   uint32_t field_2C;&lt;br /&gt;
   uint32_t instrument_map_offset; // relative offset to custom instrument map (0 if unused)&lt;br /&gt;
   uint32_t drum_map_offset;       // relative offset to custom drum map (0 if unused)&lt;br /&gt;
   uint32_t field_38;&lt;br /&gt;
   uint32_t field_3C;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
=== Channel Offsets (size: 2 bytes * &amp;lt;channels count&amp;gt;) ===&lt;br /&gt;
 struct AkaoChannelInfo&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t start_offsets[num_channels];  // offsets to channel opcode data&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 AkaoSeqHeader *header;&lt;br /&gt;
 int num_channels = 0;&lt;br /&gt;
 while (int bit = 0; header-&amp;gt;mask &amp;amp; (1 &amp;lt;&amp;lt; bit)) != 0; bit++)&lt;br /&gt;
   num_channels++;&lt;br /&gt;
&lt;br /&gt;
There is &amp;lt;channels count&amp;gt; offsets to channel opcode data counting from current offset. Each offsets is a relative offset based on the address the offset itself.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Channel Commands [AKAO Opcodes] ===&lt;br /&gt;
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 &amp;quot;opcodes&amp;quot;. Every opcode has its own number of arguments.&lt;br /&gt;
&lt;br /&gt;
=== Custom Instrument Map Table ===&lt;br /&gt;
&lt;br /&gt;
When a song uses custom instruments with [[FF9/Sound/Opcodes/0xfe14|opcode 0xFE 0x14]], a custom instrument map table will be placed after the end of AKAO opcode sequence.&lt;br /&gt;
&lt;br /&gt;
This table consists of a collection of zones representing performance settings for a particular key range. A zone is an 8-byte item, and an instrument can have one or more regions.&lt;br /&gt;
&lt;br /&gt;
 struct AkaoInstrumentZoneAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t instrument;   // corresponding to opcode 0xA1&lt;br /&gt;
   uint8_t low_key;      // lowest key (in note number)&lt;br /&gt;
   uint8_t high_key;     // highest key (in note number)&lt;br /&gt;
   uint8_t ar;           // ADSR: attack rate (0-127)&lt;br /&gt;
   uint8_t sr;           // ADSR: sustain rate (0-127)&lt;br /&gt;
   uint8_t s_mode;       // ADSR: sustain mode (1: linear increase, 3: linear decrease, 5: exponential increase, 7: exponential decrease)&lt;br /&gt;
   uint8_t rr;           // ADSR: release rate (0-31)&lt;br /&gt;
   uint8_t volume;       // adjust the note volume to n/128 of the original volume (0 will keep the original volume)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
- Zones must be ordered from low key to high key&lt;br /&gt;
- The final zone of the instrument must be a terminator filled with 0s (more precisely, a zone with ADSR sustain mode of 0 is considered a terminator)&lt;br /&gt;
&lt;br /&gt;
=== Drum Instrument Map Table ===&lt;br /&gt;
&lt;br /&gt;
When a song uses a drum kit with [[FF9/Sound/Opcodes/0xfe04|opcode 0xFE 0x04]], 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.&lt;br /&gt;
&lt;br /&gt;
The table consists of a repetition of 8-byte items.&lt;br /&gt;
&lt;br /&gt;
 struct AkaoDrumKeyAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t instrument;   // corresponding to opcode 0xA1&lt;br /&gt;
   uint8_t key;          // note number when playing the drum note&lt;br /&gt;
   uint8_t ar;           // ADSR: attack rate (0-127)&lt;br /&gt;
   uint8_t sr;           // ADSR: sustain rate (0-127)&lt;br /&gt;
   uint8_t s_mode;       // ADSR: sustain mode (1: linear increase, 3: linear decrease, 5: exponential increase, 7: exponential decrease)&lt;br /&gt;
   uint8_t rr;           // ADSR: release rate (0-31)&lt;br /&gt;
   uint8_t volume;       // adjust the percussion volume to n/128 of the original volume (0 will keep the original volume)&lt;br /&gt;
   uint8_t pan : 7;      // corresponding to opcode 0xAA&lt;br /&gt;
   uint8_t reverb : 1;   // reverb on/off (0: off, 1: on)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sound Opcode List ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Opcode&lt;br /&gt;
! Summary&lt;br /&gt;
! Length&lt;br /&gt;
! Operands&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0x00-0x99]]&lt;br /&gt;
|Note, Tie, Rest&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|The opcode indicates the note key and length. The note will be keyed off 2 ticks before the next note.&lt;br /&gt;
|-&lt;br /&gt;
|0x9A-0x9F&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xA0]]&lt;br /&gt;
|Finish Channel&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa1|0xA1]]&lt;br /&gt;
|Load Instrument&lt;br /&gt;
|2&lt;br /&gt;
|instrument: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0xA2]]&lt;br /&gt;
|Overwrite Next Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length: byte&lt;br /&gt;
|Ignores the regular length (delta-time) of the next note and overwrites it with the specified length.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xA3]]&lt;br /&gt;
|Channel Master Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa4|0xA4]]&lt;br /&gt;
|Pitch Bend Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, semitones: signed byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA5]]&lt;br /&gt;
|Set Octave&lt;br /&gt;
|2&lt;br /&gt;
|octave: byte (0-15)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA6]]&lt;br /&gt;
|Increase Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA7]]&lt;br /&gt;
|Decrease Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xA8]]&lt;br /&gt;
|Channel Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa9|0xA9]]&lt;br /&gt;
|Channel Volume Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xAA]]&lt;br /&gt;
|Channel Pan&lt;br /&gt;
|2&lt;br /&gt;
|pan: byte (0-127)&lt;br /&gt;
|64 is the center.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xab|0xAB]]&lt;br /&gt;
|Channel Pan Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, pan: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xac|0xAC]]&lt;br /&gt;
|Noise Clock Frequency&lt;br /&gt;
|2&lt;br /&gt;
|clock: byte (0x00-0x3f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAD]]&lt;br /&gt;
|ADSR: Attack Rate&lt;br /&gt;
|2&lt;br /&gt;
|attack_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAE]]&lt;br /&gt;
|ADSR: Decay Rate&lt;br /&gt;
|2&lt;br /&gt;
|decay_rate: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAF]]&lt;br /&gt;
|ADSR: Sustain Level&lt;br /&gt;
|2&lt;br /&gt;
|sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB0]]&lt;br /&gt;
|ADSR: Decay Rate &amp;amp; Sustain Level&lt;br /&gt;
|3&lt;br /&gt;
|decay_rate: byte (0x00-0x0f), sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB1]]&lt;br /&gt;
|ADSR: Sustain Rate&lt;br /&gt;
|2&lt;br /&gt;
|sustain_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB2]]&lt;br /&gt;
|ADSR: Release Rate&lt;br /&gt;
|2&lt;br /&gt;
|release_rate: byte (0x00-0x1f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB3]]&lt;br /&gt;
|ADSR: Reset ADSR&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB4]]&lt;br /&gt;
|Vibrato (Channel Pitch LFO)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB5]]&lt;br /&gt;
|Vibrato Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|The most significant bit of the &amp;lt;code&amp;gt;depth&amp;lt;/code&amp;gt; determines the amplitude range.&lt;br /&gt;
&lt;br /&gt;
When it is 0, the range is up to about ± 50 cents (amplitude is 15/256 compared with range type 1).&lt;br /&gt;
&lt;br /&gt;
When it is 1, the range is up to about ± 700 cents.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB6]]&lt;br /&gt;
|Turn Off Vibrato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB7]]&lt;br /&gt;
|ADSR: Attack Mode&lt;br /&gt;
|2&lt;br /&gt;
|attack_mode: byte (1 or 5)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xB8]]&lt;br /&gt;
|Tremolo (Channel Volume LFO)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xB9]]&lt;br /&gt;
|Tremolo Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xBA]]&lt;br /&gt;
|Turn Off Tremolo&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xBB]]&lt;br /&gt;
|ADSR: Sustain Mode&lt;br /&gt;
|2&lt;br /&gt;
|sustain_mode: byte (1, 3, 5 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBC]]&lt;br /&gt;
|Channel Pan LFO&lt;br /&gt;
|3&lt;br /&gt;
|rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBD]]&lt;br /&gt;
|Channel Pan LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBE]]&lt;br /&gt;
|Turn Off Channel Pan LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbf|0xBF]]&lt;br /&gt;
|ADSR: Release Mode&lt;br /&gt;
|2&lt;br /&gt;
|release_mode: byte (3 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc0c1|0xC0]]&lt;br /&gt;
|Channel Transpose (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc0c1|0xC1]]&lt;br /&gt;
|Channel Transpose (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc2c3|0xC2]]&lt;br /&gt;
|Turn On Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc2c3|0xC3]]&lt;br /&gt;
|Turn Off Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc4c5|0xC4]]&lt;br /&gt;
|Turn On Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc4c5|0xC5]]&lt;br /&gt;
|Turn Off Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc6c7|0xC6]]&lt;br /&gt;
|Turn On Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc6c7|0xC7]]&lt;br /&gt;
|Turn Off Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xC8]]&lt;br /&gt;
|Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Remember the current offset as a loop point and increase the nesting level of the loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xC9]]&lt;br /&gt;
|Return to Loop Point Up to N Times&lt;br /&gt;
|2&lt;br /&gt;
|times: byte&lt;br /&gt;
|On the Nth repeat, this instruction will end the current loop by decrementing the nesting level of the loop. Otherwise, it will increment the loop counter and return to the loop point.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xCA]]&lt;br /&gt;
|Return to Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will increment the loop counter.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcb|0xCB]]&lt;br /&gt;
|Reset Sound Effects&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Reset sound effects such as noise, frequency modulation, reverb, overlay voice and alternate voice.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcccd|0xCC]]&lt;br /&gt;
|Turn On Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key on and key off performance of the subsequent notes and update the pitch only.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcccd|0xCD]]&lt;br /&gt;
|Turn Off Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcecf|0xCE]]&lt;br /&gt;
|Turn On Noise and Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcecf|0xCF]]&lt;br /&gt;
|Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd0d1|0xD0]]&lt;br /&gt;
|Turn On Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key off performance of the subsequent notes.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd0d1|0xD1]]&lt;br /&gt;
|Turn Off Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd2d3|0xD2]]&lt;br /&gt;
|Turn On Frequency Modulation and Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd2d3|0xD3]]&lt;br /&gt;
|Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd4d5|0xD4]]&lt;br /&gt;
|Turn On Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Duplicate and use the playback frequency of the previous voice channel.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd4d5|0xD5]]&lt;br /&gt;
|Turn Off Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd6d7|0xD6]]&lt;br /&gt;
|Turn On Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Multiply the playback frequency of the previous voice channel to the output volume. Lower pitch will make the volume smaller.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd6d7|0xD7]]&lt;br /&gt;
|Turn Off Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd8d9|0xD8]]&lt;br /&gt;
|Channel Fine Tuning (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The pitch can be changed in the range of one octave above and below.&lt;br /&gt;
The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is the multiplicand for the playback frequency, not a log-based parameter like cents. For example, when the &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is 127, the pitch will be multiplied by 127/128 (about +1 octave). Negative value ​​will lower the pitch.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd8d9|0xD9]]&lt;br /&gt;
|Channel Fine Tuning (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; will be added to the current tuning amount.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdadb|0xDA]]&lt;br /&gt;
|Turn On Portamento&lt;br /&gt;
|2&lt;br /&gt;
|speed: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;speed&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdadb|0xDB]]&lt;br /&gt;
|Turn Off Portamento&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0xDC]]&lt;br /&gt;
|Fix Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length_to_add: signed byte&lt;br /&gt;
|Ignore the regular length (delta-time) of subsequent notes and set to the fixed length. The &amp;lt;code&amp;gt;length_to_add&amp;lt;/code&amp;gt; parameter will be added to the current length value. (the initial value is 0)&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdd|0xDD]]&lt;br /&gt;
|Vibrato Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xde|0xDE]]&lt;br /&gt;
|Tremolo Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdf|0xDF]]&lt;br /&gt;
|Channel Pan LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe0|0xE0]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe1|0xE1]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|value: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe2|0xE2]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Clears the effect of opcode 0xE1&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe3|0xE3]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe4|0xE4]]&lt;br /&gt;
|Vibrato Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe5|0xE5]]&lt;br /&gt;
|Tremolo Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe6|0xE6]]&lt;br /&gt;
|Channel Pan LFO Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xE7-0xEF]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xf0fd|0xF0-0xFD]]&lt;br /&gt;
|Note, Tie, Rest with Length&lt;br /&gt;
|2&lt;br /&gt;
|length: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe00|0xFE 0x00]]&lt;br /&gt;
|Tempo&lt;br /&gt;
|4&lt;br /&gt;
|tempo: uint16&lt;br /&gt;
|bpm = tempo / 218.453333 (approximate)&lt;br /&gt;
More strictly, &amp;lt;code&amp;gt;bpm = 60.0 / (48 * (65536.0 / tempo) * (0x43D1 / (33868800.0 / 8)))&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe00|0xFE 0x01]]&lt;br /&gt;
|Tempo Slide&lt;br /&gt;
|5&lt;br /&gt;
|length: byte, tempo: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe02|0xFE 0x02]]&lt;br /&gt;
|Reverb Depth&lt;br /&gt;
|4&lt;br /&gt;
|depth: uint16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe02|0xFE 0x03]]&lt;br /&gt;
|Reverb Depth Slide&lt;br /&gt;
|5&lt;br /&gt;
|length: byte, depth: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe04|0xFE 0x04]]&lt;br /&gt;
|Turn On Drum Mode&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|The drum map offset is recorded in the file header.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe04|0xFE 0x05]]&lt;br /&gt;
|Turn Off Drum Mode&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe06|0xFE 0x06]]&lt;br /&gt;
|Unconditional Jump&lt;br /&gt;
|4&lt;br /&gt;
|destination_offset: signed int16&lt;br /&gt;
|This instruction can be used to make an infinite loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe07|0xFE 0x07]]&lt;br /&gt;
|CPU-Conditional Jump&lt;br /&gt;
|5&lt;br /&gt;
|condition: byte, destination_offset: signed int16&lt;br /&gt;
|Jump if the condition variable matches &amp;lt;code&amp;gt;condition&amp;lt;/code&amp;gt;. The value of the condition variable can be set from the game program.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe08|0xFE 0x08]]&lt;br /&gt;
|Jump on the Nth Repeat&lt;br /&gt;
|5&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe08|0xFE 0x09]]&lt;br /&gt;
|Break the Loop on the Nth Repeat&lt;br /&gt;
|5&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|Unlike 0xF0, this instruction will end the current loop by decrementing the nesting level of the loop.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa1|0xFE 0x0A]]&lt;br /&gt;
|Load Instrument (No Attack Sample)&lt;br /&gt;
|3&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|Unlike 0xA1, the sample before the loop point is replaced by a short, silence sample.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0b|0xFE 0x0B]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|6&lt;br /&gt;
|offset: signed int16, offset2: signed int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x0C-0x0D]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0e|0xFE 0x0E]]&lt;br /&gt;
|Subroutine Jump&lt;br /&gt;
|4&lt;br /&gt;
|destination_offset: signed int16&lt;br /&gt;
|The subroutine jump cannot be nested. It will overwrite the return address.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0f|0xFE 0x0F]]&lt;br /&gt;
|Return from Subroutine&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe10|0xFE 0x10]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|3&lt;br /&gt;
|value: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe10|0xFE 0x11]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Same as 0xFE 0x10 0x00&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa3|0xFE 0x12]]&lt;br /&gt;
|Channel Master Volume Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x13]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe14|0xFE 0x14]]&lt;br /&gt;
|Load Custom Instrument (Key-Split Instrument)&lt;br /&gt;
|3&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|The custom instrument number corresponds to the custom instrument map pointed from the file header. Note that the number is different from the regular sample number used in opcode 0xA1.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe15|0xFE 0x15]]&lt;br /&gt;
|Time Signature&lt;br /&gt;
|4&lt;br /&gt;
|ticks_per_beat: byte, beats_per_measure: byte&lt;br /&gt;
|Note that two parameters can be 0. This pattern is used for initialization.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe16|0xFE 0x16]]&lt;br /&gt;
|Measure Number&lt;br /&gt;
|3&lt;br /&gt;
|measure: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x17-0x18]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa9|0xFE 0x19]]&lt;br /&gt;
|Channel Volume Slide Per Note On&lt;br /&gt;
|4&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|Applies volume slide (opcode 0xA9) for each notes. When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1a|0xFE 0x1A]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Turn something on.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1b|0xFE 0x1B]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Clears the effect of opcode 0xFE 0x1A.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1c|0xFE 0x1C]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|3&lt;br /&gt;
|value: byte&lt;br /&gt;
|Obsoleted opcode? It probably does nothing.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1d|0xFE 0x1D]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Turn something on.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1e|0xFE 0x1E]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Clears the effect of opcode 0xFE 0x1D.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x1F]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|0xFE 0x20-0xFF&lt;br /&gt;
|Unimplemented (Out of Range)&lt;br /&gt;
|n/a&lt;br /&gt;
|&lt;br /&gt;
|Do not use.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFF]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/AKAO_sequence&amp;diff=5768</id>
		<title>FF7/PSX/Sound/AKAO sequence</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/AKAO_sequence&amp;diff=5768"/>
		<updated>2020-07-11T22:11:32Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: Channel Pitch LFO -&amp;gt; Vibrato, Channel Volume LFO -&amp;gt; Tremolo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
AKAO sequence is the most complicated part of the FF7 sound system. (&amp;quot;AKAO&amp;quot; is the signature string, which implies that the sound format has developed by Square Enix sound programmer Minoru Akao.)&lt;br /&gt;
&lt;br /&gt;
AKAO sequence is similar to MIDI sequence - it's custom tracker format for playing sequence sound, well tuned specially for PSX.&lt;br /&gt;
&lt;br /&gt;
The sequence data can be found in all FF7 game modules: Field, Battle, Worldmap and in minigames.&lt;br /&gt;
&lt;br /&gt;
All files with exension *.SND are AKAO.&lt;br /&gt;
&lt;br /&gt;
* '''MINI/ASERI2.SND''' - Battle Arena theme&lt;br /&gt;
* '''MINI/SENSUI.SND''' - used in Submarine minigame&lt;br /&gt;
* '''ENEMY6/OVER2.SND''' - game over sequence&lt;br /&gt;
* '''ENEMY6/FAN2.SND''' - battle win &amp;quot;fanfare&amp;quot; sequence&lt;br /&gt;
* '''MOVIE/OVER2.SND''' - same game over sequence, don't know, why to duplicate data&lt;br /&gt;
&lt;br /&gt;
Other AKAO sequences are hard-wired in other files.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
=== Header (size: 16 bytes) ===&lt;br /&gt;
&lt;br /&gt;
 struct AkaoSeqHeader&lt;br /&gt;
 {&lt;br /&gt;
   static const uint8_t magic[4];  // &amp;quot;AKAO&amp;quot; C-string&lt;br /&gt;
   uint16_t id;                    // song ID, used for playing sequence&lt;br /&gt;
   uint16_t length;                // data length - sizeof(header)&lt;br /&gt;
   uint16_t reverb_type;           // reverb type (range from 0 to 9)&lt;br /&gt;
   struct AkaoTimeStamp timestamp; // creation time&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoTimeStamp&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t year_bcd;               // year (in binary coded decimal)&lt;br /&gt;
   uint8_t month_bcd;              // month (in binary coded decimal, between 0x01 - 0x12)&lt;br /&gt;
   uint8_t day_bcd;                // day (in binary coded decimal, between 0x01 - 0x31)&lt;br /&gt;
   uint8_t hours_bcd;              // hours (in binary coded decimal, between 0x00 - 0x23)&lt;br /&gt;
   uint8_t minutes_bcd;            // minutes (in binary coded decimal, between 0x00 - 0x59)&lt;br /&gt;
   uint8_t seconds_bcd;            // seconds (in binary coded decimal, between 0x00 - 0x59)&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
=== Channel Info (size: 4 bytes + 2 bytes * &amp;lt;channels count&amp;gt;) ===&lt;br /&gt;
 struct AkaoChannelInfo&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t mask;                         // represents bitmask of used channels in this song&lt;br /&gt;
   uint32_t start_offsets[num_channels];  // offsets to channel opcode data&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 int num_channels = 0;&lt;br /&gt;
 while (int bit = 0; ((info.mask &amp;amp; 0xFFFFFF) &amp;amp; (1 &amp;lt;&amp;lt; bit)) != 0; bit++)&lt;br /&gt;
   num_channels++;&lt;br /&gt;
&lt;br /&gt;
First there is 32-bit number (offset 0x10), which represents bitmask of used channels in this song.&lt;br /&gt;
&lt;br /&gt;
After this bitmask, there is &amp;lt;channels count&amp;gt; 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.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Channel Commands [AKAO Opcodes] ===&lt;br /&gt;
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 &amp;quot;opcodes&amp;quot;. Every opcode has its own number of arguments (from no-arguments, to 3 arguments).&lt;br /&gt;
&lt;br /&gt;
=== Drum Instrument Map Table ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
The table consists of a repetition of 5-byte items.&lt;br /&gt;
&lt;br /&gt;
 struct AkaoDrumKeyAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t instrument;   // corresponding to opcode 0xA1&lt;br /&gt;
   uint8_t key;          // note number when playing the drum note&lt;br /&gt;
   uint16_t volume;      // corresponding to opcode 0xA8 (lower 8bit is a fractional part of the volume)&lt;br /&gt;
   uint8_t pan;          // corresponding to opcode 0xAA&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Example (Home-Created AKAO Sequence): ==&lt;br /&gt;
=== Header ===&lt;br /&gt;
'''41 4b 41 4f''' - AKAO string&lt;br /&gt;
&lt;br /&gt;
'''34 12''' - song ID: 0x1234&lt;br /&gt;
&lt;br /&gt;
'''16 00''' - data length 0x16 in hex or 22 in decimal&lt;br /&gt;
&lt;br /&gt;
'''04 00''' - reverb type: 4 (large studio)&lt;br /&gt;
&lt;br /&gt;
'''96 12 18 22 46 28''' - created at 1996-12-18 22:46:28&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Channel Info ===&lt;br /&gt;
'''01 00 00 00''' - this indicates, that used only one channel&lt;br /&gt;
&lt;br /&gt;
'''00 00''' - offset to first channel opcodes: in our example 0x00 means that next to this offset is opcodes for first channel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Channel Commands ===&lt;br /&gt;
'''e8 a8 66''' - sets tempo, parameter 0x66a8&lt;br /&gt;
&lt;br /&gt;
'''ea 00 50''' - sets reverb depth&lt;br /&gt;
&lt;br /&gt;
'''a8 55''' - load sample 0x55 from INSTR.ALL to channel&lt;br /&gt;
&lt;br /&gt;
'''aa 40''' - sets channel volume&lt;br /&gt;
&lt;br /&gt;
'''c2''' - turns on reverb effect&lt;br /&gt;
&lt;br /&gt;
'''a1 0c''' - sets volume pan&lt;br /&gt;
&lt;br /&gt;
'''c8''' - sets loop point&lt;br /&gt;
&lt;br /&gt;
'''66''' - 0x66 % 11 = 3 (3 means to take 3rd number from play length table), 0x66 / 11 = 9 (9 means to take pitch[9] from loaded instrument record index)&lt;br /&gt;
&lt;br /&gt;
'''ca''' - returns to saved loop point with opcode c8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This example plays Chocobo &amp;quot;Whoo-Hoo&amp;quot; (instrument number 0x55) repeatedly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sound Opcode List ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Opcode&lt;br /&gt;
! Summary&lt;br /&gt;
! Length&lt;br /&gt;
! Operands&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0x0099|0x00-0x99]]&lt;br /&gt;
|Note, Tie, Rest&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|The opcode indicates the note key and length. The note will be keyed off 2 ticks before the next note.&lt;br /&gt;
|-&lt;br /&gt;
|0x9A-0x9F&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa0|0xA0]]&lt;br /&gt;
|Finish Channel&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa1|0xA1]]&lt;br /&gt;
|Load Instrument&lt;br /&gt;
|2&lt;br /&gt;
|instrument: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0x0099|0xA2]]&lt;br /&gt;
|Overwrite Next Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length: byte&lt;br /&gt;
|Ignores the regular length (delta-time) of the next note and overwrites it with the specified length.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa8aa|0xA3]]&lt;br /&gt;
|Channel Master Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa4|0xA4]]&lt;br /&gt;
|Pitch Bend Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, semitones: signed byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa5|0xA5]]&lt;br /&gt;
|Set Octave&lt;br /&gt;
|2&lt;br /&gt;
|octave: byte (0-15)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa5|0xA6]]&lt;br /&gt;
|Increase Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa5|0xA7]]&lt;br /&gt;
|Decrease Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa8aa|0xA8]]&lt;br /&gt;
|Channel Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa9|0xA9]]&lt;br /&gt;
|Channel Volume Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa8aa|0xAA]]&lt;br /&gt;
|Channel Pan&lt;br /&gt;
|2&lt;br /&gt;
|pan: byte (0-127)&lt;br /&gt;
|64 is the center.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xab|0xAB]]&lt;br /&gt;
|Channel Pan Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, pan: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xac|0xAC]]&lt;br /&gt;
|Noise Clock Frequency&lt;br /&gt;
|2&lt;br /&gt;
|clock: byte (0x00-0x3f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xAD]]&lt;br /&gt;
|ADSR: Attack Rate&lt;br /&gt;
|2&lt;br /&gt;
|attack_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xAE]]&lt;br /&gt;
|ADSR: Decay Rate&lt;br /&gt;
|2&lt;br /&gt;
|decay_rate: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xAF]]&lt;br /&gt;
|ADSR: Sustain Level&lt;br /&gt;
|2&lt;br /&gt;
|sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xB0]]&lt;br /&gt;
|ADSR: Decay Rate &amp;amp; Sustain Level&lt;br /&gt;
|3&lt;br /&gt;
|decay_rate: byte (0x00-0x0f), sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xB1]]&lt;br /&gt;
|ADSR: Sustain Rate&lt;br /&gt;
|2&lt;br /&gt;
|sustain_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xB2]]&lt;br /&gt;
|ADSR: Release Rate&lt;br /&gt;
|2&lt;br /&gt;
|release_rate: byte (0x00-0x1f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xB3]]&lt;br /&gt;
|ADSR: Reset ADSR&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb4b5|0xB4]]&lt;br /&gt;
|Vibrato (Channel Pitch LFO)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb4b5|0xB5]]&lt;br /&gt;
|Vibrato Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|The most significant bit of the &amp;lt;code&amp;gt;depth&amp;lt;/code&amp;gt; determines the amplitude range.&lt;br /&gt;
&lt;br /&gt;
When it is 0, the range is up to about ± 50 cents (amplitude is 15/256 compared with range type 1).&lt;br /&gt;
&lt;br /&gt;
When it is 1, the range is up to about ± 700 cents.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb4b5|0xB6]]&lt;br /&gt;
|Turn Off Vibrato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xB7]]&lt;br /&gt;
|ADSR: Attack Mode&lt;br /&gt;
|2&lt;br /&gt;
|attack_mode: byte (1 or 5)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb8b9|0xB8]]&lt;br /&gt;
|Tremolo (Channel Volume LFO)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb8b9|0xB9]]&lt;br /&gt;
|Tremolo Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb8b9|0xBA]]&lt;br /&gt;
|Turn Off Tremolo&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xBB]]&lt;br /&gt;
|ADSR: Sustain Mode&lt;br /&gt;
|2&lt;br /&gt;
|sustain_mode: byte (1, 3, 5 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xbcbd|0xBC]]&lt;br /&gt;
|Channel Pan LFO&lt;br /&gt;
|3&lt;br /&gt;
|rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xbcbd|0xBD]]&lt;br /&gt;
|Channel Pan LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xbcbd|0xBE]]&lt;br /&gt;
|Turn Off Channel Pan LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xbf|0xBF]]&lt;br /&gt;
|ADSR: Release Mode&lt;br /&gt;
|2&lt;br /&gt;
|release_mode: byte (3 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc0c1|0xC0]]&lt;br /&gt;
|Channel Transpose (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc0c1|0xC1]]&lt;br /&gt;
|Channel Transpose (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc2c3|0xC2]]&lt;br /&gt;
|Turn On Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc2c3|0xC3]]&lt;br /&gt;
|Turn Off Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc4c5|0xC4]]&lt;br /&gt;
|Turn On Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc4c5|0xC5]]&lt;br /&gt;
|Turn Off Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc6c7|0xC6]]&lt;br /&gt;
|Turn On Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc6c7|0xC7]]&lt;br /&gt;
|Turn Off Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc8c9|0xC8]]&lt;br /&gt;
|Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Remember the current offset as a loop point and increase the nesting level of the loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc8c9|0xC9]]&lt;br /&gt;
|Return to Loop Point Up to N Times&lt;br /&gt;
|2&lt;br /&gt;
|times: byte&lt;br /&gt;
|On the Nth repeat, this instruction will end the current loop by decrementing the nesting level of the loop. Otherwise, it will increment the loop counter and return to the loop point.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc8c9|0xCA]]&lt;br /&gt;
|Return to Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will increment the loop counter.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xcb|0xCB]]&lt;br /&gt;
|Reset Sound Effects&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Reset sound effects such as noise, frequency modulation, reverb, overlay voice and alternate voice.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xcccd|0xCC]]&lt;br /&gt;
|Turn On Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key on and key off performance of the subsequent notes and update the pitch only.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xcccd|0xCD]]&lt;br /&gt;
|Turn Off Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xcecf|0xCE]]&lt;br /&gt;
|Turn On Noise and Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xcecf|0xCF]]&lt;br /&gt;
|Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd0d1|0xD0]]&lt;br /&gt;
|Turn On Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key off performance of the subsequent notes.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd0d1|0xD1]]&lt;br /&gt;
|Turn Off Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd2d3|0xD2]]&lt;br /&gt;
|Turn On Frequency Modulation and Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd2d3|0xD3]]&lt;br /&gt;
|Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd4d5|0xD4]]&lt;br /&gt;
|Turn On Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Duplicate and use the playback frequency of the previous voice channel.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd4d5|0xD5]]&lt;br /&gt;
|Turn Off Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd6d7|0xD6]]&lt;br /&gt;
|Turn On Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Multiply the playback frequency of the previous voice channel to the output volume. Lower pitch will make the volume smaller.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd6d7|0xD7]]&lt;br /&gt;
|Turn Off Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd8d9|0xD8]]&lt;br /&gt;
|Channel Fine Tuning (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The pitch can be changed in the range of one octave above and below.&lt;br /&gt;
The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is the multiplicand for the playback frequency, not a log-based parameter like cents. For example, when the &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is 127, the pitch will be multiplied by 127/128 (about +1 octave). Negative value ​​will lower the pitch.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd8d9|0xD9]]&lt;br /&gt;
|Channel Fine Tuning (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; will be added to the current tuning amount.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xdadb|0xDA]]&lt;br /&gt;
|Turn On Portamento&lt;br /&gt;
|2&lt;br /&gt;
|speed: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;speed&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xdadb|0xDB]]&lt;br /&gt;
|Turn Off Portamento&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0x0099|0xDC]]&lt;br /&gt;
|Fix Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length_to_add: signed byte&lt;br /&gt;
|Ignore the regular length (delta-time) of subsequent notes and set to the fixed length. The &amp;lt;code&amp;gt;length_to_add&amp;lt;/code&amp;gt; parameter will be added to the current length value. (the initial value is 0)&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xdd|0xDD]]&lt;br /&gt;
|Vibrato Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xde|0xDE]]&lt;br /&gt;
|Tremolo Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xdf|0xDF]]&lt;br /&gt;
|Channel Pan LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa0|0xE0-0xE7]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xe8e9|0xE8]]&lt;br /&gt;
|Tempo&lt;br /&gt;
|3&lt;br /&gt;
|tempo: uint16&lt;br /&gt;
|bpm = tempo / 214.998204 (approximate)&lt;br /&gt;
More strictly, &amp;lt;code&amp;gt;bpm = 60.0 / (48 * (65536.0 / tempo) * (0x44E8 / (33868800.0 / 8)))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that this coefficient is different from other games with PlayStation AKAO.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xe8e9|0xE9]]&lt;br /&gt;
|Tempo Slide&lt;br /&gt;
|4&lt;br /&gt;
|length: byte, tempo: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xeaeb|0xEA]]&lt;br /&gt;
|Reverb Depth&lt;br /&gt;
|3&lt;br /&gt;
|depth: uint16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xeaeb|0xEB]]&lt;br /&gt;
|Reverb Depth Slide&lt;br /&gt;
|4&lt;br /&gt;
|length: byte, depth: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xeced|0xEC]]&lt;br /&gt;
|Turn On Drum Mode&lt;br /&gt;
|3&lt;br /&gt;
|drum_map_offset: signed int16&lt;br /&gt;
|The &amp;lt;code&amp;gt;drum_map_offset&amp;lt;/code&amp;gt; is a relative offset pointing to the drum instrument map table, which determines the instrument for each keys.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xeced|0xED]]&lt;br /&gt;
|Turn Off Drum Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xee|0xEE]]&lt;br /&gt;
|Unconditional Jump&lt;br /&gt;
|3&lt;br /&gt;
|destination_offset: signed int16&lt;br /&gt;
|This instruction can be used to make an infinite loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xef|0xEF]]&lt;br /&gt;
|CPU-Conditional Jump&lt;br /&gt;
|4&lt;br /&gt;
|condition: byte, destination_offset: signed int16&lt;br /&gt;
|Jump if the condition variable matches &amp;lt;code&amp;gt;condition&amp;lt;/code&amp;gt;. The value of the condition variable can be set from the game program.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf0f1|0xF0]]&lt;br /&gt;
|Jump on the Nth Repeat&lt;br /&gt;
|4&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf0f1|0xF1]]&lt;br /&gt;
|Break the Loop on the Nth Repeat&lt;br /&gt;
|4&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|Unlike 0xF0, this instruction will end the current loop by decrementing the nesting level of the loop.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa1|0xF2]]&lt;br /&gt;
|Load Instrument (No Attack Sample)&lt;br /&gt;
|2&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|Unlike 0xA1, the sample before the loop point is replaced by a short, silence sample.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf3|0xF3]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|There is no actual use in music.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf4f5|0xF4]]&lt;br /&gt;
|Turn On Overlay Voice&lt;br /&gt;
|3&lt;br /&gt;
|instrument: byte, instrument2: byte&lt;br /&gt;
|Play the same melody by different instruments on two voice channels. A free voice channel is required to work. Note that the two channels share the playback rate, and the pitch is not calculated for each instruments.&lt;br /&gt;
Used in the song &amp;quot;Anxious Heart&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf4f5|0xF5]]&lt;br /&gt;
|Turn Off Overlay Voice&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf4f5|0xF6]]&lt;br /&gt;
|Overlay Volume Balance&lt;br /&gt;
|2&lt;br /&gt;
|balance: byte (0-127)&lt;br /&gt;
|When the balance is 0, the volume of the primary voice will be 100% (127/128) of original and that of the secondary voice will be 0%. 127 is the opposite.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf4f5|0xF7]]&lt;br /&gt;
|Overlay Volume Balance Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, balance: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf8f9|0xF8]]&lt;br /&gt;
|Turn On Alternate Voice&lt;br /&gt;
|2&lt;br /&gt;
|release_rate: byte (0x00-0x1f)&lt;br /&gt;
|This instruction allows subsequent notes to be played on two alternating channels. At the same time, the ADSR release rate will be set to the specified value. A free voice channel is required to work. &lt;br /&gt;
Check &amp;quot;Opening - Bombing Mission&amp;quot;, &amp;quot;Tifa's Theme&amp;quot; and &amp;quot;Fortress of the Condor&amp;quot; for actual usage.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf8f9|0xF9]]&lt;br /&gt;
|Turn Off Alternate Voice&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa0|0xFA-0xFC]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xfd|0xFD]]&lt;br /&gt;
|Time Signature&lt;br /&gt;
|3&lt;br /&gt;
|ticks_per_beat: byte, beats_per_measure: byte&lt;br /&gt;
|Note that two parameters can be 0. This pattern is used for initialization.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xfe|0xFE]]&lt;br /&gt;
|Measure Number&lt;br /&gt;
|2&lt;br /&gt;
|measure: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa0|0xFF]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF9/Sound/AKAO_sequence&amp;diff=5767</id>
		<title>FF9/Sound/AKAO sequence</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF9/Sound/AKAO_sequence&amp;diff=5767"/>
		<updated>2020-07-11T22:10:02Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: Channel Pitch LFO -&amp;gt; Vibrato, Channel Volume LFO -&amp;gt; Tremolo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
AKAO sequence is similar to MIDI sequence - it's custom tracker format for playing sequence sound, well tuned specially for PSX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
=== Header (size: 64 bytes) ===&lt;br /&gt;
&lt;br /&gt;
 struct AkaoSeqHeader&lt;br /&gt;
 {&lt;br /&gt;
   static const uint8_t magic[4];  // &amp;quot;AKAO&amp;quot; C-string&lt;br /&gt;
   uint16_t id;                    // song ID, used for playing sequence&lt;br /&gt;
   uint16_t length;                // data length (including this header)&lt;br /&gt;
   uint16_t reverb_type;           // reverb type (range from 0 to 9)&lt;br /&gt;
   uint8_t field_0A[6];&lt;br /&gt;
   uint32_t field_10;&lt;br /&gt;
   uint16_t sample_set_id;         // associated sample set ID&lt;br /&gt;
   uint16_t field_12;&lt;br /&gt;
   uint32_t field_14;&lt;br /&gt;
   uint32_t field_18;&lt;br /&gt;
   uint32_t field_1C;&lt;br /&gt;
   uint32_t mask;                  // represents bitmask of used channels in this song&lt;br /&gt;
   uint32_t field_24;&lt;br /&gt;
   uint32_t field_28;&lt;br /&gt;
   uint32_t field_2C;&lt;br /&gt;
   uint32_t instrument_map_offset; // relative offset to custom instrument map (0 if unused)&lt;br /&gt;
   uint32_t drum_map_offset;       // relative offset to custom drum map (0 if unused)&lt;br /&gt;
   uint32_t field_38;&lt;br /&gt;
   uint32_t field_3C;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
=== Channel Offsets (size: 2 bytes * &amp;lt;channels count&amp;gt;) ===&lt;br /&gt;
 struct AkaoChannelInfo&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t start_offsets[num_channels];  // offsets to channel opcode data&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 AkaoSeqHeader *header;&lt;br /&gt;
 int num_channels = 0;&lt;br /&gt;
 while (int bit = 0; header-&amp;gt;mask &amp;amp; (1 &amp;lt;&amp;lt; bit)) != 0; bit++)&lt;br /&gt;
   num_channels++;&lt;br /&gt;
&lt;br /&gt;
There is &amp;lt;channels count&amp;gt; offsets to channel opcode data counting from current offset. Each offsets is a relative offset based on the address the offset itself.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Channel Commands [AKAO Opcodes] ===&lt;br /&gt;
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 &amp;quot;opcodes&amp;quot;. Every opcode has its own number of arguments.&lt;br /&gt;
&lt;br /&gt;
=== Custom Instrument Map Table ===&lt;br /&gt;
&lt;br /&gt;
When a song uses custom instruments with [[FF9/Sound/Opcodes/0xfe14|opcode 0xFE 0x14]], a custom instrument map table will be placed after the end of AKAO opcode sequence.&lt;br /&gt;
&lt;br /&gt;
This table consists of a collection of zones representing performance settings for a particular key range. A zone is an 8-byte item, and an instrument can have one or more regions.&lt;br /&gt;
&lt;br /&gt;
 struct AkaoInstrumentZoneAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t instrument;   // corresponding to opcode 0xA1&lt;br /&gt;
   uint8_t low_key;      // lowest key (in note number)&lt;br /&gt;
   uint8_t high_key;     // highest key (in note number)&lt;br /&gt;
   uint8_t ar;           // ADSR: attack rate (0-127)&lt;br /&gt;
   uint8_t sr;           // ADSR: sustain rate (0-127)&lt;br /&gt;
   uint8_t s_mode;       // ADSR: sustain mode (1: linear increase, 3: linear decrease, 5: exponential increase, 7: exponential decrease)&lt;br /&gt;
   uint8_t rr;           // ADSR: release rate (0-31)&lt;br /&gt;
   uint8_t volume;       // adjust the note volume to n/128 of the original volume (0 will keep the original volume)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
- Zones must be ordered from low key to high key&lt;br /&gt;
- The final zone of the instrument must be a terminator filled with 0s (more precisely, a zone with ADSR sustain mode of 0 is considered a terminator)&lt;br /&gt;
&lt;br /&gt;
=== Drum Instrument Map Table ===&lt;br /&gt;
&lt;br /&gt;
When a song uses a drum kit with [[FF9/Sound/Opcodes/0xfe04|opcode 0xFE 0x04]], 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.&lt;br /&gt;
&lt;br /&gt;
The table consists of a repetition of 8-byte items.&lt;br /&gt;
&lt;br /&gt;
 struct AkaoDrumKeyAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t instrument;   // corresponding to opcode 0xA1&lt;br /&gt;
   uint8_t key;          // note number when playing the drum note&lt;br /&gt;
   uint8_t ar;           // ADSR: attack rate (0-127)&lt;br /&gt;
   uint8_t sr;           // ADSR: sustain rate (0-127)&lt;br /&gt;
   uint8_t s_mode;       // ADSR: sustain mode (1: linear increase, 3: linear decrease, 5: exponential increase, 7: exponential decrease)&lt;br /&gt;
   uint8_t rr;           // ADSR: release rate (0-31)&lt;br /&gt;
   uint8_t volume;       // adjust the percussion volume to n/128 of the original volume (0 will keep the original volume)&lt;br /&gt;
   uint8_t pan : 7;      // corresponding to opcode 0xAA&lt;br /&gt;
   uint8_t reverb : 1;   // reverb on/off (0: off, 1: on)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sound Opcode List ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Opcode&lt;br /&gt;
! Summary&lt;br /&gt;
! Length&lt;br /&gt;
! Operands&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0x00-0x99]]&lt;br /&gt;
|Note, Tie, Rest&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|The opcode indicates the note key and length. The note will be keyed off 2 ticks before the next note.&lt;br /&gt;
|-&lt;br /&gt;
|0x9A-0x9F&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xA0]]&lt;br /&gt;
|Finish Channel&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa1|0xA1]]&lt;br /&gt;
|Load Instrument&lt;br /&gt;
|2&lt;br /&gt;
|instrument: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0xA2]]&lt;br /&gt;
|Overwrite Next Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length: byte&lt;br /&gt;
|Ignores the regular length (delta-time) of the next note and overwrites it with the specified length.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xA3]]&lt;br /&gt;
|Channel Master Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa4|0xA4]]&lt;br /&gt;
|Pitch Bend Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, semitones: signed byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA5]]&lt;br /&gt;
|Set Octave&lt;br /&gt;
|2&lt;br /&gt;
|octave: byte (0-15)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA6]]&lt;br /&gt;
|Increase Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA7]]&lt;br /&gt;
|Decrease Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xA8]]&lt;br /&gt;
|Channel Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa9|0xA9]]&lt;br /&gt;
|Channel Volume Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xAA]]&lt;br /&gt;
|Channel Pan&lt;br /&gt;
|2&lt;br /&gt;
|pan: byte (0-127)&lt;br /&gt;
|64 is the center.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xab|0xAB]]&lt;br /&gt;
|Channel Pan Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, pan: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xac|0xAC]]&lt;br /&gt;
|Noise Clock Frequency&lt;br /&gt;
|2&lt;br /&gt;
|clock: byte (0x00-0x3f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAD]]&lt;br /&gt;
|ADSR: Attack Rate&lt;br /&gt;
|2&lt;br /&gt;
|attack_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAE]]&lt;br /&gt;
|ADSR: Decay Rate&lt;br /&gt;
|2&lt;br /&gt;
|decay_rate: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAF]]&lt;br /&gt;
|ADSR: Sustain Level&lt;br /&gt;
|2&lt;br /&gt;
|sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB0]]&lt;br /&gt;
|ADSR: Decay Rate &amp;amp; Sustain Level&lt;br /&gt;
|3&lt;br /&gt;
|decay_rate: byte (0x00-0x0f), sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB1]]&lt;br /&gt;
|ADSR: Sustain Rate&lt;br /&gt;
|2&lt;br /&gt;
|sustain_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB2]]&lt;br /&gt;
|ADSR: Release Rate&lt;br /&gt;
|2&lt;br /&gt;
|release_rate: byte (0x00-0x1f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB3]]&lt;br /&gt;
|ADSR: Reset ADSR&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB4]]&lt;br /&gt;
|Vibrato (Channel Pitch LFO)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB5]]&lt;br /&gt;
|Vibrato Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|The most significant bit of the &amp;lt;code&amp;gt;depth&amp;lt;/code&amp;gt; determines the amplitude range.&lt;br /&gt;
&lt;br /&gt;
When it is 0, the range is up to about ± 50 cents (amplitude is 15/256 compared with range type 1).&lt;br /&gt;
&lt;br /&gt;
When it is 1, the range is up to about ± 700 cents.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB6]]&lt;br /&gt;
|Turn Off Vibrato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB7]]&lt;br /&gt;
|ADSR: Attack Mode&lt;br /&gt;
|2&lt;br /&gt;
|attack_mode: byte (1 or 5)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xB8]]&lt;br /&gt;
|Tremolo (Channel Volume LFO)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xB9]]&lt;br /&gt;
|Tremolo Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xBA]]&lt;br /&gt;
|Turn Off Tremolo&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xBB]]&lt;br /&gt;
|ADSR: Sustain Mode&lt;br /&gt;
|2&lt;br /&gt;
|sustain_mode: byte (1, 3, 5 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBC]]&lt;br /&gt;
|Channel Pan LFO&lt;br /&gt;
|3&lt;br /&gt;
|rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBD]]&lt;br /&gt;
|Channel Pan LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBE]]&lt;br /&gt;
|Turn Off Channel Pan LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbf|0xBF]]&lt;br /&gt;
|ADSR: Release Mode&lt;br /&gt;
|2&lt;br /&gt;
|release_mode: byte (3 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc0c1|0xC0]]&lt;br /&gt;
|Channel Transpose (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc0c1|0xC1]]&lt;br /&gt;
|Channel Transpose (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc2c3|0xC2]]&lt;br /&gt;
|Turn On Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc2c3|0xC3]]&lt;br /&gt;
|Turn Off Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc4c5|0xC4]]&lt;br /&gt;
|Turn On Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc4c5|0xC5]]&lt;br /&gt;
|Turn Off Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc6c7|0xC6]]&lt;br /&gt;
|Turn On Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc6c7|0xC7]]&lt;br /&gt;
|Turn Off Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xC8]]&lt;br /&gt;
|Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Remember the current offset as a loop point and increase the nesting level of the loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xC9]]&lt;br /&gt;
|Return to Loop Point Up to N Times&lt;br /&gt;
|2&lt;br /&gt;
|times: byte&lt;br /&gt;
|On the Nth repeat, this instruction will end the current loop by decrementing the nesting level of the loop. Otherwise, it will increment the loop counter and return to the loop point.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xCA]]&lt;br /&gt;
|Return to Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will increment the loop counter.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcb|0xCB]]&lt;br /&gt;
|Reset Sound Effects&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Reset sound effects such as noise, frequency modulation, reverb, overlay voice and alternate voice.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcccd|0xCC]]&lt;br /&gt;
|Turn On Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key on and key off performance of the subsequent notes and update the pitch only.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcccd|0xCD]]&lt;br /&gt;
|Turn Off Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcecf|0xCE]]&lt;br /&gt;
|Turn On Noise and Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcecf|0xCF]]&lt;br /&gt;
|Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd0d1|0xD0]]&lt;br /&gt;
|Turn On Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key off performance of the subsequent notes.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd0d1|0xD1]]&lt;br /&gt;
|Turn Off Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd2d3|0xD2]]&lt;br /&gt;
|Turn On Frequency Modulation and Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd2d3|0xD3]]&lt;br /&gt;
|Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd4d5|0xD4]]&lt;br /&gt;
|Turn On Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Duplicate and use the playback frequency of the previous voice channel.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd4d5|0xD5]]&lt;br /&gt;
|Turn Off Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd6d7|0xD6]]&lt;br /&gt;
|Turn On Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Multiply the playback frequency of the previous voice channel to the output volume. Lower pitch will make the volume smaller.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd6d7|0xD7]]&lt;br /&gt;
|Turn Off Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd8d9|0xD8]]&lt;br /&gt;
|Channel Fine Tuning (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The pitch can be changed in the range of one octave above and below.&lt;br /&gt;
The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is the multiplicand for the playback frequency, not a log-based parameter like cents. For example, when the &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is 127, the pitch will be multiplied by 127/128 (about +1 octave). Negative value ​​will lower the pitch.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd8d9|0xD9]]&lt;br /&gt;
|Channel Fine Tuning (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; will be added to the current tuning amount.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdadb|0xDA]]&lt;br /&gt;
|Turn On Portamento&lt;br /&gt;
|2&lt;br /&gt;
|speed: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;speed&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdadb|0xDB]]&lt;br /&gt;
|Turn Off Portamento&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0xDC]]&lt;br /&gt;
|Fix Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length_to_add: signed byte&lt;br /&gt;
|Ignore the regular length (delta-time) of subsequent notes and set to the fixed length. The &amp;lt;code&amp;gt;length_to_add&amp;lt;/code&amp;gt; parameter will be added to the current length value. (the initial value is 0)&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdd|0xDD]]&lt;br /&gt;
|Vibrato Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xde|0xDE]]&lt;br /&gt;
|Tremolo Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdf|0xDF]]&lt;br /&gt;
|Channel Pan LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe0|0xE0]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe1|0xE1]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|value: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe2|0xE2]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Clears the effect of opcode 0xE1&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe3|0xE3]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe4|0xE4]]&lt;br /&gt;
|Vibrato Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe5|0xE5]]&lt;br /&gt;
|Tremolo Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe6|0xE6]]&lt;br /&gt;
|Channel Pan LFO Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xE7-0xEF]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xf0fd|0xF0-0xFD]]&lt;br /&gt;
|Note, Tie, Rest with Length&lt;br /&gt;
|2&lt;br /&gt;
|length: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe00|0xFE 0x00]]&lt;br /&gt;
|Tempo&lt;br /&gt;
|4&lt;br /&gt;
|tempo: uint16&lt;br /&gt;
|bpm = tempo / 218.453333 (approximate)&lt;br /&gt;
More strictly, &amp;lt;code&amp;gt;bpm = 60.0 / (48 * (65536.0 / tempo) * (0x43D1 / (33868800.0 / 8)))&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe00|0xFE 0x01]]&lt;br /&gt;
|Tempo Slide&lt;br /&gt;
|5&lt;br /&gt;
|length: byte, tempo: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe02|0xFE 0x02]]&lt;br /&gt;
|Reverb Depth&lt;br /&gt;
|4&lt;br /&gt;
|depth: uint16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe02|0xFE 0x03]]&lt;br /&gt;
|Reverb Depth Slide&lt;br /&gt;
|5&lt;br /&gt;
|length: byte, depth: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe04|0xFE 0x04]]&lt;br /&gt;
|Turn On Drum Mode&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|The drum map offset is recorded in the file header.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe04|0xFE 0x05]]&lt;br /&gt;
|Turn Off Drum Mode&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe06|0xFE 0x06]]&lt;br /&gt;
|Unconditional Jump&lt;br /&gt;
|4&lt;br /&gt;
|destination_offset: signed int16&lt;br /&gt;
|This instruction can be used to make an infinite loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe07|0xFE 0x07]]&lt;br /&gt;
|CPU-Conditional Jump&lt;br /&gt;
|5&lt;br /&gt;
|condition: byte, destination_offset: signed int16&lt;br /&gt;
|Jump if the condition variable matches &amp;lt;code&amp;gt;condition&amp;lt;/code&amp;gt;. The value of the condition variable can be set from the game program.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe08|0xFE 0x08]]&lt;br /&gt;
|Jump on the Nth Repeat&lt;br /&gt;
|5&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe08|0xFE 0x09]]&lt;br /&gt;
|Break the Loop on the Nth Repeat&lt;br /&gt;
|5&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|Unlike 0xF0, this instruction will end the current loop by decrementing the nesting level of the loop.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa1|0xFE 0x0A]]&lt;br /&gt;
|Load Instrument (No Attack Sample)&lt;br /&gt;
|3&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|Unlike 0xA1, the sample before the loop point is replaced by a short, silence sample.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0b|0xFE 0x0B]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|6&lt;br /&gt;
|offset: signed int16, offset2: signed int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x0C-0x0D]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0e|0xFE 0x0E]]&lt;br /&gt;
|Subroutine Jump&lt;br /&gt;
|4&lt;br /&gt;
|destination_offset: signed int16&lt;br /&gt;
|The subroutine jump cannot be nested. It will overwrite the return address.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0f|0xFE 0x0F]]&lt;br /&gt;
|Return from Subroutine&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe10|0xFE 0x10]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|3&lt;br /&gt;
|value: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe10|0xFE 0x11]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Clears the effect of opcode 0xFE 0x10&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa3|0xFE 0x12]]&lt;br /&gt;
|Channel Master Volume Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x13]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe14|0xFE 0x14]]&lt;br /&gt;
|Load Custom Instrument (Key-Split Instrument)&lt;br /&gt;
|3&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|The custom instrument number corresponds to the custom instrument map pointed from the file header. Note that the number is different from the regular sample number used in opcode 0xA1.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe15|0xFE 0x15]]&lt;br /&gt;
|Time Signature&lt;br /&gt;
|4&lt;br /&gt;
|ticks_per_beat: byte, beats_per_measure: byte&lt;br /&gt;
|Note that two parameters can be 0. This pattern is used for initialization.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe16|0xFE 0x16]]&lt;br /&gt;
|Measure Number&lt;br /&gt;
|3&lt;br /&gt;
|measure: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x17-0x18]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa9|0xFE 0x19]]&lt;br /&gt;
|Channel Volume Slide Per Note On&lt;br /&gt;
|4&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|Applies volume slide (opcode 0xA9) for each notes. When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1a|0xFE 0x1A]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Turn something on.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1b|0xFE 0x1B]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Clears the effect of opcode 0xFE 0x1A.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1c|0xFE 0x1C]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|3&lt;br /&gt;
|value: byte&lt;br /&gt;
|Obsoleted opcode? It probably does nothing.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1d|0xFE 0x1D]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Turn something on.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1e|0xFE 0x1E]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Clears the effect of opcode 0xFE 0x1D.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x1F]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|0xFE 0x20-0xFF&lt;br /&gt;
|Unimplemented (Out of Range)&lt;br /&gt;
|n/a&lt;br /&gt;
|&lt;br /&gt;
|Do not use.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFF]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF9/Sound/AKAO_sequence&amp;diff=5766</id>
		<title>FF9/Sound/AKAO sequence</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF9/Sound/AKAO_sequence&amp;diff=5766"/>
		<updated>2020-07-11T22:06:51Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: Identify opcode 0xFE 0x0A&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
AKAO sequence is similar to MIDI sequence - it's custom tracker format for playing sequence sound, well tuned specially for PSX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
=== Header (size: 64 bytes) ===&lt;br /&gt;
&lt;br /&gt;
 struct AkaoSeqHeader&lt;br /&gt;
 {&lt;br /&gt;
   static const uint8_t magic[4];  // &amp;quot;AKAO&amp;quot; C-string&lt;br /&gt;
   uint16_t id;                    // song ID, used for playing sequence&lt;br /&gt;
   uint16_t length;                // data length (including this header)&lt;br /&gt;
   uint16_t reverb_type;           // reverb type (range from 0 to 9)&lt;br /&gt;
   uint8_t field_0A[6];&lt;br /&gt;
   uint32_t field_10;&lt;br /&gt;
   uint16_t sample_set_id;         // associated sample set ID&lt;br /&gt;
   uint16_t field_12;&lt;br /&gt;
   uint32_t field_14;&lt;br /&gt;
   uint32_t field_18;&lt;br /&gt;
   uint32_t field_1C;&lt;br /&gt;
   uint32_t mask;                  // represents bitmask of used channels in this song&lt;br /&gt;
   uint32_t field_24;&lt;br /&gt;
   uint32_t field_28;&lt;br /&gt;
   uint32_t field_2C;&lt;br /&gt;
   uint32_t instrument_map_offset; // relative offset to custom instrument map (0 if unused)&lt;br /&gt;
   uint32_t drum_map_offset;       // relative offset to custom drum map (0 if unused)&lt;br /&gt;
   uint32_t field_38;&lt;br /&gt;
   uint32_t field_3C;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
=== Channel Offsets (size: 2 bytes * &amp;lt;channels count&amp;gt;) ===&lt;br /&gt;
 struct AkaoChannelInfo&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t start_offsets[num_channels];  // offsets to channel opcode data&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 AkaoSeqHeader *header;&lt;br /&gt;
 int num_channels = 0;&lt;br /&gt;
 while (int bit = 0; header-&amp;gt;mask &amp;amp; (1 &amp;lt;&amp;lt; bit)) != 0; bit++)&lt;br /&gt;
   num_channels++;&lt;br /&gt;
&lt;br /&gt;
There is &amp;lt;channels count&amp;gt; offsets to channel opcode data counting from current offset. Each offsets is a relative offset based on the address the offset itself.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Channel Commands [AKAO Opcodes] ===&lt;br /&gt;
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 &amp;quot;opcodes&amp;quot;. Every opcode has its own number of arguments.&lt;br /&gt;
&lt;br /&gt;
=== Custom Instrument Map Table ===&lt;br /&gt;
&lt;br /&gt;
When a song uses custom instruments with [[FF9/Sound/Opcodes/0xfe14|opcode 0xFE 0x14]], a custom instrument map table will be placed after the end of AKAO opcode sequence.&lt;br /&gt;
&lt;br /&gt;
This table consists of a collection of zones representing performance settings for a particular key range. A zone is an 8-byte item, and an instrument can have one or more regions.&lt;br /&gt;
&lt;br /&gt;
 struct AkaoInstrumentZoneAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t instrument;   // corresponding to opcode 0xA1&lt;br /&gt;
   uint8_t low_key;      // lowest key (in note number)&lt;br /&gt;
   uint8_t high_key;     // highest key (in note number)&lt;br /&gt;
   uint8_t ar;           // ADSR: attack rate (0-127)&lt;br /&gt;
   uint8_t sr;           // ADSR: sustain rate (0-127)&lt;br /&gt;
   uint8_t s_mode;       // ADSR: sustain mode (1: linear increase, 3: linear decrease, 5: exponential increase, 7: exponential decrease)&lt;br /&gt;
   uint8_t rr;           // ADSR: release rate (0-31)&lt;br /&gt;
   uint8_t volume;       // adjust the note volume to n/128 of the original volume (0 will keep the original volume)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
- Zones must be ordered from low key to high key&lt;br /&gt;
- The final zone of the instrument must be a terminator filled with 0s (more precisely, a zone with ADSR sustain mode of 0 is considered a terminator)&lt;br /&gt;
&lt;br /&gt;
=== Drum Instrument Map Table ===&lt;br /&gt;
&lt;br /&gt;
When a song uses a drum kit with [[FF9/Sound/Opcodes/0xfe04|opcode 0xFE 0x04]], 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.&lt;br /&gt;
&lt;br /&gt;
The table consists of a repetition of 8-byte items.&lt;br /&gt;
&lt;br /&gt;
 struct AkaoDrumKeyAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t instrument;   // corresponding to opcode 0xA1&lt;br /&gt;
   uint8_t key;          // note number when playing the drum note&lt;br /&gt;
   uint8_t ar;           // ADSR: attack rate (0-127)&lt;br /&gt;
   uint8_t sr;           // ADSR: sustain rate (0-127)&lt;br /&gt;
   uint8_t s_mode;       // ADSR: sustain mode (1: linear increase, 3: linear decrease, 5: exponential increase, 7: exponential decrease)&lt;br /&gt;
   uint8_t rr;           // ADSR: release rate (0-31)&lt;br /&gt;
   uint8_t volume;       // adjust the percussion volume to n/128 of the original volume (0 will keep the original volume)&lt;br /&gt;
   uint8_t pan : 7;      // corresponding to opcode 0xAA&lt;br /&gt;
   uint8_t reverb : 1;   // reverb on/off (0: off, 1: on)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sound Opcode List ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Opcode&lt;br /&gt;
! Summary&lt;br /&gt;
! Length&lt;br /&gt;
! Operands&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0x00-0x99]]&lt;br /&gt;
|Note, Tie, Rest&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|The opcode indicates the note key and length. The note will be keyed off 2 ticks before the next note.&lt;br /&gt;
|-&lt;br /&gt;
|0x9A-0x9F&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xA0]]&lt;br /&gt;
|Finish Channel&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa1|0xA1]]&lt;br /&gt;
|Load Instrument&lt;br /&gt;
|2&lt;br /&gt;
|instrument: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0xA2]]&lt;br /&gt;
|Overwrite Next Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length: byte&lt;br /&gt;
|Ignores the regular length (delta-time) of the next note and overwrites it with the specified length.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xA3]]&lt;br /&gt;
|Channel Master Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa4|0xA4]]&lt;br /&gt;
|Pitch Bend Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, semitones: signed byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA5]]&lt;br /&gt;
|Set Octave&lt;br /&gt;
|2&lt;br /&gt;
|octave: byte (0-15)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA6]]&lt;br /&gt;
|Increase Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA7]]&lt;br /&gt;
|Decrease Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xA8]]&lt;br /&gt;
|Channel Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa9|0xA9]]&lt;br /&gt;
|Channel Volume Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xAA]]&lt;br /&gt;
|Channel Pan&lt;br /&gt;
|2&lt;br /&gt;
|pan: byte (0-127)&lt;br /&gt;
|64 is the center.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xab|0xAB]]&lt;br /&gt;
|Channel Pan Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, pan: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xac|0xAC]]&lt;br /&gt;
|Noise Clock Frequency&lt;br /&gt;
|2&lt;br /&gt;
|clock: byte (0x00-0x3f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAD]]&lt;br /&gt;
|ADSR: Attack Rate&lt;br /&gt;
|2&lt;br /&gt;
|attack_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAE]]&lt;br /&gt;
|ADSR: Decay Rate&lt;br /&gt;
|2&lt;br /&gt;
|decay_rate: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAF]]&lt;br /&gt;
|ADSR: Sustain Level&lt;br /&gt;
|2&lt;br /&gt;
|sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB0]]&lt;br /&gt;
|ADSR: Decay Rate &amp;amp; Sustain Level&lt;br /&gt;
|3&lt;br /&gt;
|decay_rate: byte (0x00-0x0f), sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB1]]&lt;br /&gt;
|ADSR: Sustain Rate&lt;br /&gt;
|2&lt;br /&gt;
|sustain_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB2]]&lt;br /&gt;
|ADSR: Release Rate&lt;br /&gt;
|2&lt;br /&gt;
|release_rate: byte (0x00-0x1f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB3]]&lt;br /&gt;
|ADSR: Reset ADSR&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB4]]&lt;br /&gt;
|Channel Pitch LFO (Vibrato)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB5]]&lt;br /&gt;
|Channel Pitch LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|The most significant bit of the &amp;lt;code&amp;gt;depth&amp;lt;/code&amp;gt; determines the amplitude range.&lt;br /&gt;
&lt;br /&gt;
When it is 0, the range is up to about ± 50 cents (amplitude is 15/256 compared with range type 1).&lt;br /&gt;
&lt;br /&gt;
When it is 1, the range is up to about ± 700 cents.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB6]]&lt;br /&gt;
|Turn Off Channel Pitch LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB7]]&lt;br /&gt;
|ADSR: Attack Mode&lt;br /&gt;
|2&lt;br /&gt;
|attack_mode: byte (1 or 5)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xB8]]&lt;br /&gt;
|Channel Volume LFO (Tremolo)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xB9]]&lt;br /&gt;
|Channel Volume LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xBA]]&lt;br /&gt;
|Turn Off Channel Volume LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xBB]]&lt;br /&gt;
|ADSR: Sustain Mode&lt;br /&gt;
|2&lt;br /&gt;
|sustain_mode: byte (1, 3, 5 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBC]]&lt;br /&gt;
|Channel Pan LFO&lt;br /&gt;
|3&lt;br /&gt;
|rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBD]]&lt;br /&gt;
|Channel Pan LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBE]]&lt;br /&gt;
|Turn Off Channel Pan LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbf|0xBF]]&lt;br /&gt;
|ADSR: Release Mode&lt;br /&gt;
|2&lt;br /&gt;
|release_mode: byte (3 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc0c1|0xC0]]&lt;br /&gt;
|Channel Transpose (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc0c1|0xC1]]&lt;br /&gt;
|Channel Transpose (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc2c3|0xC2]]&lt;br /&gt;
|Turn On Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc2c3|0xC3]]&lt;br /&gt;
|Turn Off Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc4c5|0xC4]]&lt;br /&gt;
|Turn On Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc4c5|0xC5]]&lt;br /&gt;
|Turn Off Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc6c7|0xC6]]&lt;br /&gt;
|Turn On Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc6c7|0xC7]]&lt;br /&gt;
|Turn Off Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xC8]]&lt;br /&gt;
|Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Remember the current offset as a loop point and increase the nesting level of the loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xC9]]&lt;br /&gt;
|Return to Loop Point Up to N Times&lt;br /&gt;
|2&lt;br /&gt;
|times: byte&lt;br /&gt;
|On the Nth repeat, this instruction will end the current loop by decrementing the nesting level of the loop. Otherwise, it will increment the loop counter and return to the loop point.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xCA]]&lt;br /&gt;
|Return to Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will increment the loop counter.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcb|0xCB]]&lt;br /&gt;
|Reset Sound Effects&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Reset sound effects such as noise, frequency modulation, reverb, overlay voice and alternate voice.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcccd|0xCC]]&lt;br /&gt;
|Turn On Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key on and key off performance of the subsequent notes and update the pitch only.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcccd|0xCD]]&lt;br /&gt;
|Turn Off Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcecf|0xCE]]&lt;br /&gt;
|Turn On Noise and Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcecf|0xCF]]&lt;br /&gt;
|Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd0d1|0xD0]]&lt;br /&gt;
|Turn On Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key off performance of the subsequent notes.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd0d1|0xD1]]&lt;br /&gt;
|Turn Off Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd2d3|0xD2]]&lt;br /&gt;
|Turn On Frequency Modulation and Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd2d3|0xD3]]&lt;br /&gt;
|Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd4d5|0xD4]]&lt;br /&gt;
|Turn On Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Duplicate and use the playback frequency of the previous voice channel.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd4d5|0xD5]]&lt;br /&gt;
|Turn Off Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd6d7|0xD6]]&lt;br /&gt;
|Turn On Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Multiply the playback frequency of the previous voice channel to the output volume. Lower pitch will make the volume smaller.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd6d7|0xD7]]&lt;br /&gt;
|Turn Off Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd8d9|0xD8]]&lt;br /&gt;
|Channel Fine Tuning (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The pitch can be changed in the range of one octave above and below.&lt;br /&gt;
The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is the multiplicand for the playback frequency, not a log-based parameter like cents. For example, when the &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is 127, the pitch will be multiplied by 127/128 (about +1 octave). Negative value ​​will lower the pitch.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd8d9|0xD9]]&lt;br /&gt;
|Channel Fine Tuning (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; will be added to the current tuning amount.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdadb|0xDA]]&lt;br /&gt;
|Turn On Portamento&lt;br /&gt;
|2&lt;br /&gt;
|speed: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;speed&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdadb|0xDB]]&lt;br /&gt;
|Turn Off Portamento&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0xDC]]&lt;br /&gt;
|Fix Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length_to_add: signed byte&lt;br /&gt;
|Ignore the regular length (delta-time) of subsequent notes and set to the fixed length. The &amp;lt;code&amp;gt;length_to_add&amp;lt;/code&amp;gt; parameter will be added to the current length value. (the initial value is 0)&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdd|0xDD]]&lt;br /&gt;
|Channel Pitch LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xde|0xDE]]&lt;br /&gt;
|Channel Volume LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdf|0xDF]]&lt;br /&gt;
|Channel Pan LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe0|0xE0]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe1|0xE1]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|value: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe2|0xE2]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Clears the effect of opcode 0xE1&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe3|0xE3]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe4|0xE4]]&lt;br /&gt;
|Channel Pitch LFO Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe5|0xE5]]&lt;br /&gt;
|Channel Volume LFO Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe6|0xE6]]&lt;br /&gt;
|Channel Pan LFO Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xE7-0xEF]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xf0fd|0xF0-0xFD]]&lt;br /&gt;
|Note, Tie, Rest with Length&lt;br /&gt;
|2&lt;br /&gt;
|length: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe00|0xFE 0x00]]&lt;br /&gt;
|Tempo&lt;br /&gt;
|4&lt;br /&gt;
|tempo: uint16&lt;br /&gt;
|bpm = tempo / 218.453333 (approximate)&lt;br /&gt;
More strictly, &amp;lt;code&amp;gt;bpm = 60.0 / (48 * (65536.0 / tempo) * (0x43D1 / (33868800.0 / 8)))&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe00|0xFE 0x01]]&lt;br /&gt;
|Tempo Slide&lt;br /&gt;
|5&lt;br /&gt;
|length: byte, tempo: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe02|0xFE 0x02]]&lt;br /&gt;
|Reverb Depth&lt;br /&gt;
|4&lt;br /&gt;
|depth: uint16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe02|0xFE 0x03]]&lt;br /&gt;
|Reverb Depth Slide&lt;br /&gt;
|5&lt;br /&gt;
|length: byte, depth: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe04|0xFE 0x04]]&lt;br /&gt;
|Turn On Drum Mode&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|The drum map offset is recorded in the file header.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe04|0xFE 0x05]]&lt;br /&gt;
|Turn Off Drum Mode&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe06|0xFE 0x06]]&lt;br /&gt;
|Unconditional Jump&lt;br /&gt;
|4&lt;br /&gt;
|destination_offset: signed int16&lt;br /&gt;
|This instruction can be used to make an infinite loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe07|0xFE 0x07]]&lt;br /&gt;
|CPU-Conditional Jump&lt;br /&gt;
|5&lt;br /&gt;
|condition: byte, destination_offset: signed int16&lt;br /&gt;
|Jump if the condition variable matches &amp;lt;code&amp;gt;condition&amp;lt;/code&amp;gt;. The value of the condition variable can be set from the game program.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe08|0xFE 0x08]]&lt;br /&gt;
|Jump on the Nth Repeat&lt;br /&gt;
|5&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe08|0xFE 0x09]]&lt;br /&gt;
|Break the Loop on the Nth Repeat&lt;br /&gt;
|5&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|Unlike 0xF0, this instruction will end the current loop by decrementing the nesting level of the loop.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa1|0xFE 0x0A]]&lt;br /&gt;
|Load Instrument (No Attack Sample)&lt;br /&gt;
|3&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|Unlike 0xA1, the sample before the loop point is replaced by a short, silence sample.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0b|0xFE 0x0B]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|6&lt;br /&gt;
|offset: signed int16, offset2: signed int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x0C-0x0D]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0e|0xFE 0x0E]]&lt;br /&gt;
|Subroutine Jump&lt;br /&gt;
|4&lt;br /&gt;
|destination_offset: signed int16&lt;br /&gt;
|The subroutine jump cannot be nested. It will overwrite the return address.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0f|0xFE 0x0F]]&lt;br /&gt;
|Return from Subroutine&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe10|0xFE 0x10]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|3&lt;br /&gt;
|value: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe10|0xFE 0x11]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Clears the effect of opcode 0xFE 0x10&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa3|0xFE 0x12]]&lt;br /&gt;
|Channel Master Volume Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x13]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe14|0xFE 0x14]]&lt;br /&gt;
|Load Custom Instrument (Key-Split Instrument)&lt;br /&gt;
|3&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|The custom instrument number corresponds to the custom instrument map pointed from the file header. Note that the number is different from the regular sample number used in opcode 0xA1.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe15|0xFE 0x15]]&lt;br /&gt;
|Time Signature&lt;br /&gt;
|4&lt;br /&gt;
|ticks_per_beat: byte, beats_per_measure: byte&lt;br /&gt;
|Note that two parameters can be 0. This pattern is used for initialization.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe16|0xFE 0x16]]&lt;br /&gt;
|Measure Number&lt;br /&gt;
|3&lt;br /&gt;
|measure: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x17-0x18]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa9|0xFE 0x19]]&lt;br /&gt;
|Channel Volume Slide Per Note On&lt;br /&gt;
|4&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|Applies volume slide (opcode 0xA9) for each notes. When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1a|0xFE 0x1A]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Turn something on.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1b|0xFE 0x1B]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Clears the effect of opcode 0xFE 0x1A.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1c|0xFE 0x1C]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|3&lt;br /&gt;
|value: byte&lt;br /&gt;
|Obsoleted opcode? It probably does nothing.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1d|0xFE 0x1D]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Turn something on.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1e|0xFE 0x1E]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Clears the effect of opcode 0xFE 0x1D.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x1F]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|0xFE 0x20-0xFF&lt;br /&gt;
|Unimplemented (Out of Range)&lt;br /&gt;
|n/a&lt;br /&gt;
|&lt;br /&gt;
|Do not use.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFF]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF9/Sound/AKAO_sequence&amp;diff=5765</id>
		<title>FF9/Sound/AKAO sequence</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF9/Sound/AKAO_sequence&amp;diff=5765"/>
		<updated>2020-07-11T21:54:47Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: Size of all opcodes identified&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
AKAO sequence is similar to MIDI sequence - it's custom tracker format for playing sequence sound, well tuned specially for PSX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
=== Header (size: 64 bytes) ===&lt;br /&gt;
&lt;br /&gt;
 struct AkaoSeqHeader&lt;br /&gt;
 {&lt;br /&gt;
   static const uint8_t magic[4];  // &amp;quot;AKAO&amp;quot; C-string&lt;br /&gt;
   uint16_t id;                    // song ID, used for playing sequence&lt;br /&gt;
   uint16_t length;                // data length (including this header)&lt;br /&gt;
   uint16_t reverb_type;           // reverb type (range from 0 to 9)&lt;br /&gt;
   uint8_t field_0A[6];&lt;br /&gt;
   uint32_t field_10;&lt;br /&gt;
   uint16_t sample_set_id;         // associated sample set ID&lt;br /&gt;
   uint16_t field_12;&lt;br /&gt;
   uint32_t field_14;&lt;br /&gt;
   uint32_t field_18;&lt;br /&gt;
   uint32_t field_1C;&lt;br /&gt;
   uint32_t mask;                  // represents bitmask of used channels in this song&lt;br /&gt;
   uint32_t field_24;&lt;br /&gt;
   uint32_t field_28;&lt;br /&gt;
   uint32_t field_2C;&lt;br /&gt;
   uint32_t instrument_map_offset; // relative offset to custom instrument map (0 if unused)&lt;br /&gt;
   uint32_t drum_map_offset;       // relative offset to custom drum map (0 if unused)&lt;br /&gt;
   uint32_t field_38;&lt;br /&gt;
   uint32_t field_3C;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
=== Channel Offsets (size: 2 bytes * &amp;lt;channels count&amp;gt;) ===&lt;br /&gt;
 struct AkaoChannelInfo&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t start_offsets[num_channels];  // offsets to channel opcode data&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 AkaoSeqHeader *header;&lt;br /&gt;
 int num_channels = 0;&lt;br /&gt;
 while (int bit = 0; header-&amp;gt;mask &amp;amp; (1 &amp;lt;&amp;lt; bit)) != 0; bit++)&lt;br /&gt;
   num_channels++;&lt;br /&gt;
&lt;br /&gt;
There is &amp;lt;channels count&amp;gt; offsets to channel opcode data counting from current offset. Each offsets is a relative offset based on the address the offset itself.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Channel Commands [AKAO Opcodes] ===&lt;br /&gt;
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 &amp;quot;opcodes&amp;quot;. Every opcode has its own number of arguments.&lt;br /&gt;
&lt;br /&gt;
=== Custom Instrument Map Table ===&lt;br /&gt;
&lt;br /&gt;
When a song uses custom instruments with [[FF9/Sound/Opcodes/0xfe14|opcode 0xFE 0x14]], a custom instrument map table will be placed after the end of AKAO opcode sequence.&lt;br /&gt;
&lt;br /&gt;
This table consists of a collection of zones representing performance settings for a particular key range. A zone is an 8-byte item, and an instrument can have one or more regions.&lt;br /&gt;
&lt;br /&gt;
 struct AkaoInstrumentZoneAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t instrument;   // corresponding to opcode 0xA1&lt;br /&gt;
   uint8_t low_key;      // lowest key (in note number)&lt;br /&gt;
   uint8_t high_key;     // highest key (in note number)&lt;br /&gt;
   uint8_t ar;           // ADSR: attack rate (0-127)&lt;br /&gt;
   uint8_t sr;           // ADSR: sustain rate (0-127)&lt;br /&gt;
   uint8_t s_mode;       // ADSR: sustain mode (1: linear increase, 3: linear decrease, 5: exponential increase, 7: exponential decrease)&lt;br /&gt;
   uint8_t rr;           // ADSR: release rate (0-31)&lt;br /&gt;
   uint8_t volume;       // adjust the note volume to n/128 of the original volume (0 will keep the original volume)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
- Zones must be ordered from low key to high key&lt;br /&gt;
- The final zone of the instrument must be a terminator filled with 0s (more precisely, a zone with ADSR sustain mode of 0 is considered a terminator)&lt;br /&gt;
&lt;br /&gt;
=== Drum Instrument Map Table ===&lt;br /&gt;
&lt;br /&gt;
When a song uses a drum kit with [[FF9/Sound/Opcodes/0xfe04|opcode 0xFE 0x04]], 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.&lt;br /&gt;
&lt;br /&gt;
The table consists of a repetition of 8-byte items.&lt;br /&gt;
&lt;br /&gt;
 struct AkaoDrumKeyAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t instrument;   // corresponding to opcode 0xA1&lt;br /&gt;
   uint8_t key;          // note number when playing the drum note&lt;br /&gt;
   uint8_t ar;           // ADSR: attack rate (0-127)&lt;br /&gt;
   uint8_t sr;           // ADSR: sustain rate (0-127)&lt;br /&gt;
   uint8_t s_mode;       // ADSR: sustain mode (1: linear increase, 3: linear decrease, 5: exponential increase, 7: exponential decrease)&lt;br /&gt;
   uint8_t rr;           // ADSR: release rate (0-31)&lt;br /&gt;
   uint8_t volume;       // adjust the percussion volume to n/128 of the original volume (0 will keep the original volume)&lt;br /&gt;
   uint8_t pan : 7;      // corresponding to opcode 0xAA&lt;br /&gt;
   uint8_t reverb : 1;   // reverb on/off (0: off, 1: on)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sound Opcode List ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Opcode&lt;br /&gt;
! Summary&lt;br /&gt;
! Length&lt;br /&gt;
! Operands&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0x00-0x99]]&lt;br /&gt;
|Note, Tie, Rest&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|The opcode indicates the note key and length. The note will be keyed off 2 ticks before the next note.&lt;br /&gt;
|-&lt;br /&gt;
|0x9A-0x9F&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xA0]]&lt;br /&gt;
|Finish Channel&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa1|0xA1]]&lt;br /&gt;
|Load Instrument&lt;br /&gt;
|2&lt;br /&gt;
|instrument: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0xA2]]&lt;br /&gt;
|Overwrite Next Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length: byte&lt;br /&gt;
|Ignores the regular length (delta-time) of the next note and overwrites it with the specified length.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xA3]]&lt;br /&gt;
|Channel Master Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa4|0xA4]]&lt;br /&gt;
|Pitch Bend Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, semitones: signed byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA5]]&lt;br /&gt;
|Set Octave&lt;br /&gt;
|2&lt;br /&gt;
|octave: byte (0-15)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA6]]&lt;br /&gt;
|Increase Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA7]]&lt;br /&gt;
|Decrease Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xA8]]&lt;br /&gt;
|Channel Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa9|0xA9]]&lt;br /&gt;
|Channel Volume Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xAA]]&lt;br /&gt;
|Channel Pan&lt;br /&gt;
|2&lt;br /&gt;
|pan: byte (0-127)&lt;br /&gt;
|64 is the center.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xab|0xAB]]&lt;br /&gt;
|Channel Pan Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, pan: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xac|0xAC]]&lt;br /&gt;
|Noise Clock Frequency&lt;br /&gt;
|2&lt;br /&gt;
|clock: byte (0x00-0x3f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAD]]&lt;br /&gt;
|ADSR: Attack Rate&lt;br /&gt;
|2&lt;br /&gt;
|attack_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAE]]&lt;br /&gt;
|ADSR: Decay Rate&lt;br /&gt;
|2&lt;br /&gt;
|decay_rate: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAF]]&lt;br /&gt;
|ADSR: Sustain Level&lt;br /&gt;
|2&lt;br /&gt;
|sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB0]]&lt;br /&gt;
|ADSR: Decay Rate &amp;amp; Sustain Level&lt;br /&gt;
|3&lt;br /&gt;
|decay_rate: byte (0x00-0x0f), sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB1]]&lt;br /&gt;
|ADSR: Sustain Rate&lt;br /&gt;
|2&lt;br /&gt;
|sustain_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB2]]&lt;br /&gt;
|ADSR: Release Rate&lt;br /&gt;
|2&lt;br /&gt;
|release_rate: byte (0x00-0x1f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB3]]&lt;br /&gt;
|ADSR: Reset ADSR&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB4]]&lt;br /&gt;
|Channel Pitch LFO (Vibrato)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB5]]&lt;br /&gt;
|Channel Pitch LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|The most significant bit of the &amp;lt;code&amp;gt;depth&amp;lt;/code&amp;gt; determines the amplitude range.&lt;br /&gt;
&lt;br /&gt;
When it is 0, the range is up to about ± 50 cents (amplitude is 15/256 compared with range type 1).&lt;br /&gt;
&lt;br /&gt;
When it is 1, the range is up to about ± 700 cents.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB6]]&lt;br /&gt;
|Turn Off Channel Pitch LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB7]]&lt;br /&gt;
|ADSR: Attack Mode&lt;br /&gt;
|2&lt;br /&gt;
|attack_mode: byte (1 or 5)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xB8]]&lt;br /&gt;
|Channel Volume LFO (Tremolo)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xB9]]&lt;br /&gt;
|Channel Volume LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xBA]]&lt;br /&gt;
|Turn Off Channel Volume LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xBB]]&lt;br /&gt;
|ADSR: Sustain Mode&lt;br /&gt;
|2&lt;br /&gt;
|sustain_mode: byte (1, 3, 5 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBC]]&lt;br /&gt;
|Channel Pan LFO&lt;br /&gt;
|3&lt;br /&gt;
|rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBD]]&lt;br /&gt;
|Channel Pan LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBE]]&lt;br /&gt;
|Turn Off Channel Pan LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbf|0xBF]]&lt;br /&gt;
|ADSR: Release Mode&lt;br /&gt;
|2&lt;br /&gt;
|release_mode: byte (3 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc0c1|0xC0]]&lt;br /&gt;
|Channel Transpose (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc0c1|0xC1]]&lt;br /&gt;
|Channel Transpose (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc2c3|0xC2]]&lt;br /&gt;
|Turn On Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc2c3|0xC3]]&lt;br /&gt;
|Turn Off Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc4c5|0xC4]]&lt;br /&gt;
|Turn On Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc4c5|0xC5]]&lt;br /&gt;
|Turn Off Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc6c7|0xC6]]&lt;br /&gt;
|Turn On Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc6c7|0xC7]]&lt;br /&gt;
|Turn Off Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xC8]]&lt;br /&gt;
|Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Remember the current offset as a loop point and increase the nesting level of the loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xC9]]&lt;br /&gt;
|Return to Loop Point Up to N Times&lt;br /&gt;
|2&lt;br /&gt;
|times: byte&lt;br /&gt;
|On the Nth repeat, this instruction will end the current loop by decrementing the nesting level of the loop. Otherwise, it will increment the loop counter and return to the loop point.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xCA]]&lt;br /&gt;
|Return to Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will increment the loop counter.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcb|0xCB]]&lt;br /&gt;
|Reset Sound Effects&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Reset sound effects such as noise, frequency modulation, reverb, overlay voice and alternate voice.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcccd|0xCC]]&lt;br /&gt;
|Turn On Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key on and key off performance of the subsequent notes and update the pitch only.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcccd|0xCD]]&lt;br /&gt;
|Turn Off Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcecf|0xCE]]&lt;br /&gt;
|Turn On Noise and Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcecf|0xCF]]&lt;br /&gt;
|Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd0d1|0xD0]]&lt;br /&gt;
|Turn On Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key off performance of the subsequent notes.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd0d1|0xD1]]&lt;br /&gt;
|Turn Off Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd2d3|0xD2]]&lt;br /&gt;
|Turn On Frequency Modulation and Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd2d3|0xD3]]&lt;br /&gt;
|Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd4d5|0xD4]]&lt;br /&gt;
|Turn On Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Duplicate and use the playback frequency of the previous voice channel.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd4d5|0xD5]]&lt;br /&gt;
|Turn Off Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd6d7|0xD6]]&lt;br /&gt;
|Turn On Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Multiply the playback frequency of the previous voice channel to the output volume. Lower pitch will make the volume smaller.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd6d7|0xD7]]&lt;br /&gt;
|Turn Off Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd8d9|0xD8]]&lt;br /&gt;
|Channel Fine Tuning (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The pitch can be changed in the range of one octave above and below.&lt;br /&gt;
The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is the multiplicand for the playback frequency, not a log-based parameter like cents. For example, when the &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is 127, the pitch will be multiplied by 127/128 (about +1 octave). Negative value ​​will lower the pitch.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd8d9|0xD9]]&lt;br /&gt;
|Channel Fine Tuning (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; will be added to the current tuning amount.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdadb|0xDA]]&lt;br /&gt;
|Turn On Portamento&lt;br /&gt;
|2&lt;br /&gt;
|speed: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;speed&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdadb|0xDB]]&lt;br /&gt;
|Turn Off Portamento&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0xDC]]&lt;br /&gt;
|Fix Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length_to_add: signed byte&lt;br /&gt;
|Ignore the regular length (delta-time) of subsequent notes and set to the fixed length. The &amp;lt;code&amp;gt;length_to_add&amp;lt;/code&amp;gt; parameter will be added to the current length value. (the initial value is 0)&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdd|0xDD]]&lt;br /&gt;
|Channel Pitch LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xde|0xDE]]&lt;br /&gt;
|Channel Volume LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdf|0xDF]]&lt;br /&gt;
|Channel Pan LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe0|0xE0]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe1|0xE1]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|value: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe2|0xE2]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Clears the effect of opcode 0xE1&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe3|0xE3]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe4|0xE4]]&lt;br /&gt;
|Channel Pitch LFO Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe5|0xE5]]&lt;br /&gt;
|Channel Volume LFO Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe6|0xE6]]&lt;br /&gt;
|Channel Pan LFO Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xE7-0xEF]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xf0fd|0xF0-0xFD]]&lt;br /&gt;
|Note, Tie, Rest with Length&lt;br /&gt;
|2&lt;br /&gt;
|length: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe00|0xFE 0x00]]&lt;br /&gt;
|Tempo&lt;br /&gt;
|4&lt;br /&gt;
|tempo: uint16&lt;br /&gt;
|bpm = tempo / 218.453333 (approximate)&lt;br /&gt;
More strictly, &amp;lt;code&amp;gt;bpm = 60.0 / (48 * (65536.0 / tempo) * (0x43D1 / (33868800.0 / 8)))&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe00|0xFE 0x01]]&lt;br /&gt;
|Tempo Slide&lt;br /&gt;
|5&lt;br /&gt;
|length: byte, tempo: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe02|0xFE 0x02]]&lt;br /&gt;
|Reverb Depth&lt;br /&gt;
|4&lt;br /&gt;
|depth: uint16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe02|0xFE 0x03]]&lt;br /&gt;
|Reverb Depth Slide&lt;br /&gt;
|5&lt;br /&gt;
|length: byte, depth: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe04|0xFE 0x04]]&lt;br /&gt;
|Turn On Drum Mode&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|The drum map offset is recorded in the file header.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe04|0xFE 0x05]]&lt;br /&gt;
|Turn Off Drum Mode&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe06|0xFE 0x06]]&lt;br /&gt;
|Unconditional Jump&lt;br /&gt;
|4&lt;br /&gt;
|destination_offset: signed int16&lt;br /&gt;
|This instruction can be used to make an infinite loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe07|0xFE 0x07]]&lt;br /&gt;
|CPU-Conditional Jump&lt;br /&gt;
|5&lt;br /&gt;
|condition: byte, destination_offset: signed int16&lt;br /&gt;
|Jump if the condition variable matches &amp;lt;code&amp;gt;condition&amp;lt;/code&amp;gt;. The value of the condition variable can be set from the game program.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe08|0xFE 0x08]]&lt;br /&gt;
|Jump on the Nth Repeat&lt;br /&gt;
|5&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe08|0xFE 0x09]]&lt;br /&gt;
|Break the Loop on the Nth Repeat&lt;br /&gt;
|5&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|Unlike 0xF0, this instruction will end the current loop by decrementing the nesting level of the loop.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa1|0xFE 0x0A]]&lt;br /&gt;
|Load Instrument (With Some Unknown Effect)&lt;br /&gt;
|3&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0b|0xFE 0x0B]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|6&lt;br /&gt;
|offset: signed int16, offset2: signed int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x0C-0x0D]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0e|0xFE 0x0E]]&lt;br /&gt;
|Subroutine Jump&lt;br /&gt;
|4&lt;br /&gt;
|destination_offset: signed int16&lt;br /&gt;
|The subroutine jump cannot be nested. It will overwrite the return address.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0f|0xFE 0x0F]]&lt;br /&gt;
|Return from Subroutine&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe10|0xFE 0x10]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|3&lt;br /&gt;
|value: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe10|0xFE 0x11]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Clears the effect of opcode 0xFE 0x10&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa3|0xFE 0x12]]&lt;br /&gt;
|Channel Master Volume Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x13]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe14|0xFE 0x14]]&lt;br /&gt;
|Load Custom Instrument (Key-Split Instrument)&lt;br /&gt;
|3&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|The custom instrument number corresponds to the custom instrument map pointed from the file header. Note that the number is different from the regular sample number used in opcode 0xA1.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe15|0xFE 0x15]]&lt;br /&gt;
|Time Signature&lt;br /&gt;
|4&lt;br /&gt;
|ticks_per_beat: byte, beats_per_measure: byte&lt;br /&gt;
|Note that two parameters can be 0. This pattern is used for initialization.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe16|0xFE 0x16]]&lt;br /&gt;
|Measure Number&lt;br /&gt;
|3&lt;br /&gt;
|measure: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x17-0x18]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa9|0xFE 0x19]]&lt;br /&gt;
|Channel Volume Slide Per Note On&lt;br /&gt;
|4&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|Applies volume slide (opcode 0xA9) for each notes. When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1a|0xFE 0x1A]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Turn something on.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1b|0xFE 0x1B]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Clears the effect of opcode 0xFE 0x1A.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1c|0xFE 0x1C]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|3&lt;br /&gt;
|value: byte&lt;br /&gt;
|Obsoleted opcode? It probably does nothing.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1d|0xFE 0x1D]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Turn something on.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1e|0xFE 0x1E]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Clears the effect of opcode 0xFE 0x1D.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x1F]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|0xFE 0x20-0xFF&lt;br /&gt;
|Unimplemented (Out of Range)&lt;br /&gt;
|n/a&lt;br /&gt;
|&lt;br /&gt;
|Do not use.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFF]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF9/Sound/AKAO_sequence&amp;diff=5764</id>
		<title>FF9/Sound/AKAO sequence</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF9/Sound/AKAO_sequence&amp;diff=5764"/>
		<updated>2020-07-11T21:36:13Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
AKAO sequence is similar to MIDI sequence - it's custom tracker format for playing sequence sound, well tuned specially for PSX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
=== Header (size: 64 bytes) ===&lt;br /&gt;
&lt;br /&gt;
 struct AkaoSeqHeader&lt;br /&gt;
 {&lt;br /&gt;
   static const uint8_t magic[4];  // &amp;quot;AKAO&amp;quot; C-string&lt;br /&gt;
   uint16_t id;                    // song ID, used for playing sequence&lt;br /&gt;
   uint16_t length;                // data length (including this header)&lt;br /&gt;
   uint16_t reverb_type;           // reverb type (range from 0 to 9)&lt;br /&gt;
   uint8_t field_0A[6];&lt;br /&gt;
   uint32_t field_10;&lt;br /&gt;
   uint16_t sample_set_id;         // associated sample set ID&lt;br /&gt;
   uint16_t field_12;&lt;br /&gt;
   uint32_t field_14;&lt;br /&gt;
   uint32_t field_18;&lt;br /&gt;
   uint32_t field_1C;&lt;br /&gt;
   uint32_t mask;                  // represents bitmask of used channels in this song&lt;br /&gt;
   uint32_t field_24;&lt;br /&gt;
   uint32_t field_28;&lt;br /&gt;
   uint32_t field_2C;&lt;br /&gt;
   uint32_t instrument_map_offset; // relative offset to custom instrument map (0 if unused)&lt;br /&gt;
   uint32_t drum_map_offset;       // relative offset to custom drum map (0 if unused)&lt;br /&gt;
   uint32_t field_38;&lt;br /&gt;
   uint32_t field_3C;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
=== Channel Offsets (size: 2 bytes * &amp;lt;channels count&amp;gt;) ===&lt;br /&gt;
 struct AkaoChannelInfo&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t start_offsets[num_channels];  // offsets to channel opcode data&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 AkaoSeqHeader *header;&lt;br /&gt;
 int num_channels = 0;&lt;br /&gt;
 while (int bit = 0; header-&amp;gt;mask &amp;amp; (1 &amp;lt;&amp;lt; bit)) != 0; bit++)&lt;br /&gt;
   num_channels++;&lt;br /&gt;
&lt;br /&gt;
There is &amp;lt;channels count&amp;gt; offsets to channel opcode data counting from current offset. Each offsets is a relative offset based on the address the offset itself.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Channel Commands [AKAO Opcodes] ===&lt;br /&gt;
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 &amp;quot;opcodes&amp;quot;. Every opcode has its own number of arguments.&lt;br /&gt;
&lt;br /&gt;
=== Custom Instrument Map Table ===&lt;br /&gt;
&lt;br /&gt;
When a song uses custom instruments with [[FF9/Sound/Opcodes/0xfe14|opcode 0xFE 0x14]], a custom instrument map table will be placed after the end of AKAO opcode sequence.&lt;br /&gt;
&lt;br /&gt;
This table consists of a collection of zones representing performance settings for a particular key range. A zone is an 8-byte item, and an instrument can have one or more regions.&lt;br /&gt;
&lt;br /&gt;
 struct AkaoInstrumentZoneAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t instrument;   // corresponding to opcode 0xA1&lt;br /&gt;
   uint8_t low_key;      // lowest key (in note number)&lt;br /&gt;
   uint8_t high_key;     // highest key (in note number)&lt;br /&gt;
   uint8_t ar;           // ADSR: attack rate (0-127)&lt;br /&gt;
   uint8_t sr;           // ADSR: sustain rate (0-127)&lt;br /&gt;
   uint8_t s_mode;       // ADSR: sustain mode (1: linear increase, 3: linear decrease, 5: exponential increase, 7: exponential decrease)&lt;br /&gt;
   uint8_t rr;           // ADSR: release rate (0-31)&lt;br /&gt;
   uint8_t volume;       // adjust the note volume to n/128 of the original volume (0 will keep the original volume)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
- Zones must be ordered from low key to high key&lt;br /&gt;
- The final zone of the instrument must be a terminator filled with 0s (more precisely, a zone with ADSR sustain mode of 0 is considered a terminator)&lt;br /&gt;
&lt;br /&gt;
=== Drum Instrument Map Table ===&lt;br /&gt;
&lt;br /&gt;
When a song uses a drum kit with [[FF9/Sound/Opcodes/0xfe04|opcode 0xFE 0x04]], 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.&lt;br /&gt;
&lt;br /&gt;
The table consists of a repetition of 8-byte items.&lt;br /&gt;
&lt;br /&gt;
 struct AkaoDrumKeyAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t instrument;   // corresponding to opcode 0xA1&lt;br /&gt;
   uint8_t key;          // note number when playing the drum note&lt;br /&gt;
   uint8_t ar;           // ADSR: attack rate (0-127)&lt;br /&gt;
   uint8_t sr;           // ADSR: sustain rate (0-127)&lt;br /&gt;
   uint8_t s_mode;       // ADSR: sustain mode (1: linear increase, 3: linear decrease, 5: exponential increase, 7: exponential decrease)&lt;br /&gt;
   uint8_t rr;           // ADSR: release rate (0-31)&lt;br /&gt;
   uint8_t volume;       // adjust the percussion volume to n/128 of the original volume (0 will keep the original volume)&lt;br /&gt;
   uint8_t pan : 7;      // corresponding to opcode 0xAA&lt;br /&gt;
   uint8_t reverb : 1;   // reverb on/off (0: off, 1: on)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sound Opcode List ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Opcode&lt;br /&gt;
! Summary&lt;br /&gt;
! Length&lt;br /&gt;
! Operands&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0x00-0x99]]&lt;br /&gt;
|Note, Tie, Rest&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|The opcode indicates the note key and length. The note will be keyed off 2 ticks before the next note.&lt;br /&gt;
|-&lt;br /&gt;
|0x9A-0x9F&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xA0]]&lt;br /&gt;
|Finish Channel&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa1|0xA1]]&lt;br /&gt;
|Load Instrument&lt;br /&gt;
|2&lt;br /&gt;
|instrument: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0xA2]]&lt;br /&gt;
|Overwrite Next Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length: byte&lt;br /&gt;
|Ignores the regular length (delta-time) of the next note and overwrites it with the specified length.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xA3]]&lt;br /&gt;
|Channel Master Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa4|0xA4]]&lt;br /&gt;
|Pitch Bend Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, semitones: signed byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA5]]&lt;br /&gt;
|Set Octave&lt;br /&gt;
|2&lt;br /&gt;
|octave: byte (0-15)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA6]]&lt;br /&gt;
|Increase Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA7]]&lt;br /&gt;
|Decrease Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xA8]]&lt;br /&gt;
|Channel Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa9|0xA9]]&lt;br /&gt;
|Channel Volume Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xAA]]&lt;br /&gt;
|Channel Pan&lt;br /&gt;
|2&lt;br /&gt;
|pan: byte (0-127)&lt;br /&gt;
|64 is the center.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xab|0xAB]]&lt;br /&gt;
|Channel Pan Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, pan: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xac|0xAC]]&lt;br /&gt;
|Noise Clock Frequency&lt;br /&gt;
|2&lt;br /&gt;
|clock: byte (0x00-0x3f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAD]]&lt;br /&gt;
|ADSR: Attack Rate&lt;br /&gt;
|2&lt;br /&gt;
|attack_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAE]]&lt;br /&gt;
|ADSR: Decay Rate&lt;br /&gt;
|2&lt;br /&gt;
|decay_rate: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAF]]&lt;br /&gt;
|ADSR: Sustain Level&lt;br /&gt;
|2&lt;br /&gt;
|sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB0]]&lt;br /&gt;
|ADSR: Decay Rate &amp;amp; Sustain Level&lt;br /&gt;
|3&lt;br /&gt;
|decay_rate: byte (0x00-0x0f), sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB1]]&lt;br /&gt;
|ADSR: Sustain Rate&lt;br /&gt;
|2&lt;br /&gt;
|sustain_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB2]]&lt;br /&gt;
|ADSR: Release Rate&lt;br /&gt;
|2&lt;br /&gt;
|release_rate: byte (0x00-0x1f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB3]]&lt;br /&gt;
|ADSR: Reset ADSR&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB4]]&lt;br /&gt;
|Channel Pitch LFO (Vibrato)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB5]]&lt;br /&gt;
|Channel Pitch LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|The most significant bit of the &amp;lt;code&amp;gt;depth&amp;lt;/code&amp;gt; determines the amplitude range.&lt;br /&gt;
&lt;br /&gt;
When it is 0, the range is up to about ± 50 cents (amplitude is 15/256 compared with range type 1).&lt;br /&gt;
&lt;br /&gt;
When it is 1, the range is up to about ± 700 cents.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB6]]&lt;br /&gt;
|Turn Off Channel Pitch LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB7]]&lt;br /&gt;
|ADSR: Attack Mode&lt;br /&gt;
|2&lt;br /&gt;
|attack_mode: byte (1 or 5)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xB8]]&lt;br /&gt;
|Channel Volume LFO (Tremolo)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xB9]]&lt;br /&gt;
|Channel Volume LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xBA]]&lt;br /&gt;
|Turn Off Channel Volume LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xBB]]&lt;br /&gt;
|ADSR: Sustain Mode&lt;br /&gt;
|2&lt;br /&gt;
|sustain_mode: byte (1, 3, 5 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBC]]&lt;br /&gt;
|Channel Pan LFO&lt;br /&gt;
|3&lt;br /&gt;
|rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBD]]&lt;br /&gt;
|Channel Pan LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBE]]&lt;br /&gt;
|Turn Off Channel Pan LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbf|0xBF]]&lt;br /&gt;
|ADSR: Release Mode&lt;br /&gt;
|2&lt;br /&gt;
|release_mode: byte (3 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc0c1|0xC0]]&lt;br /&gt;
|Channel Transpose (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc0c1|0xC1]]&lt;br /&gt;
|Channel Transpose (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc2c3|0xC2]]&lt;br /&gt;
|Turn On Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc2c3|0xC3]]&lt;br /&gt;
|Turn Off Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc4c5|0xC4]]&lt;br /&gt;
|Turn On Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc4c5|0xC5]]&lt;br /&gt;
|Turn Off Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc6c7|0xC6]]&lt;br /&gt;
|Turn On Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc6c7|0xC7]]&lt;br /&gt;
|Turn Off Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xC8]]&lt;br /&gt;
|Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Remember the current offset as a loop point and increase the nesting level of the loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xC9]]&lt;br /&gt;
|Return to Loop Point Up to N Times&lt;br /&gt;
|2&lt;br /&gt;
|times: byte&lt;br /&gt;
|On the Nth repeat, this instruction will end the current loop by decrementing the nesting level of the loop. Otherwise, it will increment the loop counter and return to the loop point.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xCA]]&lt;br /&gt;
|Return to Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will increment the loop counter.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcb|0xCB]]&lt;br /&gt;
|Reset Sound Effects&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Reset sound effects such as noise, frequency modulation, reverb, overlay voice and alternate voice.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcccd|0xCC]]&lt;br /&gt;
|Turn On Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key on and key off performance of the subsequent notes and update the pitch only.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcccd|0xCD]]&lt;br /&gt;
|Turn Off Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcecf|0xCE]]&lt;br /&gt;
|Turn On Noise and Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcecf|0xCF]]&lt;br /&gt;
|Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd0d1|0xD0]]&lt;br /&gt;
|Turn On Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key off performance of the subsequent notes.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd0d1|0xD1]]&lt;br /&gt;
|Turn Off Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd2d3|0xD2]]&lt;br /&gt;
|Turn On Frequency Modulation and Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd2d3|0xD3]]&lt;br /&gt;
|Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd4d5|0xD4]]&lt;br /&gt;
|Turn On Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Duplicate and use the playback frequency of the previous voice channel.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd4d5|0xD5]]&lt;br /&gt;
|Turn Off Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd6d7|0xD6]]&lt;br /&gt;
|Turn On Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Multiply the playback frequency of the previous voice channel to the output volume. Lower pitch will make the volume smaller.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd6d7|0xD7]]&lt;br /&gt;
|Turn Off Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd8d9|0xD8]]&lt;br /&gt;
|Channel Fine Tuning (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The pitch can be changed in the range of one octave above and below.&lt;br /&gt;
The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is the multiplicand for the playback frequency, not a log-based parameter like cents. For example, when the &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is 127, the pitch will be multiplied by 127/128 (about +1 octave). Negative value ​​will lower the pitch.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd8d9|0xD9]]&lt;br /&gt;
|Channel Fine Tuning (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; will be added to the current tuning amount.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdadb|0xDA]]&lt;br /&gt;
|Turn On Portamento&lt;br /&gt;
|2&lt;br /&gt;
|speed: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;speed&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdadb|0xDB]]&lt;br /&gt;
|Turn Off Portamento&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0xDC]]&lt;br /&gt;
|Fix Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length_to_add: signed byte&lt;br /&gt;
|Ignore the regular length (delta-time) of subsequent notes and set to the fixed length. The &amp;lt;code&amp;gt;length_to_add&amp;lt;/code&amp;gt; parameter will be added to the current length value. (the initial value is 0)&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdd|0xDD]]&lt;br /&gt;
|Channel Pitch LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xde|0xDE]]&lt;br /&gt;
|Channel Volume LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdf|0xDF]]&lt;br /&gt;
|Channel Pan LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe0|0xE0]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe1|0xE1]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|value: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe2|0xE2]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Clears the effect of opcode 0xE1&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe3|0xE3]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe4|0xE4]]&lt;br /&gt;
|Channel Pitch LFO Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe5|0xE5]]&lt;br /&gt;
|Channel Volume LFO Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe6|0xE6]]&lt;br /&gt;
|Channel Pan LFO Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xE7-0xEF]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xf0fd|0xF0-0xFD]]&lt;br /&gt;
|Note, Tie, Rest with Length&lt;br /&gt;
|2&lt;br /&gt;
|length: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe00|0xFE 0x00]]&lt;br /&gt;
|Tempo&lt;br /&gt;
|4&lt;br /&gt;
|tempo: uint16&lt;br /&gt;
|bpm = tempo / 218.453333 (approximate)&lt;br /&gt;
More strictly, &amp;lt;code&amp;gt;bpm = 60.0 / (48 * (65536.0 / tempo) * (0x43D1 / (33868800.0 / 8)))&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe00|0xFE 0x01]]&lt;br /&gt;
|Tempo Slide&lt;br /&gt;
|5&lt;br /&gt;
|length: byte, tempo: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe02|0xFE 0x02]]&lt;br /&gt;
|Reverb Depth&lt;br /&gt;
|4&lt;br /&gt;
|depth: uint16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe02|0xFE 0x03]]&lt;br /&gt;
|Reverb Depth Slide&lt;br /&gt;
|5&lt;br /&gt;
|length: byte, depth: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe04|0xFE 0x04]]&lt;br /&gt;
|Turn On Drum Mode&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|The drum map offset is recorded in the file header.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe04|0xFE 0x05]]&lt;br /&gt;
|Turn Off Drum Mode&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe06|0xFE 0x06]]&lt;br /&gt;
|Unconditional Jump&lt;br /&gt;
|4&lt;br /&gt;
|destination_offset: signed int16&lt;br /&gt;
|This instruction can be used to make an infinite loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe07|0xFE 0x07]]&lt;br /&gt;
|CPU-Conditional Jump&lt;br /&gt;
|5&lt;br /&gt;
|condition: byte, destination_offset: signed int16&lt;br /&gt;
|Jump if the condition variable matches &amp;lt;code&amp;gt;condition&amp;lt;/code&amp;gt;. The value of the condition variable can be set from the game program.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe08|0xFE 0x08]]&lt;br /&gt;
|Jump on the Nth Repeat&lt;br /&gt;
|5&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe08|0xFE 0x09]]&lt;br /&gt;
|Break the Loop on the Nth Repeat&lt;br /&gt;
|5&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|Unlike 0xF0, this instruction will end the current loop by decrementing the nesting level of the loop.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa1|0xFE 0x0A]]&lt;br /&gt;
|Load Instrument (With Some Unknown Effect)&lt;br /&gt;
|3&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0b|0xFE 0x0B]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|6&lt;br /&gt;
|offset: signed int16, offset2: signed int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x0C-0x0D]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0e|0xFE 0x0E]]&lt;br /&gt;
|Subroutine Jump&lt;br /&gt;
|4&lt;br /&gt;
|destination_offset: signed int16&lt;br /&gt;
|The subroutine jump cannot be nested. It will overwrite the return address.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0f|0xFE 0x0F]]&lt;br /&gt;
|Return from Subroutine&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe10|0xFE 0x10]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|3&lt;br /&gt;
|value: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe10|0xFE 0x11]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Clears the effect of opcode 0xFE 0x10&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa3|0xFE 0x12]]&lt;br /&gt;
|Channel Master Volume Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x13]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe14|0xFE 0x14]]&lt;br /&gt;
|Load Custom Instrument (Key-Split Instrument)&lt;br /&gt;
|3&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|The custom instrument number corresponds to the custom instrument map pointed from the file header. Note that the number is different from the regular sample number used in opcode 0xA1.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe15|0xFE 0x15]]&lt;br /&gt;
|Time Signature&lt;br /&gt;
|4&lt;br /&gt;
|ticks_per_beat: byte, beats_per_measure: byte&lt;br /&gt;
|Note that two parameters can be 0. This pattern is used for initialization.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe16|0xFE 0x16]]&lt;br /&gt;
|Measure Number&lt;br /&gt;
|3&lt;br /&gt;
|measure: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x17-0x18]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe19|0xFE 0x19]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1a|0xFE 0x1A]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1b|0xFE 0x1B]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1c|0xFE 0x1C]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1d|0xFE 0x1D]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1e|0xFE 0x1E]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x1F]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|0xFE 0x20-0xFF&lt;br /&gt;
|Unimplemented (Out of Range)&lt;br /&gt;
|n/a&lt;br /&gt;
|&lt;br /&gt;
|Do not use.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFF]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF9/Sound/AKAO_sequence&amp;diff=5763</id>
		<title>FF9/Sound/AKAO sequence</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF9/Sound/AKAO_sequence&amp;diff=5763"/>
		<updated>2020-07-11T15:47:19Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: Add description of custom instrument map&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
AKAO sequence is similar to MIDI sequence - it's custom tracker format for playing sequence sound, well tuned specially for PSX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
=== Header (size: 64 bytes) ===&lt;br /&gt;
&lt;br /&gt;
 struct AkaoSeqHeader&lt;br /&gt;
 {&lt;br /&gt;
   static const uint8_t magic[4];  // &amp;quot;AKAO&amp;quot; C-string&lt;br /&gt;
   uint16_t id;                    // song ID, used for playing sequence&lt;br /&gt;
   uint16_t length;                // data length (including this header)&lt;br /&gt;
   uint16_t reverb_type;           // reverb type (range from 0 to 9)&lt;br /&gt;
   uint8_t field_0A[6];&lt;br /&gt;
   uint32_t field_10;&lt;br /&gt;
   uint16_t sample_set_id;         // associated sample set ID&lt;br /&gt;
   uint16_t field_12;&lt;br /&gt;
   uint32_t field_14;&lt;br /&gt;
   uint32_t field_18;&lt;br /&gt;
   uint32_t field_1C;&lt;br /&gt;
   uint32_t mask;                  // represents bitmask of used channels in this song&lt;br /&gt;
   uint32_t field_24;&lt;br /&gt;
   uint32_t field_28;&lt;br /&gt;
   uint32_t field_2C;&lt;br /&gt;
   uint32_t instrument_map_offset; // relative offset to custom instrument map (0 if unused)&lt;br /&gt;
   uint32_t drum_map_offset;       // relative offset to custom drum map (0 if unused)&lt;br /&gt;
   uint32_t field_38;&lt;br /&gt;
   uint32_t field_3C;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
=== Channel Offsets (size: 2 bytes * &amp;lt;channels count&amp;gt;) ===&lt;br /&gt;
 struct AkaoChannelInfo&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t start_offsets[num_channels];  // offsets to channel opcode data&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 AkaoSeqHeader *header;&lt;br /&gt;
 int num_channels = 0;&lt;br /&gt;
 while (int bit = 0; header-&amp;gt;mask &amp;amp; (1 &amp;lt;&amp;lt; bit)) != 0; bit++)&lt;br /&gt;
   num_channels++;&lt;br /&gt;
&lt;br /&gt;
There is &amp;lt;channels count&amp;gt; offsets to channel opcode data counting from current offset. Each offsets is a relative offset based on the address the offset itself.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Channel Commands [AKAO Opcodes] ===&lt;br /&gt;
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 &amp;quot;opcodes&amp;quot;. Every opcode has its own number of arguments.&lt;br /&gt;
&lt;br /&gt;
=== Custom Instrument Map Table ===&lt;br /&gt;
&lt;br /&gt;
When a song uses custom instruments with [[FF9/Sound/Opcodes/0xfe14|opcode 0xFE 0x14]], a custom instrument map table will be placed after the end of AKAO opcode sequence.&lt;br /&gt;
&lt;br /&gt;
This table consists of a collection of zones representing performance settings for a particular key range. A zone is an 8-byte item, and an instrument can have one or more regions.&lt;br /&gt;
&lt;br /&gt;
 struct AkaoInstrumentZoneAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t instrument;   // corresponding to opcode 0xA1&lt;br /&gt;
   uint8_t low_key;      // lowest key (in note number)&lt;br /&gt;
   uint8_t high_key;     // highest key (in note number)&lt;br /&gt;
   uint8_t ar;           // ADSR: attack rate (0-127)&lt;br /&gt;
   uint8_t sr;           // ADSR: sustain rate (0-127)&lt;br /&gt;
   uint8_t s_mode;       // ADSR: sustain mode (1: linear increase, 3: linear decrease, 5: exponential increase, 7: exponential decrease)&lt;br /&gt;
   uint8_t rr;           // ADSR: release rate (0-31)&lt;br /&gt;
   uint8_t volume;       // adjust the note volume to n/128 of the original volume (0 will keep the original volume)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
- Zones must be ordered from low key to high key&lt;br /&gt;
- The final zone of the instrument must be a terminator filled with 0s (more precisely, a zone with ADSR sustain mode of 0 is considered a terminator)&lt;br /&gt;
&lt;br /&gt;
=== Drum Instrument Map Table ===&lt;br /&gt;
&lt;br /&gt;
When a song uses a drum kit with [[FF9/Sound/Opcodes/0xfe04|opcode 0xFE 0x04]], 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.&lt;br /&gt;
&lt;br /&gt;
The table consists of a repetition of 8-byte items.&lt;br /&gt;
&lt;br /&gt;
 struct AkaoDrumKeyAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t instrument;   // corresponding to opcode 0xA1&lt;br /&gt;
   uint8_t key;          // note number when playing the drum note&lt;br /&gt;
   uint8_t ar;           // ADSR: attack rate (0-127)&lt;br /&gt;
   uint8_t sr;           // ADSR: sustain rate (0-127)&lt;br /&gt;
   uint8_t s_mode;       // ADSR: sustain mode (1: linear increase, 3: linear decrease, 5: exponential increase, 7: exponential decrease)&lt;br /&gt;
   uint8_t rr;           // ADSR: release rate (0-31)&lt;br /&gt;
   uint8_t volume;       // adjust the percussion volume to n/128 of the original volume (0 will keep the original volume)&lt;br /&gt;
   uint8_t pan : 7;      // corresponding to opcode 0xAA&lt;br /&gt;
   uint8_t reverb : 1;   // reverb on/off (0: off, 1: on)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sound Opcode List ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Opcode&lt;br /&gt;
! Summary&lt;br /&gt;
! Length&lt;br /&gt;
! Operands&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0x00-0x99]]&lt;br /&gt;
|Note, Tie, Rest&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|The opcode indicates the note key and length. The note will be keyed off 2 ticks before the next note.&lt;br /&gt;
|-&lt;br /&gt;
|0x9A-0x9F&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xA0]]&lt;br /&gt;
|Finish Channel&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa1|0xA1]]&lt;br /&gt;
|Load Instrument&lt;br /&gt;
|2&lt;br /&gt;
|instrument: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0xA2]]&lt;br /&gt;
|Overwrite Next Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length: byte&lt;br /&gt;
|Ignores the regular length (delta-time) of the next note and overwrites it with the specified length.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xA3]]&lt;br /&gt;
|Channel Master Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa4|0xA4]]&lt;br /&gt;
|Pitch Bend Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, semitones: signed byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA5]]&lt;br /&gt;
|Set Octave&lt;br /&gt;
|2&lt;br /&gt;
|octave: byte (0-15)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA6]]&lt;br /&gt;
|Increase Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA7]]&lt;br /&gt;
|Decrease Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xA8]]&lt;br /&gt;
|Channel Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa9|0xA9]]&lt;br /&gt;
|Channel Volume Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xAA]]&lt;br /&gt;
|Channel Pan&lt;br /&gt;
|2&lt;br /&gt;
|pan: byte (0-127)&lt;br /&gt;
|64 is the center.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xab|0xAB]]&lt;br /&gt;
|Channel Pan Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, pan: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xac|0xAC]]&lt;br /&gt;
|Noise Clock Frequency&lt;br /&gt;
|2&lt;br /&gt;
|clock: byte (0x00-0x3f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAD]]&lt;br /&gt;
|ADSR: Attack Rate&lt;br /&gt;
|2&lt;br /&gt;
|attack_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAE]]&lt;br /&gt;
|ADSR: Decay Rate&lt;br /&gt;
|2&lt;br /&gt;
|decay_rate: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAF]]&lt;br /&gt;
|ADSR: Sustain Level&lt;br /&gt;
|2&lt;br /&gt;
|sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB0]]&lt;br /&gt;
|ADSR: Decay Rate &amp;amp; Sustain Level&lt;br /&gt;
|3&lt;br /&gt;
|decay_rate: byte (0x00-0x0f), sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB1]]&lt;br /&gt;
|ADSR: Sustain Rate&lt;br /&gt;
|2&lt;br /&gt;
|sustain_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB2]]&lt;br /&gt;
|ADSR: Release Rate&lt;br /&gt;
|2&lt;br /&gt;
|release_rate: byte (0x00-0x1f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB3]]&lt;br /&gt;
|ADSR: Reset ADSR&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB4]]&lt;br /&gt;
|Channel Pitch LFO (Vibrato)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB5]]&lt;br /&gt;
|Channel Pitch LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|The most significant bit of the &amp;lt;code&amp;gt;depth&amp;lt;/code&amp;gt; determines the amplitude range.&lt;br /&gt;
&lt;br /&gt;
When it is 0, the range is up to about ± 50 cents (amplitude is 15/256 compared with range type 1).&lt;br /&gt;
&lt;br /&gt;
When it is 1, the range is up to about ± 700 cents.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB6]]&lt;br /&gt;
|Turn Off Channel Pitch LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB7]]&lt;br /&gt;
|ADSR: Attack Mode&lt;br /&gt;
|2&lt;br /&gt;
|attack_mode: byte (1 or 5)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xB8]]&lt;br /&gt;
|Channel Volume LFO (Tremolo)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xB9]]&lt;br /&gt;
|Channel Volume LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xBA]]&lt;br /&gt;
|Turn Off Channel Volume LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xBB]]&lt;br /&gt;
|ADSR: Sustain Mode&lt;br /&gt;
|2&lt;br /&gt;
|sustain_mode: byte (1, 3, 5 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBC]]&lt;br /&gt;
|Channel Pan LFO&lt;br /&gt;
|3&lt;br /&gt;
|rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBD]]&lt;br /&gt;
|Channel Pan LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBE]]&lt;br /&gt;
|Turn Off Channel Pan LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbf|0xBF]]&lt;br /&gt;
|ADSR: Release Mode&lt;br /&gt;
|2&lt;br /&gt;
|release_mode: byte (3 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc0c1|0xC0]]&lt;br /&gt;
|Channel Transpose (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc0c1|0xC1]]&lt;br /&gt;
|Channel Transpose (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc2c3|0xC2]]&lt;br /&gt;
|Turn On Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc2c3|0xC3]]&lt;br /&gt;
|Turn Off Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc4c5|0xC4]]&lt;br /&gt;
|Turn On Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc4c5|0xC5]]&lt;br /&gt;
|Turn Off Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc6c7|0xC6]]&lt;br /&gt;
|Turn On Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc6c7|0xC7]]&lt;br /&gt;
|Turn Off Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xC8]]&lt;br /&gt;
|Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Remember the current offset as a loop point and increase the nesting level of the loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xC9]]&lt;br /&gt;
|Return to Loop Point Up to N Times&lt;br /&gt;
|2&lt;br /&gt;
|times: byte&lt;br /&gt;
|On the Nth repeat, this instruction will end the current loop by decrementing the nesting level of the loop. Otherwise, it will increment the loop counter and return to the loop point.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xCA]]&lt;br /&gt;
|Return to Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will increment the loop counter.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcb|0xCB]]&lt;br /&gt;
|Reset Sound Effects&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Reset sound effects such as noise, frequency modulation, reverb, overlay voice and alternate voice.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcccd|0xCC]]&lt;br /&gt;
|Turn On Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key on and key off performance of the subsequent notes and update the pitch only.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcccd|0xCD]]&lt;br /&gt;
|Turn Off Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcecf|0xCE]]&lt;br /&gt;
|Turn On Noise and Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcecf|0xCF]]&lt;br /&gt;
|Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd0d1|0xD0]]&lt;br /&gt;
|Turn On Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key off performance of the subsequent notes.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd0d1|0xD1]]&lt;br /&gt;
|Turn Off Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd2d3|0xD2]]&lt;br /&gt;
|Turn On Frequency Modulation and Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd2d3|0xD3]]&lt;br /&gt;
|Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd4d5|0xD4]]&lt;br /&gt;
|Turn On Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Duplicate and use the playback frequency of the previous voice channel.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd4d5|0xD5]]&lt;br /&gt;
|Turn Off Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd6d7|0xD6]]&lt;br /&gt;
|Turn On Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Multiply the playback frequency of the previous voice channel to the output volume. Lower pitch will make the volume smaller.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd6d7|0xD7]]&lt;br /&gt;
|Turn Off Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd8d9|0xD8]]&lt;br /&gt;
|Channel Fine Tuning (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The pitch can be changed in the range of one octave above and below.&lt;br /&gt;
The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is the multiplicand for the playback frequency, not a log-based parameter like cents. For example, when the &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is 127, the pitch will be multiplied by 127/128 (about +1 octave). Negative value ​​will lower the pitch.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd8d9|0xD9]]&lt;br /&gt;
|Channel Fine Tuning (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; will be added to the current tuning amount.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdadb|0xDA]]&lt;br /&gt;
|Turn On Portamento&lt;br /&gt;
|2&lt;br /&gt;
|speed: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;speed&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdadb|0xDB]]&lt;br /&gt;
|Turn Off Portamento&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0xDC]]&lt;br /&gt;
|Fix Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length_to_add: signed byte&lt;br /&gt;
|Ignore the regular length (delta-time) of subsequent notes and set to the fixed length. The &amp;lt;code&amp;gt;length_to_add&amp;lt;/code&amp;gt; parameter will be added to the current length value. (the initial value is 0)&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdd|0xDD]]&lt;br /&gt;
|Channel Pitch LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xde|0xDE]]&lt;br /&gt;
|Channel Volume LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdf|0xDF]]&lt;br /&gt;
|Channel Pan LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe0|0xE0]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe1|0xE1]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|value: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe2|0xE2]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Clears the effect of opcode 0xE1&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe3|0xE3]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe4|0xE4]]&lt;br /&gt;
|Channel Pitch LFO Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe5|0xE5]]&lt;br /&gt;
|Channel Volume LFO Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe6|0xE6]]&lt;br /&gt;
|Channel Pan LFO Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xE7-0xEF]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xf0fd|0xF0-0xFD]]&lt;br /&gt;
|Note, Tie, Rest with Length&lt;br /&gt;
|2&lt;br /&gt;
|length: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe00|0xFE 0x00]]&lt;br /&gt;
|Tempo&lt;br /&gt;
|4&lt;br /&gt;
|tempo: uint16&lt;br /&gt;
|bpm = tempo / 218.453333 (approximate)&lt;br /&gt;
More strictly, &amp;lt;code&amp;gt;bpm = 60.0 / (48 * (65536.0 / tempo) * (0x43D1 / (33868800.0 / 8)))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that this coefficient is different from other games with PlayStation AKAO.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe00|0xFE 0x01]]&lt;br /&gt;
|Tempo Slide&lt;br /&gt;
|5&lt;br /&gt;
|length: byte, tempo: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe02|0xFE 0x02]]&lt;br /&gt;
|Reverb Depth&lt;br /&gt;
|4&lt;br /&gt;
|depth: uint16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe02|0xFE 0x03]]&lt;br /&gt;
|Reverb Depth Slide&lt;br /&gt;
|5&lt;br /&gt;
|length: byte, depth: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe04|0xFE 0x04]]&lt;br /&gt;
|Turn On Drum Mode&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|The drum map offset is recorded in the file header.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe04|0xFE 0x05]]&lt;br /&gt;
|Turn Off Drum Mode&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe06|0xFE 0x06]]&lt;br /&gt;
|Unconditional Jump&lt;br /&gt;
|4&lt;br /&gt;
|destination_offset: signed int16&lt;br /&gt;
|This instruction can be used to make an infinite loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe07|0xFE 0x07]]&lt;br /&gt;
|CPU-Conditional Jump&lt;br /&gt;
|5&lt;br /&gt;
|condition: byte, destination_offset: signed int16&lt;br /&gt;
|Jump if the condition variable matches &amp;lt;code&amp;gt;condition&amp;lt;/code&amp;gt;. The value of the condition variable can be set from the game program.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe08|0xFE 0x08]]&lt;br /&gt;
|Jump on the Nth Repeat&lt;br /&gt;
|5&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe08|0xFE 0x09]]&lt;br /&gt;
|Break the Loop on the Nth Repeat&lt;br /&gt;
|5&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|Unlike 0xF0, this instruction will end the current loop by decrementing the nesting level of the loop.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa1|0xFE 0x0A]]&lt;br /&gt;
|Load Instrument (With Some Unknown Effect)&lt;br /&gt;
|3&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0b|0xFE 0x0B]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|6&lt;br /&gt;
|offset: signed int16, offset2: signed int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x0C-0x0D]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0e|0xFE 0x0E]]&lt;br /&gt;
|Subroutine Jump&lt;br /&gt;
|4&lt;br /&gt;
|destination_offset: signed int16&lt;br /&gt;
|The subroutine jump cannot be nested. It will overwrite the return address.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0f|0xFE 0x0F]]&lt;br /&gt;
|Return from Subroutine&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe10|0xFE 0x10]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|3&lt;br /&gt;
|value: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe10|0xFE 0x11]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Clears the effect of opcode 0xFE 0x10&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa3|0xFE 0x12]]&lt;br /&gt;
|Channel Master Volume Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x13]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe14|0xFE 0x14]]&lt;br /&gt;
|Load Custom Instrument (Key-Split Instrument)&lt;br /&gt;
|3&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|The custom instrument number corresponds to the custom instrument map pointed from the file header. Note that the number is different from the regular sample number used in opcode 0xA1.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe15|0xFE 0x15]]&lt;br /&gt;
|Time Signature&lt;br /&gt;
|4&lt;br /&gt;
|ticks_per_beat: byte, beats_per_measure: byte&lt;br /&gt;
|Note that two parameters can be 0. This pattern is used for initialization.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe16|0xFE 0x16]]&lt;br /&gt;
|Measure Number&lt;br /&gt;
|3&lt;br /&gt;
|measure: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x17-0x18]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe19|0xFE 0x19]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1a|0xFE 0x1A]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1b|0xFE 0x1B]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1c|0xFE 0x1C]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1d|0xFE 0x1D]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1e|0xFE 0x1E]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x1F]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|0xFE 0x20-0xFF&lt;br /&gt;
|Unimplemented (Out of Range)&lt;br /&gt;
|n/a&lt;br /&gt;
|&lt;br /&gt;
|Do not use.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFF]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF9/Sound/AKAO_sequence&amp;diff=5762</id>
		<title>FF9/Sound/AKAO sequence</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF9/Sound/AKAO_sequence&amp;diff=5762"/>
		<updated>2020-07-11T07:15:08Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
AKAO sequence is similar to MIDI sequence - it's custom tracker format for playing sequence sound, well tuned specially for PSX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
=== Header (size: 64 bytes) ===&lt;br /&gt;
&lt;br /&gt;
 struct AkaoSeqHeader&lt;br /&gt;
 {&lt;br /&gt;
   static const uint8_t magic[4];  // &amp;quot;AKAO&amp;quot; C-string&lt;br /&gt;
   uint16_t id;                    // song ID, used for playing sequence&lt;br /&gt;
   uint16_t length;                // data length (including this header)&lt;br /&gt;
   uint16_t reverb_type;           // reverb type (range from 0 to 9)&lt;br /&gt;
   uint8_t field_0A[6];&lt;br /&gt;
   uint32_t field_10;&lt;br /&gt;
   uint16_t sample_set_id;         // associated sample set ID&lt;br /&gt;
   uint16_t field_12;&lt;br /&gt;
   uint32_t field_14;&lt;br /&gt;
   uint32_t field_18;&lt;br /&gt;
   uint32_t field_1C;&lt;br /&gt;
   uint32_t mask;                  // represents bitmask of used channels in this song&lt;br /&gt;
   uint32_t field_24;&lt;br /&gt;
   uint32_t field_28;&lt;br /&gt;
   uint32_t field_2C;&lt;br /&gt;
   uint32_t instrument_map_offset; // relative offset to custom instrument map (0 if unused)&lt;br /&gt;
   uint32_t drum_map_offset;       // relative offset to custom drum map (0 if unused)&lt;br /&gt;
   uint32_t field_38;&lt;br /&gt;
   uint32_t field_3C;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
=== Channel Offsets (size: 2 bytes * &amp;lt;channels count&amp;gt;) ===&lt;br /&gt;
 struct AkaoChannelInfo&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t start_offsets[num_channels];  // offsets to channel opcode data&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 AkaoSeqHeader *header;&lt;br /&gt;
 int num_channels = 0;&lt;br /&gt;
 while (int bit = 0; header-&amp;gt;mask &amp;amp; (1 &amp;lt;&amp;lt; bit)) != 0; bit++)&lt;br /&gt;
   num_channels++;&lt;br /&gt;
&lt;br /&gt;
There is &amp;lt;channels count&amp;gt; offsets to channel opcode data counting from current offset. Each offsets is a relative offset based on the address the offset itself.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Channel Commands [AKAO Opcodes] ===&lt;br /&gt;
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 &amp;quot;opcodes&amp;quot;. Every opcode has its own number of arguments.&lt;br /&gt;
&lt;br /&gt;
=== Drum Instrument Map Table ===&lt;br /&gt;
&lt;br /&gt;
When a song uses a drum kit with [[FF9/Sound/Opcodes/0xfe04|opcode 0xFE 0x04]], 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.&lt;br /&gt;
&lt;br /&gt;
The table consists of a repetition of 8-byte items.&lt;br /&gt;
&lt;br /&gt;
 struct AkaoDrumKeyAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t instrument;   // corresponding to opcode 0xA1&lt;br /&gt;
   uint8_t key;          // note number when playing the drum note&lt;br /&gt;
   uint8_t ar;           // ADSR: attack rate (0-127)&lt;br /&gt;
   uint8_t sr;           // ADSR: sustain rate (0-127)&lt;br /&gt;
   uint8_t s_mode;       // ADSR: sustain mode (1: linear increase, 3: linear decrease, 5: exponential increase, 7: exponential decrease)&lt;br /&gt;
   uint8_t rr;           // ADSR: release rate (0-127)&lt;br /&gt;
   uint8_t volume;       // adjust the percussion volume to n/128 of the original volume (0 will keep the original volume)&lt;br /&gt;
   uint8_t pan : 7;      // corresponding to opcode 0xAA&lt;br /&gt;
   uint8_t reverb : 1;   // reverb on/off (0: off, 1: on)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sound Opcode List ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Opcode&lt;br /&gt;
! Summary&lt;br /&gt;
! Length&lt;br /&gt;
! Operands&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0x00-0x99]]&lt;br /&gt;
|Note, Tie, Rest&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|The opcode indicates the note key and length. The note will be keyed off 2 ticks before the next note.&lt;br /&gt;
|-&lt;br /&gt;
|0x9A-0x9F&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xA0]]&lt;br /&gt;
|Finish Channel&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa1|0xA1]]&lt;br /&gt;
|Load Instrument&lt;br /&gt;
|2&lt;br /&gt;
|instrument: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0xA2]]&lt;br /&gt;
|Overwrite Next Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length: byte&lt;br /&gt;
|Ignores the regular length (delta-time) of the next note and overwrites it with the specified length.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xA3]]&lt;br /&gt;
|Channel Master Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa4|0xA4]]&lt;br /&gt;
|Pitch Bend Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, semitones: signed byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA5]]&lt;br /&gt;
|Set Octave&lt;br /&gt;
|2&lt;br /&gt;
|octave: byte (0-15)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA6]]&lt;br /&gt;
|Increase Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA7]]&lt;br /&gt;
|Decrease Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xA8]]&lt;br /&gt;
|Channel Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa9|0xA9]]&lt;br /&gt;
|Channel Volume Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xAA]]&lt;br /&gt;
|Channel Pan&lt;br /&gt;
|2&lt;br /&gt;
|pan: byte (0-127)&lt;br /&gt;
|64 is the center.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xab|0xAB]]&lt;br /&gt;
|Channel Pan Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, pan: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xac|0xAC]]&lt;br /&gt;
|Noise Clock Frequency&lt;br /&gt;
|2&lt;br /&gt;
|clock: byte (0x00-0x3f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAD]]&lt;br /&gt;
|ADSR: Attack Rate&lt;br /&gt;
|2&lt;br /&gt;
|attack_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAE]]&lt;br /&gt;
|ADSR: Decay Rate&lt;br /&gt;
|2&lt;br /&gt;
|decay_rate: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAF]]&lt;br /&gt;
|ADSR: Sustain Level&lt;br /&gt;
|2&lt;br /&gt;
|sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB0]]&lt;br /&gt;
|ADSR: Decay Rate &amp;amp; Sustain Level&lt;br /&gt;
|3&lt;br /&gt;
|decay_rate: byte (0x00-0x0f), sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB1]]&lt;br /&gt;
|ADSR: Sustain Rate&lt;br /&gt;
|2&lt;br /&gt;
|sustain_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB2]]&lt;br /&gt;
|ADSR: Release Rate&lt;br /&gt;
|2&lt;br /&gt;
|release_rate: byte (0x00-0x1f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB3]]&lt;br /&gt;
|ADSR: Reset ADSR&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB4]]&lt;br /&gt;
|Channel Pitch LFO (Vibrato)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB5]]&lt;br /&gt;
|Channel Pitch LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|The most significant bit of the &amp;lt;code&amp;gt;depth&amp;lt;/code&amp;gt; determines the amplitude range.&lt;br /&gt;
&lt;br /&gt;
When it is 0, the range is up to about ± 50 cents (amplitude is 15/256 compared with range type 1).&lt;br /&gt;
&lt;br /&gt;
When it is 1, the range is up to about ± 700 cents.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB6]]&lt;br /&gt;
|Turn Off Channel Pitch LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB7]]&lt;br /&gt;
|ADSR: Attack Mode&lt;br /&gt;
|2&lt;br /&gt;
|attack_mode: byte (1 or 5)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xB8]]&lt;br /&gt;
|Channel Volume LFO (Tremolo)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xB9]]&lt;br /&gt;
|Channel Volume LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xBA]]&lt;br /&gt;
|Turn Off Channel Volume LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xBB]]&lt;br /&gt;
|ADSR: Sustain Mode&lt;br /&gt;
|2&lt;br /&gt;
|sustain_mode: byte (1, 3, 5 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBC]]&lt;br /&gt;
|Channel Pan LFO&lt;br /&gt;
|3&lt;br /&gt;
|rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBD]]&lt;br /&gt;
|Channel Pan LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBE]]&lt;br /&gt;
|Turn Off Channel Pan LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbf|0xBF]]&lt;br /&gt;
|ADSR: Release Mode&lt;br /&gt;
|2&lt;br /&gt;
|release_mode: byte (3 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc0c1|0xC0]]&lt;br /&gt;
|Channel Transpose (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc0c1|0xC1]]&lt;br /&gt;
|Channel Transpose (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc2c3|0xC2]]&lt;br /&gt;
|Turn On Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc2c3|0xC3]]&lt;br /&gt;
|Turn Off Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc4c5|0xC4]]&lt;br /&gt;
|Turn On Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc4c5|0xC5]]&lt;br /&gt;
|Turn Off Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc6c7|0xC6]]&lt;br /&gt;
|Turn On Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc6c7|0xC7]]&lt;br /&gt;
|Turn Off Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xC8]]&lt;br /&gt;
|Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Remember the current offset as a loop point and increase the nesting level of the loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xC9]]&lt;br /&gt;
|Return to Loop Point Up to N Times&lt;br /&gt;
|2&lt;br /&gt;
|times: byte&lt;br /&gt;
|On the Nth repeat, this instruction will end the current loop by decrementing the nesting level of the loop. Otherwise, it will increment the loop counter and return to the loop point.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xCA]]&lt;br /&gt;
|Return to Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will increment the loop counter.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcb|0xCB]]&lt;br /&gt;
|Reset Sound Effects&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Reset sound effects such as noise, frequency modulation, reverb, overlay voice and alternate voice.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcccd|0xCC]]&lt;br /&gt;
|Turn On Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key on and key off performance of the subsequent notes and update the pitch only.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcccd|0xCD]]&lt;br /&gt;
|Turn Off Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcecf|0xCE]]&lt;br /&gt;
|Turn On Noise and Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcecf|0xCF]]&lt;br /&gt;
|Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd0d1|0xD0]]&lt;br /&gt;
|Turn On Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key off performance of the subsequent notes.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd0d1|0xD1]]&lt;br /&gt;
|Turn Off Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd2d3|0xD2]]&lt;br /&gt;
|Turn On Frequency Modulation and Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd2d3|0xD3]]&lt;br /&gt;
|Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd4d5|0xD4]]&lt;br /&gt;
|Turn On Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Duplicate and use the playback frequency of the previous voice channel.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd4d5|0xD5]]&lt;br /&gt;
|Turn Off Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd6d7|0xD6]]&lt;br /&gt;
|Turn On Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Multiply the playback frequency of the previous voice channel to the output volume. Lower pitch will make the volume smaller.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd6d7|0xD7]]&lt;br /&gt;
|Turn Off Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd8d9|0xD8]]&lt;br /&gt;
|Channel Fine Tuning (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The pitch can be changed in the range of one octave above and below.&lt;br /&gt;
The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is the multiplicand for the playback frequency, not a log-based parameter like cents. For example, when the &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is 127, the pitch will be multiplied by 127/128 (about +1 octave). Negative value ​​will lower the pitch.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd8d9|0xD9]]&lt;br /&gt;
|Channel Fine Tuning (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; will be added to the current tuning amount.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdadb|0xDA]]&lt;br /&gt;
|Turn On Portamento&lt;br /&gt;
|2&lt;br /&gt;
|speed: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;speed&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdadb|0xDB]]&lt;br /&gt;
|Turn Off Portamento&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0xDC]]&lt;br /&gt;
|Fix Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length_to_add: signed byte&lt;br /&gt;
|Ignore the regular length (delta-time) of subsequent notes and set to the fixed length. The &amp;lt;code&amp;gt;length_to_add&amp;lt;/code&amp;gt; parameter will be added to the current length value. (the initial value is 0)&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdd|0xDD]]&lt;br /&gt;
|Channel Pitch LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xde|0xDE]]&lt;br /&gt;
|Channel Volume LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdf|0xDF]]&lt;br /&gt;
|Channel Pan LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe0|0xE0]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe1|0xE1]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|value: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe2|0xE2]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Clears the effect of opcode 0xE1&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe3|0xE3]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe4|0xE4]]&lt;br /&gt;
|Channel Pitch LFO Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe5|0xE5]]&lt;br /&gt;
|Channel Volume LFO Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe6|0xE6]]&lt;br /&gt;
|Channel Pan LFO Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xE7-0xEF]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xf0fd|0xF0-0xFD]]&lt;br /&gt;
|Note, Tie, Rest with Length&lt;br /&gt;
|2&lt;br /&gt;
|length: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe00|0xFE 0x00]]&lt;br /&gt;
|Tempo&lt;br /&gt;
|4&lt;br /&gt;
|tempo: uint16&lt;br /&gt;
|bpm = tempo / 218.453333 (approximate)&lt;br /&gt;
More strictly, &amp;lt;code&amp;gt;bpm = 60.0 / (48 * (65536.0 / tempo) * (0x43D1 / (33868800.0 / 8)))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that this coefficient is different from other games with PlayStation AKAO.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe00|0xFE 0x01]]&lt;br /&gt;
|Tempo Slide&lt;br /&gt;
|5&lt;br /&gt;
|length: byte, tempo: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe02|0xFE 0x02]]&lt;br /&gt;
|Reverb Depth&lt;br /&gt;
|4&lt;br /&gt;
|depth: uint16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe02|0xFE 0x03]]&lt;br /&gt;
|Reverb Depth Slide&lt;br /&gt;
|5&lt;br /&gt;
|length: byte, depth: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe04|0xFE 0x04]]&lt;br /&gt;
|Turn On Drum Mode&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|The drum map offset is recorded in the file header.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe04|0xFE 0x05]]&lt;br /&gt;
|Turn Off Drum Mode&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe06|0xFE 0x06]]&lt;br /&gt;
|Unconditional Jump&lt;br /&gt;
|4&lt;br /&gt;
|destination_offset: signed int16&lt;br /&gt;
|This instruction can be used to make an infinite loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe07|0xFE 0x07]]&lt;br /&gt;
|CPU-Conditional Jump&lt;br /&gt;
|5&lt;br /&gt;
|condition: byte, destination_offset: signed int16&lt;br /&gt;
|Jump if the condition variable matches &amp;lt;code&amp;gt;condition&amp;lt;/code&amp;gt;. The value of the condition variable can be set from the game program.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe08|0xFE 0x08]]&lt;br /&gt;
|Jump on the Nth Repeat&lt;br /&gt;
|5&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe08|0xFE 0x09]]&lt;br /&gt;
|Break the Loop on the Nth Repeat&lt;br /&gt;
|5&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|Unlike 0xF0, this instruction will end the current loop by decrementing the nesting level of the loop.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa1|0xFE 0x0A]]&lt;br /&gt;
|Load Instrument (With Some Unknown Effect)&lt;br /&gt;
|3&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0b|0xFE 0x0B]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|6&lt;br /&gt;
|offset: signed int16, offset2: signed int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x0C-0x0D]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0e|0xFE 0x0E]]&lt;br /&gt;
|Subroutine Jump&lt;br /&gt;
|4&lt;br /&gt;
|destination_offset: signed int16&lt;br /&gt;
|The subroutine jump cannot be nested. It will overwrite the return address.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0f|0xFE 0x0F]]&lt;br /&gt;
|Return from Subroutine&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe10|0xFE 0x10]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|3&lt;br /&gt;
|value: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe10|0xFE 0x11]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Clears the effect of opcode 0xFE 0x10&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa3|0xFE 0x12]]&lt;br /&gt;
|Channel Master Volume Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x13]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe14|0xFE 0x14]]&lt;br /&gt;
|Load Custom Instrument (Key-Split Instrument)&lt;br /&gt;
|3&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|The custom instrument number corresponds to the custom instrument map pointed from the file header. Note that the number is different from the regular sample number used in opcode 0xA1.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe15|0xFE 0x15]]&lt;br /&gt;
|Time Signature&lt;br /&gt;
|4&lt;br /&gt;
|ticks_per_beat: byte, beats_per_measure: byte&lt;br /&gt;
|Note that two parameters can be 0. This pattern is used for initialization.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe16|0xFE 0x16]]&lt;br /&gt;
|Measure Number&lt;br /&gt;
|3&lt;br /&gt;
|measure: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x17-0x18]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe19|0xFE 0x19]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1a|0xFE 0x1A]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1b|0xFE 0x1B]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1c|0xFE 0x1C]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1d|0xFE 0x1D]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1e|0xFE 0x1E]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x1F]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|0xFE 0x20-0xFF&lt;br /&gt;
|Unimplemented (Out of Range)&lt;br /&gt;
|n/a&lt;br /&gt;
|&lt;br /&gt;
|Do not use.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFF]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF9/Sound/AKAO_sequence&amp;diff=5761</id>
		<title>FF9/Sound/AKAO sequence</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF9/Sound/AKAO_sequence&amp;diff=5761"/>
		<updated>2020-07-11T04:03:31Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: Created page with &amp;quot;== Introduction == AKAO sequence is similar to MIDI sequence - it's custom tracker format for playing sequence sound, well tuned specially for PSX.   == File Structure == ===...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
AKAO sequence is similar to MIDI sequence - it's custom tracker format for playing sequence sound, well tuned specially for PSX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
=== Header (size: 64 bytes) ===&lt;br /&gt;
&lt;br /&gt;
 struct AkaoSeqHeader&lt;br /&gt;
 {&lt;br /&gt;
   static const uint8_t magic[4];  // &amp;quot;AKAO&amp;quot; C-string&lt;br /&gt;
   uint16_t id;                    // song ID, used for playing sequence&lt;br /&gt;
   uint16_t length;                // data length (including this header)&lt;br /&gt;
   uint16_t reverb_type;           // reverb type (range from 0 to 9)&lt;br /&gt;
   uint8_t field_0A[6];&lt;br /&gt;
   uint32_t field_10;&lt;br /&gt;
   uint16_t sample_set_id;         // associated sample set ID&lt;br /&gt;
   uint16_t field_12;&lt;br /&gt;
   uint32_t field_14;&lt;br /&gt;
   uint32_t field_18;&lt;br /&gt;
   uint32_t field_1C;&lt;br /&gt;
   uint32_t mask;                  // represents bitmask of used channels in this song&lt;br /&gt;
   uint32_t field_24;&lt;br /&gt;
   uint32_t field_28;&lt;br /&gt;
   uint32_t field_2C;&lt;br /&gt;
   uint32_t instrument_map_offset; // relative offset to custom instrument map (0 if unused)&lt;br /&gt;
   uint32_t drum_map_offset;       // relative offset to custom drum map (0 if unused)&lt;br /&gt;
   uint32_t field_38;&lt;br /&gt;
   uint32_t field_3C;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
=== Channel Offsets (size: 2 bytes * &amp;lt;channels count&amp;gt;) ===&lt;br /&gt;
 struct AkaoChannelInfo&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t start_offsets[num_channels];  // offsets to channel opcode data&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 AkaoSeqHeader *header;&lt;br /&gt;
 int num_channels = 0;&lt;br /&gt;
 while (int bit = 0; header-&amp;gt;mask &amp;amp; (1 &amp;lt;&amp;lt; bit)) != 0; bit++)&lt;br /&gt;
   num_channels++;&lt;br /&gt;
&lt;br /&gt;
There is &amp;lt;channels count&amp;gt; offsets to channel opcode data counting from current offset. Each offsets is a relative offset based on the address the offset itself.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Channel Commands [AKAO Opcodes] ===&lt;br /&gt;
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 &amp;quot;opcodes&amp;quot;. Every opcode has its own number of arguments (from no-arguments, to 3 arguments).&lt;br /&gt;
&lt;br /&gt;
=== Drum Instrument Map Table ===&lt;br /&gt;
&lt;br /&gt;
When a song uses a drum kit with [[FF9/Sound/Opcodes/0xfe04|opcode 0xFE 0x04]], 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.&lt;br /&gt;
&lt;br /&gt;
The table consists of a repetition of 8-byte items.&lt;br /&gt;
&lt;br /&gt;
 struct AkaoDrumKeyAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t instrument;   // corresponding to opcode 0xA1&lt;br /&gt;
   uint8_t key;          // note number when playing the drum note&lt;br /&gt;
   uint8_t ar;           // ADSR: attack rate (0-127)&lt;br /&gt;
   uint8_t sr;           // ADSR: sustain rate (0-127)&lt;br /&gt;
   uint8_t s_mode;       // ADSR: sustain mode (1: linear increase, 3: linear decrease, 5: exponential increase, 7: exponential decrease)&lt;br /&gt;
   uint8_t rr;           // ADSR: release rate (0-127)&lt;br /&gt;
   uint8_t volume;       // adjust the percussion volume to n/128 of the original volume (0 will keep the original volume)&lt;br /&gt;
   uint8_t pan : 7;      // corresponding to opcode 0xAA&lt;br /&gt;
   uint8_t reverb : 1;   // reverb on/off (0: off, 1: on)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sound Opcode List ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Opcode&lt;br /&gt;
! Summary&lt;br /&gt;
! Length&lt;br /&gt;
! Operands&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0x00-0x99]]&lt;br /&gt;
|Note, Tie, Rest&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|The opcode indicates the note key and length. The note will be keyed off 2 ticks before the next note.&lt;br /&gt;
|-&lt;br /&gt;
|0x9A-0x9F&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xA0]]&lt;br /&gt;
|Finish Channel&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa1|0xA1]]&lt;br /&gt;
|Load Instrument&lt;br /&gt;
|2&lt;br /&gt;
|instrument: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0xA2]]&lt;br /&gt;
|Overwrite Next Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length: byte&lt;br /&gt;
|Ignores the regular length (delta-time) of the next note and overwrites it with the specified length.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xA3]]&lt;br /&gt;
|Channel Master Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa4|0xA4]]&lt;br /&gt;
|Pitch Bend Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, semitones: signed byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA5]]&lt;br /&gt;
|Set Octave&lt;br /&gt;
|2&lt;br /&gt;
|octave: byte (0-15)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA6]]&lt;br /&gt;
|Increase Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa5|0xA7]]&lt;br /&gt;
|Decrease Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xA8]]&lt;br /&gt;
|Channel Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa9|0xA9]]&lt;br /&gt;
|Channel Volume Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa8aa|0xAA]]&lt;br /&gt;
|Channel Pan&lt;br /&gt;
|2&lt;br /&gt;
|pan: byte (0-127)&lt;br /&gt;
|64 is the center.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xab|0xAB]]&lt;br /&gt;
|Channel Pan Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, pan: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xac|0xAC]]&lt;br /&gt;
|Noise Clock Frequency&lt;br /&gt;
|2&lt;br /&gt;
|clock: byte (0x00-0x3f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAD]]&lt;br /&gt;
|ADSR: Attack Rate&lt;br /&gt;
|2&lt;br /&gt;
|attack_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAE]]&lt;br /&gt;
|ADSR: Decay Rate&lt;br /&gt;
|2&lt;br /&gt;
|decay_rate: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xAF]]&lt;br /&gt;
|ADSR: Sustain Level&lt;br /&gt;
|2&lt;br /&gt;
|sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB0]]&lt;br /&gt;
|ADSR: Decay Rate &amp;amp; Sustain Level&lt;br /&gt;
|3&lt;br /&gt;
|decay_rate: byte (0x00-0x0f), sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB1]]&lt;br /&gt;
|ADSR: Sustain Rate&lt;br /&gt;
|2&lt;br /&gt;
|sustain_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB2]]&lt;br /&gt;
|ADSR: Release Rate&lt;br /&gt;
|2&lt;br /&gt;
|release_rate: byte (0x00-0x1f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB3]]&lt;br /&gt;
|ADSR: Reset ADSR&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB4]]&lt;br /&gt;
|Channel Pitch LFO (Vibrato)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB5]]&lt;br /&gt;
|Channel Pitch LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|The most significant bit of the &amp;lt;code&amp;gt;depth&amp;lt;/code&amp;gt; determines the amplitude range.&lt;br /&gt;
&lt;br /&gt;
When it is 0, the range is up to about ± 50 cents (amplitude is 15/256 compared with range type 1).&lt;br /&gt;
&lt;br /&gt;
When it is 1, the range is up to about ± 700 cents.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb4b5|0xB6]]&lt;br /&gt;
|Turn Off Channel Pitch LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xB7]]&lt;br /&gt;
|ADSR: Attack Mode&lt;br /&gt;
|2&lt;br /&gt;
|attack_mode: byte (1 or 5)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xB8]]&lt;br /&gt;
|Channel Volume LFO (Tremolo)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xB9]]&lt;br /&gt;
|Channel Volume LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xb8b9|0xBA]]&lt;br /&gt;
|Turn Off Channel Volume LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/ADSR|0xBB]]&lt;br /&gt;
|ADSR: Sustain Mode&lt;br /&gt;
|2&lt;br /&gt;
|sustain_mode: byte (1, 3, 5 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBC]]&lt;br /&gt;
|Channel Pan LFO&lt;br /&gt;
|3&lt;br /&gt;
|rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBD]]&lt;br /&gt;
|Channel Pan LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbcbd|0xBE]]&lt;br /&gt;
|Turn Off Channel Pan LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xbf|0xBF]]&lt;br /&gt;
|ADSR: Release Mode&lt;br /&gt;
|2&lt;br /&gt;
|release_mode: byte (3 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc0c1|0xC0]]&lt;br /&gt;
|Channel Transpose (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc0c1|0xC1]]&lt;br /&gt;
|Channel Transpose (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc2c3|0xC2]]&lt;br /&gt;
|Turn On Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc2c3|0xC3]]&lt;br /&gt;
|Turn Off Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc4c5|0xC4]]&lt;br /&gt;
|Turn On Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc4c5|0xC5]]&lt;br /&gt;
|Turn Off Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc6c7|0xC6]]&lt;br /&gt;
|Turn On Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc6c7|0xC7]]&lt;br /&gt;
|Turn Off Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xC8]]&lt;br /&gt;
|Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Remember the current offset as a loop point and increase the nesting level of the loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xC9]]&lt;br /&gt;
|Return to Loop Point Up to N Times&lt;br /&gt;
|2&lt;br /&gt;
|times: byte&lt;br /&gt;
|On the Nth repeat, this instruction will end the current loop by decrementing the nesting level of the loop. Otherwise, it will increment the loop counter and return to the loop point.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xc8c9|0xCA]]&lt;br /&gt;
|Return to Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will increment the loop counter.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcb|0xCB]]&lt;br /&gt;
|Reset Sound Effects&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Reset sound effects such as noise, frequency modulation, reverb, overlay voice and alternate voice.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcccd|0xCC]]&lt;br /&gt;
|Turn On Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key on and key off performance of the subsequent notes and update the pitch only.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcccd|0xCD]]&lt;br /&gt;
|Turn Off Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcecf|0xCE]]&lt;br /&gt;
|Turn On Noise and Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xcecf|0xCF]]&lt;br /&gt;
|Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd0d1|0xD0]]&lt;br /&gt;
|Turn On Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key off performance of the subsequent notes.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd0d1|0xD1]]&lt;br /&gt;
|Turn Off Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd2d3|0xD2]]&lt;br /&gt;
|Turn On Frequency Modulation and Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd2d3|0xD3]]&lt;br /&gt;
|Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd4d5|0xD4]]&lt;br /&gt;
|Turn On Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Duplicate and use the playback frequency of the previous voice channel.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd4d5|0xD5]]&lt;br /&gt;
|Turn Off Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd6d7|0xD6]]&lt;br /&gt;
|Turn On Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Multiply the playback frequency of the previous voice channel to the output volume. Lower pitch will make the volume smaller.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd6d7|0xD7]]&lt;br /&gt;
|Turn Off Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd8d9|0xD8]]&lt;br /&gt;
|Channel Fine Tuning (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The pitch can be changed in the range of one octave above and below.&lt;br /&gt;
The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is the multiplicand for the playback frequency, not a log-based parameter like cents. For example, when the &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is 127, the pitch will be multiplied by 127/128 (about +1 octave). Negative value ​​will lower the pitch.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xd8d9|0xD9]]&lt;br /&gt;
|Channel Fine Tuning (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; will be added to the current tuning amount.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdadb|0xDA]]&lt;br /&gt;
|Turn On Portamento&lt;br /&gt;
|2&lt;br /&gt;
|speed: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;speed&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdadb|0xDB]]&lt;br /&gt;
|Turn Off Portamento&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0x0099|0xDC]]&lt;br /&gt;
|Fix Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length_to_add: signed byte&lt;br /&gt;
|Ignore the regular length (delta-time) of subsequent notes and set to the fixed length. The &amp;lt;code&amp;gt;length_to_add&amp;lt;/code&amp;gt; parameter will be added to the current length value. (the initial value is 0)&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdd|0xDD]]&lt;br /&gt;
|Channel Pitch LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xde|0xDE]]&lt;br /&gt;
|Channel Volume LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xdf|0xDF]]&lt;br /&gt;
|Channel Pan LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe0|0xE0]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe1|0xE1]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|value: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe2|0xE2]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Clears the effect of opcode 0xE1&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe3|0xE3]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe4|0xE4]]&lt;br /&gt;
|Channel Pitch LFO Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe5|0xE5]]&lt;br /&gt;
|Channel Volume LFO Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xe6|0xE6]]&lt;br /&gt;
|Channel Pan LFO Rate Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, rate: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xE7-0xEF]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xf0fd|0xF0-0xFD]]&lt;br /&gt;
|Note, Tie, Rest with Length&lt;br /&gt;
|2&lt;br /&gt;
|length: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe00|0xFE 0x00]]&lt;br /&gt;
|Tempo&lt;br /&gt;
|4&lt;br /&gt;
|tempo: uint16&lt;br /&gt;
|bpm = tempo / 218.453333 (approximate)&lt;br /&gt;
More strictly, &amp;lt;code&amp;gt;bpm = 60.0 / (48 * (65536.0 / tempo) * (0x43D1 / (33868800.0 / 8)))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that this coefficient is different from other games with PlayStation AKAO.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe00|0xFE 0x01]]&lt;br /&gt;
|Tempo Slide&lt;br /&gt;
|5&lt;br /&gt;
|length: byte, tempo: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe02|0xFE 0x02]]&lt;br /&gt;
|Reverb Depth&lt;br /&gt;
|4&lt;br /&gt;
|depth: uint16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe02|0xFE 0x03]]&lt;br /&gt;
|Reverb Depth Slide&lt;br /&gt;
|5&lt;br /&gt;
|length: byte, depth: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe04|0xFE 0x04]]&lt;br /&gt;
|Turn On Drum Mode&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|The drum map offset is recorded in the file header.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe04|0xFE 0x05]]&lt;br /&gt;
|Turn Off Drum Mode&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe06|0xFE 0x06]]&lt;br /&gt;
|Unconditional Jump&lt;br /&gt;
|4&lt;br /&gt;
|destination_offset: signed int16&lt;br /&gt;
|This instruction can be used to make an infinite loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe07|0xFE 0x07]]&lt;br /&gt;
|CPU-Conditional Jump&lt;br /&gt;
|5&lt;br /&gt;
|condition: byte, destination_offset: signed int16&lt;br /&gt;
|Jump if the condition variable matches &amp;lt;code&amp;gt;condition&amp;lt;/code&amp;gt;. The value of the condition variable can be set from the game program.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe08|0xFE 0x08]]&lt;br /&gt;
|Jump on the Nth Repeat&lt;br /&gt;
|5&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe08|0xFE 0x09]]&lt;br /&gt;
|Break the Loop on the Nth Repeat&lt;br /&gt;
|5&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|Unlike 0xF0, this instruction will end the current loop by decrementing the nesting level of the loop.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa1|0xFE 0x0A]]&lt;br /&gt;
|Load Instrument (With Some Unknown Effect)&lt;br /&gt;
|3&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0b|0xFE 0x0B]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|6&lt;br /&gt;
|offset: signed int16, offset2: signed int16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x0C-0x0D]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0e|0xFE 0x0E]]&lt;br /&gt;
|Subroutine Jump&lt;br /&gt;
|4&lt;br /&gt;
|destination_offset: signed int16&lt;br /&gt;
|The subroutine jump cannot be nested. It will overwrite the return address.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe0f|0xFE 0x0F]]&lt;br /&gt;
|Return from Subroutine&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe10|0xFE 0x10]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|3&lt;br /&gt;
|value: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe10|0xFE 0x11]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Clears the effect of opcode 0xFE 0x10&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa3|0xFE 0x12]]&lt;br /&gt;
|Channel Master Volume Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x13]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe14|0xFE 0x14]]&lt;br /&gt;
|Load Custom Instrument (Key-Split Instrument)&lt;br /&gt;
|3&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|The custom instrument number corresponds to the custom instrument map pointed from the file header. Note that the number is different from the regular sample number used in opcode 0xA1.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe15|0xFE 0x15]]&lt;br /&gt;
|Time Signature&lt;br /&gt;
|4&lt;br /&gt;
|ticks_per_beat: byte, beats_per_measure: byte&lt;br /&gt;
|Note that two parameters can be 0. This pattern is used for initialization.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe16|0xFE 0x16]]&lt;br /&gt;
|Measure Number&lt;br /&gt;
|3&lt;br /&gt;
|measure: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x17-0x18]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe19|0xFE 0x19]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1a|0xFE 0x1A]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1b|0xFE 0x1B]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1c|0xFE 0x1C]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1d|0xFE 0x1D]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xfe1e|0xFE 0x1E]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFE 0x1F]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|0xFE 0x20-0xFF&lt;br /&gt;
|Unimplemented (Out of Range)&lt;br /&gt;
|n/a&lt;br /&gt;
|&lt;br /&gt;
|Do not use.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF9/Sound/Opcodes/0xa0|0xFF]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF9/Sound&amp;diff=5760</id>
		<title>FF9/Sound</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF9/Sound&amp;diff=5760"/>
		<updated>2020-07-11T02:11:56Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: Add subpage links as like as FF7&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[FF9/Sound/Overview|Overview]]&lt;br /&gt;
* [[FF9/Sound/AKAO sequence|AKAO sequence]]&lt;br /&gt;
* [[FF9/Sound/AKAO instruments|AKAO instruments]]&lt;br /&gt;
* [[FF9/Sound/Code Map|Code Map]]&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF9&amp;diff=5759</id>
		<title>FF9</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF9&amp;diff=5759"/>
		<updated>2020-07-11T02:08:11Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: Add a link to sound page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Final Fantasy 9 Information=&lt;br /&gt;
Since there isn't a PC version of this game all information relates to the PS1.&lt;br /&gt;
&lt;br /&gt;
=Disk IMG Format=&lt;br /&gt;
The game information is contained in a single file on the CD-ROM named FF9.IMG with each disk containing a file named this.&lt;br /&gt;
FMV movies are stored in sub directories on the disk.&lt;br /&gt;
&lt;br /&gt;
==[[FF9/IMGRootDir|Image Root Directory]]==&lt;br /&gt;
The IMG file begins with a '''root directory''' that has a list of file counts and sectors.&lt;br /&gt;
&lt;br /&gt;
==[[FF9/IMGSubDir|Image Sub Directory]]==&lt;br /&gt;
Some directory entries contain '''subdirectories'''.&lt;br /&gt;
&lt;br /&gt;
==[[FF9/Dirs|Directories and data]]==&lt;br /&gt;
What contains directories and for what contain files&lt;br /&gt;
&lt;br /&gt;
===[[FF9/Dirs/00|Directory '0']]===&lt;br /&gt;
&lt;br /&gt;
===[[FF9/Dirs/01|Directory '1']]===&lt;br /&gt;
&lt;br /&gt;
==[[FF9/File/Data|File Cluster Information]]==&lt;br /&gt;
Some of the files are actually '''data clusters''' that contain multiple information these files begin with the hexadecimal number 0xDB.&lt;br /&gt;
&lt;br /&gt;
===[[FF9/File/0x02|Chunk 0x02: 3D Model data]]===&lt;br /&gt;
This chunk contains 3D model information: vertices, quads, triangles, texture mapping coordinates...&lt;br /&gt;
&lt;br /&gt;
===[[FF9/File/0x03|Chunk 0x03: 3D Animation]]===&lt;br /&gt;
This chunk contains animation sequences for 3d models...&lt;br /&gt;
&lt;br /&gt;
===[[FF9/File/0x04|Chunk 0x04: Image data(TIM`s)]]===&lt;br /&gt;
This chunk contains tim-images...&lt;br /&gt;
&lt;br /&gt;
===[[FF9/File/0x05|Chunk 0x05: Scripts]]===&lt;br /&gt;
This chunk contains scripts files...&lt;br /&gt;
&lt;br /&gt;
===[[FF9/File/0x0A|Chunk 0x0A: Field tiles]]===&lt;br /&gt;
This chunk contains information about field tiles and field camera parameters...&lt;br /&gt;
&lt;br /&gt;
===[[FF9/File/0x0B|Chunk 0x0B: Field walkmesh]]===&lt;br /&gt;
This chunk contain field walkmesh data...&lt;br /&gt;
&lt;br /&gt;
===[[FF9/File/0x0C|Chunk 0x0C: Battle scenes]]===&lt;br /&gt;
This chunk contain battle scenes geometry...&lt;br /&gt;
&lt;br /&gt;
===[[FF9/File/0x12|Chunk 0x12: Contain CLUT and TPage for models]]===&lt;br /&gt;
This chunk contains CLUT and TPage info for models.&lt;br /&gt;
&lt;br /&gt;
===[[FF9/File/0x1B|Chunk 0x1B: Pointers to other 'DB']]===&lt;br /&gt;
This chunk contains pointers to other DB structures.&lt;br /&gt;
&lt;br /&gt;
=[[FF9/WorldMap|WorldMap]]=&lt;br /&gt;
&lt;br /&gt;
=[[FF9/CharTables|Character Tables]]=&lt;br /&gt;
==[[FF9/CharTables#Character_Table_for_EU_.26_US_version|European &amp;amp; US Tables]]==&lt;br /&gt;
==[[FF9/CharTables#Character_Table_for_JP_version|Japanese Table]]==&lt;br /&gt;
==[[FF9/CharTables#Kanji_Table_A|Kanji Table A]]==&lt;br /&gt;
==[[FF9/CharTables#Kanji_Table_B|Kanji Table B]]==&lt;br /&gt;
&lt;br /&gt;
=Sound=&lt;br /&gt;
* [[FF9/Sound|Sound]]&lt;br /&gt;
&lt;br /&gt;
=Tools and Patches=&lt;br /&gt;
* [[FF9/Tools|Tools and Patches]]&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF9&amp;diff=5758</id>
		<title>FF9</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF9&amp;diff=5758"/>
		<updated>2020-07-11T01:58:43Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: Fix heading levels?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Final Fantasy 9 Information=&lt;br /&gt;
Since there isn't a PC version of this game all information relates to the PS1.&lt;br /&gt;
&lt;br /&gt;
=Disk IMG Format=&lt;br /&gt;
The game information is contained in a single file on the CD-ROM named FF9.IMG with each disk containing a file named this.&lt;br /&gt;
FMV movies are stored in sub directories on the disk.&lt;br /&gt;
&lt;br /&gt;
==[[FF9/IMGRootDir|Image Root Directory]]==&lt;br /&gt;
The IMG file begins with a '''root directory''' that has a list of file counts and sectors.&lt;br /&gt;
&lt;br /&gt;
==[[FF9/IMGSubDir|Image Sub Directory]]==&lt;br /&gt;
Some directory entries contain '''subdirectories'''.&lt;br /&gt;
&lt;br /&gt;
==[[FF9/Dirs|Directories and data]]==&lt;br /&gt;
What contains directories and for what contain files&lt;br /&gt;
&lt;br /&gt;
===[[FF9/Dirs/00|Directory '0']]===&lt;br /&gt;
&lt;br /&gt;
===[[FF9/Dirs/01|Directory '1']]===&lt;br /&gt;
&lt;br /&gt;
==[[FF9/File/Data|File Cluster Information]]==&lt;br /&gt;
Some of the files are actually '''data clusters''' that contain multiple information these files begin with the hexadecimal number 0xDB.&lt;br /&gt;
&lt;br /&gt;
===[[FF9/File/0x02|Chunk 0x02: 3D Model data]]===&lt;br /&gt;
This chunk contains 3D model information: vertices, quads, triangles, texture mapping coordinates...&lt;br /&gt;
&lt;br /&gt;
===[[FF9/File/0x03|Chunk 0x03: 3D Animation]]===&lt;br /&gt;
This chunk contains animation sequences for 3d models...&lt;br /&gt;
&lt;br /&gt;
===[[FF9/File/0x04|Chunk 0x04: Image data(TIM`s)]]===&lt;br /&gt;
This chunk contains tim-images...&lt;br /&gt;
&lt;br /&gt;
===[[FF9/File/0x05|Chunk 0x05: Scripts]]===&lt;br /&gt;
This chunk contains scripts files...&lt;br /&gt;
&lt;br /&gt;
===[[FF9/File/0x0A|Chunk 0x0A: Field tiles]]===&lt;br /&gt;
This chunk contains information about field tiles and field camera parameters...&lt;br /&gt;
&lt;br /&gt;
===[[FF9/File/0x0B|Chunk 0x0B: Field walkmesh]]===&lt;br /&gt;
This chunk contain field walkmesh data...&lt;br /&gt;
&lt;br /&gt;
===[[FF9/File/0x0C|Chunk 0x0C: Battle scenes]]===&lt;br /&gt;
This chunk contain battle scenes geometry...&lt;br /&gt;
&lt;br /&gt;
===[[FF9/File/0x12|Chunk 0x12: Contain CLUT and TPage for models]]===&lt;br /&gt;
This chunk contains CLUT and TPage info for models.&lt;br /&gt;
&lt;br /&gt;
===[[FF9/File/0x1B|Chunk 0x1B: Pointers to other 'DB']]===&lt;br /&gt;
This chunk contains pointers to other DB structures.&lt;br /&gt;
&lt;br /&gt;
=[[FF9/WorldMap|WorldMap]]=&lt;br /&gt;
&lt;br /&gt;
=[[FF9/CharTables|Character Tables]]=&lt;br /&gt;
==[[FF9/CharTables#Character_Table_for_EU_.26_US_version|European &amp;amp; US Tables]]==&lt;br /&gt;
==[[FF9/CharTables#Character_Table_for_JP_version|Japanese Table]]==&lt;br /&gt;
==[[FF9/CharTables#Kanji_Table_A|Kanji Table A]]==&lt;br /&gt;
==[[FF9/CharTables#Kanji_Table_B|Kanji Table B]]==&lt;br /&gt;
&lt;br /&gt;
=Tools and Patches=&lt;br /&gt;
* [[FF9/Tools|Tools and Patches]]&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Code_Map&amp;diff=5757</id>
		<title>FF7/PSX/Sound/Code Map</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Code_Map&amp;diff=5757"/>
		<updated>2020-06-28T06:57:19Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Code Map =&lt;br /&gt;
&lt;br /&gt;
Introduces functions, variables and data related to sound, contained in SCUS_941.63 (game program of US version). Note that all symbol names below are for convenience only.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x800293D0&lt;br /&gt;
|void _AkaoSpuTransferCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800293F4&lt;br /&gt;
|void _AkaoSpuSetTransferCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029424&lt;br /&gt;
|unsigned int _AkaoTransferSamples(const unsigned char *addr, unsigned int size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800294A4&lt;br /&gt;
|void _AkaoWaitForSpuTransfer(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800294BC&lt;br /&gt;
|void _AkaoReset(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800297A4&lt;br /&gt;
|void AkaoLoadInstrumentSet(const sturct AkaoSampleSet *sampleSet, const struct AkaoInstrumentAttr *instrumentSet)&lt;br /&gt;
|Load standard instrument set&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR.DAT&lt;br /&gt;
&lt;br /&gt;
This function is called transparently from 0x8002988C.&lt;br /&gt;
|-&lt;br /&gt;
|0x80029818&lt;br /&gt;
|void AkaoLoadInstrumentSet2(const sturct AkaoSampleSet *sampleSet, const struct AkaoInstrumentAttr *instrumentSet)&lt;br /&gt;
|Load additional instrument set&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR2.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR2.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x8002988C&lt;br /&gt;
|void AkaoInitialize(const sturct AkaoSampleSet *sampleSet, const struct AkaoInstrumentAttr *instrumentSet)&lt;br /&gt;
|Initialize sound driver and load initial instruments&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x800299C8&lt;br /&gt;
|void AkaoDeinitialize(void)&lt;br /&gt;
|Deinitialize sound driver&lt;br /&gt;
|-&lt;br /&gt;
|0x80029AF0&lt;br /&gt;
|void AkaoSetReverbMode(int mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029B78&lt;br /&gt;
|void _AkaoTransferSeqBody(const unsigned char *data, int size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029C48&lt;br /&gt;
|void _AkaoLoadTracks(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002DA30&lt;br /&gt;
|void AkaoNewMessage(struct AkaoMessage **ppMessage)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002DA7C&lt;br /&gt;
|int AkaoPostMessage(void)&lt;br /&gt;
|Post a new command message to the queue (with some wrapped processing)&lt;br /&gt;
&lt;br /&gt;
The message data comes from a global variable at 0x8009A000.&lt;br /&gt;
&lt;br /&gt;
Return value depends on the content of the message data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Opcode 0x10'''&lt;br /&gt;
&lt;br /&gt;
Load and start playing new [[FF7/PSX/Sound/AKAO sequence|AKAO sequence]]&lt;br /&gt;
&lt;br /&gt;
Returns: 0 for success, 1 for already loaded, and -1 for invalid signature&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Opcode 0x92'''&lt;br /&gt;
&lt;br /&gt;
Set value to the condition variable used by Opcode 0xEF.&lt;br /&gt;
|-&lt;br /&gt;
|0x8002E1A8&lt;br /&gt;
|void _AkaoDispatchMessages(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002E23C&lt;br /&gt;
|void _AkaoWriteSpuRegisters(int voiceNum, struct AkaoSpuVoiceAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002E478&lt;br /&gt;
|void _AkaoDspOnTick(struct AkaoPlayerTrack *track, struct AkaoPlayer *player, int voiceMask)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002ED34&lt;br /&gt;
|void _AkaoCalculateVolumeAndPitch(struct AkaoPlayerTrack *track, int voiceMask, int voiceNum)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002F24C&lt;br /&gt;
|void _AkaoCalculateVolumeAndPitch2(struct AkaoPlayerTrack *track, int voiceMask)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002F738&lt;br /&gt;
|void _AkaoDspOverlayVoice(struct AkaoPlayerTrack *track, int unknownVoiceMask, int voiceNum)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002F848&lt;br /&gt;
|void _AkaoDspMain(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002FF4C&lt;br /&gt;
|void _AkaoSpuNoiseVoice(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030038&lt;br /&gt;
|void _AkaoSpuReverbVoice(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030148&lt;br /&gt;
|void _AkaoSpuPitchLFOVoice(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030234&lt;br /&gt;
|int _AkaoTimerCallback(void)&lt;br /&gt;
|Sound callback event that is periodically triggered by root counter 2&lt;br /&gt;
|-&lt;br /&gt;
|0x800308D4&lt;br /&gt;
|void _AkaoMain(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030E7C&lt;br /&gt;
|void _AkaoDispatchVoice(struct AkaoPlayerTrack *track, struct AkaoPlayer *player, int voiceMask)&lt;br /&gt;
|Dispatch voice opcodes until the next note or end of track&lt;br /&gt;
|-&lt;br /&gt;
|0x80031820&lt;br /&gt;
|void AkaoSetInstrument(struct AkaoPlayerTrack *track, unsigned short progNumber)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800318BC&lt;br /&gt;
|int _AkaoReadNextNote(struct AkaoPlayerTrack *track)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80031A70&lt;br /&gt;
|int _AkaoFindNextEndPoint(struct AkaoPlayerTrack *track)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80049548&lt;br /&gt;
|void (* const MESSAGE_HANDLERS[256])(struct AkaoMessage *)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80049948&lt;br /&gt;
|const unsigned char VOICE_OPCODE_LENGTHS[0x60]&lt;br /&gt;
|Length table for voice opcodes 0xa0-0xff&lt;br /&gt;
&lt;br /&gt;
0 for end of track and branches&lt;br /&gt;
|-&lt;br /&gt;
|0x80049AA8&lt;br /&gt;
|void (* const VOICE_OPCODES[0x60])(struct AkaoPlayerTrack *, struct AkaoPlayer *, int)&lt;br /&gt;
|Address table for voice opcodes 0xa0-0xff&lt;br /&gt;
|-&lt;br /&gt;
|0x80049C28&lt;br /&gt;
|const unsigned short DELTA_TIME_TABLE[11];&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80049C44&lt;br /&gt;
|const unsigned short VOLUME_TABLE_L[128]&lt;br /&gt;
|See [[FF7/PSX/Sound/Opcodes/0xa8aa|Opcode 0xAA]] for volume balance calculation&lt;br /&gt;
|-&lt;br /&gt;
|0x80049E44&lt;br /&gt;
|const unsigned short VOLUME_TABLE_R[128]&lt;br /&gt;
|See [[FF7/PSX/Sound/Opcodes/0xa8aa|Opcode 0xAA]] for volume balance calculation&lt;br /&gt;
|-&lt;br /&gt;
|0x8004A5CC&lt;br /&gt;
|const short *LFO_FORMS[16]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8004A60C&lt;br /&gt;
|const unsigned char EMPTY_ADPCM[32]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80063010&lt;br /&gt;
|int g_AkaoNumQueuedMessages&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80081DC8&lt;br /&gt;
|AkaoMessage g_AkaoMessageQueue[]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80083580&lt;br /&gt;
|unsigned char g_AkaoSeqData[]&lt;br /&gt;
|RAM area to load AKAO sequence data&lt;br /&gt;
|-&lt;br /&gt;
|0x8009A000&lt;br /&gt;
|AkaoMessage g_AkaoMessage&lt;br /&gt;
|Message data to be posted. Processed by the function 0x8002DA7C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Runtime Library Functions ==&lt;br /&gt;
&lt;br /&gt;
=== LIBSPU ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x80036298&lt;br /&gt;
|void SpuInit(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80036FFC&lt;br /&gt;
|long SpuInitMalloc(long num, char *top)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800373AC&lt;br /&gt;
|long SpuMallocWithStartAddr(unsigned long addr, long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037964&lt;br /&gt;
|unsigned long SpuSetNoiseVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037B90&lt;br /&gt;
|long SpuSetNoiseClock(long n_clock)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037BE0&lt;br /&gt;
|unsigned long SpuRead(unsigned char *addr, unsigned long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037C40&lt;br /&gt;
|long SpuSetReverb(long on_off)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037D90&lt;br /&gt;
|long SpuGetReverb(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037E1C&lt;br /&gt;
|long SpuSetReverbModeParam(SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800387FC&lt;br /&gt;
|void SpuGetReverbModeParam (SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003884C&lt;br /&gt;
|long SpuSetReverbDepth(SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800388C4&lt;br /&gt;
|unsigned long SpuSetReverbVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800388E8&lt;br /&gt;
|long SpuClearReverbWorkArea(long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038A84&lt;br /&gt;
|long SpuSetIRQ(long on_off)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038BC4&lt;br /&gt;
|unsigned long SpuSetIRQAddr(unsigned long addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038C04&lt;br /&gt;
|SpuIRQCallbackProc SpuSetIRQCallback(SpuIRQCallbackProc func)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038C6C&lt;br /&gt;
|void SpuSetKey(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038F04&lt;br /&gt;
|unsigned long SpuWrite(unsigned char *addr, unsigned long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038F64&lt;br /&gt;
|unsigned long SpuSetTransferStartAddr(unsigned long addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038FB8&lt;br /&gt;
|long SpuSetTransferMode(long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038FEC&lt;br /&gt;
|SpuTransferCallbackProc SpuSetTransferCallback(SpuTransferCallbackProc func)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039010&lt;br /&gt;
|unsigned long SpuSetPitchLFOVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039034&lt;br /&gt;
|void SpuSetCommonAttr(SpuCommonAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800393C8&lt;br /&gt;
|void SpuSetVoiceVolume(int voiceNum, short volL, short volR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039450&lt;br /&gt;
|void SpuSetVoiceVolumeAttr(int voiceNum, short volL, short volR, short volModeL, short volModeR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800395C8&lt;br /&gt;
|void SpuSetVoicePitch(int voiceNum, unsigned short pitch)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039644&lt;br /&gt;
|void SpuSetVoiceStartAddr(int voiceNum, unsigned long startAddr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800396C0&lt;br /&gt;
|void SpuSetVoiceLoopStartAddr(int voiceNum, unsigned long lsa)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003973C&lt;br /&gt;
|void SpuSetVoiceDR(int voiceNum, unsigned short DR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800397C8&lt;br /&gt;
|void SpuSetVoiceSL(int voiceNum, unsigned short SL)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039850&lt;br /&gt;
|void SpuSetVoiceARAttr(int voiceNum, unsigned short AR, long ARmode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800398EC&lt;br /&gt;
|void SpuSetVoiceSRAttr(int voiceNum, unsigned short SR, long SRmode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800399D0&lt;br /&gt;
|void SpuSetVoiceRRAttr(int voiceNum, unsigned short RR, long RRmode)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LIBETC ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D0C0&lt;br /&gt;
|int ResetCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D150&lt;br /&gt;
|int VSyncCallback(void (*func)(void))&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D1B4&lt;br /&gt;
|int StopCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D214&lt;br /&gt;
|int CheckCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LIBAPI ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x800429F0&lt;br /&gt;
|void DeliverEvent(unsigned long ev1, unsigned long ev2)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A00&lt;br /&gt;
|long OpenEvent(unsigned long desc, long spec, long mode, long (*func)())&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A10&lt;br /&gt;
|long CloseEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A20&lt;br /&gt;
|long WaitEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A40&lt;br /&gt;
|long EnableEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A50&lt;br /&gt;
|long DisableEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042BC0&lt;br /&gt;
|long SetRCnt(unsigned long spec, unsigned short target, long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042C60&lt;br /&gt;
|long GetRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042C98&lt;br /&gt;
|long StartRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042CCC&lt;br /&gt;
|long StopRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Structures =&lt;br /&gt;
&lt;br /&gt;
[[FF7/PSX/Sound/INSTRx.DAT|struct AkaoInstrumentAttr]]&lt;br /&gt;
&lt;br /&gt;
[[FF7/PSX/Sound/INSTRx.ALL|struct AkaoSampleSet]]&lt;br /&gt;
&lt;br /&gt;
[[FF7/PSX/Sound/AKAO sequence|struct AkaoSeqHeader, struct AkaoDrumKeyAttr]]&lt;br /&gt;
&lt;br /&gt;
 struct AkaoMessage // 36 bytes long&lt;br /&gt;
 {&lt;br /&gt;
   uint16_t opcode;&lt;br /&gt;
   uint16_t reserved;&lt;br /&gt;
   uint32_t data[8];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoSpuVoiceAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t voice;          // 0x00: voice number&lt;br /&gt;
   uint32_t update_flags;   // 0x04: bitset that indicates what SPU registers need to be updated&lt;br /&gt;
   uint32_t addr;           // 0x08: waveform data start address (SPU address)&lt;br /&gt;
   uint32_t loop_addr;      // 0x0c: loop start address (SPU address)&lt;br /&gt;
   uint32_t a_mode;         // 0x10: ADSR: attack mode&lt;br /&gt;
   uint32_t s_mode;         // 0x14: ADSR: sustain mode&lt;br /&gt;
   uint32_t r_mode          // 0x18: ADSR: release mode&lt;br /&gt;
   uint16_t pitch;          // 0x1c: pitch&lt;br /&gt;
   uint16_t ar;             // 0x1e: ADSR: attack rate&lt;br /&gt;
   uint16_t dr;             // 0x20: ADSR: decay rate&lt;br /&gt;
   uint16_t sl;             // 0x22: ADSR: sustain level&lt;br /&gt;
   uint16_t sr;             // 0x24: ADSR: sustain rate&lt;br /&gt;
   uint16_t rr;             // 0x26: ADSR: release rate&lt;br /&gt;
   SpuVolume volume;        // 0x28: volume (left and right)&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoPlayer // the music player instance exists at 0x8009A104&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t stereo_mode;                 // 0x00: stereo mode (1: stereo, 4: surround, otherwise: mono)&lt;br /&gt;
   uint32_t active_voices;               // 0x04: bitset that indicates the voices currently in use&lt;br /&gt;
   uint32_t key_on_voices;               // 0x08: bitset that indicates the voices to key on&lt;br /&gt;
   uint32_t keyed_voices;                // 0x0c: bitset that indicates the voices currently keyed on&lt;br /&gt;
   uint32_t key_off_voices;              // 0x10: bitset that indicates the voices to key off&lt;br /&gt;
   uint32_t saved_active_voices;         // 0x14: unknown voice bitset&lt;br /&gt;
   uint32_t tempo;                       // 0x18: tempo (Q16 fixed-point number)&lt;br /&gt;
   int32_t tempo_slope;                  // 0x1c: slope of tempo slider (Q16 fixed-point number)&lt;br /&gt;
   uint32_t time_counter;                // 0x20: time counter (0x10000 = 1 tick)&lt;br /&gt;
   uint32_t overlay_voices;              // 0x24: bitset that indicates the sub-voices used for overlay (opcode 0xF4)&lt;br /&gt;
   uint32_t alternate_voices;            // 0x28: bitset that indicates the sub-voices used for alternate voice (opcode 0xF8)&lt;br /&gt;
   uint32_t noise_voices;                // 0x2c: bitset that indicates the voices with noise mode enabled&lt;br /&gt;
   uint32_t reverb_voices;               // 0x30: bitset that indicates the voices with reverb enabled&lt;br /&gt;
   uint32_t pitch_lfo_voices;            // 0x34: bitset that indicates the voices with pitch LFO (frequency modulation) mode enabled&lt;br /&gt;
   uint32_t spucnt;                      // 0x38: SPUCNT shadow&lt;br /&gt;
   uint32_t reverb_type;                 // 0x3c: reverb type&lt;br /&gt;
   uint32_t reverb_depth;                // 0x40: reverb depth (Q16 fixed-point number)&lt;br /&gt;
   int32_t reverb_depth_slope;           // 0x44: slope of reverb depth slider (Q16 fixed-point number)&lt;br /&gt;
   uint16_t tempo_slide_length;          // 0x48: tempo slide length&lt;br /&gt;
   uint16_t song_id;                     // 0x4a: current song id&lt;br /&gt;
   uint16_t condition_ack;               // 0x4c: the last matched condition value (opcode 0xEF)&lt;br /&gt;
   uint16_t condition;                   // 0x4e: condition variable for dynamic branching according to game status (opcode 0xEF)&lt;br /&gt;
   uint16_t reverb_depth_slide_length;   // 0x50: length of reverb depth slide&lt;br /&gt;
   uint16_t noise_clock;                 // 0x52: noise clock frequency&lt;br /&gt;
   uint16_t field_54;                    // 0x54: unknown (can be altered by opcode 0xF3)&lt;br /&gt;
   uint16_t beats_per_measure;           // 0x56: beats per measure&lt;br /&gt;
   uint16_t beat;                        // 0x58: current beat&lt;br /&gt;
   uint16_t ticks_per_beat;              // 0x5a: ticks per beat&lt;br /&gt;
   uint16_t tick;                        // 0x5c: current ticks per beat&lt;br /&gt;
   uint16_t measure;                     // 0x5e: current measure&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoPlayerTrack // the music player track instances exist at 0x80096608 + (N * 0x108)&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t *addr;                                    // 0x00&lt;br /&gt;
   uint8_t *loop_addrs[4];                           // 0x04&lt;br /&gt;
   AkaoDrumKeyAttr *drum_addr;                       // 0x14&lt;br /&gt;
   int16_t *vibrato_lfo_addr;                        // 0x18&lt;br /&gt;
   int16_t *tremolo_lfo_addr;                        // 0x1c&lt;br /&gt;
   int16_t *pan_lfo_addr;                            // 0x20&lt;br /&gt;
   uint32_t overlay_voice_num;                       // 0x24&lt;br /&gt;
   uint32_t alternate_voice_num;                     // 0x28&lt;br /&gt;
   uint32_t master_volume;                           // 0x2c&lt;br /&gt;
   uint32_t pitch_of_note;                           // 0x30&lt;br /&gt;
   int32_t pitch_bend_slide_amplitude;               // 0x34&lt;br /&gt;
   uint16_t voice_effect_flags;                      // 0x38&lt;br /&gt;
   uint16_t field_3A;                                // 0x3a&lt;br /&gt;
   uint16_t field_3C;                                // 0x3c&lt;br /&gt;
   uint16_t field_3E;                                // 0x3e&lt;br /&gt;
   uint32_t field_40;                                // 0x40&lt;br /&gt;
   uint32_t volume;                                  // 0x44&lt;br /&gt;
   int32_t volume_slope;                             // 0x48&lt;br /&gt;
   int32_t pitch_bend_slope;                         // 0x4c&lt;br /&gt;
   uint16_t field_50;                                // 0x50&lt;br /&gt;
   uint16_t field_52;                                // 0x52&lt;br /&gt;
   uint16_t field_54;                                // 0x54&lt;br /&gt;
   uint8_t delta_time_counter;                       // 0x56&lt;br /&gt;
   uint8_t gate_time_counter;                        // 0x57&lt;br /&gt;
   uint16_t instrument;                              // 0x58&lt;br /&gt;
   uint16_t field_5A;                                // 0x5a&lt;br /&gt;
   uint16_t volume_slide_length_counter;             // 0x5c&lt;br /&gt;
   uint16_t overlay_balance_slide_length_counter;    // 0x5e&lt;br /&gt;
   uint16_t pan;                                     // 0x60&lt;br /&gt;
   uint16_t pan_slide_length;                        // 0x62&lt;br /&gt;
   int16_t pitch_slide_length_counter;               // 0x64&lt;br /&gt;
   uint16_t octave;                                  // 0x66&lt;br /&gt;
   uint16_t pitch_slide_length;                      // 0x68&lt;br /&gt;
   uint16_t previous_note_number;                    // 0x6a&lt;br /&gt;
   uint16_t portamento_speed;                        // 0x6c&lt;br /&gt;
   uint16_t legato_flags;                            // 0x6e&lt;br /&gt;
   uint16_t field_70;                                // 0x70&lt;br /&gt;
   uint16_t vibrato_delay;                           // 0x72&lt;br /&gt;
   uint16_t vibrato_delay_counter;                   // 0x74&lt;br /&gt;
   uint16_t vibrato_rate;                            // 0x76&lt;br /&gt;
   uint16_t vibrato_rate_counter;                    // 0x78&lt;br /&gt;
   uint16_t vibrato_form;                            // 0x7a&lt;br /&gt;
   uint16_t vibrato_max_amplitude;                   // 0x7c&lt;br /&gt;
   uint16_t vibrato_depth;                           // 0x7e&lt;br /&gt;
   uint16_t vibrato_depth_slide_length_counter;      // 0x80&lt;br /&gt;
   int16_t vibrato_depth_slope;                      // 0x82&lt;br /&gt;
   uint16_t field_84;                                // 0x84&lt;br /&gt;
   uint16_t tremolo_delay;                           // 0x86&lt;br /&gt;
   uint16_t tremolo_delay_counter;                   // 0x88&lt;br /&gt;
   uint16_t tremolo_rate;                            // 0x8a&lt;br /&gt;
   uint16_t tremolo_rate_counter;                    // 0x8c&lt;br /&gt;
   uint16_t tremolo_form;                            // 0x8e&lt;br /&gt;
   uint16_t tremolo_depth;                           // 0x90&lt;br /&gt;
   uint16_t tremolo_depth_slide_length_counter;      // 0x92&lt;br /&gt;
   int16_t tremolo_depth_slope;                      // 0x94&lt;br /&gt;
   uint16_t field_96;                                // 0x96&lt;br /&gt;
   uint16_t pan_lfo_rate;                            // 0x98&lt;br /&gt;
   uint16_t pan_lfo_rate_counter;                    // 0x9a&lt;br /&gt;
   uint16_t pan_lfo_form;                            // 0x9c&lt;br /&gt;
   uint16_t pan_lfo_depth;                           // 0x9e&lt;br /&gt;
   uint16_t pan_lfo_depth_slide_length_counter;      // 0xa0&lt;br /&gt;
   int16_t pan_lfo_slope;                            // 0xa2&lt;br /&gt;
   uint16_t noise_on_off_delay_counter;              // 0xa4&lt;br /&gt;
   uint16_t pitchmod_on_off_delay_counter;           // 0xa6&lt;br /&gt;
   uint8_t field_A8[16];                             // 0xa8&lt;br /&gt;
   uint16_t loop_layer;                              // 0xb8&lt;br /&gt;
   uint16_t loop_counts[4];                          // 0xba&lt;br /&gt;
   uint16_t previous_delta_time;                     // 0xc2&lt;br /&gt;
   uint16_t forced_delta_time;                       // 0xc4&lt;br /&gt;
   uint16_t overlay_balance;                         // 0xc6&lt;br /&gt;
   int16_t overlay_balance_slope;                    // 0xc8&lt;br /&gt;
   int16_t pan_slope;                                // 0xca&lt;br /&gt;
   int16_t transpose;                                // 0xcc&lt;br /&gt;
   int16_t tuning;                                   // 0xce&lt;br /&gt;
   uint16_t note;                                    // 0xd0&lt;br /&gt;
   int16_t pitch_slide_amount;                       // 0xd2&lt;br /&gt;
   int16_t previous_transpose;                       // 0xd4&lt;br /&gt;
   int16_t vibrato_lfo_amplitude;                    // 0xd6&lt;br /&gt;
   int16_t tremolo_lfo_amplitude;                    // 0xd8&lt;br /&gt;
   int16_t pan_lfo_amplitude;                        // 0xda&lt;br /&gt;
   AkaoSpuVoiceAttr spu_attr;                        // 0xdc&lt;br /&gt;
 };&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/INSTRx.DAT&amp;diff=5756</id>
		<title>FF7/PSX/Sound/INSTRx.DAT</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/INSTRx.DAT&amp;diff=5756"/>
		<updated>2020-06-20T15:25:40Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: Add hard-coded load offset information for each files.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are two files of such type:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! File&lt;br /&gt;
! Number of Instruments&lt;br /&gt;
! Load Offset&lt;br /&gt;
! Load Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|SOUND/INSTR.DAT&lt;br /&gt;
|style=&amp;quot;text-align:right&amp;quot;| 93&lt;br /&gt;
|0&lt;br /&gt;
|0x2000 (128 * 0x40)&lt;br /&gt;
|Main game sounds&lt;br /&gt;
|-&lt;br /&gt;
|SOUND/INSTR2.DAT&lt;br /&gt;
|style=&amp;quot;text-align:right&amp;quot;| 4&lt;br /&gt;
|0xD40 (53 * 0x40)&lt;br /&gt;
|0x12C0 (75 * 0x40)&lt;br /&gt;
|Voices from ending theme &amp;quot;One Winged Angel&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
These files contain index data for all instruments from INSTRx.ALL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Record format ==&lt;br /&gt;
&lt;br /&gt;
 struct AkaoInstrumentAttr&lt;br /&gt;
 {&lt;br /&gt;
   /* offsets */&lt;br /&gt;
   uint32_t addr;         // offset to attack part of instrument (SPU hardware address)&lt;br /&gt;
   uint32_t loop_addr;    // offset to loop part of instrument (SPU hardware address)&lt;br /&gt;
   /* ADSR Envelope settings */&lt;br /&gt;
   uint8_t ar;            // ADSR: attack rate (0x00-0x7f)&lt;br /&gt;
   uint8_t dr;            // ADSR: decay rate (0x00-0x0f)&lt;br /&gt;
   uint8_t sl;            // ADSR: sustain level (0x00-0x0f)&lt;br /&gt;
   uint8_t sr;            // ADSR: sustain rate (0x00-0x7f)&lt;br /&gt;
   uint8_t rr;            // ADSR: release rate (0x00-0x1f)&lt;br /&gt;
   uint8_t a_mode;        // ADSR: attack mode&lt;br /&gt;
                          //    0x05 - (exponential)&lt;br /&gt;
                          //    0x01 (default) - (linear)&lt;br /&gt;
   uint8_t s_mode;        // ADSR: sustain mode&lt;br /&gt;
                          //    0x01 - (linear, increase)&lt;br /&gt;
                          //    0x05 - (exponential, increase)&lt;br /&gt;
                          //    0x07 - (exponential, decrease)&lt;br /&gt;
                          //    0x03 (default) - (linear, decrease)&lt;br /&gt;
   uint8_t r_mode;        // ADSR: release mode&lt;br /&gt;
                          //    0x07 - (exponential decrease)&lt;br /&gt;
                          //    0x03 (default) - (linear decrease)&lt;br /&gt;
   uint32_t pitch[12];    // predefined pitch set for instrument&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
Each index file takes 4 CDROM sectors, so rest unused data filled with zeroes. Attack and loop offsets isn't real file offsets, it's offsets to instruments in SPU internal memory (all instrument data from INSTRx.ALL files are copied by DMA to SPU memory in one chunk), so to translate INSTR.ALL you need to subtract 0x0ff0 (or you need to subtract 0x38540 for INSTR2.DAT). INSTR.DAT file resides in PSX RAM at address 0x80075f30 and when it's needed to load any instrument or to reset pitch for this instrument this table is used.&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/AKAO_sequence&amp;diff=5755</id>
		<title>FF7/PSX/Sound/AKAO sequence</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/AKAO_sequence&amp;diff=5755"/>
		<updated>2020-06-20T14:41:36Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
AKAO sequence is the most complicated part of the FF7 sound system. (&amp;quot;AKAO&amp;quot; is the signature string, which implies that the sound format has developed by Square Enix sound programmer Minoru Akao.)&lt;br /&gt;
&lt;br /&gt;
AKAO sequence is similar to MIDI sequence - it's custom tracker format for playing sequence sound, well tuned specially for PSX.&lt;br /&gt;
&lt;br /&gt;
The sequence data can be found in all FF7 game modules: Field, Battle, Worldmap and in minigames.&lt;br /&gt;
&lt;br /&gt;
All files with exension *.SND are AKAO.&lt;br /&gt;
&lt;br /&gt;
* '''MINI/ASERI2.SND''' - Battle Arena theme&lt;br /&gt;
* '''MINI/SENSUI.SND''' - used in Submarine minigame&lt;br /&gt;
* '''ENEMY6/OVER2.SND''' - game over sequence&lt;br /&gt;
* '''ENEMY6/FAN2.SND''' - battle win &amp;quot;fanfare&amp;quot; sequence&lt;br /&gt;
* '''MOVIE/OVER2.SND''' - same game over sequence, don't know, why to duplicate data&lt;br /&gt;
&lt;br /&gt;
Other AKAO sequences are hard-wired in other files.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
=== Header (size: 16 bytes) ===&lt;br /&gt;
&lt;br /&gt;
 struct AkaoSeqHeader&lt;br /&gt;
 {&lt;br /&gt;
   static const uint8_t magic[4];  // &amp;quot;AKAO&amp;quot; C-string&lt;br /&gt;
   uint16_t id;                    // song ID, used for playing sequence&lt;br /&gt;
   uint16_t length;                // data length - sizeof(header)&lt;br /&gt;
   uint16_t reverb_type;           // reverb type (range from 0 to 9)&lt;br /&gt;
   struct AkaoTimeStamp timestamp; // creation time&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoTimeStamp&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t year_bcd;               // year (in binary coded decimal)&lt;br /&gt;
   uint8_t month_bcd;              // month (in binary coded decimal, between 0x01 - 0x12)&lt;br /&gt;
   uint8_t day_bcd;                // day (in binary coded decimal, between 0x01 - 0x31)&lt;br /&gt;
   uint8_t hours_bcd;              // hours (in binary coded decimal, between 0x00 - 0x23)&lt;br /&gt;
   uint8_t minutes_bcd;            // minutes (in binary coded decimal, between 0x00 - 0x59)&lt;br /&gt;
   uint8_t seconds_bcd;            // seconds (in binary coded decimal, between 0x00 - 0x59)&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
=== Channel Info (size: 4 bytes + 2 bytes * &amp;lt;channels count&amp;gt;) ===&lt;br /&gt;
 struct AkaoChannelInfo&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t mask;                         // represents bitmask of used channels in this song&lt;br /&gt;
   uint32_t start_offsets[num_channels];  // offsets to channel opcode data&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 int num_channels = 0;&lt;br /&gt;
 while (int bit = 0; ((info.mask &amp;amp; 0xFFFFFF) &amp;amp; (1 &amp;lt;&amp;lt; bit)) != 0; bit++)&lt;br /&gt;
   num_channels++;&lt;br /&gt;
&lt;br /&gt;
First there is 32-bit number (offset 0x10), which represents bitmask of used channels in this song.&lt;br /&gt;
&lt;br /&gt;
After this bitmask, there is &amp;lt;channels count&amp;gt; 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.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Channel Commands [AKAO Opcodes] ===&lt;br /&gt;
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 &amp;quot;opcodes&amp;quot;. Every opcode has its own number of arguments (from no-arguments, to 3 arguments).&lt;br /&gt;
&lt;br /&gt;
=== Drum Instrument Map Table ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
The table consists of a repetition of 5-byte items.&lt;br /&gt;
&lt;br /&gt;
 struct AkaoDrumKeyAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t instrument;   // corresponding to opcode 0xA1&lt;br /&gt;
   uint8_t key;          // note number when playing the drum note&lt;br /&gt;
   uint16_t volume;      // corresponding to opcode 0xA8 (lower 8bit is a fractional part of the volume)&lt;br /&gt;
   uint8_t pan;          // corresponding to opcode 0xAA&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Example (Home-Created AKAO Sequence): ==&lt;br /&gt;
=== Header ===&lt;br /&gt;
'''41 4b 41 4f''' - AKAO string&lt;br /&gt;
&lt;br /&gt;
'''34 12''' - song ID: 0x1234&lt;br /&gt;
&lt;br /&gt;
'''16 00''' - data length 0x16 in hex or 22 in decimal&lt;br /&gt;
&lt;br /&gt;
'''04 00''' - reverb type: 4 (large studio)&lt;br /&gt;
&lt;br /&gt;
'''96 12 18 22 46 28''' - created at 1996-12-18 22:46:28&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Channel Info ===&lt;br /&gt;
'''01 00 00 00''' - this indicates, that used only one channel&lt;br /&gt;
&lt;br /&gt;
'''00 00''' - offset to first channel opcodes: in our example 0x00 means that next to this offset is opcodes for first channel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Channel Commands ===&lt;br /&gt;
'''e8 a8 66''' - sets tempo, parameter 0x66a8&lt;br /&gt;
&lt;br /&gt;
'''ea 00 50''' - sets reverb depth&lt;br /&gt;
&lt;br /&gt;
'''a8 55''' - load sample 0x55 from INSTR.ALL to channel&lt;br /&gt;
&lt;br /&gt;
'''aa 40''' - sets channel volume&lt;br /&gt;
&lt;br /&gt;
'''c2''' - turns on reverb effect&lt;br /&gt;
&lt;br /&gt;
'''a1 0c''' - sets volume pan&lt;br /&gt;
&lt;br /&gt;
'''c8''' - sets loop point&lt;br /&gt;
&lt;br /&gt;
'''66''' - 0x66 % 11 = 3 (3 means to take 3rd number from play length table), 0x66 / 11 = 9 (9 means to take pitch[9] from loaded instrument record index)&lt;br /&gt;
&lt;br /&gt;
'''ca''' - returns to saved loop point with opcode c8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This example plays Chocobo &amp;quot;Whoo-Hoo&amp;quot; (instrument number 0x55) repeatedly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sound Opcode List ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Opcode&lt;br /&gt;
! Summary&lt;br /&gt;
! Length&lt;br /&gt;
! Operands&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0x0099|0x00-0x99]]&lt;br /&gt;
|Note, Tie, Rest&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|The opcode indicates the note key and length. The note will be keyed off 2 ticks before the next note.&lt;br /&gt;
|-&lt;br /&gt;
|0x9A-0x9F&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa0|0xA0]]&lt;br /&gt;
|Finish Channel&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa1|0xA1]]&lt;br /&gt;
|Load Instrument&lt;br /&gt;
|2&lt;br /&gt;
|instrument: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0x0099|0xA2]]&lt;br /&gt;
|Overwrite Next Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length: byte&lt;br /&gt;
|Ignores the regular length (delta-time) of the next note and overwrites it with the specified length.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa8aa|0xA3]]&lt;br /&gt;
|Channel Master Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa4|0xA4]]&lt;br /&gt;
|Pitch Bend Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, semitones: signed byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa5|0xA5]]&lt;br /&gt;
|Set Octave&lt;br /&gt;
|2&lt;br /&gt;
|octave: byte (0-15)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa5|0xA6]]&lt;br /&gt;
|Increase Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa5|0xA7]]&lt;br /&gt;
|Decrease Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa8aa|0xA8]]&lt;br /&gt;
|Channel Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa9|0xA9]]&lt;br /&gt;
|Channel Volume Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa8aa|0xAA]]&lt;br /&gt;
|Channel Pan&lt;br /&gt;
|2&lt;br /&gt;
|pan: byte (0-127)&lt;br /&gt;
|64 is the center.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xab|0xAB]]&lt;br /&gt;
|Channel Pan Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, pan: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xac|0xAC]]&lt;br /&gt;
|Noise Clock Frequency&lt;br /&gt;
|2&lt;br /&gt;
|clock: byte (0x00-0x3f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xAD]]&lt;br /&gt;
|ADSR: Attack Rate&lt;br /&gt;
|2&lt;br /&gt;
|attack_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xAE]]&lt;br /&gt;
|ADSR: Decay Rate&lt;br /&gt;
|2&lt;br /&gt;
|decay_rate: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xAF]]&lt;br /&gt;
|ADSR: Sustain Level&lt;br /&gt;
|2&lt;br /&gt;
|sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xB0]]&lt;br /&gt;
|ADSR: Decay Rate &amp;amp; Sustain Level&lt;br /&gt;
|3&lt;br /&gt;
|decay_rate: byte (0x00-0x0f), sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xB1]]&lt;br /&gt;
|ADSR: Sustain Rate&lt;br /&gt;
|2&lt;br /&gt;
|sustain_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xB2]]&lt;br /&gt;
|ADSR: Release Rate&lt;br /&gt;
|2&lt;br /&gt;
|release_rate: byte (0x00-0x1f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xB3]]&lt;br /&gt;
|ADSR: Reset ADSR&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb4b5|0xB4]]&lt;br /&gt;
|Channel Pitch LFO (Vibrato)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb4b5|0xB5]]&lt;br /&gt;
|Channel Pitch LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|The most significant bit of the &amp;lt;code&amp;gt;depth&amp;lt;/code&amp;gt; determines the amplitude range.&lt;br /&gt;
&lt;br /&gt;
When it is 0, the range is up to about ± 50 cents (amplitude is 15/256 compared with range type 1).&lt;br /&gt;
&lt;br /&gt;
When it is 1, the range is up to about ± 700 cents.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb4b5|0xB6]]&lt;br /&gt;
|Turn Off Channel Pitch LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xB7]]&lt;br /&gt;
|ADSR: Attack Mode&lt;br /&gt;
|2&lt;br /&gt;
|attack_mode: byte (1 or 5)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb8b9|0xB8]]&lt;br /&gt;
|Channel Volume LFO (Tremolo)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb8b9|0xB9]]&lt;br /&gt;
|Channel Volume LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb8b9|0xBA]]&lt;br /&gt;
|Turn Off Channel Volume LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xBB]]&lt;br /&gt;
|ADSR: Sustain Mode&lt;br /&gt;
|2&lt;br /&gt;
|sustain_mode: byte (1, 3, 5 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xbcbd|0xBC]]&lt;br /&gt;
|Channel Pan LFO&lt;br /&gt;
|3&lt;br /&gt;
|rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xbcbd|0xBD]]&lt;br /&gt;
|Channel Pan LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xbcbd|0xBE]]&lt;br /&gt;
|Turn Off Channel Pan LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xbf|0xBF]]&lt;br /&gt;
|ADSR: Release Mode&lt;br /&gt;
|2&lt;br /&gt;
|release_mode: byte (3 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc0c1|0xC0]]&lt;br /&gt;
|Channel Transpose (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc0c1|0xC1]]&lt;br /&gt;
|Channel Transpose (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc2c3|0xC2]]&lt;br /&gt;
|Turn On Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc2c3|0xC3]]&lt;br /&gt;
|Turn Off Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc4c5|0xC4]]&lt;br /&gt;
|Turn On Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc4c5|0xC5]]&lt;br /&gt;
|Turn Off Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc6c7|0xC6]]&lt;br /&gt;
|Turn On Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc6c7|0xC7]]&lt;br /&gt;
|Turn Off Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc8c9|0xC8]]&lt;br /&gt;
|Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Remember the current offset as a loop point and increase the nesting level of the loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc8c9|0xC9]]&lt;br /&gt;
|Return to Loop Point Up to N Times&lt;br /&gt;
|2&lt;br /&gt;
|times: byte&lt;br /&gt;
|On the Nth repeat, this instruction will end the current loop by decrementing the nesting level of the loop. Otherwise, it will increment the loop counter and return to the loop point.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc8c9|0xCA]]&lt;br /&gt;
|Return to Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will increment the loop counter.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xcb|0xCB]]&lt;br /&gt;
|Reset Sound Effects&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Reset sound effects such as noise, frequency modulation, reverb, overlay voice and alternate voice.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xcccd|0xCC]]&lt;br /&gt;
|Turn On Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key on and key off performance of the subsequent notes and update the pitch only.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xcccd|0xCD]]&lt;br /&gt;
|Turn Off Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xcecf|0xCE]]&lt;br /&gt;
|Turn On Noise and Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xcecf|0xCF]]&lt;br /&gt;
|Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd0d1|0xD0]]&lt;br /&gt;
|Turn On Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key off performance of the subsequent notes.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd0d1|0xD1]]&lt;br /&gt;
|Turn Off Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd2d3|0xD2]]&lt;br /&gt;
|Turn On Frequency Modulation and Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd2d3|0xD3]]&lt;br /&gt;
|Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd4d5|0xD4]]&lt;br /&gt;
|Turn On Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Duplicate and use the playback frequency of the previous voice channel.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd4d5|0xD5]]&lt;br /&gt;
|Turn Off Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd6d7|0xD6]]&lt;br /&gt;
|Turn On Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Multiply the playback frequency of the previous voice channel to the output volume. Lower pitch will make the volume smaller.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd6d7|0xD7]]&lt;br /&gt;
|Turn Off Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd8d9|0xD8]]&lt;br /&gt;
|Channel Fine Tuning (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The pitch can be changed in the range of one octave above and below.&lt;br /&gt;
The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is the multiplicand for the playback frequency, not a log-based parameter like cents. For example, when the &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is 127, the pitch will be multiplied by 127/128 (about +1 octave). Negative value ​​will lower the pitch.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd8d9|0xD9]]&lt;br /&gt;
|Channel Fine Tuning (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; will be added to the current tuning amount.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xdadb|0xDA]]&lt;br /&gt;
|Turn On Portamento&lt;br /&gt;
|2&lt;br /&gt;
|speed: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;speed&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xdadb|0xDB]]&lt;br /&gt;
|Turn Off Portamento&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0x0099|0xDC]]&lt;br /&gt;
|Fix Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length_to_add: signed byte&lt;br /&gt;
|Ignore the regular length (delta-time) of subsequent notes and set to the fixed length. The &amp;lt;code&amp;gt;length_to_add&amp;lt;/code&amp;gt; parameter will be added to the current length value. (the initial value is 0)&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xdd|0xDD]]&lt;br /&gt;
|Channel Pitch LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xde|0xDE]]&lt;br /&gt;
|Channel Volume LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xdf|0xDF]]&lt;br /&gt;
|Channel Pan LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa0|0xE0-0xE7]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xe8e9|0xE8]]&lt;br /&gt;
|Tempo&lt;br /&gt;
|3&lt;br /&gt;
|tempo: uint16&lt;br /&gt;
|bpm = tempo / 214.998204 (approximate)&lt;br /&gt;
More strictly, &amp;lt;code&amp;gt;bpm = 60.0 / (48 * (65536.0 / tempo) * (0x44E8 / (33868800.0 / 8)))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that this coefficient is different from other games with PlayStation AKAO.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xe8e9|0xE9]]&lt;br /&gt;
|Tempo Slide&lt;br /&gt;
|4&lt;br /&gt;
|length: byte, tempo: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xeaeb|0xEA]]&lt;br /&gt;
|Reverb Depth&lt;br /&gt;
|3&lt;br /&gt;
|depth: uint16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xeaeb|0xEB]]&lt;br /&gt;
|Reverb Depth Slide&lt;br /&gt;
|4&lt;br /&gt;
|length: byte, depth: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xeced|0xEC]]&lt;br /&gt;
|Turn On Drum Mode&lt;br /&gt;
|3&lt;br /&gt;
|drum_map_offset: signed int16&lt;br /&gt;
|The &amp;lt;code&amp;gt;drum_map_offset&amp;lt;/code&amp;gt; is a relative offset pointing to the drum instrument map table, which determines the instrument for each keys.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xeced|0xED]]&lt;br /&gt;
|Turn Off Drum Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xee|0xEE]]&lt;br /&gt;
|Unconditional Jump&lt;br /&gt;
|3&lt;br /&gt;
|destination_offset: signed int16&lt;br /&gt;
|This instruction can be used to make an infinite loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xef|0xEF]]&lt;br /&gt;
|CPU-Conditional Jump&lt;br /&gt;
|4&lt;br /&gt;
|condition: byte, destination_offset: signed int16&lt;br /&gt;
|Jump if the condition variable matches &amp;lt;code&amp;gt;condition&amp;lt;/code&amp;gt;. The value of the condition variable can be set from the game program.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf0f1|0xF0]]&lt;br /&gt;
|Jump on the Nth Repeat&lt;br /&gt;
|4&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf0f1|0xF1]]&lt;br /&gt;
|Break the Loop on the Nth Repeat&lt;br /&gt;
|4&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|Unlike 0xF0, this instruction will end the current loop by decrementing the nesting level of the loop.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa1|0xF2]]&lt;br /&gt;
|Load Instrument (No Attack Sample)&lt;br /&gt;
|2&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|Unlike 0xA1, the sample before the loop point is replaced by a short, silence sample.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf3|0xF3]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|There is no actual use in music.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf4f5|0xF4]]&lt;br /&gt;
|Turn On Overlay Voice&lt;br /&gt;
|3&lt;br /&gt;
|instrument: byte, instrument2: byte&lt;br /&gt;
|Play the same melody by different instruments on two voice channels. A free voice channel is required to work. Note that the two channels share the playback rate, and the pitch is not calculated for each instruments.&lt;br /&gt;
Used in the song &amp;quot;Anxious Heart&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf4f5|0xF5]]&lt;br /&gt;
|Turn Off Overlay Voice&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf4f5|0xF6]]&lt;br /&gt;
|Overlay Volume Balance&lt;br /&gt;
|2&lt;br /&gt;
|balance: byte (0-127)&lt;br /&gt;
|When the balance is 0, the volume of the primary voice will be 100% (127/128) of original and that of the secondary voice will be 0%. 127 is the opposite.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf4f5|0xF7]]&lt;br /&gt;
|Overlay Volume Balance Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, balance: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf8f9|0xF8]]&lt;br /&gt;
|Turn On Alternate Voice&lt;br /&gt;
|2&lt;br /&gt;
|release_rate: byte (0x00-0x1f)&lt;br /&gt;
|This instruction allows subsequent notes to be played on two alternating channels. At the same time, the ADSR release rate will be set to the specified value. A free voice channel is required to work. &lt;br /&gt;
Check &amp;quot;Opening - Bombing Mission&amp;quot;, &amp;quot;Tifa's Theme&amp;quot; and &amp;quot;Fortress of the Condor&amp;quot; for actual usage.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf8f9|0xF9]]&lt;br /&gt;
|Turn Off Alternate Voice&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa0|0xFA-0xFC]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xfd|0xFD]]&lt;br /&gt;
|Time Signature&lt;br /&gt;
|3&lt;br /&gt;
|ticks_per_beat: byte, beats_per_measure: byte&lt;br /&gt;
|Note that two parameters can be 0. This pattern is used for initialization.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xfe|0xFE]]&lt;br /&gt;
|Measure Number&lt;br /&gt;
|2&lt;br /&gt;
|measure: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa0|0xFF]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Code_Map&amp;diff=5754</id>
		<title>FF7/PSX/Sound/Code Map</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Code_Map&amp;diff=5754"/>
		<updated>2020-06-20T14:40:17Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Code Map =&lt;br /&gt;
&lt;br /&gt;
Introduces functions, variables and data related to sound, contained in SCUS_941.63 (game program of US version). Note that all symbol names below are for convenience only.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x800293D0&lt;br /&gt;
|void _AkaoSpuTransferCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800293F4&lt;br /&gt;
|void _AkaoSpuSetTransferCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029424&lt;br /&gt;
|unsigned int _AkaoTransferSamples(const unsigned char *addr, unsigned int size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800294A4&lt;br /&gt;
|void _AkaoWaitForSpuTransfer(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800294BC&lt;br /&gt;
|void _AkaoReset(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800297A4&lt;br /&gt;
|void AkaoLoadInstrumentSet(const sturct AkaoSampleSet *sampleSet, const struct AkaoInstrumentAttr *instrumentSet)&lt;br /&gt;
|Load standard instrument set&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR.DAT&lt;br /&gt;
&lt;br /&gt;
This function is called transparently from 0x8002988C.&lt;br /&gt;
|-&lt;br /&gt;
|0x80029818&lt;br /&gt;
|void AkaoLoadInstrumentSet2(const sturct AkaoSampleSet *sampleSet, const struct AkaoInstrumentAttr *instrumentSet)&lt;br /&gt;
|Load additional instrument set&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR2.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR2.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x8002988C&lt;br /&gt;
|void AkaoInitialize(const sturct AkaoSampleSet *sampleSet, const struct AkaoInstrumentAttr *instrumentSet)&lt;br /&gt;
|Initialize sound driver and load initial instruments&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x800299C8&lt;br /&gt;
|void AkaoDeinitialize(void)&lt;br /&gt;
|Deinitialize sound driver&lt;br /&gt;
|-&lt;br /&gt;
|0x80029AF0&lt;br /&gt;
|void AkaoSetReverbMode(int mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029B78&lt;br /&gt;
|void _AkaoTransferSeqBody(const unsigned char *data, int size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029C48&lt;br /&gt;
|void _AkaoLoadTracks(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002DA30&lt;br /&gt;
|void AkaoNewMessage(struct AkaoMessage **ppMessage)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002DA7C&lt;br /&gt;
|int AkaoPostMessage(void)&lt;br /&gt;
|Post a new command message to the queue (with some wrapped processing)&lt;br /&gt;
&lt;br /&gt;
The message data comes from a global variable at 0x8009A000.&lt;br /&gt;
&lt;br /&gt;
Return value depends on the content of the message data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Opcode 0x10'''&lt;br /&gt;
&lt;br /&gt;
Load and start playing new [[FF7/PSX/Sound/AKAO sequence|AKAO sequence]]&lt;br /&gt;
&lt;br /&gt;
Returns: 0 for success, 1 for already loaded, and -1 for invalid signature&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Opcode 0x92'''&lt;br /&gt;
&lt;br /&gt;
Set value to the condition variable used by Opcode 0xEF.&lt;br /&gt;
|-&lt;br /&gt;
|0x8002E1A8&lt;br /&gt;
|void _AkaoDispatchMessages(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002E23C&lt;br /&gt;
|void _AkaoWriteSpuRegisters(int voiceNum, struct AkaoSpuVoiceAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002E478&lt;br /&gt;
|void _AkaoDspOnTick(struct AkaoPlayerTrack *track, struct AkaoPlayer *player, int voiceMask)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002ED34&lt;br /&gt;
|void _AkaoCalculateVolumeAndPitch(struct AkaoPlayerTrack *track, int voiceMask, int voiceNum)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002F24C&lt;br /&gt;
|void _AkaoCalculateVolumeAndPitch2(struct AkaoPlayerTrack *track, int voiceMask)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002F738&lt;br /&gt;
|void _AkaoDspOverlayVoice(struct AkaoPlayerTrack *track, int unknownVoiceMask, int voiceNum)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002F848&lt;br /&gt;
|void _AkaoDspMain(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002FF4C&lt;br /&gt;
|void _AkaoSpuNoiseVoice(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030038&lt;br /&gt;
|void _AkaoSpuReverbVoice(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030148&lt;br /&gt;
|void _AkaoSpuPitchLFOVoice(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030234&lt;br /&gt;
|int _AkaoTimerCallback(void)&lt;br /&gt;
|Sound callback event that is periodically triggered by root counter 2&lt;br /&gt;
|-&lt;br /&gt;
|0x800308D4&lt;br /&gt;
|void _AkaoMain(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030E7C&lt;br /&gt;
|void _AkaoDispatchVoice(struct AkaoPlayerTrack *track, struct AkaoPlayer *player, int voiceMask)&lt;br /&gt;
|Dispatch voice opcodes until the next note or end of track&lt;br /&gt;
|-&lt;br /&gt;
|0x80031820&lt;br /&gt;
|void AkaoSetInstrument(struct AkaoPlayerTrack *track, unsigned short progNumber)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800318BC&lt;br /&gt;
|int _AkaoReadNextNote(struct AkaoPlayerTrack *track)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80031A70&lt;br /&gt;
|int _AkaoFindNextEndPoint(struct AkaoPlayerTrack *track)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80049548&lt;br /&gt;
|void (* const MESSAGE_HANDLERS[256])(struct AkaoMessage *)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80049948&lt;br /&gt;
|const unsigned char VOICE_OPCODE_LENGTHS[0x60]&lt;br /&gt;
|Length table for voice opcodes 0xa0-0xff&lt;br /&gt;
&lt;br /&gt;
0 for end of track and branches&lt;br /&gt;
|-&lt;br /&gt;
|0x80049AA8&lt;br /&gt;
|void (* const VOICE_OPCODES[0x60])(struct AkaoPlayerTrack *, struct AkaoPlayer *, int)&lt;br /&gt;
|Address table for voice opcodes 0xa0-0xff&lt;br /&gt;
|-&lt;br /&gt;
|0x80049C28&lt;br /&gt;
|const unsigned short DELTA_TIME_TABLE[11];&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80049C44&lt;br /&gt;
|const unsigned short VOLUME_TABLE_L[128]&lt;br /&gt;
|See [[FF7/PSX/Sound/Opcodes/0xa8aa|Opcode 0xAA]] for volume balance calculation&lt;br /&gt;
|-&lt;br /&gt;
|0x80049E44&lt;br /&gt;
|const unsigned short VOLUME_TABLE_R[128]&lt;br /&gt;
|See [[FF7/PSX/Sound/Opcodes/0xa8aa|Opcode 0xAA]] for volume balance calculation&lt;br /&gt;
|-&lt;br /&gt;
|0x8004A5CC&lt;br /&gt;
|const short *LFO_FORMS[16]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8004A60C&lt;br /&gt;
|const unsigned char EMPTY_ADPCM[32]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80063010&lt;br /&gt;
|int g_AkaoNumQueuedMessages&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80081DC8&lt;br /&gt;
|AkaoMessage g_AkaoMessageQueue[]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80083580&lt;br /&gt;
|unsigned char g_AkaoSeqData[]&lt;br /&gt;
|RAM area to load AKAO sequence data&lt;br /&gt;
|-&lt;br /&gt;
|0x8009A000&lt;br /&gt;
|AkaoMessage g_AkaoMessage&lt;br /&gt;
|Message data to be posted. Processed by the function 0x8002DA7C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Runtime Library Functions ==&lt;br /&gt;
&lt;br /&gt;
=== LIBSPU ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x80036298&lt;br /&gt;
|void SpuInit(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80036FFC&lt;br /&gt;
|long SpuInitMalloc(long num, char *top)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800373AC&lt;br /&gt;
|long SpuMallocWithStartAddr(unsigned long addr, long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037964&lt;br /&gt;
|unsigned long SpuSetNoiseVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037B90&lt;br /&gt;
|long SpuSetNoiseClock(long n_clock)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037BE0&lt;br /&gt;
|unsigned long SpuRead(unsigned char *addr, unsigned long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037C40&lt;br /&gt;
|long SpuSetReverb(long on_off)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037D90&lt;br /&gt;
|long SpuGetReverb(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037E1C&lt;br /&gt;
|long SpuSetReverbModeParam(SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800387FC&lt;br /&gt;
|void SpuGetReverbModeParam (SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003884C&lt;br /&gt;
|long SpuSetReverbDepth(SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800388C4&lt;br /&gt;
|unsigned long SpuSetReverbVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800388E8&lt;br /&gt;
|long SpuClearReverbWorkArea(long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038A84&lt;br /&gt;
|long SpuSetIRQ(long on_off)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038BC4&lt;br /&gt;
|unsigned long SpuSetIRQAddr(unsigned long addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038C04&lt;br /&gt;
|SpuIRQCallbackProc SpuSetIRQCallback(SpuIRQCallbackProc func)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038C6C&lt;br /&gt;
|void SpuSetKey(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038F04&lt;br /&gt;
|unsigned long SpuWrite(unsigned char *addr, unsigned long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038F64&lt;br /&gt;
|unsigned long SpuSetTransferStartAddr(unsigned long addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038FB8&lt;br /&gt;
|long SpuSetTransferMode(long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038FEC&lt;br /&gt;
|SpuTransferCallbackProc SpuSetTransferCallback(SpuTransferCallbackProc func)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039010&lt;br /&gt;
|unsigned long SpuSetPitchLFOVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039034&lt;br /&gt;
|void SpuSetCommonAttr(SpuCommonAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800393C8&lt;br /&gt;
|void SpuSetVoiceVolume(int voiceNum, short volL, short volR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039450&lt;br /&gt;
|void SpuSetVoiceVolumeAttr(int voiceNum, short volL, short volR, short volModeL, short volModeR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800395C8&lt;br /&gt;
|void SpuSetVoicePitch(int voiceNum, unsigned short pitch)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039644&lt;br /&gt;
|void SpuSetVoiceStartAddr(int voiceNum, unsigned long startAddr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800396C0&lt;br /&gt;
|void SpuSetVoiceLoopStartAddr(int voiceNum, unsigned long lsa)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003973C&lt;br /&gt;
|void SpuSetVoiceDR(int voiceNum, unsigned short DR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800397C8&lt;br /&gt;
|void SpuSetVoiceSL(int voiceNum, unsigned short SL)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039850&lt;br /&gt;
|void SpuSetVoiceARAttr(int voiceNum, unsigned short AR, long ARmode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800398EC&lt;br /&gt;
|void SpuSetVoiceSRAttr(int voiceNum, unsigned short SR, long SRmode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800399D0&lt;br /&gt;
|void SpuSetVoiceRRAttr(int voiceNum, unsigned short RR, long RRmode)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LIBETC ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D0C0&lt;br /&gt;
|int ResetCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D150&lt;br /&gt;
|int VSyncCallback(void (*func)(void))&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D1B4&lt;br /&gt;
|int StopCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D214&lt;br /&gt;
|int CheckCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LIBAPI ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x800429F0&lt;br /&gt;
|void DeliverEvent(unsigned long ev1, unsigned long ev2)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A00&lt;br /&gt;
|long OpenEvent(unsigned long desc, long spec, long mode, long (*func)())&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A10&lt;br /&gt;
|long CloseEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A20&lt;br /&gt;
|long WaitEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A40&lt;br /&gt;
|long EnableEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A50&lt;br /&gt;
|long DisableEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042BC0&lt;br /&gt;
|long SetRCnt(unsigned long spec, unsigned short target, long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042C60&lt;br /&gt;
|long GetRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042C98&lt;br /&gt;
|long StartRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042CCC&lt;br /&gt;
|long StopRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Structures =&lt;br /&gt;
&lt;br /&gt;
[[FF7/PSX/Sound/INSTRx.DAT|struct AkaoInstrumentAttr]]&lt;br /&gt;
&lt;br /&gt;
[[FF7/PSX/Sound/INSTRx.ALL|struct AkaoSampleSet]]&lt;br /&gt;
&lt;br /&gt;
[[FF7/PSX/Sound/AKAO sequence|struct AkaoSeqHeader, struct AkaoDrumKeyAttr]]&lt;br /&gt;
&lt;br /&gt;
 struct AkaoMessage // 36 bytes long&lt;br /&gt;
 {&lt;br /&gt;
   uint16_t opcode;&lt;br /&gt;
   uint16_t reserved;&lt;br /&gt;
   uint32_t data[8];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoSpuVoiceAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t voice;          // 0x00: voice number&lt;br /&gt;
   uint32_t update_flags;   // 0x04: bitset that indicates what SPU registers need to be updated&lt;br /&gt;
   uint32_t addr;           // 0x08: waveform data start address (SPU address)&lt;br /&gt;
   uint32_t loop_addr;      // 0x0c: loop start address (SPU address)&lt;br /&gt;
   uint32_t a_mode;         // 0x10: ADSR: attack mode&lt;br /&gt;
   uint32_t s_mode;         // 0x14: ADSR: sustain mode&lt;br /&gt;
   uint32_t r_mode          // 0x18: ADSR: release mode&lt;br /&gt;
   uint16_t pitch;          // 0x1c: pitch&lt;br /&gt;
   uint16_t ar;             // 0x1e: ADSR: attack rate&lt;br /&gt;
   uint16_t dr;             // 0x20: ADSR: decay rate&lt;br /&gt;
   uint16_t sl;             // 0x22: ADSR: sustain level&lt;br /&gt;
   uint16_t sr;             // 0x24: ADSR: sustain rate&lt;br /&gt;
   uint16_t rr;             // 0x26: ADSR: release rate&lt;br /&gt;
   SpuVolume volume;        // 0x28: volume (left and right)&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoPlayer // the music player instance exists at 0x8009A104&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t stereo_mode;                 // 0x00: stereo mode (1: stereo, 4: surround, otherwise: mono)&lt;br /&gt;
   uint32_t active_voices;               // 0x04: bitset that indicates the voices currently in use&lt;br /&gt;
   uint32_t key_on_voices;               // 0x08: bitset that indicates the voices to key on&lt;br /&gt;
   uint32_t keyed_voices;                // 0x0c: bitset that indicates the voices currently keyed on&lt;br /&gt;
   uint32_t key_off_voices;              // 0x10: bitset that indicates the voices to key off&lt;br /&gt;
   uint32_t saved_active_voices;         // 0x14: unknown voice bitset&lt;br /&gt;
   uint32_t tempo;                       // 0x18: tempo (Q16 fixed-point number)&lt;br /&gt;
   int32_t tempo_slope;                  // 0x1c: slope of tempo slider (Q16 fixed-point number)&lt;br /&gt;
   uint32_t time_counter;                // 0x20: time counter (0x10000 = 1 tick)&lt;br /&gt;
   uint32_t overlay_voices;              // 0x24: bitset that indicates the sub-voices used for overlay (opcode 0xF4)&lt;br /&gt;
   uint32_t alternate_voices;            // 0x28: bitset that indicates the sub-voices used for alternate voice (opcode 0xF8)&lt;br /&gt;
   uint32_t noise_voices;                // 0x2c: bitset that indicates the voices with noise mode enabled&lt;br /&gt;
   uint32_t reverb_voices;               // 0x30: bitset that indicates the voices with reverb enabled&lt;br /&gt;
   uint32_t pitch_lfo_voices;            // 0x34: bitset that indicates the voices with pitch LFO (frequency modulation) mode enabled&lt;br /&gt;
   uint32_t spucnt;                      // 0x38: SPUCNT shadow&lt;br /&gt;
   uint32_t reverb_type;                 // 0x3c: reverb type&lt;br /&gt;
   uint32_t reverb_depth;                // 0x40: reverb depth (Q16 fixed-point number)&lt;br /&gt;
   int32_t reverb_depth_slope;           // 0x44: slope of reverb depth slider (Q16 fixed-point number)&lt;br /&gt;
   uint16_t tempo_slide_length;          // 0x48: tempo slide length&lt;br /&gt;
   uint16_t song_id;                     // 0x4a: current song id&lt;br /&gt;
   uint16_t condition_ack;               // 0x4c: the last matched condition value (opcode 0xEF)&lt;br /&gt;
   uint16_t condition;                   // 0x4e: condition variable for dynamic branching according to game status (opcode 0xEF)&lt;br /&gt;
   uint16_t reverb_depth_slide_length;   // 0x50: length of reverb depth slide&lt;br /&gt;
   uint16_t noise_clock;                 // 0x52: noise clock frequency&lt;br /&gt;
   uint16_t field_54;                    // 0x54: unknown (can be altered by opcode 0xF3)&lt;br /&gt;
   uint16_t beats_per_measure;           // 0x56: beats per measure&lt;br /&gt;
   uint16_t beat;                        // 0x58: current beat&lt;br /&gt;
   uint16_t ticks_per_beat;              // 0x5a: ticks per beat&lt;br /&gt;
   uint16_t tick;                        // 0x5c: current ticks per beat&lt;br /&gt;
   uint16_t measure;                     // 0x5e: current measure&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoPlayerTrack // the music player track instances exist at 0x80096608 + (N * 0x108)&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t *addr;                                    // 0x00&lt;br /&gt;
   uint8_t *loop_addrs[4];                           // 0x04&lt;br /&gt;
   AkaoDrumKeyAttr *drum_addr;                       // 0x14&lt;br /&gt;
   int16_t *vibrato_lfo_addr;                        // 0x18&lt;br /&gt;
   int16_t *tremolo_lfo_addr;                        // 0x1c&lt;br /&gt;
   int16_t *pan_lfo_addr;                            // 0x20&lt;br /&gt;
   uint32_t overlay_voice_num;                       // 0x24&lt;br /&gt;
   uint32_t alternate_voice_num;                     // 0x28&lt;br /&gt;
   uint32_t master_volume;                           // 0x2c&lt;br /&gt;
   uint32_t pitch_of_note;                           // 0x30&lt;br /&gt;
   int32_t pitch_bend_slide_amplitude;               // 0x34&lt;br /&gt;
   uint16_t voice_effect_flags;                      // 0x38&lt;br /&gt;
   uint16_t field_3A;                                // 0x3a&lt;br /&gt;
   uint16_t field_3C;                                // 0x3c&lt;br /&gt;
   uint16_t field_3E;                                // 0x3e&lt;br /&gt;
   uint32_t field_40;                                // 0x40&lt;br /&gt;
   uint32_t volume;                                  // 0x44&lt;br /&gt;
   int32_t volume_slope;                             // 0x48&lt;br /&gt;
   int32_t pitch_bend_slope;                         // 0x4c&lt;br /&gt;
   uint16_t field_50;                                // 0x50&lt;br /&gt;
   uint16_t field_52;                                // 0x52&lt;br /&gt;
   uint16_t field_54;                                // 0x54&lt;br /&gt;
   uint8_t delta_time_counter;                       // 0x56&lt;br /&gt;
   uint8_t gate_time_counter;                        // 0x57&lt;br /&gt;
   uint16_t instrument;                              // 0x58&lt;br /&gt;
   uint16_t field_5A;                                // 0x5a&lt;br /&gt;
   uint16_t volume_slide_length_counter;             // 0x5c&lt;br /&gt;
   uint16_t overlay_balance_slide_length_counter;    // 0x5e&lt;br /&gt;
   uint16_t pan;                                     // 0x60&lt;br /&gt;
   uint16_t pan_slide_length;                        // 0x62&lt;br /&gt;
   int16_t pitch_slide_length_counter;               // 0x64&lt;br /&gt;
   uint16_t octave;                                  // 0x66&lt;br /&gt;
   uint16_t pitch_slide_length;                      // 0x68&lt;br /&gt;
   uint16_t previous_note_number;                    // 0x6a&lt;br /&gt;
   uint16_t portamento_speed;                        // 0x6c&lt;br /&gt;
   uint16_t legato_flags;                            // 0x6e&lt;br /&gt;
   uint16_t field_70;                                // 0x70&lt;br /&gt;
   uint16_t vibrato_lfo_delay;                       // 0x72&lt;br /&gt;
   uint16_t vibrato_delay_counter;                   // 0x74&lt;br /&gt;
   uint16_t vibrato_rate;                            // 0x76&lt;br /&gt;
   uint16_t vibrato_rate_counter;                    // 0x78&lt;br /&gt;
   uint16_t vibrato_form;                            // 0x7a&lt;br /&gt;
   uint16_t vibrato_max_amplitude;                   // 0x7c&lt;br /&gt;
   uint16_t vibrato_depth;                           // 0x7e&lt;br /&gt;
   uint16_t vibrato_depth_slide_length_counter;      // 0x80&lt;br /&gt;
   int16_t vibrato_depth_slope;                      // 0x82&lt;br /&gt;
   uint16_t field_84;                                // 0x84&lt;br /&gt;
   uint16_t tremolo_delay;                           // 0x86&lt;br /&gt;
   uint16_t tremolo_delay_counter;                   // 0x88&lt;br /&gt;
   uint16_t tremolo_rate;                            // 0x8a&lt;br /&gt;
   uint16_t tremolo_rate_counter;                    // 0x8c&lt;br /&gt;
   uint16_t tremolo_form;                            // 0x8e&lt;br /&gt;
   uint16_t tremolo_depth;                           // 0x90&lt;br /&gt;
   uint16_t tremolo_depth_slide_length_counter;      // 0x92&lt;br /&gt;
   int16_t tremolo_depth_slope;                      // 0x94&lt;br /&gt;
   uint16_t field_96;                                // 0x96&lt;br /&gt;
   uint16_t pan_lfo_rate;                            // 0x98&lt;br /&gt;
   uint16_t pan_lfo_rate_counter;                    // 0x9a&lt;br /&gt;
   uint16_t pan_lfo_form;                            // 0x9c&lt;br /&gt;
   uint16_t pan_lfo_depth;                           // 0x9e&lt;br /&gt;
   uint16_t pan_lfo_depth_slide_length_counter;      // 0xa0&lt;br /&gt;
   int16_t pan_lfo_slope;                            // 0xa2&lt;br /&gt;
   uint16_t noise_on_off_delay_counter;              // 0xa4&lt;br /&gt;
   uint16_t pitchmod_on_off_delay_counter;           // 0xa6&lt;br /&gt;
   uint8_t field_A8[16];                             // 0xa8&lt;br /&gt;
   uint16_t loop_layer;                              // 0xb8&lt;br /&gt;
   uint16_t loop_counts[4];                          // 0xba&lt;br /&gt;
   uint16_t previous_delta_time;                     // 0xc2&lt;br /&gt;
   uint16_t forced_delta_time;                       // 0xc4&lt;br /&gt;
   uint16_t overlay_balance;                         // 0xc6&lt;br /&gt;
   int16_t overlay_balance_slope;                    // 0xc8&lt;br /&gt;
   int16_t pan_slope;                                // 0xca&lt;br /&gt;
   int16_t transpose;                                // 0xcc&lt;br /&gt;
   int16_t tuning;                                   // 0xce&lt;br /&gt;
   uint16_t note;                                    // 0xd0&lt;br /&gt;
   int16_t pitch_slide_amount;                       // 0xd2&lt;br /&gt;
   int16_t previous_transpose;                       // 0xd4&lt;br /&gt;
   int16_t vibrato_lfo_amplitude;                    // 0xd6&lt;br /&gt;
   int16_t tremolo_lfo_amplitude;                    // 0xd8&lt;br /&gt;
   int16_t pan_lfo_amplitude;                        // 0xda&lt;br /&gt;
   AkaoSpuVoiceAttr spu_attr;                        // 0xdc&lt;br /&gt;
 };&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Code_Map&amp;diff=5753</id>
		<title>FF7/PSX/Sound/Code Map</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Code_Map&amp;diff=5753"/>
		<updated>2020-06-20T14:39:18Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: Add comment to AkaoPlayer.field_54&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Code Map =&lt;br /&gt;
&lt;br /&gt;
Introduces functions, variables and data related to sound, contained in SCUS_941.63 (game program of US version). Note that all symbol names below are for convenience only.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x800293D0&lt;br /&gt;
|void _AkaoSpuTransferCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800293F4&lt;br /&gt;
|void _AkaoSpuSetTransferCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029424&lt;br /&gt;
|unsigned int _AkaoTransferSamples(const unsigned char *addr, unsigned int size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800294A4&lt;br /&gt;
|void _AkaoWaitForSpuTransfer(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800294BC&lt;br /&gt;
|void _AkaoReset(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800297A4&lt;br /&gt;
|void AkaoLoadInstrumentSet(const sturct AkaoSampleSet *sampleSet, const struct AkaoInstrumentAttr *instrumentSet)&lt;br /&gt;
|Load standard instrument set&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR.DAT&lt;br /&gt;
&lt;br /&gt;
This function is called transparently from 0x8002988C.&lt;br /&gt;
|-&lt;br /&gt;
|0x80029818&lt;br /&gt;
|void AkaoLoadInstrumentSet2(const sturct AkaoSampleSet *sampleSet, const struct AkaoInstrumentAttr *instrumentSet)&lt;br /&gt;
|Load additional instrument set&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR2.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR2.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x8002988C&lt;br /&gt;
|void AkaoInitialize(const sturct AkaoSampleSet *sampleSet, const struct AkaoInstrumentAttr *instrumentSet)&lt;br /&gt;
|Initialize sound driver and load initial instruments&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x800299C8&lt;br /&gt;
|void AkaoDeinitialize(void)&lt;br /&gt;
|Deinitialize sound driver&lt;br /&gt;
|-&lt;br /&gt;
|0x80029AF0&lt;br /&gt;
|void AkaoSetReverbMode(int mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029B78&lt;br /&gt;
|void _AkaoTransferSeqBody(const unsigned char *data, int size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029C48&lt;br /&gt;
|void _AkaoLoadTracks(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002DA30&lt;br /&gt;
|void AkaoNewMessage(struct AkaoMessage **ppMessage)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002DA7C&lt;br /&gt;
|int AkaoPostMessage(void)&lt;br /&gt;
|Post a new command message to the queue (with some wrapped processing)&lt;br /&gt;
&lt;br /&gt;
The message data comes from a global variable at 0x8009A000.&lt;br /&gt;
&lt;br /&gt;
Return value depends on the content of the message data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Opcode 0x10'''&lt;br /&gt;
&lt;br /&gt;
Load and start playing new [[FF7/PSX/Sound/AKAO sequence|AKAO sequence]]&lt;br /&gt;
&lt;br /&gt;
Returns: 0 for success, 1 for already loaded, and -1 for invalid signature&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Opcode 0x92'''&lt;br /&gt;
&lt;br /&gt;
Set value to the condition variable used by Opcode 0xEF.&lt;br /&gt;
|-&lt;br /&gt;
|0x8002E1A8&lt;br /&gt;
|void _AkaoDispatchMessages(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002E23C&lt;br /&gt;
|void _AkaoWriteSpuRegisters(int voiceNum, struct AkaoSpuVoiceAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002E478&lt;br /&gt;
|void _AkaoDspOnTick(struct AkaoPlayerTrack *track, struct AkaoPlayer *player, int voiceMask)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002ED34&lt;br /&gt;
|void _AkaoCalculateVolumeAndPitch(struct AkaoPlayerTrack *track, int voiceMask, int voiceNum)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002F24C&lt;br /&gt;
|void _AkaoCalculateVolumeAndPitch2(struct AkaoPlayerTrack *track, int voiceMask)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002F738&lt;br /&gt;
|void _AkaoDspOverlayVoice(struct AkaoPlayerTrack *track, int unknownVoiceMask, int voiceNum)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002F848&lt;br /&gt;
|void _AkaoDspMain(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002FF4C&lt;br /&gt;
|void _AkaoSpuNoiseVoice(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030038&lt;br /&gt;
|void _AkaoSpuReverbVoice(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030148&lt;br /&gt;
|void _AkaoSpuPitchLFOVoice(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030234&lt;br /&gt;
|int _AkaoTimerCallback(void)&lt;br /&gt;
|Sound callback event that is periodically triggered by root counter 2&lt;br /&gt;
|-&lt;br /&gt;
|0x800308D4&lt;br /&gt;
|void _AkaoMain(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030E7C&lt;br /&gt;
|void _AkaoDispatchVoice(struct AkaoPlayerTrack *track, struct AkaoPlayer *player, int voiceMask)&lt;br /&gt;
|Dispatch voice opcodes until the next note or end of track&lt;br /&gt;
|-&lt;br /&gt;
|0x80031820&lt;br /&gt;
|void AkaoSetInstrument(struct AkaoPlayerTrack *track, unsigned short progNumber)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800318BC&lt;br /&gt;
|int _AkaoReadNextNote(struct AkaoPlayerTrack *track)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80031A70&lt;br /&gt;
|int _AkaoFindNextEndPoint(struct AkaoPlayerTrack *track)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80049548&lt;br /&gt;
|void (* const MESSAGE_HANDLERS[256])(struct AkaoMessage *)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80049948&lt;br /&gt;
|const unsigned char VOICE_OPCODE_LENGTHS[0x60]&lt;br /&gt;
|Length table for voice opcodes 0xa0-0xff&lt;br /&gt;
&lt;br /&gt;
0 for end of track and branches&lt;br /&gt;
|-&lt;br /&gt;
|0x80049AA8&lt;br /&gt;
|void (* const VOICE_OPCODES[0x60])(struct AkaoPlayerTrack *, struct AkaoPlayer *, int)&lt;br /&gt;
|Address table for voice opcodes 0xa0-0xff&lt;br /&gt;
|-&lt;br /&gt;
|0x80049C28&lt;br /&gt;
|const unsigned short DELTA_TIME_TABLE[11];&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80049C44&lt;br /&gt;
|const unsigned short VOLUME_TABLE_L[128]&lt;br /&gt;
|See [[FF7/PSX/Sound/Opcodes/0xa8aa|Opcode 0xAA]] for volume balance calculation&lt;br /&gt;
|-&lt;br /&gt;
|0x80049E44&lt;br /&gt;
|const unsigned short VOLUME_TABLE_R[128]&lt;br /&gt;
|See [[FF7/PSX/Sound/Opcodes/0xa8aa|Opcode 0xAA]] for volume balance calculation&lt;br /&gt;
|-&lt;br /&gt;
|0x8004A5CC&lt;br /&gt;
|const short *LFO_FORMS[16]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8004A60C&lt;br /&gt;
|const unsigned char EMPTY_ADPCM[32]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80063010&lt;br /&gt;
|int g_AkaoNumQueuedMessages&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80081DC8&lt;br /&gt;
|AkaoMessage g_AkaoMessageQueue[]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80083580&lt;br /&gt;
|unsigned char g_AkaoSeqData[]&lt;br /&gt;
|RAM area to load AKAO sequence data&lt;br /&gt;
|-&lt;br /&gt;
|0x8009A000&lt;br /&gt;
|AkaoMessage g_AkaoMessage&lt;br /&gt;
|Message data to be posted. Processed by the function 0x8002DA7C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Runtime Library Functions ==&lt;br /&gt;
&lt;br /&gt;
=== LIBSPU ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x80036298&lt;br /&gt;
|void SpuInit(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80036FFC&lt;br /&gt;
|long SpuInitMalloc(long num, char *top)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800373AC&lt;br /&gt;
|long SpuMallocWithStartAddr(unsigned long addr, long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037964&lt;br /&gt;
|unsigned long SpuSetNoiseVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037B90&lt;br /&gt;
|long SpuSetNoiseClock(long n_clock)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037BE0&lt;br /&gt;
|unsigned long SpuRead(unsigned char *addr, unsigned long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037C40&lt;br /&gt;
|long SpuSetReverb(long on_off)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037D90&lt;br /&gt;
|long SpuGetReverb(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037E1C&lt;br /&gt;
|long SpuSetReverbModeParam(SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800387FC&lt;br /&gt;
|void SpuGetReverbModeParam (SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003884C&lt;br /&gt;
|long SpuSetReverbDepth(SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800388C4&lt;br /&gt;
|unsigned long SpuSetReverbVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800388E8&lt;br /&gt;
|long SpuClearReverbWorkArea(long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038A84&lt;br /&gt;
|long SpuSetIRQ(long on_off)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038BC4&lt;br /&gt;
|unsigned long SpuSetIRQAddr(unsigned long addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038C04&lt;br /&gt;
|SpuIRQCallbackProc SpuSetIRQCallback(SpuIRQCallbackProc func)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038C6C&lt;br /&gt;
|void SpuSetKey(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038F04&lt;br /&gt;
|unsigned long SpuWrite(unsigned char *addr, unsigned long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038F64&lt;br /&gt;
|unsigned long SpuSetTransferStartAddr(unsigned long addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038FB8&lt;br /&gt;
|long SpuSetTransferMode(long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038FEC&lt;br /&gt;
|SpuTransferCallbackProc SpuSetTransferCallback(SpuTransferCallbackProc func)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039010&lt;br /&gt;
|unsigned long SpuSetPitchLFOVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039034&lt;br /&gt;
|void SpuSetCommonAttr(SpuCommonAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800393C8&lt;br /&gt;
|void SpuSetVoiceVolume(int voiceNum, short volL, short volR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039450&lt;br /&gt;
|void SpuSetVoiceVolumeAttr(int voiceNum, short volL, short volR, short volModeL, short volModeR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800395C8&lt;br /&gt;
|void SpuSetVoicePitch(int voiceNum, unsigned short pitch)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039644&lt;br /&gt;
|void SpuSetVoiceStartAddr(int voiceNum, unsigned long startAddr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800396C0&lt;br /&gt;
|void SpuSetVoiceLoopStartAddr(int voiceNum, unsigned long lsa)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003973C&lt;br /&gt;
|void SpuSetVoiceDR(int voiceNum, unsigned short DR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800397C8&lt;br /&gt;
|void SpuSetVoiceSL(int voiceNum, unsigned short SL)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039850&lt;br /&gt;
|void SpuSetVoiceARAttr(int voiceNum, unsigned short AR, long ARmode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800398EC&lt;br /&gt;
|void SpuSetVoiceSRAttr(int voiceNum, unsigned short SR, long SRmode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800399D0&lt;br /&gt;
|void SpuSetVoiceRRAttr(int voiceNum, unsigned short RR, long RRmode)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LIBETC ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D0C0&lt;br /&gt;
|int ResetCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D150&lt;br /&gt;
|int VSyncCallback(void (*func)(void))&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D1B4&lt;br /&gt;
|int StopCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D214&lt;br /&gt;
|int CheckCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LIBAPI ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x800429F0&lt;br /&gt;
|void DeliverEvent(unsigned long ev1, unsigned long ev2)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A00&lt;br /&gt;
|long OpenEvent(unsigned long desc, long spec, long mode, long (*func)())&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A10&lt;br /&gt;
|long CloseEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A20&lt;br /&gt;
|long WaitEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A40&lt;br /&gt;
|long EnableEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A50&lt;br /&gt;
|long DisableEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042BC0&lt;br /&gt;
|long SetRCnt(unsigned long spec, unsigned short target, long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042C60&lt;br /&gt;
|long GetRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042C98&lt;br /&gt;
|long StartRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042CCC&lt;br /&gt;
|long StopRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Structures =&lt;br /&gt;
&lt;br /&gt;
[[FF7/PSX/Sound/INSTRx.DAT|struct AkaoInstrumentAttr]]&lt;br /&gt;
&lt;br /&gt;
[[FF7/PSX/Sound/INSTRx.ALL|struct AkaoSampleSet]]&lt;br /&gt;
&lt;br /&gt;
[[FF7/PSX/Sound/AKAO sequence|struct AkaoSeqHeader, struct AkaoDrumKeyAttr]]&lt;br /&gt;
&lt;br /&gt;
 struct AkaoMessage // 36 bytes long&lt;br /&gt;
 {&lt;br /&gt;
   uint16_t opcode;&lt;br /&gt;
   uint16_t reserved;&lt;br /&gt;
   uint32_t data[8];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoSpuVoiceAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t voice;          // 0x00: voice number&lt;br /&gt;
   uint32_t update_flags;   // 0x04: bitset that indicates what SPU registers need to be updated&lt;br /&gt;
   uint32_t addr;           // 0x08: waveform data start address (SPU address)&lt;br /&gt;
   uint32_t loop_addr;      // 0x0c: loop start address (SPU address)&lt;br /&gt;
   uint32_t a_mode;         // 0x10: ADSR: attack rate mode&lt;br /&gt;
   uint32_t s_mode;         // 0x14: ADSR: sustain rate mode&lt;br /&gt;
   uint32_t r_mode          // 0x18: ADSR: release rate mode&lt;br /&gt;
   uint16_t pitch;          // 0x1c: pitch&lt;br /&gt;
   uint16_t ar;             // 0x1e: ADSR: attack rate&lt;br /&gt;
   uint16_t dr;             // 0x20: ADSR: decay rate&lt;br /&gt;
   uint16_t sl;             // 0x22: ADSR: sustain level&lt;br /&gt;
   uint16_t sr;             // 0x24: ADSR: sustain rate&lt;br /&gt;
   uint16_t rr;             // 0x26: ADSR: release rate&lt;br /&gt;
   SpuVolume volume;        // 0x28: volume (left and right)&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoPlayer // the music player instance exists at 0x8009A104&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t stereo_mode;                 // 0x00: stereo mode (1: stereo, 4: surround, otherwise: mono)&lt;br /&gt;
   uint32_t active_voices;               // 0x04: bitset that indicates the voices currently in use&lt;br /&gt;
   uint32_t key_on_voices;               // 0x08: bitset that indicates the voices to key on&lt;br /&gt;
   uint32_t keyed_voices;                // 0x0c: bitset that indicates the voices currently keyed on&lt;br /&gt;
   uint32_t key_off_voices;              // 0x10: bitset that indicates the voices to key off&lt;br /&gt;
   uint32_t saved_active_voices;         // 0x14: unknown voice bitset&lt;br /&gt;
   uint32_t tempo;                       // 0x18: tempo (Q16 fixed-point number)&lt;br /&gt;
   int32_t tempo_slope;                  // 0x1c: slope of tempo slider (Q16 fixed-point number)&lt;br /&gt;
   uint32_t time_counter;                // 0x20: time counter (0x10000 = 1 tick)&lt;br /&gt;
   uint32_t overlay_voices;              // 0x24: bitset that indicates the sub-voices used for overlay (opcode 0xF4)&lt;br /&gt;
   uint32_t alternate_voices;            // 0x28: bitset that indicates the sub-voices used for alternate voice (opcode 0xF8)&lt;br /&gt;
   uint32_t noise_voices;                // 0x2c: bitset that indicates the voices with noise mode enabled&lt;br /&gt;
   uint32_t reverb_voices;               // 0x30: bitset that indicates the voices with reverb enabled&lt;br /&gt;
   uint32_t pitch_lfo_voices;            // 0x34: bitset that indicates the voices with pitch LFO (frequency modulation) mode enabled&lt;br /&gt;
   uint32_t spucnt;                      // 0x38: SPUCNT shadow&lt;br /&gt;
   uint32_t reverb_type;                 // 0x3c: reverb type&lt;br /&gt;
   uint32_t reverb_depth;                // 0x40: reverb depth (Q16 fixed-point number)&lt;br /&gt;
   int32_t reverb_depth_slope;           // 0x44: slope of reverb depth slider (Q16 fixed-point number)&lt;br /&gt;
   uint16_t tempo_slide_length;          // 0x48: tempo slide length&lt;br /&gt;
   uint16_t song_id;                     // 0x4a: current song id&lt;br /&gt;
   uint16_t condition_ack;               // 0x4c: the last matched condition value (opcode 0xEF)&lt;br /&gt;
   uint16_t condition;                   // 0x4e: condition variable for dynamic branching according to game status (opcode 0xEF)&lt;br /&gt;
   uint16_t reverb_depth_slide_length;   // 0x50: length of reverb depth slide&lt;br /&gt;
   uint16_t noise_clock;                 // 0x52: noise clock frequency&lt;br /&gt;
   uint16_t field_54;                    // 0x54: unknown (can be altered by opcode 0xF3)&lt;br /&gt;
   uint16_t beats_per_measure;           // 0x56: beats per measure&lt;br /&gt;
   uint16_t beat;                        // 0x58: current beat&lt;br /&gt;
   uint16_t ticks_per_beat;              // 0x5a: ticks per beat&lt;br /&gt;
   uint16_t tick;                        // 0x5c: current ticks per beat&lt;br /&gt;
   uint16_t measure;                     // 0x5e: current measure&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoPlayerTrack // the music player track instances exist at 0x80096608 + (N * 0x108)&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t *addr;                                    // 0x00&lt;br /&gt;
   uint8_t *loop_addrs[4];                           // 0x04&lt;br /&gt;
   AkaoDrumKeyAttr *drum_addr;                       // 0x14&lt;br /&gt;
   int16_t *vibrato_lfo_addr;                        // 0x18&lt;br /&gt;
   int16_t *tremolo_lfo_addr;                        // 0x1c&lt;br /&gt;
   int16_t *pan_lfo_addr;                            // 0x20&lt;br /&gt;
   uint32_t overlay_voice_num;                       // 0x24&lt;br /&gt;
   uint32_t alternate_voice_num;                     // 0x28&lt;br /&gt;
   uint32_t master_volume;                           // 0x2c&lt;br /&gt;
   uint32_t pitch_of_note;                           // 0x30&lt;br /&gt;
   int32_t pitch_bend_slide_amplitude;               // 0x34&lt;br /&gt;
   uint16_t voice_effect_flags;                      // 0x38&lt;br /&gt;
   uint16_t field_3A;                                // 0x3a&lt;br /&gt;
   uint16_t field_3C;                                // 0x3c&lt;br /&gt;
   uint16_t field_3E;                                // 0x3e&lt;br /&gt;
   uint32_t field_40;                                // 0x40&lt;br /&gt;
   uint32_t volume;                                  // 0x44&lt;br /&gt;
   int32_t volume_slope;                             // 0x48&lt;br /&gt;
   int32_t pitch_bend_slope;                         // 0x4c&lt;br /&gt;
   uint16_t field_50;                                // 0x50&lt;br /&gt;
   uint16_t field_52;                                // 0x52&lt;br /&gt;
   uint16_t field_54;                                // 0x54&lt;br /&gt;
   uint8_t delta_time_counter;                       // 0x56&lt;br /&gt;
   uint8_t gate_time_counter;                        // 0x57&lt;br /&gt;
   uint16_t instrument;                              // 0x58&lt;br /&gt;
   uint16_t field_5A;                                // 0x5a&lt;br /&gt;
   uint16_t volume_slide_length_counter;             // 0x5c&lt;br /&gt;
   uint16_t overlay_balance_slide_length_counter;    // 0x5e&lt;br /&gt;
   uint16_t pan;                                     // 0x60&lt;br /&gt;
   uint16_t pan_slide_length;                        // 0x62&lt;br /&gt;
   int16_t pitch_slide_length_counter;               // 0x64&lt;br /&gt;
   uint16_t octave;                                  // 0x66&lt;br /&gt;
   uint16_t pitch_slide_length;                      // 0x68&lt;br /&gt;
   uint16_t previous_note_number;                    // 0x6a&lt;br /&gt;
   uint16_t portamento_speed;                        // 0x6c&lt;br /&gt;
   uint16_t legato_flags;                            // 0x6e&lt;br /&gt;
   uint16_t field_70;                                // 0x70&lt;br /&gt;
   uint16_t vibrato_lfo_delay;                       // 0x72&lt;br /&gt;
   uint16_t vibrato_delay_counter;                   // 0x74&lt;br /&gt;
   uint16_t vibrato_rate;                            // 0x76&lt;br /&gt;
   uint16_t vibrato_rate_counter;                    // 0x78&lt;br /&gt;
   uint16_t vibrato_form;                            // 0x7a&lt;br /&gt;
   uint16_t vibrato_max_amplitude;                   // 0x7c&lt;br /&gt;
   uint16_t vibrato_depth;                           // 0x7e&lt;br /&gt;
   uint16_t vibrato_depth_slide_length_counter;      // 0x80&lt;br /&gt;
   int16_t vibrato_depth_slope;                      // 0x82&lt;br /&gt;
   uint16_t field_84;                                // 0x84&lt;br /&gt;
   uint16_t tremolo_delay;                           // 0x86&lt;br /&gt;
   uint16_t tremolo_delay_counter;                   // 0x88&lt;br /&gt;
   uint16_t tremolo_rate;                            // 0x8a&lt;br /&gt;
   uint16_t tremolo_rate_counter;                    // 0x8c&lt;br /&gt;
   uint16_t tremolo_form;                            // 0x8e&lt;br /&gt;
   uint16_t tremolo_depth;                           // 0x90&lt;br /&gt;
   uint16_t tremolo_depth_slide_length_counter;      // 0x92&lt;br /&gt;
   int16_t tremolo_depth_slope;                      // 0x94&lt;br /&gt;
   uint16_t field_96;                                // 0x96&lt;br /&gt;
   uint16_t pan_lfo_rate;                            // 0x98&lt;br /&gt;
   uint16_t pan_lfo_rate_counter;                    // 0x9a&lt;br /&gt;
   uint16_t pan_lfo_form;                            // 0x9c&lt;br /&gt;
   uint16_t pan_lfo_depth;                           // 0x9e&lt;br /&gt;
   uint16_t pan_lfo_depth_slide_length_counter;      // 0xa0&lt;br /&gt;
   int16_t pan_lfo_slope;                            // 0xa2&lt;br /&gt;
   uint16_t noise_on_off_delay_counter;              // 0xa4&lt;br /&gt;
   uint16_t pitchmod_on_off_delay_counter;           // 0xa6&lt;br /&gt;
   uint8_t field_A8[16];                             // 0xa8&lt;br /&gt;
   uint16_t loop_layer;                              // 0xb8&lt;br /&gt;
   uint16_t loop_counts[4];                          // 0xba&lt;br /&gt;
   uint16_t previous_delta_time;                     // 0xc2&lt;br /&gt;
   uint16_t forced_delta_time;                       // 0xc4&lt;br /&gt;
   uint16_t overlay_balance;                         // 0xc6&lt;br /&gt;
   int16_t overlay_balance_slope;                    // 0xc8&lt;br /&gt;
   int16_t pan_slope;                                // 0xca&lt;br /&gt;
   int16_t transpose;                                // 0xcc&lt;br /&gt;
   int16_t tuning;                                   // 0xce&lt;br /&gt;
   uint16_t note;                                    // 0xd0&lt;br /&gt;
   int16_t pitch_slide_amount;                       // 0xd2&lt;br /&gt;
   int16_t previous_transpose;                       // 0xd4&lt;br /&gt;
   int16_t vibrato_lfo_amplitude;                    // 0xd6&lt;br /&gt;
   int16_t tremolo_lfo_amplitude;                    // 0xd8&lt;br /&gt;
   int16_t pan_lfo_amplitude;                        // 0xda&lt;br /&gt;
   AkaoSpuVoiceAttr spu_attr;                        // 0xdc&lt;br /&gt;
 };&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Opcodes/0xa8aa&amp;diff=5752</id>
		<title>FF7/PSX/Sound/Opcodes/0xa8aa</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Opcodes/0xa8aa&amp;diff=5752"/>
		<updated>2020-06-13T02:43:28Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 0xA8, 0xAA, 0xA3 (Channel Volume, Pan, Volume Modifier) ==&lt;br /&gt;
0xA8 has one 8-bit parameter, which used in calculation of base channel volume.&lt;br /&gt;
&lt;br /&gt;
0xAA has one 8-bit parameter, which used in calculation of channel pan (difference between left and right channel volume).&lt;br /&gt;
&lt;br /&gt;
0xA3 has one 8-bit parameter, which used in calculation of base channel volume.&lt;br /&gt;
&lt;br /&gt;
=== Volume Calculation ===&lt;br /&gt;
&lt;br /&gt;
 // m_AKAO_VOLUME_TABLE_L[i] = 32768 - m_AKAO_VOLUME_TABLE_R[i];&lt;br /&gt;
 const uint16_t m_AKAO_VOLUME_TABLE_L[128] = {&lt;br /&gt;
   0x7f80, 0x7e80, 0x7d80, 0x7c80, 0x7b80, 0x7a80, 0x7980, 0x7880,&lt;br /&gt;
   0x7780, 0x7680, 0x7580, 0x7480, 0x7380, 0x7280, 0x7180, 0x7080,&lt;br /&gt;
   0x6f80, 0x6e80, 0x6d80, 0x6c80, 0x6b80, 0x6a80, 0x6980, 0x6880,&lt;br /&gt;
   0x6780, 0x6680, 0x6580, 0x6480, 0x6380, 0x6280, 0x6180, 0x6080,&lt;br /&gt;
   0x5f80, 0x5e80, 0x5d80, 0x5c80, 0x5b80, 0x5a80, 0x5980, 0x5880,&lt;br /&gt;
   0x5780, 0x5680, 0x5580, 0x5480, 0x5380, 0x5280, 0x5180, 0x5080,&lt;br /&gt;
   0x4f80, 0x4e80, 0x4d80, 0x4c80, 0x4b80, 0x4a80, 0x4980, 0x4880,&lt;br /&gt;
   0x4780, 0x4680, 0x4580, 0x4480, 0x4380, 0x4280, 0x4180, 0x4080,&lt;br /&gt;
   0x3f80, 0x3e80, 0x3d80, 0x3c80, 0x3b80, 0x3a80, 0x3980, 0x3880,&lt;br /&gt;
   0x3780, 0x3680, 0x3580, 0x3480, 0x3380, 0x3280, 0x3180, 0x3080,&lt;br /&gt;
   0x2f80, 0x2e80, 0x2d80, 0x2c80, 0x2b80, 0x2a80, 0x2980, 0x2880,&lt;br /&gt;
   0x2780, 0x2680, 0x2580, 0x2480, 0x2380, 0x2280, 0x2180, 0x2080,&lt;br /&gt;
   0x1f80, 0x1e80, 0x1d80, 0x1c80, 0x1b80, 0x1a80, 0x1980, 0x1880,&lt;br /&gt;
   0x1780, 0x1680, 0x1580, 0x1480, 0x1380, 0x1280, 0x1180, 0x1080,&lt;br /&gt;
   0x0f80, 0x0e80, 0x0d80, 0x0c80, 0x0b80, 0x0a80, 0x0980, 0x0880,&lt;br /&gt;
   0x0780, 0x0680, 0x0580, 0x0480, 0x0380, 0x0280, 0x0180, 0x0080&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 // m_AKAO_VOLUME_TABLE_R[i] = i * 256 + 128;&lt;br /&gt;
 const uint16_t m_AKAO_VOLUME_TABLE_R[128] = {&lt;br /&gt;
   0x0080, 0x0180, 0x0280, 0x0380, 0x0480, 0x0580, 0x0680, 0x0780,&lt;br /&gt;
   0x0880, 0x0980, 0x0a80, 0x0b80, 0x0c80, 0x0d80, 0x0e80, 0x0f80,&lt;br /&gt;
   0x1080, 0x1180, 0x1280, 0x1380, 0x1480, 0x1580, 0x1680, 0x1780,&lt;br /&gt;
   0x1880, 0x1980, 0x1a80, 0x1b80, 0x1c80, 0x1d80, 0x1e80, 0x1f80,&lt;br /&gt;
   0x2080, 0x2180, 0x2280, 0x2380, 0x2480, 0x2580, 0x2680, 0x2780,&lt;br /&gt;
   0x2880, 0x2980, 0x2a80, 0x2b80, 0x2c80, 0x2d80, 0x2e80, 0x2f80,&lt;br /&gt;
   0x3080, 0x3180, 0x3280, 0x3380, 0x3480, 0x3580, 0x3680, 0x3780,&lt;br /&gt;
   0x3880, 0x3980, 0x3a80, 0x3b80, 0x3c80, 0x3d80, 0x3e80, 0x3f80,&lt;br /&gt;
   0x4080, 0x4180, 0x4280, 0x4380, 0x4480, 0x4580, 0x4680, 0x4780,&lt;br /&gt;
   0x4880, 0x4980, 0x4a80, 0x4b80, 0x4c80, 0x4d80, 0x4e80, 0x4f80,&lt;br /&gt;
   0x5080, 0x5180, 0x5280, 0x5380, 0x5480, 0x5580, 0x5680, 0x5780,&lt;br /&gt;
   0x5880, 0x5980, 0x5a80, 0x5b80, 0x5c80, 0x5d80, 0x5e80, 0x5f80,&lt;br /&gt;
   0x6080, 0x6180, 0x6280, 0x6380, 0x6480, 0x6580, 0x6680, 0x6780,&lt;br /&gt;
   0x6880, 0x6980, 0x6a80, 0x6b80, 0x6c80, 0x6d80, 0x6e80, 0x6f80,&lt;br /&gt;
   0x7080, 0x7180, 0x7280, 0x7380, 0x7480, 0x7580, 0x7680, 0x7780,&lt;br /&gt;
   0x7880, 0x7980, 0x7a80, 0x7b80, 0x7c80, 0x7d80, 0x7e80, 0x7f80&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 left_volume = m_AKAO_VOLUME_TABLE_L[aa_parameter] * ((a8_parameter * a3_parameter * 0x7f) / 128) / 256 / 128;&lt;br /&gt;
 &lt;br /&gt;
 right_volume = m_AKAO_VOLUME_TABLE_R[aa_parameter] * ((a8_parameter * a3_paramater * 0x7f) / 128) / 256 / 128;&lt;br /&gt;
&lt;br /&gt;
If there is no A3 opcode in sequence (as in SENSUI.SND for example), default value 0x7f is used.&lt;br /&gt;
&lt;br /&gt;
If there is no A8 opcode in sequence, default value 0x7f.fe is used. (More precisely, 0x3fff is stored in memory.)&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Opcodes/0xa8aa&amp;diff=5751</id>
		<title>FF7/PSX/Sound/Opcodes/0xa8aa</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Opcodes/0xa8aa&amp;diff=5751"/>
		<updated>2020-06-13T02:42:59Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: Add default value information of opcode A8.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 0xA8, 0xAA, 0xA3 (Channel Volume, Pan, Volume Modifier) ==&lt;br /&gt;
0xA8 has one 8-bit parameter, which used in calculation of base channel volume.&lt;br /&gt;
&lt;br /&gt;
0xAA has one 8-bit parameter, which used in calculation of channel pan (difference between left and right channel volume).&lt;br /&gt;
&lt;br /&gt;
0xA3 has one 8-bit parameter, which used in calculation of base channel volume.&lt;br /&gt;
&lt;br /&gt;
=== Volume Calculation ===&lt;br /&gt;
&lt;br /&gt;
 // m_AKAO_VOLUME_TABLE_L[i] = 32768 - m_AKAO_VOLUME_TABLE_R[i];&lt;br /&gt;
 const uint16_t m_AKAO_VOLUME_TABLE_L[128] = {&lt;br /&gt;
   0x7f80, 0x7e80, 0x7d80, 0x7c80, 0x7b80, 0x7a80, 0x7980, 0x7880,&lt;br /&gt;
   0x7780, 0x7680, 0x7580, 0x7480, 0x7380, 0x7280, 0x7180, 0x7080,&lt;br /&gt;
   0x6f80, 0x6e80, 0x6d80, 0x6c80, 0x6b80, 0x6a80, 0x6980, 0x6880,&lt;br /&gt;
   0x6780, 0x6680, 0x6580, 0x6480, 0x6380, 0x6280, 0x6180, 0x6080,&lt;br /&gt;
   0x5f80, 0x5e80, 0x5d80, 0x5c80, 0x5b80, 0x5a80, 0x5980, 0x5880,&lt;br /&gt;
   0x5780, 0x5680, 0x5580, 0x5480, 0x5380, 0x5280, 0x5180, 0x5080,&lt;br /&gt;
   0x4f80, 0x4e80, 0x4d80, 0x4c80, 0x4b80, 0x4a80, 0x4980, 0x4880,&lt;br /&gt;
   0x4780, 0x4680, 0x4580, 0x4480, 0x4380, 0x4280, 0x4180, 0x4080,&lt;br /&gt;
   0x3f80, 0x3e80, 0x3d80, 0x3c80, 0x3b80, 0x3a80, 0x3980, 0x3880,&lt;br /&gt;
   0x3780, 0x3680, 0x3580, 0x3480, 0x3380, 0x3280, 0x3180, 0x3080,&lt;br /&gt;
   0x2f80, 0x2e80, 0x2d80, 0x2c80, 0x2b80, 0x2a80, 0x2980, 0x2880,&lt;br /&gt;
   0x2780, 0x2680, 0x2580, 0x2480, 0x2380, 0x2280, 0x2180, 0x2080,&lt;br /&gt;
   0x1f80, 0x1e80, 0x1d80, 0x1c80, 0x1b80, 0x1a80, 0x1980, 0x1880,&lt;br /&gt;
   0x1780, 0x1680, 0x1580, 0x1480, 0x1380, 0x1280, 0x1180, 0x1080,&lt;br /&gt;
   0x0f80, 0x0e80, 0x0d80, 0x0c80, 0x0b80, 0x0a80, 0x0980, 0x0880,&lt;br /&gt;
   0x0780, 0x0680, 0x0580, 0x0480, 0x0380, 0x0280, 0x0180, 0x0080&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 // m_AKAO_VOLUME_TABLE_R[i] = i * 256 + 128;&lt;br /&gt;
 const uint16_t m_AKAO_VOLUME_TABLE_R[128] = {&lt;br /&gt;
   0x0080, 0x0180, 0x0280, 0x0380, 0x0480, 0x0580, 0x0680, 0x0780,&lt;br /&gt;
   0x0880, 0x0980, 0x0a80, 0x0b80, 0x0c80, 0x0d80, 0x0e80, 0x0f80,&lt;br /&gt;
   0x1080, 0x1180, 0x1280, 0x1380, 0x1480, 0x1580, 0x1680, 0x1780,&lt;br /&gt;
   0x1880, 0x1980, 0x1a80, 0x1b80, 0x1c80, 0x1d80, 0x1e80, 0x1f80,&lt;br /&gt;
   0x2080, 0x2180, 0x2280, 0x2380, 0x2480, 0x2580, 0x2680, 0x2780,&lt;br /&gt;
   0x2880, 0x2980, 0x2a80, 0x2b80, 0x2c80, 0x2d80, 0x2e80, 0x2f80,&lt;br /&gt;
   0x3080, 0x3180, 0x3280, 0x3380, 0x3480, 0x3580, 0x3680, 0x3780,&lt;br /&gt;
   0x3880, 0x3980, 0x3a80, 0x3b80, 0x3c80, 0x3d80, 0x3e80, 0x3f80,&lt;br /&gt;
   0x4080, 0x4180, 0x4280, 0x4380, 0x4480, 0x4580, 0x4680, 0x4780,&lt;br /&gt;
   0x4880, 0x4980, 0x4a80, 0x4b80, 0x4c80, 0x4d80, 0x4e80, 0x4f80,&lt;br /&gt;
   0x5080, 0x5180, 0x5280, 0x5380, 0x5480, 0x5580, 0x5680, 0x5780,&lt;br /&gt;
   0x5880, 0x5980, 0x5a80, 0x5b80, 0x5c80, 0x5d80, 0x5e80, 0x5f80,&lt;br /&gt;
   0x6080, 0x6180, 0x6280, 0x6380, 0x6480, 0x6580, 0x6680, 0x6780,&lt;br /&gt;
   0x6880, 0x6980, 0x6a80, 0x6b80, 0x6c80, 0x6d80, 0x6e80, 0x6f80,&lt;br /&gt;
   0x7080, 0x7180, 0x7280, 0x7380, 0x7480, 0x7580, 0x7680, 0x7780,&lt;br /&gt;
   0x7880, 0x7980, 0x7a80, 0x7b80, 0x7c80, 0x7d80, 0x7e80, 0x7f80&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 left_volume = m_AKAO_VOLUME_TABLE_L[aa_parameter] * ((a8_parameter * a3_parameter * 0x7f) / 128) / 256 / 128;&lt;br /&gt;
 &lt;br /&gt;
 right_volume = m_AKAO_VOLUME_TABLE_R[aa_parameter] * ((a8_parameter * a3_paramater * 0x7f) / 128) / 256 / 128;&lt;br /&gt;
&lt;br /&gt;
If there is no A3 opcode in sequence (as in SENSUI.SND for example), default value 0x7f is used.&lt;br /&gt;
&lt;br /&gt;
If there is no A8 opcode in sequence, default value 0x7f.fe is used. (More precisely, 0x3FFF is stored in memory.)&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Opcodes/0xa8aa&amp;diff=5750</id>
		<title>FF7/PSX/Sound/Opcodes/0xa8aa</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Opcodes/0xa8aa&amp;diff=5750"/>
		<updated>2020-06-10T15:07:00Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 0xA8, 0xAA, 0xA3 (Channel Volume, Pan, Volume Modifier) ==&lt;br /&gt;
0xA8 has one 8-bit parameter, which used in calculation of base channel volume.&lt;br /&gt;
&lt;br /&gt;
0xAA has one 8-bit parameter, which used in calculation of channel pan (difference between left and right channel volume).&lt;br /&gt;
&lt;br /&gt;
0xA3 has one 8-bit parameter, which used in calculation of base channel volume.&lt;br /&gt;
&lt;br /&gt;
=== Volume Calculation ===&lt;br /&gt;
&lt;br /&gt;
 // m_AKAO_VOLUME_TABLE_L[i] = 32768 - m_AKAO_VOLUME_TABLE_R[i];&lt;br /&gt;
 const uint16_t m_AKAO_VOLUME_TABLE_L[128] = {&lt;br /&gt;
   0x7f80, 0x7e80, 0x7d80, 0x7c80, 0x7b80, 0x7a80, 0x7980, 0x7880,&lt;br /&gt;
   0x7780, 0x7680, 0x7580, 0x7480, 0x7380, 0x7280, 0x7180, 0x7080,&lt;br /&gt;
   0x6f80, 0x6e80, 0x6d80, 0x6c80, 0x6b80, 0x6a80, 0x6980, 0x6880,&lt;br /&gt;
   0x6780, 0x6680, 0x6580, 0x6480, 0x6380, 0x6280, 0x6180, 0x6080,&lt;br /&gt;
   0x5f80, 0x5e80, 0x5d80, 0x5c80, 0x5b80, 0x5a80, 0x5980, 0x5880,&lt;br /&gt;
   0x5780, 0x5680, 0x5580, 0x5480, 0x5380, 0x5280, 0x5180, 0x5080,&lt;br /&gt;
   0x4f80, 0x4e80, 0x4d80, 0x4c80, 0x4b80, 0x4a80, 0x4980, 0x4880,&lt;br /&gt;
   0x4780, 0x4680, 0x4580, 0x4480, 0x4380, 0x4280, 0x4180, 0x4080,&lt;br /&gt;
   0x3f80, 0x3e80, 0x3d80, 0x3c80, 0x3b80, 0x3a80, 0x3980, 0x3880,&lt;br /&gt;
   0x3780, 0x3680, 0x3580, 0x3480, 0x3380, 0x3280, 0x3180, 0x3080,&lt;br /&gt;
   0x2f80, 0x2e80, 0x2d80, 0x2c80, 0x2b80, 0x2a80, 0x2980, 0x2880,&lt;br /&gt;
   0x2780, 0x2680, 0x2580, 0x2480, 0x2380, 0x2280, 0x2180, 0x2080,&lt;br /&gt;
   0x1f80, 0x1e80, 0x1d80, 0x1c80, 0x1b80, 0x1a80, 0x1980, 0x1880,&lt;br /&gt;
   0x1780, 0x1680, 0x1580, 0x1480, 0x1380, 0x1280, 0x1180, 0x1080,&lt;br /&gt;
   0x0f80, 0x0e80, 0x0d80, 0x0c80, 0x0b80, 0x0a80, 0x0980, 0x0880,&lt;br /&gt;
   0x0780, 0x0680, 0x0580, 0x0480, 0x0380, 0x0280, 0x0180, 0x0080&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 // m_AKAO_VOLUME_TABLE_R[i] = i * 256 + 128;&lt;br /&gt;
 const uint16_t m_AKAO_VOLUME_TABLE_R[128] = {&lt;br /&gt;
   0x0080, 0x0180, 0x0280, 0x0380, 0x0480, 0x0580, 0x0680, 0x0780,&lt;br /&gt;
   0x0880, 0x0980, 0x0a80, 0x0b80, 0x0c80, 0x0d80, 0x0e80, 0x0f80,&lt;br /&gt;
   0x1080, 0x1180, 0x1280, 0x1380, 0x1480, 0x1580, 0x1680, 0x1780,&lt;br /&gt;
   0x1880, 0x1980, 0x1a80, 0x1b80, 0x1c80, 0x1d80, 0x1e80, 0x1f80,&lt;br /&gt;
   0x2080, 0x2180, 0x2280, 0x2380, 0x2480, 0x2580, 0x2680, 0x2780,&lt;br /&gt;
   0x2880, 0x2980, 0x2a80, 0x2b80, 0x2c80, 0x2d80, 0x2e80, 0x2f80,&lt;br /&gt;
   0x3080, 0x3180, 0x3280, 0x3380, 0x3480, 0x3580, 0x3680, 0x3780,&lt;br /&gt;
   0x3880, 0x3980, 0x3a80, 0x3b80, 0x3c80, 0x3d80, 0x3e80, 0x3f80,&lt;br /&gt;
   0x4080, 0x4180, 0x4280, 0x4380, 0x4480, 0x4580, 0x4680, 0x4780,&lt;br /&gt;
   0x4880, 0x4980, 0x4a80, 0x4b80, 0x4c80, 0x4d80, 0x4e80, 0x4f80,&lt;br /&gt;
   0x5080, 0x5180, 0x5280, 0x5380, 0x5480, 0x5580, 0x5680, 0x5780,&lt;br /&gt;
   0x5880, 0x5980, 0x5a80, 0x5b80, 0x5c80, 0x5d80, 0x5e80, 0x5f80,&lt;br /&gt;
   0x6080, 0x6180, 0x6280, 0x6380, 0x6480, 0x6580, 0x6680, 0x6780,&lt;br /&gt;
   0x6880, 0x6980, 0x6a80, 0x6b80, 0x6c80, 0x6d80, 0x6e80, 0x6f80,&lt;br /&gt;
   0x7080, 0x7180, 0x7280, 0x7380, 0x7480, 0x7580, 0x7680, 0x7780,&lt;br /&gt;
   0x7880, 0x7980, 0x7a80, 0x7b80, 0x7c80, 0x7d80, 0x7e80, 0x7f80&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 left_volume = m_AKAO_VOLUME_TABLE_L[aa_parameter] * ((a8_parameter * a3_parameter * 0x7f) / 128) / 256 / 128;&lt;br /&gt;
 &lt;br /&gt;
 right_volume = m_AKAO_VOLUME_TABLE_R[aa_parameter] * ((a8_parameter * a3_paramater * 0x7f) / 128) / 256 / 128;&lt;br /&gt;
&lt;br /&gt;
If there is no A3 opcode in sequence (as in SENSUI.SND for example), default value 0x7f is used.&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Opcodes/0xa8aa&amp;diff=5749</id>
		<title>FF7/PSX/Sound/Opcodes/0xa8aa</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Opcodes/0xa8aa&amp;diff=5749"/>
		<updated>2020-06-10T15:06:41Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: Add formula for generating the volume table. (linear curve)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 0xA8, 0xAA, 0xA3 (Channel Volume, Pan, Volume Modifier) ==&lt;br /&gt;
0xA8 has one 8-bit parameter, which used in calculation of base channel volume.&lt;br /&gt;
&lt;br /&gt;
0xAA has one 8-bit parameter, which used in calculation of channel pan (difference between left and right channel volume).&lt;br /&gt;
&lt;br /&gt;
0xA3 has one 8-bit parameter, which used in calculation of base channel volume.&lt;br /&gt;
&lt;br /&gt;
Understanding of this opcodes isn't that easy, but here is what I have got:&lt;br /&gt;
&lt;br /&gt;
=== Volume Calculation ===&lt;br /&gt;
&lt;br /&gt;
 // m_AKAO_VOLUME_TABLE_L[i] = 32768 - m_AKAO_VOLUME_TABLE_R[i];&lt;br /&gt;
 const uint16_t m_AKAO_VOLUME_TABLE_L[128] = {&lt;br /&gt;
   0x7f80, 0x7e80, 0x7d80, 0x7c80, 0x7b80, 0x7a80, 0x7980, 0x7880,&lt;br /&gt;
   0x7780, 0x7680, 0x7580, 0x7480, 0x7380, 0x7280, 0x7180, 0x7080,&lt;br /&gt;
   0x6f80, 0x6e80, 0x6d80, 0x6c80, 0x6b80, 0x6a80, 0x6980, 0x6880,&lt;br /&gt;
   0x6780, 0x6680, 0x6580, 0x6480, 0x6380, 0x6280, 0x6180, 0x6080,&lt;br /&gt;
   0x5f80, 0x5e80, 0x5d80, 0x5c80, 0x5b80, 0x5a80, 0x5980, 0x5880,&lt;br /&gt;
   0x5780, 0x5680, 0x5580, 0x5480, 0x5380, 0x5280, 0x5180, 0x5080,&lt;br /&gt;
   0x4f80, 0x4e80, 0x4d80, 0x4c80, 0x4b80, 0x4a80, 0x4980, 0x4880,&lt;br /&gt;
   0x4780, 0x4680, 0x4580, 0x4480, 0x4380, 0x4280, 0x4180, 0x4080,&lt;br /&gt;
   0x3f80, 0x3e80, 0x3d80, 0x3c80, 0x3b80, 0x3a80, 0x3980, 0x3880,&lt;br /&gt;
   0x3780, 0x3680, 0x3580, 0x3480, 0x3380, 0x3280, 0x3180, 0x3080,&lt;br /&gt;
   0x2f80, 0x2e80, 0x2d80, 0x2c80, 0x2b80, 0x2a80, 0x2980, 0x2880,&lt;br /&gt;
   0x2780, 0x2680, 0x2580, 0x2480, 0x2380, 0x2280, 0x2180, 0x2080,&lt;br /&gt;
   0x1f80, 0x1e80, 0x1d80, 0x1c80, 0x1b80, 0x1a80, 0x1980, 0x1880,&lt;br /&gt;
   0x1780, 0x1680, 0x1580, 0x1480, 0x1380, 0x1280, 0x1180, 0x1080,&lt;br /&gt;
   0x0f80, 0x0e80, 0x0d80, 0x0c80, 0x0b80, 0x0a80, 0x0980, 0x0880,&lt;br /&gt;
   0x0780, 0x0680, 0x0580, 0x0480, 0x0380, 0x0280, 0x0180, 0x0080&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 // m_AKAO_VOLUME_TABLE_R[i] = i * 256 + 128;&lt;br /&gt;
 const uint16_t m_AKAO_VOLUME_TABLE_R[128] = {&lt;br /&gt;
   0x0080, 0x0180, 0x0280, 0x0380, 0x0480, 0x0580, 0x0680, 0x0780,&lt;br /&gt;
   0x0880, 0x0980, 0x0a80, 0x0b80, 0x0c80, 0x0d80, 0x0e80, 0x0f80,&lt;br /&gt;
   0x1080, 0x1180, 0x1280, 0x1380, 0x1480, 0x1580, 0x1680, 0x1780,&lt;br /&gt;
   0x1880, 0x1980, 0x1a80, 0x1b80, 0x1c80, 0x1d80, 0x1e80, 0x1f80,&lt;br /&gt;
   0x2080, 0x2180, 0x2280, 0x2380, 0x2480, 0x2580, 0x2680, 0x2780,&lt;br /&gt;
   0x2880, 0x2980, 0x2a80, 0x2b80, 0x2c80, 0x2d80, 0x2e80, 0x2f80,&lt;br /&gt;
   0x3080, 0x3180, 0x3280, 0x3380, 0x3480, 0x3580, 0x3680, 0x3780,&lt;br /&gt;
   0x3880, 0x3980, 0x3a80, 0x3b80, 0x3c80, 0x3d80, 0x3e80, 0x3f80,&lt;br /&gt;
   0x4080, 0x4180, 0x4280, 0x4380, 0x4480, 0x4580, 0x4680, 0x4780,&lt;br /&gt;
   0x4880, 0x4980, 0x4a80, 0x4b80, 0x4c80, 0x4d80, 0x4e80, 0x4f80,&lt;br /&gt;
   0x5080, 0x5180, 0x5280, 0x5380, 0x5480, 0x5580, 0x5680, 0x5780,&lt;br /&gt;
   0x5880, 0x5980, 0x5a80, 0x5b80, 0x5c80, 0x5d80, 0x5e80, 0x5f80,&lt;br /&gt;
   0x6080, 0x6180, 0x6280, 0x6380, 0x6480, 0x6580, 0x6680, 0x6780,&lt;br /&gt;
   0x6880, 0x6980, 0x6a80, 0x6b80, 0x6c80, 0x6d80, 0x6e80, 0x6f80,&lt;br /&gt;
   0x7080, 0x7180, 0x7280, 0x7380, 0x7480, 0x7580, 0x7680, 0x7780,&lt;br /&gt;
   0x7880, 0x7980, 0x7a80, 0x7b80, 0x7c80, 0x7d80, 0x7e80, 0x7f80&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 left_volume = m_AKAO_VOLUME_TABLE_L[aa_parameter] * ((a8_parameter * a3_parameter * 0x7f) / 128) / 256 / 128;&lt;br /&gt;
 &lt;br /&gt;
 right_volume = m_AKAO_VOLUME_TABLE_R[aa_parameter] * ((a8_parameter * a3_paramater * 0x7f) / 128) / 256 / 128;&lt;br /&gt;
&lt;br /&gt;
If there is no A3 opcode in sequence (as in SENSUI.SND for example), default value 0x7f is used.&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Opcodes/0xfd&amp;diff=5748</id>
		<title>FF7/PSX/Sound/Opcodes/0xfd</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Opcodes/0xfd&amp;diff=5748"/>
		<updated>2020-06-10T14:08:10Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: Undo revision 5747 by Loveemu (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 0xFD (Unknown Yet) ==&lt;br /&gt;
Has two 8-bit parameters.&lt;br /&gt;
&lt;br /&gt;
Unknown Opcode.&lt;br /&gt;
&lt;br /&gt;
Parameters writes to Global Configuration structure (I think :)) at 0x8009A104.&lt;br /&gt;
&lt;br /&gt;
1st parameter offset: 0x5a&lt;br /&gt;
&lt;br /&gt;
2nd parameter offset: 0x56&lt;br /&gt;
&lt;br /&gt;
In structure this two parameters are 16-bit.&lt;br /&gt;
&lt;br /&gt;
Opcode also clears two another 16-bit numbers at offsets 0x58 and 0x5c.&lt;br /&gt;
&lt;br /&gt;
All 4 parameters mentioned are checked in every iteration of opcode processing (this needs more investigation).&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Opcodes/0xfd&amp;diff=5747</id>
		<title>FF7/PSX/Sound/Opcodes/0xfd</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Opcodes/0xfd&amp;diff=5747"/>
		<updated>2020-06-10T14:06:05Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Opcodes/0xb4b5&amp;diff=5746</id>
		<title>FF7/PSX/Sound/Opcodes/0xb4b5</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Opcodes/0xb4b5&amp;diff=5746"/>
		<updated>2020-06-09T14:57:24Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== LFO ==&lt;br /&gt;
&lt;br /&gt;
=== LFO Forms ===&lt;br /&gt;
&lt;br /&gt;
The two zeros are a special prefix for moving the LFO pointer, and the following value indicates the relative offset to move to.&lt;br /&gt;
&lt;br /&gt;
 const int16_t LFO_FORM_00[] = {&lt;br /&gt;
   -0x1FFF,  0x3FFF, -0x3FFF,  0x5FFF, -0x5FFF,&lt;br /&gt;
    0x7FFF, -0x7FFF,&lt;br /&gt;
    0, 0, -2&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 const int16_t LFO_FORM_01[] = {&lt;br /&gt;
    0x7FFF, -0x7FFF,&lt;br /&gt;
    0, 0, -2&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 const int16_t LFO_FORM_02[] = {&lt;br /&gt;
    0x1FFF,  0x0000,  0x3FFF,  0x0000,  0x5FFF,&lt;br /&gt;
    0x0000,  0x7FFF,&lt;br /&gt;
    0, 0, -2&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 const int16_t LFO_FORM_03[] = {&lt;br /&gt;
    0x7FFF,&lt;br /&gt;
    0x0000,  0x7FFF,&lt;br /&gt;
    0, 0, -2&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 const int16_t LFO_FORM_04[] = {&lt;br /&gt;
   -0x1FFF,  0x0000, -0x3FFF,  0x0000, -0x5FFF,&lt;br /&gt;
    0x0000, -0x7FFF,&lt;br /&gt;
    0, 0, -2&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 const int16_t LFO_FORM_05[] = {&lt;br /&gt;
   -0x7FFF,&lt;br /&gt;
    0x0000, -0x7FFF,&lt;br /&gt;
    0, 0, -2&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 const int16_t LFO_FORM_06[] = {&lt;br /&gt;
    0x0000,  0x0500,  0x09E2,  0x12CD,  0x169E,  0x19E1,  0x1C81,  0x1E6D,&lt;br /&gt;
    0x1F9A,  0x1FFF,  0x1F9C,  0x1E71,  0x1C86,  0x19E8,  0x16A7,  0x12D7,&lt;br /&gt;
    0x0E90,  0x09EE,  0x050D,  0x0000, -0x04F4, -0x09D6, -0x0E7A, -0x12C3,&lt;br /&gt;
   -0x1696, -0x19DA, -0x1C7C, -0x1E6A, -0x1F99, -0x2000, -0x1F9F, -0x1E76,&lt;br /&gt;
   -0x1C8D, -0x19F1, -0x16B1, -0x12E3, -0x0E9D, -0x09FC, -0x051B,  0x0000,&lt;br /&gt;
    0x0A01,  0x13C4,  0x259A,  0x2D3C,  0x33C2,  0x3902,  0x3CDA,  0x3F34,&lt;br /&gt;
    0x3FFF,  0x3F38,  0x3CE2,  0x390D,  0x33D1,  0x2D4F,  0x25AF,  0x1D21,&lt;br /&gt;
    0x13DD,  0x0A1B,  0x0000, -0x09E8, -0x13AC, -0x1CF4, -0x2585, -0x2D2B,&lt;br /&gt;
   -0x33B3, -0x38F7, -0x3CD3, -0x3F31, -0x4000, -0x3F3D, -0x3CEB, -0x391A,&lt;br /&gt;
   -0x33E1, -0x2D62, -0x25C5, -0x1D3A, -0x13F7, -0x0A36,  0x0000,  0x0F02,&lt;br /&gt;
    0x1DA6,  0x3867,  0x43DA,  0x4DA3,  0x5583,  0x5B47,  0x5ECE,  0x5FFF,&lt;br /&gt;
    0x5ED4,  0x5B53,  0x5594,  0x4DBA,  0x43F6,  0x3886,  0x2BB2,  0x1DCB,&lt;br /&gt;
    0x0F29,  0x0000, -0x0EDC, -0x1D82, -0x2B6E, -0x3848, -0x43C0, -0x4D8D,&lt;br /&gt;
   -0x5572, -0x5B3D, -0x5EC9, -0x6000, -0x5EDC, -0x5B61, -0x55A7, -0x4DD2,&lt;br /&gt;
   -0x4413, -0x38A7, -0x2BD7, -0x1DF2, -0x0F51,&lt;br /&gt;
    0x0000,  0x1403,  0x2788,  0x4B34,  0x5A79,  0x6784,  0x7204,  0x79B5,&lt;br /&gt;
    0x7E68,  0x7FFF,  0x7E71,  0x79C5,  0x721B,  0x67A3,  0x5A9E,  0x4B5E,&lt;br /&gt;
    0x3A43,  0x27BA,  0x1437,  0x0000, -0x13D0, -0x2758, -0x39E7, -0x4B0A,&lt;br /&gt;
   -0x5A55, -0x6766, -0x71ED, -0x79A6, -0x7E61, -0x8000, -0x7E7A, -0x79D6,&lt;br /&gt;
   -0x7234, -0x67C2, -0x5AC3, -0x4B89, -0x3A73, -0x27ED, -0x146B,&lt;br /&gt;
    0, 0, -39&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 const int16_t LFO_FORM_07[] = {&lt;br /&gt;
    0x0000,  0x1403,  0x2788,  0x4B34,  0x5A79,  0x6784,  0x7204,  0x79B5,&lt;br /&gt;
    0x7E68,  0x7FFF,  0x7E71,  0x79C5,  0x721B,  0x67A3,  0x5A9E,  0x4B5E,&lt;br /&gt;
    0x3A43,  0x27BA,  0x1437,  0x0000, -0x13D0, -0x2758, -0x39E7, -0x4B0A,&lt;br /&gt;
   -0x5A55, -0x6766, -0x71ED, -0x79A6, -0x7E61, -0x8000, -0x7E7A, -0x79D6,&lt;br /&gt;
   -0x7234, -0x67C2, -0x5AC3, -0x4B89, -0x3A73, -0x27ED, -0x146B,&lt;br /&gt;
    0, 0, -39&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 const int16_t LFO_FORM_0A[] = {&lt;br /&gt;
    0x0000,  0x09E2,  0x12CD,  0x19E1,  0x1E6D,  0x1FFF,  0x1E71,  0x19E8,&lt;br /&gt;
    0x12D7,  0x09EE,  0x000D, -0x09D6, -0x12C3, -0x19DA, -0x1E6A, -0x2000,&lt;br /&gt;
   -0x1E76, -0x19F1, -0x12E3, -0x09FC,  0x0000,  0x13C4,  0x259A,  0x33C2,&lt;br /&gt;
    0x3CDA,  0x3FFF,  0x3CE2,  0x33D1,  0x25AF,  0x13DD,  0x001A, -0x13AC,&lt;br /&gt;
   -0x2585, -0x33B3, -0x3CD3, -0x4000, -0x3CEB, -0x33E1, -0x25C5, -0x13F7,&lt;br /&gt;
    0x0000,  0x1DA6,  0x3867,  0x4DA3,  0x5B47,  0x5FFF,  0x5B53,  0x4DBA,&lt;br /&gt;
    0x3886,  0x1DCB,  0x0027, -0x1D82, -0x3848, -0x4D8D, -0x5B3D, -0x6000,&lt;br /&gt;
   -0x5B61, -0x4DD2, -0x38A7, -0x1DF2,&lt;br /&gt;
    0x0000,  0x2788,  0x4B34,  0x6784,  0x79B5,  0x7FFF,  0x79C5,  0x67A3,&lt;br /&gt;
    0x4B5E,  0x27BA,  0x0034, -0x2758, -0x4B0A, -0x6766, -0x79A6, -0x8000,&lt;br /&gt;
   -0x79D6, -0x67C2, -0x4B89, -0x27ED,&lt;br /&gt;
    0, 0, -20&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 const int16_t LFO_FORM_0B[] = {&lt;br /&gt;
    0x0000,  0x2788,  0x4B34,  0x6784,  0x79B5,  0x7FFF,  0x79C5,  0x67A3,&lt;br /&gt;
    0x4B5E,  0x27BA,  0x0034, -0x2758, -0x4B0A, -0x6766, -0x79A6, -0x8000,&lt;br /&gt;
   -0x79D6, -0x67C2, -0x4B89, -0x27ED,&lt;br /&gt;
    0, 0, -20&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 const int16_t LFO_FORM_08[] = {&lt;br /&gt;
    0x0000,  0x07FF,  0x0FFF,  0x17FF,  0x1FFF,  0x17FF,  0x0FFF,  0x07FF,&lt;br /&gt;
    0x0000, -0x07FF, -0x0FFF, -0x17FF, -0x1FFF, -0x17FF, -0x0FFF, -0x07FF,&lt;br /&gt;
    0x0000,  0x0FFF,  0x1FFF,  0x2FFF,  0x3FFF,  0x2FFF,  0x1FFF,  0x0FFF,&lt;br /&gt;
    0x0000, -0x0FFF, -0x1FFF, -0x2FFF, -0x3FFF, -0x2FFF, -0x1FFF, -0x0FFF,&lt;br /&gt;
    0x0000,  0x17FF,  0x2FFF,  0x47FF,  0x5FFF,  0x47FF,  0x2FFF,  0x17FF,&lt;br /&gt;
    0x0000, -0x17FF, -0x2FFF, -0x47FF, -0x5FFF, -0x47FF, -0x2FFF, -0x17FF,&lt;br /&gt;
    0x0000,  0x1FFF,  0x3FFF,  0x5FFF,  0x7FFF,  0x5FFF,  0x3FFF,  0x1FFF,&lt;br /&gt;
    0x0000, -0x1FFF, -0x3FFF, -0x5FFF, -0x7FFF, -0x5FFF, -0x3FFF, -0x1FFF,&lt;br /&gt;
    0, 0, -16&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 const int16_t LFO_FORM_09[] = {&lt;br /&gt;
    0x0000,  0x1FFF,  0x3FFF,  0x5FFF,  0x7FFF,  0x5FFF,  0x3FFF,  0x1FFF,&lt;br /&gt;
    0x0000, -0x1FFF, -0x3FFF, -0x5FFF, -0x7FFF, -0x5FFF, -0x3FFF, -0x1FFF,&lt;br /&gt;
    0, 0, -16&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 const int16_t LFO_FORM_0C[] = {&lt;br /&gt;
    0x0000,  0x31FD,  0x7D05, -0x0A03, -0x1312,  0x793C,  0x75D0,  0x07FC,&lt;br /&gt;
   -0x0BEF, -0x3D0B,  0x660F,  0x330E,  0x3FEA, -0x411F, -0x73EE,  0x1821,&lt;br /&gt;
   -0x5005,  0x4A00, -0x2C19, -0x0B0B, -0x1EC9, -0x182D,  0x520D,  0x1103,&lt;br /&gt;
   -0x5121,  0x4AF8,  0x0746,  0x70F4, -0x713F, -0x68E7,  0x3512, -0x0A00,&lt;br /&gt;
    0x1B00, -0x4B17,  0x3B1E, -0x51EB, -0x6338,  0x65F9, -0x3CDD,  0x71F8,&lt;br /&gt;
    0x2CF1, -0x59FC, -0x6D04, -0x36F2, -0x4FF7,  0x10E5,  0x0804, -0x7FFF,&lt;br /&gt;
    0x12FA,  0x1118, -0x18F7,  0x47F8, -0x6A27, -0x22E4,  0x1B09,  0x0BF4,&lt;br /&gt;
    0x7BFC,  0x20FF, -0x6BFC,  0x7DFC, -0x750B, -0x48E9,  0x74F9,  0x2AFC,&lt;br /&gt;
   -0x22FA, -0x280D, -0x0B03,  0x0608, -0x0DE8,  0x69DF, -0x43F9,  0x4AF7,&lt;br /&gt;
   -0x7615, -0x44D9,  0x1109,  0x7FEF,  0x3615, -0x1333,  0x7621, -0x67EB,&lt;br /&gt;
    0x56CF, -0x2BFA,  0x3322, -0x201A, -0x50F6, -0x460B, -0x31F8,  0x5D05,&lt;br /&gt;
   -0x4012, -0x0FE6,  0x20E8, -0x60EA, -0x730E, -0x3D19, -0x2DD2, -0x39FF,&lt;br /&gt;
   -0x4630, -0x7EF4,  0x4323,  0x28DD, -0x6909,  0x5C3C, -0x6022, -0x5118,&lt;br /&gt;
   -0x49E5,  0x3EF3,  0x1408, -0x2517,  0x2C0B, -0x4ECD, -0x571F,  0x05DA,&lt;br /&gt;
    0x0914,  0x4E22, -0x0018, -0x780F,  0x21F0, -0x72DB,  0x7DFC,  0x1CF0,&lt;br /&gt;
    0x5E11,  0x3DE8, -0x38F6, -0x70E9, -0x0010,  0x6A0D, -0x001D,  0x12F3,&lt;br /&gt;
    0x041F,  0x780C, -0x3B11,  0x5B02,  0x3D02,  0x02F2,  0x1519, -0x252B,&lt;br /&gt;
   -0x42F7, -0x6DE7, -0x0AFD,  0x62DD,  0x3806,  0x0F26, -0x5705, -0x1F02,&lt;br /&gt;
   -0x091D,  0x0E02,  0x0210,  0x4406, -0x6B2C, -0x2EF6, -0x57BA,  0x10F1,&lt;br /&gt;
    0x1ACC, -0x4203,  0x1A30, -0x5F15,  0x5FEA, -0x40F0, -0x4411, -0x20E5,&lt;br /&gt;
   -0x3DF4,  0x2AE0,  0x3EF2, -0x51D9,  0x5001, -0x0623,  0x3611, -0x52E6,&lt;br /&gt;
    0x07DF,  0x6D05,  0x1A0D, -0x4925,  0x6D2B,  0x3607, -0x0434,  0x4208,&lt;br /&gt;
    0x0F21,  0x36F6, -0x37FA,  0x0603, -0x0229,  0x7817,  0x0605, -0x50F5,&lt;br /&gt;
   -0x6A04,  0x10EC, -0x58F2, -0x520D,  0x660F, -0x420E, -0x2108, -0x1BDF,&lt;br /&gt;
   -0x4E19, -0x0313,  0x5B1C, -0x5EF7, -0x330E, -0x0A0D, -0x6505, -0x4BE9,&lt;br /&gt;
   -0x6D18,  0x7F08,  0x4BFA, -0x7603,  0x3C1C, -0x0311, -0x0D25,  0x4A1D,&lt;br /&gt;
    0x671D, -0x2901,  0x65DA, -0x0E04,  0x6E0A,  0x0A0C,  0x11F8,  0x4A02,&lt;br /&gt;
    0x5BFC, -0x14FA, -0x5A13,  0x30E6, -0x7FEF, -0x2DCC,  0x08F8,  0x43DC,&lt;br /&gt;
   -0x09F7, -0x590E, -0x65F3,  0x7006, -0x0A16, -0x6304, -0x7EE2, -0x521A,&lt;br /&gt;
   -0x19F2, -0x6A09, -0x4CFC, -0x6301, -0x1016, -0x0AE7, -0x0600,  0x3AF6,&lt;br /&gt;
   -0x382B,  0x2722, -0x44C8,  0x43D1,  0x77ED,  0x4908, -0x31FE, -0x54F1,&lt;br /&gt;
    0x3DEB, -0x24F6,  0x6401,  0x3FF9,  0x76F2, -0x6CF7, -0x2DF1,  0x74E5,&lt;br /&gt;
    0, 0, -256&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 const int16_t *LFO_FORMS[] = {&lt;br /&gt;
   LFO_FORM_00,  // 0x00&lt;br /&gt;
   LFO_FORM_01,  // 0x01&lt;br /&gt;
   LFO_FORM_02,  // 0x02&lt;br /&gt;
   LFO_FORM_03,  // 0x03&lt;br /&gt;
   LFO_FORM_04,  // 0x04&lt;br /&gt;
   LFO_FORM_05,  // 0x05&lt;br /&gt;
   LFO_FORM_06,  // 0x06&lt;br /&gt;
   LFO_FORM_07,  // 0x07&lt;br /&gt;
   LFO_FORM_08,  // 0x08&lt;br /&gt;
   LFO_FORM_09,  // 0x09&lt;br /&gt;
   LFO_FORM_0A,  // 0x0a&lt;br /&gt;
   LFO_FORM_0B,  // 0x0b&lt;br /&gt;
   LFO_FORM_0C,  // 0x0c&lt;br /&gt;
   LFO_FORM_09,  // 0x0d&lt;br /&gt;
   LFO_FORM_08,  // 0x0e&lt;br /&gt;
   LFO_FORM_09   // 0x0f&lt;br /&gt;
 };&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Opcodes/0xb4b5&amp;diff=5745</id>
		<title>FF7/PSX/Sound/Opcodes/0xb4b5</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Opcodes/0xb4b5&amp;diff=5745"/>
		<updated>2020-06-09T14:53:11Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: Add raw LFO data. In the future it will be desirable to add waveform visualizations and detailed explanations.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== LFO ==&lt;br /&gt;
&lt;br /&gt;
=== LFO Forms ===&lt;br /&gt;
&lt;br /&gt;
The two zeros are a special prefix for moving the LFO pointer, and the following value indicates the relative offset to move to.&lt;br /&gt;
&lt;br /&gt;
 const int16_t LFO_FORM_00[] = {&lt;br /&gt;
   -0x1FFF,  0x3FFF, -0x3FFF,  0x5FFF, -0x5FFF,&lt;br /&gt;
    0x7FFF, -0x7FFF,&lt;br /&gt;
    0, 0, -2&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 const int16_t LFO_FORM_01[] = {&lt;br /&gt;
    0x7FFF, -0x7FFF,&lt;br /&gt;
    0, 0, -2&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 const int16_t LFO_FORM_02[] = {&lt;br /&gt;
    0x1FFF,  0x0000,  0x3FFF,  0x0000,  0x5FFF,&lt;br /&gt;
    0x0000,  0x7FFF,&lt;br /&gt;
    0, 0, -2&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 const int16_t LFO_FORM_03[] = {&lt;br /&gt;
    0x7FFF,&lt;br /&gt;
    0x0000,  0x7FFF,&lt;br /&gt;
    0, 0, -2&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 const int16_t LFO_FORM_04[] = {&lt;br /&gt;
   -0x1FFF,  0x0000, -0x3FFF,  0x0000, -0x5FFF,&lt;br /&gt;
    0x0000, -0x7FFF,&lt;br /&gt;
    0, 0, -2&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 const int16_t LFO_FORM_05[] = {&lt;br /&gt;
   -0x7FFF,&lt;br /&gt;
    0x0000, -0x7FFF,&lt;br /&gt;
    0, 0, -2&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 const int16_t LFO_FORM_06[] = {&lt;br /&gt;
    0x0000,  0x0500,  0x09E2,  0x12CD,  0x169E,  0x19E1,  0x1C81,  0x1E6D,&lt;br /&gt;
    0x1F9A,  0x1FFF,  0x1F9C,  0x1E71,  0x1C86,  0x19E8,  0x16A7,  0x12D7,&lt;br /&gt;
    0x0E90,  0x09EE,  0x050D,  0x0000, -0x04F4, -0x09D6, -0x0E7A, -0x12C3,&lt;br /&gt;
   -0x1696, -0x19DA, -0x1C7C, -0x1E6A, -0x1F99, -0x2000, -0x1F9F, -0x1E76,&lt;br /&gt;
   -0x1C8D, -0x19F1, -0x16B1, -0x12E3, -0x0E9D, -0x09FC, -0x051B,  0x0000,&lt;br /&gt;
    0x0A01,  0x13C4,  0x259A,  0x2D3C,  0x33C2,  0x3902,  0x3CDA,  0x3F34,&lt;br /&gt;
    0x3FFF,  0x3F38,  0x3CE2,  0x390D,  0x33D1,  0x2D4F,  0x25AF,  0x1D21,&lt;br /&gt;
    0x13DD,  0x0A1B,  0x0000, -0x09E8, -0x13AC, -0x1CF4, -0x2585, -0x2D2B,&lt;br /&gt;
   -0x33B3, -0x38F7, -0x3CD3, -0x3F31, -0x4000, -0x3F3D, -0x3CEB, -0x391A,&lt;br /&gt;
   -0x33E1, -0x2D62, -0x25C5, -0x1D3A, -0x13F7, -0x0A36,  0x0000,  0x0F02,&lt;br /&gt;
    0x1DA6,  0x3867,  0x43DA,  0x4DA3,  0x5583,  0x5B47,  0x5ECE,  0x5FFF,&lt;br /&gt;
    0x5ED4,  0x5B53,  0x5594,  0x4DBA,  0x43F6,  0x3886,  0x2BB2,  0x1DCB,&lt;br /&gt;
    0x0F29,  0x0000, -0x0EDC, -0x1D82, -0x2B6E, -0x3848, -0x43C0, -0x4D8D,&lt;br /&gt;
   -0x5572, -0x5B3D, -0x5EC9, -0x6000, -0x5EDC, -0x5B61, -0x55A7, -0x4DD2,&lt;br /&gt;
   -0x4413, -0x38A7, -0x2BD7, -0x1DF2, -0x0F51,&lt;br /&gt;
    0x0000,  0x1403,  0x2788,  0x4B34,  0x5A79,  0x6784,  0x7204,  0x79B5,&lt;br /&gt;
    0x7E68,  0x7FFF,  0x7E71,  0x79C5,  0x721B,  0x67A3,  0x5A9E,  0x4B5E,&lt;br /&gt;
    0x3A43,  0x27BA,  0x1437,  0x0000, -0x13D0, -0x2758, -0x39E7, -0x4B0A,&lt;br /&gt;
   -0x5A55, -0x6766, -0x71ED, -0x79A6, -0x7E61, -0x8000, -0x7E7A, -0x79D6,&lt;br /&gt;
   -0x7234, -0x67C2, -0x5AC3, -0x4B89, -0x3A73, -0x27ED, -0x146B,&lt;br /&gt;
    0, 0, -39&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 const int16_t LFO_FORM_07[] = {&lt;br /&gt;
    0x0000,  0x1403,  0x2788,  0x4B34,  0x5A79,  0x6784,  0x7204,  0x79B5,&lt;br /&gt;
    0x7E68,  0x7FFF,  0x7E71,  0x79C5,  0x721B,  0x67A3,  0x5A9E,  0x4B5E,&lt;br /&gt;
    0x3A43,  0x27BA,  0x1437,  0x0000, -0x13D0, -0x2758, -0x39E7, -0x4B0A,&lt;br /&gt;
   -0x5A55, -0x6766, -0x71ED, -0x79A6, -0x7E61, -0x8000, -0x7E7A, -0x79D6,&lt;br /&gt;
   -0x7234, -0x67C2, -0x5AC3, -0x4B89, -0x3A73, -0x27ED, -0x146B,&lt;br /&gt;
    0, 0, -39&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 const int16_t LFO_FORM_0A[] = {&lt;br /&gt;
    0x0000,  0x09E2,  0x12CD,  0x19E1,  0x1E6D,  0x1FFF,  0x1E71,  0x19E8,&lt;br /&gt;
    0x12D7,  0x09EE,  0x000D, -0x09D6, -0x12C3, -0x19DA, -0x1E6A, -0x2000,&lt;br /&gt;
   -0x1E76, -0x19F1, -0x12E3, -0x09FC,  0x0000,  0x13C4,  0x259A,  0x33C2,&lt;br /&gt;
    0x3CDA,  0x3FFF,  0x3CE2,  0x33D1,  0x25AF,  0x13DD,  0x001A, -0x13AC,&lt;br /&gt;
   -0x2585, -0x33B3, -0x3CD3, -0x4000, -0x3CEB, -0x33E1, -0x25C5, -0x13F7,&lt;br /&gt;
    0x0000,  0x1DA6,  0x3867,  0x4DA3,  0x5B47,  0x5FFF,  0x5B53,  0x4DBA,&lt;br /&gt;
    0x3886,  0x1DCB,  0x0027, -0x1D82, -0x3848, -0x4D8D, -0x5B3D, -0x6000,&lt;br /&gt;
   -0x5B61, -0x4DD2, -0x38A7, -0x1DF2,&lt;br /&gt;
    0x0000,  0x2788,  0x4B34,  0x6784,  0x79B5,  0x7FFF,  0x79C5,  0x67A3,&lt;br /&gt;
    0x4B5E,  0x27BA,  0x0034, -0x2758, -0x4B0A, -0x6766, -0x79A6, -0x8000,&lt;br /&gt;
   -0x79D6, -0x67C2, -0x4B89, -0x27ED,&lt;br /&gt;
    0, 0, -20&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 const int16_t LFO_FORM_0B[] = {&lt;br /&gt;
    0x0000,  0x2788,  0x4B34,  0x6784,  0x79B5,  0x7FFF,  0x79C5,  0x67A3,&lt;br /&gt;
    0x4B5E,  0x27BA,  0x0034, -0x2758, -0x4B0A, -0x6766, -0x79A6, -0x8000,&lt;br /&gt;
   -0x79D6, -0x67C2, -0x4B89, -0x27ED,&lt;br /&gt;
    0, 0, -20&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 const int16_t LFO_FORM_08[] = {&lt;br /&gt;
    0x0000,  0x07FF,  0x0FFF,  0x17FF,  0x1FFF,  0x17FF,  0x0FFF,  0x07FF,&lt;br /&gt;
    0x0000, -0x07FF, -0x0FFF, -0x17FF, -0x1FFF, -0x17FF, -0x0FFF, -0x07FF,&lt;br /&gt;
    0x0000,  0x0FFF,  0x1FFF,  0x2FFF,  0x3FFF,  0x2FFF,  0x1FFF,  0x0FFF,&lt;br /&gt;
    0x0000, -0x0FFF, -0x1FFF, -0x2FFF, -0x3FFF, -0x2FFF, -0x1FFF, -0x0FFF,&lt;br /&gt;
    0x0000,  0x17FF,  0x2FFF,  0x47FF,  0x5FFF,  0x47FF,  0x2FFF,  0x17FF,&lt;br /&gt;
    0x0000, -0x17FF, -0x2FFF, -0x47FF, -0x5FFF, -0x47FF, -0x2FFF, -0x17FF,&lt;br /&gt;
    0x0000,  0x1FFF,  0x3FFF,  0x5FFF,  0x7FFF,  0x5FFF,  0x3FFF,  0x1FFF,&lt;br /&gt;
    0x0000, -0x1FFF, -0x3FFF, -0x5FFF, -0x7FFF, -0x5FFF, -0x3FFF, -0x1FFF,&lt;br /&gt;
    0, 0, -16&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 const int16_t LFO_FORM_09[] = {&lt;br /&gt;
    0x0000,  0x1FFF,  0x3FFF,  0x5FFF,  0x7FFF,  0x5FFF,  0x3FFF,  0x1FFF,&lt;br /&gt;
    0x0000, -0x1FFF, -0x3FFF, -0x5FFF, -0x7FFF, -0x5FFF, -0x3FFF, -0x1FFF,&lt;br /&gt;
    0, 0, -16&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 const int16_t LFO_FORM_0C[] = {&lt;br /&gt;
    0x0000,  0x31FD,  0x7D05, -0x0A03, -0x1312,  0x793C,  0x75D0,  0x07FC,&lt;br /&gt;
   -0x0BEF, -0x3D0B,  0x660F,  0x330E,  0x3FEA, -0x411F, -0x73EE,  0x1821,&lt;br /&gt;
   -0x5005,  0x4A00, -0x2C19, -0x0B0B, -0x1EC9, -0x182D,  0x520D,  0x1103,&lt;br /&gt;
   -0x5121,  0x4AF8,  0x0746,  0x70F4, -0x713F, -0x68E7,  0x3512, -0x0A00,&lt;br /&gt;
    0x1B00, -0x4B17,  0x3B1E, -0x51EB, -0x6338,  0x65F9, -0x3CDD,  0x71F8,&lt;br /&gt;
    0x2CF1, -0x59FC, -0x6D04, -0x36F2, -0x4FF7,  0x10E5,  0x0804, -0x7FFF,&lt;br /&gt;
    0x12FA,  0x1118, -0x18F7,  0x47F8, -0x6A27, -0x22E4,  0x1B09,  0x0BF4,&lt;br /&gt;
    0x7BFC,  0x20FF, -0x6BFC,  0x7DFC, -0x750B, -0x48E9,  0x74F9,  0x2AFC,&lt;br /&gt;
   -0x22FA, -0x280D, -0x0B03,  0x0608, -0x0DE8,  0x69DF, -0x43F9,  0x4AF7,&lt;br /&gt;
   -0x7615, -0x44D9,  0x1109,  0x7FEF,  0x3615, -0x1333,  0x7621, -0x67EB,&lt;br /&gt;
    0x56CF, -0x2BFA,  0x3322, -0x201A, -0x50F6, -0x460B, -0x31F8,  0x5D05,&lt;br /&gt;
   -0x4012, -0x0FE6,  0x20E8, -0x60EA, -0x730E, -0x3D19, -0x2DD2, -0x39FF,&lt;br /&gt;
   -0x4630, -0x7EF4,  0x4323,  0x28DD, -0x6909,  0x5C3C, -0x6022, -0x5118,&lt;br /&gt;
   -0x49E5,  0x3EF3,  0x1408, -0x2517,  0x2C0B, -0x4ECD, -0x571F,  0x05DA,&lt;br /&gt;
    0x0914,  0x4E22, -0x0018, -0x780F,  0x21F0, -0x72DB,  0x7DFC,  0x1CF0,&lt;br /&gt;
    0x5E11,  0x3DE8, -0x38F6, -0x70E9, -0x0010,  0x6A0D, -0x001D,  0x12F3,&lt;br /&gt;
    0x041F,  0x780C, -0x3B11,  0x5B02,  0x3D02,  0x02F2,  0x1519, -0x252B,&lt;br /&gt;
   -0x42F7, -0x6DE7, -0x0AFD,  0x62DD,  0x3806,  0x0F26, -0x5705, -0x1F02,&lt;br /&gt;
   -0x091D,  0x0E02,  0x0210,  0x4406, -0x6B2C, -0x2EF6, -0x57BA,  0x10F1,&lt;br /&gt;
    0x1ACC, -0x4203,  0x1A30, -0x5F15,  0x5FEA, -0x40F0, -0x4411, -0x20E5,&lt;br /&gt;
   -0x3DF4,  0x2AE0,  0x3EF2, -0x51D9,  0x5001, -0x0623,  0x3611, -0x52E6,&lt;br /&gt;
    0x07DF,  0x6D05,  0x1A0D, -0x4925,  0x6D2B,  0x3607, -0x0434,  0x4208,&lt;br /&gt;
    0x0F21,  0x36F6, -0x37FA,  0x0603, -0x0229,  0x7817,  0x0605, -0x50F5,&lt;br /&gt;
   -0x6A04,  0x10EC, -0x58F2, -0x520D,  0x660F, -0x420E, -0x2108, -0x1BDF,&lt;br /&gt;
   -0x4E19, -0x0313,  0x5B1C, -0x5EF7, -0x330E, -0x0A0D, -0x6505, -0x4BE9,&lt;br /&gt;
   -0x6D18,  0x7F08,  0x4BFA, -0x7603,  0x3C1C, -0x0311, -0x0D25,  0x4A1D,&lt;br /&gt;
    0x671D, -0x2901,  0x65DA, -0x0E04,  0x6E0A,  0x0A0C,  0x11F8,  0x4A02,&lt;br /&gt;
    0x5BFC, -0x14FA, -0x5A13,  0x30E6, -0x7FEF, -0x2DCC,  0x08F8,  0x43DC,&lt;br /&gt;
   -0x09F7, -0x590E, -0x65F3,  0x7006, -0x0A16, -0x6304, -0x7EE2, -0x521A,&lt;br /&gt;
   -0x19F2, -0x6A09, -0x4CFC, -0x6301, -0x1016, -0x0AE7, -0x0600,  0x3AF6,&lt;br /&gt;
   -0x382B,  0x2722, -0x44C8,  0x43D1,  0x77ED,  0x4908, -0x31FE, -0x54F1,&lt;br /&gt;
    0x3DEB, -0x24F6,  0x6401,  0x3FF9,  0x76F2, -0x6CF7, -0x2DF1,  0x74E5,&lt;br /&gt;
    0, 0, -256&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 const int16_t *LFO_FORMS[] = {&lt;br /&gt;
   LFO_FORM_00,  // 0x00&lt;br /&gt;
   LFO_FORM_01,  // 0x01&lt;br /&gt;
   LFO_FORM_02,  // 0x02&lt;br /&gt;
   LFO_FORM_03,  // 0x03&lt;br /&gt;
   LFO_FORM_04,  // 0x04&lt;br /&gt;
   LFO_FORM_05,  // 0x05&lt;br /&gt;
   LFO_FORM_06,  // 0x06&lt;br /&gt;
   LFO_FORM_07,  // 0x07&lt;br /&gt;
   LFO_FORM_08,  // 0x08&lt;br /&gt;
   LFO_FORM_09,  // 0x09&lt;br /&gt;
   LFO_FORM_0a,  // 0x0a&lt;br /&gt;
   LFO_FORM_0b,  // 0x0b&lt;br /&gt;
   LFO_FORM_0c,  // 0x0c&lt;br /&gt;
   LFO_FORM_09,  // 0x0d&lt;br /&gt;
   LFO_FORM_08,  // 0x0e&lt;br /&gt;
   LFO_FORM_09   // 0x0f&lt;br /&gt;
 };&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Code_Map&amp;diff=5743</id>
		<title>FF7/PSX/Sound/Code Map</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Code_Map&amp;diff=5743"/>
		<updated>2020-06-07T15:31:24Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Code Map =&lt;br /&gt;
&lt;br /&gt;
Introduces functions, variables and data related to sound, contained in SCUS_941.63 (game program of US version). Note that all symbol names below are for convenience only.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x800293D0&lt;br /&gt;
|void _AkaoSpuTransferCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800293F4&lt;br /&gt;
|void _AkaoSpuSetTransferCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029424&lt;br /&gt;
|unsigned int _AkaoTransferSamples(const unsigned char *addr, unsigned int size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800294A4&lt;br /&gt;
|void _AkaoWaitForSpuTransfer(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800294BC&lt;br /&gt;
|void _AkaoReset(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800297A4&lt;br /&gt;
|void AkaoLoadInstrumentSet(const sturct AkaoSampleSet *sampleSet, const struct AkaoInstrumentAttr *instrumentSet)&lt;br /&gt;
|Load standard instrument set&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR.DAT&lt;br /&gt;
&lt;br /&gt;
This function is called transparently from 0x8002988C.&lt;br /&gt;
|-&lt;br /&gt;
|0x80029818&lt;br /&gt;
|void AkaoLoadInstrumentSet2(const sturct AkaoSampleSet *sampleSet, const struct AkaoInstrumentAttr *instrumentSet)&lt;br /&gt;
|Load additional instrument set&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR2.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR2.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x8002988C&lt;br /&gt;
|void AkaoInitialize(const sturct AkaoSampleSet *sampleSet, const struct AkaoInstrumentAttr *instrumentSet)&lt;br /&gt;
|Initialize sound driver and load initial instruments&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x800299C8&lt;br /&gt;
|void AkaoDeinitialize(void)&lt;br /&gt;
|Deinitialize sound driver&lt;br /&gt;
|-&lt;br /&gt;
|0x80029AF0&lt;br /&gt;
|void AkaoSetReverbMode(int mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029B78&lt;br /&gt;
|void _AkaoTransferSeqBody(const unsigned char *data, int size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029C48&lt;br /&gt;
|void _AkaoLoadTracks(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002DA30&lt;br /&gt;
|void AkaoNewMessage(struct AkaoMessage **ppMessage)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002DA7C&lt;br /&gt;
|int AkaoPostMessage(void)&lt;br /&gt;
|Post a new command message to the queue (with some wrapped processing)&lt;br /&gt;
&lt;br /&gt;
The message data comes from a global variable at 0x8009A000.&lt;br /&gt;
&lt;br /&gt;
Return value depends on the content of the message data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Opcode 0x10'''&lt;br /&gt;
&lt;br /&gt;
Load and start playing new [[FF7/PSX/Sound/AKAO sequence|AKAO sequence]]&lt;br /&gt;
&lt;br /&gt;
Returns: 0 for success, 1 for already loaded, and -1 for invalid signature&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Opcode 0x92'''&lt;br /&gt;
&lt;br /&gt;
Set value to the condition variable used by Opcode 0xEF.&lt;br /&gt;
|-&lt;br /&gt;
|0x8002E1A8&lt;br /&gt;
|void _AkaoDispatchMessages(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002E23C&lt;br /&gt;
|void _AkaoWriteSpuRegisters(int voiceNum, struct AkaoSpuVoiceAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002E478&lt;br /&gt;
|void _AkaoDspOnTick(struct AkaoPlayerTrack *track, struct AkaoPlayer *player, int voiceMask)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002ED34&lt;br /&gt;
|void _AkaoCalculateVolumeAndPitch(struct AkaoPlayerTrack *track, int voiceMask, int voiceNum)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002F24C&lt;br /&gt;
|void _AkaoCalculateVolumeAndPitch2(struct AkaoPlayerTrack *track, int voiceMask)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002F738&lt;br /&gt;
|void _AkaoDspOverlayVoice(struct AkaoPlayerTrack *track, int unknownVoiceMask, int voiceNum)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002F848&lt;br /&gt;
|void _AkaoDspMain(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002FF4C&lt;br /&gt;
|void _AkaoSpuNoiseVoice(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030038&lt;br /&gt;
|void _AkaoSpuReverbVoice(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030148&lt;br /&gt;
|void _AkaoSpuPitchLFOVoice(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030234&lt;br /&gt;
|int _AkaoTimerCallback(void)&lt;br /&gt;
|Sound callback event that is periodically triggered by root counter 2&lt;br /&gt;
|-&lt;br /&gt;
|0x800308D4&lt;br /&gt;
|void _AkaoMain(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030E7C&lt;br /&gt;
|void _AkaoDispatchVoice(struct AkaoPlayerTrack *track, struct AkaoPlayer *player, int voiceMask)&lt;br /&gt;
|Dispatch voice opcodes until the next note or end of track&lt;br /&gt;
|-&lt;br /&gt;
|0x80031820&lt;br /&gt;
|void AkaoSetInstrument(struct AkaoPlayerTrack *track, unsigned short progNumber)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800318BC&lt;br /&gt;
|int _AkaoReadNextNote(struct AkaoPlayerTrack *track)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80031A70&lt;br /&gt;
|int _AkaoFindNextEndPoint(struct AkaoPlayerTrack *track)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80049548&lt;br /&gt;
|void (* const MESSAGE_HANDLERS[256])(struct AkaoMessage *)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80049948&lt;br /&gt;
|const unsigned char VOICE_OPCODE_LENGTHS[0x60]&lt;br /&gt;
|Length table for voice opcodes 0xa0-0xff&lt;br /&gt;
&lt;br /&gt;
0 for end of track and branches&lt;br /&gt;
|-&lt;br /&gt;
|0x80049AA8&lt;br /&gt;
|void (* const VOICE_OPCODES[0x60])(struct AkaoPlayerTrack *, struct AkaoPlayer *, int)&lt;br /&gt;
|Address table for voice opcodes 0xa0-0xff&lt;br /&gt;
|-&lt;br /&gt;
|0x80049C28&lt;br /&gt;
|const unsigned short DELTA_TIME_TABLE[11];&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80049C44&lt;br /&gt;
|const unsigned short VOLUME_TABLE_L[128]&lt;br /&gt;
|See [[FF7/PSX/Sound/Opcodes/0xa8aa|Opcode 0xAA]] for volume balance calculation&lt;br /&gt;
|-&lt;br /&gt;
|0x80049E44&lt;br /&gt;
|const unsigned short VOLUME_TABLE_R[128]&lt;br /&gt;
|See [[FF7/PSX/Sound/Opcodes/0xa8aa|Opcode 0xAA]] for volume balance calculation&lt;br /&gt;
|-&lt;br /&gt;
|0x8004A5CC&lt;br /&gt;
|const short *LFO_FORMS[16]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8004A60C&lt;br /&gt;
|const unsigned char EMPTY_ADPCM[32]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80063010&lt;br /&gt;
|int g_AkaoNumQueuedMessages&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80081DC8&lt;br /&gt;
|AkaoMessage g_AkaoMessageQueue[]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80083580&lt;br /&gt;
|unsigned char g_AkaoSeqData[]&lt;br /&gt;
|RAM area to load AKAO sequence data&lt;br /&gt;
|-&lt;br /&gt;
|0x8009A000&lt;br /&gt;
|AkaoMessage g_AkaoMessage&lt;br /&gt;
|Message data to be posted. Processed by the function 0x8002DA7C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Runtime Library Functions ==&lt;br /&gt;
&lt;br /&gt;
=== LIBSPU ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x80036298&lt;br /&gt;
|void SpuInit(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80036FFC&lt;br /&gt;
|long SpuInitMalloc(long num, char *top)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800373AC&lt;br /&gt;
|long SpuMallocWithStartAddr(unsigned long addr, long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037964&lt;br /&gt;
|unsigned long SpuSetNoiseVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037B90&lt;br /&gt;
|long SpuSetNoiseClock(long n_clock)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037BE0&lt;br /&gt;
|unsigned long SpuRead(unsigned char *addr, unsigned long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037C40&lt;br /&gt;
|long SpuSetReverb(long on_off)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037D90&lt;br /&gt;
|long SpuGetReverb(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037E1C&lt;br /&gt;
|long SpuSetReverbModeParam(SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800387FC&lt;br /&gt;
|void SpuGetReverbModeParam (SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003884C&lt;br /&gt;
|long SpuSetReverbDepth(SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800388C4&lt;br /&gt;
|unsigned long SpuSetReverbVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800388E8&lt;br /&gt;
|long SpuClearReverbWorkArea(long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038A84&lt;br /&gt;
|long SpuSetIRQ(long on_off)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038BC4&lt;br /&gt;
|unsigned long SpuSetIRQAddr(unsigned long addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038C04&lt;br /&gt;
|SpuIRQCallbackProc SpuSetIRQCallback(SpuIRQCallbackProc func)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038C6C&lt;br /&gt;
|void SpuSetKey(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038F04&lt;br /&gt;
|unsigned long SpuWrite(unsigned char *addr, unsigned long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038F64&lt;br /&gt;
|unsigned long SpuSetTransferStartAddr(unsigned long addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038FB8&lt;br /&gt;
|long SpuSetTransferMode(long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038FEC&lt;br /&gt;
|SpuTransferCallbackProc SpuSetTransferCallback(SpuTransferCallbackProc func)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039010&lt;br /&gt;
|unsigned long SpuSetPitchLFOVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039034&lt;br /&gt;
|void SpuSetCommonAttr(SpuCommonAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800393C8&lt;br /&gt;
|void SpuSetVoiceVolume(int voiceNum, short volL, short volR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039450&lt;br /&gt;
|void SpuSetVoiceVolumeAttr(int voiceNum, short volL, short volR, short volModeL, short volModeR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800395C8&lt;br /&gt;
|void SpuSetVoicePitch(int voiceNum, unsigned short pitch)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039644&lt;br /&gt;
|void SpuSetVoiceStartAddr(int voiceNum, unsigned long startAddr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800396C0&lt;br /&gt;
|void SpuSetVoiceLoopStartAddr(int voiceNum, unsigned long lsa)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003973C&lt;br /&gt;
|void SpuSetVoiceDR(int voiceNum, unsigned short DR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800397C8&lt;br /&gt;
|void SpuSetVoiceSL(int voiceNum, unsigned short SL)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039850&lt;br /&gt;
|void SpuSetVoiceARAttr(int voiceNum, unsigned short AR, long ARmode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800398EC&lt;br /&gt;
|void SpuSetVoiceSRAttr(int voiceNum, unsigned short SR, long SRmode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800399D0&lt;br /&gt;
|void SpuSetVoiceRRAttr(int voiceNum, unsigned short RR, long RRmode)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LIBETC ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D0C0&lt;br /&gt;
|int ResetCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D150&lt;br /&gt;
|int VSyncCallback(void (*func)(void))&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D1B4&lt;br /&gt;
|int StopCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D214&lt;br /&gt;
|int CheckCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LIBAPI ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x800429F0&lt;br /&gt;
|void DeliverEvent(unsigned long ev1, unsigned long ev2)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A00&lt;br /&gt;
|long OpenEvent(unsigned long desc, long spec, long mode, long (*func)())&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A10&lt;br /&gt;
|long CloseEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A20&lt;br /&gt;
|long WaitEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A40&lt;br /&gt;
|long EnableEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A50&lt;br /&gt;
|long DisableEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042BC0&lt;br /&gt;
|long SetRCnt(unsigned long spec, unsigned short target, long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042C60&lt;br /&gt;
|long GetRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042C98&lt;br /&gt;
|long StartRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042CCC&lt;br /&gt;
|long StopRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Structures =&lt;br /&gt;
&lt;br /&gt;
[[FF7/PSX/Sound/INSTRx.DAT|struct AkaoInstrumentAttr]]&lt;br /&gt;
&lt;br /&gt;
[[FF7/PSX/Sound/INSTRx.ALL|struct AkaoSampleSet]]&lt;br /&gt;
&lt;br /&gt;
[[FF7/PSX/Sound/AKAO sequence|struct AkaoSeqHeader, struct AkaoDrumKeyAttr]]&lt;br /&gt;
&lt;br /&gt;
 struct AkaoMessage // 36 bytes long&lt;br /&gt;
 {&lt;br /&gt;
   uint16_t opcode;&lt;br /&gt;
   uint16_t reserved;&lt;br /&gt;
   uint32_t data[8];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoSpuVoiceAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t voice;          // 0x00: voice number&lt;br /&gt;
   uint32_t update_flags;   // 0x04: bitset that indicates what SPU registers need to be updated&lt;br /&gt;
   uint32_t addr;           // 0x08: waveform data start address (SPU address)&lt;br /&gt;
   uint32_t loop_addr;      // 0x0c: loop start address (SPU address)&lt;br /&gt;
   uint32_t a_mode;         // 0x10: ADSR: attack rate mode&lt;br /&gt;
   uint32_t s_mode;         // 0x14: ADSR: sustain rate mode&lt;br /&gt;
   uint32_t r_mode          // 0x18: ADSR: release rate mode&lt;br /&gt;
   uint16_t pitch;          // 0x1c: pitch&lt;br /&gt;
   uint16_t ar;             // 0x1e: ADSR: attack rate&lt;br /&gt;
   uint16_t dr;             // 0x20: ADSR: decay rate&lt;br /&gt;
   uint16_t sl;             // 0x22: ADSR: sustain level&lt;br /&gt;
   uint16_t sr;             // 0x24: ADSR: sustain rate&lt;br /&gt;
   uint16_t rr;             // 0x26: ADSR: release rate&lt;br /&gt;
   SpuVolume volume;        // 0x28: volume (left and right)&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoPlayer // the music player instance exists at 0x8009A104&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t stereo_mode;                 // 0x00: stereo mode (1: stereo, 4: surround, otherwise: mono)&lt;br /&gt;
   uint32_t active_voices;               // 0x04: bitset that indicates the voices currently in use&lt;br /&gt;
   uint32_t key_on_voices;               // 0x08: bitset that indicates the voices to key on&lt;br /&gt;
   uint32_t keyed_voices;                // 0x0c: bitset that indicates the voices currently keyed on&lt;br /&gt;
   uint32_t key_off_voices;              // 0x10: bitset that indicates the voices to key off&lt;br /&gt;
   uint32_t saved_active_voices;         // 0x14: unknown voice bitset&lt;br /&gt;
   uint32_t tempo;                       // 0x18: tempo (Q16 fixed-point number)&lt;br /&gt;
   int32_t tempo_slope;                  // 0x1c: slope of tempo slider (Q16 fixed-point number)&lt;br /&gt;
   uint32_t time_counter;                // 0x20: time counter (0x10000 = 1 tick)&lt;br /&gt;
   uint32_t overlay_voices;              // 0x24: bitset that indicates the sub-voices used for overlay (opcode 0xF4)&lt;br /&gt;
   uint32_t alternate_voices;            // 0x28: bitset that indicates the sub-voices used for alternate voice (opcode 0xF8)&lt;br /&gt;
   uint32_t noise_voices;                // 0x2c: bitset that indicates the voices with noise mode enabled&lt;br /&gt;
   uint32_t reverb_voices;               // 0x30: bitset that indicates the voices with reverb enabled&lt;br /&gt;
   uint32_t pitch_lfo_voices;            // 0x34: bitset that indicates the voices with pitch LFO (frequency modulation) mode enabled&lt;br /&gt;
   uint32_t spucnt;                      // 0x38: SPUCNT shadow&lt;br /&gt;
   uint32_t reverb_type;                 // 0x3c: reverb type&lt;br /&gt;
   uint32_t reverb_depth;                // 0x40: reverb depth (Q16 fixed-point number)&lt;br /&gt;
   int32_t reverb_depth_slope;           // 0x44: slope of reverb depth slider (Q16 fixed-point number)&lt;br /&gt;
   uint16_t tempo_slide_length;          // 0x48: tempo slide length&lt;br /&gt;
   uint16_t song_id;                     // 0x4a: current song id&lt;br /&gt;
   uint16_t condition_ack;               // 0x4c: the last matched condition value (opcode 0xEF)&lt;br /&gt;
   uint16_t condition;                   // 0x4e: condition variable for dynamic branching according to game status (opcode 0xEF)&lt;br /&gt;
   uint16_t reverb_depth_slide_length;   // 0x50: length of reverb depth slide&lt;br /&gt;
   uint16_t noise_clock;                 // 0x52: noise clock frequency&lt;br /&gt;
   uint16_t field_54;                    // 0x54: unknown&lt;br /&gt;
   uint16_t beats_per_measure;           // 0x56: beats per measure&lt;br /&gt;
   uint16_t beat;                        // 0x58: current beat&lt;br /&gt;
   uint16_t ticks_per_beat;              // 0x5a: ticks per beat&lt;br /&gt;
   uint16_t tick;                        // 0x5c: current ticks per beat&lt;br /&gt;
   uint16_t measure;                     // 0x5e: current measure&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoPlayerTrack // the music player track instances exist at 0x80096608 + (N * 0x108)&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t *addr;                                    // 0x00&lt;br /&gt;
   uint8_t *loop_addrs[4];                           // 0x04&lt;br /&gt;
   AkaoDrumKeyAttr *drum_addr;                       // 0x14&lt;br /&gt;
   int16_t *vibrato_lfo_addr;                        // 0x18&lt;br /&gt;
   int16_t *tremolo_lfo_addr;                        // 0x1c&lt;br /&gt;
   int16_t *pan_lfo_addr;                            // 0x20&lt;br /&gt;
   uint32_t overlay_voice_num;                       // 0x24&lt;br /&gt;
   uint32_t alternate_voice_num;                     // 0x28&lt;br /&gt;
   uint32_t master_volume;                           // 0x2c&lt;br /&gt;
   uint32_t pitch_of_note;                           // 0x30&lt;br /&gt;
   int32_t pitch_bend_slide_amplitude;               // 0x34&lt;br /&gt;
   uint16_t voice_effect_flags;                      // 0x38&lt;br /&gt;
   uint16_t field_3A;                                // 0x3a&lt;br /&gt;
   uint16_t field_3C;                                // 0x3c&lt;br /&gt;
   uint16_t field_3E;                                // 0x3e&lt;br /&gt;
   uint32_t field_40;                                // 0x40&lt;br /&gt;
   uint32_t volume;                                  // 0x44&lt;br /&gt;
   int32_t volume_slope;                             // 0x48&lt;br /&gt;
   int32_t pitch_bend_slope;                         // 0x4c&lt;br /&gt;
   uint16_t field_50;                                // 0x50&lt;br /&gt;
   uint16_t field_52;                                // 0x52&lt;br /&gt;
   uint16_t field_54;                                // 0x54&lt;br /&gt;
   uint8_t delta_time_counter;                       // 0x56&lt;br /&gt;
   uint8_t gate_time_counter;                        // 0x57&lt;br /&gt;
   uint16_t instrument;                              // 0x58&lt;br /&gt;
   uint16_t field_5A;                                // 0x5a&lt;br /&gt;
   uint16_t volume_slide_length_counter;             // 0x5c&lt;br /&gt;
   uint16_t overlay_balance_slide_length_counter;    // 0x5e&lt;br /&gt;
   uint16_t pan;                                     // 0x60&lt;br /&gt;
   uint16_t pan_slide_length;                        // 0x62&lt;br /&gt;
   int16_t pitch_slide_length_counter;               // 0x64&lt;br /&gt;
   uint16_t octave;                                  // 0x66&lt;br /&gt;
   uint16_t pitch_slide_length;                      // 0x68&lt;br /&gt;
   uint16_t previous_note_number;                    // 0x6a&lt;br /&gt;
   uint16_t portamento_speed;                        // 0x6c&lt;br /&gt;
   uint16_t legato_flags;                            // 0x6e&lt;br /&gt;
   uint16_t field_70;                                // 0x70&lt;br /&gt;
   uint16_t vibrato_lfo_delay;                       // 0x72&lt;br /&gt;
   uint16_t vibrato_delay_counter;                   // 0x74&lt;br /&gt;
   uint16_t vibrato_rate;                            // 0x76&lt;br /&gt;
   uint16_t vibrato_rate_counter;                    // 0x78&lt;br /&gt;
   uint16_t vibrato_form;                            // 0x7a&lt;br /&gt;
   uint16_t vibrato_max_amplitude;                   // 0x7c&lt;br /&gt;
   uint16_t vibrato_depth;                           // 0x7e&lt;br /&gt;
   uint16_t vibrato_depth_slide_length_counter;      // 0x80&lt;br /&gt;
   int16_t vibrato_depth_slope;                      // 0x82&lt;br /&gt;
   uint16_t field_84;                                // 0x84&lt;br /&gt;
   uint16_t tremolo_delay;                           // 0x86&lt;br /&gt;
   uint16_t tremolo_delay_counter;                   // 0x88&lt;br /&gt;
   uint16_t tremolo_rate;                            // 0x8a&lt;br /&gt;
   uint16_t tremolo_rate_counter;                    // 0x8c&lt;br /&gt;
   uint16_t tremolo_form;                            // 0x8e&lt;br /&gt;
   uint16_t tremolo_depth;                           // 0x90&lt;br /&gt;
   uint16_t tremolo_depth_slide_length_counter;      // 0x92&lt;br /&gt;
   int16_t tremolo_depth_slope;                      // 0x94&lt;br /&gt;
   uint16_t field_96;                                // 0x96&lt;br /&gt;
   uint16_t pan_lfo_rate;                            // 0x98&lt;br /&gt;
   uint16_t pan_lfo_rate_counter;                    // 0x9a&lt;br /&gt;
   uint16_t pan_lfo_form;                            // 0x9c&lt;br /&gt;
   uint16_t pan_lfo_depth;                           // 0x9e&lt;br /&gt;
   uint16_t pan_lfo_depth_slide_length_counter;      // 0xa0&lt;br /&gt;
   int16_t pan_lfo_slope;                            // 0xa2&lt;br /&gt;
   uint16_t noise_on_off_delay_counter;              // 0xa4&lt;br /&gt;
   uint16_t pitchmod_on_off_delay_counter;           // 0xa6&lt;br /&gt;
   uint8_t field_A8[16];                             // 0xa8&lt;br /&gt;
   uint16_t loop_layer;                              // 0xb8&lt;br /&gt;
   uint16_t loop_counts[4];                          // 0xba&lt;br /&gt;
   uint16_t previous_delta_time;                     // 0xc2&lt;br /&gt;
   uint16_t forced_delta_time;                       // 0xc4&lt;br /&gt;
   uint16_t overlay_balance;                         // 0xc6&lt;br /&gt;
   int16_t overlay_balance_slope;                    // 0xc8&lt;br /&gt;
   int16_t pan_slope;                                // 0xca&lt;br /&gt;
   int16_t transpose;                                // 0xcc&lt;br /&gt;
   int16_t tuning;                                   // 0xce&lt;br /&gt;
   uint16_t note;                                    // 0xd0&lt;br /&gt;
   int16_t pitch_slide_amount;                       // 0xd2&lt;br /&gt;
   int16_t previous_transpose;                       // 0xd4&lt;br /&gt;
   int16_t vibrato_lfo_amplitude;                    // 0xd6&lt;br /&gt;
   int16_t tremolo_lfo_amplitude;                    // 0xd8&lt;br /&gt;
   int16_t pan_lfo_amplitude;                        // 0xda&lt;br /&gt;
   AkaoSpuVoiceAttr spu_attr;                        // 0xdc&lt;br /&gt;
 };&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Code_Map&amp;diff=5742</id>
		<title>FF7/PSX/Sound/Code Map</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Code_Map&amp;diff=5742"/>
		<updated>2020-06-07T15:28:26Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Code Map =&lt;br /&gt;
&lt;br /&gt;
Introduces functions, variables and data related to sound, contained in SCUS_941.63 (game program of US version). Note that all symbol names below are for convenience only.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x800293D0&lt;br /&gt;
|void _AkaoSpuTransferCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800293F4&lt;br /&gt;
|void _AkaoSpuSetTransferCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029424&lt;br /&gt;
|unsigned int _AkaoTransferSamples(const unsigned char *addr, unsigned int size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800294A4&lt;br /&gt;
|void _AkaoWaitForSpuTransfer(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800294BC&lt;br /&gt;
|void _AkaoReset(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800297A4&lt;br /&gt;
|void AkaoLoadInstrumentSet(const sturct AkaoSampleSet *sampleSet, const struct AkaoInstrumentAttr *instrumentSet)&lt;br /&gt;
|Load standard instrument set&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR.DAT&lt;br /&gt;
&lt;br /&gt;
This function is called transparently from 0x8002988C.&lt;br /&gt;
|-&lt;br /&gt;
|0x80029818&lt;br /&gt;
|void AkaoLoadInstrumentSet2(const sturct AkaoSampleSet *sampleSet, const struct AkaoInstrumentAttr *instrumentSet)&lt;br /&gt;
|Load additional instrument set&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR2.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR2.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x8002988C&lt;br /&gt;
|void AkaoInitialize(const sturct AkaoSampleSet *sampleSet, const struct AkaoInstrumentAttr *instrumentSet)&lt;br /&gt;
|Initialize sound driver and load initial instruments&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x800299C8&lt;br /&gt;
|void AkaoDeinitialize(void)&lt;br /&gt;
|Deinitialize sound driver&lt;br /&gt;
|-&lt;br /&gt;
|0x80029AF0&lt;br /&gt;
|void AkaoSetReverbMode(int mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029B78&lt;br /&gt;
|void _AkaoTransferSeqBody(const unsigned char *data, int size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029C48&lt;br /&gt;
|void _AkaoLoadTracks(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002DA30&lt;br /&gt;
|void AkaoNewMessage(AkaoMessage **ppMessage)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002DA7C&lt;br /&gt;
|int AkaoPostMessage(void)&lt;br /&gt;
|Post a new command message to the queue (with some wrapped processing)&lt;br /&gt;
&lt;br /&gt;
The message data comes from a global variable at 0x8009A000.&lt;br /&gt;
&lt;br /&gt;
Return value depends on the content of the message data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Opcode 0x10'''&lt;br /&gt;
&lt;br /&gt;
Load and start playing new [[FF7/PSX/Sound/AKAO sequence|AKAO sequence]]&lt;br /&gt;
&lt;br /&gt;
Returns: 0 for success, 1 for already loaded, and -1 for invalid signature&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Opcode 0x92'''&lt;br /&gt;
&lt;br /&gt;
Set value to the condition variable used by Opcode 0xEF.&lt;br /&gt;
|-&lt;br /&gt;
|0x8002E1A8&lt;br /&gt;
|void _AkaoDispatchMessages(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002E23C&lt;br /&gt;
|void _AkaoWriteSpuRegisters(int voiceNum, struct AkaoSpuVoiceAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002E478&lt;br /&gt;
|void _AkaoDspOnTick(struct AkaoPlayerTrack *track, AkaoPlayer *player, int voiceMask)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002ED34&lt;br /&gt;
|void _AkaoCalculateVolumeAndPitch(struct AkaoPlayerTrack *track, int voiceMask, int voiceNum)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002F24C&lt;br /&gt;
|void _AkaoCalculateVolumeAndPitch2(struct AkaoPlayerTrack *track, int voiceMask)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002F738&lt;br /&gt;
|void _AkaoDspOverlayVoice(struct AkaoPlayerTrack *track, int unknownVoiceMask, int voiceNum)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002F848&lt;br /&gt;
|void _AkaoDspMain(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002FF4C&lt;br /&gt;
|void _AkaoSpuNoiseVoice(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030038&lt;br /&gt;
|void _AkaoSpuReverbVoice(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030148&lt;br /&gt;
|void _AkaoSpuPitchLFOVoice(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030234&lt;br /&gt;
|int _AkaoTimerCallback(void)&lt;br /&gt;
|Sound callback event that is periodically triggered by root counter 2&lt;br /&gt;
|-&lt;br /&gt;
|0x800308D4&lt;br /&gt;
|void _AkaoMain(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030E7C&lt;br /&gt;
|void _AkaoDispatchVoice(struct AkaoPlayerTrack *track, struct AkaoPlayer *player, int voiceMask)&lt;br /&gt;
|Dispatch voice opcodes until the next note or end of track&lt;br /&gt;
|-&lt;br /&gt;
|0x80031820&lt;br /&gt;
|void AkaoSetInstrument(struct AkaoPlayerTrack *track, unsigned short progNumber)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800318BC&lt;br /&gt;
|int _AkaoReadNextNote(struct AkaoPlayerTrack *track)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80031A70&lt;br /&gt;
|int _AkaoFindNextEndPoint(struct AkaoPlayerTrack *track)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80049548&lt;br /&gt;
|void (* const MESSAGE_HANDLERS[256])(struct AkaoMessage *)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80049948&lt;br /&gt;
|const unsigned char VOICE_OPCODE_LENGTHS[0x60]&lt;br /&gt;
|Length table for voice opcodes 0xa0-0xff&lt;br /&gt;
&lt;br /&gt;
0 for end of track and branches&lt;br /&gt;
|-&lt;br /&gt;
|0x80049AA8&lt;br /&gt;
|void (* const VOICE_OPCODES[0x60])(struct AkaoPlayerTrack *, struct AkaoPlayer *, int)&lt;br /&gt;
|Address table for voice opcodes 0xa0-0xff&lt;br /&gt;
|-&lt;br /&gt;
|0x80049C28&lt;br /&gt;
|const unsigned short DELTA_TIME_TABLE[11];&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80049C44&lt;br /&gt;
|const unsigned short VOLUME_TABLE_L[128]&lt;br /&gt;
|See [[FF7/PSX/Sound/Opcodes/0xa8aa|Opcode 0xAA]] for volume balance calculation&lt;br /&gt;
|-&lt;br /&gt;
|0x80049E44&lt;br /&gt;
|const unsigned short VOLUME_TABLE_R[128]&lt;br /&gt;
|See [[FF7/PSX/Sound/Opcodes/0xa8aa|Opcode 0xAA]] for volume balance calculation&lt;br /&gt;
|-&lt;br /&gt;
|0x8004A5CC&lt;br /&gt;
|const short *LFO_FORMS[16]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8004A60C&lt;br /&gt;
|const unsigned char EMPTY_ADPCM[32]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80083580&lt;br /&gt;
|unsigned char g_AkaoSeqData[]&lt;br /&gt;
|RAM area to load AKAO sequence data&lt;br /&gt;
|-&lt;br /&gt;
|0x8009A000&lt;br /&gt;
|AkaoMessage g_AkaoMessage&lt;br /&gt;
|Message data to be posted. Processed by the function 0x8002DA7C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Runtime Library Functions ==&lt;br /&gt;
&lt;br /&gt;
=== LIBSPU ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x80036298&lt;br /&gt;
|void SpuInit(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80036FFC&lt;br /&gt;
|long SpuInitMalloc(long num, char *top)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800373AC&lt;br /&gt;
|long SpuMallocWithStartAddr(unsigned long addr, long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037964&lt;br /&gt;
|unsigned long SpuSetNoiseVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037B90&lt;br /&gt;
|long SpuSetNoiseClock(long n_clock)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037BE0&lt;br /&gt;
|unsigned long SpuRead(unsigned char *addr, unsigned long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037C40&lt;br /&gt;
|long SpuSetReverb(long on_off)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037D90&lt;br /&gt;
|long SpuGetReverb(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037E1C&lt;br /&gt;
|long SpuSetReverbModeParam(SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800387FC&lt;br /&gt;
|void SpuGetReverbModeParam (SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003884C&lt;br /&gt;
|long SpuSetReverbDepth(SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800388C4&lt;br /&gt;
|unsigned long SpuSetReverbVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800388E8&lt;br /&gt;
|long SpuClearReverbWorkArea(long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038A84&lt;br /&gt;
|long SpuSetIRQ(long on_off)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038BC4&lt;br /&gt;
|unsigned long SpuSetIRQAddr(unsigned long addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038C04&lt;br /&gt;
|SpuIRQCallbackProc SpuSetIRQCallback(SpuIRQCallbackProc func)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038C6C&lt;br /&gt;
|void SpuSetKey(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038F04&lt;br /&gt;
|unsigned long SpuWrite(unsigned char *addr, unsigned long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038F64&lt;br /&gt;
|unsigned long SpuSetTransferStartAddr(unsigned long addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038FB8&lt;br /&gt;
|long SpuSetTransferMode(long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038FEC&lt;br /&gt;
|SpuTransferCallbackProc SpuSetTransferCallback(SpuTransferCallbackProc func)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039010&lt;br /&gt;
|unsigned long SpuSetPitchLFOVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039034&lt;br /&gt;
|void SpuSetCommonAttr(SpuCommonAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800393C8&lt;br /&gt;
|void SpuSetVoiceVolume(int voiceNum, short volL, short volR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039450&lt;br /&gt;
|void SpuSetVoiceVolumeAttr(int voiceNum, short volL, short volR, short volModeL, short volModeR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800395C8&lt;br /&gt;
|void SpuSetVoicePitch(int voiceNum, unsigned short pitch)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039644&lt;br /&gt;
|void SpuSetVoiceStartAddr(int voiceNum, unsigned long startAddr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800396C0&lt;br /&gt;
|void SpuSetVoiceLoopStartAddr(int voiceNum, unsigned long lsa)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003973C&lt;br /&gt;
|void SpuSetVoiceDR(int voiceNum, unsigned short DR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800397C8&lt;br /&gt;
|void SpuSetVoiceSL(int voiceNum, unsigned short SL)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039850&lt;br /&gt;
|void SpuSetVoiceARAttr(int voiceNum, unsigned short AR, long ARmode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800398EC&lt;br /&gt;
|void SpuSetVoiceSRAttr(int voiceNum, unsigned short SR, long SRmode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800399D0&lt;br /&gt;
|void SpuSetVoiceRRAttr(int voiceNum, unsigned short RR, long RRmode)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LIBETC ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D0C0&lt;br /&gt;
|int ResetCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D150&lt;br /&gt;
|int VSyncCallback(void (*func)(void))&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D1B4&lt;br /&gt;
|int StopCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D214&lt;br /&gt;
|int CheckCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LIBAPI ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x800429F0&lt;br /&gt;
|void DeliverEvent(unsigned long ev1, unsigned long ev2)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A00&lt;br /&gt;
|long OpenEvent(unsigned long desc, long spec, long mode, long (*func)())&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A10&lt;br /&gt;
|long CloseEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A20&lt;br /&gt;
|long WaitEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A40&lt;br /&gt;
|long EnableEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A50&lt;br /&gt;
|long DisableEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042BC0&lt;br /&gt;
|long SetRCnt(unsigned long spec, unsigned short target, long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042C60&lt;br /&gt;
|long GetRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042C98&lt;br /&gt;
|long StartRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042CCC&lt;br /&gt;
|long StopRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Structures =&lt;br /&gt;
&lt;br /&gt;
[[FF7/PSX/Sound/INSTRx.DAT|struct AkaoInstrumentAttr]]&lt;br /&gt;
&lt;br /&gt;
[[FF7/PSX/Sound/INSTRx.ALL|struct AkaoSampleSet]]&lt;br /&gt;
&lt;br /&gt;
[[FF7/PSX/Sound/AKAO sequence|struct AkaoSeqHeader, struct AkaoDrumKeyAttr]]&lt;br /&gt;
&lt;br /&gt;
 struct AkaoMessage // 36 bytes long&lt;br /&gt;
 {&lt;br /&gt;
   uint16_t opcode;&lt;br /&gt;
   uint16_t reserved;&lt;br /&gt;
   uint32_t data[8];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoSpuVoiceAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t voice;          // 0x00: voice number&lt;br /&gt;
   uint32_t update_flags;   // 0x04: bitset that indicates what SPU registers need to be updated&lt;br /&gt;
   uint32_t addr;           // 0x08: waveform data start address (SPU address)&lt;br /&gt;
   uint32_t loop_addr;      // 0x0c: loop start address (SPU address)&lt;br /&gt;
   uint32_t a_mode;         // 0x10: ADSR: attack rate mode&lt;br /&gt;
   uint32_t s_mode;         // 0x14: ADSR: sustain rate mode&lt;br /&gt;
   uint32_t r_mode          // 0x18: ADSR: release rate mode&lt;br /&gt;
   uint16_t pitch;          // 0x1c: pitch&lt;br /&gt;
   uint16_t ar;             // 0x1e: ADSR: attack rate&lt;br /&gt;
   uint16_t dr;             // 0x20: ADSR: decay rate&lt;br /&gt;
   uint16_t sl;             // 0x22: ADSR: sustain level&lt;br /&gt;
   uint16_t sr;             // 0x24: ADSR: sustain rate&lt;br /&gt;
   uint16_t rr;             // 0x26: ADSR: release rate&lt;br /&gt;
   SpuVolume volume;        // 0x28: volume (left and right)&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoPlayer // the music player instance exists at 0x8009A104&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t stereo_mode;                 // 0x00: stereo mode (1: stereo, 4: surround, otherwise: mono)&lt;br /&gt;
   uint32_t active_voices;               // 0x04: bitset that indicates the voices currently in use&lt;br /&gt;
   uint32_t key_on_voices;               // 0x08: bitset that indicates the voices to key on&lt;br /&gt;
   uint32_t keyed_voices;                // 0x0c: bitset that indicates the voices currently keyed on&lt;br /&gt;
   uint32_t key_off_voices;              // 0x10: bitset that indicates the voices to key off&lt;br /&gt;
   uint32_t saved_active_voices;         // 0x14: unknown voice bitset&lt;br /&gt;
   uint32_t tempo;                       // 0x18: tempo (Q16 fixed-point number)&lt;br /&gt;
   int32_t tempo_slope;                  // 0x1c: slope of tempo slider (Q16 fixed-point number)&lt;br /&gt;
   uint32_t time_counter;                // 0x20: time counter (0x10000 = 1 tick)&lt;br /&gt;
   uint32_t overlay_voices;              // 0x24: bitset that indicates the sub-voices used for overlay (opcode 0xF4)&lt;br /&gt;
   uint32_t alternate_voices;            // 0x28: bitset that indicates the sub-voices used for alternate voice (opcode 0xF8)&lt;br /&gt;
   uint32_t noise_voices;                // 0x2c: bitset that indicates the voices with noise mode enabled&lt;br /&gt;
   uint32_t reverb_voices;               // 0x30: bitset that indicates the voices with reverb enabled&lt;br /&gt;
   uint32_t pitch_lfo_voices;            // 0x34: bitset that indicates the voices with pitch LFO (frequency modulation) mode enabled&lt;br /&gt;
   uint32_t spucnt;                      // 0x38: SPUCNT shadow&lt;br /&gt;
   uint32_t reverb_type;                 // 0x3c: reverb type&lt;br /&gt;
   uint32_t reverb_depth;                // 0x40: reverb depth (Q16 fixed-point number)&lt;br /&gt;
   int32_t reverb_depth_slope;           // 0x44: slope of reverb depth slider (Q16 fixed-point number)&lt;br /&gt;
   uint16_t tempo_slide_length;          // 0x48: tempo slide length&lt;br /&gt;
   uint16_t song_id;                     // 0x4a: current song id&lt;br /&gt;
   uint16_t condition_ack;               // 0x4c: the last matched condition value (opcode 0xEF)&lt;br /&gt;
   uint16_t condition;                   // 0x4e: condition variable for dynamic branching according to game status (opcode 0xEF)&lt;br /&gt;
   uint16_t reverb_depth_slide_length;   // 0x50: length of reverb depth slide&lt;br /&gt;
   uint16_t noise_clock;                 // 0x52: noise clock frequency&lt;br /&gt;
   uint16_t field_54;                    // 0x54: unknown&lt;br /&gt;
   uint16_t beats_per_measure;           // 0x56: beats per measure&lt;br /&gt;
   uint16_t beat;                        // 0x58: current beat&lt;br /&gt;
   uint16_t ticks_per_beat;              // 0x5a: ticks per beat&lt;br /&gt;
   uint16_t tick;                        // 0x5c: current ticks per beat&lt;br /&gt;
   uint16_t measure;                     // 0x5e: current measure&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoPlayerTrack // the music player track instances exist at 0x80096608 + (N * 0x108)&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t *addr;                                    // 0x00&lt;br /&gt;
   uint8_t *loop_addrs[4];                           // 0x04&lt;br /&gt;
   AkaoDrumKeyAttr *drum_addr;                       // 0x14&lt;br /&gt;
   int16_t *vibrato_lfo_addr;                        // 0x18&lt;br /&gt;
   int16_t *tremolo_lfo_addr;                        // 0x1c&lt;br /&gt;
   int16_t *pan_lfo_addr;                            // 0x20&lt;br /&gt;
   uint32_t overlay_voice_num;                       // 0x24&lt;br /&gt;
   uint32_t alternate_voice_num;                     // 0x28&lt;br /&gt;
   uint32_t master_volume;                           // 0x2c&lt;br /&gt;
   uint32_t pitch_of_note;                           // 0x30&lt;br /&gt;
   int32_t pitch_bend_slide_amplitude;               // 0x34&lt;br /&gt;
   uint16_t voice_effect_flags;                      // 0x38&lt;br /&gt;
   uint16_t field_3A;                                // 0x3a&lt;br /&gt;
   uint16_t field_3C;                                // 0x3c&lt;br /&gt;
   uint16_t field_3E;                                // 0x3e&lt;br /&gt;
   uint32_t field_40;                                // 0x40&lt;br /&gt;
   uint32_t volume;                                  // 0x44&lt;br /&gt;
   int32_t volume_slope;                             // 0x48&lt;br /&gt;
   int32_t pitch_bend_slope;                         // 0x4c&lt;br /&gt;
   uint16_t field_50;                                // 0x50&lt;br /&gt;
   uint16_t field_52;                                // 0x52&lt;br /&gt;
   uint16_t field_54;                                // 0x54&lt;br /&gt;
   uint8_t delta_time_counter;                       // 0x56&lt;br /&gt;
   uint8_t gate_time_counter;                        // 0x57&lt;br /&gt;
   uint16_t instrument;                              // 0x58&lt;br /&gt;
   uint16_t field_5A;                                // 0x5a&lt;br /&gt;
   uint16_t volume_slide_length_counter;             // 0x5c&lt;br /&gt;
   uint16_t overlay_balance_slide_length_counter;    // 0x5e&lt;br /&gt;
   uint16_t pan;                                     // 0x60&lt;br /&gt;
   uint16_t pan_slide_length;                        // 0x62&lt;br /&gt;
   int16_t pitch_slide_length_counter;               // 0x64&lt;br /&gt;
   uint16_t octave;                                  // 0x66&lt;br /&gt;
   uint16_t pitch_slide_length;                      // 0x68&lt;br /&gt;
   uint16_t previous_note_number;                    // 0x6a&lt;br /&gt;
   uint16_t portamento_speed;                        // 0x6c&lt;br /&gt;
   uint16_t legato_flags;                            // 0x6e&lt;br /&gt;
   uint16_t field_70;                                // 0x70&lt;br /&gt;
   uint16_t vibrato_lfo_delay;                       // 0x72&lt;br /&gt;
   uint16_t vibrato_delay_counter;                   // 0x74&lt;br /&gt;
   uint16_t vibrato_rate;                            // 0x76&lt;br /&gt;
   uint16_t vibrato_rate_counter;                    // 0x78&lt;br /&gt;
   uint16_t vibrato_form;                            // 0x7a&lt;br /&gt;
   uint16_t vibrato_max_amplitude;                   // 0x7c&lt;br /&gt;
   uint16_t vibrato_depth;                           // 0x7e&lt;br /&gt;
   uint16_t vibrato_depth_slide_length_counter;      // 0x80&lt;br /&gt;
   int16_t vibrato_depth_slope;                      // 0x82&lt;br /&gt;
   uint16_t field_84;                                // 0x84&lt;br /&gt;
   uint16_t tremolo_delay;                           // 0x86&lt;br /&gt;
   uint16_t tremolo_delay_counter;                   // 0x88&lt;br /&gt;
   uint16_t tremolo_rate;                            // 0x8a&lt;br /&gt;
   uint16_t tremolo_rate_counter;                    // 0x8c&lt;br /&gt;
   uint16_t tremolo_form;                            // 0x8e&lt;br /&gt;
   uint16_t tremolo_depth;                           // 0x90&lt;br /&gt;
   uint16_t tremolo_depth_slide_length_counter;      // 0x92&lt;br /&gt;
   int16_t tremolo_depth_slope;                      // 0x94&lt;br /&gt;
   uint16_t field_96;                                // 0x96&lt;br /&gt;
   uint16_t pan_lfo_rate;                            // 0x98&lt;br /&gt;
   uint16_t pan_lfo_rate_counter;                    // 0x9a&lt;br /&gt;
   uint16_t pan_lfo_form;                            // 0x9c&lt;br /&gt;
   uint16_t pan_lfo_depth;                           // 0x9e&lt;br /&gt;
   uint16_t pan_lfo_depth_slide_length_counter;      // 0xa0&lt;br /&gt;
   int16_t pan_lfo_slope;                            // 0xa2&lt;br /&gt;
   uint16_t noise_on_off_delay_counter;              // 0xa4&lt;br /&gt;
   uint16_t pitchmod_on_off_delay_counter;           // 0xa6&lt;br /&gt;
   uint8_t field_A8[16];                             // 0xa8&lt;br /&gt;
   uint16_t loop_layer;                              // 0xb8&lt;br /&gt;
   uint16_t loop_counts[4];                          // 0xba&lt;br /&gt;
   uint16_t previous_delta_time;                     // 0xc2&lt;br /&gt;
   uint16_t forced_delta_time;                       // 0xc4&lt;br /&gt;
   uint16_t overlay_balance;                         // 0xc6&lt;br /&gt;
   int16_t overlay_balance_slope;                    // 0xc8&lt;br /&gt;
   int16_t pan_slope;                                // 0xca&lt;br /&gt;
   int16_t transpose;                                // 0xcc&lt;br /&gt;
   int16_t tuning;                                   // 0xce&lt;br /&gt;
   uint16_t note;                                    // 0xd0&lt;br /&gt;
   int16_t pitch_slide_amount;                       // 0xd2&lt;br /&gt;
   int16_t previous_transpose;                       // 0xd4&lt;br /&gt;
   int16_t vibrato_lfo_amplitude;                    // 0xd6&lt;br /&gt;
   int16_t tremolo_lfo_amplitude;                    // 0xd8&lt;br /&gt;
   int16_t pan_lfo_amplitude;                        // 0xda&lt;br /&gt;
   AkaoSpuVoiceAttr spu_attr;                        // 0xdc&lt;br /&gt;
 };&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Code_Map&amp;diff=5741</id>
		<title>FF7/PSX/Sound/Code Map</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Code_Map&amp;diff=5741"/>
		<updated>2020-06-07T15:13:03Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Code Map =&lt;br /&gt;
&lt;br /&gt;
Introduces functions, variables and data related to sound, contained in SCUS_941.63 (game program of US version). Note that all symbol names below are for convenience only.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x800293D0&lt;br /&gt;
|void _AkaoSpuTransferCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800293F4&lt;br /&gt;
|void _AkaoSpuSetTransferCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029424&lt;br /&gt;
|unsigned int _AkaoTransferSamples(const unsigned char *addr, unsigned int size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800294A4&lt;br /&gt;
|void _AkaoWaitForSpuTransfer(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800294BC&lt;br /&gt;
|void _AkaoReset(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800297A4&lt;br /&gt;
|void AkaoLoadInstrumentSet(const sturct AkaoSampleSet *sampleSet, const struct AkaoInstrumentAttr *instrumentSet)&lt;br /&gt;
|Load standard instrument set&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR.DAT&lt;br /&gt;
&lt;br /&gt;
This function is called transparently from 0x8002988C.&lt;br /&gt;
|-&lt;br /&gt;
|0x80029818&lt;br /&gt;
|void AkaoLoadInstrumentSet2(const sturct AkaoSampleSet *sampleSet, const struct AkaoInstrumentAttr *instrumentSet)&lt;br /&gt;
|Load additional instrument set&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR2.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR2.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x8002988C&lt;br /&gt;
|void AkaoInitialize(const sturct AkaoSampleSet *sampleSet, const struct AkaoInstrumentAttr *instrumentSet)&lt;br /&gt;
|Initialize sound driver and load initial instruments&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x800299C8&lt;br /&gt;
|void AkaoDeinitialize(void)&lt;br /&gt;
|Deinitialize sound driver&lt;br /&gt;
|-&lt;br /&gt;
|0x80029AF0&lt;br /&gt;
|void AkaoSetReverbMode(int mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029B78&lt;br /&gt;
|void _AkaoTransferSeqBody(const unsigned char *data, int size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029C48&lt;br /&gt;
|void _AkaoLoadTracks(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002DA30&lt;br /&gt;
|void AkaoNewMessage(AkaoMessage **ppMessage)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002DA7C&lt;br /&gt;
|int AkaoPostMessage(void)&lt;br /&gt;
|Post a new command message to the queue (with some wrapped processing)&lt;br /&gt;
&lt;br /&gt;
The message data comes from a global variable at 0x8009A000.&lt;br /&gt;
&lt;br /&gt;
Return value depends on the content of the message data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Opcode 0x10'''&lt;br /&gt;
&lt;br /&gt;
Load and start playing new [[FF7/PSX/Sound/AKAO sequence|AKAO sequence]]&lt;br /&gt;
&lt;br /&gt;
Returns: 0 for success, 1 for already loaded, and -1 for invalid signature&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Opcode 0x92'''&lt;br /&gt;
&lt;br /&gt;
Set value to the condition variable used by Opcode 0xEF.&lt;br /&gt;
|-&lt;br /&gt;
|0x8002E1A8&lt;br /&gt;
|void _AkaoDispatchMessages(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002E23C&lt;br /&gt;
|void _AkaoWriteSpuRegisters(int voiceNum, AkaoSpuVoiceAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002E478&lt;br /&gt;
|void _AkaoDspOnTick(AkaoPlayerTrack *track, AkaoPlayer *player, int voiceMask)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002ED34&lt;br /&gt;
|void _AkaoCalculateVolumeAndPitch(AkaoPlayerTrack *track, int voiceMask, int voiceNum)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002F24C&lt;br /&gt;
|void _AkaoCalculateVolumeAndPitch2(AkaoPlayerTrack *track, int voiceMask)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002F738&lt;br /&gt;
|void _AkaoDspOverlayVoice(AkaoPlayerTrack *track, int unknownVoiceMask, int voiceNum)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002F848&lt;br /&gt;
|void _AkaoDspMain(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002FF4C&lt;br /&gt;
|void _AkaoSpuNoiseVoice(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030038&lt;br /&gt;
|void _AkaoSpuReverbVoice(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030148&lt;br /&gt;
|void _AkaoSpuPitchLFOVoice(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030234&lt;br /&gt;
|int _AkaoTimerCallback(void)&lt;br /&gt;
|Sound callback event that is periodically triggered by root counter 2&lt;br /&gt;
|-&lt;br /&gt;
|0x800308D4&lt;br /&gt;
|void _AkaoMain(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030E7C&lt;br /&gt;
|void _AkaoDispatchVoice(AkaoPlayerTrack *track, AkaoPlayer *player, int voiceMask)&lt;br /&gt;
|Dispatch voice opcodes until the next note or end of track&lt;br /&gt;
|-&lt;br /&gt;
|0x80031820&lt;br /&gt;
|void AkaoSetInstrument(AkaoPlayerTrack *track, unsigned short progNumber)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800318BC&lt;br /&gt;
|int _AkaoReadNextNote(AkaoPlayerTrack *track)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80031A70&lt;br /&gt;
|int _AkaoFindNextEndPoint(AkaoPlayerTrack *track)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80049548&lt;br /&gt;
|void (* const MESSAGE_HANDLERS[256])(struct AkaoMessage *)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80049948&lt;br /&gt;
|const unsigned char VOICE_OPCODE_LENGTHS[0x60]&lt;br /&gt;
|Length table for voice opcodes 0xa0-0xff&lt;br /&gt;
&lt;br /&gt;
0 for end of track and branches&lt;br /&gt;
|-&lt;br /&gt;
|0x80049AA8&lt;br /&gt;
|void (* const VOICE_OPCODES[0x60])(struct MusicPlayerTrack *, void *, int)&lt;br /&gt;
|Address table for voice opcodes 0xa0-0xff&lt;br /&gt;
|-&lt;br /&gt;
|0x80049C28&lt;br /&gt;
|const unsigned short DELTA_TIME_TABLE[11];&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80049C44&lt;br /&gt;
|const unsigned short VOLUME_TABLE_L[128]&lt;br /&gt;
|See [[FF7/PSX/Sound/Opcodes/0xa8aa|Opcode 0xAA]] for volume balance calculation&lt;br /&gt;
|-&lt;br /&gt;
|0x80049E44&lt;br /&gt;
|const unsigned short VOLUME_TABLE_R[128]&lt;br /&gt;
|See [[FF7/PSX/Sound/Opcodes/0xa8aa|Opcode 0xAA]] for volume balance calculation&lt;br /&gt;
|-&lt;br /&gt;
|0x8004A5CC&lt;br /&gt;
|const short *LFO_FORMS[16]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8004A60C&lt;br /&gt;
|const unsigned char EMPTY_ADPCM[32]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80083580&lt;br /&gt;
|unsigned char g_AkaoSeqData[]&lt;br /&gt;
|RAM area to load AKAO sequence data&lt;br /&gt;
|-&lt;br /&gt;
|0x8009A000&lt;br /&gt;
|AkaoMessage g_AkaoMessage&lt;br /&gt;
|Message data to be posted. Processed by the function 0x8002DA7C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Runtime Library Functions ==&lt;br /&gt;
&lt;br /&gt;
=== LIBSPU ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x80036298&lt;br /&gt;
|void SpuInit(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80036FFC&lt;br /&gt;
|long SpuInitMalloc(long num, char *top)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800373AC&lt;br /&gt;
|long SpuMallocWithStartAddr(unsigned long addr, long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037964&lt;br /&gt;
|unsigned long SpuSetNoiseVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037B90&lt;br /&gt;
|long SpuSetNoiseClock(long n_clock)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037BE0&lt;br /&gt;
|unsigned long SpuRead(unsigned char *addr, unsigned long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037C40&lt;br /&gt;
|long SpuSetReverb(long on_off)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037D90&lt;br /&gt;
|long SpuGetReverb(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037E1C&lt;br /&gt;
|long SpuSetReverbModeParam(SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800387FC&lt;br /&gt;
|void SpuGetReverbModeParam (SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003884C&lt;br /&gt;
|long SpuSetReverbDepth(SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800388C4&lt;br /&gt;
|unsigned long SpuSetReverbVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800388E8&lt;br /&gt;
|long SpuClearReverbWorkArea(long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038A84&lt;br /&gt;
|long SpuSetIRQ(long on_off)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038BC4&lt;br /&gt;
|unsigned long SpuSetIRQAddr(unsigned long addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038C04&lt;br /&gt;
|SpuIRQCallbackProc SpuSetIRQCallback(SpuIRQCallbackProc func)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038C6C&lt;br /&gt;
|void SpuSetKey(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038F04&lt;br /&gt;
|unsigned long SpuWrite(unsigned char *addr, unsigned long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038F64&lt;br /&gt;
|unsigned long SpuSetTransferStartAddr(unsigned long addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038FB8&lt;br /&gt;
|long SpuSetTransferMode(long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038FEC&lt;br /&gt;
|SpuTransferCallbackProc SpuSetTransferCallback(SpuTransferCallbackProc func)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039010&lt;br /&gt;
|unsigned long SpuSetPitchLFOVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039034&lt;br /&gt;
|void SpuSetCommonAttr(SpuCommonAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800393C8&lt;br /&gt;
|void SpuSetVoiceVolume(int voiceNum, short volL, short volR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039450&lt;br /&gt;
|void SpuSetVoiceVolumeAttr(int voiceNum, short volL, short volR, short volModeL, short volModeR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800395C8&lt;br /&gt;
|void SpuSetVoicePitch(int voiceNum, unsigned short pitch)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039644&lt;br /&gt;
|void SpuSetVoiceStartAddr(int voiceNum, unsigned long startAddr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800396C0&lt;br /&gt;
|void SpuSetVoiceLoopStartAddr(int voiceNum, unsigned long lsa)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003973C&lt;br /&gt;
|void SpuSetVoiceDR(int voiceNum, unsigned short DR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800397C8&lt;br /&gt;
|void SpuSetVoiceSL(int voiceNum, unsigned short SL)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039850&lt;br /&gt;
|void SpuSetVoiceARAttr(int voiceNum, unsigned short AR, long ARmode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800398EC&lt;br /&gt;
|void SpuSetVoiceSRAttr(int voiceNum, unsigned short SR, long SRmode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800399D0&lt;br /&gt;
|void SpuSetVoiceRRAttr(int voiceNum, unsigned short RR, long RRmode)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LIBETC ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D0C0&lt;br /&gt;
|int ResetCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D150&lt;br /&gt;
|int VSyncCallback(void (*func)(void))&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D1B4&lt;br /&gt;
|int StopCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D214&lt;br /&gt;
|int CheckCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LIBAPI ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x800429F0&lt;br /&gt;
|void DeliverEvent(unsigned long ev1, unsigned long ev2)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A00&lt;br /&gt;
|long OpenEvent(unsigned long desc, long spec, long mode, long (*func)())&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A10&lt;br /&gt;
|long CloseEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A20&lt;br /&gt;
|long WaitEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A40&lt;br /&gt;
|long EnableEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A50&lt;br /&gt;
|long DisableEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042BC0&lt;br /&gt;
|long SetRCnt(unsigned long spec, unsigned short target, long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042C60&lt;br /&gt;
|long GetRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042C98&lt;br /&gt;
|long StartRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042CCC&lt;br /&gt;
|long StopRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Structures =&lt;br /&gt;
&lt;br /&gt;
[[FF7/PSX/Sound/INSTRx.DAT|struct AkaoInstrumentAttr]]&lt;br /&gt;
&lt;br /&gt;
[[FF7/PSX/Sound/INSTRx.ALL|struct AkaoSampleSet]]&lt;br /&gt;
&lt;br /&gt;
[[FF7/PSX/Sound/AKAO sequence|struct AkaoSeqHeader, struct AkaoDrumKeyAttr]]&lt;br /&gt;
&lt;br /&gt;
 struct AkaoMessage // 36 bytes long&lt;br /&gt;
 {&lt;br /&gt;
   uint16_t opcode;&lt;br /&gt;
   uint16_t reserved;&lt;br /&gt;
   uint32_t data[8];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoSpuVoiceAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t voice;          // 0x00: voice number&lt;br /&gt;
   uint32_t update_flags;   // 0x04: bitset that indicates what SPU registers need to be updated&lt;br /&gt;
   uint32_t addr;           // 0x08: waveform data start address (SPU address)&lt;br /&gt;
   uint32_t loop_addr;      // 0x0c: loop start address (SPU address)&lt;br /&gt;
   uint32_t a_mode;         // 0x10: ADSR: attack rate mode&lt;br /&gt;
   uint32_t s_mode;         // 0x14: ADSR: sustain rate mode&lt;br /&gt;
   uint32_t r_mode          // 0x18: ADSR: release rate mode&lt;br /&gt;
   uint16_t pitch;          // 0x1c: pitch&lt;br /&gt;
   uint16_t ar;             // 0x1e: ADSR: attack rate&lt;br /&gt;
   uint16_t dr;             // 0x20: ADSR: decay rate&lt;br /&gt;
   uint16_t sl;             // 0x22: ADSR: sustain level&lt;br /&gt;
   uint16_t sr;             // 0x24: ADSR: sustain rate&lt;br /&gt;
   uint16_t rr;             // 0x26: ADSR: release rate&lt;br /&gt;
   SpuVolume volume;        // 0x28: volume (left and right)&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoPlayer // the music player instance exists at 0x8009A104&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t stereo_mode;                 // 0x00: stereo mode (1: stereo, 4: surround, otherwise: mono)&lt;br /&gt;
   uint32_t active_voices;               // 0x04: bitset that indicates the voices currently in use&lt;br /&gt;
   uint32_t key_on_voices;               // 0x08: bitset that indicates the voices to key on&lt;br /&gt;
   uint32_t keyed_voices;                // 0x0c: bitset that indicates the voices currently keyed on&lt;br /&gt;
   uint32_t key_off_voices;              // 0x10: bitset that indicates the voices to key off&lt;br /&gt;
   uint32_t saved_active_voices;         // 0x14: unknown voice bitset&lt;br /&gt;
   uint32_t tempo;                       // 0x18: tempo (Q16 fixed-point number)&lt;br /&gt;
   int32_t tempo_slope;                  // 0x1c: slope of tempo slider (Q16 fixed-point number)&lt;br /&gt;
   uint32_t time_counter;                // 0x20: time counter (0x10000 = 1 tick)&lt;br /&gt;
   uint32_t overlay_voices;              // 0x24: bitset that indicates the sub-voices used for overlay (opcode 0xF4)&lt;br /&gt;
   uint32_t alternate_voices;            // 0x28: bitset that indicates the sub-voices used for alternate voice (opcode 0xF8)&lt;br /&gt;
   uint32_t noise_voices;                // 0x2c: bitset that indicates the voices with noise mode enabled&lt;br /&gt;
   uint32_t reverb_voices;               // 0x30: bitset that indicates the voices with reverb enabled&lt;br /&gt;
   uint32_t pitch_lfo_voices;            // 0x34: bitset that indicates the voices with pitch LFO (frequency modulation) mode enabled&lt;br /&gt;
   uint32_t spucnt;                      // 0x38: SPUCNT shadow&lt;br /&gt;
   uint32_t reverb_type;                 // 0x3c: reverb type&lt;br /&gt;
   uint32_t reverb_depth;                // 0x40: reverb depth (Q16 fixed-point number)&lt;br /&gt;
   int32_t reverb_depth_slope;           // 0x44: slope of reverb depth slider (Q16 fixed-point number)&lt;br /&gt;
   uint16_t tempo_slide_length;          // 0x48: tempo slide length&lt;br /&gt;
   uint16_t song_id;                     // 0x4a: current song id&lt;br /&gt;
   uint16_t condition_ack;               // 0x4c: the last matched condition value (opcode 0xEF)&lt;br /&gt;
   uint16_t condition;                   // 0x4e: condition variable for dynamic branching according to game status (opcode 0xEF)&lt;br /&gt;
   uint16_t reverb_depth_slide_length;   // 0x50: length of reverb depth slide&lt;br /&gt;
   uint16_t noise_clock;                 // 0x52: noise clock frequency&lt;br /&gt;
   uint16_t field_54;                    // 0x54: unknown&lt;br /&gt;
   uint16_t beats_per_measure;           // 0x56: beats per measure&lt;br /&gt;
   uint16_t beat;                        // 0x58: current beat&lt;br /&gt;
   uint16_t ticks_per_beat;              // 0x5a: ticks per beat&lt;br /&gt;
   uint16_t tick;                        // 0x5c: current ticks per beat&lt;br /&gt;
   uint16_t measure;                     // 0x5e: current measure&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoPlayerTrack // the music player track instances exist at 0x80096608 + (N * 0x108)&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t *addr;                                    // 0x00&lt;br /&gt;
   uint8_t *loop_addrs[4];                           // 0x04&lt;br /&gt;
   AkaoDrumKeyAttr *drum_addr;                       // 0x14&lt;br /&gt;
   int16_t *vibrato_lfo_addr;                        // 0x18&lt;br /&gt;
   int16_t *tremolo_lfo_addr;                        // 0x1c&lt;br /&gt;
   int16_t *pan_lfo_addr;                            // 0x20&lt;br /&gt;
   uint32_t overlay_voice_num;                       // 0x24&lt;br /&gt;
   uint32_t alternate_voice_num;                     // 0x28&lt;br /&gt;
   uint32_t master_volume;                           // 0x2c&lt;br /&gt;
   uint32_t pitch_of_note;                           // 0x30&lt;br /&gt;
   int32_t pitch_bend_slide_amplitude;               // 0x34&lt;br /&gt;
   uint16_t voice_effect_flags;                      // 0x38&lt;br /&gt;
   uint16_t field_3A;                                // 0x3a&lt;br /&gt;
   uint16_t field_3C;                                // 0x3c&lt;br /&gt;
   uint16_t field_3E;                                // 0x3e&lt;br /&gt;
   uint32_t field_40;                                // 0x40&lt;br /&gt;
   uint32_t volume;                                  // 0x44&lt;br /&gt;
   int32_t volume_slope;                             // 0x48&lt;br /&gt;
   int32_t pitch_bend_slope;                         // 0x4c&lt;br /&gt;
   uint16_t field_50;                                // 0x50&lt;br /&gt;
   uint16_t field_52;                                // 0x52&lt;br /&gt;
   uint16_t field_54;                                // 0x54&lt;br /&gt;
   uint8_t delta_time_counter;                       // 0x56&lt;br /&gt;
   uint8_t gate_time_counter;                        // 0x57&lt;br /&gt;
   uint16_t instrument;                              // 0x58&lt;br /&gt;
   uint16_t field_5A;                                // 0x5a&lt;br /&gt;
   uint16_t volume_slide_length_counter;             // 0x5c&lt;br /&gt;
   uint16_t overlay_balance_slide_length_counter;    // 0x5e&lt;br /&gt;
   uint16_t pan;                                     // 0x60&lt;br /&gt;
   uint16_t pan_slide_length;                        // 0x62&lt;br /&gt;
   int16_t pitch_slide_length_counter;               // 0x64&lt;br /&gt;
   uint16_t octave;                                  // 0x66&lt;br /&gt;
   uint16_t pitch_slide_length;                      // 0x68&lt;br /&gt;
   uint16_t previous_note_number;                    // 0x6a&lt;br /&gt;
   uint16_t portamento_speed;                        // 0x6c&lt;br /&gt;
   uint16_t legato_flags;                            // 0x6e&lt;br /&gt;
   uint16_t field_70;                                // 0x70&lt;br /&gt;
   uint16_t vibrato_lfo_delay;                       // 0x72&lt;br /&gt;
   uint16_t vibrato_delay_counter;                   // 0x74&lt;br /&gt;
   uint16_t vibrato_rate;                            // 0x76&lt;br /&gt;
   uint16_t vibrato_rate_counter;                    // 0x78&lt;br /&gt;
   uint16_t vibrato_form;                            // 0x7a&lt;br /&gt;
   uint16_t vibrato_max_amplitude;                   // 0x7c&lt;br /&gt;
   uint16_t vibrato_depth;                           // 0x7e&lt;br /&gt;
   uint16_t vibrato_depth_slide_length_counter;      // 0x80&lt;br /&gt;
   int16_t vibrato_depth_slope;                      // 0x82&lt;br /&gt;
   uint16_t field_84;                                // 0x84&lt;br /&gt;
   uint16_t tremolo_delay;                           // 0x86&lt;br /&gt;
   uint16_t tremolo_delay_counter;                   // 0x88&lt;br /&gt;
   uint16_t tremolo_rate;                            // 0x8a&lt;br /&gt;
   uint16_t tremolo_rate_counter;                    // 0x8c&lt;br /&gt;
   uint16_t tremolo_form;                            // 0x8e&lt;br /&gt;
   uint16_t tremolo_depth;                           // 0x90&lt;br /&gt;
   uint16_t tremolo_depth_slide_length_counter;      // 0x92&lt;br /&gt;
   int16_t tremolo_depth_slope;                      // 0x94&lt;br /&gt;
   uint16_t field_96;                                // 0x96&lt;br /&gt;
   uint16_t pan_lfo_rate;                            // 0x98&lt;br /&gt;
   uint16_t pan_lfo_rate_counter;                    // 0x9a&lt;br /&gt;
   uint16_t pan_lfo_form;                            // 0x9c&lt;br /&gt;
   uint16_t pan_lfo_depth;                           // 0x9e&lt;br /&gt;
   uint16_t pan_lfo_depth_slide_length_counter;      // 0xa0&lt;br /&gt;
   int16_t pan_lfo_slope;                            // 0xa2&lt;br /&gt;
   uint16_t noise_on_off_delay_counter;              // 0xa4&lt;br /&gt;
   uint16_t pitchmod_on_off_delay_counter;           // 0xa6&lt;br /&gt;
   uint8_t field_A8[16];                             // 0xa8&lt;br /&gt;
   uint16_t loop_layer;                              // 0xb8&lt;br /&gt;
   uint16_t loop_counts[4];                          // 0xba&lt;br /&gt;
   uint16_t previous_delta_time;                     // 0xc2&lt;br /&gt;
   uint16_t forced_delta_time;                       // 0xc4&lt;br /&gt;
   uint16_t overlay_balance;                         // 0xc6&lt;br /&gt;
   int16_t overlay_balance_slope;                    // 0xc8&lt;br /&gt;
   int16_t pan_slope;                                // 0xca&lt;br /&gt;
   int16_t transpose;                                // 0xcc&lt;br /&gt;
   int16_t tuning;                                   // 0xce&lt;br /&gt;
   uint16_t note;                                    // 0xd0&lt;br /&gt;
   int16_t pitch_slide_amount;                       // 0xd2&lt;br /&gt;
   int16_t previous_transpose;                       // 0xd4&lt;br /&gt;
   int16_t vibrato_lfo_amplitude;                    // 0xd6&lt;br /&gt;
   int16_t tremolo_lfo_amplitude;                    // 0xd8&lt;br /&gt;
   int16_t pan_lfo_amplitude;                        // 0xda&lt;br /&gt;
   AkaoSpuVoiceAttr spu_attr;                        // 0xdc&lt;br /&gt;
 };&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Code_Map&amp;diff=5740</id>
		<title>FF7/PSX/Sound/Code Map</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Code_Map&amp;diff=5740"/>
		<updated>2020-06-07T15:03:50Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Code Map =&lt;br /&gt;
&lt;br /&gt;
Introduces functions, variables and data related to sound, contained in SCUS_941.63 (game program of US version). Note that all symbol names below are for convenience only.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x800293D0&lt;br /&gt;
|void _AkaoSpuTransferCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800293F4&lt;br /&gt;
|void _AkaoSpuSetTransferCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029424&lt;br /&gt;
|unsigned int _AkaoTransferSamples(const unsigned char *addr, unsigned int size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800294A4&lt;br /&gt;
|void _AkaoWaitForSpuTransfer(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800294BC&lt;br /&gt;
|void _AkaoReset(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800297A4&lt;br /&gt;
|void AkaoLoadInstrumentSet(const sturct AkaoSampleSet *sampleSet, const struct AkaoInstrumentAttr *instrumentSet)&lt;br /&gt;
|Load standard instrument set&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR.DAT&lt;br /&gt;
&lt;br /&gt;
This function is called transparently from 0x8002988C.&lt;br /&gt;
|-&lt;br /&gt;
|0x80029818&lt;br /&gt;
|void AkaoLoadInstrumentSet2(const sturct AkaoSampleSet *sampleSet, const struct AkaoInstrumentAttr *instrumentSet)&lt;br /&gt;
|Load additional instrument set&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR2.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR2.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x8002988C&lt;br /&gt;
|void AkaoInitialize(const sturct AkaoSampleSet *sampleSet, const struct AkaoInstrumentAttr *instrumentSet)&lt;br /&gt;
|Initialize sound driver and load initial instruments&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x800299C8&lt;br /&gt;
|void AkaoDeinitialize(void)&lt;br /&gt;
|Deinitialize sound driver&lt;br /&gt;
|-&lt;br /&gt;
|0x80029AF0&lt;br /&gt;
|void AkaoSetReverbMode(int mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029B78&lt;br /&gt;
|void _AkaoTransferSeqBody(const unsigned char *data, int size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029C48&lt;br /&gt;
|void _AkaoLoadTracks(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002DA30&lt;br /&gt;
|void AkaoNewMessage(AkaoMessage **ppMessage)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002DA7C&lt;br /&gt;
|int AkaoPostMessage(void)&lt;br /&gt;
|Post a new command message to the queue (with some wrapped processing)&lt;br /&gt;
&lt;br /&gt;
The message data comes from a global variable at 0x8009A000.&lt;br /&gt;
&lt;br /&gt;
Return value depends on the content of the message data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Opcode 0x10'''&lt;br /&gt;
&lt;br /&gt;
Load and start playing new [[FF7/PSX/Sound/AKAO sequence|AKAO sequence]]&lt;br /&gt;
&lt;br /&gt;
Returns: 0 for success, 1 for already loaded, and -1 for invalid signature&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Opcode 0x92'''&lt;br /&gt;
&lt;br /&gt;
Set value to the condition variable used by Opcode 0xEF.&lt;br /&gt;
|-&lt;br /&gt;
|0x8002E1A8&lt;br /&gt;
|void _AkaoDispatchMessages(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002E23C&lt;br /&gt;
|void _AkaoWriteSpuRegisters(int voiceNum, AkaoSpuVoiceAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002E478&lt;br /&gt;
|void _AkaoDspOnTick(AkaoPlayerTrack *track, AkaoPlayer *player, int voiceMask)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002ED34&lt;br /&gt;
|void _AkaoCalculateVolumeAndPitch(AkaoPlayerTrack *track, int voiceMask, int voiceNum)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002F24C&lt;br /&gt;
|void _AkaoCalculateVolumeAndPitch2(AkaoPlayerTrack *track, int voiceMask)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002F738&lt;br /&gt;
|void _AkaoDspOverlayVoice(AkaoPlayerTrack *track, int unknownVoiceMask, int voiceNum)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002F848&lt;br /&gt;
|void _AkaoDspMain(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002FF4C&lt;br /&gt;
|void _AkaoSpuNoiseVoice(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030038&lt;br /&gt;
|void _AkaoSpuReverbVoice(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030148&lt;br /&gt;
|void _AkaoSpuPitchLFOVoice(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030234&lt;br /&gt;
|int _AkaoTimerCallback(void)&lt;br /&gt;
|Sound callback event that is periodically triggered by root counter 2&lt;br /&gt;
|-&lt;br /&gt;
|0x800308D4&lt;br /&gt;
|void _AkaoMain(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030E7C&lt;br /&gt;
|void _AkaoDispatchVoice(AkaoPlayerTrack *track, AkaoPlayer *player, int voiceMask)&lt;br /&gt;
|Dispatch voice opcodes until the next note or end of track&lt;br /&gt;
|-&lt;br /&gt;
|0x80031820&lt;br /&gt;
|void AkaoSetInstrument(AkaoPlayerTrack *track, unsigned short progNumber)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800318BC&lt;br /&gt;
|int _AkaoReadNextNote(AkaoPlayerTrack *track)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80031A70&lt;br /&gt;
|int _AkaoFindNextEndPoint(AkaoPlayerTrack *track)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80049548&lt;br /&gt;
|void (* const MESSAGE_HANDLERS[256])(struct AkaoMessage *)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80049948&lt;br /&gt;
|const unsigned char VOICE_OPCODE_LENGTHS[0x60]&lt;br /&gt;
|Length table for voice opcodes 0xa0-0xff&lt;br /&gt;
&lt;br /&gt;
0 for end of track and branches&lt;br /&gt;
|-&lt;br /&gt;
|0x80049AA8&lt;br /&gt;
|void (* const VOICE_OPCODES[0x60])(struct MusicPlayerTrack *, void *, int)&lt;br /&gt;
|Address table for voice opcodes 0xa0-0xff&lt;br /&gt;
|-&lt;br /&gt;
|0x80049C28&lt;br /&gt;
|const unsigned short DELTA_TIME_TABLE[11];&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80049C44&lt;br /&gt;
|const unsigned short VOLUME_TABLE_L[128]&lt;br /&gt;
|See [[FF7/PSX/Sound/Opcodes/0xa8aa|Opcode 0xAA]] for volume balance calculation&lt;br /&gt;
|-&lt;br /&gt;
|0x80049E44&lt;br /&gt;
|const unsigned short VOLUME_TABLE_R[128]&lt;br /&gt;
|See [[FF7/PSX/Sound/Opcodes/0xa8aa|Opcode 0xAA]] for volume balance calculation&lt;br /&gt;
|-&lt;br /&gt;
|0x8004A5CC&lt;br /&gt;
|const short *LFO_FORMS[16]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8004A60C&lt;br /&gt;
|const unsigned char EMPTY_ADPCM[32]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80083580&lt;br /&gt;
|unsigned char g_AkaoSeqData[]&lt;br /&gt;
|RAM area to load AKAO sequence data&lt;br /&gt;
|-&lt;br /&gt;
|0x8009A000&lt;br /&gt;
|AkaoMessage g_AkaoMessage&lt;br /&gt;
|Message data to be posted. Processed by the function 0x8002DA7C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Runtime Library Functions ==&lt;br /&gt;
&lt;br /&gt;
=== LIBSPU ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x80036298&lt;br /&gt;
|void SpuInit(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80036FFC&lt;br /&gt;
|long SpuInitMalloc(long num, char *top)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800373AC&lt;br /&gt;
|long SpuMallocWithStartAddr(unsigned long addr, long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037964&lt;br /&gt;
|unsigned long SpuSetNoiseVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037B90&lt;br /&gt;
|long SpuSetNoiseClock(long n_clock)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037BE0&lt;br /&gt;
|unsigned long SpuRead(unsigned char *addr, unsigned long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037C40&lt;br /&gt;
|long SpuSetReverb(long on_off)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037D90&lt;br /&gt;
|long SpuGetReverb(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037E1C&lt;br /&gt;
|long SpuSetReverbModeParam(SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800387FC&lt;br /&gt;
|void SpuGetReverbModeParam (SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003884C&lt;br /&gt;
|long SpuSetReverbDepth(SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800388C4&lt;br /&gt;
|unsigned long SpuSetReverbVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800388E8&lt;br /&gt;
|long SpuClearReverbWorkArea(long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038A84&lt;br /&gt;
|long SpuSetIRQ(long on_off)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038BC4&lt;br /&gt;
|unsigned long SpuSetIRQAddr(unsigned long addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038C04&lt;br /&gt;
|SpuIRQCallbackProc SpuSetIRQCallback(SpuIRQCallbackProc func)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038C6C&lt;br /&gt;
|void SpuSetKey(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038F04&lt;br /&gt;
|unsigned long SpuWrite(unsigned char *addr, unsigned long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038F64&lt;br /&gt;
|unsigned long SpuSetTransferStartAddr(unsigned long addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038FB8&lt;br /&gt;
|long SpuSetTransferMode(long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038FEC&lt;br /&gt;
|SpuTransferCallbackProc SpuSetTransferCallback(SpuTransferCallbackProc func)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039010&lt;br /&gt;
|unsigned long SpuSetPitchLFOVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039034&lt;br /&gt;
|void SpuSetCommonAttr(SpuCommonAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800393C8&lt;br /&gt;
|void SpuSetVoiceVolume(int voiceNum, short volL, short volR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039450&lt;br /&gt;
|void SpuSetVoiceVolumeAttr(int voiceNum, short volL, short volR, short volModeL, short volModeR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800395C8&lt;br /&gt;
|void SpuSetVoicePitch(int voiceNum, unsigned short pitch)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039644&lt;br /&gt;
|void SpuSetVoiceStartAddr(int voiceNum, unsigned long startAddr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800396C0&lt;br /&gt;
|void SpuSetVoiceLoopStartAddr(int voiceNum, unsigned long lsa)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003973C&lt;br /&gt;
|void SpuSetVoiceDR(int voiceNum, unsigned short DR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800397C8&lt;br /&gt;
|void SpuSetVoiceSL(int voiceNum, unsigned short SL)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039850&lt;br /&gt;
|void SpuSetVoiceARAttr(int voiceNum, unsigned short AR, long ARmode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800398EC&lt;br /&gt;
|void SpuSetVoiceSRAttr(int voiceNum, unsigned short SR, long SRmode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800399D0&lt;br /&gt;
|void SpuSetVoiceRRAttr(int voiceNum, unsigned short RR, long RRmode)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LIBETC ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D0C0&lt;br /&gt;
|int ResetCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D150&lt;br /&gt;
|int VSyncCallback(void (*func)(void))&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D1B4&lt;br /&gt;
|int StopCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D214&lt;br /&gt;
|int CheckCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LIBAPI ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x800429F0&lt;br /&gt;
|void DeliverEvent(unsigned long ev1, unsigned long ev2)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A00&lt;br /&gt;
|long OpenEvent(unsigned long desc, long spec, long mode, long (*func)())&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A10&lt;br /&gt;
|long CloseEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A20&lt;br /&gt;
|long WaitEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A40&lt;br /&gt;
|long EnableEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A50&lt;br /&gt;
|long DisableEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042BC0&lt;br /&gt;
|long SetRCnt(unsigned long spec, unsigned short target, long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042C60&lt;br /&gt;
|long GetRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042C98&lt;br /&gt;
|long StartRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042CCC&lt;br /&gt;
|long StopRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Structures =&lt;br /&gt;
&lt;br /&gt;
[[FF7/PSX/Sound/INSTRx.DAT|struct AkaoInstrumentAttr]]&lt;br /&gt;
&lt;br /&gt;
[[FF7/PSX/Sound/INSTRx.ALL|struct AkaoSampleSet]]&lt;br /&gt;
&lt;br /&gt;
[[FF7/PSX/Sound/AKAO sequence|struct AkaoSeqHeader]]&lt;br /&gt;
&lt;br /&gt;
 struct AkaoMessage // 36 bytes long&lt;br /&gt;
 {&lt;br /&gt;
   uint16_t opcode;&lt;br /&gt;
   uint16_t reserved;&lt;br /&gt;
   uint32_t data[8];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoSpuVoiceAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t voice;          // 0x00: voice number&lt;br /&gt;
   uint32_t update_flags;   // 0x04: bitset that indicates what SPU registers need to be updated&lt;br /&gt;
   uint32_t addr;           // 0x08: waveform data start address (SPU address)&lt;br /&gt;
   uint32_t loop_addr;      // 0x0c: loop start address (SPU address)&lt;br /&gt;
   uint32_t a_mode;         // 0x10: ADSR: attack rate mode&lt;br /&gt;
   uint32_t s_mode;         // 0x14: ADSR: sustain rate mode&lt;br /&gt;
   uint32_t r_mode          // 0x18: ADSR: release rate mode&lt;br /&gt;
   uint16_t pitch;          // 0x1c: pitch&lt;br /&gt;
   uint16_t ar;             // 0x1e: ADSR: attack rate&lt;br /&gt;
   uint16_t dr;             // 0x20: ADSR: decay rate&lt;br /&gt;
   uint16_t sl;             // 0x22: ADSR: sustain level&lt;br /&gt;
   uint16_t sr;             // 0x24: ADSR: sustain rate&lt;br /&gt;
   uint16_t rr;             // 0x26: ADSR: release rate&lt;br /&gt;
   SpuVolume volume;        // 0x28: volume (left and right)&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoPlayer // the music player instance exists at 0x8009A104&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t stereo_mode;                 // 0x00: stereo mode (1: stereo, 4: surround, otherwise: mono)&lt;br /&gt;
   uint32_t active_voices;               // 0x04: bitset that indicates the voices currently in use&lt;br /&gt;
   uint32_t key_on_voices;               // 0x08: bitset that indicates the voices to key on&lt;br /&gt;
   uint32_t keyed_voices;                // 0x0c: bitset that indicates the voices currently keyed on&lt;br /&gt;
   uint32_t key_off_voices;              // 0x10: bitset that indicates the voices to key off&lt;br /&gt;
   uint32_t saved_active_voices;         // 0x14: unknown voice bitset&lt;br /&gt;
   uint32_t tempo;                       // 0x18: tempo (Q16 fixed-point number)&lt;br /&gt;
   int32_t tempo_slope;                  // 0x1c: slope of tempo slider (Q16 fixed-point number)&lt;br /&gt;
   uint32_t time_counter;                // 0x20: time counter (0x10000 = 1 tick)&lt;br /&gt;
   uint32_t overlay_voices;              // 0x24: bitset that indicates the sub-voices used for overlay (opcode 0xF4)&lt;br /&gt;
   uint32_t alternate_voices;            // 0x28: bitset that indicates the sub-voices used for alternate voice (opcode 0xF8)&lt;br /&gt;
   uint32_t noise_voices;                // 0x2c: bitset that indicates the voices with noise mode enabled&lt;br /&gt;
   uint32_t reverb_voices;               // 0x30: bitset that indicates the voices with reverb enabled&lt;br /&gt;
   uint32_t pitch_lfo_voices;            // 0x34: bitset that indicates the voices with pitch LFO (frequency modulation) mode enabled&lt;br /&gt;
   uint32_t spucnt;                      // 0x38: SPUCNT shadow&lt;br /&gt;
   uint32_t reverb_type;                 // 0x3c: reverb type&lt;br /&gt;
   uint32_t reverb_depth;                // 0x40: reverb depth (Q16 fixed-point number)&lt;br /&gt;
   int32_t reverb_depth_slope;           // 0x44: slope of reverb depth slider (Q16 fixed-point number)&lt;br /&gt;
   uint16_t tempo_slide_length;          // 0x48: tempo slide length&lt;br /&gt;
   uint16_t song_id;                     // 0x4a: current song id&lt;br /&gt;
   uint16_t condition_ack;               // 0x4c: the last matched condition value (opcode 0xEF)&lt;br /&gt;
   uint16_t condition;                   // 0x4e: condition variable for dynamic branching according to game status (opcode 0xEF)&lt;br /&gt;
   uint16_t reverb_depth_slide_length;   // 0x50: length of reverb depth slide&lt;br /&gt;
   uint16_t noise_clock;                 // 0x52: noise clock frequency&lt;br /&gt;
   uint16_t field_54;                    // 0x54: unknown&lt;br /&gt;
   uint16_t beats_per_measure;           // 0x56: beats per measure&lt;br /&gt;
   uint16_t beat;                        // 0x58: current beat&lt;br /&gt;
   uint16_t ticks_per_beat;              // 0x5a: ticks per beat&lt;br /&gt;
   uint16_t tick;                        // 0x5c: current ticks per beat&lt;br /&gt;
   uint16_t measure;                     // 0x5e: current measure&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoPlayerTrack // the music player track instances exist at 0x80096608 + (N * 0x108)&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t *addr;                                    // 0x00&lt;br /&gt;
   uint8_t *loop_addrs[4];                           // 0x04&lt;br /&gt;
   AkaoDrumKeyAttr *drum_addr;                       // 0x14&lt;br /&gt;
   int16_t *vibrato_lfo_addr;                        // 0x18&lt;br /&gt;
   int16_t *tremolo_lfo_addr;                        // 0x1c&lt;br /&gt;
   int16_t *pan_lfo_addr;                            // 0x20&lt;br /&gt;
   uint32_t overlay_voice_num;                       // 0x24&lt;br /&gt;
   uint32_t alternate_voice_num;                     // 0x28&lt;br /&gt;
   uint32_t master_volume;                           // 0x2c&lt;br /&gt;
   uint32_t pitch_of_note;                           // 0x30&lt;br /&gt;
   int32_t pitch_bend_slide_amplitude;               // 0x34&lt;br /&gt;
   uint16_t voice_effect_flags;                      // 0x38&lt;br /&gt;
   uint16_t field_3A;                                // 0x3a&lt;br /&gt;
   uint16_t field_3C;                                // 0x3c&lt;br /&gt;
   uint16_t field_3E;                                // 0x3e&lt;br /&gt;
   uint32_t field_40;                                // 0x40&lt;br /&gt;
   uint32_t volume;                                  // 0x44&lt;br /&gt;
   int32_t volume_slope;                             // 0x48&lt;br /&gt;
   int32_t pitch_bend_slope;                         // 0x4c&lt;br /&gt;
   uint16_t field_50;                                // 0x50&lt;br /&gt;
   uint16_t field_52;                                // 0x52&lt;br /&gt;
   uint16_t field_54;                                // 0x54&lt;br /&gt;
   uint8_t delta_time_counter;                       // 0x56&lt;br /&gt;
   uint8_t gate_time_counter;                        // 0x57&lt;br /&gt;
   uint16_t instrument;                              // 0x58&lt;br /&gt;
   uint16_t field_5A;                                // 0x5a&lt;br /&gt;
   uint16_t volume_slide_length_counter;             // 0x5c&lt;br /&gt;
   uint16_t overlay_balance_slide_length_counter;    // 0x5e&lt;br /&gt;
   uint16_t pan;                                     // 0x60&lt;br /&gt;
   uint16_t pan_slide_length;                        // 0x62&lt;br /&gt;
   int16_t pitch_slide_length_counter;               // 0x64&lt;br /&gt;
   uint16_t octave;                                  // 0x66&lt;br /&gt;
   uint16_t pitch_slide_length;                      // 0x68&lt;br /&gt;
   uint16_t previous_note_number;                    // 0x6a&lt;br /&gt;
   uint16_t portamento_speed;                        // 0x6c&lt;br /&gt;
   uint16_t legato_flags;                            // 0x6e&lt;br /&gt;
   uint16_t field_70;                                // 0x70&lt;br /&gt;
   uint16_t vibrato_lfo_delay;                       // 0x72&lt;br /&gt;
   uint16_t vibrato_delay_counter;                   // 0x74&lt;br /&gt;
   uint16_t vibrato_rate;                            // 0x76&lt;br /&gt;
   uint16_t vibrato_rate_counter;                    // 0x78&lt;br /&gt;
   uint16_t vibrato_form;                            // 0x7a&lt;br /&gt;
   uint16_t vibrato_max_amplitude;                   // 0x7c&lt;br /&gt;
   uint16_t vibrato_depth;                           // 0x7e&lt;br /&gt;
   uint16_t vibrato_depth_slide_length_counter;      // 0x80&lt;br /&gt;
   int16_t vibrato_depth_slope;                      // 0x82&lt;br /&gt;
   uint16_t field_84;                                // 0x84&lt;br /&gt;
   uint16_t tremolo_delay;                           // 0x86&lt;br /&gt;
   uint16_t tremolo_delay_counter;                   // 0x88&lt;br /&gt;
   uint16_t tremolo_rate;                            // 0x8a&lt;br /&gt;
   uint16_t tremolo_rate_counter;                    // 0x8c&lt;br /&gt;
   uint16_t tremolo_form;                            // 0x8e&lt;br /&gt;
   uint16_t tremolo_depth;                           // 0x90&lt;br /&gt;
   uint16_t tremolo_depth_slide_length_counter;      // 0x92&lt;br /&gt;
   int16_t tremolo_depth_slope;                      // 0x94&lt;br /&gt;
   uint16_t field_96;                                // 0x96&lt;br /&gt;
   uint16_t pan_lfo_rate;                            // 0x98&lt;br /&gt;
   uint16_t pan_lfo_rate_counter;                    // 0x9a&lt;br /&gt;
   uint16_t pan_lfo_form;                            // 0x9c&lt;br /&gt;
   uint16_t pan_lfo_depth;                           // 0x9e&lt;br /&gt;
   uint16_t pan_lfo_depth_slide_length_counter;      // 0xa0&lt;br /&gt;
   int16_t pan_lfo_slope;                            // 0xa2&lt;br /&gt;
   uint16_t noise_on_off_delay_counter;              // 0xa4&lt;br /&gt;
   uint16_t pitchmod_on_off_delay_counter;           // 0xa6&lt;br /&gt;
   uint8_t field_A8[16];                             // 0xa8&lt;br /&gt;
   uint16_t loop_layer;                              // 0xb8&lt;br /&gt;
   uint16_t loop_counts[4];                          // 0xba&lt;br /&gt;
   uint16_t previous_delta_time;                     // 0xc2&lt;br /&gt;
   uint16_t forced_delta_time;                       // 0xc4&lt;br /&gt;
   uint16_t overlay_balance;                         // 0xc6&lt;br /&gt;
   int16_t overlay_balance_slope;                    // 0xc8&lt;br /&gt;
   int16_t pan_slope;                                // 0xca&lt;br /&gt;
   int16_t transpose;                                // 0xcc&lt;br /&gt;
   int16_t tuning;                                   // 0xce&lt;br /&gt;
   uint16_t note;                                    // 0xd0&lt;br /&gt;
   int16_t pitch_slide_amount;                       // 0xd2&lt;br /&gt;
   int16_t previous_transpose;                       // 0xd4&lt;br /&gt;
   int16_t vibrato_lfo_amplitude;                    // 0xd6&lt;br /&gt;
   int16_t tremolo_lfo_amplitude;                    // 0xd8&lt;br /&gt;
   int16_t pan_lfo_amplitude;                        // 0xda&lt;br /&gt;
   AkaoSpuVoiceAttr spu_attr;                        // 0xdc&lt;br /&gt;
 };&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Code_Map&amp;diff=5739</id>
		<title>FF7/PSX/Sound/Code Map</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Code_Map&amp;diff=5739"/>
		<updated>2020-06-07T15:03:11Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Code Map =&lt;br /&gt;
&lt;br /&gt;
Introduces functions, variables and data related to sound, contained in SCUS_941.63 (game program of US version). Note that all symbol names below are for convenience only.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x800293D0&lt;br /&gt;
|void _AkaoSpuTransferCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800293F4&lt;br /&gt;
|void _AkaoSpuSetTransferCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029424&lt;br /&gt;
|unsigned int _AkaoTransferSamples(const unsigned char *addr, unsigned int size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800294A4&lt;br /&gt;
|void _AkaoWaitForSpuTransfer(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800294BC&lt;br /&gt;
|void _AkaoReset(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800297A4&lt;br /&gt;
|void AkaoLoadInstrumentSet(const sturct AkaoSampleSet *sampleSet, const struct AkaoInstrumentAttr *instrumentSet)&lt;br /&gt;
|Load standard instrument set&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR.DAT&lt;br /&gt;
&lt;br /&gt;
This function is called transparently from 0x8002988C.&lt;br /&gt;
|-&lt;br /&gt;
|0x80029818&lt;br /&gt;
|void AkaoLoadInstrumentSet2(const sturct AkaoSampleSet *sampleSet, const struct AkaoInstrumentAttr *instrumentSet)&lt;br /&gt;
|Load additional instrument set&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR2.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR2.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x8002988C&lt;br /&gt;
|void AkaoInitialize(const sturct AkaoSampleSet *sampleSet, const struct AkaoInstrumentAttr *instrumentSet)&lt;br /&gt;
|Initialize sound driver and load initial instruments&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x800299C8&lt;br /&gt;
|void AkaoDeinitialize(void)&lt;br /&gt;
|Deinitialize sound driver&lt;br /&gt;
|-&lt;br /&gt;
|0x80029AF0&lt;br /&gt;
|void AkaoSetReverbMode(int mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029B78&lt;br /&gt;
|void _AkaoTransferSeqBody(const unsigned char *data, int size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029C48&lt;br /&gt;
|void _AkaoLoadTracks(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002DA30&lt;br /&gt;
|void AkaoNewMessage(AkaoMessage **ppMessage)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002DA7C&lt;br /&gt;
|int AkaoPostMessage(void)&lt;br /&gt;
|Post a new command message to the queue (with some wrapped processing)&lt;br /&gt;
&lt;br /&gt;
The message data comes from a global variable at 0x8009A000.&lt;br /&gt;
&lt;br /&gt;
Return value depends on the content of the message data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Opcode 0x10'''&lt;br /&gt;
&lt;br /&gt;
Load and start playing new [[FF7/PSX/Sound/AKAO sequence|AKAO sequence]]&lt;br /&gt;
&lt;br /&gt;
Returns: 0 for success, 1 for already loaded, and -1 for invalid signature&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Opcode 0x92'''&lt;br /&gt;
&lt;br /&gt;
Set value to the condition variable used by Opcode 0xEF.&lt;br /&gt;
|-&lt;br /&gt;
|0x8002E1A8&lt;br /&gt;
|void _AkaoDispatchMessages(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002E23C&lt;br /&gt;
|void _AkaoWriteSpuRegisters(int voiceNum, AkaoSpuVoiceAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002E478&lt;br /&gt;
|void _AkaoDspOnTick(AkaoPlayerTrack *track, AkaoPlayer *player, int voiceMask)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002ED34&lt;br /&gt;
|void _AkaoCalculateVolumeAndPitch(AkaoPlayerTrack *track, int voiceMask, int voiceNum)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002F24C&lt;br /&gt;
|void _AkaoCalculateVolumeAndPitch2(AkaoPlayerTrack *track, int voiceMask)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002F738&lt;br /&gt;
|void _AkaoDspOverlayVoice(AkaoPlayerTrack *track, int unknownVoiceMask, int voiceNum)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002F848&lt;br /&gt;
|void _AkaoDspMain(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002FF4C&lt;br /&gt;
|void _AkaoSpuNoiseVoice(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030038&lt;br /&gt;
|void _AkaoSpuReverbVoice(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030148&lt;br /&gt;
|void _AkaoSpuPitchLFOVoice(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030234&lt;br /&gt;
|int _AkaoTimerCallback(void)&lt;br /&gt;
|Sound callback event that is periodically triggered by root counter 2&lt;br /&gt;
|-&lt;br /&gt;
|0x800308D4&lt;br /&gt;
|void _AkaoMain(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030E7C&lt;br /&gt;
|void _AkaoDispatchVoice(AkaoPlayerTrack *track, AkaoPlayer *player, int voiceMask)&lt;br /&gt;
|Dispatch voice opcodes until the next note or end of track&lt;br /&gt;
|-&lt;br /&gt;
|0x80031820&lt;br /&gt;
|void AkaoSetInstrument(AkaoPlayerTrack *track, unsigned short progNumber)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800318BC&lt;br /&gt;
|int _AkaoReadNextNote(AkaoPlayerTrack *track)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80031A70&lt;br /&gt;
|int _AkaoFindNextEndPoint(AkaoPlayerTrack *track)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80049548&lt;br /&gt;
|void (* const MESSAGE_HANDLERS[256])(struct AkaoMessage *)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80049948&lt;br /&gt;
|const unsigned char VOICE_OPCODE_LENGTHS[0x60]&lt;br /&gt;
|Length table for voice opcodes 0xa0-0xff&lt;br /&gt;
&lt;br /&gt;
0 for end of track and branches&lt;br /&gt;
|-&lt;br /&gt;
|0x80049AA8&lt;br /&gt;
|void (* const VOICE_OPCODES[0x60])(struct MusicPlayerTrack *, void *, int)&lt;br /&gt;
|Address table for voice opcodes 0xa0-0xff&lt;br /&gt;
|-&lt;br /&gt;
|0x80049C28&lt;br /&gt;
|const unsigned short DELTA_TIME_TABLE[11];&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80049C44&lt;br /&gt;
|const unsigned short VOLUME_TABLE_L[128]&lt;br /&gt;
|See [[FF7/PSX/Sound/Opcodes/0xa8aa|Opcode 0xAA]] for volume balance calculation&lt;br /&gt;
|-&lt;br /&gt;
|0x80049E44&lt;br /&gt;
|const unsigned short VOLUME_TABLE_R[128]&lt;br /&gt;
|See [[FF7/PSX/Sound/Opcodes/0xa8aa|Opcode 0xAA]] for volume balance calculation&lt;br /&gt;
|-&lt;br /&gt;
|0x8004A5CC&lt;br /&gt;
|const short *LFO_FORMS[16]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8004A60C&lt;br /&gt;
|const unsigned char EMPTY_ADPCM[32]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80083580&lt;br /&gt;
|unsigned char g_AkaoSeqData[]&lt;br /&gt;
|RAM area to load AKAO sequence data&lt;br /&gt;
|-&lt;br /&gt;
|0x8009A000&lt;br /&gt;
|AkaoMessage g_AkaoMessage&lt;br /&gt;
|Message data to be posted. Processed by the function 0x8002DA7C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Runtime Library Functions ==&lt;br /&gt;
&lt;br /&gt;
=== LIBSPU ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x80036298&lt;br /&gt;
|void SpuInit(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80036FFC&lt;br /&gt;
|long SpuInitMalloc(long num, char *top)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800373AC&lt;br /&gt;
|long SpuMallocWithStartAddr(unsigned long addr, long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037964&lt;br /&gt;
|unsigned long SpuSetNoiseVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037B90&lt;br /&gt;
|long SpuSetNoiseClock(long n_clock)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037BE0&lt;br /&gt;
|unsigned long SpuRead(unsigned char *addr, unsigned long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037C40&lt;br /&gt;
|long SpuSetReverb(long on_off)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037D90&lt;br /&gt;
|long SpuGetReverb(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037E1C&lt;br /&gt;
|long SpuSetReverbModeParam(SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800387FC&lt;br /&gt;
|void SpuGetReverbModeParam (SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003884C&lt;br /&gt;
|long SpuSetReverbDepth(SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800388C4&lt;br /&gt;
|unsigned long SpuSetReverbVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800388E8&lt;br /&gt;
|long SpuClearReverbWorkArea(long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038A84&lt;br /&gt;
|long SpuSetIRQ(long on_off)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038BC4&lt;br /&gt;
|unsigned long SpuSetIRQAddr(unsigned long addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038C04&lt;br /&gt;
|SpuIRQCallbackProc SpuSetIRQCallback(SpuIRQCallbackProc func)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038C6C&lt;br /&gt;
|void SpuSetKey(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038F04&lt;br /&gt;
|unsigned long SpuWrite(unsigned char *addr, unsigned long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038F64&lt;br /&gt;
|unsigned long SpuSetTransferStartAddr(unsigned long addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038FB8&lt;br /&gt;
|long SpuSetTransferMode(long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038FEC&lt;br /&gt;
|SpuTransferCallbackProc SpuSetTransferCallback(SpuTransferCallbackProc func)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039010&lt;br /&gt;
|unsigned long SpuSetPitchLFOVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039034&lt;br /&gt;
|void SpuSetCommonAttr(SpuCommonAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800393C8&lt;br /&gt;
|void SpuSetVoiceVolume(int voiceNum, short volL, short volR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039450&lt;br /&gt;
|void SpuSetVoiceVolumeAttr(int voiceNum, short volL, short volR, short volModeL, short volModeR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800395C8&lt;br /&gt;
|void SpuSetVoicePitch(int voiceNum, unsigned short pitch)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039644&lt;br /&gt;
|void SpuSetVoiceStartAddr(int voiceNum, unsigned long startAddr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800396C0&lt;br /&gt;
|void SpuSetVoiceLoopStartAddr(int voiceNum, unsigned long lsa)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003973C&lt;br /&gt;
|void SpuSetVoiceDR(int voiceNum, unsigned short DR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800397C8&lt;br /&gt;
|void SpuSetVoiceSL(int voiceNum, unsigned short SL)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039850&lt;br /&gt;
|void SpuSetVoiceARAttr(int voiceNum, unsigned short AR, long ARmode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800398EC&lt;br /&gt;
|void SpuSetVoiceSRAttr(int voiceNum, unsigned short SR, long SRmode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800399D0&lt;br /&gt;
|void SpuSetVoiceRRAttr(int voiceNum, unsigned short RR, long RRmode)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LIBETC ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D0C0&lt;br /&gt;
|int ResetCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D150&lt;br /&gt;
|int VSyncCallback(void (*func)(void))&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D1B4&lt;br /&gt;
|int StopCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D214&lt;br /&gt;
|int CheckCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LIBAPI ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x800429F0&lt;br /&gt;
|void DeliverEvent(unsigned long ev1, unsigned long ev2)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A00&lt;br /&gt;
|long OpenEvent(unsigned long desc, long spec, long mode, long (*func)())&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A10&lt;br /&gt;
|long CloseEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A20&lt;br /&gt;
|long WaitEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A40&lt;br /&gt;
|long EnableEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A50&lt;br /&gt;
|long DisableEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042BC0&lt;br /&gt;
|long SetRCnt(unsigned long spec, unsigned short target, long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042C60&lt;br /&gt;
|long GetRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042C98&lt;br /&gt;
|long StartRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042CCC&lt;br /&gt;
|long StopRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Structures =&lt;br /&gt;
&lt;br /&gt;
[[FF7/PSX/Sound/INSTRx.DAT|struct AkaoInstrumentAttr]]&lt;br /&gt;
&lt;br /&gt;
[[FF7/PSX/Sound/INSTRx.ALL|struct AkaoSampleSet]]&lt;br /&gt;
&lt;br /&gt;
[[FF7/PSX/Sound/AKAO sequence|struct AkaoSeqHeader]]&lt;br /&gt;
&lt;br /&gt;
 struct AkaoMessage // 36 bytes long&lt;br /&gt;
 {&lt;br /&gt;
   uint16_t opcode;&lt;br /&gt;
   uint16_t reserved;&lt;br /&gt;
   uint32_t data[8];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoSpuVoiceAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t voice;          // 0x00: voice number&lt;br /&gt;
   uint32_t update_flags;   // 0x04: bitset that indicates what SPU registers need to be updated&lt;br /&gt;
   uint32_t addr;           // 0x08: waveform data start address (SPU address)&lt;br /&gt;
   uint32_t loop_addr;      // 0x0c: loop start address (SPU address)&lt;br /&gt;
   uint32_t a_mode;         // 0x10: ADSR: attack rate mode&lt;br /&gt;
   uint32_t s_mode;         // 0x14: ADSR: sustain rate mode&lt;br /&gt;
   uint32_t r_mode          // 0x18: ADSR: release rate mode&lt;br /&gt;
   uint16_t pitch;          // 0x1c: pitch&lt;br /&gt;
   uint16_t ar;             // 0x1e: ADSR: attack rate&lt;br /&gt;
   uint16_t dr;             // 0x20: ADSR: decay rate&lt;br /&gt;
   uint16_t sl;             // 0x22: ADSR: sustain level&lt;br /&gt;
   uint16_t sr;             // 0x24: ADSR: sustain rate&lt;br /&gt;
   uint16_t rr;             // 0x26: ADSR: release rate&lt;br /&gt;
   SpuVolume volume;        // 0x28: volume (left and right)&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoPlayer // the music player instance exists at 0x8009A104&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t stereo_mode;                 // 0x00: stereo mode (1: stereo, 4: surround, otherwise: mono)&lt;br /&gt;
   uint32_t active_voices;               // 0x04: bitset that indicates the voices currently in use&lt;br /&gt;
   uint32_t key_on_voices;               // 0x08: bitset that indicates the voices to key on&lt;br /&gt;
   uint32_t keyed_voices;                // 0x0c: bitset that indicates the voices currently keyed on&lt;br /&gt;
   uint32_t key_off_voices;              // 0x10: bitset that indicates the voices to key off&lt;br /&gt;
   uint32_t saved_active_voices;         // 0x14: unknown voice bitset&lt;br /&gt;
   uint32_t tempo;                       // 0x18: tempo (Q16 fixed-point number)&lt;br /&gt;
   int32_t tempo_slope;                  // 0x1c: slope of tempo slider (Q16 fixed-point number)&lt;br /&gt;
   uint32_t time_counter;                // 0x20: time counter (0x10000 = 1 tick)&lt;br /&gt;
   uint32_t overlay_voices;              // 0x24: bitset that indicates the sub-voices used for overlay (opcode 0xF4)&lt;br /&gt;
   uint32_t alternate_voices;            // 0x28: bitset that indicates the sub-voices used for alternate voice (opcode 0xF8)&lt;br /&gt;
   uint32_t noise_voices;                // 0x2c: bitset that indicates the voices with noise mode enabled&lt;br /&gt;
   uint32_t reverb_voices;               // 0x30: bitset that indicates the voices with reverb enabled&lt;br /&gt;
   uint32_t pitch_lfo_voices;            // 0x34: bitset that indicates the voices with pitch LFO (frequency modulation) mode enabled&lt;br /&gt;
   uint32_t spucnt;                      // 0x38: SPUCNT shadow&lt;br /&gt;
   uint32_t reverb_type;                 // 0x3c: reverb type&lt;br /&gt;
   uint32_t reverb_depth;                // 0x40: reverb depth (Q16 fixed-point number)&lt;br /&gt;
   int32_t reverb_depth_slope;           // 0x44: slope of reverb depth slider (Q16 fixed-point number)&lt;br /&gt;
   uint16_t tempo_slide_length;          // 0x48: tempo slide length&lt;br /&gt;
   uint16_t song_id;                     // 0x4a: current song id&lt;br /&gt;
   uint16_t condition_ack;               // 0x4c: the last matched condition value (opcode 0xEF)&lt;br /&gt;
   uint16_t condition;                   // 0x4e: condition variable for dynamic branching according to game status (opcode 0xEF)&lt;br /&gt;
   uint16_t reverb_depth_slide_length;   // 0x50: length of reverb depth slide&lt;br /&gt;
   uint16_t noise_clock;                 // 0x52: noise clock frequency&lt;br /&gt;
   uint16_t field_54;                    // 0x54: unknown&lt;br /&gt;
   uint16_t beats_per_measure;           // 0x56: beats per measure&lt;br /&gt;
   uint16_t beat;                        // 0x58: current beat&lt;br /&gt;
   uint16_t ticks_per_beat;              // 0x5a: ticks per beat&lt;br /&gt;
   uint16_t tick;                        // 0x5c: current ticks per beat&lt;br /&gt;
   uint16_t measure;                     // 0x5e: current measure&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoPlayerTrack // the music player track instances exist at 0x80096608 + (N * 0x108)&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t *addr;                                    // 0x00&lt;br /&gt;
   uint8_t *loop_addrs[4];                           // 0x04&lt;br /&gt;
   AkaoDrumKeyAttr *drum_addr;                       // 0x14&lt;br /&gt;
   int16_t *vibrato_lfo_addr;                        // 0x18&lt;br /&gt;
   int16_t *tremolo_lfo_addr;                        // 0x1C&lt;br /&gt;
   int16_t *pan_lfo_addr;                            // 0x20&lt;br /&gt;
   uint32_t overlay_voice_num;                       // 0x24&lt;br /&gt;
   uint32_t alternate_voice_num;                     // 0x28&lt;br /&gt;
   uint32_t master_volume;                           // 0x2C&lt;br /&gt;
   uint32_t pitch_of_note;                           // 0x30&lt;br /&gt;
   int32_t pitch_bend_slide_amplitude;               // 0x34&lt;br /&gt;
   uint16_t voice_effect_flags;                      // 0x38&lt;br /&gt;
   uint16_t field_3A;                                // 0x3A&lt;br /&gt;
   uint16_t field_3C;                                // 0x3C&lt;br /&gt;
   uint16_t field_3E;                                // 0x3E&lt;br /&gt;
   uint32_t field_40;                                // 0x40&lt;br /&gt;
   uint32_t volume;                                  // 0x44&lt;br /&gt;
   int32_t volume_slope;                             // 0x48&lt;br /&gt;
   int32_t pitch_bend_slope;                         // 0x4C&lt;br /&gt;
   uint16_t field_50;                                // 0x50&lt;br /&gt;
   uint16_t field_52;                                // 0x52&lt;br /&gt;
   uint16_t field_54;                                // 0x54&lt;br /&gt;
   uint8_t delta_time_counter;                       // 0x56&lt;br /&gt;
   uint8_t gate_time_counter;                        // 0x57&lt;br /&gt;
   uint16_t instrument;                              // 0x58&lt;br /&gt;
   uint16_t field_5A;                                // 0x5A&lt;br /&gt;
   uint16_t volume_slide_length_counter;             // 0x5C&lt;br /&gt;
   uint16_t overlay_balance_slide_length_counter;    // 0x5E&lt;br /&gt;
   uint16_t pan;                                     // 0x60&lt;br /&gt;
   uint16_t pan_slide_length;                        // 0x62&lt;br /&gt;
   int16_t pitch_slide_length_counter;               // 0x64&lt;br /&gt;
   uint16_t octave;                                  // 0x66&lt;br /&gt;
   uint16_t pitch_slide_length;                      // 0x68&lt;br /&gt;
   uint16_t previous_note_number;                    // 0x6A&lt;br /&gt;
   uint16_t portamento_speed;                        // 0x6C&lt;br /&gt;
   uint16_t legato_flags;                            // 0x6E&lt;br /&gt;
   uint16_t field_70;                                // 0x70&lt;br /&gt;
   uint16_t vibrato_lfo_delay;                       // 0x72&lt;br /&gt;
   uint16_t vibrato_delay_counter;                   // 0x74&lt;br /&gt;
   uint16_t vibrato_rate;                            // 0x76&lt;br /&gt;
   uint16_t vibrato_rate_counter;                    // 0x78&lt;br /&gt;
   uint16_t vibrato_form;                            // 0x7A&lt;br /&gt;
   uint16_t vibrato_max_amplitude;                   // 0x7C&lt;br /&gt;
   uint16_t vibrato_depth;                           // 0x7E&lt;br /&gt;
   uint16_t vibrato_depth_slide_length_counter;      // 0x80&lt;br /&gt;
   int16_t vibrato_depth_slope;                      // 0x82&lt;br /&gt;
   uint16_t field_84;                                // 0x84&lt;br /&gt;
   uint16_t tremolo_delay;                           // 0x86&lt;br /&gt;
   uint16_t tremolo_delay_counter;                   // 0x88&lt;br /&gt;
   uint16_t tremolo_rate;                            // 0x8A&lt;br /&gt;
   uint16_t tremolo_rate_counter;                    // 0x8C&lt;br /&gt;
   uint16_t tremolo_form;                            // 0x8E&lt;br /&gt;
   uint16_t tremolo_depth;                           // 0x90&lt;br /&gt;
   uint16_t tremolo_depth_slide_length_counter;      // 0x92&lt;br /&gt;
   int16_t tremolo_depth_slope;                      // 0x94&lt;br /&gt;
   uint16_t field_96;                                // 0x96&lt;br /&gt;
   uint16_t pan_lfo_rate;                            // 0x98&lt;br /&gt;
   uint16_t pan_lfo_rate_counter;                    // 0x9A&lt;br /&gt;
   uint16_t pan_lfo_form;                            // 0x9C&lt;br /&gt;
   uint16_t pan_lfo_depth;                           // 0x9E&lt;br /&gt;
   uint16_t pan_lfo_depth_slide_length_counter;      // 0xA0&lt;br /&gt;
   int16_t pan_lfo_slope;                            // 0xA2&lt;br /&gt;
   uint16_t noise_on_off_delay_counter;              // 0xA4&lt;br /&gt;
   uint16_t pitchmod_on_off_delay_counter;           // 0xA6&lt;br /&gt;
   uint8_t field_A8[16];                             // 0xA8&lt;br /&gt;
   uint16_t loop_layer;                              // 0xB8&lt;br /&gt;
   uint16_t loop_counts[4];                          // 0xBA&lt;br /&gt;
   uint16_t previous_delta_time;                     // 0xC2&lt;br /&gt;
   uint16_t forced_delta_time;                       // 0xC4&lt;br /&gt;
   uint16_t overlay_balance;                         // 0xC6&lt;br /&gt;
   int16_t overlay_balance_slope;                    // 0xC8&lt;br /&gt;
   int16_t pan_slope;                                // 0xCA&lt;br /&gt;
   int16_t transpose;                                // 0xCC&lt;br /&gt;
   int16_t tuning;                                   // 0xCE&lt;br /&gt;
   uint16_t note;                                    // 0xD0&lt;br /&gt;
   int16_t pitch_slide_amount;                       // 0xD2&lt;br /&gt;
   int16_t previous_transpose;                       // 0xD4&lt;br /&gt;
   int16_t vibrato_lfo_amplitude;                    // 0xD6&lt;br /&gt;
   int16_t tremolo_lfo_amplitude;                    // 0xD8&lt;br /&gt;
   int16_t pan_lfo_amplitude;                        // 0xDA&lt;br /&gt;
   AkaoSpuVoiceAttr spu_attr;                        // 0xDC&lt;br /&gt;
 };&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Code_Map&amp;diff=5738</id>
		<title>FF7/PSX/Sound/Code Map</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Code_Map&amp;diff=5738"/>
		<updated>2020-06-07T14:39:20Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Code Map =&lt;br /&gt;
&lt;br /&gt;
Introduces functions, variables and data related to sound, contained in SCUS_941.63 (game program of US version). Note that all symbol names below are for convenience only.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x800293D0&lt;br /&gt;
|void _AkaoSpuTransferCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800293F4&lt;br /&gt;
|void _AkaoSpuSetTransferCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029424&lt;br /&gt;
|unsigned int _AkaoTransferSamples(const unsigned char *addr, unsigned int size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800294A4&lt;br /&gt;
|void _AkaoWaitForSpuTransfer(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800294BC&lt;br /&gt;
|void _AkaoReset(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800297A4&lt;br /&gt;
|void AkaoLoadInstrumentSet(const sturct AkaoSampleSet *sampleSet, const struct AkaoInstrumentAttr *instrumentSet)&lt;br /&gt;
|Load standard instrument set&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR.DAT&lt;br /&gt;
&lt;br /&gt;
This function is called transparently from 0x8002988C.&lt;br /&gt;
|-&lt;br /&gt;
|0x80029818&lt;br /&gt;
|void AkaoLoadInstrumentSet2(const sturct AkaoSampleSet *sampleSet, const struct AkaoInstrumentAttr *instrumentSet)&lt;br /&gt;
|Load additional instrument set&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR2.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR2.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x8002988C&lt;br /&gt;
|void AkaoInitialize(const sturct AkaoSampleSet *sampleSet, const struct AkaoInstrumentAttr *instrumentSet)&lt;br /&gt;
|Initialize sound driver and load initial instruments&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x800299C8&lt;br /&gt;
|void AkaoDeinitialize(void)&lt;br /&gt;
|Deinitialize sound driver&lt;br /&gt;
|-&lt;br /&gt;
|0x80029AF0&lt;br /&gt;
|void AkaoSetReverbMode(int mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029B78&lt;br /&gt;
|void _AkaoTransferSeqBody(const unsigned char *data, int size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029C48&lt;br /&gt;
|void _AkaoLoadTracks(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002DA30&lt;br /&gt;
|void AkaoNewMessage(AkaoMessage **ppMessage)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002DA7C&lt;br /&gt;
|int AkaoPostMessage(void)&lt;br /&gt;
|Post a new command message to the queue (with some wrapped processing)&lt;br /&gt;
&lt;br /&gt;
The message data comes from a global variable at 0x8009A000.&lt;br /&gt;
&lt;br /&gt;
Return value depends on the content of the message data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Opcode 0x10'''&lt;br /&gt;
&lt;br /&gt;
Load and start playing new [[FF7/PSX/Sound/AKAO sequence|AKAO sequence]]&lt;br /&gt;
&lt;br /&gt;
Returns: 0 for success, 1 for already loaded, and -1 for invalid signature&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Opcode 0x92'''&lt;br /&gt;
&lt;br /&gt;
Set value to the condition variable used by Opcode 0xEF.&lt;br /&gt;
|-&lt;br /&gt;
|0x8002E1A8&lt;br /&gt;
|void _AkaoDispatchMessages(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002E23C&lt;br /&gt;
|void _AkaoWriteSpuRegisters(int voiceNum, AkaoSpuVoiceAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002E478&lt;br /&gt;
|void _AkaoDspOnTick(AkaoPlayerTrack *track, AkaoPlayer *player, int voiceMask)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002ED34&lt;br /&gt;
|void _AkaoCalculateVolumeAndPitch(AkaoPlayerTrack *track, int voiceMask, int voiceNum)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002F24C&lt;br /&gt;
|void _AkaoCalculateVolumeAndPitch2(AkaoPlayerTrack *track, int voiceMask)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002F738&lt;br /&gt;
|void _AkaoDspOverlayVoice(AkaoPlayerTrack *track, int unknownVoiceMask, int voiceNum)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002F848&lt;br /&gt;
|void _AkaoDspMain(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002FF4C&lt;br /&gt;
|void _AkaoSpuNoiseVoice(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030038&lt;br /&gt;
|void _AkaoSpuReverbVoice(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030148&lt;br /&gt;
|void _AkaoSpuPitchLFOVoice(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030234&lt;br /&gt;
|int _AkaoCallback(void)&lt;br /&gt;
|Callback event for sound, registered by OpenEvent BIOS function&lt;br /&gt;
|-&lt;br /&gt;
|0x80030E7C&lt;br /&gt;
|void _AkaoDispatchVoice(struct MusicPlayerTrack *track, void *a1, int a2)&lt;br /&gt;
|Dispatch voice opcodes until the next note or end of track&lt;br /&gt;
|-&lt;br /&gt;
|0x80049548&lt;br /&gt;
|void (* const MESSAGE_HANDLERS[256])(struct AkaoMessage *)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80049948&lt;br /&gt;
|const unsigned char VOICE_OPCODE_LENGTHS[0x60]&lt;br /&gt;
|Length table for voice opcodes 0xa0-0xff&lt;br /&gt;
&lt;br /&gt;
0 for end of track and branches&lt;br /&gt;
|-&lt;br /&gt;
|0x80049AA8&lt;br /&gt;
|void (* const VOICE_OPCODES[0x60])(struct MusicPlayerTrack *, void *, int)&lt;br /&gt;
|Address table for voice opcodes 0xa0-0xff&lt;br /&gt;
|-&lt;br /&gt;
|0x80049C44&lt;br /&gt;
|const unsigned short VOLUME_TABLE_L[256]&lt;br /&gt;
|See [[FF7/PSX/Sound/Opcodes/0xa8aa|Opcode 0xAA]] for volume balance calculation&lt;br /&gt;
|-&lt;br /&gt;
|0x80049E44&lt;br /&gt;
|const unsigned short VOLUME_TABLE_R[256]&lt;br /&gt;
|See [[FF7/PSX/Sound/Opcodes/0xa8aa|Opcode 0xAA]] for volume balance calculation&lt;br /&gt;
|-&lt;br /&gt;
|0x80083580&lt;br /&gt;
|unsigned char g_AkaoSeqData[]&lt;br /&gt;
|RAM area to load AKAO sequence data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Runtime Library Functions ==&lt;br /&gt;
&lt;br /&gt;
=== LIBSPU ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x80036298&lt;br /&gt;
|void SpuInit(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80036FFC&lt;br /&gt;
|long SpuInitMalloc(long num, char *top)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800373AC&lt;br /&gt;
|long SpuMallocWithStartAddr(unsigned long addr, long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037964&lt;br /&gt;
|unsigned long SpuSetNoiseVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037B90&lt;br /&gt;
|long SpuSetNoiseClock(long n_clock)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037BE0&lt;br /&gt;
|unsigned long SpuRead(unsigned char *addr, unsigned long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037C40&lt;br /&gt;
|long SpuSetReverb(long on_off)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037D90&lt;br /&gt;
|long SpuGetReverb(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037E1C&lt;br /&gt;
|long SpuSetReverbModeParam(SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800387FC&lt;br /&gt;
|void SpuGetReverbModeParam (SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003884C&lt;br /&gt;
|long SpuSetReverbDepth(SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800388C4&lt;br /&gt;
|unsigned long SpuSetReverbVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800388E8&lt;br /&gt;
|long SpuClearReverbWorkArea(long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038A84&lt;br /&gt;
|long SpuSetIRQ(long on_off)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038BC4&lt;br /&gt;
|unsigned long SpuSetIRQAddr(unsigned long addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038C04&lt;br /&gt;
|SpuIRQCallbackProc SpuSetIRQCallback(SpuIRQCallbackProc func)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038C6C&lt;br /&gt;
|void SpuSetKey(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038F04&lt;br /&gt;
|unsigned long SpuWrite(unsigned char *addr, unsigned long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038F64&lt;br /&gt;
|unsigned long SpuSetTransferStartAddr(unsigned long addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038FB8&lt;br /&gt;
|long SpuSetTransferMode(long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038FEC&lt;br /&gt;
|SpuTransferCallbackProc SpuSetTransferCallback(SpuTransferCallbackProc func)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039010&lt;br /&gt;
|unsigned long SpuSetPitchLFOVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039034&lt;br /&gt;
|void SpuSetCommonAttr(SpuCommonAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800393C8&lt;br /&gt;
|void SpuSetVoiceVolume(int voiceNum, short volL, short volR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039450&lt;br /&gt;
|void SpuSetVoiceVolumeAttr(int voiceNum, short volL, short volR, short volModeL, short volModeR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800395C8&lt;br /&gt;
|void SpuSetVoicePitch(int voiceNum, unsigned short pitch)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039644&lt;br /&gt;
|void SpuSetVoiceStartAddr(int voiceNum, unsigned long startAddr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800396C0&lt;br /&gt;
|void SpuSetVoiceLoopStartAddr(int voiceNum, unsigned long lsa)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003973C&lt;br /&gt;
|void SpuSetVoiceDR(int voiceNum, unsigned short DR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800397C8&lt;br /&gt;
|void SpuSetVoiceSL(int voiceNum, unsigned short SL)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039850&lt;br /&gt;
|void SpuSetVoiceARAttr(int voiceNum, unsigned short AR, long ARmode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800398EC&lt;br /&gt;
|void SpuSetVoiceSRAttr(int voiceNum, unsigned short SR, long SRmode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800399D0&lt;br /&gt;
|void SpuSetVoiceRRAttr(int voiceNum, unsigned short RR, long RRmode)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LIBETC ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D0C0&lt;br /&gt;
|int ResetCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D150&lt;br /&gt;
|int VSyncCallback(void (*func)(void))&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D1B4&lt;br /&gt;
|int StopCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D214&lt;br /&gt;
|int CheckCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LIBAPI ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x800429F0&lt;br /&gt;
|void DeliverEvent(unsigned long ev1, unsigned long ev2)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A00&lt;br /&gt;
|long OpenEvent(unsigned long desc, long spec, long mode, long (*func)())&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A10&lt;br /&gt;
|long CloseEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A20&lt;br /&gt;
|long WaitEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A40&lt;br /&gt;
|long EnableEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A50&lt;br /&gt;
|long DisableEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042BC0&lt;br /&gt;
|long SetRCnt(unsigned long spec, unsigned short target, long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042C60&lt;br /&gt;
|long GetRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042C98&lt;br /&gt;
|long StartRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042CCC&lt;br /&gt;
|long StopRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Structures =&lt;br /&gt;
&lt;br /&gt;
[[FF7/PSX/Sound/INSTRx.DAT|struct AkaoInstrumentAttr]]&lt;br /&gt;
&lt;br /&gt;
[[FF7/PSX/Sound/INSTRx.ALL|struct AkaoSampleSet]]&lt;br /&gt;
&lt;br /&gt;
[[FF7/PSX/Sound/AKAO sequence|struct AkaoSeqHeader]]&lt;br /&gt;
&lt;br /&gt;
 struct AkaoMessage // 36 bytes long&lt;br /&gt;
 {&lt;br /&gt;
   uint16_t opcode;&lt;br /&gt;
   uint16_t reserved;&lt;br /&gt;
   uint32_t data[8];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoSpuVoiceAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t voice;          // 0x00: voice number&lt;br /&gt;
   uint32_t update_flags;   // 0x04: bitset that indicates what SPU registers need to be updated&lt;br /&gt;
   uint32_t addr;           // 0x08: waveform data start address (SPU address)&lt;br /&gt;
   uint32_t loop_addr;      // 0x0c: loop start address (SPU address)&lt;br /&gt;
   uint32_t a_mode;         // 0x10: ADSR: attack rate mode&lt;br /&gt;
   uint32_t s_mode;         // 0x14: ADSR: sustain rate mode&lt;br /&gt;
   uint32_t r_mode          // 0x18: ADSR: release rate mode&lt;br /&gt;
   uint16_t pitch;          // 0x1c: pitch&lt;br /&gt;
   uint16_t ar;             // 0x1e: ADSR: attack rate&lt;br /&gt;
   uint16_t dr;             // 0x20: ADSR: decay rate&lt;br /&gt;
   uint16_t sl;             // 0x22: ADSR: sustain level&lt;br /&gt;
   uint16_t sr;             // 0x24: ADSR: sustain rate&lt;br /&gt;
   uint16_t rr;             // 0x26: ADSR: release rate&lt;br /&gt;
   SpuVolume volume;        // 0x28: volume (left and right)&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoPlayer // the music player instance exists at 0x8009A104&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t stereo_mode;                 // 0x00: stereo mode (1: stereo, 4: surround, otherwise: mono)&lt;br /&gt;
   uint32_t active_voices;               // 0x04: bitset that indicates the voices currently in use&lt;br /&gt;
   uint32_t key_on_voices;               // 0x08: bitset that indicates the voices to key on&lt;br /&gt;
   uint32_t keyed_voices;                // 0x0c: bitset that indicates the voices currently keyed on&lt;br /&gt;
   uint32_t key_off_voices;              // 0x10: bitset that indicates the voices to key off&lt;br /&gt;
   uint32_t saved_active_voices;         // 0x14: unknown voice bitset&lt;br /&gt;
   uint32_t tempo;                       // 0x18: tempo (Q16 fixed-point number)&lt;br /&gt;
   int32_t tempo_slope;                  // 0x1c: slope of tempo slider (Q16 fixed-point number)&lt;br /&gt;
   uint32_t time_counter;                // 0x20: time counter (0x10000 = 1 tick)&lt;br /&gt;
   uint32_t overlay_voices;              // 0x24: bitset that indicates the sub-voices used for overlay (opcode 0xF4)&lt;br /&gt;
   uint32_t alternate_voices;            // 0x28: bitset that indicates the sub-voices used for alternate voice (opcode 0xF8)&lt;br /&gt;
   uint32_t noise_voices;                // 0x2c: bitset that indicates the voices with noise mode enabled&lt;br /&gt;
   uint32_t reverb_voices;               // 0x30: bitset that indicates the voices with reverb enabled&lt;br /&gt;
   uint32_t pitch_lfo_voices;            // 0x34: bitset that indicates the voices with pitch LFO (frequency modulation) mode enabled&lt;br /&gt;
   uint32_t spucnt;                      // 0x38: SPUCNT shadow&lt;br /&gt;
   uint32_t reverb_type;                 // 0x3c: reverb type&lt;br /&gt;
   uint32_t reverb_depth;                // 0x40: reverb depth (Q16 fixed-point number)&lt;br /&gt;
   int32_t reverb_depth_slope;           // 0x44: slope of reverb depth slider (Q16 fixed-point number)&lt;br /&gt;
   uint16_t tempo_slide_length;          // 0x48: tempo slide length&lt;br /&gt;
   uint16_t song_id;                     // 0x4a: current song id&lt;br /&gt;
   uint16_t condition_ack;               // 0x4c: the last matched condition value (opcode 0xEF)&lt;br /&gt;
   uint16_t condition;                   // 0x4e: condition variable for dynamic branching according to game status (opcode 0xEF)&lt;br /&gt;
   uint16_t reverb_depth_slide_length;   // 0x50: length of reverb depth slide&lt;br /&gt;
   uint16_t noise_clock;                 // 0x52: noise clock frequency&lt;br /&gt;
   uint16_t field_54;                    // 0x54: unknown&lt;br /&gt;
   uint16_t beats_per_measure;           // 0x56: beats per measure&lt;br /&gt;
   uint16_t beat;                        // 0x58: current beat&lt;br /&gt;
   uint16_t ticks_per_beat;              // 0x5a: ticks per beat&lt;br /&gt;
   uint16_t tick;                        // 0x5c: current ticks per beat&lt;br /&gt;
   uint16_t measure;                     // 0x5e: current measure&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoPlayerTrack // the music player track instances exist at 0x80096608 + (N * 0x108)&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t *addr;                                    // 0x00&lt;br /&gt;
   uint8_t *loop_addrs[4];                           // 0x04&lt;br /&gt;
   AkaoDrumKeyAttr *drum_addr;                       // 0x14&lt;br /&gt;
   int16_t *vibrato_lfo_addr;                        // 0x18&lt;br /&gt;
   int16_t *tremolo_lfo_addr;                        // 0x1C&lt;br /&gt;
   int16_t *pan_lfo_addr;                            // 0x20&lt;br /&gt;
   uint32_t overlay_voice_num;                       // 0x24&lt;br /&gt;
   uint32_t alternate_voice_num;                     // 0x28&lt;br /&gt;
   uint32_t master_volume;                           // 0x2C&lt;br /&gt;
   uint32_t pitch_of_note;                           // 0x30&lt;br /&gt;
   int32_t pitch_bend_slide_amplitude;               // 0x34&lt;br /&gt;
   uint16_t voice_effect_flags;                      // 0x38&lt;br /&gt;
   uint16_t field_3A;                                // 0x3A&lt;br /&gt;
   uint16_t field_3C;                                // 0x3C&lt;br /&gt;
   uint16_t field_3E;                                // 0x3E&lt;br /&gt;
   uint32_t field_40;                                // 0x40&lt;br /&gt;
   uint32_t volume;                                  // 0x44&lt;br /&gt;
   int32_t volume_slope;                             // 0x48&lt;br /&gt;
   int32_t pitch_bend_slope;                         // 0x4C&lt;br /&gt;
   uint16_t field_50;                                // 0x50&lt;br /&gt;
   uint16_t field_52;                                // 0x52&lt;br /&gt;
   uint16_t field_54;                                // 0x54&lt;br /&gt;
   uint8_t delta_time_counter;                       // 0x56&lt;br /&gt;
   uint8_t gate_time_counter;                        // 0x57&lt;br /&gt;
   uint16_t instrument;                              // 0x58&lt;br /&gt;
   uint16_t field_5A;                                // 0x5A&lt;br /&gt;
   uint16_t volume_slide_length_counter;             // 0x5C&lt;br /&gt;
   uint16_t overlay_balance_slide_length_counter;    // 0x5E&lt;br /&gt;
   uint16_t pan;                                     // 0x60&lt;br /&gt;
   uint16_t pan_slide_length;                        // 0x62&lt;br /&gt;
   int16_t pitch_slide_length_counter;               // 0x64&lt;br /&gt;
   uint16_t octave;                                  // 0x66&lt;br /&gt;
   uint16_t pitch_slide_length;                      // 0x68&lt;br /&gt;
   uint16_t previous_note_number;                    // 0x6A&lt;br /&gt;
   uint16_t portamento_speed;                        // 0x6C&lt;br /&gt;
   uint16_t legato_flags;                            // 0x6E&lt;br /&gt;
   uint16_t field_70;                                // 0x70&lt;br /&gt;
   uint16_t vibrato_lfo_delay;                       // 0x72&lt;br /&gt;
   uint16_t vibrato_delay_counter;                   // 0x74&lt;br /&gt;
   uint16_t vibrato_rate;                            // 0x76&lt;br /&gt;
   uint16_t vibrato_rate_counter;                    // 0x78&lt;br /&gt;
   uint16_t vibrato_form;                            // 0x7A&lt;br /&gt;
   uint16_t vibrato_max_amplitude;                   // 0x7C&lt;br /&gt;
   uint16_t vibrato_depth;                           // 0x7E&lt;br /&gt;
   uint16_t vibrato_depth_slide_length_counter;      // 0x80&lt;br /&gt;
   int16_t vibrato_depth_slope;                      // 0x82&lt;br /&gt;
   uint16_t field_84;                                // 0x84&lt;br /&gt;
   uint16_t tremolo_delay;                           // 0x86&lt;br /&gt;
   uint16_t tremolo_delay_counter;                   // 0x88&lt;br /&gt;
   uint16_t tremolo_rate;                            // 0x8A&lt;br /&gt;
   uint16_t tremolo_rate_counter;                    // 0x8C&lt;br /&gt;
   uint16_t tremolo_form;                            // 0x8E&lt;br /&gt;
   uint16_t tremolo_depth;                           // 0x90&lt;br /&gt;
   uint16_t tremolo_depth_slide_length_counter;      // 0x92&lt;br /&gt;
   int16_t tremolo_depth_slope;                      // 0x94&lt;br /&gt;
   uint16_t field_96;                                // 0x96&lt;br /&gt;
   uint16_t pan_lfo_rate;                            // 0x98&lt;br /&gt;
   uint16_t pan_lfo_rate_counter;                    // 0x9A&lt;br /&gt;
   uint16_t pan_lfo_form;                            // 0x9C&lt;br /&gt;
   uint16_t pan_lfo_depth;                           // 0x9E&lt;br /&gt;
   uint16_t pan_lfo_depth_slide_length_counter;      // 0xA0&lt;br /&gt;
   int16_t pan_lfo_slope;                            // 0xA2&lt;br /&gt;
   uint16_t noise_on_off_delay_counter;              // 0xA4&lt;br /&gt;
   uint16_t pitchmod_on_off_delay_counter;           // 0xA6&lt;br /&gt;
   uint8_t field_A8[16];                             // 0xA8&lt;br /&gt;
   uint16_t loop_layer;                              // 0xB8&lt;br /&gt;
   uint16_t loop_counts[4];                          // 0xBA&lt;br /&gt;
   uint16_t previous_delta_time;                     // 0xC2&lt;br /&gt;
   uint16_t forced_delta_time;                       // 0xC4&lt;br /&gt;
   uint16_t overlay_balance;                         // 0xC6&lt;br /&gt;
   int16_t overlay_balance_slope;                    // 0xC8&lt;br /&gt;
   int16_t pan_slope;                                // 0xCA&lt;br /&gt;
   int16_t transpose;                                // 0xCC&lt;br /&gt;
   int16_t tuning;                                   // 0xCE&lt;br /&gt;
   uint16_t note;                                    // 0xD0&lt;br /&gt;
   int16_t pitch_slide_amount;                       // 0xD2&lt;br /&gt;
   int16_t previous_transpose;                       // 0xD4&lt;br /&gt;
   int16_t vibrato_lfo_amplitude;                    // 0xD6&lt;br /&gt;
   int16_t tremolo_lfo_amplitude;                    // 0xD8&lt;br /&gt;
   int16_t pan_lfo_amplitude;                        // 0xDA&lt;br /&gt;
   AkaoSpuVoiceAttr spu_attr;                        // 0xDC&lt;br /&gt;
 };&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Code_Map&amp;diff=5737</id>
		<title>FF7/PSX/Sound/Code Map</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Code_Map&amp;diff=5737"/>
		<updated>2020-06-07T14:09:45Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Code Map =&lt;br /&gt;
&lt;br /&gt;
Introduces functions, variables and data related to sound, contained in SCUS_941.63 (game program of US version). Note that all symbol names below are for convenience only.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x800293D0&lt;br /&gt;
|void _AkaoSpuTransferCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800293F4&lt;br /&gt;
|void _AkaoSpuSetTransferCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029424&lt;br /&gt;
|unsigned int _AkaoTransferSamples(const unsigned char *addr, unsigned int size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800294A4&lt;br /&gt;
|void _AkaoWaitForSpuTransfer(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800294BC&lt;br /&gt;
|void _AkaoReset(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800297A4&lt;br /&gt;
|void AkaoLoadInstrumentSet(const sturct AkaoSampleSet *sampleSet, const struct AkaoInstrumentAttr *instrumentSet)&lt;br /&gt;
|Load standard instrument set&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR.DAT&lt;br /&gt;
&lt;br /&gt;
This function is called transparently from 0x8002988C.&lt;br /&gt;
|-&lt;br /&gt;
|0x80029818&lt;br /&gt;
|void AkaoLoadInstrumentSet2(const sturct AkaoSampleSet *sampleSet, const struct AkaoInstrumentAttr *instrumentSet)&lt;br /&gt;
|Load additional instrument set&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR2.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR2.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x8002988C&lt;br /&gt;
|void AkaoInitialize(const sturct AkaoSampleSet *sampleSet, const struct AkaoInstrumentAttr *instrumentSet)&lt;br /&gt;
|Initialize sound driver and load initial instruments&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x800299C8&lt;br /&gt;
|void AkaoDeinitialize(void)&lt;br /&gt;
|Deinitialize sound driver&lt;br /&gt;
|-&lt;br /&gt;
|0x80029AF0&lt;br /&gt;
|void AkaoSetReverbMode(int mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029B78&lt;br /&gt;
|void _AkaoTransferSeqBody(const unsigned char *data, int size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029C48&lt;br /&gt;
|void _AkaoLoadTracks(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002DA30&lt;br /&gt;
|void AkaoNewMessage(AkaoMessage **ppMessage)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002DA7C&lt;br /&gt;
|int AkaoPostMessage(void)&lt;br /&gt;
|Post a new command message to the queue (with some wrapped processing)&lt;br /&gt;
&lt;br /&gt;
The message data comes from a global variable at 0x8009A000.&lt;br /&gt;
&lt;br /&gt;
Return value depends on the content of the message data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Opcode 0x10'''&lt;br /&gt;
&lt;br /&gt;
Load and start playing new [[FF7/PSX/Sound/AKAO sequence|AKAO sequence]]&lt;br /&gt;
&lt;br /&gt;
Returns: 0 for success, 1 for already loaded, and -1 for invalid signature&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Opcode 0x92'''&lt;br /&gt;
&lt;br /&gt;
Set value to the condition variable used by Opcode 0xEF.&lt;br /&gt;
|-&lt;br /&gt;
|0x8002E1A8&lt;br /&gt;
|void _AkaoDispatchMessages(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030234&lt;br /&gt;
|int _AkaoCallback(void)&lt;br /&gt;
|Callback event for sound, registered by OpenEvent BIOS function&lt;br /&gt;
|-&lt;br /&gt;
|0x80030E7C&lt;br /&gt;
|void _AkaoDispatchVoice(struct MusicPlayerTrack *track, void *a1, int a2)&lt;br /&gt;
|Dispatch voice opcodes until the next note or end of track&lt;br /&gt;
|-&lt;br /&gt;
|0x80049548&lt;br /&gt;
|void (* const MESSAGE_HANDLERS[256])(struct AkaoMessage *)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80049948&lt;br /&gt;
|const unsigned char VOICE_OPCODE_LENGTHS[0x60]&lt;br /&gt;
|Length table for voice opcodes 0xa0-0xff&lt;br /&gt;
&lt;br /&gt;
0 for end of track and branches&lt;br /&gt;
|-&lt;br /&gt;
|0x80049AA8&lt;br /&gt;
|void (* const VOICE_OPCODES[0x60])(struct MusicPlayerTrack *, void *, int)&lt;br /&gt;
|Address table for voice opcodes 0xa0-0xff&lt;br /&gt;
|-&lt;br /&gt;
|0x80049C44&lt;br /&gt;
|const unsigned short VOLUME_TABLE_L[256]&lt;br /&gt;
|See [[FF7/PSX/Sound/Opcodes/0xa8aa|Opcode 0xAA]] for volume balance calculation&lt;br /&gt;
|-&lt;br /&gt;
|0x80049E44&lt;br /&gt;
|const unsigned short VOLUME_TABLE_R[256]&lt;br /&gt;
|See [[FF7/PSX/Sound/Opcodes/0xa8aa|Opcode 0xAA]] for volume balance calculation&lt;br /&gt;
|-&lt;br /&gt;
|0x80083580&lt;br /&gt;
|unsigned char g_AkaoSeqData[]&lt;br /&gt;
|RAM area to load AKAO sequence data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Runtime Library Functions ==&lt;br /&gt;
&lt;br /&gt;
=== LIBSPU ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x80036298&lt;br /&gt;
|void SpuInit(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80036FFC&lt;br /&gt;
|long SpuInitMalloc(long num, char *top)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800373AC&lt;br /&gt;
|long SpuMallocWithStartAddr(unsigned long addr, long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037964&lt;br /&gt;
|unsigned long SpuSetNoiseVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037B90&lt;br /&gt;
|long SpuSetNoiseClock(long n_clock)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037BE0&lt;br /&gt;
|unsigned long SpuRead(unsigned char *addr, unsigned long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037C40&lt;br /&gt;
|long SpuSetReverb(long on_off)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037D90&lt;br /&gt;
|long SpuGetReverb(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037E1C&lt;br /&gt;
|long SpuSetReverbModeParam(SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800387FC&lt;br /&gt;
|void SpuGetReverbModeParam (SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003884C&lt;br /&gt;
|long SpuSetReverbDepth(SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800388C4&lt;br /&gt;
|unsigned long SpuSetReverbVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800388E8&lt;br /&gt;
|long SpuClearReverbWorkArea(long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038A84&lt;br /&gt;
|long SpuSetIRQ(long on_off)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038BC4&lt;br /&gt;
|unsigned long SpuSetIRQAddr(unsigned long addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038C04&lt;br /&gt;
|SpuIRQCallbackProc SpuSetIRQCallback(SpuIRQCallbackProc func)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038C6C&lt;br /&gt;
|void SpuSetKey(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038F04&lt;br /&gt;
|unsigned long SpuWrite(unsigned char *addr, unsigned long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038F64&lt;br /&gt;
|unsigned long SpuSetTransferStartAddr(unsigned long addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038FB8&lt;br /&gt;
|long SpuSetTransferMode(long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038FEC&lt;br /&gt;
|SpuTransferCallbackProc SpuSetTransferCallback(SpuTransferCallbackProc func)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039010&lt;br /&gt;
|unsigned long SpuSetPitchLFOVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039034&lt;br /&gt;
|void SpuSetCommonAttr(SpuCommonAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800393C8&lt;br /&gt;
|void SpuSetVoiceVolume(int voiceNum, short volL, short volR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039450&lt;br /&gt;
|void SpuSetVoiceVolumeAttr(int voiceNum, short volL, short volR, short volModeL, short volModeR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800395C8&lt;br /&gt;
|void SpuSetVoicePitch(int voiceNum, unsigned short pitch)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039644&lt;br /&gt;
|void SpuSetVoiceStartAddr(int voiceNum, unsigned long startAddr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800396C0&lt;br /&gt;
|void SpuSetVoiceLoopStartAddr(int voiceNum, unsigned long lsa)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003973C&lt;br /&gt;
|void SpuSetVoiceDR(int voiceNum, unsigned short DR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800397C8&lt;br /&gt;
|void SpuSetVoiceSL(int voiceNum, unsigned short SL)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039850&lt;br /&gt;
|void SpuSetVoiceARAttr(int voiceNum, unsigned short AR, long ARmode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800398EC&lt;br /&gt;
|void SpuSetVoiceSRAttr(int voiceNum, unsigned short SR, long SRmode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800399D0&lt;br /&gt;
|void SpuSetVoiceRRAttr(int voiceNum, unsigned short RR, long RRmode)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LIBETC ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D0C0&lt;br /&gt;
|int ResetCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D150&lt;br /&gt;
|int VSyncCallback(void (*func)(void))&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D1B4&lt;br /&gt;
|int StopCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D214&lt;br /&gt;
|int CheckCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LIBAPI ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x800429F0&lt;br /&gt;
|void DeliverEvent(unsigned long ev1, unsigned long ev2)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A00&lt;br /&gt;
|long OpenEvent(unsigned long desc, long spec, long mode, long (*func)())&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A10&lt;br /&gt;
|long CloseEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A20&lt;br /&gt;
|long WaitEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A40&lt;br /&gt;
|long EnableEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A50&lt;br /&gt;
|long DisableEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042BC0&lt;br /&gt;
|long SetRCnt(unsigned long spec, unsigned short target, long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042C60&lt;br /&gt;
|long GetRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042C98&lt;br /&gt;
|long StartRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042CCC&lt;br /&gt;
|long StopRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Structures =&lt;br /&gt;
&lt;br /&gt;
[[FF7/PSX/Sound/INSTRx.DAT|struct AkaoInstrumentAttr]]&lt;br /&gt;
&lt;br /&gt;
[[FF7/PSX/Sound/INSTRx.ALL|struct AkaoSampleSet]]&lt;br /&gt;
&lt;br /&gt;
[[FF7/PSX/Sound/AKAO sequence|struct AkaoSeqHeader]]&lt;br /&gt;
&lt;br /&gt;
 struct AkaoMessage // 36 bytes long&lt;br /&gt;
 {&lt;br /&gt;
   uint16_t opcode;&lt;br /&gt;
   uint16_t reserved;&lt;br /&gt;
   uint32_t data[8];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoSpuVoiceAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t voice;          // 0x00: voice number&lt;br /&gt;
   uint32_t update_flags;   // 0x04: bitset that indicates what SPU registers need to be updated&lt;br /&gt;
   uint32_t addr;           // 0x08: waveform data start address (SPU address)&lt;br /&gt;
   uint32_t loop_addr;      // 0x0c: loop start address (SPU address)&lt;br /&gt;
   uint32_t a_mode;         // 0x10: ADSR: attack rate mode&lt;br /&gt;
   uint32_t s_mode;         // 0x14: ADSR: sustain rate mode&lt;br /&gt;
   uint32_t r_mode          // 0x18: ADSR: release rate mode&lt;br /&gt;
   uint16_t pitch;          // 0x1c: pitch&lt;br /&gt;
   uint16_t ar;             // 0x1e: ADSR: attack rate&lt;br /&gt;
   uint16_t dr;             // 0x20: ADSR: decay rate&lt;br /&gt;
   uint16_t sl;             // 0x22: ADSR: sustain level&lt;br /&gt;
   uint16_t sr;             // 0x24: ADSR: sustain rate&lt;br /&gt;
   uint16_t rr;             // 0x26: ADSR: release rate&lt;br /&gt;
   SpuVolume volume;        // 0x28: volume (left and right)&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoPlayer // the music player instance exists at 0x8009A104&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t stereo_mode;                 // 0x00: stereo mode (1: stereo, 4: surround, otherwise: mono)&lt;br /&gt;
   uint32_t active_voices;               // 0x04: bitset that indicates the voices currently in use&lt;br /&gt;
   uint32_t key_on_voices;               // 0x08: bitset that indicates the voices to key on&lt;br /&gt;
   uint32_t keyed_voices;                // 0x0c: bitset that indicates the voices currently keyed on&lt;br /&gt;
   uint32_t key_off_voices;              // 0x10: bitset that indicates the voices to key off&lt;br /&gt;
   uint32_t saved_active_voices;         // 0x14: unknown voice bitset&lt;br /&gt;
   uint32_t tempo;                       // 0x18: tempo (Q16 fixed-point number)&lt;br /&gt;
   int32_t tempo_slope;                  // 0x1c: slope of tempo slider (Q16 fixed-point number)&lt;br /&gt;
   uint32_t time_counter;                // 0x20: time counter (0x10000 = 1 tick)&lt;br /&gt;
   uint32_t overlay_voices;              // 0x24: bitset that indicates the sub-voices used for overlay (opcode 0xF4)&lt;br /&gt;
   uint32_t alternate_voices;            // 0x28: bitset that indicates the sub-voices used for alternate voice (opcode 0xF8)&lt;br /&gt;
   uint32_t noise_voices;                // 0x2c: bitset that indicates the voices with noise mode enabled&lt;br /&gt;
   uint32_t reverb_voices;               // 0x30: bitset that indicates the voices with reverb enabled&lt;br /&gt;
   uint32_t pitch_lfo_voices;            // 0x34: bitset that indicates the voices with pitch LFO (frequency modulation) mode enabled&lt;br /&gt;
   uint32_t spucnt;                      // 0x38: SPUCNT shadow&lt;br /&gt;
   uint32_t reverb_type;                 // 0x3c: reverb type&lt;br /&gt;
   uint32_t reverb_depth;                // 0x40: reverb depth (Q16 fixed-point number)&lt;br /&gt;
   int32_t reverb_depth_slope;           // 0x44: slope of reverb depth slider (Q16 fixed-point number)&lt;br /&gt;
   uint16_t tempo_slide_length;          // 0x48: tempo slide length&lt;br /&gt;
   uint16_t song_id;                     // 0x4a: current song id&lt;br /&gt;
   uint16_t condition_ack;               // 0x4c: the last matched condition value (opcode 0xEF)&lt;br /&gt;
   uint16_t condition;                   // 0x4e: condition variable for dynamic branching according to game status (opcode 0xEF)&lt;br /&gt;
   uint16_t reverb_depth_slide_length;   // 0x50: length of reverb depth slide&lt;br /&gt;
   uint16_t noise_clock;                 // 0x52: noise clock frequency&lt;br /&gt;
   uint16_t field_54;                    // 0x54: unknown&lt;br /&gt;
   uint16_t beats_per_measure;           // 0x56: beats per measure&lt;br /&gt;
   uint16_t beat;                        // 0x58: current beat&lt;br /&gt;
   uint16_t ticks_per_beat;              // 0x5a: ticks per beat&lt;br /&gt;
   uint16_t tick;                        // 0x5c: current ticks per beat&lt;br /&gt;
   uint16_t measure;                     // 0x5e: current measure&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoPlayerTrack // the music player track instances exist at 0x80096608 + (N * 0x108)&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t *addr;                                    // 0x00&lt;br /&gt;
   uint8_t *loop_addrs[4];                           // 0x04&lt;br /&gt;
   AkaoDrumKeyAttr *drum_addr;                       // 0x14&lt;br /&gt;
   int16_t *vibrato_lfo_addr;                        // 0x18&lt;br /&gt;
   int16_t *tremolo_lfo_addr;                        // 0x1C&lt;br /&gt;
   int16_t *pan_lfo_addr;                            // 0x20&lt;br /&gt;
   uint32_t overlay_voice_num;                       // 0x24&lt;br /&gt;
   uint32_t alternate_voice_num;                     // 0x28&lt;br /&gt;
   uint32_t master_volume;                           // 0x2C&lt;br /&gt;
   uint32_t pitch_of_note;                           // 0x30&lt;br /&gt;
   int32_t pitch_bend_slide_amplitude;               // 0x34&lt;br /&gt;
   uint16_t voice_effect_flags;                      // 0x38&lt;br /&gt;
   uint16_t field_3A;                                // 0x3A&lt;br /&gt;
   uint16_t field_3C;                                // 0x3C&lt;br /&gt;
   uint16_t field_3E;                                // 0x3E&lt;br /&gt;
   uint32_t field_40;                                // 0x40&lt;br /&gt;
   uint32_t volume;                                  // 0x44&lt;br /&gt;
   int32_t volume_slope;                             // 0x48&lt;br /&gt;
   int32_t pitch_bend_slope;                         // 0x4C&lt;br /&gt;
   uint16_t field_50;                                // 0x50&lt;br /&gt;
   uint16_t field_52;                                // 0x52&lt;br /&gt;
   uint16_t field_54;                                // 0x54&lt;br /&gt;
   uint8_t delta_time_counter;                       // 0x56&lt;br /&gt;
   uint8_t gate_time_counter;                        // 0x57&lt;br /&gt;
   uint16_t instrument;                              // 0x58&lt;br /&gt;
   uint16_t field_5A;                                // 0x5A&lt;br /&gt;
   uint16_t volume_slide_length_counter;             // 0x5C&lt;br /&gt;
   uint16_t overlay_balance_slide_length_counter;    // 0x5E&lt;br /&gt;
   uint16_t pan;                                     // 0x60&lt;br /&gt;
   uint16_t pan_slide_length;                        // 0x62&lt;br /&gt;
   int16_t pitch_slide_length_counter;               // 0x64&lt;br /&gt;
   uint16_t octave;                                  // 0x66&lt;br /&gt;
   uint16_t pitch_slide_length;                      // 0x68&lt;br /&gt;
   uint16_t previous_note_number;                    // 0x6A&lt;br /&gt;
   uint16_t portamento_speed;                        // 0x6C&lt;br /&gt;
   uint16_t legato_flags;                            // 0x6E&lt;br /&gt;
   uint16_t field_70;                                // 0x70&lt;br /&gt;
   uint16_t vibrato_lfo_delay;                       // 0x72&lt;br /&gt;
   uint16_t vibrato_delay_counter;                   // 0x74&lt;br /&gt;
   uint16_t vibrato_rate;                            // 0x76&lt;br /&gt;
   uint16_t vibrato_rate_counter;                    // 0x78&lt;br /&gt;
   uint16_t vibrato_form;                            // 0x7A&lt;br /&gt;
   uint16_t vibrato_max_amplitude;                   // 0x7C&lt;br /&gt;
   uint16_t vibrato_depth;                           // 0x7E&lt;br /&gt;
   uint16_t vibrato_depth_slide_length_counter;      // 0x80&lt;br /&gt;
   int16_t vibrato_depth_slope;                      // 0x82&lt;br /&gt;
   uint16_t field_84;                                // 0x84&lt;br /&gt;
   uint16_t tremolo_delay;                           // 0x86&lt;br /&gt;
   uint16_t tremolo_delay_counter;                   // 0x88&lt;br /&gt;
   uint16_t tremolo_rate;                            // 0x8A&lt;br /&gt;
   uint16_t tremolo_rate_counter;                    // 0x8C&lt;br /&gt;
   uint16_t tremolo_form;                            // 0x8E&lt;br /&gt;
   uint16_t tremolo_depth;                           // 0x90&lt;br /&gt;
   uint16_t tremolo_depth_slide_length_counter;      // 0x92&lt;br /&gt;
   int16_t tremolo_depth_slope;                      // 0x94&lt;br /&gt;
   uint16_t field_96;                                // 0x96&lt;br /&gt;
   uint16_t pan_lfo_rate;                            // 0x98&lt;br /&gt;
   uint16_t pan_lfo_rate_counter;                    // 0x9A&lt;br /&gt;
   uint16_t pan_lfo_form;                            // 0x9C&lt;br /&gt;
   uint16_t pan_lfo_depth;                           // 0x9E&lt;br /&gt;
   uint16_t pan_lfo_depth_slide_length_counter;      // 0xA0&lt;br /&gt;
   int16_t pan_lfo_slope;                            // 0xA2&lt;br /&gt;
   uint16_t noise_on_off_delay_counter;              // 0xA4&lt;br /&gt;
   uint16_t pitchmod_on_off_delay_counter;           // 0xA6&lt;br /&gt;
   uint8_t field_A8[16];                             // 0xA8&lt;br /&gt;
   uint16_t loop_layer;                              // 0xB8&lt;br /&gt;
   uint16_t loop_counts[4];                          // 0xBA&lt;br /&gt;
   uint16_t previous_delta_time;                     // 0xC2&lt;br /&gt;
   uint16_t forced_delta_time;                       // 0xC4&lt;br /&gt;
   uint16_t overlay_balance;                         // 0xC6&lt;br /&gt;
   int16_t overlay_balance_slope;                    // 0xC8&lt;br /&gt;
   int16_t pan_slope;                                // 0xCA&lt;br /&gt;
   int16_t transpose;                                // 0xCC&lt;br /&gt;
   int16_t tuning;                                   // 0xCE&lt;br /&gt;
   uint16_t note;                                    // 0xD0&lt;br /&gt;
   int16_t pitch_slide_amount;                       // 0xD2&lt;br /&gt;
   int16_t previous_transpose;                       // 0xD4&lt;br /&gt;
   int16_t vibrato_lfo_amplitude;                    // 0xD6&lt;br /&gt;
   int16_t tremolo_lfo_amplitude;                    // 0xD8&lt;br /&gt;
   int16_t pan_lfo_amplitude;                        // 0xDA&lt;br /&gt;
   AkaoSpuVoiceAttr spu_attr;                        // 0xDC&lt;br /&gt;
 };&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/AKAO_sequence&amp;diff=5736</id>
		<title>FF7/PSX/Sound/AKAO sequence</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/AKAO_sequence&amp;diff=5736"/>
		<updated>2020-06-07T14:06:15Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
AKAO sequence is the most complicated part of the FF7 sound system. (&amp;quot;AKAO&amp;quot; is the signature string, which implies that the sound format has developed by Square Enix sound programmer Minoru Akao.)&lt;br /&gt;
&lt;br /&gt;
AKAO sequence is similar to MIDI sequence - it's custom tracker format for playing sequence sound, well tuned specially for PSX.&lt;br /&gt;
&lt;br /&gt;
The sequence data can be found in all FF7 game modules: Field, Battle, Worldmap and in minigames.&lt;br /&gt;
&lt;br /&gt;
All files with exension *.SND are AKAO.&lt;br /&gt;
&lt;br /&gt;
* '''MINI/ASERI2.SND''' - Battle Arena theme&lt;br /&gt;
* '''MINI/SENSUI.SND''' - used in Submarine minigame&lt;br /&gt;
* '''ENEMY6/OVER2.SND''' - game over sequence&lt;br /&gt;
* '''ENEMY6/FAN2.SND''' - battle win &amp;quot;fanfare&amp;quot; sequence&lt;br /&gt;
* '''MOVIE/OVER2.SND''' - same game over sequence, don't know, why to duplicate data&lt;br /&gt;
&lt;br /&gt;
Other AKAO sequences are hard-wired in other files.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
=== Header (size: 16 bytes) ===&lt;br /&gt;
&lt;br /&gt;
 struct AkaoSeqHeader&lt;br /&gt;
 {&lt;br /&gt;
   static const uint8_t magic[4];  // &amp;quot;AKAO&amp;quot; C-string&lt;br /&gt;
   uint16_t id;                    // song ID, used for playing sequence&lt;br /&gt;
   uint16_t length;                // data length - sizeof(header)&lt;br /&gt;
   uint16_t reverb_type;           // reverb type (range from 0 to 9)&lt;br /&gt;
   struct AkaoTimeStamp timestamp; // creation time&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoTimeStamp&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t year_bcd;               // year (in binary coded decimal)&lt;br /&gt;
   uint8_t month_bcd;              // month (in binary coded decimal, between 0x01 - 0x12)&lt;br /&gt;
   uint8_t day_bcd;                // day (in binary coded decimal, between 0x01 - 0x31)&lt;br /&gt;
   uint8_t hours_bcd;              // hours (in binary coded decimal, between 0x00 - 0x23)&lt;br /&gt;
   uint8_t minutes_bcd;            // minutes (in binary coded decimal, between 0x00 - 0x59)&lt;br /&gt;
   uint8_t seconds_bcd;            // seconds (in binary coded decimal, between 0x00 - 0x59)&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
=== Channel Info (size: 4 bytes + 2 bytes * &amp;lt;channels count&amp;gt;) ===&lt;br /&gt;
 struct AkaoChannelInfo&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t mask;                         // represents bitmask of used channels in this song&lt;br /&gt;
   uint32_t start_offsets[num_channels];  // offsets to channel opcode data&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 int num_channels = 0;&lt;br /&gt;
 while (int bit = 0; ((info.mask &amp;amp; 0xFFFFFF) &amp;amp; (1 &amp;lt;&amp;lt; bit)) != 0; bit++)&lt;br /&gt;
   num_channels++;&lt;br /&gt;
&lt;br /&gt;
First there is 32-bit number (offset 0x10), which represents bitmask of used channels in this song.&lt;br /&gt;
&lt;br /&gt;
After this bitmask, there is &amp;lt;channels count&amp;gt; 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.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Channel Commands [AKAO Opcodes] ===&lt;br /&gt;
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 &amp;quot;opcodes&amp;quot;. Every opcode has its own number of arguments (from no-arguments, to 3 arguments).&lt;br /&gt;
&lt;br /&gt;
=== Drum Instrument Map Table ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
The table consists of a repetition of 5-byte items.&lt;br /&gt;
&lt;br /&gt;
 struct AkaoDrumKeyAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t instrument;   // corresponding to opcode 0xA1&lt;br /&gt;
   uint8_t key;          // note number when playing the drum note&lt;br /&gt;
   uint16_t volume;      // corresponding to opcode 0xA8 (lower 8bit is a fractional part of the volume)&lt;br /&gt;
   uint8_t pan;          // corresponding to opcode 0xAA&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Example (Home-Created AKAO Sequence): ==&lt;br /&gt;
=== Header ===&lt;br /&gt;
'''41 4b 41 4f''' - AKAO string&lt;br /&gt;
&lt;br /&gt;
'''34 12''' - song ID: 0x1234&lt;br /&gt;
&lt;br /&gt;
'''16 00''' - data length 0x16 in hex or 22 in decimal&lt;br /&gt;
&lt;br /&gt;
'''04 00''' - reverb type: 4 (large studio)&lt;br /&gt;
&lt;br /&gt;
'''96 12 18 22 46 28''' - created at 1996-12-18 22:46:28&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Channel Info ===&lt;br /&gt;
'''01 00 00 00''' - this indicates, that used only one channel&lt;br /&gt;
&lt;br /&gt;
'''00 00''' - offset to first channel opcodes: in our example 0x00 means that next to this offset is opcodes for first channel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Channel Commands ===&lt;br /&gt;
'''e8 a8 66''' - sets tempo, parameter 0x66a8&lt;br /&gt;
&lt;br /&gt;
'''ea 00 50''' - sets reverb depth&lt;br /&gt;
&lt;br /&gt;
'''a8 55''' - load sample 0x55 from INSTR.ALL to channel&lt;br /&gt;
&lt;br /&gt;
'''aa 40''' - sets channel volume&lt;br /&gt;
&lt;br /&gt;
'''c2''' - turns on reverb effect&lt;br /&gt;
&lt;br /&gt;
'''a1 0c''' - sets volume pan&lt;br /&gt;
&lt;br /&gt;
'''c8''' - sets loop point&lt;br /&gt;
&lt;br /&gt;
'''66''' - 0x66 % 11 = 3 (3 means to take 3rd number from play length table), 0x66 / 11 = 9 (9 means to take pitch[9] from loaded instrument record index)&lt;br /&gt;
&lt;br /&gt;
'''ca''' - returns to saved loop point with opcode c8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This example plays Chocobo &amp;quot;Whoo-Hoo&amp;quot; (instrument number 0x55) repeatedly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sound Opcode List ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Opcode&lt;br /&gt;
! Summary&lt;br /&gt;
! Length&lt;br /&gt;
! Operands&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0x0099|0x00-0x99]]&lt;br /&gt;
|Note, Tie, Rest&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|The opcode indicates the note key and length. The note will be keyed off 2 ticks before the next note.&lt;br /&gt;
|-&lt;br /&gt;
|0x9A-0x9F&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa0|0xA0]]&lt;br /&gt;
|Finish Channel&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa1|0xA1]]&lt;br /&gt;
|Load Instrument&lt;br /&gt;
|2&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0x0099|0xA2]]&lt;br /&gt;
|Overwrite Next Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length: byte&lt;br /&gt;
|Ignores the regular length (delta-time) of the next note and overwrites it with the specified length.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa8aa|0xA3]]&lt;br /&gt;
|Channel Master Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa4|0xA4]]&lt;br /&gt;
|Pitch Bend Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, semitones: signed byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa5|0xA5]]&lt;br /&gt;
|Set Octave&lt;br /&gt;
|2&lt;br /&gt;
|octave: byte (0-15)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa5|0xA6]]&lt;br /&gt;
|Increase Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa5|0xA7]]&lt;br /&gt;
|Decrease Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa8aa|0xA8]]&lt;br /&gt;
|Channel Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa9|0xA9]]&lt;br /&gt;
|Channel Volume Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa8aa|0xAA]]&lt;br /&gt;
|Channel Pan&lt;br /&gt;
|2&lt;br /&gt;
|pan: byte (0-127)&lt;br /&gt;
|64 is the center.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xab|0xAB]]&lt;br /&gt;
|Channel Pan Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, pan: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xac|0xAC]]&lt;br /&gt;
|Noise Clock Frequency&lt;br /&gt;
|2&lt;br /&gt;
|clock: byte (0x00-0x3f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xAD]]&lt;br /&gt;
|ADSR: Attack Rate&lt;br /&gt;
|2&lt;br /&gt;
|attack_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xAE]]&lt;br /&gt;
|ADSR: Decay Rate&lt;br /&gt;
|2&lt;br /&gt;
|decay_rate: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xAF]]&lt;br /&gt;
|ADSR: Sustain Level&lt;br /&gt;
|2&lt;br /&gt;
|sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xB0]]&lt;br /&gt;
|ADSR: Decay Rate &amp;amp; Sustain Level&lt;br /&gt;
|3&lt;br /&gt;
|decay_rate: byte (0x00-0x0f), sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xB1]]&lt;br /&gt;
|ADSR: Sustain Rate&lt;br /&gt;
|2&lt;br /&gt;
|sustain_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xB2]]&lt;br /&gt;
|ADSR: Release Rate&lt;br /&gt;
|2&lt;br /&gt;
|release_rate: byte (0x00-0x1f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xB3]]&lt;br /&gt;
|ADSR: Reset ADSR&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb4b5|0xB4]]&lt;br /&gt;
|Channel Pitch LFO (Vibrato)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb4b5|0xB5]]&lt;br /&gt;
|Channel Pitch LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|The most significant bit of the &amp;lt;code&amp;gt;depth&amp;lt;/code&amp;gt; determines the amplitude range.&lt;br /&gt;
&lt;br /&gt;
When it is 0, the range is up to about ± 50 cents (amplitude is 15/256 compared with range type 1).&lt;br /&gt;
&lt;br /&gt;
When it is 1, the range is up to about ± 700 cents.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb4b5|0xB6]]&lt;br /&gt;
|Turn Off Channel Pitch LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xB7]]&lt;br /&gt;
|ADSR: Attack Mode&lt;br /&gt;
|2&lt;br /&gt;
|attack_mode: byte (1 or 5)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb8b9|0xB8]]&lt;br /&gt;
|Channel Volume LFO (Tremolo)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb8b9|0xB9]]&lt;br /&gt;
|Channel Volume LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb8b9|0xBA]]&lt;br /&gt;
|Turn Off Channel Volume LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xBB]]&lt;br /&gt;
|ADSR: Sustain Mode&lt;br /&gt;
|2&lt;br /&gt;
|sustain_mode: byte (1, 3, 5 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xbcbd|0xBC]]&lt;br /&gt;
|Channel Pan LFO&lt;br /&gt;
|3&lt;br /&gt;
|rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xbcbd|0xBD]]&lt;br /&gt;
|Channel Pan LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xbcbd|0xBE]]&lt;br /&gt;
|Turn Off Channel Pan LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xbf|0xBF]]&lt;br /&gt;
|ADSR: Release Mode&lt;br /&gt;
|2&lt;br /&gt;
|release_mode: byte (3 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc0c1|0xC0]]&lt;br /&gt;
|Channel Transpose (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc0c1|0xC1]]&lt;br /&gt;
|Channel Transpose (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc2c3|0xC2]]&lt;br /&gt;
|Turn On Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc2c3|0xC3]]&lt;br /&gt;
|Turn Off Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc4c5|0xC4]]&lt;br /&gt;
|Turn On Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc4c5|0xC5]]&lt;br /&gt;
|Turn Off Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc6c7|0xC6]]&lt;br /&gt;
|Turn On Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc6c7|0xC7]]&lt;br /&gt;
|Turn Off Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc8c9|0xC8]]&lt;br /&gt;
|Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Remember the current offset as a loop point and increase the nesting level of the loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc8c9|0xC9]]&lt;br /&gt;
|Return to Loop Point Up to N Times&lt;br /&gt;
|2&lt;br /&gt;
|times: byte&lt;br /&gt;
|On the Nth repeat, this instruction will end the current loop by decrementing the nesting level of the loop. Otherwise, it will increment the loop counter and return to the loop point.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc8c9|0xCA]]&lt;br /&gt;
|Return to Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will increment the loop counter.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xcb|0xCB]]&lt;br /&gt;
|Reset Sound Effects&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Reset sound effects such as noise, frequency modulation, reverb, overlay voice and alternate voice.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xcccd|0xCC]]&lt;br /&gt;
|Turn On Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key on and key off performance of the subsequent notes and update the pitch only.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xcccd|0xCD]]&lt;br /&gt;
|Turn Off Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xcecf|0xCE]]&lt;br /&gt;
|Turn On Noise and Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xcecf|0xCF]]&lt;br /&gt;
|Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd0d1|0xD0]]&lt;br /&gt;
|Turn On Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key off performance of the subsequent notes.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd0d1|0xD1]]&lt;br /&gt;
|Turn Off Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd2d3|0xD2]]&lt;br /&gt;
|Turn On Frequency Modulation and Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd2d3|0xD3]]&lt;br /&gt;
|Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd4d5|0xD4]]&lt;br /&gt;
|Turn On Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Duplicate and use the playback frequency of the previous voice channel.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd4d5|0xD5]]&lt;br /&gt;
|Turn Off Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd6d7|0xD6]]&lt;br /&gt;
|Turn On Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Multiply the playback frequency of the previous voice channel to the output volume. Lower pitch will make the volume smaller.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd6d7|0xD7]]&lt;br /&gt;
|Turn Off Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd8d9|0xD8]]&lt;br /&gt;
|Channel Fine Tuning (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The pitch can be changed in the range of one octave above and below.&lt;br /&gt;
The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is the multiplicand for the playback frequency, not a log-based parameter like cents. For example, when the &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is 127, the pitch will be multiplied by 127/128 (about +1 octave). Negative value ​​will lower the pitch.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd8d9|0xD9]]&lt;br /&gt;
|Channel Fine Tuning (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; will be added to the current tuning amount.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xdadb|0xDA]]&lt;br /&gt;
|Turn On Portamento&lt;br /&gt;
|2&lt;br /&gt;
|speed: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;speed&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xdadb|0xDB]]&lt;br /&gt;
|Turn Off Portamento&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0x0099|0xDC]]&lt;br /&gt;
|Fix Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length_to_add: signed byte&lt;br /&gt;
|Ignore the regular length (delta-time) of subsequent notes and set to the fixed length. The &amp;lt;code&amp;gt;length_to_add&amp;lt;/code&amp;gt; parameter will be added to the current length value. (the initial value is 0)&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xdd|0xDD]]&lt;br /&gt;
|Channel Pitch LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xde|0xDE]]&lt;br /&gt;
|Channel Volume LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xdf|0xDF]]&lt;br /&gt;
|Channel Pan LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa0|0xE0-0xE7]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xe8e9|0xE8]]&lt;br /&gt;
|Tempo&lt;br /&gt;
|3&lt;br /&gt;
|tempo: uint16&lt;br /&gt;
|bpm = tempo / 214.998204 (approximate)&lt;br /&gt;
More strictly, &amp;lt;code&amp;gt;bpm = 60.0 / (48 * (65536.0 / tempo) * (0x44E8 / (33868800.0 / 8)))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that this coefficient is different from other games with PlayStation AKAO.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xe8e9|0xE9]]&lt;br /&gt;
|Tempo Slide&lt;br /&gt;
|4&lt;br /&gt;
|length: byte, tempo: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xeaeb|0xEA]]&lt;br /&gt;
|Reverb Depth&lt;br /&gt;
|3&lt;br /&gt;
|depth: uint16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xeaeb|0xEB]]&lt;br /&gt;
|Reverb Depth Slide&lt;br /&gt;
|4&lt;br /&gt;
|length: byte, depth: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xeced|0xEC]]&lt;br /&gt;
|Turn On Drum Mode&lt;br /&gt;
|3&lt;br /&gt;
|drum_map_offset: signed int16&lt;br /&gt;
|The &amp;lt;code&amp;gt;drum_map_offset&amp;lt;/code&amp;gt; is a relative offset pointing to the drum instrument map table, which determines the instrument for each keys.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xeced|0xED]]&lt;br /&gt;
|Turn Off Drum Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xee|0xEE]]&lt;br /&gt;
|Unconditional Jump&lt;br /&gt;
|3&lt;br /&gt;
|destination_offset: signed int16&lt;br /&gt;
|This instruction can be used to make an infinite loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xef|0xEF]]&lt;br /&gt;
|CPU-Conditional Jump&lt;br /&gt;
|4&lt;br /&gt;
|condition: byte, destination_offset: signed int16&lt;br /&gt;
|Jump if the condition variable matches &amp;lt;code&amp;gt;condition&amp;lt;/code&amp;gt;. The value of the condition variable can be set from the game program.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf0f1|0xF0]]&lt;br /&gt;
|Jump on the Nth Repeat&lt;br /&gt;
|4&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf0f1|0xF1]]&lt;br /&gt;
|Break the Loop on the Nth Repeat&lt;br /&gt;
|4&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|Unlike 0xF0, this instruction will end the current loop by decrementing the nesting level of the loop.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa1|0xF2]]&lt;br /&gt;
|Load Instrument (No Attack Sample)&lt;br /&gt;
|2&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|Unlike 0xA1, the sample before the loop point is replaced by a short, silence sample.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf3|0xF3]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|There is no actual use in music.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf4f5|0xF4]]&lt;br /&gt;
|Turn On Overlay Voice&lt;br /&gt;
|3&lt;br /&gt;
|instrument: byte, instrument2: byte&lt;br /&gt;
|Play the same melody by different instruments on two voice channels. A free voice channel is required to work. Note that the two channels share the playback rate, and the pitch is not calculated for each instruments.&lt;br /&gt;
Used in the song &amp;quot;Anxious Heart&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf4f5|0xF5]]&lt;br /&gt;
|Turn Off Overlay Voice&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf4f5|0xF6]]&lt;br /&gt;
|Overlay Volume Balance&lt;br /&gt;
|2&lt;br /&gt;
|balance: byte (0-127)&lt;br /&gt;
|When the balance is 0, the volume of the primary voice will be 100% (127/128) of original and that of the secondary voice will be 0%. 127 is the opposite.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf4f5|0xF7]]&lt;br /&gt;
|Overlay Volume Balance Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, balance: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf8f9|0xF8]]&lt;br /&gt;
|Turn On Alternate Voice&lt;br /&gt;
|2&lt;br /&gt;
|release_rate: byte (0x00-0x1f)&lt;br /&gt;
|This instruction allows subsequent notes to be played on two alternating channels. At the same time, the ADSR release rate will be set to the specified value. A free voice channel is required to work. &lt;br /&gt;
Check &amp;quot;Opening - Bombing Mission&amp;quot;, &amp;quot;Tifa's Theme&amp;quot; and &amp;quot;Fortress of the Condor&amp;quot; for actual usage.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf8f9|0xF9]]&lt;br /&gt;
|Turn Off Alternate Voice&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa0|0xFA-0xFC]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xfd|0xFD]]&lt;br /&gt;
|Time Signature&lt;br /&gt;
|3&lt;br /&gt;
|ticks_per_beat: byte, beats_per_measure: byte&lt;br /&gt;
|Note that two parameters can be 0. This pattern is used for initialization.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xfe|0xFE]]&lt;br /&gt;
|Measure Number&lt;br /&gt;
|2&lt;br /&gt;
|measure: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa0|0xFF]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/INSTRx.DAT&amp;diff=5735</id>
		<title>FF7/PSX/Sound/INSTRx.DAT</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/INSTRx.DAT&amp;diff=5735"/>
		<updated>2020-06-07T13:54:08Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are two files of such type:&lt;br /&gt;
* SOUND/INSTR.DAT - Main game sounds (93 instruments)&lt;br /&gt;
* SOUND/INSTR2.DAT - Voices from ending theme &amp;quot;One Winged Angel&amp;quot; (4 instruments)&lt;br /&gt;
&lt;br /&gt;
These files contain index data for all instruments from INSTRx.ALL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Record format ==&lt;br /&gt;
&lt;br /&gt;
 struct AkaoInstrumentAttr&lt;br /&gt;
 {&lt;br /&gt;
   /* offsets */&lt;br /&gt;
   uint32_t addr;         // offset to attack part of instrument (SPU hardware address)&lt;br /&gt;
   uint32_t loop_addr;    // offset to loop part of instrument (SPU hardware address)&lt;br /&gt;
   /* ADSR Envelope settings */&lt;br /&gt;
   uint8_t ar;            // ADSR: attack rate (0x00-0x7f)&lt;br /&gt;
   uint8_t dr;            // ADSR: decay rate (0x00-0x0f)&lt;br /&gt;
   uint8_t sl;            // ADSR: sustain level (0x00-0x0f)&lt;br /&gt;
   uint8_t sr;            // ADSR: sustain rate (0x00-0x7f)&lt;br /&gt;
   uint8_t rr;            // ADSR: release rate (0x00-0x1f)&lt;br /&gt;
   uint8_t a_mode;        // ADSR: attack mode&lt;br /&gt;
                          //    0x05 - (exponential)&lt;br /&gt;
                          //    0x01 (default) - (linear)&lt;br /&gt;
   uint8_t s_mode;        // ADSR: sustain mode&lt;br /&gt;
                          //    0x01 - (linear, increase)&lt;br /&gt;
                          //    0x05 - (exponential, increase)&lt;br /&gt;
                          //    0x07 - (exponential, decrease)&lt;br /&gt;
                          //    0x03 (default) - (linear, decrease)&lt;br /&gt;
   uint8_t r_mode;        // ADSR: release mode&lt;br /&gt;
                          //    0x07 - (exponential decrease)&lt;br /&gt;
                          //    0x03 (default) - (linear decrease)&lt;br /&gt;
   uint32_t pitch[12];    // predefined pitch set for instrument&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
Each index file takes 4 CDROM sectors, so rest unused data filled with zeroes. Attack and loop offsets isn't real file offsets, it's offsets to instruments in SPU internal memory (all instrument data from INSTRx.ALL files are copied by DMA to SPU memory in one chunk), so to translate INSTR.ALL you need to subtract 0x0ff0 (or you need to subtract 0x38540 for INSTR2.DAT). INSTR.DAT file resides in PSX RAM at address 0x80075f30 and when it's needed to load any instrument or to reset pitch for this instrument this table is used.&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/INSTRx.ALL&amp;diff=5734</id>
		<title>FF7/PSX/Sound/INSTRx.ALL</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/INSTRx.ALL&amp;diff=5734"/>
		<updated>2020-06-07T13:49:46Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There is two files of this structure on FF7 game discs:&lt;br /&gt;
* SOUND/INSTR.ALL - Main game sounds (93 instruments)&lt;br /&gt;
* SOUND/INSTR2.ALL - Voices from ending theme &amp;quot;One Winged Angel&amp;quot; (4 instruments)&lt;br /&gt;
These files contain all sample data for every instrument in game. Every instrument consists of 16-byte PSX ADPCM frames. Frame format is known and there is numerous decompressors for it whether on the net, or in Q-Gears source.&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
At file beginning there is two 32-bit numbers. Counting from 0x10 file offset there is sample data for all instruments. (using term &amp;quot;Instrument&amp;quot; I actually mean serie of ADPCM samples, although in some context I can use term &amp;quot;Sample&amp;quot;, &amp;quot;Sound&amp;quot; or &amp;quot;Voice&amp;quot; to describe instrument). All data from INSTR.ALL are loaded by DMA to SPU RAM in one chunk, offset 0x0202.&lt;br /&gt;
&lt;br /&gt;
 struct AkaoSampleSet&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t addr;         // transfer destination address (SPU hardware address, between 0x1010 - 0x7ffff)&lt;br /&gt;
   uint32_t size;         // transfer size&lt;br /&gt;
   uint8_t unknown[8];    // unused? padded with 0s&lt;br /&gt;
 &lt;br /&gt;
   uint8_t data[size];    // PSX ADPCM frames&lt;br /&gt;
 };&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Code_Map&amp;diff=5733</id>
		<title>FF7/PSX/Sound/Code Map</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Code_Map&amp;diff=5733"/>
		<updated>2020-06-07T10:27:18Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Code Map =&lt;br /&gt;
&lt;br /&gt;
Introduces functions, variables and data related to sound, contained in SCUS_941.63 (game program of US version). Note that all symbol names below are for convenience only.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x800293D0&lt;br /&gt;
|void _AkaoSpuTransferCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800293F4&lt;br /&gt;
|void _AkaoSpuSetTransferCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029424&lt;br /&gt;
|unsigned int _AkaoTransferSamples(const unsigned char *addr, unsigned int size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800294A4&lt;br /&gt;
|void _AkaoWaitForSpuTransfer(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800294BC&lt;br /&gt;
|void _AkaoReset(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800297A4&lt;br /&gt;
|void AkaoLoadInstrumentSet(const void *sampleSet, const void *instrumentSet)&lt;br /&gt;
|Load standard instrument set&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR.DAT&lt;br /&gt;
&lt;br /&gt;
This function is called transparently from 0x8002988C.&lt;br /&gt;
|-&lt;br /&gt;
|0x80029818&lt;br /&gt;
|void AkaoLoadInstrumentSet2(const void *sampleSet, const void *instrumentSet)&lt;br /&gt;
|Load additional instrument set&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR2.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR2.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x8002988C&lt;br /&gt;
|void AkaoInitialize(const void *sampleSet, const void *instrumentSet)&lt;br /&gt;
|Initialize sound driver and load initial instruments&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x800299C8&lt;br /&gt;
|void AkaoDeinitialize(void)&lt;br /&gt;
|Deinitialize sound driver&lt;br /&gt;
|-&lt;br /&gt;
|0x80029AF0&lt;br /&gt;
|void AkaoSetReverbMode(int mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029B78&lt;br /&gt;
|void _AkaoTransferSeqBody(const void *data, int size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029C48&lt;br /&gt;
|void _AkaoLoadTracks(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002DA30&lt;br /&gt;
|void AkaoNewMessage(AkaoMessage **ppMessage)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002DA7C&lt;br /&gt;
|int AkaoPostMessage(void)&lt;br /&gt;
|Post a new command message to the queue (with some wrapped processing)&lt;br /&gt;
&lt;br /&gt;
The message data comes from a global variable at 0x8009A000.&lt;br /&gt;
&lt;br /&gt;
Return value depends on the content of the message data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Opcode 0x10'''&lt;br /&gt;
&lt;br /&gt;
Load and start playing new [[FF7/PSX/Sound/AKAO sequence|AKAO sequence]]&lt;br /&gt;
&lt;br /&gt;
Returns: 0 for success, 1 for already loaded, and -1 for invalid signature&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Opcode 0x92'''&lt;br /&gt;
&lt;br /&gt;
Set value to the condition variable used by Opcode 0xEF.&lt;br /&gt;
|-&lt;br /&gt;
|0x8002E1A8&lt;br /&gt;
|void _AkaoDispatchMessages(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80030234&lt;br /&gt;
|int _AkaoCallback(void)&lt;br /&gt;
|Callback event for sound, registered by OpenEvent BIOS function&lt;br /&gt;
|-&lt;br /&gt;
|0x80030E7C&lt;br /&gt;
|void _AkaoDispatchVoice(struct MusicPlayerTrack *track, void *a1, int a2)&lt;br /&gt;
|Dispatch voice opcodes until the next note or end of track&lt;br /&gt;
|-&lt;br /&gt;
|0x80049548&lt;br /&gt;
|void (* const MESSAGE_HANDLERS[256])(struct AkaoMessage *)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80049948&lt;br /&gt;
|const unsigned char VOICE_OPCODE_LENGTHS[0x60]&lt;br /&gt;
|Length table for voice opcodes 0xa0-0xff&lt;br /&gt;
&lt;br /&gt;
0 for end of track and branches&lt;br /&gt;
|-&lt;br /&gt;
|0x80049AA8&lt;br /&gt;
|void (* const VOICE_OPCODES[0x60])(struct MusicPlayerTrack *, void *, int)&lt;br /&gt;
|Address table for voice opcodes 0xa0-0xff&lt;br /&gt;
|-&lt;br /&gt;
|0x80049C44&lt;br /&gt;
|const unsigned short VOLUME_TABLE_L[256]&lt;br /&gt;
|See [[FF7/PSX/Sound/Opcodes/0xa8aa|Opcode 0xAA]] for volume balance calculation&lt;br /&gt;
|-&lt;br /&gt;
|0x80049E44&lt;br /&gt;
|const unsigned short VOLUME_TABLE_R[256]&lt;br /&gt;
|See [[FF7/PSX/Sound/Opcodes/0xa8aa|Opcode 0xAA]] for volume balance calculation&lt;br /&gt;
|-&lt;br /&gt;
|0x80083580&lt;br /&gt;
|unsigned char g_AkaoSeqData[]&lt;br /&gt;
|RAM area to load AKAO sequence data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Runtime Library Functions ==&lt;br /&gt;
&lt;br /&gt;
=== LIBSPU ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x80036298&lt;br /&gt;
|void SpuInit(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80036FFC&lt;br /&gt;
|long SpuInitMalloc(long num, char *top)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800373AC&lt;br /&gt;
|long SpuMallocWithStartAddr(unsigned long addr, long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037964&lt;br /&gt;
|unsigned long SpuSetNoiseVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037B90&lt;br /&gt;
|long SpuSetNoiseClock(long n_clock)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037BE0&lt;br /&gt;
|unsigned long SpuRead(unsigned char *addr, unsigned long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037C40&lt;br /&gt;
|long SpuSetReverb(long on_off)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037D90&lt;br /&gt;
|long SpuGetReverb(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037E1C&lt;br /&gt;
|long SpuSetReverbModeParam(SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800387FC&lt;br /&gt;
|void SpuGetReverbModeParam (SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003884C&lt;br /&gt;
|long SpuSetReverbDepth(SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800388C4&lt;br /&gt;
|unsigned long SpuSetReverbVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800388E8&lt;br /&gt;
|long SpuClearReverbWorkArea(long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038A84&lt;br /&gt;
|long SpuSetIRQ(long on_off)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038BC4&lt;br /&gt;
|unsigned long SpuSetIRQAddr(unsigned long addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038C04&lt;br /&gt;
|SpuIRQCallbackProc SpuSetIRQCallback(SpuIRQCallbackProc func)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038C6C&lt;br /&gt;
|void SpuSetKey(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038F04&lt;br /&gt;
|unsigned long SpuWrite(unsigned char *addr, unsigned long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038F64&lt;br /&gt;
|unsigned long SpuSetTransferStartAddr(unsigned long addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038FB8&lt;br /&gt;
|long SpuSetTransferMode(long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038FEC&lt;br /&gt;
|SpuTransferCallbackProc SpuSetTransferCallback(SpuTransferCallbackProc func)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039010&lt;br /&gt;
|unsigned long SpuSetPitchLFOVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039034&lt;br /&gt;
|void SpuSetCommonAttr(SpuCommonAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800393C8&lt;br /&gt;
|void SpuSetVoiceVolume(int voiceNum, short volL, short volR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039450&lt;br /&gt;
|void SpuSetVoiceVolumeAttr(int voiceNum, short volL, short volR, short volModeL, short volModeR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800395C8&lt;br /&gt;
|void SpuSetVoicePitch(int voiceNum, unsigned short pitch)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039644&lt;br /&gt;
|void SpuSetVoiceStartAddr(int voiceNum, unsigned long startAddr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800396C0&lt;br /&gt;
|void SpuSetVoiceLoopStartAddr(int voiceNum, unsigned long lsa)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003973C&lt;br /&gt;
|void SpuSetVoiceDR(int voiceNum, unsigned short DR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800397C8&lt;br /&gt;
|void SpuSetVoiceSL(int voiceNum, unsigned short SL)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039850&lt;br /&gt;
|void SpuSetVoiceARAttr(int voiceNum, unsigned short AR, long ARmode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800398EC&lt;br /&gt;
|void SpuSetVoiceSRAttr(int voiceNum, unsigned short SR, long SRmode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800399D0&lt;br /&gt;
|void SpuSetVoiceRRAttr(int voiceNum, unsigned short RR, long RRmode)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LIBETC ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D0C0&lt;br /&gt;
|int ResetCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D150&lt;br /&gt;
|int VSyncCallback(void (*func)(void))&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D1B4&lt;br /&gt;
|int StopCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D214&lt;br /&gt;
|int CheckCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LIBAPI ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x800429F0&lt;br /&gt;
|void DeliverEvent(unsigned long ev1, unsigned long ev2)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A00&lt;br /&gt;
|long OpenEvent(unsigned long desc, long spec, long mode, long (*func)())&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A10&lt;br /&gt;
|long CloseEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A20&lt;br /&gt;
|long WaitEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A40&lt;br /&gt;
|long EnableEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A50&lt;br /&gt;
|long DisableEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042BC0&lt;br /&gt;
|long SetRCnt(unsigned long spec, unsigned short target, long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042C60&lt;br /&gt;
|long GetRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042C98&lt;br /&gt;
|long StartRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042CCC&lt;br /&gt;
|long StopRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Structures =&lt;br /&gt;
&lt;br /&gt;
 struct AkaoMessage // 36 bytes long&lt;br /&gt;
 {&lt;br /&gt;
   uint16_t opcode;&lt;br /&gt;
   uint16_t reserved;&lt;br /&gt;
   uint32_t data[8];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoSpuVoiceAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t voice;          // 0x00: voice number&lt;br /&gt;
   uint32_t update_flags;   // 0x04: bitset that indicates what SPU registers need to be updated&lt;br /&gt;
   uint32_t addr;           // 0x08: waveform data start address (SPU address)&lt;br /&gt;
   uint32_t loop_addr;      // 0x0c: loop start address (SPU address)&lt;br /&gt;
   uint32_t a_mode;         // 0x10: ADSR: attack rate mode&lt;br /&gt;
   uint32_t s_mode;         // 0x14: ADSR: sustain rate mode&lt;br /&gt;
   uint32_t r_mode          // 0x18: ADSR: release rate mode&lt;br /&gt;
   uint16_t pitch;          // 0x1c: pitch&lt;br /&gt;
   uint16_t ar;             // 0x1e: ADSR: attack rate&lt;br /&gt;
   uint16_t dr;             // 0x20: ADSR: decay rate&lt;br /&gt;
   uint16_t sl;             // 0x22: ADSR: sustain level&lt;br /&gt;
   uint16_t sr;             // 0x24: ADSR: sustain rate&lt;br /&gt;
   uint16_t rr;             // 0x26: ADSR: release rate&lt;br /&gt;
   SpuVolume volume;        // 0x28: volume (left and right)&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoPlayer // the music player instance exists at 0x8009A104&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t stereo_mode;                 // 0x00: stereo mode (1: stereo, 4: surround, otherwise: mono)&lt;br /&gt;
   uint32_t active_voices;               // 0x04: bitset that indicates the voices currently in use&lt;br /&gt;
   uint32_t key_on_voices;               // 0x08: bitset that indicates the voices to key on&lt;br /&gt;
   uint32_t keyed_voices;                // 0x0c: bitset that indicates the voices currently keyed on&lt;br /&gt;
   uint32_t key_off_voices;              // 0x10: bitset that indicates the voices to key off&lt;br /&gt;
   uint32_t saved_active_voices;         // 0x14: unknown voice bitset&lt;br /&gt;
   uint32_t tempo;                       // 0x18: tempo (Q16 fixed-point number)&lt;br /&gt;
   int32_t tempo_slope;                  // 0x1c: slope of tempo slider (Q16 fixed-point number)&lt;br /&gt;
   uint32_t time_counter;                // 0x20: time counter (0x10000 = 1 tick)&lt;br /&gt;
   uint32_t overlay_voices;              // 0x24: bitset that indicates the sub-voices used for overlay (opcode 0xF4)&lt;br /&gt;
   uint32_t alternate_voices;            // 0x28: bitset that indicates the sub-voices used for alternate voice (opcode 0xF8)&lt;br /&gt;
   uint32_t noise_voices;                // 0x2c: bitset that indicates the voices with noise mode enabled&lt;br /&gt;
   uint32_t reverb_voices;               // 0x30: bitset that indicates the voices with reverb enabled&lt;br /&gt;
   uint32_t pitch_lfo_voices;            // 0x34: bitset that indicates the voices with pitch LFO (frequency modulation) mode enabled&lt;br /&gt;
   uint32_t spucnt;                      // 0x38: SPUCNT shadow&lt;br /&gt;
   uint32_t reverb_type;                 // 0x3c: reverb type&lt;br /&gt;
   uint32_t reverb_depth;                // 0x40: reverb depth (Q16 fixed-point number)&lt;br /&gt;
   int32_t reverb_depth_slope;           // 0x44: slope of reverb depth slider (Q16 fixed-point number)&lt;br /&gt;
   uint16_t tempo_slide_length;          // 0x48: tempo slide length&lt;br /&gt;
   uint16_t song_id;                     // 0x4a: current song id&lt;br /&gt;
   uint16_t condition_ack;               // 0x4c: the last matched condition value (opcode 0xEF)&lt;br /&gt;
   uint16_t condition;                   // 0x4e: condition variable for dynamic branching according to game status (opcode 0xEF)&lt;br /&gt;
   uint16_t reverb_depth_slide_length;   // 0x50: length of reverb depth slide&lt;br /&gt;
   uint16_t noise_clock;                 // 0x52: noise clock frequency&lt;br /&gt;
   uint16_t field_54;                    // 0x54: unknown&lt;br /&gt;
   uint16_t beats_per_measure;           // 0x56: beats per measure&lt;br /&gt;
   uint16_t beat;                        // 0x58: current beat&lt;br /&gt;
   uint16_t ticks_per_beat;              // 0x5a: ticks per beat&lt;br /&gt;
   uint16_t tick;                        // 0x5c: current ticks per beat&lt;br /&gt;
   uint16_t measure;                     // 0x5e: current measure&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoPlayerTrack // the music player track instances exist at 0x80096608 + (N * 0x108)&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t *addr;                                    // 0x00&lt;br /&gt;
   uint8_t *loop_addrs[4];                           // 0x04&lt;br /&gt;
   AkaoDrumKeyAttr *drum_addr;                       // 0x14&lt;br /&gt;
   int16_t *vibrato_lfo_addr;                        // 0x18&lt;br /&gt;
   int16_t *tremolo_lfo_addr;                        // 0x1C&lt;br /&gt;
   int16_t *pan_lfo_addr;                            // 0x20&lt;br /&gt;
   uint32_t overlay_voice_num;                       // 0x24&lt;br /&gt;
   uint32_t alternate_voice_num;                     // 0x28&lt;br /&gt;
   uint32_t master_volume;                           // 0x2C&lt;br /&gt;
   uint32_t pitch_of_note;                           // 0x30&lt;br /&gt;
   int32_t pitch_bend_slide_amplitude;               // 0x34&lt;br /&gt;
   uint16_t voice_effect_flags;                      // 0x38&lt;br /&gt;
   uint16_t field_3A;                                // 0x3A&lt;br /&gt;
   uint16_t field_3C;                                // 0x3C&lt;br /&gt;
   uint16_t field_3E;                                // 0x3E&lt;br /&gt;
   uint32_t field_40;                                // 0x40&lt;br /&gt;
   uint32_t volume;                                  // 0x44&lt;br /&gt;
   int32_t volume_slope;                             // 0x48&lt;br /&gt;
   int32_t pitch_bend_slope;                         // 0x4C&lt;br /&gt;
   uint16_t field_50;                                // 0x50&lt;br /&gt;
   uint16_t field_52;                                // 0x52&lt;br /&gt;
   uint16_t field_54;                                // 0x54&lt;br /&gt;
   uint8_t delta_time_counter;                       // 0x56&lt;br /&gt;
   uint8_t gate_time_counter;                        // 0x57&lt;br /&gt;
   uint16_t instrument;                              // 0x58&lt;br /&gt;
   uint16_t field_5A;                                // 0x5A&lt;br /&gt;
   uint16_t volume_slide_length_counter;             // 0x5C&lt;br /&gt;
   uint16_t overlay_balance_slide_length_counter;    // 0x5E&lt;br /&gt;
   uint16_t pan;                                     // 0x60&lt;br /&gt;
   uint16_t pan_slide_length;                        // 0x62&lt;br /&gt;
   int16_t pitch_slide_length_counter;               // 0x64&lt;br /&gt;
   uint16_t octave;                                  // 0x66&lt;br /&gt;
   uint16_t pitch_slide_length;                      // 0x68&lt;br /&gt;
   uint16_t previous_note_number;                    // 0x6A&lt;br /&gt;
   uint16_t portamento_speed;                        // 0x6C&lt;br /&gt;
   uint16_t legato_flags;                            // 0x6E&lt;br /&gt;
   uint16_t field_70;                                // 0x70&lt;br /&gt;
   uint16_t vibrato_lfo_delay;                       // 0x72&lt;br /&gt;
   uint16_t vibrato_delay_counter;                   // 0x74&lt;br /&gt;
   uint16_t vibrato_rate;                            // 0x76&lt;br /&gt;
   uint16_t vibrato_rate_counter;                    // 0x78&lt;br /&gt;
   uint16_t vibrato_form;                            // 0x7A&lt;br /&gt;
   uint16_t vibrato_max_amplitude;                   // 0x7C&lt;br /&gt;
   uint16_t vibrato_depth;                           // 0x7E&lt;br /&gt;
   uint16_t vibrato_depth_slide_length_counter;      // 0x80&lt;br /&gt;
   int16_t vibrato_depth_slope;                      // 0x82&lt;br /&gt;
   uint16_t field_84;                                // 0x84&lt;br /&gt;
   uint16_t tremolo_delay;                           // 0x86&lt;br /&gt;
   uint16_t tremolo_delay_counter;                   // 0x88&lt;br /&gt;
   uint16_t tremolo_rate;                            // 0x8A&lt;br /&gt;
   uint16_t tremolo_rate_counter;                    // 0x8C&lt;br /&gt;
   uint16_t tremolo_form;                            // 0x8E&lt;br /&gt;
   uint16_t tremolo_depth;                           // 0x90&lt;br /&gt;
   uint16_t tremolo_depth_slide_length_counter;      // 0x92&lt;br /&gt;
   int16_t tremolo_depth_slope;                      // 0x94&lt;br /&gt;
   uint16_t field_96;                                // 0x96&lt;br /&gt;
   uint16_t pan_lfo_rate;                            // 0x98&lt;br /&gt;
   uint16_t pan_lfo_rate_counter;                    // 0x9A&lt;br /&gt;
   uint16_t pan_lfo_form;                            // 0x9C&lt;br /&gt;
   uint16_t pan_lfo_depth;                           // 0x9E&lt;br /&gt;
   uint16_t pan_lfo_depth_slide_length_counter;      // 0xA0&lt;br /&gt;
   int16_t pan_lfo_slope;                            // 0xA2&lt;br /&gt;
   uint16_t noise_on_off_delay_counter;              // 0xA4&lt;br /&gt;
   uint16_t pitchmod_on_off_delay_counter;           // 0xA6&lt;br /&gt;
   uint8_t field_A8[16];                             // 0xA8&lt;br /&gt;
   uint16_t loop_layer;                              // 0xB8&lt;br /&gt;
   uint16_t loop_counts[4];                          // 0xBA&lt;br /&gt;
   uint16_t previous_delta_time;                     // 0xC2&lt;br /&gt;
   uint16_t forced_delta_time;                       // 0xC4&lt;br /&gt;
   uint16_t overlay_balance;                         // 0xC6&lt;br /&gt;
   int16_t overlay_balance_slope;                    // 0xC8&lt;br /&gt;
   int16_t pan_slope;                                // 0xCA&lt;br /&gt;
   int16_t transpose;                                // 0xCC&lt;br /&gt;
   int16_t tuning;                                   // 0xCE&lt;br /&gt;
   uint16_t note;                                    // 0xD0&lt;br /&gt;
   int16_t pitch_slide_amount;                       // 0xD2&lt;br /&gt;
   int16_t previous_transpose;                       // 0xD4&lt;br /&gt;
   int16_t vibrato_lfo_amplitude;                    // 0xD6&lt;br /&gt;
   int16_t tremolo_lfo_amplitude;                    // 0xD8&lt;br /&gt;
   int16_t pan_lfo_amplitude;                        // 0xDA&lt;br /&gt;
   AkaoSpuVoiceAttr spu_attr;                        // 0xDC&lt;br /&gt;
 };&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Code_Map&amp;diff=5732</id>
		<title>FF7/PSX/Sound/Code Map</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Code_Map&amp;diff=5732"/>
		<updated>2020-06-07T07:46:03Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: Add AkaoMessage structure.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Code Map =&lt;br /&gt;
&lt;br /&gt;
Introduces functions, variables and data related to sound, contained in SCUS_941.63 (game program of US version). Note that all symbol names below are for convenience only.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x800293D0&lt;br /&gt;
|void _AkaoSpuTransferCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800293F4&lt;br /&gt;
|void _AkaoSpuSetTransferCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029424&lt;br /&gt;
|unsigned int _AkaoTransferSamples(const unsigned char *addr, unsigned int size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800294A4&lt;br /&gt;
|void _AkaoWaitForSpuTransfer(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800294BC&lt;br /&gt;
|void _AkaoReset(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800297A4&lt;br /&gt;
|void AkaoLoadInstrumentSet(const void *sampleSet, const void *instrumentSet)&lt;br /&gt;
|Load standard instrument set&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR.DAT&lt;br /&gt;
&lt;br /&gt;
This function is called transparently from 0x8002988C.&lt;br /&gt;
|-&lt;br /&gt;
|0x80029818&lt;br /&gt;
|void AkaoLoadInstrumentSet2(const void *sampleSet, const void *instrumentSet)&lt;br /&gt;
|Load additional instrument set&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR2.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR2.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x8002988C&lt;br /&gt;
|void AkaoInitialize(const void *sampleSet, const void *instrumentSet)&lt;br /&gt;
|Initialize sound driver and load initial instruments&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x800299C8&lt;br /&gt;
|void AkaoDeinitialize(void)&lt;br /&gt;
|Deinitialize sound driver&lt;br /&gt;
|-&lt;br /&gt;
|0x80029AF0&lt;br /&gt;
|void AkaoSetReverbMode(int mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029B78&lt;br /&gt;
|void _AkaoTransferSeqBody(const void *data, int size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029C48&lt;br /&gt;
|void _AkaoLoadTracks(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002DA7C&lt;br /&gt;
|int AkaoLoadSeq(void)&lt;br /&gt;
|Load and start playing new [[FF7/PSX/Sound/AKAO sequence|AKAO sequence]]&lt;br /&gt;
&lt;br /&gt;
Parameters are given from a global structure&lt;br /&gt;
&lt;br /&gt;
Returns: 0 for success, 1 for already loaded, and -1 for invalid signature&lt;br /&gt;
|-&lt;br /&gt;
|0x80030234&lt;br /&gt;
|int _AkaoCallback(void)&lt;br /&gt;
|Callback event for sound, registered by OpenEvent BIOS function&lt;br /&gt;
|-&lt;br /&gt;
|0x80030E7C&lt;br /&gt;
|void _AkaoDispatchVoice(struct MusicPlayerTrack *track, void *a1, int a2)&lt;br /&gt;
|Dispatch voice opcodes until the next note or end of track&lt;br /&gt;
|-&lt;br /&gt;
|0x80049948&lt;br /&gt;
|const unsigned char VOICE_OPCODE_LENGTHS[0x60]&lt;br /&gt;
|Length table for voice opcodes 0xa0-0xff&lt;br /&gt;
&lt;br /&gt;
0 for end of track and branches&lt;br /&gt;
|-&lt;br /&gt;
|0x80049AA8&lt;br /&gt;
|void (* const VOICE_OPCODES[0x60])(struct MusicPlayerTrack *, void *, int)&lt;br /&gt;
|Address table for voice opcodes 0xa0-0xff&lt;br /&gt;
|-&lt;br /&gt;
|0x80049C44&lt;br /&gt;
|const unsigned short VOLUME_TABLE_L[256]&lt;br /&gt;
|See [[FF7/PSX/Sound/Opcodes/0xa8aa|Opcode 0xAA]] for volume balance calculation&lt;br /&gt;
|-&lt;br /&gt;
|0x80049E44&lt;br /&gt;
|const unsigned short VOLUME_TABLE_R[256]&lt;br /&gt;
|See [[FF7/PSX/Sound/Opcodes/0xa8aa|Opcode 0xAA]] for volume balance calculation&lt;br /&gt;
|-&lt;br /&gt;
|0x80083580&lt;br /&gt;
|unsigned char g_AkaoSeqData[]&lt;br /&gt;
|RAM area to load AKAO sequence data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Runtime Library Functions ==&lt;br /&gt;
&lt;br /&gt;
=== LIBSPU ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x80036298&lt;br /&gt;
|void SpuInit(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80036FFC&lt;br /&gt;
|long SpuInitMalloc(long num, char *top)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800373AC&lt;br /&gt;
|long SpuMallocWithStartAddr(unsigned long addr, long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037964&lt;br /&gt;
|unsigned long SpuSetNoiseVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037B90&lt;br /&gt;
|long SpuSetNoiseClock(long n_clock)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037BE0&lt;br /&gt;
|unsigned long SpuRead(unsigned char *addr, unsigned long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037C40&lt;br /&gt;
|long SpuSetReverb(long on_off)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037D90&lt;br /&gt;
|long SpuGetReverb(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037E1C&lt;br /&gt;
|long SpuSetReverbModeParam(SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800387FC&lt;br /&gt;
|void SpuGetReverbModeParam (SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003884C&lt;br /&gt;
|long SpuSetReverbDepth(SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800388C4&lt;br /&gt;
|unsigned long SpuSetReverbVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800388E8&lt;br /&gt;
|long SpuClearReverbWorkArea(long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038A84&lt;br /&gt;
|long SpuSetIRQ(long on_off)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038BC4&lt;br /&gt;
|unsigned long SpuSetIRQAddr(unsigned long addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038C04&lt;br /&gt;
|SpuIRQCallbackProc SpuSetIRQCallback(SpuIRQCallbackProc func)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038C6C&lt;br /&gt;
|void SpuSetKey(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038F04&lt;br /&gt;
|unsigned long SpuWrite(unsigned char *addr, unsigned long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038F64&lt;br /&gt;
|unsigned long SpuSetTransferStartAddr(unsigned long addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038FB8&lt;br /&gt;
|long SpuSetTransferMode(long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038FEC&lt;br /&gt;
|SpuTransferCallbackProc SpuSetTransferCallback(SpuTransferCallbackProc func)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039010&lt;br /&gt;
|unsigned long SpuSetPitchLFOVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039034&lt;br /&gt;
|void SpuSetCommonAttr(SpuCommonAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800393C8&lt;br /&gt;
|void SpuSetVoiceVolume(int voiceNum, short volL, short volR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039450&lt;br /&gt;
|void SpuSetVoiceVolumeAttr(int voiceNum, short volL, short volR, short volModeL, short volModeR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800395C8&lt;br /&gt;
|void SpuSetVoicePitch(int voiceNum, unsigned short pitch)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039644&lt;br /&gt;
|void SpuSetVoiceStartAddr(int voiceNum, unsigned long startAddr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800396C0&lt;br /&gt;
|void SpuSetVoiceLoopStartAddr(int voiceNum, unsigned long lsa)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003973C&lt;br /&gt;
|void SpuSetVoiceDR(int voiceNum, unsigned short DR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800397C8&lt;br /&gt;
|void SpuSetVoiceSL(int voiceNum, unsigned short SL)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039850&lt;br /&gt;
|void SpuSetVoiceARAttr(int voiceNum, unsigned short AR, long ARmode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800398EC&lt;br /&gt;
|void SpuSetVoiceSRAttr(int voiceNum, unsigned short SR, long SRmode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800399D0&lt;br /&gt;
|void SpuSetVoiceRRAttr(int voiceNum, unsigned short RR, long RRmode)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LIBETC ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D0C0&lt;br /&gt;
|int ResetCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D150&lt;br /&gt;
|int VSyncCallback(void (*func)(void))&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D1B4&lt;br /&gt;
|int StopCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D214&lt;br /&gt;
|int CheckCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LIBAPI ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x800429F0&lt;br /&gt;
|void DeliverEvent(unsigned long ev1, unsigned long ev2)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A00&lt;br /&gt;
|long OpenEvent(unsigned long desc, long spec, long mode, long (*func)())&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A10&lt;br /&gt;
|long CloseEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A20&lt;br /&gt;
|long WaitEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A40&lt;br /&gt;
|long EnableEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A50&lt;br /&gt;
|long DisableEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042BC0&lt;br /&gt;
|long SetRCnt(unsigned long spec, unsigned short target, long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042C60&lt;br /&gt;
|long GetRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042C98&lt;br /&gt;
|long StartRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042CCC&lt;br /&gt;
|long StopRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Structures =&lt;br /&gt;
&lt;br /&gt;
 struct AkaoMessage // 36 bytes long&lt;br /&gt;
 {&lt;br /&gt;
   uint16_t opcode;&lt;br /&gt;
   uint16_t reserved;&lt;br /&gt;
   uint32_t data[8];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoSpuVoiceAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t voice;          // 0x00: voice number&lt;br /&gt;
   uint32_t update_flags;   // 0x04: bitset that indicates what SPU registers need to be updated&lt;br /&gt;
   uint32_t addr;           // 0x08: waveform data start address (SPU address)&lt;br /&gt;
   uint32_t loop_addr;      // 0x0c: loop start address (SPU address)&lt;br /&gt;
   uint32_t a_mode;         // 0x10: ADSR: attack rate mode&lt;br /&gt;
   uint32_t s_mode;         // 0x14: ADSR: sustain rate mode&lt;br /&gt;
   uint32_t r_mode          // 0x18: ADSR: release rate mode&lt;br /&gt;
   uint16_t pitch;          // 0x1c: pitch&lt;br /&gt;
   uint16_t ar;             // 0x1e: ADSR: attack rate&lt;br /&gt;
   uint16_t dr;             // 0x20: ADSR: decay rate&lt;br /&gt;
   uint16_t sl;             // 0x22: ADSR: sustain level&lt;br /&gt;
   uint16_t sr;             // 0x24: ADSR: sustain rate&lt;br /&gt;
   uint16_t rr;             // 0x26: ADSR: release rate&lt;br /&gt;
   SpuVolume volume;        // 0x28: volume (left and right)&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoPlayer // the music player instance exists at 0x8009A104&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t stereo_mode;                 // 0x00: stereo mode (1: stereo, 4: surround, otherwise: mono)&lt;br /&gt;
   uint32_t active_voices;               // 0x04: bitset that indicates the voices currently in use&lt;br /&gt;
   uint32_t key_on_voices;               // 0x08: bitset that indicates the voices to key on&lt;br /&gt;
   uint32_t keyed_voices;                // 0x0c: bitset that indicates the voices currently keyed on&lt;br /&gt;
   uint32_t key_off_voices;              // 0x10: bitset that indicates the voices to key off&lt;br /&gt;
   uint32_t saved_active_voices;         // 0x14: unknown voice bitset&lt;br /&gt;
   uint32_t tempo;                       // 0x18: tempo (Q16 fixed-point number)&lt;br /&gt;
   int32_t tempo_slope;                  // 0x1c: slope of tempo slider (Q16 fixed-point number)&lt;br /&gt;
   uint32_t time_counter;                // 0x20: time counter (0x10000 = 1 tick)&lt;br /&gt;
   uint32_t overlay_voices;              // 0x24: bitset that indicates the sub-voices used for overlay (opcode 0xF4)&lt;br /&gt;
   uint32_t alternate_voices;            // 0x28: bitset that indicates the sub-voices used for alternate voice (opcode 0xF8)&lt;br /&gt;
   uint32_t noise_voices;                // 0x2c: bitset that indicates the voices with noise mode enabled&lt;br /&gt;
   uint32_t reverb_voices;               // 0x30: bitset that indicates the voices with reverb enabled&lt;br /&gt;
   uint32_t pitch_lfo_voices;            // 0x34: bitset that indicates the voices with pitch LFO (frequency modulation) mode enabled&lt;br /&gt;
   uint32_t spucnt;                      // 0x38: SPUCNT shadow&lt;br /&gt;
   uint32_t reverb_type;                 // 0x3c: reverb type&lt;br /&gt;
   uint32_t reverb_depth;                // 0x40: reverb depth (Q16 fixed-point number)&lt;br /&gt;
   int32_t reverb_depth_slope;           // 0x44: slope of reverb depth slider (Q16 fixed-point number)&lt;br /&gt;
   uint16_t tempo_slide_length;          // 0x48: tempo slide length&lt;br /&gt;
   uint16_t song_id;                     // 0x4a: current song id&lt;br /&gt;
   uint16_t condition_ack;               // 0x4c: the last matched condition value (opcode 0xEF)&lt;br /&gt;
   uint16_t condition;                   // 0x4e: condition variable for dynamic branching according to game status (opcode 0xEF)&lt;br /&gt;
   uint16_t reverb_depth_slide_length;   // 0x50: length of reverb depth slide&lt;br /&gt;
   uint16_t noise_clock;                 // 0x52: noise clock frequency&lt;br /&gt;
   uint16_t field_54;                    // 0x54: unknown&lt;br /&gt;
   uint16_t beats_per_measure;           // 0x56: beats per measure&lt;br /&gt;
   uint16_t beat;                        // 0x58: current beat&lt;br /&gt;
   uint16_t ticks_per_beat;              // 0x5a: ticks per beat&lt;br /&gt;
   uint16_t tick;                        // 0x5c: current ticks per beat&lt;br /&gt;
   uint16_t measure;                     // 0x5e: current measure&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoPlayerTrack // the music player track instances exist at 0x80096608 + (N * 0x108)&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t *addr;                                    // 0x00&lt;br /&gt;
   uint8_t *loop_addrs[4];                           // 0x04&lt;br /&gt;
   AkaoDrumKeyAttr *drum_addr;                       // 0x14&lt;br /&gt;
   int16_t *vibrato_lfo_addr;                        // 0x18&lt;br /&gt;
   int16_t *tremolo_lfo_addr;                        // 0x1C&lt;br /&gt;
   int16_t *pan_lfo_addr;                            // 0x20&lt;br /&gt;
   uint32_t overlay_voice_num;                       // 0x24&lt;br /&gt;
   uint32_t alternate_voice_num;                     // 0x28&lt;br /&gt;
   uint32_t master_volume;                           // 0x2C&lt;br /&gt;
   uint32_t pitch_of_note;                           // 0x30&lt;br /&gt;
   int32_t pitch_bend_slide_amplitude;               // 0x34&lt;br /&gt;
   uint16_t voice_effect_flags;                      // 0x38&lt;br /&gt;
   uint16_t field_3A;                                // 0x3A&lt;br /&gt;
   uint16_t field_3C;                                // 0x3C&lt;br /&gt;
   uint16_t field_3E;                                // 0x3E&lt;br /&gt;
   uint32_t field_40;                                // 0x40&lt;br /&gt;
   uint32_t volume;                                  // 0x44&lt;br /&gt;
   int32_t volume_slope;                             // 0x48&lt;br /&gt;
   int32_t pitch_bend_slope;                         // 0x4C&lt;br /&gt;
   uint16_t field_50;                                // 0x50&lt;br /&gt;
   uint16_t field_52;                                // 0x52&lt;br /&gt;
   uint16_t field_54;                                // 0x54&lt;br /&gt;
   uint8_t delta_time_counter;                       // 0x56&lt;br /&gt;
   uint8_t gate_time_counter;                        // 0x57&lt;br /&gt;
   uint16_t instrument;                              // 0x58&lt;br /&gt;
   uint16_t field_5A;                                // 0x5A&lt;br /&gt;
   uint16_t volume_slide_length_counter;             // 0x5C&lt;br /&gt;
   uint16_t overlay_balance_slide_length_counter;    // 0x5E&lt;br /&gt;
   uint16_t pan;                                     // 0x60&lt;br /&gt;
   uint16_t pan_slide_length;                        // 0x62&lt;br /&gt;
   int16_t pitch_slide_length_counter;               // 0x64&lt;br /&gt;
   uint16_t octave;                                  // 0x66&lt;br /&gt;
   uint16_t pitch_slide_length;                      // 0x68&lt;br /&gt;
   uint16_t previous_note_number;                    // 0x6A&lt;br /&gt;
   uint16_t portamento_speed;                        // 0x6C&lt;br /&gt;
   uint16_t legato_flags;                            // 0x6E&lt;br /&gt;
   uint16_t field_70;                                // 0x70&lt;br /&gt;
   uint16_t vibrato_lfo_delay;                       // 0x72&lt;br /&gt;
   uint16_t vibrato_delay_counter;                   // 0x74&lt;br /&gt;
   uint16_t vibrato_rate;                            // 0x76&lt;br /&gt;
   uint16_t vibrato_rate_counter;                    // 0x78&lt;br /&gt;
   uint16_t vibrato_form;                            // 0x7A&lt;br /&gt;
   uint16_t vibrato_max_amplitude;                   // 0x7C&lt;br /&gt;
   uint16_t vibrato_depth;                           // 0x7E&lt;br /&gt;
   uint16_t vibrato_depth_slide_length_counter;      // 0x80&lt;br /&gt;
   int16_t vibrato_depth_slope;                      // 0x82&lt;br /&gt;
   uint16_t field_84;                                // 0x84&lt;br /&gt;
   uint16_t tremolo_delay;                           // 0x86&lt;br /&gt;
   uint16_t tremolo_delay_counter;                   // 0x88&lt;br /&gt;
   uint16_t tremolo_rate;                            // 0x8A&lt;br /&gt;
   uint16_t tremolo_rate_counter;                    // 0x8C&lt;br /&gt;
   uint16_t tremolo_form;                            // 0x8E&lt;br /&gt;
   uint16_t tremolo_depth;                           // 0x90&lt;br /&gt;
   uint16_t tremolo_depth_slide_length_counter;      // 0x92&lt;br /&gt;
   int16_t tremolo_depth_slope;                      // 0x94&lt;br /&gt;
   uint16_t field_96;                                // 0x96&lt;br /&gt;
   uint16_t pan_lfo_rate;                            // 0x98&lt;br /&gt;
   uint16_t pan_lfo_rate_counter;                    // 0x9A&lt;br /&gt;
   uint16_t pan_lfo_form;                            // 0x9C&lt;br /&gt;
   uint16_t pan_lfo_depth;                           // 0x9E&lt;br /&gt;
   uint16_t pan_lfo_depth_slide_length_counter;      // 0xA0&lt;br /&gt;
   int16_t pan_lfo_slope;                            // 0xA2&lt;br /&gt;
   uint16_t noise_on_off_delay_counter;              // 0xA4&lt;br /&gt;
   uint16_t pitchmod_on_off_delay_counter;           // 0xA6&lt;br /&gt;
   uint8_t field_A8[16];                             // 0xA8&lt;br /&gt;
   uint16_t loop_layer;                              // 0xB8&lt;br /&gt;
   uint16_t loop_counts[4];                          // 0xBA&lt;br /&gt;
   uint16_t previous_delta_time;                     // 0xC2&lt;br /&gt;
   uint16_t forced_delta_time;                       // 0xC4&lt;br /&gt;
   uint16_t overlay_balance;                         // 0xC6&lt;br /&gt;
   int16_t overlay_balance_slope;                    // 0xC8&lt;br /&gt;
   int16_t pan_slope;                                // 0xCA&lt;br /&gt;
   int16_t transpose;                                // 0xCC&lt;br /&gt;
   int16_t tuning;                                   // 0xCE&lt;br /&gt;
   uint16_t note;                                    // 0xD0&lt;br /&gt;
   int16_t pitch_slide_amount;                       // 0xD2&lt;br /&gt;
   int16_t previous_transpose;                       // 0xD4&lt;br /&gt;
   int16_t vibrato_lfo_amplitude;                    // 0xD6&lt;br /&gt;
   int16_t tremolo_lfo_amplitude;                    // 0xD8&lt;br /&gt;
   int16_t pan_lfo_amplitude;                        // 0xDA&lt;br /&gt;
   AkaoSpuVoiceAttr spu_attr;                        // 0xDC&lt;br /&gt;
 };&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Code_Map&amp;diff=5731</id>
		<title>FF7/PSX/Sound/Code Map</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Code_Map&amp;diff=5731"/>
		<updated>2020-06-07T05:37:19Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Code Map =&lt;br /&gt;
&lt;br /&gt;
Introduces functions, variables and data related to sound, contained in SCUS_941.63 (game program of US version). Note that all symbol names below are for convenience only.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x800293D0&lt;br /&gt;
|void _AkaoSpuTransferCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800293F4&lt;br /&gt;
|void _AkaoSpuSetTransferCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029424&lt;br /&gt;
|unsigned int _AkaoTransferSamples(const unsigned char *addr, unsigned int size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800294A4&lt;br /&gt;
|void _AkaoWaitForSpuTransfer(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800294BC&lt;br /&gt;
|void _AkaoReset(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800297A4&lt;br /&gt;
|void AkaoLoadInstrumentSet(const void *sampleSet, const void *instrumentSet)&lt;br /&gt;
|Load standard instrument set&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR.DAT&lt;br /&gt;
&lt;br /&gt;
This function is called transparently from 0x8002988C.&lt;br /&gt;
|-&lt;br /&gt;
|0x80029818&lt;br /&gt;
|void AkaoLoadInstrumentSet2(const void *sampleSet, const void *instrumentSet)&lt;br /&gt;
|Load additional instrument set&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR2.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR2.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x8002988C&lt;br /&gt;
|void AkaoInitialize(const void *sampleSet, const void *instrumentSet)&lt;br /&gt;
|Initialize sound driver and load initial instruments&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x800299C8&lt;br /&gt;
|void AkaoDeinitialize(void)&lt;br /&gt;
|Deinitialize sound driver&lt;br /&gt;
|-&lt;br /&gt;
|0x80029AF0&lt;br /&gt;
|void AkaoSetReverbMode(int mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029B78&lt;br /&gt;
|void _AkaoTransferSeqBody(const void *data, int size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029C48&lt;br /&gt;
|void _AkaoLoadTracks(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8002DA7C&lt;br /&gt;
|int AkaoLoadSeq(void)&lt;br /&gt;
|Load and start playing new [[FF7/PSX/Sound/AKAO sequence|AKAO sequence]]&lt;br /&gt;
&lt;br /&gt;
Parameters are given from a global structure&lt;br /&gt;
&lt;br /&gt;
Returns: 0 for success, 1 for already loaded, and -1 for invalid signature&lt;br /&gt;
|-&lt;br /&gt;
|0x80030234&lt;br /&gt;
|int _AkaoCallback(void)&lt;br /&gt;
|Callback event for sound, registered by OpenEvent BIOS function&lt;br /&gt;
|-&lt;br /&gt;
|0x80030E7C&lt;br /&gt;
|void _AkaoDispatchVoice(struct MusicPlayerTrack *track, void *a1, int a2)&lt;br /&gt;
|Dispatch voice opcodes until the next note or end of track&lt;br /&gt;
|-&lt;br /&gt;
|0x80049948&lt;br /&gt;
|const unsigned char VOICE_OPCODE_LENGTHS[0x60]&lt;br /&gt;
|Length table for voice opcodes 0xa0-0xff&lt;br /&gt;
&lt;br /&gt;
0 for end of track and branches&lt;br /&gt;
|-&lt;br /&gt;
|0x80049AA8&lt;br /&gt;
|void (* const VOICE_OPCODES[0x60])(struct MusicPlayerTrack *, void *, int)&lt;br /&gt;
|Address table for voice opcodes 0xa0-0xff&lt;br /&gt;
|-&lt;br /&gt;
|0x80049C44&lt;br /&gt;
|const unsigned short VOLUME_TABLE_L[256]&lt;br /&gt;
|See [[FF7/PSX/Sound/Opcodes/0xa8aa|Opcode 0xAA]] for volume balance calculation&lt;br /&gt;
|-&lt;br /&gt;
|0x80049E44&lt;br /&gt;
|const unsigned short VOLUME_TABLE_R[256]&lt;br /&gt;
|See [[FF7/PSX/Sound/Opcodes/0xa8aa|Opcode 0xAA]] for volume balance calculation&lt;br /&gt;
|-&lt;br /&gt;
|0x80083580&lt;br /&gt;
|unsigned char g_AkaoSeqData[]&lt;br /&gt;
|RAM area to load AKAO sequence data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Runtime Library Functions ==&lt;br /&gt;
&lt;br /&gt;
=== LIBSPU ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x80036298&lt;br /&gt;
|void SpuInit(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80036FFC&lt;br /&gt;
|long SpuInitMalloc(long num, char *top)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800373AC&lt;br /&gt;
|long SpuMallocWithStartAddr(unsigned long addr, long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037964&lt;br /&gt;
|unsigned long SpuSetNoiseVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037B90&lt;br /&gt;
|long SpuSetNoiseClock(long n_clock)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037BE0&lt;br /&gt;
|unsigned long SpuRead(unsigned char *addr, unsigned long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037C40&lt;br /&gt;
|long SpuSetReverb(long on_off)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037D90&lt;br /&gt;
|long SpuGetReverb(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037E1C&lt;br /&gt;
|long SpuSetReverbModeParam(SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800387FC&lt;br /&gt;
|void SpuGetReverbModeParam (SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003884C&lt;br /&gt;
|long SpuSetReverbDepth(SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800388C4&lt;br /&gt;
|unsigned long SpuSetReverbVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800388E8&lt;br /&gt;
|long SpuClearReverbWorkArea(long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038A84&lt;br /&gt;
|long SpuSetIRQ(long on_off)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038BC4&lt;br /&gt;
|unsigned long SpuSetIRQAddr(unsigned long addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038C04&lt;br /&gt;
|SpuIRQCallbackProc SpuSetIRQCallback(SpuIRQCallbackProc func)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038C6C&lt;br /&gt;
|void SpuSetKey(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038F04&lt;br /&gt;
|unsigned long SpuWrite(unsigned char *addr, unsigned long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038F64&lt;br /&gt;
|unsigned long SpuSetTransferStartAddr(unsigned long addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038FB8&lt;br /&gt;
|long SpuSetTransferMode(long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038FEC&lt;br /&gt;
|SpuTransferCallbackProc SpuSetTransferCallback(SpuTransferCallbackProc func)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039010&lt;br /&gt;
|unsigned long SpuSetPitchLFOVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039034&lt;br /&gt;
|void SpuSetCommonAttr(SpuCommonAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800393C8&lt;br /&gt;
|void SpuSetVoiceVolume(int voiceNum, short volL, short volR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039450&lt;br /&gt;
|void SpuSetVoiceVolumeAttr(int voiceNum, short volL, short volR, short volModeL, short volModeR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800395C8&lt;br /&gt;
|void SpuSetVoicePitch(int voiceNum, unsigned short pitch)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039644&lt;br /&gt;
|void SpuSetVoiceStartAddr(int voiceNum, unsigned long startAddr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800396C0&lt;br /&gt;
|void SpuSetVoiceLoopStartAddr(int voiceNum, unsigned long lsa)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003973C&lt;br /&gt;
|void SpuSetVoiceDR(int voiceNum, unsigned short DR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800397C8&lt;br /&gt;
|void SpuSetVoiceSL(int voiceNum, unsigned short SL)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039850&lt;br /&gt;
|void SpuSetVoiceARAttr(int voiceNum, unsigned short AR, long ARmode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800398EC&lt;br /&gt;
|void SpuSetVoiceSRAttr(int voiceNum, unsigned short SR, long SRmode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800399D0&lt;br /&gt;
|void SpuSetVoiceRRAttr(int voiceNum, unsigned short RR, long RRmode)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LIBETC ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D0C0&lt;br /&gt;
|int ResetCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D150&lt;br /&gt;
|int VSyncCallback(void (*func)(void))&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D1B4&lt;br /&gt;
|int StopCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D214&lt;br /&gt;
|int CheckCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LIBAPI ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x800429F0&lt;br /&gt;
|void DeliverEvent(unsigned long ev1, unsigned long ev2)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A00&lt;br /&gt;
|long OpenEvent(unsigned long desc, long spec, long mode, long (*func)())&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A10&lt;br /&gt;
|long CloseEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A20&lt;br /&gt;
|long WaitEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A40&lt;br /&gt;
|long EnableEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A50&lt;br /&gt;
|long DisableEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042BC0&lt;br /&gt;
|long SetRCnt(unsigned long spec, unsigned short target, long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042C60&lt;br /&gt;
|long GetRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042C98&lt;br /&gt;
|long StartRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042CCC&lt;br /&gt;
|long StopRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Structures =&lt;br /&gt;
&lt;br /&gt;
 struct AkaoSpuVoiceAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t voice;          // 0x00: voice number&lt;br /&gt;
   uint32_t update_flags;   // 0x04: bitset that indicates what SPU registers need to be updated&lt;br /&gt;
   uint32_t addr;           // 0x08: waveform data start address (SPU address)&lt;br /&gt;
   uint32_t loop_addr;      // 0x0c: loop start address (SPU address)&lt;br /&gt;
   uint32_t a_mode;         // 0x10: ADSR: attack rate mode&lt;br /&gt;
   uint32_t s_mode;         // 0x14: ADSR: sustain rate mode&lt;br /&gt;
   uint32_t r_mode          // 0x18: ADSR: release rate mode&lt;br /&gt;
   uint16_t pitch;          // 0x1c: pitch&lt;br /&gt;
   uint16_t ar;             // 0x1e: ADSR: attack rate&lt;br /&gt;
   uint16_t dr;             // 0x20: ADSR: decay rate&lt;br /&gt;
   uint16_t sl;             // 0x22: ADSR: sustain level&lt;br /&gt;
   uint16_t sr;             // 0x24: ADSR: sustain rate&lt;br /&gt;
   uint16_t rr;             // 0x26: ADSR: release rate&lt;br /&gt;
   SpuVolume volume;        // 0x28: volume (left and right)&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoPlayer // the music player instance exists at 0x8009A104&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t stereo_mode;                 // 0x00: stereo mode (1: stereo, 4: surround, otherwise: mono)&lt;br /&gt;
   uint32_t active_voices;               // 0x04: bitset that indicates the voices currently in use&lt;br /&gt;
   uint32_t key_on_voices;               // 0x08: bitset that indicates the voices to key on&lt;br /&gt;
   uint32_t keyed_voices;                // 0x0c: bitset that indicates the voices currently keyed on&lt;br /&gt;
   uint32_t key_off_voices;              // 0x10: bitset that indicates the voices to key off&lt;br /&gt;
   uint32_t saved_active_voices;         // 0x14: unknown voice bitset&lt;br /&gt;
   uint32_t tempo;                       // 0x18: tempo (Q16 fixed-point number)&lt;br /&gt;
   int32_t tempo_slope;                  // 0x1c: slope of tempo slider (Q16 fixed-point number)&lt;br /&gt;
   uint32_t time_counter;                // 0x20: time counter (0x10000 = 1 tick)&lt;br /&gt;
   uint32_t overlay_voices;              // 0x24: bitset that indicates the sub-voices used for overlay (opcode 0xF4)&lt;br /&gt;
   uint32_t alternate_voices;            // 0x28: bitset that indicates the sub-voices used for alternate voice (opcode 0xF8)&lt;br /&gt;
   uint32_t noise_voices;                // 0x2c: bitset that indicates the voices with noise mode enabled&lt;br /&gt;
   uint32_t reverb_voices;               // 0x30: bitset that indicates the voices with reverb enabled&lt;br /&gt;
   uint32_t pitch_lfo_voices;            // 0x34: bitset that indicates the voices with pitch LFO (frequency modulation) mode enabled&lt;br /&gt;
   uint32_t spucnt;                      // 0x38: SPUCNT shadow&lt;br /&gt;
   uint32_t reverb_type;                 // 0x3c: reverb type&lt;br /&gt;
   uint32_t reverb_depth;                // 0x40: reverb depth (Q16 fixed-point number)&lt;br /&gt;
   int32_t reverb_depth_slope;           // 0x44: slope of reverb depth slider (Q16 fixed-point number)&lt;br /&gt;
   uint16_t tempo_slide_length;          // 0x48: tempo slide length&lt;br /&gt;
   uint16_t song_id;                     // 0x4a: current song id&lt;br /&gt;
   uint16_t condition_ack;               // 0x4c: the last matched condition value (opcode 0xEF)&lt;br /&gt;
   uint16_t condition;                   // 0x4e: condition variable for dynamic branching according to game status (opcode 0xEF)&lt;br /&gt;
   uint16_t reverb_depth_slide_length;   // 0x50: length of reverb depth slide&lt;br /&gt;
   uint16_t noise_clock;                 // 0x52: noise clock frequency&lt;br /&gt;
   uint16_t field_54;                    // 0x54: unknown&lt;br /&gt;
   uint16_t beats_per_measure;           // 0x56: beats per measure&lt;br /&gt;
   uint16_t beat;                        // 0x58: current beat&lt;br /&gt;
   uint16_t ticks_per_beat;              // 0x5a: ticks per beat&lt;br /&gt;
   uint16_t tick;                        // 0x5c: current ticks per beat&lt;br /&gt;
   uint16_t measure;                     // 0x5e: current measure&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoPlayerTrack // the music player track instances exist at 0x80096608 + (N * 0x108)&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t *addr;                                    // 0x00&lt;br /&gt;
   uint8_t *loop_addrs[4];                           // 0x04&lt;br /&gt;
   AkaoDrumKeyAttr *drum_addr;                       // 0x14&lt;br /&gt;
   int16_t *vibrato_lfo_addr;                        // 0x18&lt;br /&gt;
   int16_t *tremolo_lfo_addr;                        // 0x1C&lt;br /&gt;
   int16_t *pan_lfo_addr;                            // 0x20&lt;br /&gt;
   uint32_t overlay_voice_num;                       // 0x24&lt;br /&gt;
   uint32_t alternate_voice_num;                     // 0x28&lt;br /&gt;
   uint32_t master_volume;                           // 0x2C&lt;br /&gt;
   uint32_t pitch_of_note;                           // 0x30&lt;br /&gt;
   int32_t pitch_bend_slide_amplitude;               // 0x34&lt;br /&gt;
   uint16_t voice_effect_flags;                      // 0x38&lt;br /&gt;
   uint16_t field_3A;                                // 0x3A&lt;br /&gt;
   uint16_t field_3C;                                // 0x3C&lt;br /&gt;
   uint16_t field_3E;                                // 0x3E&lt;br /&gt;
   uint32_t field_40;                                // 0x40&lt;br /&gt;
   uint32_t volume;                                  // 0x44&lt;br /&gt;
   int32_t volume_slope;                             // 0x48&lt;br /&gt;
   int32_t pitch_bend_slope;                         // 0x4C&lt;br /&gt;
   uint16_t field_50;                                // 0x50&lt;br /&gt;
   uint16_t field_52;                                // 0x52&lt;br /&gt;
   uint16_t field_54;                                // 0x54&lt;br /&gt;
   uint8_t delta_time_counter;                       // 0x56&lt;br /&gt;
   uint8_t gate_time_counter;                        // 0x57&lt;br /&gt;
   uint16_t instrument;                              // 0x58&lt;br /&gt;
   uint16_t field_5A;                                // 0x5A&lt;br /&gt;
   uint16_t volume_slide_length_counter;             // 0x5C&lt;br /&gt;
   uint16_t overlay_balance_slide_length_counter;    // 0x5E&lt;br /&gt;
   uint16_t pan;                                     // 0x60&lt;br /&gt;
   uint16_t pan_slide_length;                        // 0x62&lt;br /&gt;
   int16_t pitch_slide_length_counter;               // 0x64&lt;br /&gt;
   uint16_t octave;                                  // 0x66&lt;br /&gt;
   uint16_t pitch_slide_length;                      // 0x68&lt;br /&gt;
   uint16_t previous_note_number;                    // 0x6A&lt;br /&gt;
   uint16_t portamento_speed;                        // 0x6C&lt;br /&gt;
   uint16_t legato_flags;                            // 0x6E&lt;br /&gt;
   uint16_t field_70;                                // 0x70&lt;br /&gt;
   uint16_t vibrato_lfo_delay;                       // 0x72&lt;br /&gt;
   uint16_t vibrato_delay_counter;                   // 0x74&lt;br /&gt;
   uint16_t vibrato_rate;                            // 0x76&lt;br /&gt;
   uint16_t vibrato_rate_counter;                    // 0x78&lt;br /&gt;
   uint16_t vibrato_form;                            // 0x7A&lt;br /&gt;
   uint16_t vibrato_max_amplitude;                   // 0x7C&lt;br /&gt;
   uint16_t vibrato_depth;                           // 0x7E&lt;br /&gt;
   uint16_t vibrato_depth_slide_length_counter;      // 0x80&lt;br /&gt;
   int16_t vibrato_depth_slope;                      // 0x82&lt;br /&gt;
   uint16_t field_84;                                // 0x84&lt;br /&gt;
   uint16_t tremolo_delay;                           // 0x86&lt;br /&gt;
   uint16_t tremolo_delay_counter;                   // 0x88&lt;br /&gt;
   uint16_t tremolo_rate;                            // 0x8A&lt;br /&gt;
   uint16_t tremolo_rate_counter;                    // 0x8C&lt;br /&gt;
   uint16_t tremolo_form;                            // 0x8E&lt;br /&gt;
   uint16_t tremolo_depth;                           // 0x90&lt;br /&gt;
   uint16_t tremolo_depth_slide_length_counter;      // 0x92&lt;br /&gt;
   int16_t tremolo_depth_slope;                      // 0x94&lt;br /&gt;
   uint16_t field_96;                                // 0x96&lt;br /&gt;
   uint16_t pan_lfo_rate;                            // 0x98&lt;br /&gt;
   uint16_t pan_lfo_rate_counter;                    // 0x9A&lt;br /&gt;
   uint16_t pan_lfo_form;                            // 0x9C&lt;br /&gt;
   uint16_t pan_lfo_depth;                           // 0x9E&lt;br /&gt;
   uint16_t pan_lfo_depth_slide_length_counter;      // 0xA0&lt;br /&gt;
   int16_t pan_lfo_slope;                            // 0xA2&lt;br /&gt;
   uint16_t noise_on_off_delay_counter;              // 0xA4&lt;br /&gt;
   uint16_t pitchmod_on_off_delay_counter;           // 0xA6&lt;br /&gt;
   uint8_t field_A8[16];                             // 0xA8&lt;br /&gt;
   uint16_t loop_layer;                              // 0xB8&lt;br /&gt;
   uint16_t loop_counts[4];                          // 0xBA&lt;br /&gt;
   uint16_t previous_delta_time;                     // 0xC2&lt;br /&gt;
   uint16_t forced_delta_time;                       // 0xC4&lt;br /&gt;
   uint16_t overlay_balance;                         // 0xC6&lt;br /&gt;
   int16_t overlay_balance_slope;                    // 0xC8&lt;br /&gt;
   int16_t pan_slope;                                // 0xCA&lt;br /&gt;
   int16_t transpose;                                // 0xCC&lt;br /&gt;
   int16_t tuning;                                   // 0xCE&lt;br /&gt;
   uint16_t note;                                    // 0xD0&lt;br /&gt;
   int16_t pitch_slide_amount;                       // 0xD2&lt;br /&gt;
   int16_t previous_transpose;                       // 0xD4&lt;br /&gt;
   int16_t vibrato_lfo_amplitude;                    // 0xD6&lt;br /&gt;
   int16_t tremolo_lfo_amplitude;                    // 0xD8&lt;br /&gt;
   int16_t pan_lfo_amplitude;                        // 0xDA&lt;br /&gt;
   AkaoSpuVoiceAttr spu_attr;                        // 0xDC&lt;br /&gt;
 };&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Code_Map&amp;diff=5730</id>
		<title>FF7/PSX/Sound/Code Map</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Code_Map&amp;diff=5730"/>
		<updated>2020-06-07T05:29:50Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Code Map =&lt;br /&gt;
&lt;br /&gt;
Introduces functions, variables and data related to sound, contained in SCUS_941.63 (game program of US version). Note that all symbol names below are for convenience only.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x800293D0&lt;br /&gt;
|void _AkaoSpuTransferCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800293F4&lt;br /&gt;
|void _AkaoSpuSetTransferCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029424&lt;br /&gt;
|unsigned int _AkaoTransferSamples(const unsigned char *addr, unsigned int size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800294A4&lt;br /&gt;
|void _AkaoWaitForSpuTransfer(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800294BC&lt;br /&gt;
|void _AkaoReset(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800297A4&lt;br /&gt;
|void AkaoLoadInstrumentSet(const void *sampleSet, const void *instrumentSet)&lt;br /&gt;
|Load standard instrument set (called transparently from 0x8002988C)&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x80029818&lt;br /&gt;
|void AkaoLoadInstrumentSet2(const void *sampleSet, const void *instrumentSet)&lt;br /&gt;
|Load additional instrument set&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR2.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR2.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x8002988C&lt;br /&gt;
|void AkaoInitialize(const void *sampleSet, const void *instrSet)&lt;br /&gt;
|Initialize sound driver and load initial instruments&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR.ALL&lt;br /&gt;
&lt;br /&gt;
''instrSet'': corresponding to SOUND/INSTR.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x8002DA7C&lt;br /&gt;
|int AkaoLoadSeq(void)&lt;br /&gt;
|Load and start playing new [[FF7/PSX/Sound/AKAO sequence|AKAO sequence]]&lt;br /&gt;
&lt;br /&gt;
Parameters are given from a global structure&lt;br /&gt;
&lt;br /&gt;
Returns: 0 for success, 1 for already loaded, and -1 for invalid signature&lt;br /&gt;
|-&lt;br /&gt;
|0x80030234&lt;br /&gt;
|int _AkaoCallback(void)&lt;br /&gt;
|Callback event for sound, registered by OpenEvent BIOS function&lt;br /&gt;
|-&lt;br /&gt;
|0x80030E7C&lt;br /&gt;
|void _AkaoDispatchVoice(struct MusicPlayerTrack *track, void *a1, int a2)&lt;br /&gt;
|Dispatch voice opcodes until the next note or end of track&lt;br /&gt;
|-&lt;br /&gt;
|0x80049948&lt;br /&gt;
|const unsigned char VOICE_OPCODE_LENGTHS[0x60]&lt;br /&gt;
|Length table for voice opcodes 0xa0-0xff&lt;br /&gt;
&lt;br /&gt;
0 for end of track and branches&lt;br /&gt;
|-&lt;br /&gt;
|0x80049AA8&lt;br /&gt;
|void (* const VOICE_OPCODES[0x60])(struct MusicPlayerTrack *, void *, int)&lt;br /&gt;
|Address table for voice opcodes 0xa0-0xff&lt;br /&gt;
|-&lt;br /&gt;
|0x80049C44&lt;br /&gt;
|const unsigned short VOLUME_TABLE_L[256]&lt;br /&gt;
|See [[FF7/PSX/Sound/Opcodes/0xa8aa|Opcode 0xAA]] for volume balance calculation&lt;br /&gt;
|-&lt;br /&gt;
|0x80049E44&lt;br /&gt;
|const unsigned short VOLUME_TABLE_R[256]&lt;br /&gt;
|See [[FF7/PSX/Sound/Opcodes/0xa8aa|Opcode 0xAA]] for volume balance calculation&lt;br /&gt;
|-&lt;br /&gt;
|0x80083580&lt;br /&gt;
|unsigned char g_AkaoSeqData[]&lt;br /&gt;
|RAM area to load AKAO sequence data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Runtime Library Functions ==&lt;br /&gt;
&lt;br /&gt;
=== LIBSPU ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x80036298&lt;br /&gt;
|void SpuInit(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80036FFC&lt;br /&gt;
|long SpuInitMalloc(long num, char *top)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800373AC&lt;br /&gt;
|long SpuMallocWithStartAddr(unsigned long addr, long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037964&lt;br /&gt;
|unsigned long SpuSetNoiseVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037B90&lt;br /&gt;
|long SpuSetNoiseClock(long n_clock)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037BE0&lt;br /&gt;
|unsigned long SpuRead(unsigned char *addr, unsigned long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037C40&lt;br /&gt;
|long SpuSetReverb(long on_off)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037D90&lt;br /&gt;
|long SpuGetReverb(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037E1C&lt;br /&gt;
|long SpuSetReverbModeParam(SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800387FC&lt;br /&gt;
|void SpuGetReverbModeParam (SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003884C&lt;br /&gt;
|long SpuSetReverbDepth(SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800388C4&lt;br /&gt;
|unsigned long SpuSetReverbVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800388E8&lt;br /&gt;
|long SpuClearReverbWorkArea(long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038A84&lt;br /&gt;
|long SpuSetIRQ(long on_off)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038BC4&lt;br /&gt;
|unsigned long SpuSetIRQAddr(unsigned long addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038C04&lt;br /&gt;
|SpuIRQCallbackProc SpuSetIRQCallback(SpuIRQCallbackProc func)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038C6C&lt;br /&gt;
|void SpuSetKey(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038F04&lt;br /&gt;
|unsigned long SpuWrite(unsigned char *addr, unsigned long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038F64&lt;br /&gt;
|unsigned long SpuSetTransferStartAddr(unsigned long addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038FB8&lt;br /&gt;
|long SpuSetTransferMode(long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038FEC&lt;br /&gt;
|SpuTransferCallbackProc SpuSetTransferCallback(SpuTransferCallbackProc func)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039010&lt;br /&gt;
|unsigned long SpuSetPitchLFOVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039034&lt;br /&gt;
|void SpuSetCommonAttr(SpuCommonAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800393C8&lt;br /&gt;
|void SpuSetVoiceVolume(int voiceNum, short volL, short volR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039450&lt;br /&gt;
|void SpuSetVoiceVolumeAttr(int voiceNum, short volL, short volR, short volModeL, short volModeR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800395C8&lt;br /&gt;
|void SpuSetVoicePitch(int voiceNum, unsigned short pitch)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039644&lt;br /&gt;
|void SpuSetVoiceStartAddr(int voiceNum, unsigned long startAddr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800396C0&lt;br /&gt;
|void SpuSetVoiceLoopStartAddr(int voiceNum, unsigned long lsa)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003973C&lt;br /&gt;
|void SpuSetVoiceDR(int voiceNum, unsigned short DR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800397C8&lt;br /&gt;
|void SpuSetVoiceSL(int voiceNum, unsigned short SL)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039850&lt;br /&gt;
|void SpuSetVoiceARAttr(int voiceNum, unsigned short AR, long ARmode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800398EC&lt;br /&gt;
|void SpuSetVoiceSRAttr(int voiceNum, unsigned short SR, long SRmode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800399D0&lt;br /&gt;
|void SpuSetVoiceRRAttr(int voiceNum, unsigned short RR, long RRmode)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LIBETC ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D0C0&lt;br /&gt;
|int ResetCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D150&lt;br /&gt;
|int VSyncCallback(void (*func)(void))&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D1B4&lt;br /&gt;
|int StopCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D214&lt;br /&gt;
|int CheckCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LIBAPI ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x800429F0&lt;br /&gt;
|void DeliverEvent(unsigned long ev1, unsigned long ev2)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A00&lt;br /&gt;
|long OpenEvent(unsigned long desc, long spec, long mode, long (*func)())&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A10&lt;br /&gt;
|long CloseEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A20&lt;br /&gt;
|long WaitEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A40&lt;br /&gt;
|long EnableEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A50&lt;br /&gt;
|long DisableEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042BC0&lt;br /&gt;
|long SetRCnt(unsigned long spec, unsigned short target, long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042C60&lt;br /&gt;
|long GetRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042C98&lt;br /&gt;
|long StartRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042CCC&lt;br /&gt;
|long StopRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Structures =&lt;br /&gt;
&lt;br /&gt;
 struct AkaoSpuVoiceAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t voice;          // 0x00: voice number&lt;br /&gt;
   uint32_t update_flags;   // 0x04: bitset that indicates what SPU registers need to be updated&lt;br /&gt;
   uint32_t addr;           // 0x08: waveform data start address (SPU address)&lt;br /&gt;
   uint32_t loop_addr;      // 0x0c: loop start address (SPU address)&lt;br /&gt;
   uint32_t a_mode;         // 0x10: ADSR: attack rate mode&lt;br /&gt;
   uint32_t s_mode;         // 0x14: ADSR: sustain rate mode&lt;br /&gt;
   uint32_t r_mode          // 0x18: ADSR: release rate mode&lt;br /&gt;
   uint16_t pitch;          // 0x1c: pitch&lt;br /&gt;
   uint16_t ar;             // 0x1e: ADSR: attack rate&lt;br /&gt;
   uint16_t dr;             // 0x20: ADSR: decay rate&lt;br /&gt;
   uint16_t sl;             // 0x22: ADSR: sustain level&lt;br /&gt;
   uint16_t sr;             // 0x24: ADSR: sustain rate&lt;br /&gt;
   uint16_t rr;             // 0x26: ADSR: release rate&lt;br /&gt;
   SpuVolume volume;        // 0x28: volume (left and right)&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoPlayer // the music player instance exists at 0x8009A104&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t stereo_mode;                 // 0x00: stereo mode (1: stereo, 4: surround, otherwise: mono)&lt;br /&gt;
   uint32_t active_voices;               // 0x04: bitset that indicates the voices currently in use&lt;br /&gt;
   uint32_t key_on_voices;               // 0x08: bitset that indicates the voices to key on&lt;br /&gt;
   uint32_t keyed_voices;                // 0x0c: bitset that indicates the voices currently keyed on&lt;br /&gt;
   uint32_t key_off_voices;              // 0x10: bitset that indicates the voices to key off&lt;br /&gt;
   uint32_t saved_active_voices;         // 0x14: unknown voice bitset&lt;br /&gt;
   uint32_t tempo;                       // 0x18: tempo (Q16 fixed-point number)&lt;br /&gt;
   int32_t tempo_slope;                  // 0x1c: slope of tempo slider (Q16 fixed-point number)&lt;br /&gt;
   uint32_t time_counter;                // 0x20: time counter (0x10000 = 1 tick)&lt;br /&gt;
   uint32_t overlay_voices;              // 0x24: bitset that indicates the sub-voices used for overlay (opcode 0xF4)&lt;br /&gt;
   uint32_t alternate_voices;            // 0x28: bitset that indicates the sub-voices used for alternate voice (opcode 0xF8)&lt;br /&gt;
   uint32_t noise_voices;                // 0x2c: bitset that indicates the voices with noise mode enabled&lt;br /&gt;
   uint32_t reverb_voices;               // 0x30: bitset that indicates the voices with reverb enabled&lt;br /&gt;
   uint32_t pitch_lfo_voices;            // 0x34: bitset that indicates the voices with pitch LFO (frequency modulation) mode enabled&lt;br /&gt;
   uint32_t spucnt;                      // 0x38: SPUCNT shadow&lt;br /&gt;
   uint32_t reverb_type;                 // 0x3c: reverb type&lt;br /&gt;
   uint32_t reverb_depth;                // 0x40: reverb depth (Q16 fixed-point number)&lt;br /&gt;
   int32_t reverb_depth_slope;           // 0x44: slope of reverb depth slider (Q16 fixed-point number)&lt;br /&gt;
   uint16_t tempo_slide_length;          // 0x48: tempo slide length&lt;br /&gt;
   uint16_t song_id;                     // 0x4a: current song id&lt;br /&gt;
   uint16_t condition_ack;               // 0x4c: the last matched condition value (opcode 0xEF)&lt;br /&gt;
   uint16_t condition;                   // 0x4e: condition variable for dynamic branching according to game status (opcode 0xEF)&lt;br /&gt;
   uint16_t reverb_depth_slide_length;   // 0x50: length of reverb depth slide&lt;br /&gt;
   uint16_t noise_clock;                 // 0x52: noise clock frequency&lt;br /&gt;
   uint16_t field_54;                    // 0x54: unknown&lt;br /&gt;
   uint16_t beats_per_measure;           // 0x56: beats per measure&lt;br /&gt;
   uint16_t beat;                        // 0x58: current beat&lt;br /&gt;
   uint16_t ticks_per_beat;              // 0x5a: ticks per beat&lt;br /&gt;
   uint16_t tick;                        // 0x5c: current ticks per beat&lt;br /&gt;
   uint16_t measure;                     // 0x5e: current measure&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoPlayerTrack // the music player track instances exist at 0x80096608 + (N * 0x108)&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t *addr;                                    // 0x00&lt;br /&gt;
   uint8_t *loop_addrs[4];                           // 0x04&lt;br /&gt;
   AkaoDrumKeyAttr *drum_addr;                       // 0x14&lt;br /&gt;
   int16_t *vibrato_lfo_addr;                        // 0x18&lt;br /&gt;
   int16_t *tremolo_lfo_addr;                        // 0x1C&lt;br /&gt;
   int16_t *pan_lfo_addr;                            // 0x20&lt;br /&gt;
   uint32_t overlay_voice_num;                       // 0x24&lt;br /&gt;
   uint32_t alternate_voice_num;                     // 0x28&lt;br /&gt;
   uint32_t master_volume;                           // 0x2C&lt;br /&gt;
   uint32_t pitch_of_note;                           // 0x30&lt;br /&gt;
   int32_t pitch_bend_slide_amplitude;               // 0x34&lt;br /&gt;
   uint16_t voice_effect_flags;                      // 0x38&lt;br /&gt;
   uint16_t field_3A;                                // 0x3A&lt;br /&gt;
   uint16_t field_3C;                                // 0x3C&lt;br /&gt;
   uint16_t field_3E;                                // 0x3E&lt;br /&gt;
   uint32_t field_40;                                // 0x40&lt;br /&gt;
   uint32_t volume;                                  // 0x44&lt;br /&gt;
   int32_t volume_slope;                             // 0x48&lt;br /&gt;
   int32_t pitch_bend_slope;                         // 0x4C&lt;br /&gt;
   uint16_t field_50;                                // 0x50&lt;br /&gt;
   uint16_t field_52;                                // 0x52&lt;br /&gt;
   uint16_t field_54;                                // 0x54&lt;br /&gt;
   uint8_t delta_time_counter;                       // 0x56&lt;br /&gt;
   uint8_t gate_time_counter;                        // 0x57&lt;br /&gt;
   uint16_t instrument;                              // 0x58&lt;br /&gt;
   uint16_t field_5A;                                // 0x5A&lt;br /&gt;
   uint16_t volume_slide_length_counter;             // 0x5C&lt;br /&gt;
   uint16_t overlay_balance_slide_length_counter;    // 0x5E&lt;br /&gt;
   uint16_t pan;                                     // 0x60&lt;br /&gt;
   uint16_t pan_slide_length;                        // 0x62&lt;br /&gt;
   int16_t pitch_slide_length_counter;               // 0x64&lt;br /&gt;
   uint16_t octave;                                  // 0x66&lt;br /&gt;
   uint16_t pitch_slide_length;                      // 0x68&lt;br /&gt;
   uint16_t previous_note_number;                    // 0x6A&lt;br /&gt;
   uint16_t portamento_speed;                        // 0x6C&lt;br /&gt;
   uint16_t legato_flags;                            // 0x6E&lt;br /&gt;
   uint16_t field_70;                                // 0x70&lt;br /&gt;
   uint16_t vibrato_lfo_delay;                       // 0x72&lt;br /&gt;
   uint16_t vibrato_delay_counter;                   // 0x74&lt;br /&gt;
   uint16_t vibrato_rate;                            // 0x76&lt;br /&gt;
   uint16_t vibrato_rate_counter;                    // 0x78&lt;br /&gt;
   uint16_t vibrato_form;                            // 0x7A&lt;br /&gt;
   uint16_t vibrato_max_amplitude;                   // 0x7C&lt;br /&gt;
   uint16_t vibrato_depth;                           // 0x7E&lt;br /&gt;
   uint16_t vibrato_depth_slide_length_counter;      // 0x80&lt;br /&gt;
   int16_t vibrato_depth_slope;                      // 0x82&lt;br /&gt;
   uint16_t field_84;                                // 0x84&lt;br /&gt;
   uint16_t tremolo_delay;                           // 0x86&lt;br /&gt;
   uint16_t tremolo_delay_counter;                   // 0x88&lt;br /&gt;
   uint16_t tremolo_rate;                            // 0x8A&lt;br /&gt;
   uint16_t tremolo_rate_counter;                    // 0x8C&lt;br /&gt;
   uint16_t tremolo_form;                            // 0x8E&lt;br /&gt;
   uint16_t tremolo_depth;                           // 0x90&lt;br /&gt;
   uint16_t tremolo_depth_slide_length_counter;      // 0x92&lt;br /&gt;
   int16_t tremolo_depth_slope;                      // 0x94&lt;br /&gt;
   uint16_t field_96;                                // 0x96&lt;br /&gt;
   uint16_t pan_lfo_rate;                            // 0x98&lt;br /&gt;
   uint16_t pan_lfo_rate_counter;                    // 0x9A&lt;br /&gt;
   uint16_t pan_lfo_form;                            // 0x9C&lt;br /&gt;
   uint16_t pan_lfo_depth;                           // 0x9E&lt;br /&gt;
   uint16_t pan_lfo_depth_slide_length_counter;      // 0xA0&lt;br /&gt;
   int16_t pan_lfo_slope;                            // 0xA2&lt;br /&gt;
   uint16_t noise_on_off_delay_counter;              // 0xA4&lt;br /&gt;
   uint16_t pitchmod_on_off_delay_counter;           // 0xA6&lt;br /&gt;
   uint8_t field_A8[16];                             // 0xA8&lt;br /&gt;
   uint16_t loop_layer;                              // 0xB8&lt;br /&gt;
   uint16_t loop_counts[4];                          // 0xBA&lt;br /&gt;
   uint16_t previous_delta_time;                     // 0xC2&lt;br /&gt;
   uint16_t forced_delta_time;                       // 0xC4&lt;br /&gt;
   uint16_t overlay_balance;                         // 0xC6&lt;br /&gt;
   int16_t overlay_balance_slope;                    // 0xC8&lt;br /&gt;
   int16_t pan_slope;                                // 0xCA&lt;br /&gt;
   int16_t transpose;                                // 0xCC&lt;br /&gt;
   int16_t tuning;                                   // 0xCE&lt;br /&gt;
   uint16_t note;                                    // 0xD0&lt;br /&gt;
   int16_t pitch_slide_amount;                       // 0xD2&lt;br /&gt;
   int16_t previous_transpose;                       // 0xD4&lt;br /&gt;
   int16_t vibrato_lfo_amplitude;                    // 0xD6&lt;br /&gt;
   int16_t tremolo_lfo_amplitude;                    // 0xD8&lt;br /&gt;
   int16_t pan_lfo_amplitude;                        // 0xDA&lt;br /&gt;
   AkaoSpuVoiceAttr spu_attr;                        // 0xDC&lt;br /&gt;
 };&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Code_Map&amp;diff=5729</id>
		<title>FF7/PSX/Sound/Code Map</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Code_Map&amp;diff=5729"/>
		<updated>2020-06-07T05:18:14Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Code Map =&lt;br /&gt;
&lt;br /&gt;
Introduces functions, variables and data related to sound, contained in SCUS_941.63 (game program of US version). Note that all symbol names below are for convenience only.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x800293D0&lt;br /&gt;
|void _AkaoSpuTransferCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800293F4&lt;br /&gt;
|void _AkaoSpuSetTransferCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80029424&lt;br /&gt;
|unsigned int _AkaoTransferSamples(uint8_t *addr, unsigned int size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800294A4&lt;br /&gt;
|void _AkaoWaitForSpuTransfer(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800294BC&lt;br /&gt;
|void _AkaoReset(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800297A4&lt;br /&gt;
|void AkaoLoadInstrumentSet(const void *sampleSet, const void *instrumentSet)&lt;br /&gt;
|Load standard instrument set (called transparently from 0x8002988C)&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x80029818&lt;br /&gt;
|void AkaoLoadInstrumentSet2(const void *sampleSet, const void *instrumentSet)&lt;br /&gt;
|Load additional instrument set&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR2.ALL&lt;br /&gt;
&lt;br /&gt;
''instrumentSet'': corresponding to SOUND/INSTR2.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x8002988C&lt;br /&gt;
|void AkaoInitialize(const void *sampleSet, const void *instrSet)&lt;br /&gt;
|Initialize sound driver and load initial instruments&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR.ALL&lt;br /&gt;
&lt;br /&gt;
''instrSet'': corresponding to SOUND/INSTR.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x8002DA7C&lt;br /&gt;
|int AkaoLoadSeq(void)&lt;br /&gt;
|Load and start playing new [[FF7/PSX/Sound/AKAO sequence|AKAO sequence]]&lt;br /&gt;
&lt;br /&gt;
Parameters are given from a global structure&lt;br /&gt;
&lt;br /&gt;
Returns: 0 for success, 1 for already loaded, and -1 for invalid signature&lt;br /&gt;
|-&lt;br /&gt;
|0x80030234&lt;br /&gt;
|int _AkaoCallback(void)&lt;br /&gt;
|Callback event for sound, registered by OpenEvent BIOS function&lt;br /&gt;
|-&lt;br /&gt;
|0x80030E7C&lt;br /&gt;
|void _AkaoDispatchVoice(struct MusicPlayerTrack *track, void *a1, int a2)&lt;br /&gt;
|Dispatch voice opcodes until the next note or end of track&lt;br /&gt;
|-&lt;br /&gt;
|0x80049948&lt;br /&gt;
|const unsigned char VOICE_OPCODE_LENGTHS[0x60]&lt;br /&gt;
|Length table for voice opcodes 0xa0-0xff&lt;br /&gt;
&lt;br /&gt;
0 for end of track and branches&lt;br /&gt;
|-&lt;br /&gt;
|0x80049AA8&lt;br /&gt;
|void (* const VOICE_OPCODES[0x60])(struct MusicPlayerTrack *, void *, int)&lt;br /&gt;
|Address table for voice opcodes 0xa0-0xff&lt;br /&gt;
|-&lt;br /&gt;
|0x80049C44&lt;br /&gt;
|const unsigned short VOLUME_TABLE_L[256]&lt;br /&gt;
|See [[FF7/PSX/Sound/Opcodes/0xa8aa|Opcode 0xAA]] for volume balance calculation&lt;br /&gt;
|-&lt;br /&gt;
|0x80049E44&lt;br /&gt;
|const unsigned short VOLUME_TABLE_R[256]&lt;br /&gt;
|See [[FF7/PSX/Sound/Opcodes/0xa8aa|Opcode 0xAA]] for volume balance calculation&lt;br /&gt;
|-&lt;br /&gt;
|0x80083580&lt;br /&gt;
|unsigned char g_AkaoSeqData[]&lt;br /&gt;
|RAM area to load AKAO sequence data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Runtime Library Functions ==&lt;br /&gt;
&lt;br /&gt;
=== LIBSPU ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x80036298&lt;br /&gt;
|void SpuInit(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80036FFC&lt;br /&gt;
|long SpuInitMalloc(long num, char *top)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800373AC&lt;br /&gt;
|long SpuMallocWithStartAddr(unsigned long addr, long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037964&lt;br /&gt;
|unsigned long SpuSetNoiseVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037B90&lt;br /&gt;
|long SpuSetNoiseClock(long n_clock)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037BE0&lt;br /&gt;
|unsigned long SpuRead(unsigned char *addr, unsigned long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037C40&lt;br /&gt;
|long SpuSetReverb(long on_off)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037D90&lt;br /&gt;
|long SpuGetReverb(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037E1C&lt;br /&gt;
|long SpuSetReverbModeParam(SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800387FC&lt;br /&gt;
|void SpuGetReverbModeParam (SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003884C&lt;br /&gt;
|long SpuSetReverbDepth(SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800388C4&lt;br /&gt;
|unsigned long SpuSetReverbVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800388E8&lt;br /&gt;
|long SpuClearReverbWorkArea(long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038A84&lt;br /&gt;
|long SpuSetIRQ(long on_off)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038BC4&lt;br /&gt;
|unsigned long SpuSetIRQAddr(unsigned long addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038C04&lt;br /&gt;
|SpuIRQCallbackProc SpuSetIRQCallback(SpuIRQCallbackProc func)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038C6C&lt;br /&gt;
|void SpuSetKey(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038F04&lt;br /&gt;
|unsigned long SpuWrite(unsigned char *addr, unsigned long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038F64&lt;br /&gt;
|unsigned long SpuSetTransferStartAddr(unsigned long addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038FB8&lt;br /&gt;
|long SpuSetTransferMode(long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038FEC&lt;br /&gt;
|SpuTransferCallbackProc SpuSetTransferCallback(SpuTransferCallbackProc func)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039010&lt;br /&gt;
|unsigned long SpuSetPitchLFOVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039034&lt;br /&gt;
|void SpuSetCommonAttr(SpuCommonAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800393C8&lt;br /&gt;
|void SpuSetVoiceVolume(int voiceNum, short volL, short volR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039450&lt;br /&gt;
|void SpuSetVoiceVolumeAttr(int voiceNum, short volL, short volR, short volModeL, short volModeR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800395C8&lt;br /&gt;
|void SpuSetVoicePitch(int voiceNum, unsigned short pitch)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039644&lt;br /&gt;
|void SpuSetVoiceStartAddr(int voiceNum, unsigned long startAddr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800396C0&lt;br /&gt;
|void SpuSetVoiceLoopStartAddr(int voiceNum, unsigned long lsa)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003973C&lt;br /&gt;
|void SpuSetVoiceDR(int voiceNum, unsigned short DR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800397C8&lt;br /&gt;
|void SpuSetVoiceSL(int voiceNum, unsigned short SL)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039850&lt;br /&gt;
|void SpuSetVoiceARAttr(int voiceNum, unsigned short AR, long ARmode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800398EC&lt;br /&gt;
|void SpuSetVoiceSRAttr(int voiceNum, unsigned short SR, long SRmode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800399D0&lt;br /&gt;
|void SpuSetVoiceRRAttr(int voiceNum, unsigned short RR, long RRmode)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LIBETC ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D0C0&lt;br /&gt;
|int ResetCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D150&lt;br /&gt;
|int VSyncCallback(void (*func)(void))&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D1B4&lt;br /&gt;
|int StopCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D214&lt;br /&gt;
|int CheckCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LIBAPI ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x800429F0&lt;br /&gt;
|void DeliverEvent(unsigned long ev1, unsigned long ev2)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A00&lt;br /&gt;
|long OpenEvent(unsigned long desc, long spec, long mode, long (*func)())&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A10&lt;br /&gt;
|long CloseEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A20&lt;br /&gt;
|long WaitEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A40&lt;br /&gt;
|long EnableEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A50&lt;br /&gt;
|long DisableEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042BC0&lt;br /&gt;
|long SetRCnt(unsigned long spec, unsigned short target, long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042C60&lt;br /&gt;
|long GetRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042C98&lt;br /&gt;
|long StartRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042CCC&lt;br /&gt;
|long StopRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Structures =&lt;br /&gt;
&lt;br /&gt;
 struct AkaoSpuVoiceAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t voice;          // 0x00: voice number&lt;br /&gt;
   uint32_t update_flags;   // 0x04: bitset that indicates what SPU registers need to be updated&lt;br /&gt;
   uint32_t addr;           // 0x08: waveform data start address (SPU address)&lt;br /&gt;
   uint32_t loop_addr;      // 0x0c: loop start address (SPU address)&lt;br /&gt;
   uint32_t a_mode;         // 0x10: ADSR: attack rate mode&lt;br /&gt;
   uint32_t s_mode;         // 0x14: ADSR: sustain rate mode&lt;br /&gt;
   uint32_t r_mode          // 0x18: ADSR: release rate mode&lt;br /&gt;
   uint16_t pitch;          // 0x1c: pitch&lt;br /&gt;
   uint16_t ar;             // 0x1e: ADSR: attack rate&lt;br /&gt;
   uint16_t dr;             // 0x20: ADSR: decay rate&lt;br /&gt;
   uint16_t sl;             // 0x22: ADSR: sustain level&lt;br /&gt;
   uint16_t sr;             // 0x24: ADSR: sustain rate&lt;br /&gt;
   uint16_t rr;             // 0x26: ADSR: release rate&lt;br /&gt;
   SpuVolume volume;        // 0x28: volume (left and right)&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoPlayer // the music player instance exists at 0x8009A104&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t stereo_mode;                 // 0x00: stereo mode (1: stereo, 4: surround, otherwise: mono)&lt;br /&gt;
   uint32_t active_voices;               // 0x04: bitset that indicates the voices currently in use&lt;br /&gt;
   uint32_t key_on_voices;               // 0x08: bitset that indicates the voices to key on&lt;br /&gt;
   uint32_t keyed_voices;                // 0x0c: bitset that indicates the voices currently keyed on&lt;br /&gt;
   uint32_t key_off_voices;              // 0x10: bitset that indicates the voices to key off&lt;br /&gt;
   uint32_t saved_active_voices;         // 0x14: unknown voice bitset&lt;br /&gt;
   uint32_t tempo;                       // 0x18: tempo (Q16 fixed-point number)&lt;br /&gt;
   int32_t tempo_slope;                  // 0x1c: slope of tempo slider (Q16 fixed-point number)&lt;br /&gt;
   uint32_t time_counter;                // 0x20: time counter (0x10000 = 1 tick)&lt;br /&gt;
   uint32_t overlay_voices;              // 0x24: bitset that indicates the sub-voices used for overlay (opcode 0xF4)&lt;br /&gt;
   uint32_t alternate_voices;            // 0x28: bitset that indicates the sub-voices used for alternate voice (opcode 0xF8)&lt;br /&gt;
   uint32_t noise_voices;                // 0x2c: bitset that indicates the voices with noise mode enabled&lt;br /&gt;
   uint32_t reverb_voices;               // 0x30: bitset that indicates the voices with reverb enabled&lt;br /&gt;
   uint32_t pitch_lfo_voices;            // 0x34: bitset that indicates the voices with pitch LFO (frequency modulation) mode enabled&lt;br /&gt;
   uint32_t spucnt;                      // 0x38: SPUCNT shadow&lt;br /&gt;
   uint32_t reverb_type;                 // 0x3c: reverb type&lt;br /&gt;
   uint32_t reverb_depth;                // 0x40: reverb depth (Q16 fixed-point number)&lt;br /&gt;
   int32_t reverb_depth_slope;           // 0x44: slope of reverb depth slider (Q16 fixed-point number)&lt;br /&gt;
   uint16_t tempo_slide_length;          // 0x48: tempo slide length&lt;br /&gt;
   uint16_t song_id;                     // 0x4a: current song id&lt;br /&gt;
   uint16_t condition_ack;               // 0x4c: the last matched condition value (opcode 0xEF)&lt;br /&gt;
   uint16_t condition;                   // 0x4e: condition variable for dynamic branching according to game status (opcode 0xEF)&lt;br /&gt;
   uint16_t reverb_depth_slide_length;   // 0x50: length of reverb depth slide&lt;br /&gt;
   uint16_t noise_clock;                 // 0x52: noise clock frequency&lt;br /&gt;
   uint16_t field_54;                    // 0x54: unknown&lt;br /&gt;
   uint16_t beats_per_measure;           // 0x56: beats per measure&lt;br /&gt;
   uint16_t beat;                        // 0x58: current beat&lt;br /&gt;
   uint16_t ticks_per_beat;              // 0x5a: ticks per beat&lt;br /&gt;
   uint16_t tick;                        // 0x5c: current ticks per beat&lt;br /&gt;
   uint16_t measure;                     // 0x5e: current measure&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoPlayerTrack // the music player track instances exist at 0x80096608 + (N * 0x108)&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t *addr;                                    // 0x00&lt;br /&gt;
   uint8_t *loop_addrs[4];                           // 0x04&lt;br /&gt;
   AkaoDrumKeyAttr *drum_addr;                       // 0x14&lt;br /&gt;
   int16_t *vibrato_lfo_addr;                        // 0x18&lt;br /&gt;
   int16_t *tremolo_lfo_addr;                        // 0x1C&lt;br /&gt;
   int16_t *pan_lfo_addr;                            // 0x20&lt;br /&gt;
   uint32_t overlay_voice_num;                       // 0x24&lt;br /&gt;
   uint32_t alternate_voice_num;                     // 0x28&lt;br /&gt;
   uint32_t master_volume;                           // 0x2C&lt;br /&gt;
   uint32_t pitch_of_note;                           // 0x30&lt;br /&gt;
   int32_t pitch_bend_slide_amplitude;               // 0x34&lt;br /&gt;
   uint16_t voice_effect_flags;                      // 0x38&lt;br /&gt;
   uint16_t field_3A;                                // 0x3A&lt;br /&gt;
   uint16_t field_3C;                                // 0x3C&lt;br /&gt;
   uint16_t field_3E;                                // 0x3E&lt;br /&gt;
   uint32_t field_40;                                // 0x40&lt;br /&gt;
   uint32_t volume;                                  // 0x44&lt;br /&gt;
   int32_t volume_slope;                             // 0x48&lt;br /&gt;
   int32_t pitch_bend_slope;                         // 0x4C&lt;br /&gt;
   uint16_t field_50;                                // 0x50&lt;br /&gt;
   uint16_t field_52;                                // 0x52&lt;br /&gt;
   uint16_t field_54;                                // 0x54&lt;br /&gt;
   uint8_t delta_time_counter;                       // 0x56&lt;br /&gt;
   uint8_t gate_time_counter;                        // 0x57&lt;br /&gt;
   uint16_t instrument;                              // 0x58&lt;br /&gt;
   uint16_t field_5A;                                // 0x5A&lt;br /&gt;
   uint16_t volume_slide_length_counter;             // 0x5C&lt;br /&gt;
   uint16_t overlay_balance_slide_length_counter;    // 0x5E&lt;br /&gt;
   uint16_t pan;                                     // 0x60&lt;br /&gt;
   uint16_t pan_slide_length;                        // 0x62&lt;br /&gt;
   int16_t pitch_slide_length_counter;               // 0x64&lt;br /&gt;
   uint16_t octave;                                  // 0x66&lt;br /&gt;
   uint16_t pitch_slide_length;                      // 0x68&lt;br /&gt;
   uint16_t previous_note_number;                    // 0x6A&lt;br /&gt;
   uint16_t portamento_speed;                        // 0x6C&lt;br /&gt;
   uint16_t legato_flags;                            // 0x6E&lt;br /&gt;
   uint16_t field_70;                                // 0x70&lt;br /&gt;
   uint16_t vibrato_lfo_delay;                       // 0x72&lt;br /&gt;
   uint16_t vibrato_delay_counter;                   // 0x74&lt;br /&gt;
   uint16_t vibrato_rate;                            // 0x76&lt;br /&gt;
   uint16_t vibrato_rate_counter;                    // 0x78&lt;br /&gt;
   uint16_t vibrato_form;                            // 0x7A&lt;br /&gt;
   uint16_t vibrato_max_amplitude;                   // 0x7C&lt;br /&gt;
   uint16_t vibrato_depth;                           // 0x7E&lt;br /&gt;
   uint16_t vibrato_depth_slide_length_counter;      // 0x80&lt;br /&gt;
   int16_t vibrato_depth_slope;                      // 0x82&lt;br /&gt;
   uint16_t field_84;                                // 0x84&lt;br /&gt;
   uint16_t tremolo_delay;                           // 0x86&lt;br /&gt;
   uint16_t tremolo_delay_counter;                   // 0x88&lt;br /&gt;
   uint16_t tremolo_rate;                            // 0x8A&lt;br /&gt;
   uint16_t tremolo_rate_counter;                    // 0x8C&lt;br /&gt;
   uint16_t tremolo_form;                            // 0x8E&lt;br /&gt;
   uint16_t tremolo_depth;                           // 0x90&lt;br /&gt;
   uint16_t tremolo_depth_slide_length_counter;      // 0x92&lt;br /&gt;
   int16_t tremolo_depth_slope;                      // 0x94&lt;br /&gt;
   uint16_t field_96;                                // 0x96&lt;br /&gt;
   uint16_t pan_lfo_rate;                            // 0x98&lt;br /&gt;
   uint16_t pan_lfo_rate_counter;                    // 0x9A&lt;br /&gt;
   uint16_t pan_lfo_form;                            // 0x9C&lt;br /&gt;
   uint16_t pan_lfo_depth;                           // 0x9E&lt;br /&gt;
   uint16_t pan_lfo_depth_slide_length_counter;      // 0xA0&lt;br /&gt;
   int16_t pan_lfo_slope;                            // 0xA2&lt;br /&gt;
   uint16_t noise_on_off_delay_counter;              // 0xA4&lt;br /&gt;
   uint16_t pitchmod_on_off_delay_counter;           // 0xA6&lt;br /&gt;
   uint8_t field_A8[16];                             // 0xA8&lt;br /&gt;
   uint16_t loop_layer;                              // 0xB8&lt;br /&gt;
   uint16_t loop_counts[4];                          // 0xBA&lt;br /&gt;
   uint16_t previous_delta_time;                     // 0xC2&lt;br /&gt;
   uint16_t forced_delta_time;                       // 0xC4&lt;br /&gt;
   uint16_t overlay_balance;                         // 0xC6&lt;br /&gt;
   int16_t overlay_balance_slope;                    // 0xC8&lt;br /&gt;
   int16_t pan_slope;                                // 0xCA&lt;br /&gt;
   int16_t transpose;                                // 0xCC&lt;br /&gt;
   int16_t tuning;                                   // 0xCE&lt;br /&gt;
   uint16_t note;                                    // 0xD0&lt;br /&gt;
   int16_t pitch_slide_amount;                       // 0xD2&lt;br /&gt;
   int16_t previous_transpose;                       // 0xD4&lt;br /&gt;
   int16_t vibrato_lfo_amplitude;                    // 0xD6&lt;br /&gt;
   int16_t tremolo_lfo_amplitude;                    // 0xD8&lt;br /&gt;
   int16_t pan_lfo_amplitude;                        // 0xDA&lt;br /&gt;
   AkaoSpuVoiceAttr spu_attr;                        // 0xDC&lt;br /&gt;
 };&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Code_Map&amp;diff=5728</id>
		<title>FF7/PSX/Sound/Code Map</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Code_Map&amp;diff=5728"/>
		<updated>2020-06-06T15:03:01Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: Add AkaoPlayerTrack structure&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Code Map =&lt;br /&gt;
&lt;br /&gt;
Introduces functions, variables and data related to sound, contained in SCUS_941.63 (game program of US version). Note that all symbol names below are for convenience only.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x80029818&lt;br /&gt;
|void AkaoLoadInstrSet(const void *sampleSet, const void *instrSet)&lt;br /&gt;
|Load additional instrument set&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR2.ALL&lt;br /&gt;
&lt;br /&gt;
''instrSet'': corresponding to SOUND/INSTR2.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x8002988C&lt;br /&gt;
|void AkaoInit(const void *sampleSet, const void *instrSet)&lt;br /&gt;
|Initialize sound driver and load initial instruments&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR.ALL&lt;br /&gt;
&lt;br /&gt;
''instrSet'': corresponding to SOUND/INSTR.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x8002DA7C&lt;br /&gt;
|int AkaoLoadSeq(void)&lt;br /&gt;
|Load and start playing new [[FF7/PSX/Sound/AKAO sequence|AKAO sequence]]&lt;br /&gt;
&lt;br /&gt;
Parameters are given from a global structure&lt;br /&gt;
&lt;br /&gt;
Returns: 0 for success, 1 for already loaded, and -1 for invalid signature&lt;br /&gt;
|-&lt;br /&gt;
|0x80030234&lt;br /&gt;
|int _AkaoCallback(void)&lt;br /&gt;
|Callback event for sound, registered by OpenEvent BIOS function&lt;br /&gt;
|-&lt;br /&gt;
|0x80030E7C&lt;br /&gt;
|void _AkaoDispatchVoice(struct MusicPlayerTrack *track, void *a1, int a2)&lt;br /&gt;
|Dispatch voice opcodes until the next note or end of track&lt;br /&gt;
|-&lt;br /&gt;
|0x80049948&lt;br /&gt;
|const unsigned char VOICE_OPCODE_LENGTHS[0x60]&lt;br /&gt;
|Length table for voice opcodes 0xa0-0xff&lt;br /&gt;
&lt;br /&gt;
0 for end of track and branches&lt;br /&gt;
|-&lt;br /&gt;
|0x80049AA8&lt;br /&gt;
|void (* const VOICE_OPCODES[0x60])(struct MusicPlayerTrack *, void *, int)&lt;br /&gt;
|Address table for voice opcodes 0xa0-0xff&lt;br /&gt;
|-&lt;br /&gt;
|0x80049C44&lt;br /&gt;
|const unsigned short VOLUME_TABLE_L[256]&lt;br /&gt;
|See [[FF7/PSX/Sound/Opcodes/0xa8aa|Opcode 0xAA]] for volume balance calculation&lt;br /&gt;
|-&lt;br /&gt;
|0x80049E44&lt;br /&gt;
|const unsigned short VOLUME_TABLE_R[256]&lt;br /&gt;
|See [[FF7/PSX/Sound/Opcodes/0xa8aa|Opcode 0xAA]] for volume balance calculation&lt;br /&gt;
|-&lt;br /&gt;
|0x80083580&lt;br /&gt;
|unsigned char g_AkaoSeqData[]&lt;br /&gt;
|RAM area to load AKAO sequence data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Runtime Library Functions ==&lt;br /&gt;
&lt;br /&gt;
=== LIBSPU ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x80036298&lt;br /&gt;
|void SpuInit(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80036FFC&lt;br /&gt;
|long SpuInitMalloc(long num, char *top)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800373AC&lt;br /&gt;
|long SpuMallocWithStartAddr(unsigned long addr, long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037964&lt;br /&gt;
|unsigned long SpuSetNoiseVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037B90&lt;br /&gt;
|long SpuSetNoiseClock(long n_clock)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037BE0&lt;br /&gt;
|unsigned long SpuRead(unsigned char *addr, unsigned long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037C40&lt;br /&gt;
|long SpuSetReverb(long on_off)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037D90&lt;br /&gt;
|long SpuGetReverb(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037E1C&lt;br /&gt;
|long SpuSetReverbModeParam(SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800387FC&lt;br /&gt;
|void SpuGetReverbModeParam (SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003884C&lt;br /&gt;
|long SpuSetReverbDepth(SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800388C4&lt;br /&gt;
|unsigned long SpuSetReverbVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800388E8&lt;br /&gt;
|long SpuClearReverbWorkArea(long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038A84&lt;br /&gt;
|long SpuSetIRQ(long on_off)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038BC4&lt;br /&gt;
|unsigned long SpuSetIRQAddr(unsigned long addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038C04&lt;br /&gt;
|SpuIRQCallbackProc SpuSetIRQCallback(SpuIRQCallbackProc func)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038C6C&lt;br /&gt;
|void SpuSetKey(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038F04&lt;br /&gt;
|unsigned long SpuWrite(unsigned char *addr, unsigned long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038F64&lt;br /&gt;
|unsigned long SpuSetTransferStartAddr(unsigned long addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038FB8&lt;br /&gt;
|long SpuSetTransferMode(long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038FEC&lt;br /&gt;
|SpuTransferCallbackProc SpuSetTransferCallback(SpuTransferCallbackProc func)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039010&lt;br /&gt;
|unsigned long SpuSetPitchLFOVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039034&lt;br /&gt;
|void SpuSetCommonAttr(SpuCommonAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800393C8&lt;br /&gt;
|void SpuSetVoiceVolume(int voiceNum, short volL, short volR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039450&lt;br /&gt;
|void SpuSetVoiceVolumeAttr(int voiceNum, short volL, short volR, short volModeL, short volModeR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800395C8&lt;br /&gt;
|void SpuSetVoicePitch(int voiceNum, unsigned short pitch)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039644&lt;br /&gt;
|void SpuSetVoiceStartAddr(int voiceNum, unsigned long startAddr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800396C0&lt;br /&gt;
|void SpuSetVoiceLoopStartAddr(int voiceNum, unsigned long lsa)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003973C&lt;br /&gt;
|void SpuSetVoiceDR(int voiceNum, unsigned short DR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800397C8&lt;br /&gt;
|void SpuSetVoiceSL(int voiceNum, unsigned short SL)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039850&lt;br /&gt;
|void SpuSetVoiceARAttr(int voiceNum, unsigned short AR, long ARmode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800398EC&lt;br /&gt;
|void SpuSetVoiceSRAttr(int voiceNum, unsigned short SR, long SRmode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800399D0&lt;br /&gt;
|void SpuSetVoiceRRAttr(int voiceNum, unsigned short RR, long RRmode)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LIBETC ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D0C0&lt;br /&gt;
|int ResetCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D150&lt;br /&gt;
|int VSyncCallback(void (*func)(void))&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D1B4&lt;br /&gt;
|int StopCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D214&lt;br /&gt;
|int CheckCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LIBAPI ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x800429F0&lt;br /&gt;
|void DeliverEvent(unsigned long ev1, unsigned long ev2)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A00&lt;br /&gt;
|long OpenEvent(unsigned long desc, long spec, long mode, long (*func)())&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A10&lt;br /&gt;
|long CloseEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A20&lt;br /&gt;
|long WaitEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A40&lt;br /&gt;
|long EnableEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A50&lt;br /&gt;
|long DisableEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042BC0&lt;br /&gt;
|long SetRCnt(unsigned long spec, unsigned short target, long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042C60&lt;br /&gt;
|long GetRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042C98&lt;br /&gt;
|long StartRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042CCC&lt;br /&gt;
|long StopRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Structures =&lt;br /&gt;
&lt;br /&gt;
 struct AkaoSpuVoiceAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t voice;          // 0x00: voice number&lt;br /&gt;
   uint32_t update_flags;   // 0x04: bitset that indicates what SPU registers need to be updated&lt;br /&gt;
   uint32_t addr;           // 0x08: waveform data start address (SPU address)&lt;br /&gt;
   uint32_t loop_addr;      // 0x0c: loop start address (SPU address)&lt;br /&gt;
   uint32_t a_mode;         // 0x10: ADSR: attack rate mode&lt;br /&gt;
   uint32_t s_mode;         // 0x14: ADSR: sustain rate mode&lt;br /&gt;
   uint32_t r_mode          // 0x18: ADSR: release rate mode&lt;br /&gt;
   uint16_t pitch;          // 0x1c: pitch&lt;br /&gt;
   uint16_t ar;             // 0x1e: ADSR: attack rate&lt;br /&gt;
   uint16_t dr;             // 0x20: ADSR: decay rate&lt;br /&gt;
   uint16_t sl;             // 0x22: ADSR: sustain level&lt;br /&gt;
   uint16_t sr;             // 0x24: ADSR: sustain rate&lt;br /&gt;
   uint16_t rr;             // 0x26: ADSR: release rate&lt;br /&gt;
   SpuVolume volume;        // 0x28: volume (left and right)&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoPlayer // the music player instance exists at 0x8009A104&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t stereo_mode;                 // 0x00: stereo mode (1: stereo, 4: surround, otherwise: mono)&lt;br /&gt;
   uint32_t active_voices;               // 0x04: bitset that indicates the voices currently in use&lt;br /&gt;
   uint32_t key_on_voices;               // 0x08: bitset that indicates the voices to key on&lt;br /&gt;
   uint32_t keyed_voices;                // 0x0c: bitset that indicates the voices currently keyed on&lt;br /&gt;
   uint32_t key_off_voices;              // 0x10: bitset that indicates the voices to key off&lt;br /&gt;
   uint32_t saved_active_voices;         // 0x14: unknown voice bitset&lt;br /&gt;
   uint32_t tempo;                       // 0x18: tempo (Q16 fixed-point number)&lt;br /&gt;
   int32_t tempo_slope;                  // 0x1c: slope of tempo slider (Q16 fixed-point number)&lt;br /&gt;
   uint32_t time_counter;                // 0x20: time counter (0x10000 = 1 tick)&lt;br /&gt;
   uint32_t overlay_voices;              // 0x24: bitset that indicates the sub-voices used for overlay (opcode 0xF4)&lt;br /&gt;
   uint32_t alternate_voices;            // 0x28: bitset that indicates the sub-voices used for alternate voice (opcode 0xF8)&lt;br /&gt;
   uint32_t noise_voices;                // 0x2c: bitset that indicates the voices with noise mode enabled&lt;br /&gt;
   uint32_t reverb_voices;               // 0x30: bitset that indicates the voices with reverb enabled&lt;br /&gt;
   uint32_t pitch_lfo_voices;            // 0x34: bitset that indicates the voices with pitch LFO (frequency modulation) mode enabled&lt;br /&gt;
   uint32_t spucnt;                      // 0x38: SPUCNT shadow&lt;br /&gt;
   uint32_t reverb_type;                 // 0x3c: reverb type&lt;br /&gt;
   uint32_t reverb_depth;                // 0x40: reverb depth (Q16 fixed-point number)&lt;br /&gt;
   int32_t reverb_depth_slope;           // 0x44: slope of reverb depth slider (Q16 fixed-point number)&lt;br /&gt;
   uint16_t tempo_slide_length;          // 0x48: tempo slide length&lt;br /&gt;
   uint16_t song_id;                     // 0x4a: current song id&lt;br /&gt;
   uint16_t condition_ack;               // 0x4c: the last matched condition value (opcode 0xEF)&lt;br /&gt;
   uint16_t condition;                   // 0x4e: condition variable for dynamic branching according to game status (opcode 0xEF)&lt;br /&gt;
   uint16_t reverb_depth_slide_length;   // 0x50: length of reverb depth slide&lt;br /&gt;
   uint16_t noise_clock;                 // 0x52: noise clock frequency&lt;br /&gt;
   uint16_t field_54;                    // 0x54: unknown&lt;br /&gt;
   uint16_t beats_per_measure;           // 0x56: beats per measure&lt;br /&gt;
   uint16_t beat;                        // 0x58: current beat&lt;br /&gt;
   uint16_t ticks_per_beat;              // 0x5a: ticks per beat&lt;br /&gt;
   uint16_t tick;                        // 0x5c: current ticks per beat&lt;br /&gt;
   uint16_t measure;                     // 0x5e: current measure&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoPlayerTrack // the music player track instances exist at 0x80096608 + (N * 0x108)&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t *addr;                                    // 0x00&lt;br /&gt;
   uint8_t *loop_addrs[4];                           // 0x04&lt;br /&gt;
   AkaoDrumKeyAttr *drum_addr;                       // 0x14&lt;br /&gt;
   int16_t *vibrato_lfo_addr;                        // 0x18&lt;br /&gt;
   int16_t *tremolo_lfo_addr;                        // 0x1C&lt;br /&gt;
   int16_t *pan_lfo_addr;                            // 0x20&lt;br /&gt;
   uint32_t overlay_voice_num;                       // 0x24&lt;br /&gt;
   uint32_t alternate_voice_num;                     // 0x28&lt;br /&gt;
   uint32_t master_volume;                           // 0x2C&lt;br /&gt;
   uint32_t pitch_of_note;                           // 0x30&lt;br /&gt;
   int32_t pitch_bend_slide_amplitude;               // 0x34&lt;br /&gt;
   uint16_t voice_effect_flags;                      // 0x38&lt;br /&gt;
   uint16_t field_3A;                                // 0x3A&lt;br /&gt;
   uint16_t field_3C;                                // 0x3C&lt;br /&gt;
   uint16_t field_3E;                                // 0x3E&lt;br /&gt;
   uint32_t field_40;                                // 0x40&lt;br /&gt;
   uint32_t volume;                                  // 0x44&lt;br /&gt;
   int32_t volume_slope;                             // 0x48&lt;br /&gt;
   int32_t pitch_bend_slope;                         // 0x4C&lt;br /&gt;
   uint16_t field_50;                                // 0x50&lt;br /&gt;
   uint16_t field_52;                                // 0x52&lt;br /&gt;
   uint16_t field_54;                                // 0x54&lt;br /&gt;
   uint8_t delta_time_counter;                       // 0x56&lt;br /&gt;
   uint8_t gate_time_counter;                        // 0x57&lt;br /&gt;
   uint16_t instrument;                              // 0x58&lt;br /&gt;
   uint16_t field_5A;                                // 0x5A&lt;br /&gt;
   uint16_t volume_slide_length_counter;             // 0x5C&lt;br /&gt;
   uint16_t overlay_balance_slide_length_counter;    // 0x5E&lt;br /&gt;
   uint16_t pan;                                     // 0x60&lt;br /&gt;
   uint16_t pan_slide_length;                        // 0x62&lt;br /&gt;
   int16_t pitch_slide_length_counter;               // 0x64&lt;br /&gt;
   uint16_t octave;                                  // 0x66&lt;br /&gt;
   uint16_t pitch_slide_length;                      // 0x68&lt;br /&gt;
   uint16_t previous_note_number;                    // 0x6A&lt;br /&gt;
   uint16_t portamento_speed;                        // 0x6C&lt;br /&gt;
   uint16_t legato_flags;                            // 0x6E&lt;br /&gt;
   uint16_t field_70;                                // 0x70&lt;br /&gt;
   uint16_t vibrato_lfo_delay;                       // 0x72&lt;br /&gt;
   uint16_t vibrato_delay_counter;                   // 0x74&lt;br /&gt;
   uint16_t vibrato_rate;                            // 0x76&lt;br /&gt;
   uint16_t vibrato_rate_counter;                    // 0x78&lt;br /&gt;
   uint16_t vibrato_form;                            // 0x7A&lt;br /&gt;
   uint16_t vibrato_max_amplitude;                   // 0x7C&lt;br /&gt;
   uint16_t vibrato_depth;                           // 0x7E&lt;br /&gt;
   uint16_t vibrato_depth_slide_length_counter;      // 0x80&lt;br /&gt;
   int16_t vibrato_depth_slope;                      // 0x82&lt;br /&gt;
   uint16_t field_84;                                // 0x84&lt;br /&gt;
   uint16_t tremolo_delay;                           // 0x86&lt;br /&gt;
   uint16_t tremolo_delay_counter;                   // 0x88&lt;br /&gt;
   uint16_t tremolo_rate;                            // 0x8A&lt;br /&gt;
   uint16_t tremolo_rate_counter;                    // 0x8C&lt;br /&gt;
   uint16_t tremolo_form;                            // 0x8E&lt;br /&gt;
   uint16_t tremolo_depth;                           // 0x90&lt;br /&gt;
   uint16_t tremolo_depth_slide_length_counter;      // 0x92&lt;br /&gt;
   int16_t tremolo_depth_slope;                      // 0x94&lt;br /&gt;
   uint16_t field_96;                                // 0x96&lt;br /&gt;
   uint16_t pan_lfo_rate;                            // 0x98&lt;br /&gt;
   uint16_t pan_lfo_rate_counter;                    // 0x9A&lt;br /&gt;
   uint16_t pan_lfo_form;                            // 0x9C&lt;br /&gt;
   uint16_t pan_lfo_depth;                           // 0x9E&lt;br /&gt;
   uint16_t pan_lfo_depth_slide_length_counter;      // 0xA0&lt;br /&gt;
   int16_t pan_lfo_slope;                            // 0xA2&lt;br /&gt;
   uint16_t noise_on_off_delay_counter;              // 0xA4&lt;br /&gt;
   uint16_t pitchmod_on_off_delay_counter;           // 0xA6&lt;br /&gt;
   uint8_t field_A8[16];                             // 0xA8&lt;br /&gt;
   uint16_t loop_layer;                              // 0xB8&lt;br /&gt;
   uint16_t loop_counts[4];                          // 0xBA&lt;br /&gt;
   uint16_t previous_delta_time;                     // 0xC2&lt;br /&gt;
   uint16_t forced_delta_time;                       // 0xC4&lt;br /&gt;
   uint16_t overlay_balance;                         // 0xC6&lt;br /&gt;
   int16_t overlay_balance_slope;                    // 0xC8&lt;br /&gt;
   int16_t pan_slope;                                // 0xCA&lt;br /&gt;
   int16_t transpose;                                // 0xCC&lt;br /&gt;
   int16_t tuning;                                   // 0xCE&lt;br /&gt;
   uint16_t note;                                    // 0xD0&lt;br /&gt;
   int16_t pitch_slide_amount;                       // 0xD2&lt;br /&gt;
   int16_t previous_transpose;                       // 0xD4&lt;br /&gt;
   int16_t vibrato_lfo_amplitude;                    // 0xD6&lt;br /&gt;
   int16_t tremolo_lfo_amplitude;                    // 0xD8&lt;br /&gt;
   int16_t pan_lfo_amplitude;                        // 0xDA&lt;br /&gt;
   AkaoSpuVoiceAttr spu_attr;                        // 0xDC&lt;br /&gt;
 };&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/AKAO_sequence&amp;diff=5727</id>
		<title>FF7/PSX/Sound/AKAO sequence</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/AKAO_sequence&amp;diff=5727"/>
		<updated>2020-06-06T14:51:01Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
AKAO sequence is the most complicated part of the FF7 sound system. (&amp;quot;AKAO&amp;quot; is the signature string, which implies that the sound format has developed by Square Enix sound programmer Minoru Akao.)&lt;br /&gt;
&lt;br /&gt;
AKAO sequence is similar to MIDI sequence - it's custom tracker format for playing sequence sound, well tuned specially for PSX.&lt;br /&gt;
&lt;br /&gt;
The sequence data can be found in all FF7 game modules: Field, Battle, Worldmap and in minigames.&lt;br /&gt;
&lt;br /&gt;
All files with exension *.SND are AKAO.&lt;br /&gt;
&lt;br /&gt;
* '''MINI/ASERI2.SND''' - Battle Arena theme&lt;br /&gt;
* '''MINI/SENSUI.SND''' - used in Submarine minigame&lt;br /&gt;
* '''ENEMY6/OVER2.SND''' - game over sequence&lt;br /&gt;
* '''ENEMY6/FAN2.SND''' - battle win &amp;quot;fanfare&amp;quot; sequence&lt;br /&gt;
* '''MOVIE/OVER2.SND''' - same game over sequence, don't know, why to duplicate data&lt;br /&gt;
&lt;br /&gt;
Other AKAO sequences are hard-wired in other files.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
=== Header (size: 16 bytes) ===&lt;br /&gt;
&lt;br /&gt;
 struct AkaoHeader&lt;br /&gt;
 {&lt;br /&gt;
   static const uint8_t magic[4];  // &amp;quot;AKAO&amp;quot; C-string&lt;br /&gt;
   uint16_t id;                    // song ID, used for playing sequence&lt;br /&gt;
   uint16_t length;                // data length - sizeof(header)&lt;br /&gt;
   uint16_t reverb_type;           // reverb type (range from 0 to 9)&lt;br /&gt;
   struct AkaoTimeStamp&lt;br /&gt;
   {&lt;br /&gt;
     uint8_t year_bcd;             // year (in binary coded decimal)&lt;br /&gt;
     uint8_t month_bcd;            // month (in binary coded decimal, between 0x01 - 0x12)&lt;br /&gt;
     uint8_t day_bcd;              // day (in binary coded decimal, between 0x01 - 0x31)&lt;br /&gt;
     uint8_t hours_bcd;            // hours (in binary coded decimal, between 0x00 - 0x23)&lt;br /&gt;
     uint8_t minutes_bcd;          // minutes (in binary coded decimal, between 0x00 - 0x59)&lt;br /&gt;
     uint8_t seconds_bcd;          // seconds (in binary coded decimal, between 0x00 - 0x59)&lt;br /&gt;
   } timestamp;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
=== Channel Info (size: 4 bytes + 2 bytes * &amp;lt;channels count&amp;gt;) ===&lt;br /&gt;
 struct AkaoChannelInfo&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t mask;                         // represents bitmask of used channels in this song&lt;br /&gt;
   uint32_t start_offsets[num_channels];  // offsets to channel opcode data&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 int num_channels = 0;&lt;br /&gt;
 while (int bit = 0; ((info.mask &amp;amp; 0xFFFFFF) &amp;amp; (1 &amp;lt;&amp;lt; bit)) != 0; bit++)&lt;br /&gt;
   num_channels++;&lt;br /&gt;
&lt;br /&gt;
First there is 32-bit number (offset 0x10), which represents bitmask of used channels in this song.&lt;br /&gt;
&lt;br /&gt;
After this bitmask, there is &amp;lt;channels count&amp;gt; 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.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Channel Commands [AKAO Opcodes] ===&lt;br /&gt;
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 &amp;quot;opcodes&amp;quot;. Every opcode has its own number of arguments (from no-arguments, to 3 arguments).&lt;br /&gt;
&lt;br /&gt;
=== Drum Instrument Map Table ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
The table consists of a repetition of 5-byte items.&lt;br /&gt;
&lt;br /&gt;
 struct AkaoDrumKeyAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t instrument;   // corresponding to opcode 0xA1&lt;br /&gt;
   uint8_t key;          // note number when playing the drum note&lt;br /&gt;
   uint16_t volume;      // corresponding to opcode 0xA8 (lower 8bit is a fractional part of the volume)&lt;br /&gt;
   uint8_t pan;          // corresponding to opcode 0xAA&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Example (Home-Created AKAO Sequence): ==&lt;br /&gt;
=== Header ===&lt;br /&gt;
'''41 4b 41 4f''' - AKAO string&lt;br /&gt;
&lt;br /&gt;
'''34 12''' - song ID: 0x1234&lt;br /&gt;
&lt;br /&gt;
'''16 00''' - data length 0x16 in hex or 22 in decimal&lt;br /&gt;
&lt;br /&gt;
'''04 00''' - reverb type: 4 (large studio)&lt;br /&gt;
&lt;br /&gt;
'''96 12 18 22 46 28''' - created at 1996-12-18 22:46:28&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Channel Info ===&lt;br /&gt;
'''01 00 00 00''' - this indicates, that used only one channel&lt;br /&gt;
&lt;br /&gt;
'''00 00''' - offset to first channel opcodes: in our example 0x00 means that next to this offset is opcodes for first channel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Channel Commands ===&lt;br /&gt;
'''e8 a8 66''' - sets tempo, parameter 0x66a8&lt;br /&gt;
&lt;br /&gt;
'''ea 00 50''' - sets reverb depth&lt;br /&gt;
&lt;br /&gt;
'''a8 55''' - load sample 0x55 from INSTR.ALL to channel&lt;br /&gt;
&lt;br /&gt;
'''aa 40''' - sets channel volume&lt;br /&gt;
&lt;br /&gt;
'''c2''' - turns on reverb effect&lt;br /&gt;
&lt;br /&gt;
'''a1 0c''' - sets volume pan&lt;br /&gt;
&lt;br /&gt;
'''c8''' - sets loop point&lt;br /&gt;
&lt;br /&gt;
'''66''' - 0x66 % 11 = 3 (3 means to take 3rd number from play length table), 0x66 / 11 = 9 (9 means to take pitch[9] from loaded instrument record index)&lt;br /&gt;
&lt;br /&gt;
'''ca''' - returns to saved loop point with opcode c8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This example plays Chocobo &amp;quot;Whoo-Hoo&amp;quot; (instrument number 0x55) repeatedly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sound Opcode List ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Opcode&lt;br /&gt;
! Summary&lt;br /&gt;
! Length&lt;br /&gt;
! Operands&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0x0099|0x00-0x99]]&lt;br /&gt;
|Note, Tie, Rest&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|The opcode indicates the note key and length. The note will be keyed off 2 ticks before the next note.&lt;br /&gt;
|-&lt;br /&gt;
|0x9A-0x9F&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa0|0xA0]]&lt;br /&gt;
|Finish Channel&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa1|0xA1]]&lt;br /&gt;
|Load Instrument&lt;br /&gt;
|2&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0x0099|0xA2]]&lt;br /&gt;
|Overwrite Next Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length: byte&lt;br /&gt;
|Ignores the regular length (delta-time) of the next note and overwrites it with the specified length.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa8aa|0xA3]]&lt;br /&gt;
|Channel Master Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa4|0xA4]]&lt;br /&gt;
|Pitch Bend Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, semitones: signed byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa5|0xA5]]&lt;br /&gt;
|Set Octave&lt;br /&gt;
|2&lt;br /&gt;
|octave: byte (0-15)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa5|0xA6]]&lt;br /&gt;
|Increase Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa5|0xA7]]&lt;br /&gt;
|Decrease Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa8aa|0xA8]]&lt;br /&gt;
|Channel Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa9|0xA9]]&lt;br /&gt;
|Channel Volume Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa8aa|0xAA]]&lt;br /&gt;
|Channel Pan&lt;br /&gt;
|2&lt;br /&gt;
|pan: byte (0-127)&lt;br /&gt;
|64 is the center.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xab|0xAB]]&lt;br /&gt;
|Channel Pan Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, pan: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xac|0xAC]]&lt;br /&gt;
|Noise Clock Frequency&lt;br /&gt;
|2&lt;br /&gt;
|clock: byte (0x00-0x3f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xAD]]&lt;br /&gt;
|ADSR: Attack Rate&lt;br /&gt;
|2&lt;br /&gt;
|attack_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xAE]]&lt;br /&gt;
|ADSR: Decay Rate&lt;br /&gt;
|2&lt;br /&gt;
|decay_rate: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xAF]]&lt;br /&gt;
|ADSR: Sustain Level&lt;br /&gt;
|2&lt;br /&gt;
|sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xB0]]&lt;br /&gt;
|ADSR: Decay Rate &amp;amp; Sustain Level&lt;br /&gt;
|3&lt;br /&gt;
|decay_rate: byte (0x00-0x0f), sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xB1]]&lt;br /&gt;
|ADSR: Sustain Rate&lt;br /&gt;
|2&lt;br /&gt;
|sustain_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xB2]]&lt;br /&gt;
|ADSR: Release Rate&lt;br /&gt;
|2&lt;br /&gt;
|release_rate: byte (0x00-0x1f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xB3]]&lt;br /&gt;
|ADSR: Reset ADSR&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb4b5|0xB4]]&lt;br /&gt;
|Channel Pitch LFO (Vibrato)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb4b5|0xB5]]&lt;br /&gt;
|Channel Pitch LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|The most significant bit of the &amp;lt;code&amp;gt;depth&amp;lt;/code&amp;gt; determines the amplitude range.&lt;br /&gt;
&lt;br /&gt;
When it is 0, the range is up to about ± 50 cents (amplitude is 15/256 compared with range type 1).&lt;br /&gt;
&lt;br /&gt;
When it is 1, the range is up to about ± 700 cents.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb4b5|0xB6]]&lt;br /&gt;
|Turn Off Channel Pitch LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xB7]]&lt;br /&gt;
|ADSR: Attack Mode&lt;br /&gt;
|2&lt;br /&gt;
|attack_mode: byte (1 or 5)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb8b9|0xB8]]&lt;br /&gt;
|Channel Volume LFO (Tremolo)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb8b9|0xB9]]&lt;br /&gt;
|Channel Volume LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb8b9|0xBA]]&lt;br /&gt;
|Turn Off Channel Volume LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xBB]]&lt;br /&gt;
|ADSR: Sustain Mode&lt;br /&gt;
|2&lt;br /&gt;
|sustain_mode: byte (1, 3, 5 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xbcbd|0xBC]]&lt;br /&gt;
|Channel Pan LFO&lt;br /&gt;
|3&lt;br /&gt;
|rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xbcbd|0xBD]]&lt;br /&gt;
|Channel Pan LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xbcbd|0xBE]]&lt;br /&gt;
|Turn Off Channel Pan LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xbf|0xBF]]&lt;br /&gt;
|ADSR: Release Mode&lt;br /&gt;
|2&lt;br /&gt;
|release_mode: byte (3 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc0c1|0xC0]]&lt;br /&gt;
|Channel Transpose (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc0c1|0xC1]]&lt;br /&gt;
|Channel Transpose (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc2c3|0xC2]]&lt;br /&gt;
|Turn On Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc2c3|0xC3]]&lt;br /&gt;
|Turn Off Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc4c5|0xC4]]&lt;br /&gt;
|Turn On Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc4c5|0xC5]]&lt;br /&gt;
|Turn Off Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc6c7|0xC6]]&lt;br /&gt;
|Turn On Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc6c7|0xC7]]&lt;br /&gt;
|Turn Off Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc8c9|0xC8]]&lt;br /&gt;
|Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Remember the current offset as a loop point and increase the nesting level of the loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc8c9|0xC9]]&lt;br /&gt;
|Return to Loop Point Up to N Times&lt;br /&gt;
|2&lt;br /&gt;
|times: byte&lt;br /&gt;
|On the Nth repeat, this instruction will end the current loop by decrementing the nesting level of the loop. Otherwise, it will increment the loop counter and return to the loop point.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc8c9|0xCA]]&lt;br /&gt;
|Return to Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will increment the loop counter.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xcb|0xCB]]&lt;br /&gt;
|Reset Sound Effects&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Reset sound effects such as noise, frequency modulation, reverb, overlay voice and alternate voice.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xcccd|0xCC]]&lt;br /&gt;
|Turn On Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key on and key off performance of the subsequent notes and update the pitch only.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xcccd|0xCD]]&lt;br /&gt;
|Turn Off Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xcecf|0xCE]]&lt;br /&gt;
|Turn On Noise and Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xcecf|0xCF]]&lt;br /&gt;
|Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd0d1|0xD0]]&lt;br /&gt;
|Turn On Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key off performance of the subsequent notes.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd0d1|0xD1]]&lt;br /&gt;
|Turn Off Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd2d3|0xD2]]&lt;br /&gt;
|Turn On Frequency Modulation and Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd2d3|0xD3]]&lt;br /&gt;
|Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd4d5|0xD4]]&lt;br /&gt;
|Turn On Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Duplicate and use the playback frequency of the previous voice channel.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd4d5|0xD5]]&lt;br /&gt;
|Turn Off Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd6d7|0xD6]]&lt;br /&gt;
|Turn On Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Multiply the playback frequency of the previous voice channel to the output volume. Lower pitch will make the volume smaller.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd6d7|0xD7]]&lt;br /&gt;
|Turn Off Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd8d9|0xD8]]&lt;br /&gt;
|Channel Fine Tuning (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The pitch can be changed in the range of one octave above and below.&lt;br /&gt;
The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is the multiplicand for the playback frequency, not a log-based parameter like cents. For example, when the &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is 127, the pitch will be multiplied by 127/128 (about +1 octave). Negative value ​​will lower the pitch.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd8d9|0xD9]]&lt;br /&gt;
|Channel Fine Tuning (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; will be added to the current tuning amount.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xdadb|0xDA]]&lt;br /&gt;
|Turn On Portamento&lt;br /&gt;
|2&lt;br /&gt;
|speed: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;speed&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xdadb|0xDB]]&lt;br /&gt;
|Turn Off Portamento&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0x0099|0xDC]]&lt;br /&gt;
|Fix Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length_to_add: signed byte&lt;br /&gt;
|Ignore the regular length (delta-time) of subsequent notes and set to the fixed length. The &amp;lt;code&amp;gt;length_to_add&amp;lt;/code&amp;gt; parameter will be added to the current length value. (the initial value is 0)&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xdd|0xDD]]&lt;br /&gt;
|Channel Pitch LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xde|0xDE]]&lt;br /&gt;
|Channel Volume LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xdf|0xDF]]&lt;br /&gt;
|Channel Pan LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa0|0xE0-0xE7]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xe8e9|0xE8]]&lt;br /&gt;
|Tempo&lt;br /&gt;
|3&lt;br /&gt;
|tempo: uint16&lt;br /&gt;
|bpm = tempo / 214.998204 (approximate)&lt;br /&gt;
More strictly, &amp;lt;code&amp;gt;bpm = 60.0 / (48 * (65536.0 / tempo) * (0x44E8 / (33868800.0 / 8)))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that this coefficient is different from other games with PlayStation AKAO.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xe8e9|0xE9]]&lt;br /&gt;
|Tempo Slide&lt;br /&gt;
|4&lt;br /&gt;
|length: byte, tempo: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xeaeb|0xEA]]&lt;br /&gt;
|Reverb Depth&lt;br /&gt;
|3&lt;br /&gt;
|depth: uint16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xeaeb|0xEB]]&lt;br /&gt;
|Reverb Depth Slide&lt;br /&gt;
|4&lt;br /&gt;
|length: byte, depth: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xeced|0xEC]]&lt;br /&gt;
|Turn On Drum Mode&lt;br /&gt;
|3&lt;br /&gt;
|drum_map_offset: signed int16&lt;br /&gt;
|The &amp;lt;code&amp;gt;drum_map_offset&amp;lt;/code&amp;gt; is a relative offset pointing to the drum instrument map table, which determines the instrument for each keys.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xeced|0xED]]&lt;br /&gt;
|Turn Off Drum Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xee|0xEE]]&lt;br /&gt;
|Unconditional Jump&lt;br /&gt;
|3&lt;br /&gt;
|destination_offset: signed int16&lt;br /&gt;
|This instruction can be used to make an infinite loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xef|0xEF]]&lt;br /&gt;
|CPU-Conditional Jump&lt;br /&gt;
|4&lt;br /&gt;
|condition: byte, destination_offset: signed int16&lt;br /&gt;
|Jump if the condition variable matches &amp;lt;code&amp;gt;condition&amp;lt;/code&amp;gt;. The value of the condition variable can be set from the game program.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf0f1|0xF0]]&lt;br /&gt;
|Jump on the Nth Repeat&lt;br /&gt;
|4&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf0f1|0xF1]]&lt;br /&gt;
|Break the Loop on the Nth Repeat&lt;br /&gt;
|4&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|Unlike 0xF0, this instruction will end the current loop by decrementing the nesting level of the loop.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa1|0xF2]]&lt;br /&gt;
|Load Instrument (No Attack Sample)&lt;br /&gt;
|2&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|Unlike 0xA1, the sample before the loop point is replaced by a short, silence sample.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf3|0xF3]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|There is no actual use in music.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf4f5|0xF4]]&lt;br /&gt;
|Turn On Overlay Voice&lt;br /&gt;
|3&lt;br /&gt;
|instrument: byte, instrument2: byte&lt;br /&gt;
|Play the same melody by different instruments on two voice channels. A free voice channel is required to work. Note that the two channels share the playback rate, and the pitch is not calculated for each instruments.&lt;br /&gt;
Used in the song &amp;quot;Anxious Heart&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf4f5|0xF5]]&lt;br /&gt;
|Turn Off Overlay Voice&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf4f5|0xF6]]&lt;br /&gt;
|Overlay Volume Balance&lt;br /&gt;
|2&lt;br /&gt;
|balance: byte (0-127)&lt;br /&gt;
|When the balance is 0, the volume of the primary voice will be 100% (127/128) of original and that of the secondary voice will be 0%. 127 is the opposite.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf4f5|0xF7]]&lt;br /&gt;
|Overlay Volume Balance Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, balance: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf8f9|0xF8]]&lt;br /&gt;
|Turn On Alternate Voice&lt;br /&gt;
|2&lt;br /&gt;
|release_rate: byte (0x00-0x1f)&lt;br /&gt;
|This instruction allows subsequent notes to be played on two alternating channels. At the same time, the ADSR release rate will be set to the specified value. A free voice channel is required to work. &lt;br /&gt;
Check &amp;quot;Opening - Bombing Mission&amp;quot;, &amp;quot;Tifa's Theme&amp;quot; and &amp;quot;Fortress of the Condor&amp;quot; for actual usage.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf8f9|0xF9]]&lt;br /&gt;
|Turn Off Alternate Voice&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa0|0xFA-0xFC]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xfd|0xFD]]&lt;br /&gt;
|Time Signature&lt;br /&gt;
|3&lt;br /&gt;
|ticks_per_beat: byte, beats_per_measure: byte&lt;br /&gt;
|Note that two parameters can be 0. This pattern is used for initialization.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xfe|0xFE]]&lt;br /&gt;
|Measure Number&lt;br /&gt;
|2&lt;br /&gt;
|measure: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa0|0xFF]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/AKAO_sequence&amp;diff=5726</id>
		<title>FF7/PSX/Sound/AKAO sequence</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/AKAO_sequence&amp;diff=5726"/>
		<updated>2020-06-05T21:08:59Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
AKAO sequence is the most complicated part of the FF7 sound system. (&amp;quot;AKAO&amp;quot; is the signature string, which implies that the sound format has developed by Square Enix sound programmer Minoru Akao.)&lt;br /&gt;
&lt;br /&gt;
AKAO sequence is similar to MIDI sequence - it's custom tracker format for playing sequence sound, well tuned specially for PSX.&lt;br /&gt;
&lt;br /&gt;
The sequence data can be found in all FF7 game modules: Field, Battle, Worldmap and in minigames.&lt;br /&gt;
&lt;br /&gt;
All files with exension *.SND are AKAO.&lt;br /&gt;
&lt;br /&gt;
* '''MINI/ASERI2.SND''' - Battle Arena theme&lt;br /&gt;
* '''MINI/SENSUI.SND''' - used in Submarine minigame&lt;br /&gt;
* '''ENEMY6/OVER2.SND''' - game over sequence&lt;br /&gt;
* '''ENEMY6/FAN2.SND''' - battle win &amp;quot;fanfare&amp;quot; sequence&lt;br /&gt;
* '''MOVIE/OVER2.SND''' - same game over sequence, don't know, why to duplicate data&lt;br /&gt;
&lt;br /&gt;
Other AKAO sequences are hard-wired in other files.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
=== Header (size: 16 bytes) ===&lt;br /&gt;
&lt;br /&gt;
 struct AkaoHeader&lt;br /&gt;
 {&lt;br /&gt;
   static const uint8_t magic[4];  // &amp;quot;AKAO&amp;quot; C-string&lt;br /&gt;
   uint16_t id;                    // song ID, used for playing sequence&lt;br /&gt;
   uint16_t length;                // data length - sizeof(header)&lt;br /&gt;
   uint16_t reverb_type;           // reverb type (range from 0 to 9)&lt;br /&gt;
   struct AkaoTimeStamp&lt;br /&gt;
   {&lt;br /&gt;
     uint8_t year_bcd;             // year (in binary coded decimal)&lt;br /&gt;
     uint8_t month_bcd;            // month (in binary coded decimal, between 0x01 - 0x12)&lt;br /&gt;
     uint8_t day_bcd;              // day (in binary coded decimal, between 0x01 - 0x31)&lt;br /&gt;
     uint8_t hours_bcd;            // hours (in binary coded decimal, between 0x00 - 0x23)&lt;br /&gt;
     uint8_t minutes_bcd;          // minutes (in binary coded decimal, between 0x00 - 0x59)&lt;br /&gt;
     uint8_t seconds_bcd;          // seconds (in binary coded decimal, between 0x00 - 0x59)&lt;br /&gt;
   } timestamp;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
=== Channel Info (size: 4 bytes + 2 bytes * &amp;lt;channels count&amp;gt;) ===&lt;br /&gt;
 struct AkaoChannelInfo&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t mask;                         // represents bitmask of used channels in this song&lt;br /&gt;
   uint32_t start_offsets[num_channels];  // offsets to channel opcode data&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 int num_channels = 0;&lt;br /&gt;
 while (int bit = 0; ((info.mask &amp;amp; 0xFFFFFF) &amp;amp; (1 &amp;lt;&amp;lt; bit)) != 0; bit++)&lt;br /&gt;
   num_channels++;&lt;br /&gt;
&lt;br /&gt;
First there is 32-bit number (offset 0x10), which represents bitmask of used channels in this song.&lt;br /&gt;
&lt;br /&gt;
After this bitmask, there is &amp;lt;channels count&amp;gt; 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.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Channel Commands [AKAO Opcodes] ===&lt;br /&gt;
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 &amp;quot;opcodes&amp;quot;. Every opcode has its own number of arguments (from no-arguments, to 3 arguments).&lt;br /&gt;
&lt;br /&gt;
=== Drum Instrument Map Table ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
The table consists of a repetition of 5-byte items.&lt;br /&gt;
&lt;br /&gt;
 struct AkaoDrumNoteAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint8_t instrument;   // corresponding to opcode 0xA1&lt;br /&gt;
   uint8_t key;          // note number when playing the drum note&lt;br /&gt;
   uint16_t volume;      // corresponding to opcode 0xA8 (lower 8bit is a fractional part of the volume)&lt;br /&gt;
   uint8_t pan;          // corresponding to opcode 0xAA&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Example (Home-Created AKAO Sequence): ==&lt;br /&gt;
=== Header ===&lt;br /&gt;
'''41 4b 41 4f''' - AKAO string&lt;br /&gt;
&lt;br /&gt;
'''34 12''' - song ID: 0x1234&lt;br /&gt;
&lt;br /&gt;
'''16 00''' - data length 0x16 in hex or 22 in decimal&lt;br /&gt;
&lt;br /&gt;
'''04 00''' - reverb type: 4 (large studio)&lt;br /&gt;
&lt;br /&gt;
'''96 12 18 22 46 28''' - created at 1996-12-18 22:46:28&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Channel Info ===&lt;br /&gt;
'''01 00 00 00''' - this indicates, that used only one channel&lt;br /&gt;
&lt;br /&gt;
'''00 00''' - offset to first channel opcodes: in our example 0x00 means that next to this offset is opcodes for first channel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Channel Commands ===&lt;br /&gt;
'''e8 a8 66''' - sets tempo, parameter 0x66a8&lt;br /&gt;
&lt;br /&gt;
'''ea 00 50''' - sets reverb depth&lt;br /&gt;
&lt;br /&gt;
'''a8 55''' - load sample 0x55 from INSTR.ALL to channel&lt;br /&gt;
&lt;br /&gt;
'''aa 40''' - sets channel volume&lt;br /&gt;
&lt;br /&gt;
'''c2''' - turns on reverb effect&lt;br /&gt;
&lt;br /&gt;
'''a1 0c''' - sets volume pan&lt;br /&gt;
&lt;br /&gt;
'''c8''' - sets loop point&lt;br /&gt;
&lt;br /&gt;
'''66''' - 0x66 % 11 = 3 (3 means to take 3rd number from play length table), 0x66 / 11 = 9 (9 means to take pitch[9] from loaded instrument record index)&lt;br /&gt;
&lt;br /&gt;
'''ca''' - returns to saved loop point with opcode c8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This example plays Chocobo &amp;quot;Whoo-Hoo&amp;quot; (instrument number 0x55) repeatedly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sound Opcode List ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Opcode&lt;br /&gt;
! Summary&lt;br /&gt;
! Length&lt;br /&gt;
! Operands&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0x0099|0x00-0x99]]&lt;br /&gt;
|Note, Tie, Rest&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|The opcode indicates the note key and length. The note will be keyed off 2 ticks before the next note.&lt;br /&gt;
|-&lt;br /&gt;
|0x9A-0x9F&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa0|0xA0]]&lt;br /&gt;
|Finish Channel&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa1|0xA1]]&lt;br /&gt;
|Load Instrument&lt;br /&gt;
|2&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0x0099|0xA2]]&lt;br /&gt;
|Overwrite Next Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length: byte&lt;br /&gt;
|Ignores the regular length (delta-time) of the next note and overwrites it with the specified length.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa8aa|0xA3]]&lt;br /&gt;
|Channel Master Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa4|0xA4]]&lt;br /&gt;
|Pitch Bend Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, semitones: signed byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa5|0xA5]]&lt;br /&gt;
|Set Octave&lt;br /&gt;
|2&lt;br /&gt;
|octave: byte (0-15)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa5|0xA6]]&lt;br /&gt;
|Increase Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa5|0xA7]]&lt;br /&gt;
|Decrease Octave&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa8aa|0xA8]]&lt;br /&gt;
|Channel Volume&lt;br /&gt;
|2&lt;br /&gt;
|volume: byte (0-127)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa9|0xA9]]&lt;br /&gt;
|Channel Volume Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, volume: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa8aa|0xAA]]&lt;br /&gt;
|Channel Pan&lt;br /&gt;
|2&lt;br /&gt;
|pan: byte (0-127)&lt;br /&gt;
|64 is the center.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xab|0xAB]]&lt;br /&gt;
|Channel Pan Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, pan: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xac|0xAC]]&lt;br /&gt;
|Noise Clock Frequency&lt;br /&gt;
|2&lt;br /&gt;
|clock: byte (0x00-0x3f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xAD]]&lt;br /&gt;
|ADSR: Attack Rate&lt;br /&gt;
|2&lt;br /&gt;
|attack_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xAE]]&lt;br /&gt;
|ADSR: Decay Rate&lt;br /&gt;
|2&lt;br /&gt;
|decay_rate: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xAF]]&lt;br /&gt;
|ADSR: Sustain Level&lt;br /&gt;
|2&lt;br /&gt;
|sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xB0]]&lt;br /&gt;
|ADSR: Decay Rate &amp;amp; Sustain Level&lt;br /&gt;
|3&lt;br /&gt;
|decay_rate: byte (0x00-0x0f), sustain_level: byte (0x00-0x0f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xB1]]&lt;br /&gt;
|ADSR: Sustain Rate&lt;br /&gt;
|2&lt;br /&gt;
|sustain_rate: byte (0x00-0x7f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xB2]]&lt;br /&gt;
|ADSR: Release Rate&lt;br /&gt;
|2&lt;br /&gt;
|release_rate: byte (0x00-0x1f)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xB3]]&lt;br /&gt;
|ADSR: Reset ADSR&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb4b5|0xB4]]&lt;br /&gt;
|Channel Pitch LFO (Vibrato)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb4b5|0xB5]]&lt;br /&gt;
|Channel Pitch LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|The most significant bit of the &amp;lt;code&amp;gt;depth&amp;lt;/code&amp;gt; determines the amplitude range.&lt;br /&gt;
&lt;br /&gt;
When it is 0, the range is up to about ± 50 cents (amplitude is 15/256 compared with range type 1).&lt;br /&gt;
&lt;br /&gt;
When it is 1, the range is up to about ± 700 cents.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb4b5|0xB6]]&lt;br /&gt;
|Turn Off Channel Pitch LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xB7]]&lt;br /&gt;
|ADSR: Attack Mode&lt;br /&gt;
|2&lt;br /&gt;
|attack_mode: byte (1 or 5)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb8b9|0xB8]]&lt;br /&gt;
|Channel Volume LFO (Tremolo)&lt;br /&gt;
|4&lt;br /&gt;
|delay: byte, rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb8b9|0xB9]]&lt;br /&gt;
|Channel Volume LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xb8b9|0xBA]]&lt;br /&gt;
|Turn Off Channel Volume LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/ADSR|0xBB]]&lt;br /&gt;
|ADSR: Sustain Mode&lt;br /&gt;
|2&lt;br /&gt;
|sustain_mode: byte (1, 3, 5 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xbcbd|0xBC]]&lt;br /&gt;
|Channel Pan LFO&lt;br /&gt;
|3&lt;br /&gt;
|rate: byte, type: byte (0-15)&lt;br /&gt;
|When &amp;lt;code&amp;gt;rate&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xbcbd|0xBD]]&lt;br /&gt;
|Channel Pan LFO Depth&lt;br /&gt;
|2&lt;br /&gt;
|depth: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xbcbd|0xBE]]&lt;br /&gt;
|Turn Off Channel Pan LFO&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xbf|0xBF]]&lt;br /&gt;
|ADSR: Release Mode&lt;br /&gt;
|2&lt;br /&gt;
|release_mode: byte (3 or 7)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc0c1|0xC0]]&lt;br /&gt;
|Channel Transpose (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc0c1|0xC1]]&lt;br /&gt;
|Channel Transpose (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|semitones: signed byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc2c3|0xC2]]&lt;br /&gt;
|Turn On Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc2c3|0xC3]]&lt;br /&gt;
|Turn Off Reverb&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc4c5|0xC4]]&lt;br /&gt;
|Turn On Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc4c5|0xC5]]&lt;br /&gt;
|Turn Off Noise&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc6c7|0xC6]]&lt;br /&gt;
|Turn On Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc6c7|0xC7]]&lt;br /&gt;
|Turn Off Frequency Modulation&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc8c9|0xC8]]&lt;br /&gt;
|Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Remember the current offset as a loop point and increase the nesting level of the loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc8c9|0xC9]]&lt;br /&gt;
|Return to Loop Point Up to N Times&lt;br /&gt;
|2&lt;br /&gt;
|times: byte&lt;br /&gt;
|On the Nth repeat, this instruction will end the current loop by decrementing the nesting level of the loop. Otherwise, it will increment the loop counter and return to the loop point.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xc8c9|0xCA]]&lt;br /&gt;
|Return to Loop Point&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will increment the loop counter.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xcb|0xCB]]&lt;br /&gt;
|Reset Sound Effects&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Reset sound effects such as noise, frequency modulation, reverb, overlay voice and alternate voice.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xcccd|0xCC]]&lt;br /&gt;
|Turn On Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key on and key off performance of the subsequent notes and update the pitch only.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xcccd|0xCD]]&lt;br /&gt;
|Turn Off Legato&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xcecf|0xCE]]&lt;br /&gt;
|Turn On Noise and Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xcecf|0xCF]]&lt;br /&gt;
|Toggle Noise On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd0d1|0xD0]]&lt;br /&gt;
|Turn On Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|This instruction will stop the regular key off performance of the subsequent notes.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd0d1|0xD1]]&lt;br /&gt;
|Turn Off Full-Length Note Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd2d3|0xD2]]&lt;br /&gt;
|Turn On Frequency Modulation and Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd2d3|0xD3]]&lt;br /&gt;
|Toggle Frequency Modulation On/Off after a Period of Time&lt;br /&gt;
|2&lt;br /&gt;
|delay: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; is 0, it will be translated to 257 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd4d5|0xD4]]&lt;br /&gt;
|Turn On Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Duplicate and use the playback frequency of the previous voice channel.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd4d5|0xD5]]&lt;br /&gt;
|Turn Off Playback Rate Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd6d7|0xD6]]&lt;br /&gt;
|Turn On Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Multiply the playback frequency of the previous voice channel to the output volume. Lower pitch will make the volume smaller.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd6d7|0xD7]]&lt;br /&gt;
|Turn Off Pitch-Volume Side Chain&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd8d9|0xD8]]&lt;br /&gt;
|Channel Fine Tuning (Absolute)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The pitch can be changed in the range of one octave above and below.&lt;br /&gt;
The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is the multiplicand for the playback frequency, not a log-based parameter like cents. For example, when the &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; is 127, the pitch will be multiplied by 127/128 (about +1 octave). Negative value ​​will lower the pitch.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xd8d9|0xD9]]&lt;br /&gt;
|Channel Fine Tuning (Relative)&lt;br /&gt;
|2&lt;br /&gt;
|amount: signed byte&lt;br /&gt;
|The &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; will be added to the current tuning amount.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xdadb|0xDA]]&lt;br /&gt;
|Turn On Portamento&lt;br /&gt;
|2&lt;br /&gt;
|speed: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;speed&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xdadb|0xDB]]&lt;br /&gt;
|Turn Off Portamento&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0x0099|0xDC]]&lt;br /&gt;
|Fix Note Length&lt;br /&gt;
|2&lt;br /&gt;
|length_to_add: signed byte&lt;br /&gt;
|Ignore the regular length (delta-time) of subsequent notes and set to the fixed length. The &amp;lt;code&amp;gt;length_to_add&amp;lt;/code&amp;gt; parameter will be added to the current length value. (the initial value is 0)&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xdd|0xDD]]&lt;br /&gt;
|Channel Pitch LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xde|0xDE]]&lt;br /&gt;
|Channel Volume LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xdf|0xDF]]&lt;br /&gt;
|Channel Pan LFO Depth Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, depth: byte&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa0|0xE0-0xE7]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xe8e9|0xE8]]&lt;br /&gt;
|Tempo&lt;br /&gt;
|3&lt;br /&gt;
|tempo: uint16&lt;br /&gt;
|bpm = tempo / 214.998204 (approximate)&lt;br /&gt;
More strictly, &amp;lt;code&amp;gt;bpm = 60.0 / (48 * (65536.0 / tempo) * (0x44E8 / (33868800.0 / 8)))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that this coefficient is different from other games with PlayStation AKAO.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xe8e9|0xE9]]&lt;br /&gt;
|Tempo Slide&lt;br /&gt;
|4&lt;br /&gt;
|length: byte, tempo: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xeaeb|0xEA]]&lt;br /&gt;
|Reverb Depth&lt;br /&gt;
|3&lt;br /&gt;
|depth: uint16&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xeaeb|0xEB]]&lt;br /&gt;
|Reverb Depth Slide&lt;br /&gt;
|4&lt;br /&gt;
|length: byte, depth: uint16&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xeced|0xEC]]&lt;br /&gt;
|Turn On Drum Mode&lt;br /&gt;
|3&lt;br /&gt;
|drum_map_offset: signed int16&lt;br /&gt;
|The &amp;lt;code&amp;gt;drum_map_offset&amp;lt;/code&amp;gt; is a relative offset pointing to the drum instrument map table, which determines the instrument for each keys.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xeced|0xED]]&lt;br /&gt;
|Turn Off Drum Mode&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xee|0xEE]]&lt;br /&gt;
|Unconditional Jump&lt;br /&gt;
|3&lt;br /&gt;
|destination_offset: signed int16&lt;br /&gt;
|This instruction can be used to make an infinite loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xef|0xEF]]&lt;br /&gt;
|CPU-Conditional Jump&lt;br /&gt;
|4&lt;br /&gt;
|condition: byte, destination_offset: signed int16&lt;br /&gt;
|Jump if the condition variable matches &amp;lt;code&amp;gt;condition&amp;lt;/code&amp;gt;. The value of the condition variable can be set from the game program.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf0f1|0xF0]]&lt;br /&gt;
|Jump on the Nth Repeat&lt;br /&gt;
|4&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf0f1|0xF1]]&lt;br /&gt;
|Break the Loop on the Nth Repeat&lt;br /&gt;
|4&lt;br /&gt;
|times: byte, destination_offset: signed int16&lt;br /&gt;
|Unlike 0xF0, this instruction will end the current loop by decrementing the nesting level of the loop.&lt;br /&gt;
When &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; is 0, it will be translated to 256 times.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa1|0xF2]]&lt;br /&gt;
|Load Instrument (No Attack Sample)&lt;br /&gt;
|2&lt;br /&gt;
|instrument: byte&lt;br /&gt;
|Unlike 0xA1, the sample before the loop point is replaced by a short, silence sample.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf3|0xF3]]&lt;br /&gt;
|Unknown&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|There is no actual use in music.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf4f5|0xF4]]&lt;br /&gt;
|Turn On Overlay Voice&lt;br /&gt;
|3&lt;br /&gt;
|instrument: byte, instrument2: byte&lt;br /&gt;
|Play the same melody by different instruments on two voice channels. A free voice channel is required to work. Note that the two channels share the playback rate, and the pitch is not calculated for each instruments.&lt;br /&gt;
Used in the song &amp;quot;Anxious Heart&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf4f5|0xF5]]&lt;br /&gt;
|Turn Off Overlay Voice&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf4f5|0xF6]]&lt;br /&gt;
|Overlay Volume Balance&lt;br /&gt;
|2&lt;br /&gt;
|balance: byte (0-127)&lt;br /&gt;
|When the balance is 0, the volume of the primary voice will be 100% (127/128) of original and that of the secondary voice will be 0%. 127 is the opposite.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf4f5|0xF7]]&lt;br /&gt;
|Overlay Volume Balance Slide&lt;br /&gt;
|3&lt;br /&gt;
|length: byte, balance: byte (0-127)&lt;br /&gt;
|When &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; is 0, it will be translated to 256 ticks.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf8f9|0xF8]]&lt;br /&gt;
|Turn On Alternate Voice&lt;br /&gt;
|2&lt;br /&gt;
|release_rate: byte (0x00-0x1f)&lt;br /&gt;
|This instruction allows subsequent notes to be played on two alternating channels. At the same time, the ADSR release rate will be set to the specified value. A free voice channel is required to work. &lt;br /&gt;
Check &amp;quot;Opening - Bombing Mission&amp;quot;, &amp;quot;Tifa's Theme&amp;quot; and &amp;quot;Fortress of the Condor&amp;quot; for actual usage.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xf8f9|0xF9]]&lt;br /&gt;
|Turn Off Alternate Voice&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa0|0xFA-0xFC]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xfd|0xFD]]&lt;br /&gt;
|Time Signature&lt;br /&gt;
|3&lt;br /&gt;
|ticks_per_beat: byte, beats_per_measure: byte&lt;br /&gt;
|Note that two parameters can be 0. This pattern is used for initialization.&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xfe|0xFE]]&lt;br /&gt;
|Measure Number&lt;br /&gt;
|2&lt;br /&gt;
|measure: byte&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[FF7/PSX/Sound/Opcodes/0xa0|0xFF]]&lt;br /&gt;
|Unimplemented&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|Code-referenced to 0xA0. Should not be used.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Code_Map&amp;diff=5725</id>
		<title>FF7/PSX/Sound/Code Map</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF7/PSX/Sound/Code_Map&amp;diff=5725"/>
		<updated>2020-06-05T20:46:32Z</updated>

		<summary type="html">&lt;p&gt;Loveemu: Identify more AkaoPlayer members&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Code Map =&lt;br /&gt;
&lt;br /&gt;
Introduces functions, variables and data related to sound, contained in SCUS_941.63 (game program of US version). Note that all symbol names below are for convenience only.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x80029818&lt;br /&gt;
|void AkaoLoadInstrSet(const void *sampleSet, const void *instrSet)&lt;br /&gt;
|Load additional instrument set&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR2.ALL&lt;br /&gt;
&lt;br /&gt;
''instrSet'': corresponding to SOUND/INSTR2.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x8002988C&lt;br /&gt;
|void AkaoInit(const void *sampleSet, const void *instrSet)&lt;br /&gt;
|Initialize sound driver and load initial instruments&lt;br /&gt;
&lt;br /&gt;
''sampleSet'': corresponding to SOUND/INSTR.ALL&lt;br /&gt;
&lt;br /&gt;
''instrSet'': corresponding to SOUND/INSTR.DAT&lt;br /&gt;
|-&lt;br /&gt;
|0x8002DA7C&lt;br /&gt;
|int AkaoLoadSeq(void)&lt;br /&gt;
|Load and start playing new [[FF7/PSX/Sound/AKAO sequence|AKAO sequence]]&lt;br /&gt;
&lt;br /&gt;
Parameters are given from a global structure&lt;br /&gt;
&lt;br /&gt;
Returns: 0 for success, 1 for already loaded, and -1 for invalid signature&lt;br /&gt;
|-&lt;br /&gt;
|0x80030234&lt;br /&gt;
|int _AkaoCallback(void)&lt;br /&gt;
|Callback event for sound, registered by OpenEvent BIOS function&lt;br /&gt;
|-&lt;br /&gt;
|0x80030E7C&lt;br /&gt;
|void _AkaoDispatchVoice(struct MusicPlayerTrack *track, void *a1, int a2)&lt;br /&gt;
|Dispatch voice opcodes until the next note or end of track&lt;br /&gt;
|-&lt;br /&gt;
|0x80049948&lt;br /&gt;
|const unsigned char VOICE_OPCODE_LENGTHS[0x60]&lt;br /&gt;
|Length table for voice opcodes 0xa0-0xff&lt;br /&gt;
&lt;br /&gt;
0 for end of track and branches&lt;br /&gt;
|-&lt;br /&gt;
|0x80049AA8&lt;br /&gt;
|void (* const VOICE_OPCODES[0x60])(struct MusicPlayerTrack *, void *, int)&lt;br /&gt;
|Address table for voice opcodes 0xa0-0xff&lt;br /&gt;
|-&lt;br /&gt;
|0x80049C44&lt;br /&gt;
|const unsigned short VOLUME_TABLE_L[256]&lt;br /&gt;
|See [[FF7/PSX/Sound/Opcodes/0xa8aa|Opcode 0xAA]] for volume balance calculation&lt;br /&gt;
|-&lt;br /&gt;
|0x80049E44&lt;br /&gt;
|const unsigned short VOLUME_TABLE_R[256]&lt;br /&gt;
|See [[FF7/PSX/Sound/Opcodes/0xa8aa|Opcode 0xAA]] for volume balance calculation&lt;br /&gt;
|-&lt;br /&gt;
|0x80083580&lt;br /&gt;
|unsigned char g_AkaoSeqData[]&lt;br /&gt;
|RAM area to load AKAO sequence data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Runtime Library Functions ==&lt;br /&gt;
&lt;br /&gt;
=== LIBSPU ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x80036298&lt;br /&gt;
|void SpuInit(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80036FFC&lt;br /&gt;
|long SpuInitMalloc(long num, char *top)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800373AC&lt;br /&gt;
|long SpuMallocWithStartAddr(unsigned long addr, long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037964&lt;br /&gt;
|unsigned long SpuSetNoiseVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037B90&lt;br /&gt;
|long SpuSetNoiseClock(long n_clock)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037BE0&lt;br /&gt;
|unsigned long SpuRead(unsigned char *addr, unsigned long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037C40&lt;br /&gt;
|long SpuSetReverb(long on_off)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037D90&lt;br /&gt;
|long SpuGetReverb(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80037E1C&lt;br /&gt;
|long SpuSetReverbModeParam(SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800387FC&lt;br /&gt;
|void SpuGetReverbModeParam (SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003884C&lt;br /&gt;
|long SpuSetReverbDepth(SpuReverbAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800388C4&lt;br /&gt;
|unsigned long SpuSetReverbVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800388E8&lt;br /&gt;
|long SpuClearReverbWorkArea(long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038A84&lt;br /&gt;
|long SpuSetIRQ(long on_off)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038BC4&lt;br /&gt;
|unsigned long SpuSetIRQAddr(unsigned long addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038C04&lt;br /&gt;
|SpuIRQCallbackProc SpuSetIRQCallback(SpuIRQCallbackProc func)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038C6C&lt;br /&gt;
|void SpuSetKey(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038F04&lt;br /&gt;
|unsigned long SpuWrite(unsigned char *addr, unsigned long size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038F64&lt;br /&gt;
|unsigned long SpuSetTransferStartAddr(unsigned long addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038FB8&lt;br /&gt;
|long SpuSetTransferMode(long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80038FEC&lt;br /&gt;
|SpuTransferCallbackProc SpuSetTransferCallback(SpuTransferCallbackProc func)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039010&lt;br /&gt;
|unsigned long SpuSetPitchLFOVoice(long on_off, unsigned long voice_bit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039034&lt;br /&gt;
|void SpuSetCommonAttr(SpuCommonAttr *attr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800393C8&lt;br /&gt;
|void SpuSetVoiceVolume(int voiceNum, short volL, short volR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039450&lt;br /&gt;
|void SpuSetVoiceVolumeAttr(int voiceNum, short volL, short volR, short volModeL, short volModeR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800395C8&lt;br /&gt;
|void SpuSetVoicePitch(int voiceNum, unsigned short pitch)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039644&lt;br /&gt;
|void SpuSetVoiceStartAddr(int voiceNum, unsigned long startAddr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800396C0&lt;br /&gt;
|void SpuSetVoiceLoopStartAddr(int voiceNum, unsigned long lsa)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003973C&lt;br /&gt;
|void SpuSetVoiceDR(int voiceNum, unsigned short DR)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800397C8&lt;br /&gt;
|void SpuSetVoiceSL(int voiceNum, unsigned short SL)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80039850&lt;br /&gt;
|void SpuSetVoiceARAttr(int voiceNum, unsigned short AR, long ARmode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800398EC&lt;br /&gt;
|void SpuSetVoiceSRAttr(int voiceNum, unsigned short SR, long SRmode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x800399D0&lt;br /&gt;
|void SpuSetVoiceRRAttr(int voiceNum, unsigned short RR, long RRmode)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LIBETC ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D0C0&lt;br /&gt;
|int ResetCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D150&lt;br /&gt;
|int VSyncCallback(void (*func)(void))&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D1B4&lt;br /&gt;
|int StopCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8003D214&lt;br /&gt;
|int CheckCallback(void)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LIBAPI ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PSX Address&lt;br /&gt;
! Declaration&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|0x800429F0&lt;br /&gt;
|void DeliverEvent(unsigned long ev1, unsigned long ev2)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A00&lt;br /&gt;
|long OpenEvent(unsigned long desc, long spec, long mode, long (*func)())&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A10&lt;br /&gt;
|long CloseEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A20&lt;br /&gt;
|long WaitEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A40&lt;br /&gt;
|long EnableEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042A50&lt;br /&gt;
|long DisableEvent(long event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042BC0&lt;br /&gt;
|long SetRCnt(unsigned long spec, unsigned short target, long mode)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042C60&lt;br /&gt;
|long GetRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042C98&lt;br /&gt;
|long StartRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x80042CCC&lt;br /&gt;
|long StopRCnt(unsigned long spec)&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Structures =&lt;br /&gt;
&lt;br /&gt;
 struct AkaoSpuVoiceAttr&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t voice;          // 0x00: voice number&lt;br /&gt;
   uint32_t update_flags;   // 0x04: bitset that indicates what SPU registers need to be updated&lt;br /&gt;
   uint32_t addr;           // 0x08: waveform data start address (SPU address)&lt;br /&gt;
   uint32_t loop_addr;      // 0x0c: loop start address (SPU address)&lt;br /&gt;
   uint32_t a_mode;         // 0x10: ADSR: attack rate mode&lt;br /&gt;
   uint32_t s_mode;         // 0x14: ADSR: sustain rate mode&lt;br /&gt;
   uint32_t r_mode          // 0x18: ADSR: release rate mode&lt;br /&gt;
   uint16_t pitch;          // 0x1c: pitch&lt;br /&gt;
   uint16_t ar;             // 0x1e: ADSR: attack rate&lt;br /&gt;
   uint16_t dr;             // 0x20: ADSR: decay rate&lt;br /&gt;
   uint16_t sl;             // 0x22: ADSR: sustain level&lt;br /&gt;
   uint16_t sr;             // 0x24: ADSR: sustain rate&lt;br /&gt;
   uint16_t rr;             // 0x26: ADSR: release rate&lt;br /&gt;
   SpuVolume volume;        // 0x28: volume (left and right)&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct AkaoPlayer // the music player instance exists at 0x8009A104&lt;br /&gt;
 {&lt;br /&gt;
   uint32_t stereo_mode;                 // 0x00: stereo mode (1: stereo, 4: surround, otherwise: mono)&lt;br /&gt;
   uint32_t active_voices;               // 0x04: bitset that indicates the voices currently in use&lt;br /&gt;
   uint32_t key_on_voices;               // 0x08: bitset that indicates the voices to key on&lt;br /&gt;
   uint32_t keyed_voices;                // 0x0c: bitset that indicates the voices currently keyed on&lt;br /&gt;
   uint32_t key_off_voices;              // 0x10: bitset that indicates the voices to key off&lt;br /&gt;
   uint32_t saved_active_voices;         // 0x14: unknown voice bitset&lt;br /&gt;
   uint32_t tempo;                       // 0x18: tempo (Q16 fixed-point number)&lt;br /&gt;
   int32_t tempo_slope;                  // 0x1c: slope of tempo slider (Q16 fixed-point number)&lt;br /&gt;
   uint32_t time_counter;                // 0x20: time counter (0x10000 = 1 tick)&lt;br /&gt;
   uint32_t overlay_voices;              // 0x24: bitset that indicates the sub-voices used for overlay (opcode 0xF4)&lt;br /&gt;
   uint32_t alternate_voices;            // 0x28: bitset that indicates the sub-voices used for alternate voice (opcode 0xF8)&lt;br /&gt;
   uint32_t noise_voices;                // 0x2c: bitset that indicates the voices with noise mode enabled&lt;br /&gt;
   uint32_t reverb_voices;               // 0x30: bitset that indicates the voices with reverb enabled&lt;br /&gt;
   uint32_t pitch_lfo_voices;            // 0x34: bitset that indicates the voices with pitch LFO (frequency modulation) mode enabled&lt;br /&gt;
   uint32_t spucnt;                      // 0x38: SPUCNT shadow&lt;br /&gt;
   uint32_t reverb_type;                 // 0x3c: reverb type&lt;br /&gt;
   uint32_t reverb_depth;                // 0x40: reverb depth (Q16 fixed-point number)&lt;br /&gt;
   int32_t reverb_depth_slope;           // 0x44: slope of reverb depth slider (Q16 fixed-point number)&lt;br /&gt;
   uint16_t tempo_slide_length;          // 0x48: tempo slide length&lt;br /&gt;
   uint16_t song_id;                     // 0x4a: current song id&lt;br /&gt;
   uint16_t condition_ack;               // 0x4c: the last matched condition value (opcode 0xEF)&lt;br /&gt;
   uint16_t condition;                   // 0x4e: condition variable for dynamic branching according to game status (opcode 0xEF)&lt;br /&gt;
   uint16_t reverb_depth_slide_length;   // 0x50: length of reverb depth slide&lt;br /&gt;
   uint16_t noise_clock;                 // 0x52: noise clock frequency&lt;br /&gt;
   uint16_t field_54;                    // 0x54: unknown&lt;br /&gt;
   uint16_t beats_per_measure;           // 0x56: beats per measure&lt;br /&gt;
   uint16_t beat;                        // 0x58: current beat&lt;br /&gt;
   uint16_t ticks_per_beat;              // 0x5a: ticks per beat&lt;br /&gt;
   uint16_t tick;                        // 0x5c: current ticks per beat&lt;br /&gt;
   uint16_t measure;                     // 0x5e: current measure&lt;br /&gt;
 };&lt;/div&gt;</summary>
		<author><name>Loveemu</name></author>
		
	</entry>
</feed>