Removed last table data from audio

This commit is contained in:
KiritoDv
2024-02-01 17:37:13 -06:00
parent dadf7414ee
commit b964a4db92
7 changed files with 110 additions and 1428 deletions
+45 -7
View File
@@ -253,6 +253,7 @@ void Companion::Process() {
SPDLOG_INFO("Hash: {}", this->gCartridge->GetHash());
SPDLOG_INFO("Assets: {}", path);
AudioManager::Instance = new AudioManager();
auto wrapper = this->gConfig.exporterType == ExportType::Binary ? new SWrapper(this->gConfig.outputPath) : nullptr;
auto vWriter = LUS::BinaryWriter();
@@ -277,15 +278,52 @@ void Companion::Process() {
for(auto asset = root.begin(); asset != root.end(); ++asset){
auto node = asset->second;
auto entryName = asset->first.as<std::string>();
if(!asset->second["offset"]) {
continue;
// Parse horizontal assets
if(node["files"]){
auto segment = node["segment"] ? node["segment"].as<uint8_t>() : -1;
const auto files = node["files"];
for (const auto& file : files) {
auto assetNode = file.as<YAML::Node>();
auto childName = assetNode["name"].as<std::string>();
auto output = (this->gCurrentDirectory / entryName / childName).string();
std::replace(output.begin(), output.end(), '\\', '/');
if(assetNode["type"]){
const auto type = GetSafeNode<std::string>(assetNode, "type");
if(type == "SAMPLE"){
AudioManager::Instance->bind_sample(assetNode, output);
}
}
if(!assetNode["offset"]) {
continue;
}
if(segment != -1) {
assetNode["offset"] = (segment << 24) | assetNode["offset"].as<uint32_t>();
}
this->gAddrMap[this->gCurrentFile][assetNode["offset"].as<uint32_t>()] = std::make_tuple(output, assetNode);
}
} else {
auto output = (this->gCurrentDirectory / entryName).string();
std::replace(output.begin(), output.end(), '\\', '/');
if(node["type"]){
const auto type = GetSafeNode<std::string>(node, "type");
if(type == "SAMPLE"){
AudioManager::Instance->bind_sample(node, output);
}
}
if(!node["offset"]) {
continue;
}
this->gAddrMap[this->gCurrentFile][node["offset"].as<uint32_t>()] = std::make_tuple(output, node);
}
auto output = (this->gCurrentDirectory / asset->first.as<std::string>()).string();
std::replace(output.begin(), output.end(), '\\', '/');
this->gAddrMap[this->gCurrentFile][node["offset"].as<uint32_t>()] = std::make_tuple(output, node);
}
// Stupid hack because the iteration broke the assets
+21 -6
View File
@@ -6,6 +6,8 @@
#include <filesystem>
#include <cassert>
#include <cstring>
#include <factories/BaseFactory.h>
#include "hj/zip.h"
#include "hj/pyutils.h"
#include "spdlog/spdlog.h"
@@ -13,6 +15,7 @@
#include "spdlog/spdlog.h"
std::unordered_map<std::string, uint32_t> name_table;
std::unordered_map<uint32_t, std::string> sample_table;
AudioManager* AudioManager::Instance;
std::vector<uint32_t> PyUtils::range(uint32_t start, uint32_t end) {
@@ -606,14 +609,14 @@ void AudioManager::write_aifc(AudioBankSample* entry, LUS::BinaryWriter &out) {
if(entry->loop.count != 0){
START_CUSTOM_SECTION("\x0bVADPCMLOOPS")
uint16_t one = BSWAP16(1);
tmp.Write((char*) &one, 2);
tmp.Write((char*) &one, 2);
tmp.Write((uint32_t) entry->loop.start);
tmp.Write((uint32_t) entry->loop.end);
tmp.Write((int32_t) entry->loop.count);
tmp.Write(reinterpret_cast<char*>(&one), 2);
tmp.Write(reinterpret_cast<char*>(&one), 2);
tmp.Write(entry->loop.start);
tmp.Write(entry->loop.end);
tmp.Write(entry->loop.count);
for(size_t i = 0; i < 16; i++){
int16_t loop = BSWAP16(entry->loop.state.value()[i]);
tmp.Write((char*) &loop, 2);
tmp.Write(reinterpret_cast<char*>(&loop), 2);
}
END_SECTION();
}
@@ -624,6 +627,18 @@ void AudioManager::write_aifc(AudioBankSample* entry, LUS::BinaryWriter &out) {
}
void AudioManager::bind_sample(YAML::Node& node, const std::string& path){
auto id = GetSafeNode<uint32_t>(node, "id");
sample_table[id] = path;
}
std::string& AudioManager::get_sample(uint32_t id) {
if(!sample_table.contains(id)) {
throw std::runtime_error("Failed to find sample with id " + std::to_string(id));
}
return sample_table[id];
}
void AudioManager::create_aifc(int32_t index, LUS::BinaryWriter &out) {
int32_t idx = -1;
for(auto &sample_bank : this->loaded_tbl.banks){
+2
View File
@@ -138,7 +138,9 @@ class AudioManager {
public:
static AudioManager* Instance;
void initialize(std::vector<uint8_t>& buffer, YAML::Node& data);
void bind_sample(YAML::Node& node, const std::string& path);
void create_aifc(int32_t index, LUS::BinaryWriter& writer);
std::string& get_sample(uint32_t id);
AudioBankSample get_aifc(int32_t index);
std::map<uint32_t, Bank> get_banks();
uint32_t get_index(AudioBankSample* bank);
File diff suppressed because it is too large Load Diff
-1
View File
@@ -4,7 +4,6 @@
#include "audio/AudioManager.h"
std::optional<std::shared_ptr<IParsedData>> AudioHeaderFactory::parse(std::vector<uint8_t>& buffer, YAML::Node& data) {
AudioManager::Instance = new AudioManager();
AudioManager::Instance->initialize(buffer, data);
return std::nullopt;
}
+39 -41
View File
@@ -1,6 +1,5 @@
#include "BankFactory.h"
#include "Companion.h"
#include "audio/samples_table.h"
void BankBinaryExporter::Export(std::ostream &write, std::shared_ptr<IParsedData> raw, std::string& entryName, YAML::Node &node, std::string* replacement ) {
auto writer = LUS::BinaryWriter();
@@ -8,78 +7,78 @@ void BankBinaryExporter::Export(std::ostream &write, std::shared_ptr<IParsedData
WriteHeader(writer, LUS::ResourceType::Bank, 0);
writer.Write(bank->mBankId);
writer.Write((uint32_t) bank->mBank.insts.size());
writer.Write(static_cast<uint32_t>(bank->mBank.insts.size()));
for (auto& instrument : bank->mBank.insts) {
writer.Write((uint8_t) instrument.valid);
writer.Write(static_cast<uint8_t>(instrument.valid));
if(!instrument.valid) continue;
writer.Write((uint8_t) instrument.releaseRate);
writer.Write((uint8_t) instrument.normalRangeLo);
writer.Write((uint8_t) instrument.normalRangeHi);
writer.Write(instrument.releaseRate);
writer.Write(instrument.normalRangeLo);
writer.Write(instrument.normalRangeHi);
auto envelope = bank->mBank.envelopes[instrument.envelope];
if(!envelope.entries.empty()){
writer.Write((uint32_t) envelope.entries.size());
for (auto& entry : envelope.entries) {
writer.Write((uint16_t) entry.delay);
writer.Write((uint16_t) entry.arg);
auto [name, entries] = bank->mBank.envelopes[instrument.envelope];
if(!entries.empty()){
writer.Write(static_cast<uint32_t>(entries.size()));
for (auto& [delay, arg] : entries) {
writer.Write(static_cast<uint16_t>(delay));
writer.Write(static_cast<uint16_t>(arg));
}
} else {
writer.Write((uint32_t) 0);
writer.Write(static_cast<uint32_t>(0));
}
uint32_t soundFlags = 0;
bool hasLo = instrument.soundLo.has_value();
bool hasMed = instrument.soundMed.has_value();
bool hasHi = instrument.soundHi.has_value();
const bool hasLo = instrument.soundLo.has_value();
const bool hasMed = instrument.soundMed.has_value();
const bool hasHi = instrument.soundHi.has_value();
if(hasLo){
soundFlags |= (1 << 0);
soundFlags |= 1 << 0;
}
if(hasMed){
soundFlags |= (1 << 1);
soundFlags |= 1 << 1;
}
if(hasHi){
soundFlags |= (1 << 2);
soundFlags |= 1 << 2;
}
writer.Write((uint32_t) soundFlags);
writer.Write(soundFlags);
if(hasLo){
auto value = instrument.soundLo.value();
uint32_t idx = AudioManager::Instance->get_index(bank->mBank.samples[value.offset]);
writer.Write(std::string(bank->mSampleTable[idx]));
writer.Write(value.tuning);
auto [offset, tuning] = instrument.soundLo.value();
const uint32_t idx = AudioManager::Instance->get_index(bank->mBank.samples[offset]);
writer.Write(AudioManager::Instance->get_sample(idx));
writer.Write(tuning);
}
if(hasMed){
auto value = instrument.soundMed.value();
uint32_t idx = AudioManager::Instance->get_index(bank->mBank.samples[value.offset]);
writer.Write(std::string(bank->mSampleTable[idx]));
writer.Write(value.tuning);
auto [offset, tuning] = instrument.soundMed.value();
const uint32_t idx = AudioManager::Instance->get_index(bank->mBank.samples[offset]);
writer.Write(AudioManager::Instance->get_sample(idx));
writer.Write(tuning);
}
if(hasHi){
auto value = instrument.soundHi.value();
uint32_t idx = AudioManager::Instance->get_index(bank->mBank.samples[value.offset]);
writer.Write(std::string(bank->mSampleTable[idx]));
writer.Write(value.tuning);
auto [offset, tuning] = instrument.soundHi.value();
const uint32_t idx = AudioManager::Instance->get_index(bank->mBank.samples[offset]);
writer.Write(AudioManager::Instance->get_sample(idx));
writer.Write(tuning);
}
}
writer.Write((uint32_t) bank->mBank.drums.size());
writer.Write(static_cast<uint32_t>(bank->mBank.drums.size()));
for(auto &drum : bank->mBank.drums){
writer.Write((uint8_t) drum.releaseRate);
writer.Write((uint8_t) drum.pan);
writer.Write(drum.releaseRate);
writer.Write(drum.pan);
auto envelope = bank->mBank.envelopes[drum.envelope];
if(!envelope.entries.empty()){
writer.Write((uint32_t) envelope.entries.size());
writer.Write(static_cast<uint32_t>(envelope.entries.size()));
for(auto &entry : envelope.entries){
writer.Write(entry.delay);
writer.Write(entry.arg);
}
} else {
writer.Write((uint32_t) 0);
writer.Write(static_cast<uint32_t>(0));
}
uint32_t idx = AudioManager::Instance->get_index(bank->mBank.samples[drum.sound.offset]);
std::string out = std::string(bank->mSampleTable[idx]);
const uint32_t idx = AudioManager::Instance->get_index(bank->mBank.samples[drum.sound.offset]);
const auto out = AudioManager::Instance->get_sample(idx);
writer.Write(out);
writer.Write(drum.sound.tuning);
}
@@ -95,6 +94,5 @@ std::optional<std::shared_ptr<IParsedData>> BankFactory::parse(std::vector<uint8
throw std::runtime_error("AudioManager not initialized");
}
auto gSampleTable = Companion::Instance->GetCartridge()->GetCountry() == N64::CountryCode::Japan ? gJPSampleTable : gUSSampleTable;
return std::make_shared<BankData>(banks[bankId], bankId, gSampleTable);
return std::make_shared<BankData>(banks[bankId], bankId);
}
+3 -2
View File
@@ -1,5 +1,7 @@
#pragma once
#include <utility>
#include "BaseFactory.h"
#include "audio/AudioManager.h"
@@ -7,9 +9,8 @@ class BankData : public IParsedData {
public:
Bank mBank;
uint32_t mBankId;
const char** mSampleTable;
BankData(Bank bank, uint32_t bankId, const char** sampleTable) : mBank(bank), mBankId(bankId), mSampleTable(sampleTable) {}
BankData(Bank bank, const uint32_t bankId) : mBank(std::move(bank)), mBankId(bankId) {}
};
class BankBinaryExporter : public BaseExporter {