summaryrefslogtreecommitdiff
path: root/libs/JSystem/JAudio2/JASTrack.cpp
diff options
context:
space:
mode:
authorCaroline Madsen <69010899+randomsalience@users.noreply.github.com>2024-02-06 19:41:47 -0500
committerGitHub <noreply@github.com>2024-02-07 02:41:47 +0200
commita825c39d93d22c40168f474e1186fe036f734fe0 (patch)
treea75a87e9ac5e35e003695eae39fbf8bc38efa6cf /libs/JSystem/JAudio2/JASTrack.cpp
parentc19d9b02be5d894f91cd45884eed67152dffffa4 (diff)
work on JASTrack (#2065)
Diffstat (limited to 'libs/JSystem/JAudio2/JASTrack.cpp')
-rw-r--r--libs/JSystem/JAudio2/JASTrack.cpp1136
1 files changed, 794 insertions, 342 deletions
diff --git a/libs/JSystem/JAudio2/JASTrack.cpp b/libs/JSystem/JAudio2/JASTrack.cpp
index 6c5fab8749..75fe466e42 100644
--- a/libs/JSystem/JAudio2/JASTrack.cpp
+++ b/libs/JSystem/JAudio2/JASTrack.cpp
@@ -4,27 +4,17 @@
//
#include "JSystem/JAudio2/JASTrack.h"
+#include "JSystem/JAudio2/JASAiCtrl.h"
+#include "JSystem/JAudio2/JASBank.h"
+#include "JSystem/JAudio2/JASCriticalSection.h"
+#include "JSystem/JAudio2/JASDSPInterface.h"
+#include "JSystem/JAudio2/JASDriverIF.h"
#include "dol2asm.h"
//
// Types:
//
-namespace JGadget {
-struct TLinkListNode {};
-
-struct TNodeLinkList {
- struct iterator {};
-
- /* 802DCA1C */ ~TNodeLinkList();
- /* 802DCBA8 */ void Insert(JGadget::TNodeLinkList::iterator, JGadget::TLinkListNode*);
- /* 802DCBF8 */ void Remove(JGadget::TLinkListNode*);
-};
-
-}; // namespace JGadget
-
-template <typename A0>
-struct JASMemPool_MultiThreaded {};
/* JASMemPool_MultiThreaded<JASTrack> */
struct JASMemPool_MultiThreaded__template0 {
/* 802932E0 */ void func_802932E0(void* _this);
@@ -35,30 +25,10 @@ struct JASMemPool_MultiThreaded__template1 {
/* 80293334 */ void func_80293334(void* _this);
};
-struct JASGenericMemPool {
- /* 80290848 */ JASGenericMemPool();
- /* 80290860 */ ~JASGenericMemPool();
- /* 80290948 */ void alloc(u32);
- /* 80290994 */ void free(void*, u32);
-};
-
-struct JASDriver {
- /* 8029C9E8 */ void getDacRate();
- /* 8029E274 */ void registerSubFrameCallback(s32 (*)(void*), void*);
-};
-
-template <typename A0>
-struct JASBankTable {};
-/* JASBankTable<256> */
struct JASBankTable__template0 {
/* 80293528 */ void func_80293528(void* _this, u32) /* const */;
};
-struct JASBank {
- /* 80297930 */ void noteOn(JASBank const*, int, u8, u8, u16,
- void (*)(u32, JASChannel*, JASDsp::TChannel*, void*), void*);
-};
-
//
// Forward References:
//
@@ -207,6 +177,15 @@ SECTION_SDATA2 static u8 lit_457[4] = {
};
/* 80291228-8029131C 28BB68 00F4+00 1/1 3/3 0/0 .text __ct__8JASTrackFv */
+#ifdef NONMATCHING
+JASTrack::JASTrack() : mDefaultChannelMgr(this), mChannelMgrCount(1), mStatus(0) {
+ mChannelMgrs[0] = &mDefaultChannelMgr;
+ for (int i = 1; i < 4; i++) {
+ mChannelMgrs[i] = NULL;
+ }
+ init();
+}
+#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -215,23 +194,37 @@ asm JASTrack::JASTrack() {
#include "asm/JSystem/JAudio2/JASTrack/__ct__8JASTrackFv.s"
}
#pragma pop
+#endif
+#ifndef NONMATCHING
/* ############################################################################################## */
/* 804316A8-804316B4 05E3C8 000C+00 1/1 0/0 0/0 .bss @431 */
static u8 lit_431[12];
+#endif
/* 804316B4-80431AC0 05E3D4 040C+00 1/2 0/0 0/0 .bss sDefaultBankTable__8JASTrack */
+#ifdef NONMATCHING
+JASDefaultBankTable JASTrack::sDefaultBankTable;
+#else
u8 JASTrack::sDefaultBankTable[1036];
+#endif
+#ifndef NONMATCHING
/* 80431AC0-80431ACC 05E7E0 000C+00 0/1 0/0 0/0 .bss @433 */
#pragma push
#pragma force_active on
static u8 lit_433[12];
#pragma pop
+#endif
/* 80431ACC-80431ADC 05E7EC 0010+00 1/2 0/0 0/0 .bss sTrackList__8JASTrack */
+#ifdef NONMATCHING
+JASTrack::TList JASTrack::sTrackList;
+#else
u8 JASTrack::sTrackList[16];
+#endif
+#ifndef NONMATCHING
/* 80431ADC-80431AE8 05E7FC 000C+00 3/3 0/0 0/0 .bss @470 */
static u8 lit_470[12];
@@ -248,8 +241,17 @@ u8 data_80431AF4[16];
* memPool_$localstatic3$getMemPool___43JASPoolAllocObject_MultiThreaded<8JASTrack>Fv */
extern u8 data_80431B04[16 + 4 /* padding */];
u8 data_80431B04[16 + 4 /* padding */];
+#endif
/* 8029131C-80291444 28BC5C 0128+00 4/4 4/4 0/0 .text __dt__8JASTrackFv */
+#ifdef NONMATCHING
+// matches with weak fns / literals
+JASTrack::~JASTrack() {
+ for (int i = 1; i < 4; i++) {
+ delete mChannelMgrs[i];
+ }
+}
+#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -258,8 +260,30 @@ asm JASTrack::~JASTrack() {
#include "asm/JSystem/JAudio2/JASTrack/__dt__8JASTrackFv.s"
}
#pragma pop
+#endif
/* 80291444-802915D4 28BD84 0190+00 1/1 3/3 0/0 .text setChannelMgrCount__8JASTrackFUl */
+#ifdef NONMATCHING
+// matches with weak fns / literals
+void JASTrack::setChannelMgrCount(u32 i_count) {
+ mChannelMgrCount = 1;
+ for (int i = 1; i < i_count; i++) {
+ if (mChannelMgrs[i] == NULL) {
+ mChannelMgrs[i] = new TChannelMgr(this);
+ if (mChannelMgrs[i] == NULL) {
+ return;
+ }
+ }
+ mChannelMgrCount++;
+ }
+ for (u32 i = mChannelMgrCount; i < 4; i++) {
+ if (mChannelMgrs[i] != NULL) {
+ delete mChannelMgrs[i];
+ mChannelMgrs[i] = NULL;
+ }
+ }
+}
+#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -268,36 +292,100 @@ asm void JASTrack::setChannelMgrCount(u32 param_0) {
#include "asm/JSystem/JAudio2/JASTrack/setChannelMgrCount__8JASTrackFUl.s"
}
#pragma pop
+#endif
/* ############################################################################################## */
/* 8039AFD0-8039AFE8 027630 0018+00 1/1 0/0 0/0 .rodata sAdsTable__8JASTrack */
-SECTION_RODATA u8 const JASTrack::sAdsTable[24] = {
- 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00,
+JASOscillator::Point const JASTrack::sAdsTable[4] = {
+ {0, 0, 0x7fff},
+ {0, 0, 0x7fff},
+ {0, 0, 0},
+ {0xe, 0, 0},
};
-COMPILER_STRIP_GATE(0x8039AFD0, &JASTrack::sAdsTable);
/* 8039AFE8-8039B000 027648 0018+00 1/2 0/0 0/0 .rodata sEnvOsc__8JASTrack */
-SECTION_RODATA u8 const JASTrack::sEnvOsc[24] = {
- 0x00, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-};
-COMPILER_STRIP_GATE(0x8039AFE8, &JASTrack::sEnvOsc);
+JASOscillator::Data const JASTrack::sEnvOsc = {0, 1.0f, NULL, NULL, 1.0f, 0.0f};
/* 8039B000-8039B018 027660 0018+00 0/1 0/0 0/0 .rodata sPitchEnvOsc__8JASTrack */
-#pragma push
-#pragma force_active on
-SECTION_RODATA u8 const JASTrack::sPitchEnvOsc[24] = {
- 0x00, 0x00, 0x00, 0x01, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-};
-COMPILER_STRIP_GATE(0x8039B000, &JASTrack::sPitchEnvOsc);
-#pragma pop
+JASOscillator::Data const JASTrack::sPitchEnvOsc = {1, 1.0f, NULL, NULL, 1.0f, 0.0f};
/* 804555A4-804555A8 003BA4 0004+00 9/9 0/0 0/0 .sdata2 @679 */
SECTION_SDATA2 static f32 lit_679 = 1.0f;
/* 802915D4-802918FC 28BF14 0328+00 2/2 1/1 0/0 .text init__8JASTrackFv */
+#ifdef NONMATCHING
+// matches with weak fns / literals
+void JASTrack::init() {
+ mSeqCtrl.init();
+ mTrackPort.init();
+ initTimed();
+ mRegisterParam.init();
+ mOscParam[0] = sEnvOsc;
+ mOscParam[1] = sPitchEnvOsc;
+ for (int i = 0; i < 4; i++) {
+ mOscPoint[i] = sAdsTable[i];
+ }
+ mParent = NULL;
+ for (int i = 0; i < 16; i++) {
+ mChildren[i] = NULL;
+ }
+ mChannelMgrs[0]->init();
+ mChannelMgrCount = 1;
+ for (int i = 1; i < 4; i++) {
+ if (mChannelMgrs[i] != NULL) {
+ delete mChannelMgrs[i];
+ mChannelMgrs[i] = NULL;
+ }
+ }
+ mBankTable = &sDefaultBankTable;
+ field_0x1d8 = 1.0f;
+ field_0x1dc = 1.0f;
+ mVibDepth = 0.0f;
+ mVibPitch = 1.0f;
+ mTremDepth = 0.0f;
+ mTremPitch = 1.0f;
+ mVibDelay = 0;
+ mTremDelay = 0;
+ mPanPower = 1.0f;
+ mDirectRelease = 0;
+ mSkipSample = 0;
+ mTempo = 120;
+ mTimebase = 0x30;
+ mTempoRate = 1.0f;
+ updateTempo();
+ mTranspose = 0;
+ field_0x22b = 60;
+ mBankNumber = 0;
+ mProgNumber = 0xf0;
+ mBendSense = 0xc;
+ mNoteOnPrio = 0x40;
+ mReleasePrio = 0;
+ mGateRate = 100;
+ mMixConfig[0] = 0x150;
+ mMixConfig[1] = 0x210;
+ mMixConfig[2] = 0x352;
+ mMixConfig[3] = 0x412;
+ mMixConfig[4] = 0;
+ mMixConfig[5] = 0;
+ for (int i = 0; i < 8; i++) {
+ mFIR[i] = 0;
+ }
+ mFIR[0] = 0x7fff;
+ for (int i = 0; i < 8; i++) {
+ mIIR[i] = 0;
+ }
+ mIIR[0] = 0x7fff;
+ mFilterMode = 0;
+ mFlags.pause = false;
+ mFlags.mute = false;
+ mFlags.flag2 = true;
+ mFlags.flag5 = true;
+ mFlags.autoDelete = false;
+ mFlags.flag4 = false;
+ mFlags.flag6 = false;
+ mStatus = 0;
+}
+#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -306,12 +394,28 @@ asm void JASTrack::init() {
#include "asm/JSystem/JAudio2/JASTrack/init__8JASTrackFv.s"
}
#pragma pop
+#endif
/* ############################################################################################## */
/* 804555A8-804555AC 003BA8 0004+00 4/4 0/0 0/0 .sdata2 @690 */
SECTION_SDATA2 static f32 lit_690 = 0.5f;
/* 802918FC-8029194C 28C23C 0050+00 1/1 0/0 0/0 .text initTimed__8JASTrackFv */
+#ifdef NONMATCHING
+// matches with literals
+void JASTrack::initTimed() {
+ mMoveParam[0].mValue = 1.0f;
+ mMoveParam[1].mValue = 0.0f;
+ mMoveParam[3].mValue = 0.5f;
+ mMoveParam[2].mValue = 0.0f;
+ mMoveParam[4].mValue = 0.0f;
+ mMoveParam[5].mValue = 0.0f;
+ for (int i = 0; i < 6; i++) {
+ mMoveParam[i].mCount = 0;
+ mMoveParam[i].mTarget = mMoveParam[i].mValue;
+ }
+}
+#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -320,39 +424,48 @@ asm void JASTrack::initTimed() {
#include "asm/JSystem/JAudio2/JASTrack/initTimed__8JASTrackFv.s"
}
#pragma pop
+#endif
/* 8029194C-802919F4 28C28C 00A8+00 1/1 0/0 0/0 .text inherit__8JASTrackFRC8JASTrack */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::inherit(JASTrack const& param_0) {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/inherit__8JASTrackFRC8JASTrack.s"
+void JASTrack::inherit(JASTrack const& i_parent) {
+ mFlags.flag2 = i_parent.mFlags.flag2;
+ mBankNumber = i_parent.mBankNumber;
+ mProgNumber = i_parent.mProgNumber;
+ mNoteOnPrio = i_parent.mNoteOnPrio;
+ mReleasePrio = i_parent.mReleasePrio;
+ mSkipSample = i_parent.mSkipSample;
+ for (int i = 0; i < 8; i++) {
+ mFIR[i] = i_parent.mFIR[i];
+ }
+ for (int i = 0; i < 8; i++) {
+ mIIR[i] = i_parent.mIIR[i];
+ }
+ mFilterMode = i_parent.mFilterMode;
+ for (int i = 0; i < 6; i++) {
+ mMixConfig[i] = i_parent.mMixConfig[i];
+ }
}
-#pragma pop
/* 802919F4-80291A08 28C334 0014+00 0/0 5/5 0/0 .text
* assignExtBuffer__8JASTrackFUlP14JASSoundParams */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::assignExtBuffer(u32 param_0, JASSoundParams* param_1) {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/assignExtBuffer__8JASTrackFUlP14JASSoundParams.s"
+void JASTrack::assignExtBuffer(u32 i_index, JASSoundParams* i_soundParams) {
+ mChannelMgrs[i_index]->mSoundParams = i_soundParams;
}
-#pragma pop
/* 80291A08-80291A28 28C348 0020+00 0/0 3/3 0/0 .text setSeqData__8JASTrackFPvUl */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::setSeqData(void* param_0, u32 param_1) {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/setSeqData__8JASTrackFPvUl.s"
+void JASTrack::setSeqData(void* param_0, u32 param_1) {
+ mSeqCtrl.start(param_0, param_1);
}
-#pragma pop
/* 80291A28-80291A78 28C368 0050+00 0/0 2/2 0/0 .text startSeq__8JASTrackFv */
+#ifdef NONMATCHING
+// matches once static data declared correctly
+void JASTrack::startSeq() {
+ JASCriticalSection critical_section;
+ sTrackList.append(this);
+ mStatus = 1;
+}
+#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -361,48 +474,65 @@ asm void JASTrack::startSeq() {
#include "asm/JSystem/JAudio2/JASTrack/startSeq__8JASTrackFv.s"
}
#pragma pop
+#endif
/* 80291A78-80291ABC 28C3B8 0044+00 0/0 2/2 0/0 .text stopSeq__8JASTrackFv */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::stopSeq() {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/stopSeq__8JASTrackFv.s"
+void JASTrack::stopSeq() {
+ JASCriticalSection critical_section;
+ mFlags.flag6 = 1;
}
-#pragma pop
/* 80291ABC-80291AC8 28C3FC 000C+00 0/0 1/1 0/0 .text start__8JASTrackFv */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::start() {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/start__8JASTrackFv.s"
+void JASTrack::start() {
+ mStatus = 1;
}
-#pragma pop
/* 80291AC8-80291B8C 28C408 00C4+00 4/4 0/0 0/0 .text close__8JASTrackFv */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::close() {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/close__8JASTrackFv.s"
+void JASTrack::close() {
+ for (int i = 0; i < 16; i++) {
+ JASTrack* child = mChildren[i];
+ if (child != NULL) {
+ child->close();
+ if (child->mFlags.autoDelete) {
+ delete child;
+ mChildren[i] = NULL;
+ }
+ }
+ }
+ for (u32 i = 0; i < mChannelMgrCount; i++) {
+ if (mChannelMgrs[i] != NULL) {
+ mChannelMgrs[i]->releaseAll();
+ }
+ }
+ mParent = NULL;
+ mStatus = 2;
}
-#pragma pop
/* 80291B8C-80291BB8 28C4CC 002C+00 1/1 1/1 0/0 .text connectChild__8JASTrackFUlP8JASTrack */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::connectChild(u32 param_0, JASTrack* param_1) {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/connectChild__8JASTrackFUlP8JASTrack.s"
+bool JASTrack::connectChild(u32 i_index, JASTrack* i_child) {
+ if (mChildren[i_index] != NULL) {
+ return false;
+ }
+ i_child->mParent = this;
+ mChildren[i_index] = i_child;
+ return true;
}
-#pragma pop
/* 80291BB8-80291C30 28C4F8 0078+00 0/0 1/1 0/0 .text closeChild__8JASTrackFUl */
+#ifdef NONMATCHING
+// matches with literals
+void JASTrack::closeChild(u32 i_index) {
+ JASTrack* child = mChildren[i_index];
+ if (child != NULL) {
+ getRootTrack()->updateSeq(false, 1.0f);
+ child->close();
+ if (child->mFlags.autoDelete) {
+ delete child;
+ mChildren[i_index] = NULL;
+ }
+ }
+}
+#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -411,8 +541,42 @@ asm void JASTrack::closeChild(u32 param_0) {
#include "asm/JSystem/JAudio2/JASTrack/closeChild__8JASTrackFUl.s"
}
#pragma pop
+#endif
/* 80291C30-80291DAC 28C570 017C+00 0/0 2/2 0/0 .text openChild__8JASTrackFUl */
+#ifdef NONMATCHING
+// matches with weak fns / literals
+JASTrack* JASTrack::openChild(u32 i_index) {
+ JASTrack* child = mChildren[i_index];
+ if (child != NULL) {
+ switch (child->mStatus) {
+ case 0:
+ break;
+ case 1:
+ getRootTrack()->updateSeq(false, 1.0f);
+ child->close();
+ // no break
+ case 2:
+ bool auto_delete = child->mFlags.autoDelete;
+ child->init();
+ child->mFlags.autoDelete = auto_delete;
+ mChildren[i_index] = NULL;
+ connectChild(i_index, child);
+ break;
+ }
+ } else {
+ child = new JASTrack();
+ if (child == NULL) {
+ return NULL;
+ }
+ child->mFlags.autoDelete = true;
+ connectChild(i_index, child);
+ }
+ child->setChannelMgrCount(mChannelMgrCount);
+ child->inherit(*this);
+ return child;
+}
+#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -421,40 +585,83 @@ asm JASTrack* JASTrack::openChild(u32 param_0) {
#include "asm/JSystem/JAudio2/JASTrack/openChild__8JASTrackFUl.s"
}
#pragma pop
+#endif
/* 80291DAC-80291DBC 28C6EC 0010+00 0/0 1/1 0/0 .text connectBus__8JASTrackFii */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::connectBus(int param_0, int param_1) {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/connectBus__8JASTrackFii.s"
+void JASTrack::connectBus(int param_0, int param_1) {
+ mMixConfig[param_0] = param_1;
}
-#pragma pop
/* 80291DBC-80291DF8 28C6FC 003C+00 0/0 1/1 0/0 .text setLatestKey__8JASTrackFUc */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::setLatestKey(u8 param_0) {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/setLatestKey__8JASTrackFUc.s"
+void JASTrack::setLatestKey(u8 param_0) {
+ field_0x22b = param_0;
+ field_0x22b += getTransposeTotal();
}
-#pragma pop
/* 80291DF8-80291F38 28C738 0140+00 2/2 0/0 0/0 .text
* channelStart__8JASTrackFPQ28JASTrack11TChannelMgrUlUlUl */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::channelStart(JASTrack::TChannelMgr* param_0, u32 param_1, u32 param_2,
+#ifdef NONMATCHING
+// matches with weak fns
+JASChannel* JASTrack::channelStart(JASTrack::TChannelMgr* i_channelMgr, u32 param_1, u32 param_2,
+ u32 i_updateTimer) {
+ JASBank* bank = NULL;
+ if (mBankTable != NULL) {
+ bank = mBankTable->getBank(mBankNumber);
+ }
+ JASChannel* channel = JASBank::noteOn(bank, mProgNumber, param_1, param_2,
+ mNoteOnPrio | mReleasePrio << 8,
+ channelUpdateCallback, i_channelMgr);
+ if (channel == NULL) {
+ return NULL;
+ }
+ channel->setUpdateTimer(i_updateTimer);
+ channel->setSkipSamples(mSkipSample);
+ channel->setVibrateDelay(mVibDelay);
+ channel->setTremoloDelay(mTremDelay);
+ channel->setParams(i_channelMgr->mParams);
+ for (u32 i = 0; i < 6; i++) {
+ channel->setMixConfig(i, mMixConfig[i]);
+ }
+ overwriteOsc(channel);
+ if (mDirectRelease != 0) {
+ channel->setDirectRelease(mDirectRelease);
+ }
+ return channel;
+}
+#else
+#pragma push
+#pragma optimization_level 0
+#pragma optimizewithasm off
+asm JASChannel* JASTrack::channelStart(JASTrack::TChannelMgr* param_0, u32 param_1, u32 param_2,
u32 param_3) {
nofralloc
#include "asm/JSystem/JAudio2/JASTrack/channelStart__8JASTrackFPQ28JASTrack11TChannelMgrUlUlUl.s"
}
#pragma pop
+#endif
/* 80291F38-80292008 28C878 00D0+00 0/0 1/1 0/0 .text noteOn__8JASTrackFUlUlUl */
+#ifdef NONMATCHING
+// regalloc
+int JASTrack::noteOn(u32 i_noteID, u32 param_1, u32 param_2) {
+ if (isMute()) {
+ return 0;
+ }
+ int ret = 1;
+ int var1 = param_1 + getTransposeTotal();
+ for (u32 i = 0; i < mChannelMgrCount; i++) {
+ if (mChannelMgrs[i] != NULL) {
+ mChannelMgrs[i]->noteOff(i_noteID, 0);
+ JASChannel* channel = channelStart(mChannelMgrs[i], var1, param_2, 0);
+ if (channel == NULL) {
+ ret = 0;
+ }
+ mChannelMgrs[i]->mChannels[i_noteID] = channel;
+ }
+ }
+ return ret;
+}
+#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -463,6 +670,7 @@ asm int JASTrack::noteOn(u32 param_0, u32 param_1, u32 param_2) {
#include "asm/JSystem/JAudio2/JASTrack/noteOn__8JASTrackFUlUlUl.s"
}
#pragma pop
+#endif
/* ############################################################################################## */
/* 804555AC-804555B0 003BAC 0004+00 1/1 0/0 0/0 .sdata2 @952 */
@@ -472,6 +680,48 @@ SECTION_SDATA2 static f32 lit_952 = 100.0f;
SECTION_SDATA2 static f64 lit_954 = 4503599627370496.0 /* cast u32 to float */;
/* 80292008-80292198 28C948 0190+00 0/0 1/1 0/0 .text gateOn__8JASTrackFUlUlfUl */
+#ifdef NONMATCHING
+// regalloc
+int JASTrack::gateOn(u32 param_0, u32 i_velocity, f32 i_time, u32 i_flags) {
+ int uvar5 = param_0 + getTransposeTotal();
+ if (mGateRate != 100) {
+ i_time *= mGateRate / 100.0f;
+ }
+ u32 uvar2 = seqTimeToDspTime(i_time);
+ u32 update_timer = (i_flags & 6) ? 0 : uvar2;
+ int uvar7;
+ if (i_flags & 1) {
+ uvar7 = field_0x22b;
+ } else {
+ uvar7 = uvar5;
+ }
+ for (u32 i = 0; i < mChannelMgrCount; i++) {
+ TChannelMgr* channel_mgr = mChannelMgrs[i];
+ if (channel_mgr != NULL) {
+ if (!mFlags.flag4) {
+ channel_mgr->noteOff(0, 0);
+ if (!isMute()) {
+ channel_mgr->mChannels[0] =
+ channelStart(channel_mgr, uvar7, i_velocity, update_timer);
+ }
+ } else {
+ JASChannel* channel = channel_mgr->mChannels[0];
+ if (channel != NULL) {
+ channel->mKey = uvar7 - channel->field_0xdc.field_0x4.field_0x01;
+ channel->mVelocity = i_velocity;
+ channel->mUpdateTimer = update_timer;
+ }
+ }
+ if ((i_flags & 1) && channel_mgr->mChannels[0] != NULL) {
+ channel_mgr->mChannels[0]->setKeySweepTarget(uvar5 - uvar7, uvar2);
+ }
+ }
+ }
+ mFlags.flag4 = (i_flags >> 1) & 1;
+ field_0x22b = uvar5;
+ return 1;
+}
+#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -480,38 +730,53 @@ asm int JASTrack::gateOn(u32 param_0, u32 param_1, f32 param_2, u32 param_3) {
#include "asm/JSystem/JAudio2/JASTrack/gateOn__8JASTrackFUlUlfUl.s"
}
#pragma pop
+#endif
/* 80292198-80292220 28CAD8 0088+00 1/1 1/1 0/0 .text noteOff__8JASTrackFUlUs */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm int JASTrack::noteOff(u32 param_0, u16 param_1) {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/noteOff__8JASTrackFUlUs.s"
+int JASTrack::noteOff(u32 i_noteID, u16 param_1) {
+ int ret = 1;
+ for (u32 i = 0; i < mChannelMgrCount; i++) {
+ if (mChannelMgrs[i] != NULL) {
+ if (!mChannelMgrs[i]->noteOff(i_noteID, param_1)) {
+ ret = 0;
+ }
+ }
+ }
+ return ret;
}
-#pragma pop
/* 80292220-8029226C 28CB60 004C+00 0/0 1/1 0/0 .text checkNoteStop__8JASTrackCFUl */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm bool JASTrack::checkNoteStop(u32 param_0) const {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/checkNoteStop__8JASTrackCFUl.s"
+bool JASTrack::checkNoteStop(u32 i_noteID) const {
+ for (u32 i = 0; i < mChannelMgrCount; i++) {
+ if (mChannelMgrs[i] != NULL && mChannelMgrs[i]->mChannels[i_noteID] != NULL) {
+ return false;
+ }
+ }
+ return true;
}
-#pragma pop
/* 8029226C-802922D8 28CBAC 006C+00 1/1 0/0 0/0 .text overwriteOsc__8JASTrackFP10JASChannel */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::overwriteOsc(JASChannel* param_0) {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/overwriteOsc__8JASTrackFP10JASChannel.s"
+void JASTrack::overwriteOsc(JASChannel* i_channel) {
+ for (u32 i = 0; i < 2; i++) {
+ if (mOscParam[i].mTable != NULL) {
+ i_channel->setOscInit(i, &mOscParam[i]);
+ }
+ }
}
-#pragma pop
/* 802922D8-80292348 28CC18 0070+00 1/1 0/0 0/0 .text updateTimedParam__8JASTrackFv */
+#ifdef NONMATCHING
+// matches with literals
+void JASTrack::updateTimedParam() {
+ for (u32 i = 0; i < 6; i++) {
+ MoveParam_* param = &mMoveParam[i];
+ if (param->mCount != 0) {
+ param->mValue += (param->mTarget - param->mValue) / param->mCount;
+ param->mCount--;
+ }
+ }
+}
+#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -520,12 +785,60 @@ asm void JASTrack::updateTimedParam() {
#include "asm/JSystem/JAudio2/JASTrack/updateTimedParam__8JASTrackFv.s"
}
#pragma pop
+#endif
/* ############################################################################################## */
/* 804555B8-804555BC 003BB8 0004+00 1/1 0/0 0/0 .sdata2 @1032 */
SECTION_SDATA2 static f32 lit_1032 = 1.0f / 3.0f;
/* 80292348-802924E4 28CC88 019C+00 1/1 0/0 0/0 .text updateTrack__8JASTrackFf */
+#ifdef NONMATCHING
+// matches with literals
+void JASTrack::updateTrack(f32 param_0) {
+ updateTempo();
+ for (u32 i = 0; i < mChannelMgrCount; i++) {
+ TChannelMgr* channel_mgr = mChannelMgrs[i];
+ if (channel_mgr != NULL) {
+ f32 volume = mMoveParam[0].mValue;
+ volume = volume * volume;
+ f32 pitch = 1.0f;
+ f32 fvar6 = mMoveParam[1].mValue * mBendSense * (1.0f / 3.0f);
+ f32 pan = (mMoveParam[3].mValue - 0.5f) * mPanPower;
+ f32 fxmix = mMoveParam[2].mValue;
+ f32 dolby = mMoveParam[4].mValue;
+ JASSoundParams* sound_params = channel_mgr->mSoundParams;
+ if (sound_params != NULL) {
+ volume *= sound_params->mVolume;
+ pitch *= sound_params->mPitch;
+ pan += sound_params->mPan - 0.5f;
+ fxmix += sound_params->mFxMix;
+ dolby += sound_params->mDolby;
+ }
+ pan *= param_0;
+ if (mParent == NULL) {
+ channel_mgr->mParams.mVolume = volume;
+ channel_mgr->mParams.mPitch = pitch;
+ channel_mgr->mParams.mPan = pan;
+ channel_mgr->mParams.mFxMix = fxmix;
+ channel_mgr->mParams.mDolby = dolby;
+ channel_mgr->mParams.field_0x8 = fvar6;
+ } else {
+ TChannelMgr* parent_channel_mgr = mParent->mChannelMgrs[i];
+ if (parent_channel_mgr == NULL) {
+ parent_channel_mgr = mParent->mChannelMgrs[0];
+ }
+ channel_mgr->mParams.mVolume = parent_channel_mgr->mParams.mVolume * volume;
+ channel_mgr->mParams.mPitch = parent_channel_mgr->mParams.mPitch * pitch;
+ channel_mgr->mParams.mPan = (parent_channel_mgr->mParams.mPan - 0.5f) + pan;
+ channel_mgr->mParams.mFxMix = parent_channel_mgr->mParams.mFxMix + fxmix;
+ channel_mgr->mParams.mDolby = parent_channel_mgr->mParams.mDolby + dolby;
+ channel_mgr->mParams.field_0x8 = parent_channel_mgr->mParams.field_0x8 + fvar6;
+ }
+ channel_mgr->mParams.mPan += 0.5f;
+ }
+ }
+}
+#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -534,6 +847,7 @@ asm void JASTrack::updateTrack(f32 param_0) {
#include "asm/JSystem/JAudio2/JASTrack/updateTrack__8JASTrackFf.s"
}
#pragma pop
+#endif
/* ############################################################################################## */
/* 804555BC-804555C0 003BBC 0004+00 1/1 0/0 0/0 .sdata2 @1042 */
@@ -543,6 +857,18 @@ SECTION_SDATA2 static f32 lit_1042 = 4.0f / 3.0f;
SECTION_SDATA2 static f64 lit_1044 = 4503601774854144.0 /* cast s32 to float */;
/* 802924E4-80292580 28CE24 009C+00 5/5 0/0 0/0 .text updateTempo__8JASTrackFv */
+#ifdef NONMATCHING
+// matches with literals
+void JASTrack::updateTempo() {
+ if (mParent == NULL) {
+ field_0x1dc = mTempoRate * (mTimebase * mTempo * (4.0f / 3.0f) / JASDriver::getDacRate());
+ } else {
+ mTempo = mParent->mTempo;
+ mTimebase = mParent->mTimebase;
+ field_0x1dc = mParent->field_0x1dc;
+ }
+}
+#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -551,16 +877,24 @@ asm void JASTrack::updateTempo() {
#include "asm/JSystem/JAudio2/JASTrack/updateTempo__8JASTrackFv.s"
}
#pragma pop
+#endif
/* 80292580-80292644 28CEC0 00C4+00 4/4 0/0 0/0 .text updateSeq__8JASTrackFbf */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::updateSeq(bool param_0, f32 param_1) {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/updateSeq__8JASTrackFbf.s"
+void JASTrack::updateSeq(bool param_0, f32 param_1) {
+ if (!param_0) {
+ param_0 = mFlags.flag5;
+ }
+ mFlags.flag5 = false;
+ if (param_0) {
+ updateTrack(param_1);
+ }
+ f32 fvar1 = param_1 * mPanPower;
+ for (int i = 0; i < 16; i++) {
+ if (mChildren[i] != NULL && mChildren[i]->mStatus == 1) {
+ mChildren[i]->updateSeq(param_0, fvar1);
+ }
+ }
}
-#pragma pop
/* ############################################################################################## */
/* 804555C8-804555CC 003BC8 0004+00 1/1 0/0 0/0 .sdata2 @1069 */
@@ -570,209 +904,195 @@ SECTION_SDATA2 static f32 lit_1069 = 120.0f;
SECTION_SDATA2 static f32 lit_1070 = 10.0f;
/* 80292644-802926E0 28CF84 009C+00 1/1 0/0 0/0 .text seqTimeToDspTime__8JASTrackFf */
+#ifdef NONMATCHING
+// matches with literals
+u32 JASTrack::seqTimeToDspTime(f32 i_seqTime) {
+ f32 dsp_time;
+ if (mFlags.flag2) {
+ dsp_time = i_seqTime / field_0x1dc;
+ } else {
+ dsp_time = i_seqTime * (120.0f / mTimebase);
+ dsp_time *= JASDriver::getSubFrames() / 10.0f;
+ }
+ return dsp_time;
+}
+#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
-asm void JASTrack::seqTimeToDspTime(f32 param_0) {
+asm u32 JASTrack::seqTimeToDspTime(f32 param_0) {
nofralloc
#include "asm/JSystem/JAudio2/JASTrack/seqTimeToDspTime__8JASTrackFf.s"
}
#pragma pop
+#endif
/* 802926E0-80292708 28D020 0028+00 0/0 4/4 0/0 .text setParam__8JASTrackFUlfUl */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::setParam(u32 param_0, f32 param_1, u32 param_2) {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/setParam__8JASTrackFUlfUl.s"
+void JASTrack::setParam(u32 i_index, f32 i_target, u32 i_count) {
+ MoveParam_* param = &mMoveParam[i_index];
+ param->mTarget = i_target;
+ if (i_count == 0) {
+ param->mValue = param->mTarget;
+ }
+ param->mCount = i_count;
}
-#pragma pop
/* 80292708-802927A0 28D048 0098+00 1/1 0/0 0/0 .text noteOffAll__8JASTrackFUs */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::noteOffAll(u16 param_0) {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/noteOffAll__8JASTrackFUs.s"
+void JASTrack::noteOffAll(u16 param_0) {
+ for (u8 i = 0; i < 8; i++) {
+ noteOff(i, param_0);
+ }
+ for (int i = 0; i < 16; i++) {
+ if (mChildren[i] != NULL && mChildren[i]->mStatus == 1) {
+ mChildren[i]->noteOffAll(param_0);
+ }
+ }
}
-#pragma pop
/* 802927A0-802927D8 28D0E0 0038+00 0/0 2/2 0/0 .text mute__8JASTrackFb */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::mute(bool param_0) {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/mute__8JASTrackFb.s"
+void JASTrack::mute(bool i_mute) {
+ mFlags.mute = i_mute;
+ if (i_mute) {
+ noteOffAll(10);
+ }
}
-#pragma pop
/* 802927D8-802927E8 28D118 0010+00 0/0 1/1 0/0 .text setOscScale__8JASTrackFUlf */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::setOscScale(u32 param_0, f32 param_1) {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/setOscScale__8JASTrackFUlf.s"
+void JASTrack::setOscScale(u32 i_oscNo, f32 i_scale) {
+ mOscParam[i_oscNo].mScale = i_scale;
}
-#pragma pop
/* 802927E8-80292808 28D128 0020+00 0/0 1/1 0/0 .text
* setOscTable__8JASTrackFUlPCQ213JASOscillator5Point */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::setOscTable(u32 param_0, JASOscillator::Point const* param_1) {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/setOscTable__8JASTrackFUlPCQ213JASOscillator5Point.s"
+void JASTrack::setOscTable(u32 i_oscNo, JASOscillator::Point const* i_table) {
+ mOscParam[i_oscNo].mTable = i_table;
+ if (i_oscNo != 0) {
+ mOscParam[i_oscNo]._0C = NULL;
+ }
}
-#pragma pop
/* 80292808-8029285C 28D148 0054+00 0/0 1/1 0/0 .text setOscAdsr__8JASTrackFssssUs */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::setOscAdsr(s16 param_0, s16 param_1, s16 param_2, s16 param_3, u16 param_4) {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/setOscAdsr__8JASTrackFssssUs.s"
+void JASTrack::setOscAdsr(s16 param_0, s16 param_1, s16 param_2, s16 param_3, u16 i_directRelease) {
+ mOscParam[0] = sEnvOsc;
+ mOscParam[0].mTable = mOscPoint;
+ mOscPoint[0]._2 = param_0;
+ mOscPoint[1]._2 = param_1;
+ mOscPoint[2]._2 = param_2;
+ mOscPoint[2]._4 = param_3;
+ mDirectRelease = i_directRelease;
}
-#pragma pop
/* ############################################################################################## */
/* 804555D0-804555D4 003BD0 0004+00 2/2 0/0 0/0 .sdata2 FILTER_MODE_IIR__6JASDsp */
SECTION_SDATA2 u32 JASDsp::FILTER_MODE_IIR = 0x00000020;
/* 8029285C-8029289C 28D19C 0040+00 0/0 2/2 0/0 .text setFIR__8JASTrackFPCs */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::setFIR(s16 const* param_0) {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/setFIR__8JASTrackFPCs.s"
+void JASTrack::setFIR(s16 const* i_FIR) {
+ for (int i = 0; i < 8; i++) {
+ mFIR[i] = i_FIR[i];
+ }
+ mFilterMode &= JASDsp::FILTER_MODE_IIR;
+ mFilterMode |= 8;
}
-#pragma pop
/* 8029289C-802928D0 28D1DC 0034+00 0/0 4/4 0/0 .text setIIR__8JASTrackFPCs */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::setIIR(s16 const* param_0) {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/setIIR__8JASTrackFPCs.s"
+void JASTrack::setIIR(s16 const* i_IIR) {
+ for (int i = 0; i < 8; i++) {
+ mIIR[i] = i_IIR[i];
+ }
+ mFilterMode |= JASDsp::FILTER_MODE_IIR;
}
-#pragma pop
/* 802928D0-802928F4 28D210 0024+00 0/0 1/1 0/0 .text readPortSelf__8JASTrackFUl */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm u16 JASTrack::readPortSelf(u32 param_0) {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/readPortSelf__8JASTrackFUl.s"
+u16 JASTrack::readPortSelf(u32 param_0) {
+ return mTrackPort.readImport(param_0);
}
-#pragma pop
/* 802928F4-80292918 28D234 0024+00 0/0 1/1 0/0 .text writePortSelf__8JASTrackFUlUs */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::writePortSelf(u32 param_0, u16 param_1) {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/writePortSelf__8JASTrackFUlUs.s"
+void JASTrack::writePortSelf(u32 param_0, u16 param_1) {
+ mTrackPort.writeExport(param_0, param_1);
}
-#pragma pop
/* 80292918-8029297C 28D258 0064+00 0/0 4/4 0/0 .text writePort__8JASTrackFUlUs */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::writePort(u32 param_0, u16 param_1) {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/writePort__8JASTrackFUlUs.s"
+void JASTrack::writePort(u32 param_0, u16 param_1) {
+ mTrackPort.writeImport(param_0, param_1);
+ if (param_0 == 0 || param_0 == 1) {
+ JASSeqCtrl::IntrType intr;
+ if (param_0 == 0) {
+ intr = JASSeqCtrl::INTRTYPE_VALUE_2;
+ } else {
+ intr = JASSeqCtrl::INTRTYPE_VALUE_3;
+ }
+ mSeqCtrl.interrupt(intr);
+ }
}
-#pragma pop
/* 8029297C-802929A0 28D2BC 0024+00 0/0 3/3 0/0 .text readPort__8JASTrackFUl */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm u16 JASTrack::readPort(u32 param_0) {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/readPort__8JASTrackFUl.s"
+u16 JASTrack::readPort(u32 param_0) {
+ return mTrackPort.readExport(param_0);
}
-#pragma pop
/* 802929A0-80292A3C 28D2E0 009C+00 1/1 0/0 0/0 .text setChannelPauseFlag__8JASTrackFb */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::setChannelPauseFlag(bool param_0) {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/setChannelPauseFlag__8JASTrackFb.s"
+void JASTrack::setChannelPauseFlag(bool i_pause) {
+ for (u32 i = 0; i < mChannelMgrCount; i++) {
+ if (mChannelMgrs[i] != NULL) {
+ mChannelMgrs[i]->setPauseFlag(i_pause);
+ }
+ }
+ for (int i = 0; i < 16; i++) {
+ if (mChildren[i] != NULL) {
+ mChildren[i]->setChannelPauseFlag(i_pause);
+ }
+ }
}
-#pragma pop
/* 80292A3C-80292AA4 28D37C 0068+00 0/0 2/2 0/0 .text pause__8JASTrackFb */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::pause(bool param_0) {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/pause__8JASTrackFb.s"
+void JASTrack::pause(bool i_pause) {
+ if (mFlags.pause != i_pause) {
+ mFlags.pause = i_pause;
+ setChannelPauseFlag(i_pause);
+ mSeqCtrl.interrupt(i_pause ? JASSeqCtrl::INTRTYPE_VALUE_0 : JASSeqCtrl::INTRTYPE_VALUE_1);
+ }
}
-#pragma pop
/* 80292AA4-80292AF4 28D3E4 0050+00 3/3 0/0 0/0 .text getTransposeTotal__8JASTrackCFv */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::getTransposeTotal() const {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/getTransposeTotal__8JASTrackCFv.s"
+int JASTrack::getTransposeTotal() const {
+ if (mParent != NULL) {
+ return mTranspose + mParent->getTransposeTotal();
+ } else {
+ return mTranspose;
+ }
}
-#pragma pop
/* 80292AF4-80292B58 28D434 0064+00 2/2 0/0 0/0 .text isMute__8JASTrackCFv */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::isMute() const {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/isMute__8JASTrackCFv.s"
+bool JASTrack::isMute() const {
+ if (mParent != NULL) {
+ return mFlags.mute || mParent->isMute();
+ } else {
+ return mFlags.mute;
+ }
}
-#pragma pop
/* 80292B58-80292B8C 28D498 0034+00 0/0 1/1 0/0 .text setTempo__8JASTrackFUs */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::setTempo(u16 param_0) {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/setTempo__8JASTrackFUs.s"
+void JASTrack::setTempo(u16 i_tempo) {
+ mTempo = i_tempo;
+ mFlags.flag5 = true;
+ updateTempo();
}
-#pragma pop
/* 80292B8C-80292BC0 28D4CC 0034+00 0/0 2/2 0/0 .text setTempoRate__8JASTrackFf */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::setTempoRate(f32 param_0) {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/setTempoRate__8JASTrackFf.s"
+void JASTrack::setTempoRate(f32 i_tempoRate) {
+ mTempoRate = i_tempoRate;
+ mFlags.flag5 = true;
+ updateTempo();
}
-#pragma pop
/* 80292BC0-80292BF4 28D500 0034+00 0/0 1/1 0/0 .text setTimebase__8JASTrackFUs */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::setTimebase(u16 param_0) {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/setTimebase__8JASTrackFUs.s"
+void JASTrack::setTimebase(u16 i_timebase) {
+ mTimebase = i_timebase;
+ mFlags.flag5 = true;
+ updateTempo();
}
-#pragma pop
/* ############################################################################################## */
/* 804555D4-804555D8 003BD4 0004+00 1/1 0/0 0/0 .sdata2 @1246 */
@@ -780,6 +1100,21 @@ SECTION_SDATA2 static f32 lit_1246 = 32767.0f;
/* 80292BF4-80292CA4 28D534 00B0+00 1/1 0/0 0/0 .text
* updateChannel__8JASTrackFP10JASChannelPQ26JASDsp8TChannel */
+#ifdef NONMATCHING
+// matches with literals
+void JASTrack::updateChannel(JASChannel* param_0, JASDsp::TChannel* param_1) {
+ param_0->setVibrate(mVibDepth, mVibPitch);
+ param_0->setTremolo(mTremDepth, mTremPitch);
+ if (mFilterMode & 0x20) {
+ param_1->setIIRFilterParam(mIIR);
+ }
+ if (mFilterMode & 0x1f) {
+ param_1->setFIR8FilterParam(mFIR);
+ }
+ param_1->setFilterMode(mFilterMode);
+ param_1->setDistFilter(mMoveParam[5].mValue * 32767.0f);
+}
+#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -788,70 +1123,148 @@ asm void JASTrack::updateChannel(JASChannel* param_0, JASDsp::TChannel* param_1)
#include "asm/JSystem/JAudio2/JASTrack/updateChannel__8JASTrackFP10JASChannelPQ26JASDsp8TChannel.s"
}
#pragma pop
+#endif
/* 80292CA4-80292D88 28D5E4 00E4+00 1/1 0/0 0/0 .text
* channelUpdateCallback__8JASTrackFUlP10JASChannelPQ26JASDsp8TChannelPv */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::channelUpdateCallback(u32 param_0, JASChannel* param_1,
- JASDsp::TChannel* param_2, void* param_3) {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/channelUpdateCallback__8JASTrackFUlP10JASChannelPQ26JASDsp8TChannelPv.s"
+void JASTrack::channelUpdateCallback(u32 param_0, JASChannel* param_1,
+ JASDsp::TChannel* param_2, void* param_3) {
+ TChannelMgr* channel_mgr = static_cast<TChannelMgr*>(param_3);
+ JASTrack* track = channel_mgr->mTrack;
+ switch (param_0) {
+ case 0:
+ case 1:
+ param_1->mParams = channel_mgr->mParams;
+ track->updateChannel(param_1, param_2);
+ break;
+ case 3:
+ param_1->release(0);
+ param_1->free();
+ channel_mgr->mChannels[0] = NULL;
+ break;
+ case 2:
+ for (int i = 0; i < 8; i++) {
+ if (param_1 == channel_mgr->mChannels[i]) {
+ channel_mgr->mChannels[i] = NULL;
+ break;
+ }
+ }
+ break;
+ }
}
-#pragma pop
/* 80292D88-80292DA0 28D6C8 0018+00 3/3 0/0 0/0 .text getRootTrack__8JASTrackFv */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::getRootTrack() {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/getRootTrack__8JASTrackFv.s"
+JASTrack* JASTrack::getRootTrack() {
+ JASTrack* track = this;
+ while (track->mParent != NULL) {
+ track = track->mParent;
+ }
+ return track;
}
-#pragma pop
/* 80292DA0-80292E9C 28D6E0 00FC+00 1/1 0/0 0/0 .text tickProc__8JASTrackFv */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::tickProc() {
+#ifdef NONMATCHING
+// matches with literals
+int JASTrack::tickProc() {
+ if (mFlags.pause) {
+ return 0;
+ }
+ int ret = mSeqCtrl.tickProc(this);
+ updateTimedParam();
+ mFlags.flag5 = true;
+ if (ret < 0) {
+ return -1;
+ }
+ for (int i = 0; i < 16; i++) {
+ JASTrack* child = mChildren[i];
+ if (child != NULL && child->mStatus == 1) {
+ ret = child->tickProc();
+ if (ret < 0) {
+ getRootTrack()->updateSeq(false, 1.0f);
+ child->close();
+ if (child->mFlags.autoDelete) {
+ delete child;
+ mChildren[i] = NULL;
+ }
+ }
+ }
+ }
+ return 0;
+}
+#else
+#pragma push
+#pragma optimization_level 0
+#pragma optimizewithasm off
+asm int JASTrack::tickProc() {
nofralloc
#include "asm/JSystem/JAudio2/JASTrack/tickProc__8JASTrackFv.s"
}
#pragma pop
+#endif
/* 80292E9C-80292F6C 28D7DC 00D0+00 1/1 0/0 0/0 .text seqMain__8JASTrackFv */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::seqMain() {
+#ifdef NONMATCHING
+// matches with literals
+int JASTrack::seqMain() {
+ if (mFlags.flag6) {
+ updateSeq(true, 1.0f);
+ close();
+ return -1;
+ } else {
+ while (field_0x1d8 >= 1.0f) {
+ field_0x1d8 -= 1.0f;
+ if (tickProc() < 0) {
+ updateSeq(false, 1.0f);
+ close();
+ return -1;
+ }
+ }
+ field_0x1d8 += field_0x1dc;
+ updateSeq(false, 1.0f);
+ return 0;
+ }
+}
+#else
+#pragma push
+#pragma optimization_level 0
+#pragma optimizewithasm off
+asm int JASTrack::seqMain() {
nofralloc
#include "asm/JSystem/JAudio2/JASTrack/seqMain__8JASTrackFv.s"
}
#pragma pop
+#endif
/* 80292F6C-80292F90 28D8AC 0024+00 1/1 0/0 0/0 .text cbSeqMain__Q28JASTrack5TListFPv */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::TList::cbSeqMain(void* param_0) {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/cbSeqMain__Q28JASTrack5TListFPv.s"
+s32 JASTrack::TList::cbSeqMain(void* i_this) {
+ static_cast<JASTrack::TList*>(i_this)->seqMain();
+ return 0;
}
-#pragma pop
/* 80292F90-8029301C 28D8D0 008C+00 1/1 0/0 0/0 .text append__Q28JASTrack5TListFP8JASTrack */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::TList::append(JASTrack* param_0) {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/append__Q28JASTrack5TListFP8JASTrack.s"
+void JASTrack::TList::append(JASTrack* i_track) {
+ if (!mCallbackRegistered) {
+ if (!JASDriver::registerSubFrameCallback(cbSeqMain, this)) {
+ return;
+ }
+ mCallbackRegistered = true;
+ }
+ Push_back(i_track);
}
-#pragma pop
/* 8029301C-802930DC 28D95C 00C0+00 1/1 0/0 0/0 .text seqMain__Q28JASTrack5TListFv */
+#ifdef NONMATCHING
+void JASTrack::TList::seqMain() {
+ for (iterator it = begin(); it != end(); it++) {
+ if (it->seqMain() < 0) {
+ Remove(&*it);
+ if (it->mFlags.autoDelete) {
+ delete &*it;
+ }
+ }
+ }
+}
+#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -860,8 +1273,20 @@ asm void JASTrack::TList::seqMain() {
#include "asm/JSystem/JAudio2/JASTrack/seqMain__Q28JASTrack5TListFv.s"
}
#pragma pop
+#endif
/* 802930DC-80293148 28DA1C 006C+00 2/2 0/0 0/0 .text __ct__Q28JASTrack11TChannelMgrFP8JASTrack */
+#ifdef NONMATCHING
+// matches with literals
+JASTrack::TChannelMgr::TChannelMgr(JASTrack* i_track) : mSoundParams(NULL), mTrack(i_track) {
+ for (int i = 0; i < 8; i++) {
+ mChannels[i] = NULL;
+ }
+ for (int i = 0; i < 8; i++) {
+ field_0x38[i] = 0;
+ }
+}
+#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -870,8 +1295,22 @@ asm JASTrack::TChannelMgr::TChannelMgr(JASTrack* param_0) {
#include "asm/JSystem/JAudio2/JASTrack/__ct__Q28JASTrack11TChannelMgrFP8JASTrack.s"
}
#pragma pop
+#endif
/* 80293148-802931B0 28DA88 0068+00 1/1 0/0 0/0 .text init__Q28JASTrack11TChannelMgrFv */
+#ifdef NONMATCHING
+// matches with literals
+void JASTrack::TChannelMgr::init() {
+ mSoundParams = NULL;
+ mParams.init();
+ for (int i = 0; i < 8; i++) {
+ mChannels[i] = NULL;
+ }
+ for (int i = 0; i < 8; i++) {
+ field_0x38[i] = 0;
+ }
+}
+#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -880,42 +1319,51 @@ asm void JASTrack::TChannelMgr::init() {
#include "asm/JSystem/JAudio2/JASTrack/init__Q28JASTrack11TChannelMgrFv.s"
}
#pragma pop
+#endif
/* 802931B0-80293220 28DAF0 0070+00 1/1 0/0 0/0 .text releaseAll__Q28JASTrack11TChannelMgrFv */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::TChannelMgr::releaseAll() {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/releaseAll__Q28JASTrack11TChannelMgrFv.s"
+void JASTrack::TChannelMgr::releaseAll() {
+ for (int i = 0; i < 8; i++) {
+ JASChannel* channel = mChannels[i];
+ if (channel != NULL) {
+ channel->release(0);
+ channel->free();
+ mChannels[i] = NULL;
+ }
+ }
}
-#pragma pop
/* 80293220-802932A0 28DB60 0080+00 3/3 0/0 0/0 .text noteOff__Q28JASTrack11TChannelMgrFUlUs */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::TChannelMgr::noteOff(u32 param_0, u16 param_1) {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/noteOff__Q28JASTrack11TChannelMgrFUlUs.s"
+bool JASTrack::TChannelMgr::noteOff(u32 i_channel, u16 param_1) {
+ JASChannel* channel = mChannels[i_channel];
+ if (channel == NULL) {
+ return false;
+ }
+ if (param_1 == 0) {
+ channel->release(0);
+ } else {
+ channel->release(param_1);
+ }
+ channel->free();
+ mChannels[i_channel] = NULL;
+ return true;
}
-#pragma pop
/* 802932A0-802932C8 28DBE0 0028+00 1/1 0/0 0/0 .text setPauseFlag__Q28JASTrack11TChannelMgrFb */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void JASTrack::TChannelMgr::setPauseFlag(bool param_0) {
- nofralloc
-#include "asm/JSystem/JAudio2/JASTrack/setPauseFlag__Q28JASTrack11TChannelMgrFb.s"
+void JASTrack::TChannelMgr::setPauseFlag(bool i_pause) {
+ for (int i = 0; i < 8; i++) {
+ if (mChannels[i] != NULL) {
+ mChannels[i]->setPauseFlag(i_pause);
+ }
+ }
}
-#pragma pop
/* 802932C8-802932E0 28DC08 0018+00 1/1 0/0 0/0 .text __ct__Q28JASTrack10MoveParam_Fv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
-asm JASTrack::MoveParam_::MoveParam_() {
+// asm JASTrack::MoveParam_::MoveParam_() {
+extern "C" asm void __ct__Q28JASTrack10MoveParam_Fv() {
nofralloc
#include "asm/JSystem/JAudio2/JASTrack/__ct__Q28JASTrack10MoveParam_Fv.s"
}
@@ -967,6 +1415,7 @@ SECTION_DATA extern void* __vt__11JASBankList[3 + 1 /* padding */] = {
NULL,
};
+#ifndef NONMATCHING
/* 80293388-8029345C 28DCC8 00D4+00 0/0 1/0 0/0 .text __sinit_JASTrack_cpp */
#pragma push
#pragma optimization_level 0
@@ -986,7 +1435,8 @@ REGISTER_CTORS(0x80293388, __sinit_JASTrack_cpp);
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
-asm JASTrack::TList::~TList() {
+// asm JASTrack::TList::~TList() {
+extern "C" asm void __dt__Q28JASTrack5TListFv() {
nofralloc
#include "asm/JSystem/JAudio2/JASTrack/__dt__Q28JASTrack5TListFv.s"
}
@@ -996,7 +1446,8 @@ asm JASTrack::TList::~TList() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
-asm JASDefaultBankTable::~JASDefaultBankTable() {
+// asm JASDefaultBankTable::~JASDefaultBankTable() {
+extern "C" asm void __dt__19JASDefaultBankTableFv() {
nofralloc
#include "asm/JSystem/JAudio2/JASTrack/__dt__19JASDefaultBankTableFv.s"
}
@@ -1011,3 +1462,4 @@ extern "C" asm void func_80293528(void* _this, u32 param_0) /* const */ {
#include "asm/JSystem/JAudio2/JASTrack/func_80293528.s"
}
#pragma pop
+#endif