#ifndef JASBNKPARSER_H #define JASBNKPARSER_H #include "JSystem/JAudio2/JASOscillator.h" #include "JSystem/JSupport/JSupport.h" class JASBank; class JASBasicBank; class JKRHeap; namespace JASBNKParser { struct TFileHeader { /* 0x0 */ BE(int) id; /* 0x4 */ BE(u32) mSize; /* 0x8 */ u8 _08[4]; /* 0xC */ BE(u32) mVersion; }; namespace Ver1 { struct TOsc { /* 0x00 */ BE(u32) id; /* 0x04 */ u8 mTarget; /* 0x08 */ BE(f32) _08; /* 0x0C */ BE(u32) mTableOffset; /* 0x10 */ BE(u32) _10; /* 0x14 */ BE(f32) mScale; /* 0x18 */ BE(f32) _18; }; struct TPercData { /* 0x00 */ BE(f32) mVolume; /* 0x04 */ BE(f32) mPitch; /* 0x08 */ u8 mPan; /* 0x0A */ BE(u16) mRelease; /* 0x0C */ BE(u32) field_0xc; }; struct TChunk { /* 0x0 */ BE(u32) mID; /* 0x4 */ BE(u32) mSize; }; struct TEnvtChunk : TChunk { /* 0x8 */ u8 mData[0]; }; struct TOscChunk : TChunk { /* 0x8 */ BE(u32) mCount; /* 0xC */ TOsc mOsc[0]; }; struct TListChunk : TChunk { /* 0x8 */ BE(u32) count; /* 0xC */ BE(u32) mOffsets[0]; }; TChunk* findChunk(void const*, u32); JASBasicBank* createBasicBank(void const*, JKRHeap*); }; namespace Ver0 { template struct TOffset { /* 0x0 */ u32 offset; T* ptr(void const* stream) const { return JSUConvertOffsetToPtr(stream, offset); } }; struct TOsc { /* 0x00 */ u8 mTarget; /* 0x04 */ BE(f32) field_0x4; /* 0x08 */ TOffset mPointOffset; /* 0x0C */ TOffset field_0xc; /* 0x10 */ BE(f32) mScale; /* 0x14 */ BE(f32) field_0x14; }; struct TVmap { /* 0x00 */ u8 field_0x0[4]; /* 0x04 */ BE(u32) field_0x4; /* 0x08 */ BE(f32) field_0x8; /* 0x0C */ BE(f32) field_0xc; }; struct TKeymap { /* 0x00 */ u8 mHighKey; /* 0x01 */ u8 field_0x1[7]; /* 0x08 */ TOffset mVmapOffset; }; struct TInst { /* 0x00 */ u8 field_0x0[8]; /* 0x08 */ BE(f32) mVolume; /* 0x0C */ BE(f32) mPitch; /* 0x10 */ TOffset mOscOffset[2]; /* 0x18 */ u8 field_0x18[0x10]; /* 0x28 */ BE(u32) mKeyRegionCount; /* 0x2C */ TOffset mKeymapOffset[0]; }; struct TPmap { /* 0x00 */ BE(f32) mVolume; /* 0x04 */ BE(f32) mPitch; /* 0x08 */ u8 field_0x8[0xc]; /* 0x14 */ TOffset mVmapOffset; }; struct TPerc { /* 0x000 */ BE(u32) mMagic; /* 0x000 */ u8 field_0x0[0x84]; /* 0x088 */ TOffset mPmapOffset[0x80]; /* 0x288 */ s8 mPan[0x80]; /* 0x308 */ BE(u16) mRelease[0x80]; }; struct TOffsetData { /* 0x000 */ u8 field_0x20[4]; /* 0x004 */ TOffset mInstOffset[0x80]; /* 0x204 */ u8 field_0x204[0x190]; /* 0x394 */ TOffset mPercOffset[12]; }; struct THeader { /* 0x00 */ u8 field_0x0[0x20]; /* 0x20 */ TOffsetData mOffsets; }; JASBasicBank* createBasicBank(void const*, JKRHeap*); JASOscillator::Data* findOscPtr(JASBasicBank*, THeader const*, TOsc const*); JASOscillator::Point const* getOscTableEndPtr(JASOscillator::Point const*); }; JASBank* createBank(void const*, JKRHeap*); JASBasicBank* createBasicBank(void const*, JKRHeap*); inline u32 getBankNumber(const void* param_0) { BE(u32)* ptr = (BE(u32)*)param_0; return ptr[2]; } extern u32 sUsedHeapSize; }; #endif /* JASBNKPARSER_H */