Difference between revisions of "FF7/PSX/Sound/Code Map"

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

Latest revision as of 09:57, 28 June 2020

Code Map

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.

PSX Address Declaration Description
0x800293D0 void _AkaoSpuTransferCallback(void)
0x800293F4 void _AkaoSpuSetTransferCallback(void)
0x80029424 unsigned int _AkaoTransferSamples(const unsigned char *addr, unsigned int size)
0x800294A4 void _AkaoWaitForSpuTransfer(void)
0x800294BC void _AkaoReset(void)
0x800297A4 void AkaoLoadInstrumentSet(const sturct AkaoSampleSet *sampleSet, const struct AkaoInstrumentAttr *instrumentSet) Load standard instrument set

sampleSet: corresponding to SOUND/INSTR.ALL

instrumentSet: corresponding to SOUND/INSTR.DAT

This function is called transparently from 0x8002988C.

0x80029818 void AkaoLoadInstrumentSet2(const sturct AkaoSampleSet *sampleSet, const struct AkaoInstrumentAttr *instrumentSet) Load additional instrument set

sampleSet: corresponding to SOUND/INSTR2.ALL

instrumentSet: corresponding to SOUND/INSTR2.DAT

0x8002988C void AkaoInitialize(const sturct AkaoSampleSet *sampleSet, const struct AkaoInstrumentAttr *instrumentSet) Initialize sound driver and load initial instruments

sampleSet: corresponding to SOUND/INSTR.ALL

instrumentSet: corresponding to SOUND/INSTR.DAT

0x800299C8 void AkaoDeinitialize(void) Deinitialize sound driver
0x80029AF0 void AkaoSetReverbMode(int mode)
0x80029B78 void _AkaoTransferSeqBody(const unsigned char *data, int size)
0x80029C48 void _AkaoLoadTracks(void)
0x8002DA30 void AkaoNewMessage(struct AkaoMessage **ppMessage)
0x8002DA7C int AkaoPostMessage(void) Post a new command message to the queue (with some wrapped processing)

The message data comes from a global variable at 0x8009A000.

Return value depends on the content of the message data.


Opcode 0x10

Load and start playing new AKAO sequence

Returns: 0 for success, 1 for already loaded, and -1 for invalid signature


Opcode 0x92

Set value to the condition variable used by Opcode 0xEF.

0x8002E1A8 void _AkaoDispatchMessages(void)
0x8002E23C void _AkaoWriteSpuRegisters(int voiceNum, struct AkaoSpuVoiceAttr *attr)
0x8002E478 void _AkaoDspOnTick(struct AkaoPlayerTrack *track, struct AkaoPlayer *player, int voiceMask)
0x8002ED34 void _AkaoCalculateVolumeAndPitch(struct AkaoPlayerTrack *track, int voiceMask, int voiceNum)
0x8002F24C void _AkaoCalculateVolumeAndPitch2(struct AkaoPlayerTrack *track, int voiceMask)
0x8002F738 void _AkaoDspOverlayVoice(struct AkaoPlayerTrack *track, int unknownVoiceMask, int voiceNum)
0x8002F848 void _AkaoDspMain(void)
0x8002FF4C void _AkaoSpuNoiseVoice(void)
0x80030038 void _AkaoSpuReverbVoice(void)
0x80030148 void _AkaoSpuPitchLFOVoice(void)
0x80030234 int _AkaoTimerCallback(void) Sound callback event that is periodically triggered by root counter 2
0x800308D4 void _AkaoMain(void)
0x80030E7C void _AkaoDispatchVoice(struct AkaoPlayerTrack *track, struct AkaoPlayer *player, int voiceMask) Dispatch voice opcodes until the next note or end of track
0x80031820 void AkaoSetInstrument(struct AkaoPlayerTrack *track, unsigned short progNumber)
0x800318BC int _AkaoReadNextNote(struct AkaoPlayerTrack *track)
0x80031A70 int _AkaoFindNextEndPoint(struct AkaoPlayerTrack *track)
0x80049548 void (* const MESSAGE_HANDLERS[256])(struct AkaoMessage *)
0x80049948 const unsigned char VOICE_OPCODE_LENGTHS[0x60] Length table for voice opcodes 0xa0-0xff

0 for end of track and branches

