diff options
| author | Caroline Madsen <69010899+randomsalience@users.noreply.github.com> | 2024-02-06 19:41:47 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-02-07 02:41:47 +0200 |
| commit | a825c39d93d22c40168f474e1186fe036f734fe0 (patch) | |
| tree | a75a87e9ac5e35e003695eae39fbf8bc38efa6cf /libs | |
| parent | c19d9b02be5d894f91cd45884eed67152dffffa4 (diff) | |
work on JASTrack (#2065)
Diffstat (limited to 'libs')
| -rw-r--r-- | libs/JSystem/JAudio2/JASBank.cpp | 5 | ||||
| -rw-r--r-- | libs/JSystem/JAudio2/JASDrumSet.cpp | 4 | ||||
| -rw-r--r-- | libs/JSystem/JAudio2/JASOscillator.cpp | 26 | ||||
| -rw-r--r-- | libs/JSystem/JAudio2/JASTrack.cpp | 1136 |
4 files changed, 812 insertions, 359 deletions
diff --git a/libs/JSystem/JAudio2/JASBank.cpp b/libs/JSystem/JAudio2/JASBank.cpp index aa5d3fc8d6..c752cfcf9c 100644 --- a/libs/JSystem/JAudio2/JASBank.cpp +++ b/libs/JSystem/JAudio2/JASBank.cpp @@ -138,8 +138,9 @@ asm JASChannel* JASBank::noteOn(JASBank const* param_0, int param_1, u8 param_2, /* ############################################################################################## */ /* 8039B190-8039B19C 0277F0 000C+00 1/0 0/0 0/0 .rodata OSC_RELEASE_TABLE$260 */ -SECTION_RODATA static s16 const OSC_RELEASE_TABLE[6] = { - 0x0001, 0x000A, 0x0000, 0x000F, 0x0000, 0x0000, +SECTION_RODATA static JASOscillator::Point const OSC_RELEASE_TABLE[2] = { + {0x0001, 0x000A, 0x0000}, + {0x000F, 0x0000, 0x0000}, }; COMPILER_STRIP_GATE(0x8039B190, &OSC_RELEASE_TABLE); diff --git a/libs/JSystem/JAudio2/JASDrumSet.cpp b/libs/JSystem/JAudio2/JASDrumSet.cpp index 984855067d..0320754549 100644 --- a/libs/JSystem/JAudio2/JASDrumSet.cpp +++ b/libs/JSystem/JAudio2/JASDrumSet.cpp @@ -77,9 +77,9 @@ bool JASDrumSet::getParam(int param_0, int param_1, JASInstParam* param_2) const param_2->field_0x18 = perc->field_0xc; osc._00 = 0; osc._04 = 1.0f; - osc._08 = NULL; + osc.mTable = NULL; osc._0C = NULL; - osc._10 = 1.0f; + osc.mScale = 1.0f; osc._14 = 0.0f; if (data_80451274[0] == 0) { diff --git a/libs/JSystem/JAudio2/JASOscillator.cpp b/libs/JSystem/JAudio2/JASOscillator.cpp index 14d8ddb47a..5674d0cf1d 100644 --- a/libs/JSystem/JAudio2/JASOscillator.cpp +++ b/libs/JSystem/JAudio2/JASOscillator.cpp @@ -52,14 +52,14 @@ void JASOscillator::initStart(JASOscillator::Data const* data) { return; } - if (mData->_08 == NULL) { + if (mData->mTable == NULL) { _1C = 2; _08 = 1.0f; return; } - _10 = mData->_08[2] / 32768.0f; - _18 = mData->_08[0]; + _10 = mData->mTable[0]._4 / 32768.0f; + _18 = mData->mTable[0]._0; _1C = 1; } @@ -79,7 +79,7 @@ void JASOscillator::incCounter(f32 param_0) { /* 8029BFC8-8029BFE4 296908 001C+00 0/0 1/1 0/0 .text getValue__13JASOscillatorCFv */ f32 JASOscillator::getValue() const { - return _08 * mData->_10 + mData->_14; + return _08 * mData->mScale + mData->_14; } /* 8029BFE4-8029C0E0 296924 00FC+00 0/0 1/1 0/0 .text release__13JASOscillatorFv */ @@ -100,12 +100,12 @@ void JASOscillator::release() { return; } - if (mData->_08 != mData->_0C) { + if (mData->mTable != mData->_0C) { _04 = 0.0f; _0C = _08; - _10 = mData->_0C[2] / 32768.0f; + _10 = mData->_0C[0]._4 / 32768.0f; _14 = 0; - _18 = mData->_0C[0]; + _18 = mData->_0C[0]._0; } _1C = 3; @@ -127,9 +127,9 @@ void JASOscillator::update() { if (_1C == 2) return; - const short* psVar1; + const Point* psVar1; if (_1C == 1) { - psVar1 = mData->_08; + psVar1 = mData->mTable; } else { psVar1 = mData->_0C; } @@ -139,12 +139,12 @@ void JASOscillator::update() { return; } - while (_04 >= psVar1[_14 * 3 + 1]) { - _04 -= psVar1[_14 * 3 + 1]; + while (_04 >= psVar1[_14]._2) { + _04 -= psVar1[_14]._2; _08 = _10; _14++; _0C = _08; - const s16* ps = &psVar1[_14 * 3]; + const s16* ps = &psVar1[_14]._0; switch(ps[0]) { case 0xf: _1C = 0; @@ -162,7 +162,7 @@ void JASOscillator::update() { } } - updateCurrentValue(psVar1[_14 * 3 + 1]); + updateCurrentValue(psVar1[_14]._2); } /* ############################################################################################## */ 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 |
