mirror of
https://github.com/izzy2lost/Torch.git
synced 2026-07-06 00:18:35 -07:00
Removed last table data from audio
This commit is contained in:
+45
-7
@@ -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
|
||||
|
||||
@@ -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){
|
||||
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user