0x80049AA8 void (* const VOICE_OPCODES[0x60])(struct AkaoPlayerTrack *, struct AkaoPlayer *, int) Address table for voice opcodes 0xa0-0xff
0x80049C28 const unsigned short DELTA_TIME_TABLE[11];
0x80049C44 const unsigned short VOLUME_TABLE_L[128] See Opcode 0xAA for volume balance calculation
0x80049E44 const unsigned short VOLUME_TABLE_R[128] See Opcode 0xAA for volume balance calculation
0x8004A5CC const short *LFO_FORMS[16]
0x8004A60C const unsigned char EMPTY_ADPCM[32]
0x80063010 int g_AkaoNumQueuedMessages
0x80081DC8 AkaoMessage g_AkaoMessageQueue[]
0x80083580 unsigned char g_AkaoSeqData[] RAM area to load AKAO sequence data
0x8009A000 AkaoMessage g_AkaoMessage Message data to be posted. Processed by the function 0x8002DA7C

Runtime Library Functions

LIBSPU

PSX Address Declaration Description
0x80036298 void SpuInit(void)
0x80036FFC long SpuInitMalloc(long num, char *top)
0x800373AC long SpuMallocWithStartAddr(unsigned long addr, long size)
0x80037964 unsigned long SpuSetNoiseVoice(long on_off, unsigned long voice_bit)
0x80037B90 long SpuSetNoiseClock(long n_clock)
0x80037BE0 unsigned long SpuRead(unsigned char *addr, unsigned long size)
0x80037C40 long SpuSetReverb(long on_off)
0x80037D90 long SpuGetReverb(void)
0x80037E1C long SpuSetReverbModeParam(SpuReverbAttr *attr)
0x800387FC void SpuGetReverbModeParam (SpuReverbAttr *attr)
0x8003884C long SpuSetReverbDepth(SpuReverbAttr *attr)
0x800388C4 unsigned long SpuSetReverbVoice(long on_off, unsigned long voice_bit)
0x800388E8 long SpuClearReverbWorkArea(long mode)
0x80038A84 long SpuSetIRQ(long on_off)
0x80038BC4 unsigned long SpuSetIRQAddr(unsigned long addr)
0x80038C04 SpuIRQCallbackProc SpuSetIRQCallback(SpuIRQCallbackProc func)
0x80038C6C void SpuSetKey(long on_off, unsigned long voice_bit)
0x80038F04 unsigned long SpuWrite(unsigned char *addr, unsigned long size)
0x80038F64 unsigned long SpuSetTransferStartAddr(unsigned long addr)
0x80038FB8 long SpuSetTransferMode(long mode)
0x80038FEC SpuTransferCallbackProc SpuSetTransferCallback(SpuTransferCallbackProc func)
0x80039010 unsigned long SpuSetPitchLFOVoice(long on_off, unsigned long voice_bit)
0x80039034 void SpuSetCommonAttr(SpuCommonAttr *attr)
0x800393C8 void SpuSetVoiceVolume(int voiceNum, short volL, short volR)
0x80039450 void SpuSetVoiceVolumeAttr(int voiceNum, short volL, short volR, short volModeL, short volModeR)
0x800395C8 void SpuSetVoicePitch(int voiceNum, unsigned short pitch)
0x80039644 void SpuSetVoiceStartAddr(int voiceNum, unsigned long startAddr)
0x800396C0 void SpuSetVoiceLoopStartAddr(int voiceNum, unsigned long lsa)
0x8003973C void SpuSetVoiceDR(int voiceNum, unsigned short DR)
0x800397C8 void SpuSetVoiceSL(int voiceNum, unsigned short SL)
0x80039850 void SpuSetVoiceARAttr(int voiceNum, unsigned short AR, long ARmode)
0x800398EC void SpuSetVoiceSRAttr(int voiceNum, unsigned short SR, long SRmode)
0x800399D0 void SpuSetVoiceRRAttr(int voiceNum, unsigned short RR, long RRmode)

LIBETC

PSX Address Declaration Description
0x8003D0C0 int ResetCallback(void)
0x8003D150 int VSyncCallback(void (*func)(void))
0x8003D1B4 int StopCallback(void)
0x8003D214 int CheckCallback(void)

LIBAPI

PSX Address Declaration Description
0x800429F0 void DeliverEvent(unsigned long ev1, unsigned long ev2)
0x80042A00 long OpenEvent(unsigned long desc, long spec, long mode, long (*func)())
0x80042A10 long CloseEvent(long event)
0x80042A20 long WaitEvent(long event)
0x80042A40 long EnableEvent(long event)
0x80042A50 long DisableEvent(long event)
0x80042BC0 long SetRCnt(unsigned long spec, unsigned short target, long mode)
0x80042C60 long GetRCnt(unsigned long spec)
0x80042C98 long StartRCnt(unsigned long spec)
0x80042CCC long StopRCnt(unsigned long spec)

