mirror of https://github.com/zeldaret/tmc.git
music players
This commit is contained in:
parent
5af4805e59
commit
6e7674e865
|
@ -1611,6 +1611,3 @@ gUnk_08A11C0C:: @ 08A11C0C
|
|||
|
||||
gUnk_08A11C1C:: @ 08A11C1C
|
||||
.incbin "baserom.gba", 0xA11C1C, 0x0000020
|
||||
|
||||
gMPlayTable:: @ 08A11C3C
|
||||
.incbin "baserom.gba", 0xA11C3C, 0x0000180
|
||||
|
|
|
@ -46,18 +46,131 @@ typedef struct SongHeader {
|
|||
|
||||
typedef struct Song {
|
||||
const SongHeader* header;
|
||||
u16 ms;
|
||||
u16 musicPlayerIndex;
|
||||
u16 me;
|
||||
} Song;
|
||||
|
||||
typedef struct SoundChannel {
|
||||
u8 statusFlags;
|
||||
u8 type;
|
||||
u8 rightVolume;
|
||||
u8 leftVolume;
|
||||
u8 attack;
|
||||
u8 decay;
|
||||
u8 sustain;
|
||||
u8 release;
|
||||
u8 key;
|
||||
u8 envelopeVolume;
|
||||
u8 envelopeVolumeRight;
|
||||
u8 envelopeVolumeLeft;
|
||||
u8 echoVolume;
|
||||
u8 echoLength;
|
||||
u8 unk0;
|
||||
u8 unk1;
|
||||
u8 gateTime;
|
||||
u8 midiKey;
|
||||
u8 velocity;
|
||||
u8 priority;
|
||||
u8 rhythmPan;
|
||||
u8 unk2[3];
|
||||
u32 count;
|
||||
u32 fw;
|
||||
u32 frequency;
|
||||
WaveData* wav;
|
||||
u32 currentPointer;
|
||||
MusicPlayerTrack* track;
|
||||
u32 prev;
|
||||
u32 next;
|
||||
u32 unk3;
|
||||
u16 xpi;
|
||||
u16 xpc;
|
||||
} SoundChannel;
|
||||
|
||||
typedef void (*MPlayMainFunc)(MusicPlayerInfo*);
|
||||
|
||||
// typedef above
|
||||
struct MusicPlayerInfo {
|
||||
const SongHeader* songHeader;
|
||||
u32 status;
|
||||
u8 trackCount;
|
||||
u8 priority;
|
||||
u8 cmd;
|
||||
u8 unk_B;
|
||||
u32 clock;
|
||||
u8 gap[8];
|
||||
u8* memAccArea;
|
||||
u16 tempoD;
|
||||
u16 tempoU;
|
||||
u16 tempoI;
|
||||
u16 tempoC;
|
||||
u16 fadeOI;
|
||||
u16 fadeOC;
|
||||
u16 fadeOV;
|
||||
MusicPlayerTrack* tracks;
|
||||
ToneData* tone;
|
||||
u32 ident;
|
||||
MPlayMainFunc func;
|
||||
u32* intp;
|
||||
};
|
||||
|
||||
#define MPT_FLG_VOLSET 0x01
|
||||
#define MPT_FLG_VOLCHG 0x03
|
||||
#define MPT_FLG_PITSET 0x04
|
||||
#define MPT_FLG_PITCHG 0x0C
|
||||
#define MPT_FLG_START 0x40
|
||||
#define MPT_FLG_EXIST 0x80
|
||||
|
||||
// typedef above
|
||||
struct MusicPlayerTrack {
|
||||
u8 flags;
|
||||
u8 wait;
|
||||
u8 patternLevel;
|
||||
u8 repN;
|
||||
u8 gateTime;
|
||||
u8 key;
|
||||
u8 velocity;
|
||||
u8 runningStatus;
|
||||
u8 keyM;
|
||||
u8 pitM;
|
||||
s8 keyShift;
|
||||
s8 keyShiftX;
|
||||
s8 tune;
|
||||
u8 pitX;
|
||||
s8 bend;
|
||||
u8 bendRange;
|
||||
u8 volMR;
|
||||
u8 volML;
|
||||
u8 vol;
|
||||
u8 volX;
|
||||
s8 pan;
|
||||
s8 panX;
|
||||
s8 modM;
|
||||
u8 mod;
|
||||
u8 modT;
|
||||
u8 lfoSpeed;
|
||||
u8 lfoSpeedC;
|
||||
u8 lfoDelay;
|
||||
u8 lfoDelayC;
|
||||
u8 priority;
|
||||
u8 echoVolume;
|
||||
u8 echoLength;
|
||||
SoundChannel* chan;
|
||||
ToneData tone;
|
||||
u8 gap[10];
|
||||
u16 unk_3A;
|
||||
u32 unk_3C;
|
||||
u8* cmdPtr;
|
||||
u8* patternStack[3];
|
||||
};
|
||||
|
||||
typedef struct MusicPlayer {
|
||||
MusicPlayerInfo* info;
|
||||
MusicPlayerTrack* track;
|
||||
u8 unk_8;
|
||||
MusicPlayerTrack* tracks;
|
||||
u8 nTracks;
|
||||
u16 unk_A;
|
||||
} MusicPlayer;
|
||||
|
||||
extern const MusicPlayer gMPlayTable[];
|
||||
extern const MusicPlayer gMusicPlayers[];
|
||||
extern const Song gSongTable[];
|
||||
|
||||
void m4aSoundInit(void);
|
||||
|
|
|
@ -155,6 +155,7 @@ SECTIONS {
|
|||
. = 0x00036A58; gUnk_02036A58 = .;
|
||||
. = 0x00036AD8; gUnk_02036AD8 = .;
|
||||
. = 0x00036BB8; gUnk_02036BB8 = .;
|
||||
. = 0x00036BC0; gMPlayTracks = .;
|
||||
. = 0x00038560; gUnk_02038560 = .;
|
||||
. = 0x00040000;
|
||||
} >ewram
|
||||
|
@ -223,7 +224,9 @@ SECTIONS {
|
|||
. = 0x00004DD8; gUnk_03004DD8 = .;
|
||||
. = 0x00004DDC; gUnk_03004DDC = .;
|
||||
. = 0x00004DE0; gCgbChans = .;
|
||||
. = 0x00004EE0; gMPlayInfos = .;
|
||||
. = 0x000055E0; gMPlayMemAccArea = .;
|
||||
. = 0x000055F0; gMPlayInfos2 = .;
|
||||
. = 0x000056F0; gUnk_030056F0 = .;
|
||||
. = 0x000056F1; gUnk_030056F1 = .;
|
||||
. = 0x00005740; gUnk_03005740 = .;
|
||||
|
|
1174
src/audio.c
1174
src/audio.c
File diff suppressed because it is too large
Load Diff
142
src/gba/m4a.c
142
src/gba/m4a.c
|
@ -42,7 +42,6 @@ typedef void (*CgbSoundFunc)(void);
|
|||
typedef void (*CgbOscOffFunc)(u8);
|
||||
typedef u32 (*MidiKeyToCgbFreqFunc)(u8, u8, u8);
|
||||
typedef void (*ExtVolPitFunc)(void);
|
||||
typedef void (*MPlayMainFunc)(MusicPlayerInfo*);
|
||||
typedef void (*XcmdFunc)(MusicPlayerInfo*, MusicPlayerTrack*);
|
||||
|
||||
typedef struct CgbChannel {
|
||||
|
@ -85,42 +84,6 @@ typedef struct CgbChannel {
|
|||
u8 unk4[8];
|
||||
} CgbChannel;
|
||||
|
||||
typedef struct SoundChannel {
|
||||
u8 statusFlags;
|
||||
u8 type;
|
||||
u8 rightVolume;
|
||||
u8 leftVolume;
|
||||
u8 attack;
|
||||
u8 decay;
|
||||
u8 sustain;
|
||||
u8 release;
|
||||
u8 key;
|
||||
u8 envelopeVolume;
|
||||
u8 envelopeVolumeRight;
|
||||
u8 envelopeVolumeLeft;
|
||||
u8 echoVolume;
|
||||
u8 echoLength;
|
||||
u8 unk0;
|
||||
u8 unk1;
|
||||
u8 gateTime;
|
||||
u8 midiKey;
|
||||
u8 velocity;
|
||||
u8 priority;
|
||||
u8 rhythmPan;
|
||||
u8 unk2[3];
|
||||
u32 count;
|
||||
u32 fw;
|
||||
u32 frequency;
|
||||
WaveData* wav;
|
||||
u32 currentPointer;
|
||||
MusicPlayerTrack* track;
|
||||
u32 prev;
|
||||
u32 next;
|
||||
u32 unk3;
|
||||
u16 xpi;
|
||||
u16 xpc;
|
||||
} SoundChannel;
|
||||
|
||||
#define MAX_DIRECTSOUND_CHANNELS 12
|
||||
|
||||
#define PCM_DMA_BUF_SIZE 1584 // size of Direct Sound buffer
|
||||
|
@ -162,56 +125,6 @@ typedef struct SoundInfo {
|
|||
s8 pcmBuffer[PCM_DMA_BUF_SIZE];
|
||||
} SoundInfo;
|
||||
|
||||
#define MPT_FLG_VOLSET 0x01
|
||||
#define MPT_FLG_VOLCHG 0x03
|
||||
#define MPT_FLG_PITSET 0x04
|
||||
#define MPT_FLG_PITCHG 0x0C
|
||||
#define MPT_FLG_START 0x40
|
||||
#define MPT_FLG_EXIST 0x80
|
||||
|
||||
// typedef above
|
||||
struct MusicPlayerTrack {
|
||||
u8 flags;
|
||||
u8 wait;
|
||||
u8 patternLevel;
|
||||
u8 repN;
|
||||
u8 gateTime;
|
||||
u8 key;
|
||||
u8 velocity;
|
||||
u8 runningStatus;
|
||||
u8 keyM;
|
||||
u8 pitM;
|
||||
s8 keyShift;
|
||||
s8 keyShiftX;
|
||||
s8 tune;
|
||||
u8 pitX;
|
||||
s8 bend;
|
||||
u8 bendRange;
|
||||
u8 volMR;
|
||||
u8 volML;
|
||||
u8 vol;
|
||||
u8 volX;
|
||||
s8 pan;
|
||||
s8 panX;
|
||||
s8 modM;
|
||||
u8 mod;
|
||||
u8 modT;
|
||||
u8 lfoSpeed;
|
||||
u8 lfoSpeedC;
|
||||
u8 lfoDelay;
|
||||
u8 lfoDelayC;
|
||||
u8 priority;
|
||||
u8 echoVolume;
|
||||
u8 echoLength;
|
||||
SoundChannel* chan;
|
||||
ToneData tone;
|
||||
u8 gap[10];
|
||||
u16 unk_3A;
|
||||
u32 unk_3C;
|
||||
u8* cmdPtr;
|
||||
u8* patternStack[3];
|
||||
};
|
||||
|
||||
#define MUSICPLAYER_STATUS_TRACK 0x0000ffff
|
||||
#define MUSICPLAYER_STATUS_PAUSE 0x80000000
|
||||
|
||||
|
@ -222,31 +135,6 @@ struct MusicPlayerTrack {
|
|||
#define FADE_VOL_MAX 64
|
||||
#define FADE_VOL_SHIFT 2
|
||||
|
||||
// typedef above
|
||||
struct MusicPlayerInfo {
|
||||
const SongHeader* songHeader;
|
||||
u32 status;
|
||||
u8 trackCount;
|
||||
u8 priority;
|
||||
u8 cmd;
|
||||
u8 unk_B;
|
||||
u32 clock;
|
||||
u8 gap[8];
|
||||
u8* memAccArea;
|
||||
u16 tempoD;
|
||||
u16 tempoU;
|
||||
u16 tempoI;
|
||||
u16 tempoC;
|
||||
u16 fadeOI;
|
||||
u16 fadeOC;
|
||||
u16 fadeOV;
|
||||
MusicPlayerTrack* tracks;
|
||||
ToneData* tone;
|
||||
u32 ident;
|
||||
MPlayMainFunc func;
|
||||
u32* intp;
|
||||
};
|
||||
|
||||
extern u8 gMPlayMemAccArea[];
|
||||
|
||||
extern char SoundMainRAM[];
|
||||
|
@ -471,9 +359,9 @@ void m4aSoundInit(void) {
|
|||
(8 << SOUND_MODE_MAXCHN_SHIFT));
|
||||
|
||||
for (i = 0; i < NUM_MUSIC_PLAYERS; i++) {
|
||||
MusicPlayerInfo* mplayInfo = gMPlayTable[i].info;
|
||||
MPlayOpen(mplayInfo, gMPlayTable[i].track, gMPlayTable[i].unk_8);
|
||||
mplayInfo->unk_B = gMPlayTable[i].unk_A;
|
||||
MusicPlayerInfo* mplayInfo = gMusicPlayers[i].info;
|
||||
MPlayOpen(mplayInfo, gMusicPlayers[i].tracks, gMusicPlayers[i].nTracks);
|
||||
mplayInfo->unk_B = gMusicPlayers[i].unk_A;
|
||||
mplayInfo->memAccArea = gMPlayMemAccArea;
|
||||
}
|
||||
}
|
||||
|
@ -483,19 +371,19 @@ void m4aSoundMain(void) {
|
|||
}
|
||||
|
||||
void m4aSongNumStart(u16 n) {
|
||||
const MusicPlayer* mplayTable = gMPlayTable;
|
||||
const MusicPlayer* mplayTable = gMusicPlayers;
|
||||
const Song* songTable = gSongTable;
|
||||
const Song* song = &songTable[n];
|
||||
const MusicPlayer* mplay = &mplayTable[song->ms];
|
||||
const MusicPlayer* mplay = &mplayTable[song->musicPlayerIndex];
|
||||
|
||||
MPlayStart(mplay->info, song->header);
|
||||
}
|
||||
|
||||
void m4aSongNumStartOrChange(u16 n) {
|
||||
const MusicPlayer* mplayTable = gMPlayTable;
|
||||
const MusicPlayer* mplayTable = gMusicPlayers;
|
||||
const Song* songTable = gSongTable;
|
||||
const Song* song = &songTable[n];
|
||||
const MusicPlayer* mplay = &mplayTable[song->ms];
|
||||
const MusicPlayer* mplay = &mplayTable[song->musicPlayerIndex];
|
||||
|
||||
if (mplay->info->songHeader != song->header) {
|
||||
MPlayStart(mplay->info, song->header);
|
||||
|
@ -507,10 +395,10 @@ void m4aSongNumStartOrChange(u16 n) {
|
|||
}
|
||||
|
||||
void m4aSongNumStartOrContinue(u16 n) {
|
||||
const MusicPlayer* mplayTable = gMPlayTable;
|
||||
const MusicPlayer* mplayTable = gMusicPlayers;
|
||||
const Song* songTable = gSongTable;
|
||||
const Song* song = &songTable[n];
|
||||
const MusicPlayer* mplay = &mplayTable[song->ms];
|
||||
const MusicPlayer* mplay = &mplayTable[song->musicPlayerIndex];
|
||||
|
||||
if (mplay->info->songHeader != song->header)
|
||||
MPlayStart(mplay->info, song->header);
|
||||
|
@ -521,20 +409,20 @@ void m4aSongNumStartOrContinue(u16 n) {
|
|||
}
|
||||
|
||||
void m4aSongNumStop(u16 n) {
|
||||
const MusicPlayer* mplayTable = gMPlayTable;
|
||||
const MusicPlayer* mplayTable = gMusicPlayers;
|
||||
const Song* songTable = gSongTable;
|
||||
const Song* song = &songTable[n];
|
||||
const MusicPlayer* mplay = &mplayTable[song->ms];
|
||||
const MusicPlayer* mplay = &mplayTable[song->musicPlayerIndex];
|
||||
|
||||
if (mplay->info->songHeader == song->header)
|
||||
MPlayStop(mplay->info);
|
||||
}
|
||||
|
||||
void m4aSongNumContinue(u16 n) {
|
||||
const MusicPlayer* mplayTable = gMPlayTable;
|
||||
const MusicPlayer* mplayTable = gMusicPlayers;
|
||||
const Song* songTable = gSongTable;
|
||||
const Song* song = &songTable[n];
|
||||
const MusicPlayer* mplay = &mplayTable[song->ms];
|
||||
const MusicPlayer* mplay = &mplayTable[song->musicPlayerIndex];
|
||||
|
||||
if (mplay->info->songHeader == song->header)
|
||||
MPlayContinue(mplay->info);
|
||||
|
@ -544,7 +432,7 @@ void m4aMPlayAllStop(void) {
|
|||
s32 i;
|
||||
|
||||
for (i = 0; i < NUM_MUSIC_PLAYERS; i++)
|
||||
MPlayStop(gMPlayTable[i].info);
|
||||
MPlayStop(gMusicPlayers[i].info);
|
||||
}
|
||||
|
||||
void m4aMPlayContinue(MusicPlayerInfo* mplayInfo) {
|
||||
|
@ -555,7 +443,7 @@ void m4aMPlayAllContinue(void) {
|
|||
s32 i;
|
||||
|
||||
for (i = 0; i < NUM_MUSIC_PLAYERS; i++)
|
||||
MPlayContinue(gMPlayTable[i].info);
|
||||
MPlayContinue(gMusicPlayers[i].info);
|
||||
}
|
||||
|
||||
void m4aMPlayFadeOut(MusicPlayerInfo* mplayInfo, u16 speed) {
|
||||
|
|
Loading…
Reference in New Issue