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

From Final Fantasy Inside
< FF7
Jump to navigation Jump to search
m
(Add new structures, SPU shadows and music player)
Line 279: Line 279:
 
= Structures =
 
= Structures =
  
  struct MusicPlayerTrack {
+
  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 rate mode
 +
  uint32_t s_mode;        // 0x14: ADSR: sustain rate mode
 +
  uint32_t r_mode          // 0x18: ADSR: release rate 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 // instances exist at 0x8009A104 and 0x80099FC8
 +
{
 +
  uint32_t stereo_mode;                // 0x00: stereo mode (1: stereo, 4: surround, otherwise: mono)
 +
  uint32_t field_4;                    // 0x04: unknown voice bitset
 +
  uint32_t field_8;                    // 0x08: unknown voice bitset
 +
  uint32_t field_C;                    // 0x0c: unknown voice bitset
 +
  uint32_t field_10;                    // 0x10: unknown voice bitset
 +
  uint32_t field_14;                    // 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 field_4C;                    // 0x4c: unknown
 +
  uint16_t field_4E;                    // 0x4e: unknown
 +
  uint16_t reverb_depth_slide_length;  // 0x50: length of reverb depth slide
 +
  uint16_t field_52;                    // 0x52: unknown
 +
  uint16_t field_54;                    // 0x54: unknown
 +
  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
 
  };
 
  };

Revision as of 08:30, 1 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
0x80029818 void AkaoLoadInstrSet(const void *sampleSet, const void *instrSet) Load additional instrument set

sampleSet: corresponding to SOUND/INSTR2.ALL

instrSet: corresponding to SOUND/INSTR2.DAT

0x8002988C void AkaoInit(const void *sampleSet, const void *instrSet) Initialize sound driver and load initial instruments

sampleSet: corresponding to SOUND/INSTR.ALL

instrSet: corresponding to SOUND/INSTR.DAT

0x8002DA7C int AkaoLoadSeq(void) Load and start playing new AKAO sequence

Parameters are given from a global structure

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

0x80030234 int _AkaoCallback(void) Callback event for sound, registered by OpenEvent BIOS function
0x80030E7C void _AkaoDispatchVoice(struct MusicPlayerTrack *track, void *a1, int a2) Dispatch voice opcodes until the next note or end of track
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 MusicPlayerTrack *, void *, int) Address table for voice opcodes 0xa0-0xff
0x80049C44 const unsigned short VOLUME_TABLE_L[256] See Opcode 0xAA for volume balance calculation
0x80049E44 const unsigned short VOLUME_TABLE_R[256] See Opcode 0xAA for volume balance calculation
0x80083580 unsigned char g_AkaoSeqData[] RAM area to load AKAO sequence data

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 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 rate mode
  uint32_t s_mode;         // 0x14: ADSR: sustain rate mode
  uint32_t r_mode          // 0x18: ADSR: release rate 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 // instances exist at 0x8009A104 and 0x80099FC8
{
  uint32_t stereo_mode;                 // 0x00: stereo mode (1: stereo, 4: surround, otherwise: mono)
  uint32_t field_4;                     // 0x04: unknown voice bitset
  uint32_t field_8;                     // 0x08: unknown voice bitset
  uint32_t field_C;                     // 0x0c: unknown voice bitset
  uint32_t field_10;                    // 0x10: unknown voice bitset
  uint32_t field_14;                    // 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 field_4C;                    // 0x4c: unknown
  uint16_t field_4E;                    // 0x4e: unknown
  uint16_t reverb_depth_slide_length;   // 0x50: length of reverb depth slide
  uint16_t field_52;                    // 0x52: unknown
  uint16_t field_54;                    // 0x54: unknown
  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
};