Structures

struct AkaoInstrumentAttr

struct AkaoSampleSet

struct AkaoSeqHeader, struct AkaoDrumKeyAttr

struct AkaoMessage // 36 bytes long
{
  uint16_t opcode;
  uint16_t reserved;
  uint32_t data[8];
};

struct AkaoSpuVoiceAttr
{
  uint32_t voice;          // 0x00: voice number
  uint32_t update_flags;   // 0x04: bitset that indicates what SPU registers need to be updated
  uint32_t addr;           // 0x08: waveform data start address (SPU address)
  uint32_t loop_addr;      // 0x0c: loop start address (SPU address)
  uint32_t a_mode;         // 0x10: ADSR: attack mode
  uint32_t s_mode;         // 0x14: ADSR: sustain mode
  uint32_t r_mode          // 0x18: ADSR: release mode
  uint16_t pitch;          // 0x1c: pitch
  uint16_t ar;             // 0x1e: ADSR: attack rate
  uint16_t dr;             // 0x20: ADSR: decay rate
  uint16_t sl;             // 0x22: ADSR: sustain level
  uint16_t sr;             // 0x24: ADSR: sustain rate
  uint16_t rr;             // 0x26: ADSR: release rate
  SpuVolume volume;        // 0x28: volume (left and right)
};

struct AkaoPlayer // the music player instance exists at 0x8009A104
{
  uint32_t stereo_mode;                 // 0x00: stereo mode (1: stereo, 4: surround, otherwise: mono)
  uint32_t active_voices;               // 0x04: bitset that indicates the voices currently in use
  uint32_t key_on_voices;               // 0x08: bitset that indicates the voices to key on
  uint32_t keyed_voices;                // 0x0c: bitset that indicates the voices currently keyed on
  uint32_t key_off_voices;              // 0x10: bitset that indicates the voices to key off
  uint32_t saved_active_voices;         // 0x14: unknown voice bitset
  uint32_t tempo;                       // 0x18: tempo (Q16 fixed-point number)
  int32_t tempo_slope;                  // 0x1c: slope of tempo slider (Q16 fixed-point number)
  uint32_t time_counter;                // 0x20: time counter (0x10000 = 1 tick)
  uint32_t overlay_voices;              // 0x24: bitset that indicates the sub-voices used for overlay (opcode 0xF4)
  uint32_t alternate_voices;            // 0x28: bitset that indicates the sub-voices used for alternate voice (opcode 0xF8)
  uint32_t noise_voices;                // 0x2c: bitset that indicates the voices with noise mode enabled
  uint32_t reverb_voices;               // 0x30: bitset that indicates the voices with reverb enabled
  uint32_t pitch_lfo_voices;            // 0x34: bitset that indicates the voices with pitch LFO (frequency modulation) mode enabled
  uint32_t spucnt;                      // 0x38: SPUCNT shadow
  uint32_t reverb_type;                 // 0x3c: reverb type
  uint32_t reverb_depth;                // 0x40: reverb depth (Q16 fixed-point number)
  int32_t reverb_depth_slope;           // 0x44: slope of reverb depth slider (Q16 fixed-point number)
  uint16_t tempo_slide_length;          // 0x48: tempo slide length
  uint16_t song_id;                     // 0x4a: current song id
  uint16_t condition_ack;               // 0x4c: the last matched condition value (opcode 0xEF)
  uint16_t condition;                   // 0x4e: condition variable for dynamic branching according to game status (opcode 0xEF)
  uint16_t reverb_depth_slide_length;   // 0x50: length of reverb depth slide
  uint16_t noise_clock;                 // 0x52: noise clock frequency
  uint16_t field_54;                    // 0x54: unknown (can be altered by opcode 0xF3)
  uint16_t beats_per_measure;           // 0x56: beats per measure
  uint16_t beat;                        // 0x58: current beat
  uint16_t ticks_per_beat;              // 0x5a: ticks per beat
  uint16_t tick;                        // 0x5c: current ticks per beat
  uint16_t measure;                     // 0x5e: current measure
};

