diff --git a/lib/NitroSDK/asm/snd_util.s b/lib/NitroSDK/asm/snd_util.s deleted file mode 100644 index 627c47f5..00000000 --- a/lib/NitroSDK/asm/snd_util.s +++ /dev/null @@ -1,40 +0,0 @@ - .include "asm/macros.inc" - .include "include/nitro.inc" - - .text - - arm_func_start Snd_CalcChannelVolume -Snd_CalcChannelVolume: ; 0x0207D540 - ldr r1, _0207D5A8 ; =0xFFFFFD2D - cmp r0, r1 - movlt r0, r1 - blt _0207D558 - cmp r0, #0 - movgt r0, #0 -_0207D558: - add r1, r0, #0xd3 - mvn r2, #0xef - cmp r0, r2 - ldr r3, _0207D5AC ; =VolumeTable - add r1, r1, #0x200 - ldrb r3, [r3, r1] - movlt r0, #3 - blt _0207D598 - add r1, r2, #0x78 - cmp r0, r1 - movlt r0, #2 - blt _0207D598 - add r1, r2, #0xb4 - cmp r0, r1 - movlt r0, #1 - movge r0, #0 -_0207D598: - orr r0, r3, r0, lsl #8 - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - bx lr - .align 2, 0 -_0207D5A8: .word 0xFFFFFD2D -_0207D5AC: .word VolumeTable - arm_func_end Snd_CalcChannelVolume - diff --git a/lib/NitroSDK/src/snd_util.c b/lib/NitroSDK/src/snd_util.c new file mode 100644 index 00000000..12e767bc --- /dev/null +++ b/lib/NitroSDK/src/snd_util.c @@ -0,0 +1,38 @@ +#include +#include + +#define SND_VOLUME_SHIFT_2_MIN -240 +#define SND_VOLUME_SHIFT_1_MIN -120 +#define SND_VOLUME_SHIFT_0_MIN -60 + +extern const u8 VolumeTable[SND_VOLUME_TABLE_SIZE]; + +u16 Snd_CalcChannelVolume (int dB) +{ + SNDChannelDataShift shift; + u8 volume; + + if (dB < SND_VOLUME_DB_MIN) { + dB = SND_VOLUME_DB_MIN; + } else if (dB > SND_VOLUME_DB_MAX) { + dB = SND_VOLUME_DB_MAX; + } + +#ifdef SND_USE_SYSTEM_ROM_TABLE + volume = SVC_GetVolumeTable(dB - SND_VOLUME_DB_MIN); +#else + volume = VolumeTable[dB - SND_VOLUME_DB_MIN]; +#endif + + if (dB < SND_VOLUME_SHIFT_2_MIN) { + shift = SND_CHANNEL_DATASHIFT_4BIT; + } else if (dB < SND_VOLUME_SHIFT_1_MIN) { + shift = SND_CHANNEL_DATASHIFT_2BIT; + } else if (dB < SND_VOLUME_SHIFT_0_MIN) { + shift = SND_CHANNEL_DATASHIFT_1BIT; + } else { + shift = SND_CHANNEL_DATASHIFT_NONE; + } + + return (u16)(shift << 8 | volume); +} diff --git a/lib/include/nitro/snd.h b/lib/include/nitro/snd.h index 56290a69..c9b41fa0 100644 --- a/lib/include/nitro/snd.h +++ b/lib/include/nitro/snd.h @@ -2,5 +2,6 @@ #define NITRO_SND_H_ #include +#include #endif //NITRO_SND_H_ diff --git a/lib/include/nitro/snd/common/channel.h b/lib/include/nitro/snd/common/channel.h new file mode 100644 index 00000000..56173a2c --- /dev/null +++ b/lib/include/nitro/snd/common/channel.h @@ -0,0 +1,189 @@ +#ifndef NITRO_SND_COMMON_CHANNEL_H_ +#define NITRO_SND_COMMON_CHANNEL_H_ + +#include + +// #if !(defined(SDK_WIN32) || defined(SDK_FROM_TOOL)) +// #include +// #include +// +// #ifdef SDK_ARM7 +// #include +// #endif +// #else +// #define HW_CPU_CLOCK_ARM7 33513982 +// #endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define SND_TIMER_CLOCK (HW_CPU_CLOCK_ARM7 / 2) + +#define SND_CHANNEL_NUM 16 +#define SND_CHANNEL_MIN 0 +#define SND_CHANNEL_MAX 15 + +#define SND_PSG_CHANNEL_MIN 8 +#define SND_PSG_CHANNEL_MAX 13 +#define SND_PSG_CHANNEL_NUM (SND_PSG_CHANNEL_MAX - SND_PSG_CHANNEL_MIN + 1) + +#define SND_NOISE_CHANNEL_MIN 14 +#define SND_NOISE_CHANNEL_MAX 15 +#define SND_NOISE_CHANNEL_NUM (SND_NOISE_CHANNEL_MAX - SND_NOISE_CHANNEL_MIN + 1) + +#define SND_CHANNEL_PAN_MIN 0 +#define SND_CHANNEL_PAN_CENTER 64 +#define SND_CHANNEL_PAN_MAX 0x7f + +#define SND_CHANNEL_VOLUME_MIN 0 +#define SND_CHANNEL_VOLUME_MAX 0x7f + +#define SND_CHANNEL_TIMER_MIN 0x10 +#define SND_CHANNEL_TIMER_MAX 0xffff + +#define SND_CHANNEL_LOOP_START_MAX 0xffff +#define SND_CHANNEL_LOOP_LEN_MAX 0x3fffff + +#define SND_CHANNEL_SAD_MASK 0x07fffffc + +#define SND_PCM_CHANNEL_MASK 0xffff +#define SND_PSG_CHANNEL_MASK 0x3f00 +#define SND_NOISE_CHANNEL_MASK 0xc000 +#define SND_CAPIN_CHANNEL_MASK 0x0005 +#define SND_CAPOUT_CHANNEL_MASK 0x000a + +#define SND_CHANNEL_STOP_HOLD (1 << 0) +#define SND_CHANNEL_REG_OFFSET(ch) ((ch) << 4) + +#ifdef SDK_ARM9 + #define REG_SND_SOUND0CNT_E_SHIFT 31 + #define REG_SND_SOUND0CNT_E_SIZE 1 + #define REG_SND_SOUND0CNT_E_MASK 0x80000000 + + #define REG_SND_SOUND0CNT_FORMAT_SHIFT 29 + #define REG_SND_SOUND0CNT_FORMAT_SIZE 2 + #define REG_SND_SOUND0CNT_FORMAT_MASK 0x60000000 + + #define REG_SND_SOUND0CNT_REPEAT_SHIFT 27 + #define REG_SND_SOUND0CNT_REPEAT_SIZE 2 + #define REG_SND_SOUND0CNT_REPEAT_MASK 0x18000000 + + #define REG_SND_SOUND0CNT_DUTY_SHIFT 24 + #define REG_SND_SOUND0CNT_DUTY_SIZE 3 + #define REG_SND_SOUND0CNT_DUTY_MASK 0x07000000 + + #define REG_SND_SOUND0CNT_PAN_SHIFT 16 + #define REG_SND_SOUND0CNT_PAN_SIZE 7 + #define REG_SND_SOUND0CNT_PAN_MASK 0x007f0000 + + #define REG_SND_SOUND0CNT_HOLD_SHIFT 15 + #define REG_SND_SOUND0CNT_HOLD_SIZE 1 + #define REG_SND_SOUND0CNT_HOLD_MASK 0x00008000 + + #define REG_SND_SOUND0CNT_SHIFT_SHIFT 8 + #define REG_SND_SOUND0CNT_SHIFT_SIZE 2 + #define REG_SND_SOUND0CNT_SHIFT_MASK 0x00000300 + + #define REG_SND_SOUND0CNT_VOLUME_SHIFT 0 + #define REG_SND_SOUND0CNT_VOLUME_SIZE 7 + #define REG_SND_SOUND0CNT_VOLUME_MASK 0x0000007f +#endif + +typedef enum { + SND_CHANNEL_0, + SND_CHANNEL_1, + SND_CHANNEL_2, + SND_CHANNEL_3, + SND_CHANNEL_4, + SND_CHANNEL_5, + SND_CHANNEL_6, + SND_CHANNEL_7, + SND_CHANNEL_8, + SND_CHANNEL_9, + SND_CHANNEL_10, + SND_CHANNEL_11, + SND_CHANNEL_12, + SND_CHANNEL_13, + SND_CHANNEL_14, + SND_CHANNEL_15 +} SNDChannelId; + +typedef enum { + SND_WAVE_FORMAT_PCM8, + SND_WAVE_FORMAT_PCM16, + SND_WAVE_FORMAT_ADPCM, + SND_WAVE_FORMAT_PSG, + SND_WAVE_FORMAT_NOISE = SND_WAVE_FORMAT_PSG +} SNDWaveFormat; + +typedef enum { + SND_CHANNEL_LOOP_MANUAL, + SND_CHANNEL_LOOP_REPEAT, + SND_CHANNEL_LOOP_1SHOT +} SNDChannelLoop; + +#define SND_CHANNEL_LOOP_REPAET SND_CHANNEL_LOOP_REPEAT + +typedef enum { + SND_DUTY_1_8, + SND_DUTY_2_8, + SND_DUTY_3_8, + SND_DUTY_4_8, + SND_DUTY_5_8, + SND_DUTY_6_8, + SND_DUTY_7_8 +} SNDDuty; + +typedef enum { + SND_CHANNEL_DATASHIFT_NONE, + SND_CHANNEL_DATASHIFT_1BIT, + SND_CHANNEL_DATASHIFT_2BIT, + SND_CHANNEL_DATASHIFT_4BIT +} SNDChannelDataShift; + +#ifdef SDK_ARM7 + #if !(defined(SDK_WIN32) || defined(SDK_FROM_TOOL)) + static inline void SND_StartChannel (int chNo) + { + SDK_MINMAX_ASSERT(chNo, SND_CHANNEL_MIN, SND_CHANNEL_MAX); + + *((REGType8v *)(REG_SOUND0CNT_8_ADDR + SND_CHANNEL_REG_OFFSET(chNo))) + |= REG_SND_SOUND0CNT_8_E_MASK; + } + #else + void SND_StartChannel(int chNo); + #endif +#endif + +#ifdef SDK_ARM7 + void SND_SetupChannelPcm(int chNo, + const void * dataaddr, + SNDWaveFormat format, + SNDChannelLoop loop, + int loopStart, + int loopLen, int volume, SNDChannelDataShift shift, int timer, int pan); + + void SND_SetupChannelPsg(int chNo, + SNDDuty duty, + int volume, SNDChannelDataShift shift, int timer, int pan); + + void SND_SetupChannelNoise(int chNo, int volume, SNDChannelDataShift shift, int timer, int pan); + void SND_StopChannel(int chNo, s32 flags); + void SND_SetChannelVolume(int chNo, int volume, SNDChannelDataShift shift); + void SND_SetChannelTimer(int chNo, int timer); + void SND_SetChannelPan(int chNo, int pan); + BOOL SND_IsChannelActive(int chNo); + void SND_SetMasterPan(int pan); + u32 SND_GetChannelControl(int chNo); +#endif + +#ifdef SDK_ARM7 + void SNDi_SetSurroundDecay(int decay); +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/include/nitro/snd/common/util.h b/lib/include/nitro/snd/common/util.h new file mode 100644 index 00000000..b712a540 --- /dev/null +++ b/lib/include/nitro/snd/common/util.h @@ -0,0 +1,72 @@ +#ifndef NITRO_SND_COMMON_UTIL_H_ +#define NITRO_SND_COMMON_UTIL_H_ + +#include + +// #if !(defined(SDK_WIN32) || defined(SDK_FROM_TOOL)) +// #include +// #else +// #define SDK_MINMAX_ASSERT(exp, min, max) ((void) 0) +// #endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define SND_PITCH_DIVISION_BIT 6 +#define SND_PITCH_DIVISION_RANGE (1 << SND_PITCH_DIVISION_BIT) + +#define SND_PITCH_TABLE_SIZE (12 * SND_PITCH_DIVISION_RANGE) +#define SND_PITCH_TABLE_BIAS 0x10000 +#define SND_PITCH_TABLE_SHIFT 16 + +#define SND_VOLUME_DB_MIN (-723) +#define SND_VOLUME_DB_MAX 0 +#define SND_VOLUME_TABLE_SIZE (SND_VOLUME_DB_MAX - SND_VOLUME_DB_MIN + 1) + +#define SND_CALC_DECIBEL_SCALE_MAX 127 + +#define SND_DECIBEL_TABLE_SIZE 128 +#define SND_DECIBEL_SQUARE_TABLE_SIZE 128 + +#define SND_SIN_TABLE_SIZE 32 +#define SND_SIN_PERIOD (SND_SIN_TABLE_SIZE * 4) + +// extern const s16 SNDi_DecibelTable[SND_DECIBEL_TABLE_SIZE]; +// extern const s16 SNDi_DecibelSquareTable[SND_DECIBEL_SQUARE_TABLE_SIZE]; + +// #ifndef _MSC_VER +// static inline +// #else +// __inline +// #endif +// s16 SND_CalcDecibel (int scale) +// { +// SDK_MINMAX_ASSERT(scale, 0, SND_CALC_DECIBEL_SCALE_MAX); +// return SNDi_DecibelTable[scale]; +// } +// +// #ifndef _MSC_VER +// static inline +// #else +// __inline +// #endif +// s16 SND_CalcDecibelSquare (int scale) +// { +// SDK_MINMAX_ASSERT(scale, 0, SND_CALC_DECIBEL_SCALE_MAX); +// return SNDi_DecibelSquareTable[scale]; +// } + +//u16 SND_CalcTimer(int orgTimer, int pitch); +u16 Snd_CalcChannelVolume(int dB); + +// #ifdef SDK_ARM7 +// u16 SND_CalcRandom(void); +// s8 SND_SinIdx(int index); +// #endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/main.lsf b/main.lsf index d34aaa16..33bbb7ef 100644 --- a/main.lsf +++ b/main.lsf @@ -272,7 +272,7 @@ Static main Object lib/NitroSDK/asm/snd_command.o Object lib/NitroSDK/asm/snd_alarm.o Object lib/NitroSDK/asm/snd_work.o - Object lib/NitroSDK/asm/snd_util.o + Object lib/NitroSDK/src/snd_util.o Object lib/NitroSDK/asm/snd_bank.o Object lib/NitroSDK/src/pxi_init.o Object lib/NitroSDK/asm/pxi_fifo.o