From 9f467bfc3aab11ce564b7ac2c1e04e0972840564 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Thu, 29 Jun 2023 01:02:15 -0400 Subject: [PATCH] Minor seq.c progress --- include/musyx/seq.h | 4 ++- src/musyx/runtime/seq.c | 79 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 81 insertions(+), 2 deletions(-) diff --git a/include/musyx/seq.h b/include/musyx/seq.h index b08c1fb0..41c16e53 100644 --- a/include/musyx/seq.h +++ b/include/musyx/seq.h @@ -169,9 +169,11 @@ void sndSeqStop(s32 unk); void sndSeqSpeed(u32 seqId, u16 speed); void sndSeqContinue(s32 unk); void sndSeqMute(s32 unk1, s32 unk2, s32 unk3); -void sndSeqVolume(unsigned char volume, unsigned short time, unsigned long seqId, unsigned char mode); +void sndSeqVolume(unsigned char volume, unsigned short time, unsigned long seqId, + unsigned char mode); void seqStop(unsigned long seqId); u16 seqGetMIDIPriority(u8 set, u8 channel); +void seqCrossFade(SND_CROSSFADE* ci, unsigned long* new_seqId, unsigned char irq_call); #ifdef __cplusplus } diff --git a/src/musyx/runtime/seq.c b/src/musyx/runtime/seq.c index e452695d..3a553bad 100644 --- a/src/musyx/runtime/seq.c +++ b/src/musyx/runtime/seq.c @@ -243,6 +243,17 @@ static u32 GetPublicId(u32 seqId) { u32 seqGetPrivateId(u32 seqId) { SEQ_INSTANCE* si; // r31 + for (si = seqActiveRoot; si != NULL; si = si->next) { + if (si->publicId == (seqId & 0x7fffffff)) { + return seqId & 0x80000000 | si->index; + } + } + for (si = seqPausedRoot; si != NULL; si = si->next) { + if (si->publicId == (seqId & 0x7fffffff)) { + return seqId & 0x80000000 | si->index; + } + } + return 0xffffffff; } static void DoPrgChange(SEQ_INSTANCE* seq, u8 prg, u8 midi) { @@ -631,7 +642,8 @@ void seqMute(unsigned long seqId, unsigned long mask1, unsigned long mask2) { void seqVolume(unsigned char volume, unsigned short time, unsigned long seqId, unsigned char mode) { unsigned long i; // r29 unsigned long pub_id; // r27 - pub_id = seqId; + // TODO + // pub_id = seqId; seqId = seqGetPrivateId(seqId); if (seqId == -1) { @@ -668,3 +680,68 @@ void seqVolume(unsigned char volume, unsigned short time, unsigned long seqId, u } } } + +// TODO: very incomplete +void seqCrossFade(SND_CROSSFADE* ci, unsigned long* new_seqId, unsigned char irq_call) { + SND_PLAYPARA pp; // r1+0x14 + unsigned long seqId; // r29 + unsigned short time; // r27 + seqId = seqGetPrivateId(ci->seqId1); + + if ((ci->flags & 0x4) != 0) { + seqInstance[seqId].syncCrossInfo = *ci; + seqInstance[seqId].syncActive = TRUE; + seqInstance[seqId].syncSeqIdPtr = new_seqId; + seqInstance[seqId].syncCrossInfo.flags &= ~0x4; + *new_seqId = ci->seqId1 | 0x80000000; + return; + } + + if ((irq_call & 0xff) != 0) { + time = 5; + if (ci->time1 > 4) { + time = ci->time1; + } + + if ((ci->flags & 0x1) != 0) { + seqVolume(0, time, seqId, 2); + } else if ((ci->flags & 0x40) != 0) { + seqVolume(0, time, seqId, 3); + } else { + seqVolume(0, time, seqId, 1); + } + + if (new_seqId != NULL) { + if ((ci->flags & 0x2) != 0) { + seqId = seqGetPrivateId(ci->seqId2); + if (seqId != 0xffffffff) { + if ((irq_call & 0xff) != 0) { + seqStop(ci->seqId2); + } else { + sndSeqContinue(ci->seqId2); + sndSeqVolume(ci->vol2, ci->time2, ci->seqId2, 0); + if ((ci->flags & 0x10) != 0) { + sndSeqMute(ci->seqId2, ci->trackMute2[0], ci->trackMute2[1]); + } + if ((ci->flags & 0x20) != 0) { + sndSeqSpeed(ci->seqId2, ci->speed2); + } + } + *new_seqId = ci->seqId2; + } else { + *new_seqId = 0xffffffff; + } + } + } + + return; + } + + if ((ci->flags & 0x1) != 0) { + sndSeqVolume(0, ci->time1, seqId, 2); + } else if ((ci->flags & 0x40) != 0) { + sndSeqVolume(0, ci->time1, seqId, 3); + } else { + sndSeqVolume(0, ci->time1, seqId, 1); + } +}