Torch
Loading...
Searching...
No Matches
AudioPreview.h
1#pragma once
2
3#include <cstdint>
4#include <map>
5#include <memory>
6#include <vector>
7
8#include "factories/BaseFactory.h"
9
10#ifdef BUILD_UI
11#include "ui/audio/SequenceDriver.h"
12#endif
13
14// Preview-only PM64 audio assets. When preview mode is on, the PM64:AUDIO
15// factory walks the SBN container and registers one PM64:BGM asset per song
16// and one PM64:BK_SAMPLE asset per bank instrument (see pmret src/audio).
17namespace PM64Audio {
18
19// One BK instrument: VADPCM wave data plus its codebook, loop, tuning and
20// envelope presets (press/release command list pairs).
21struct Instrument {
22 std::vector<uint8_t> wav;
23 std::vector<int16_t> book; // codebook s16s (order 2)
24 int32_t loopStart = 0;
25 int32_t loopEnd = 0;
26 int32_t loopCount = 0;
27 uint16_t keyBase = 4800; // cents
28 int32_t sampleRate = 32000;
29 uint8_t type = 0;
30 std::vector<std::pair<std::vector<uint8_t>, std::vector<uint8_t>>> envelopes;
31};
32
33struct Bank {
34 char name[5] = {};
35 std::shared_ptr<Instrument> instruments[16];
36};
37
38// Banks parsed from ROM, keyed by BK file ROM offset; filled during parsing so
39// the BGM driver can resolve (bank set, patch) at preview time.
40std::map<uint32_t, std::shared_ptr<Bank>>& BankRegistry();
41std::shared_ptr<Bank> ParseBank(const std::vector<uint8_t>& rom, uint32_t off);
42
43// Global PER drum table and PRG program table (parsed from the SBN's INIT
44// extra files by the PM64:AUDIO factory).
45struct DrumInfo {
46 uint16_t bankPatch = 0;
47 uint16_t keyBase = 4800;
48 uint8_t volume = 127;
49 int8_t pan = 64;
50 uint8_t reverb = 0;
51 uint8_t randTune = 0, randVolume = 0, randPan = 0, randReverb = 0;
52};
53
55 uint16_t bankPatch = 0;
56 uint8_t volume = 127;
57 int8_t pan = 64;
58 uint8_t reverb = 0;
59 int8_t coarseTune = 0, fineTune = 0;
60};
61
62struct GlobalData {
63 std::vector<DrumInfo> perDrums;
64 std::vector<ProgramInfo> prgPrograms;
65};
66GlobalData& Globals();
67
68// Preview asset registration is opt-in so extraction runs stay clean.
69void SetPreviewAssets(bool enabled);
70bool PreviewAssets();
71
72// Walks the SBN container (big-endian ROM data) and registers the per-song
73// and per-instrument preview assets. Called by the PM64:AUDIO factory.
74void RegisterPreviewAssets(const std::vector<uint8_t>& rom, uint32_t sbnBase);
75
76} // namespace PM64Audio
77
79public:
80 std::shared_ptr<PM64Audio::Bank> bank;
81 int slot = 0;
82};
83
84// Preview assets still need an exporter registered or ParseNode discards the
85// parse result; Binary writes the raw payload.
87 ExportResult Export(std::ostream& write, std::shared_ptr<IParsedData> data, std::string& entryName,
88 YAML::Node& node, std::string* replacement) override;
89};
90
92public:
93 std::optional<std::shared_ptr<IParsedData>> parse(std::vector<uint8_t>& buffer, YAML::Node& data) override;
94 inline std::unordered_map<ExportType, std::shared_ptr<BaseExporter>> GetExporters() override {
95 return {
96 REGISTER(Binary, PM64BkSampleBinaryExporter)
97 };
98 }
99};
100
101class PM64BgmData : public IParsedData {
102public:
103 std::vector<uint8_t> file;
104};
105
107 ExportResult Export(std::ostream& write, std::shared_ptr<IParsedData> data, std::string& entryName,
108 YAML::Node& node, std::string* replacement) override;
109};
110
112public:
113 std::optional<std::shared_ptr<IParsedData>> parse(std::vector<uint8_t>& buffer, YAML::Node& data) override;
114 inline std::unordered_map<ExportType, std::shared_ptr<BaseExporter>> GetExporters() override {
115 return {
116 REGISTER(Binary, PM64BgmBinaryExporter)
117 };
118 }
119};
120
121#ifdef BUILD_UI
122class PM64BkSampleFactoryUI : public BaseFactoryUI {
123public:
124 float GetItemHeight(const ParseResultData& data) override;
125 void DrawUI(const ParseResultData& data) override;
126};
127
128// Offline BGM interpreter (port of pmret au_bgm_player_update_playing).
129class SequencePlayerPM64 : public UI::SequenceDriver {
130public:
131 bool Render(const ParseResultData& item, int option, UI::RenderedAudio& out) override;
132 std::vector<std::string> Options(const ParseResultData& item) override;
133};
134#endif
Definition BaseFactory.h:96
Definition BaseFactory.h:102
Definition BaseFactory.h:88
Definition AudioPreview.h:106
Definition AudioPreview.h:101
Definition AudioPreview.h:111
Definition AudioPreview.h:86
Definition AudioPreview.h:78
Definition AudioPreview.h:91
Definition AudioPreview.h:33
Definition AudioPreview.h:45
Definition AudioPreview.h:62
Definition AudioPreview.h:21
Definition AudioPreview.h:54
Definition Companion.h:123