struct AkaoPlayerTrack // the music player track instances exist at 0x80096608 + (N * 0x108)
{
  uint8_t *addr;                                    // 0x00
  uint8_t *loop_addrs[4];                           // 0x04
  AkaoDrumKeyAttr *drum_addr;                       // 0x14
  int16_t *vibrato_lfo_addr;                        // 0x18
  int16_t *tremolo_lfo_addr;                        // 0x1c
  int16_t *pan_lfo_addr;                            // 0x20
  uint32_t overlay_voice_num;                       // 0x24
  uint32_t alternate_voice_num;                     // 0x28
  uint32_t master_volume;                           // 0x2c
  uint32_t pitch_of_note;                           // 0x30
  int32_t pitch_bend_slide_amplitude;               // 0x34
  uint16_t voice_effect_flags;                      // 0x38
  uint16_t field_3A;                                // 0x3a
  uint16_t field_3C;                                // 0x3c
  uint16_t field_3E;                                // 0x3e
  uint32_t field_40;                                // 0x40
  uint32_t volume;                                  // 0x44
  int32_t volume_slope;                             // 0x48
  int32_t pitch_bend_slope;                         // 0x4c
  uint16_t field_50;                                // 0x50
  uint16_t field_52;                                // 0x52
  uint16_t field_54;                                // 0x54
  uint8_t delta_time_counter;                       // 0x56
  uint8_t gate_time_counter;                        // 0x57
  uint16_t instrument;                              // 0x58
  uint16_t field_5A;                                // 0x5a
  uint16_t volume_slide_length_counter;             // 0x5c
  uint16_t overlay_balance_slide_length_counter;    // 0x5e
  uint16_t pan;                                     // 0x60
  uint16_t pan_slide_length;                        // 0x62
  int16_t pitch_slide_length_counter;               // 0x64
  uint16_t octave;                                  // 0x66
  uint16_t pitch_slide_length;                      // 0x68
  uint16_t previous_note_number;                    // 0x6a
  uint16_t portamento_speed;                        // 0x6c
  uint16_t legato_flags;                            // 0x6e
  uint16_t field_70;                                // 0x70
  uint16_t vibrato_delay;                           // 0x72
  uint16_t vibrato_delay_counter;                   // 0x74
  uint16_t vibrato_rate;                            // 0x76
  uint16_t vibrato_rate_counter;                    // 0x78
  uint16_t vibrato_form;                            // 0x7a
  uint16_t vibrato_max_amplitude;                   // 0x7c
  uint16_t vibrato_depth;                           // 0x7e
  uint16_t vibrato_depth_slide_length_counter;      // 0x80
  int16_t vibrato_depth_slope;                      // 0x82
  uint16_t field_84;                                // 0x84
  uint16_t tremolo_delay;                           // 0x86
  uint16_t tremolo_delay_counter;                   // 0x88
  uint16_t tremolo_rate;                            // 0x8a
  uint16_t tremolo_rate_counter;                    // 0x8c
  uint16_t tremolo_form;                            // 0x8e
  uint16_t tremolo_depth;                           // 0x90
  uint16_t tremolo_depth_slide_length_counter;      // 0x92
  int16_t tremolo_depth_slope;                      // 0x94
  uint16_t field_96;                                // 0x96
  uint16_t pan_lfo_rate;                            // 0x98
  uint16_t pan_lfo_rate_counter;                    // 0x9a
  uint16_t pan_lfo_form;                            // 0x9c
  uint16_t pan_lfo_depth;                           // 0x9e
  uint16_t pan_lfo_depth_slide_length_counter;      // 0xa0
  int16_t pan_lfo_slope;                            // 0xa2
  uint16_t noise_on_off_delay_counter;              // 0xa4
  uint16_t pitchmod_on_off_delay_counter;           // 0xa6
  uint8_t field_A8[16];                             // 0xa8
  uint16_t loop_layer;                              // 0xb8
  uint16_t loop_counts[4];                          // 0xba
  uint16_t previous_delta_time;                     // 0xc2
  uint16_t forced_delta_time;                       // 0xc4
  uint16_t overlay_balance;                         // 0xc6
  int16_t overlay_balance_slope;                    // 0xc8
  int16_t pan_slope;                                // 0xca
  int16_t transpose;                                // 0xcc
  int16_t tuning;                                   // 0xce
  uint16_t note;                                    // 0xd0
  int16_t pitch_slide_amount;                       // 0xd2
  int16_t previous_transpose;                       // 0xd4
  int16_t vibrato_lfo_amplitude;                    // 0xd6
  int16_t tremolo_lfo_amplitude;                    // 0xd8
  int16_t pan_lfo_amplitude;                        // 0xda
  AkaoSpuVoiceAttr spu_attr;                        // 0xdc
};