diff --git a/configure.py b/configure.py index d0dd67cd..b66db63a 100755 --- a/configure.py +++ b/configure.py @@ -187,21 +187,22 @@ cflags_retro = [ "-common on", ] -### MusyX 1.5.3 (debug) -# "mw_version": "1.2.5", -# "cflags": "-proc gecko -fp hard -nodefaults -nosyspath -i include -i libc -g -sym on -D_DEBUG=1 -enum int -DMUSY_VERSION_MAJOR=1 -DMUSY_VERSION_MINOR=5 -DMUSY_VERSION_PATCH=3", - -### MusyX 2.0.3 (debug) -# "mw_version": "1.3.2", -# "cflags": "-proc gecko -fp hard -nodefaults -nosyspath -i include -i libc -g -sym on -D_DEBUG=1 -enum int -DMUSY_VERSION_MAJOR=2 -DMUSY_VERSION_MINOR=0 -DMUSY_VERSION_PATCH=3", - cflags_musyx = [ *cflags_base, "-str reuse,pool,readonly", "-fp_contract off", - "-DMUSY_VERSION_MAJOR=1", - "-DMUSY_VERSION_MINOR=5", - "-DMUSY_VERSION_PATCH=4", +] + +cflags_musyx_debug = [ + "-proc gecko", + "-fp hard", + "-nodefaults", + "-nosyspath", + "-i include", + "-i libc", + "-g -sym on -D_DEBUG=1", + "-enum int", + "-D_MATH_INLINE=static", ] # REL flags @@ -235,6 +236,22 @@ def RetroLib(lib_name, objects): } +def MusyX(objects, mw_version="GC/1.3.2", debug=False, major=1, minor=5, patch=4): + cflags = cflags_musyx if not debug else cflags_musyx_debug + return { + "lib": "MusyX", + "mw_version": mw_version, + "host": False, + "cflags": [ + *cflags, + f"-DMUSY_VERSION_MAJOR={major}", + f"-DMUSY_VERSION_MINOR={minor}", + f"-DMUSY_VERSION_PATCH={patch}", + ], + "objects": objects, + } + + # Helper function for REL script objects def Rel(lib_name, objects): return { @@ -1138,12 +1155,13 @@ config.libs = [ Object(Matching, "Runtime/math_ppc.c"), ], }, - { - "lib": "musyx", - "mw_version": "GC/1.3.2", - "cflags": cflags_musyx, - "host": False, - "objects": [ + MusyX( + # debug=True, + # mw_version="GC/1.2.5", + # major=1, + # minor=5, + # patch=3, + objects=[ Object(Matching, "musyx/runtime/seq.c"), Object(Matching, "musyx/runtime/synth.c"), Object(Matching, "musyx/runtime/seq_api.c"), @@ -1177,7 +1195,7 @@ config.libs = [ Object(Matching, "musyx/runtime/Chorus/chorus_fx.c"), Object(Matching, "musyx/runtime/profile.c"), ], - }, + ), { "lib": "txwin", "mw_version": "GC/1.2.5n", diff --git a/src/musyx/runtime/synth_adsr.c b/src/musyx/runtime/synth_adsr.c index 5c6144e0..629d7f26 100644 --- a/src/musyx/runtime/synth_adsr.c +++ b/src/musyx/runtime/synth_adsr.c @@ -7,7 +7,7 @@ extern float powf(float, float); static u32 adsrGetIndex(ADSR_VARS* adsr) { - long i = 193 - ((adsr->currentIndex + 0x8000) >> 16); + s32 i = 193 - ((adsr->currentIndex + 0x8000) >> 16); return i < 0 ? 0 : i; } @@ -55,11 +55,28 @@ u32 adsrStartRelease(ADSR_VARS* adsr, u32 rtime) { } u32 adsrRelease(ADSR_VARS* adsr) { - switch(adsr->mode) { - case 0: - case 1: + switch (adsr->mode) { + case 0: + case 1: return adsrStartRelease(adsr, adsr->data.dls.rTime); } return FALSE; } + +u32 adsrHandle(ADSR_VARS* adsr, u16* adsr_start, u16* adsr_delta) { + s32 old_volume; // r29 + bool VoiceDone; // r28 + s32 vDelta; // r27 +} +u32 adsrHandleLowPrecision(ADSR_VARS* adsr, u16* adsr_start, u16* adsr_delta) { + u8 i; // r31 + + for (i = 0; i < 15; ++i) { + if (adsrHandle(adsr, adsr_start, adsr_delta)) { + return 1; + } + } + + return 0; +} diff --git a/src/musyx/runtime/synthdata.c b/src/musyx/runtime/synthdata.c index 1f522628..d5a894a7 100644 --- a/src/musyx/runtime/synthdata.c +++ b/src/musyx/runtime/synthdata.c @@ -15,40 +15,46 @@ static MAC_SUBTAB dataMacSubTabmem[2048]; static u16 dataFXGroupNum = 0; static FX_GROUP dataFXGroups[128]; -// #line 94 u32 dataInsertKeymap(u16 cid, void* keymapdata) { long i; // r31 long j; // r29 - hwDisableIrq(); for (i = 0; i < dataKeymapNum && dataKeymapTab[i].id < cid; ++i) ; if (i < dataKeymapNum) { + if (cid != dataKeymapTab[i].id) { + if (dataKeymapNum < 256) { - for (j = dataKeymapNum - 1; j >= i; --j) { + + for (j = dataKeymapNum - 1; j >= i; --j) dataKeymapTab[j + 1] = dataKeymapTab[j]; - } ++dataKeymapNum; + } else { + hwEnableIrq(); return 0; } } else { + dataKeymapTab[i].refCount++; hwEnableIrq(); return 0; } + } else if (dataKeymapNum < 256) { + ++dataKeymapNum; + } else { + hwEnableIrq(); return 0; } - ++dataKeymapNum; - MUSY_ASSERT_MSG(keymapdata != NULL, "Keymap data pointer is NULL"); + dataKeymapTab[i].id = cid; dataKeymapTab[i].data = keymapdata; dataKeymapTab[i].refCount = 1; @@ -59,23 +65,126 @@ u32 dataInsertKeymap(u16 cid, void* keymapdata) { unsigned long dataRemoveKeymap(unsigned short sid) { long i; // r31 long j; // r30 + + hwDisableIrq(); + for (i = 0; i < dataKeymapNum && dataKeymapTab[i].id != sid; ++i) + ; + + if (i != dataKeymapNum) { + for (j = i + 1; j < dataKeymapNum; j++, i++) { + dataKeymapTab[i] = dataKeymapTab[j]; + } + } + + hwEnableIrq(); + return 1; } + unsigned long dataInsertLayer(unsigned short cid, void* layerdata, unsigned short size) { long i; // r31 long j; // r29 + + hwDisableIrq(); + + for (i = 0; i < dataLayerNum && dataLayerTab[i].id < cid; ++i) + ; + + if (i < dataLayerNum) { + + if (cid != dataLayerTab[i].id) { + + if (dataLayerNum < 256) { + + for (j = dataLayerNum - 1; j >= i; --j) + dataLayerTab[j + 1] = dataLayerTab[j]; + ++dataLayerNum; + + } else { + + hwEnableIrq(); + return 0; + } + } else { + + dataLayerTab[i].refCount++; + hwEnableIrq(); + return 0; + } + + } else if (dataLayerNum < 256) { + ++dataLayerNum; + } else { + + hwEnableIrq(); + return 0; + } + + MUSY_ASSERT_MSG(layerdata != NULL, "Layer data pointer is NULL"); + + dataLayerTab[i].id = cid; + dataLayerTab[i].data = layerdata; + dataLayerTab[i].num = size; + dataLayerTab[i].refCount = 1; + hwEnableIrq(); + return 1; } + unsigned long dataRemoveLayer(unsigned short sid) { long i; // r31 long j; // r30 } + unsigned long dataInsertCurve(unsigned short cid, void* curvedata) { long i; // r31 long j; // r29 + + hwDisableIrq(); + + for (i = 0; i < dataCurveNum && dataCurveTab[i].id < cid; ++i) + ; + + if (i < dataCurveNum) { + + if (cid != dataCurveTab[i].id) { + + if (dataCurveNum < 2048) { + + for (j = dataCurveNum - 1; j >= i; --j) + dataCurveTab[j + 1] = dataCurveTab[j]; + ++dataCurveNum; + + } else { + hwEnableIrq(); + return 0; + } + } else { + hwEnableIrq(); + dataCurveTab[i].refCount++; + return 0; + } + + } else if (dataCurveNum < 2048) { + ++dataCurveNum; + } else { + + hwEnableIrq(); + return 0; + } + + MUSY_ASSERT_MSG(curvedata != NULL, "Curve data pointer is NULL"); + + dataCurveTab[i].id = cid; + dataCurveTab[i].data = curvedata; + dataCurveTab[i].refCount = 1; + hwEnableIrq(); + return 1; } + unsigned long dataRemoveCurve(unsigned short sid) { long i; // r31 long j; // r30 } + unsigned long dataInsertSDir(struct SDIR_DATA* sdir, void* smp_data) { long i; // r31 struct SDIR_DATA* s; // r25 @@ -83,40 +192,49 @@ unsigned long dataInsertSDir(struct SDIR_DATA* sdir, void* smp_data) { unsigned short j; // r29 unsigned short k; // r26 } + unsigned long dataRemoveSDir(struct SDIR_DATA* sdir) { long i; // r28 long j; // r30 long index; // r27 struct SDIR_DATA* data; // r31 } + unsigned long dataAddSampleReference(unsigned short sid) { unsigned long i; // r29 struct SAMPLE_HEADER* header; // r1+0xC struct SDIR_DATA* data; // r30 struct SDIR_DATA* sdir; // r31 } + unsigned long dataRemoveSampleReference(unsigned short sid) { unsigned long i; // r30 struct SDIR_DATA* sdir; // r31 } + unsigned long dataInsertFX(unsigned short gid, struct FX_TAB* fx, unsigned short fxNum) { long i; // r31 } + unsigned long dataRemoveFX(unsigned short gid) { long i; // r31 long j; // r30 + return 1; } + unsigned long dataInsertMacro(unsigned short mid, void* macroaddr) { long main; // r28 long pos; // r29 long base; // r27 long i; // r31 } + unsigned long dataRemoveMacro(unsigned short mid) { long main; // r29 long base; // r28 long i; // r31 } + long maccmp(void* p1, void* p2) { return ((MAC_SUBTAB*)p1)->id - ((MAC_SUBTAB*)p2)->id; } struct MSTEP* dataGetMacro(unsigned short mid) {