more harp stuff

This commit is contained in:
robojumper
2025-07-16 23:20:26 +02:00
parent ba3092ca92
commit 81e2b78249
14 changed files with 457 additions and 36 deletions
+38
View File
@@ -3,6 +3,7 @@
#include "common.h"
#include "d/snd/d_snd_bgm_seq_data_mgr.h"
#include "d/snd/d_snd_bgm_sound_harp_mgr.h"
#include "d/snd/d_snd_harp_song_data.h"
#include "d/snd/d_snd_mgr.h"
#include "d/snd/d_snd_player_mgr.h"
#include "nw4r/snd/snd_SoundArchive.h"
@@ -68,3 +69,40 @@ void dSndBgmMmlParserHarp_c::NoteOnCommandProc(u32 trackNo, int wait, int key, i
default: break;
}
}
dSndBgmMmlParserHarpSong_c::dSndBgmMmlParserHarpSong_c()
: dSndBgmMmlParser_c(&dSndMgr_c::GetInstance()->getPlayer(), dSndMgr_c::GetInstance()->getArchive()) {
field_0x294 = nullptr;
}
bool dSndBgmMmlParserHarpSong_c::parseData(u32 soundId, dSndHarpSongData_c *pData) {
if (soundId == -1) {
return false;
}
if (pData == nullptr) {
return false;
}
field_0x294 = pData;
bool ok = loadAndParse(soundId, 0xFFFF, true);
field_0x294 = nullptr;
return ok;
}
void dSndBgmMmlParserHarpSong_c::CommandProc(u32 trackNo, int wait, u32 command, s32 commandArg1, s32 commandArg2)
const {
// no-op
}
void dSndBgmMmlParserHarpSong_c::NoteOnCommandProc(u32 trackNo, int wait, int key, int velocity, s32 length) const {
if (trackNo >= 0 && trackNo < 2) {
if (field_0x294 != nullptr) {
field_0x294->insert2(wait, key, trackNo);
}
} else if (trackNo == 15) {
if (field_0x294 != nullptr) {
field_0x294->insert1(wait, key);
}
}
}
+35
View File
@@ -1,7 +1,42 @@
#include "d/snd/d_snd_fi_vocal_mgr.h"
#include "d/snd/d_snd_harp_song_mgr.h"
#include "d/snd/d_snd_small_effect_mgr.h"
#include "d/snd/d_snd_util.h"
#include "d/snd/d_snd_wzsound.h"
#include "nw4r/snd/snd_SeqSoundHandle.h"
#include "nw4r/snd/snd_SoundHandle.h"
SND_DISPOSER_DEFINE(dSndFiVocalMgr_c);
dSndFiVocalMgr_c::dSndFiVocalMgr_c() {}
void dSndFiVocalMgr_c::executeOutputText(u16, u16) {
// no-op
}
bool dSndFiVocalMgr_c::startFiVocal(s16 pitch, s16 bank) {
nw4r::snd::SoundHandle &handle = dSndHarpSongMgr_c::GetInstance()->getFiSingHandle();
handle.Stop(3);
mSpeechHandle.Stop(3);
if (pitch < 0x39 || pitch > 0x4C) {
return false;
}
if (bank < 0 || bank >= 9) {
return false;
}
// Already stopped above, but again doesn't hurt
mSpeechHandle.Stop(3);
bool ok = dSndSmallEffectMgr_c::GetInstance()->playSoundInternalChecked(SE_NpcKen_VOCAL, &handle);
if (ok) {
nw4r::snd::SeqSoundHandle seqHandle(&handle);
seqHandle.WriteVariable(0, pitch - 0x30);
seqHandle.WriteVariable(2, bank + 0x1F);
}
return ok;
}
+113
View File
@@ -0,0 +1,113 @@
#include "d/snd/d_snd_harp_song_data.h"
#include "common.h"
#include "d/snd/d_snd_fi_vocal_mgr.h"
const s32 dSndHarpSongData_c::sNumHarpSongs = 6;
static const f32 sUnkSongVals[] = {
40.0f,
40.0f,
40.0f,
40.0f,
40.0f,
40.0f,
};
dSndHarpSongEntryBase_c::dSndHarpSongEntryBase_c(s16 count, s16 stride) : mCount(count), mStride(stride) {
mpData = new s16[count];
reset();
}
dSndHarpSongEntryBase_c::~dSndHarpSongEntryBase_c() {
delete[] mpData;
}
void dSndHarpSongEntryBase_c::reset() {
for (int i = 0; i < mCount; i++) {
mpData[i] = -1;
}
}
void dSndHarpSongEntryBase_c::insert(u32 idx, s16 value) {
// TODO - magic number
if (idx > 0x120) {
return;
}
u32 insert = 0;
while (mStride <= idx) {
insert++;
idx -= mStride;
}
mpData[insert] = value;
}
s32 dSndHarpSongEntryBase_c::get(u32 idx) const {
if (idx >= mCount) {
return -1;
}
return mpData[idx];
}
dSndHarpSongEntry1_c::dSndHarpSongEntry1_c() : dSndHarpSongEntryBase_c(NUM_ENTRIES_TYPE_1, NUM_ENTRIES_TYPE_1 / 2) {
reset();
for (s32 i = 0; i < NUM_ENTRIES_TYPE_1; i++) {
mStaticValues[i] = 0;
}
}
void dSndHarpSongEntry1_c::loadStaticData(s32 i1, u32 i2, s32 i3) {
for (s32 i = 0; i < NUM_ENTRIES_TYPE_1; i++) {
if (get(i) > 0) {
mStaticValues[i] = dSndFiVocalMgr_c::GetInstance()->getStaticSongValue(i1, i2, i3, i);
}
}
}
s16 dSndHarpSongEntry1_c::getStaticDatum(u32 idx) const {
if (idx >= NUM_ENTRIES_TYPE_1) {
return -1;
}
return mStaticValues[idx];
}
dSndHarpSongData_c::dSndHarpSongData_c() : field_0x0C(30.0f) {
init(0);
}
void dSndHarpSongData_c::init(u32 idx) {
if (idx >= sNumHarpSongs) {
return;
}
mIndex = idx;
mSoundId = -1;
field_0x08 = 0;
for (s32 i1 = 0; i1 < 4; i1++) {
for (u32 i2 = 0; i2 < 2; i2++) {
for (s32 i3 = 0; i3 < 2; i3++) {
mEntries2[i1][i2][i3].reset();
}
field_0x90[i1][i2] = 0;
}
}
field_0x0C = sUnkSongVals[mIndex];
loadStaticValues();
}
void dSndHarpSongData_c::loadStaticValues() {
for (s32 i1 = 0; i1 < 4; i1++) {
for (u32 i2 = 0; i2 < 2; i2++) {
mEntries1[i1][i2].loadStaticData(mIndex, i1, i2);
}
}
}
void dSndHarpSongData_c::insert2(u32 key, s16 value, s32) {
// TODO
}
void dSndHarpSongData_c::insert1(u32 key, s16 value) {
// TODO
}
+80 -1
View File
@@ -1,7 +1,86 @@
#include "d/snd/d_snd_harp_song_mgr.h"
#include "common.h"
#include "d/snd/d_snd_bgm_mml_parsers.h"
#include "d/snd/d_snd_harp_song_data.h"
#include "d/snd/d_snd_util.h"
#include "d/snd/d_snd_wzsound.h"
SND_DISPOSER_DEFINE(dSndHarpSongMgr_c);
dSndHarpSongMgr_c::dSndHarpSongMgr_c() {}
dSndHarpSongMgr_c::dSndHarpSongMgr_c()
: field_0x010(0),
field_0x011(0),
mDataLoaded(false),
field_0x014(0),
field_0x018(0),
field_0x01C(0),
field_0x020(0),
field_0x024(0),
field_0x028(0),
field_0x02C(0),
field_0x030(0),
field_0x034(0),
field_0x038(0.0f),
field_0x03C(1.0f),
field_0x040(0),
field_0x041(0),
field_0x042(0),
field_0x043(0),
field_0x044(1),
field_0x048(0),
field_0x04C(3),
field_0x050(3),
field_0x054(3),
field_0x064(0),
field_0x068(0),
field_0x070(0),
field_0x078(0),
mpTmpData(nullptr),
field_0x5AC(0),
field_0x5B4(0),
field_0x5B8(0),
field_0x5BC(0),
field_0x5C0(4),
field_0x5C4(4) {
resetFloatArr1();
resetFloatArr2();
field_0x058 = 3;
field_0x05C = 3;
field_0x060 = 3;
mpData = new dSndHarpSongData_c[dSndHarpSongData_c::sNumHarpSongs];
}
void dSndHarpSongMgr_c::setup() {
// no-op
}
void dSndHarpSongMgr_c::setupState0() {
if (mDataLoaded) {
return;
}
dSndBgmMmlParserHarpSong_c parser;
for (int i = 0; i < dSndHarpSongData_c::sNumHarpSongs; i++) {
mpData[i].init(i);
u32 soundId = LABEL_HARP_TONE_RAW_START + 1 + i;
parser.parseData(soundId, mpData + i);
mpData[i].setSoundId(soundId);
mpData[i].loadStaticValues();
}
mDataLoaded = true;
}
void dSndHarpSongMgr_c::resetFloatArr1() {
for (int i = 0; i < 300; i++) {
field_0x07C[i] = 0.0f;
}
}
void dSndHarpSongMgr_c::resetFloatArr2() {
for (int i = 0; i < 30; i++) {
field_0x52C[i] = 0.0f;
}
}
+6 -2
View File
@@ -386,6 +386,10 @@ u32 dSndStateMgr_c::getSeCameraId() {
return convertSeLabelToSoundId(label);
}
void dSndStateMgr_c::clearExecuteCallback() {
sEventExecuteCallback = nullptr;
}
void dSndStateMgr_c::handleSeLv() {
SizedString<0x40> name = mSeName;
name += "_LV";
@@ -480,7 +484,7 @@ void dSndStateMgr_c::onMsgWaitStart() {
}
SizedString<64> label;
label.sprintf("_%M_WS%d", mMsgCounter, mMsgWaitSelectCounter);
label.sprintf("_M%d_WS%d", mMsgCounter, mMsgWaitSelectCounter);
doLabelSuffix(label);
}
@@ -490,7 +494,7 @@ void dSndStateMgr_c::onMsgWaitEnd() {
}
SizedString<64> label;
label.sprintf("_%M_WE%d", mMsgCounter, mMsgWaitSelectCounter);
label.sprintf("_M%d_WE%d", mMsgCounter, mMsgWaitSelectCounter);
doLabelSuffix(label);
}