mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2025-08-21 13:53:49 -07:00
Audio decompiled and WIP custom sample support
This commit is contained in:
parent
5fcddaa066
commit
941c19f2c3
44 changed files with 2384 additions and 167 deletions
122
ZAPDTR/ZAPD/ZAudio.h
Normal file
122
ZAPDTR/ZAPD/ZAudio.h
Normal file
|
@ -0,0 +1,122 @@
|
|||
#pragma once
|
||||
|
||||
#include "ZResource.h"
|
||||
#include "tinyxml2.h"
|
||||
|
||||
struct AdsrEnvelope
|
||||
{
|
||||
int16_t delay;
|
||||
int16_t arg;
|
||||
};
|
||||
|
||||
struct AdpcmBook
|
||||
{
|
||||
/* 0x00 */ int32_t order;
|
||||
/* 0x04 */ int32_t npredictors;
|
||||
/* 0x08 */ std::vector<int16_t> books; // size 8 * order * npredictors. 8-byte aligned
|
||||
};
|
||||
|
||||
struct AdpcmLoop
|
||||
{
|
||||
/* 0x00 */ uint32_t start;
|
||||
/* 0x04 */ uint32_t end;
|
||||
/* 0x08 */ uint32_t count;
|
||||
///* 0x10 */ int16_t state[16]; // only exists if count != 0. 8-byte aligned
|
||||
/* 0x10 */ std::vector<int16_t> states;
|
||||
};
|
||||
|
||||
struct SampleEntry
|
||||
{
|
||||
uint8_t codec;
|
||||
uint8_t medium;
|
||||
uint8_t unk_bit26;
|
||||
uint8_t unk_bit25;
|
||||
|
||||
std::vector<uint8_t> data;
|
||||
AdpcmLoop loop;
|
||||
AdpcmBook book;
|
||||
};
|
||||
|
||||
struct SoundFontEntry
|
||||
{
|
||||
SampleEntry* sampleEntry = nullptr;
|
||||
float tuning;
|
||||
};
|
||||
|
||||
struct DrumEntry
|
||||
{
|
||||
uint8_t releaseRate;
|
||||
uint8_t pan;
|
||||
uint8_t loaded;
|
||||
uint32_t offset;
|
||||
float tuning;
|
||||
std::vector<AdsrEnvelope*> env;
|
||||
//AdsrEnvelope* env = nullptr;
|
||||
SampleEntry* sample = nullptr;
|
||||
};
|
||||
|
||||
struct InstrumentEntry
|
||||
{
|
||||
bool isValidInstrument;
|
||||
uint8_t loaded;
|
||||
uint8_t normalRangeLo;
|
||||
uint8_t normalRangeHi;
|
||||
uint8_t releaseRate;
|
||||
std::vector<AdsrEnvelope*> env;
|
||||
//AdsrEnvelope* env = nullptr;
|
||||
SoundFontEntry* lowNotesSound = nullptr;
|
||||
SoundFontEntry* normalNotesSound = nullptr;
|
||||
SoundFontEntry* highNotesSound = nullptr;
|
||||
};
|
||||
|
||||
struct AudioTableEntry
|
||||
{
|
||||
uint32_t ptr;
|
||||
uint32_t size;
|
||||
uint8_t medium;
|
||||
uint8_t cachePolicy;
|
||||
uint16_t data1;
|
||||
uint16_t data2;
|
||||
uint16_t data3;
|
||||
|
||||
std::vector<DrumEntry> drums;
|
||||
std::vector<SoundFontEntry*> soundEffects;
|
||||
std::vector<InstrumentEntry> instruments;
|
||||
};
|
||||
|
||||
class ZAudio : public ZResource
|
||||
{
|
||||
public:
|
||||
std::vector<AudioTableEntry> soundFontTable;
|
||||
std::vector<AudioTableEntry> sequenceTable;
|
||||
std::vector<AudioTableEntry> sampleBankTable;
|
||||
std::vector<std::vector<char>> sequences;
|
||||
std::map<uint32_t, SampleEntry*> samples;
|
||||
|
||||
ZAudio(ZFile* nParent);
|
||||
|
||||
void DecodeADPCMSample(SampleEntry* sample);
|
||||
std::vector<AdsrEnvelope*> ParseEnvelopeData(std::vector<uint8_t> audioBank, std::vector<uint8_t> audioTable,
|
||||
int envelopeOffset, int baseOffset);
|
||||
|
||||
SoundFontEntry* ParseSoundFontEntry(std::vector<uint8_t> audioBank,
|
||||
std::vector<uint8_t> audioTable,
|
||||
AudioTableEntry audioSampleBankEntry,
|
||||
int soundFontOffset,
|
||||
int baseOffset);
|
||||
|
||||
SampleEntry* ParseSampleEntry(std::vector<uint8_t> audioBank, std::vector<uint8_t> audioTable,
|
||||
AudioTableEntry audioSampleBankEntry,
|
||||
int sampleOffset, int baseOffset);
|
||||
|
||||
std::vector<AudioTableEntry> ParseAudioTable(std::vector<uint8_t> codeData, int baseOffset);
|
||||
void ParseSoundFont(std::vector<uint8_t> codeData, std::vector<uint8_t> audioTable,
|
||||
std::vector<AudioTableEntry> audioSampleBank, AudioTableEntry& entry);
|
||||
|
||||
void ParseRawData() override;
|
||||
|
||||
std::string GetSourceTypeName() const override;
|
||||
ZResourceType GetResourceType() const override;
|
||||
|
||||
size_t GetRawDataSize() const override;
|
||||
};
|
Loading…
Add table
Add a link
Reference in a new issue