yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
yaze::zelda3::music::MusicBank Class Reference

Manages the collection of songs, instruments, and samples from a ROM. More...

#include <music_bank.h>

Collaboration diagram for yaze::zelda3::music::MusicBank:

Classes

struct  BankSongRange
 
struct  ExpandedBankInfo
 
struct  SpaceInfo
 

Public Types

enum class  Bank : uint8_t {
  Overworld = 0 , Dungeon = 1 , Credits = 2 , OverworldExpanded = 3 ,
  Auxiliary = 4
}
 

Public Member Functions

 MusicBank ()=default
 
 ~MusicBank ()=default
 
 MusicBank (const MusicBank &)=delete
 
MusicBankoperator= (const MusicBank &)=delete
 
 MusicBank (MusicBank &&)=default
 
MusicBankoperator= (MusicBank &&)=default
 
absl::Status LoadFromRom (Rom &rom)
 Load all music data from a ROM.
 
absl::Status SaveToRom (Rom &rom)
 Save all modified music data back to ROM.
 
bool IsLoaded () const
 Check if music data has been loaded.
 
size_t GetSongCount () const
 Get the number of songs loaded.
 
MusicSongGetSong (int index)
 Get a song by index.
 
const MusicSongGetSong (int index) const
 
MusicSongGetSongById (int song_id)
 Get a song by vanilla ID (1-based).
 
int CreateNewSong (const std::string &name, Bank bank)
 Create a new empty song.
 
absl::Status DeleteSong (int index)
 Delete a song by index.
 
int DuplicateSong (int index)
 Duplicate a song.
 
bool IsVanilla (int index) const
 Check if a song is a vanilla (original) song.
 
bool HasExpandedMusicPatch () const
 Check if the ROM has the Oracle of Secrets expanded music patch.
 
bool IsExpandedSong (int index) const
 Check if a song is from an expanded bank.
 
const ExpandedBankInfoGetExpandedBankInfo () const
 Get information about the expanded bank configuration.
 
std::vector< MusicSong * > GetSongsInBank (Bank bank)
 Get all songs in a specific bank.
 
size_t GetInstrumentCount () const
 Get the number of instruments.
 
MusicInstrumentGetInstrument (int index)
 Get an instrument by index.
 
const MusicInstrumentGetInstrument (int index) const
 
int CreateNewInstrument (const std::string &name)
 Create a new instrument.
 
size_t GetSampleCount () const
 Get the number of samples.
 
MusicSampleGetSample (int index)
 Get a sample by index.
 
const MusicSampleGetSample (int index) const
 
absl::StatusOr< int > ImportSampleFromWav (const std::string &filepath, const std::string &name)
 Import a WAV file as a new sample.
 
SpaceInfo CalculateSpaceUsage (Bank bank) const
 Calculate space usage for a bank.
 
bool AllSongsFit () const
 Check if all songs fit in their banks.
 
bool HasModifications () const
 Check if any music data has been modified.
 
void ClearModifications ()
 Mark all data as unmodified (after save).
 
nlohmann::json ToJson () const
 
absl::Status LoadFromJson (const nlohmann::json &j)
 

Static Public Member Functions

static int GetBankMaxSize (Bank bank)
 Get the maximum size for a bank.
 
static uint32_t GetBankRomAddress (Bank bank)
 Get the ROM address for a bank.
 

Private Member Functions

absl::Status LoadSongTable (Rom &rom, Bank bank, std::vector< MusicSong > *custom_songs)
 
absl::Status LoadInstruments (Rom &rom)
 
absl::Status LoadSamples (Rom &rom)
 
absl::Status DetectExpandedMusicPatch (Rom &rom)
 
absl::Status LoadExpandedSongTable (Rom &rom, std::vector< MusicSong > *custom_songs)
 
absl::Status SaveSongTable (Rom &rom, Bank bank)
 
absl::Status SaveInstruments (Rom &rom)
 
absl::Status SaveSamples (Rom &rom)
 
int CalculateSongSize (const MusicSong &song) const
 

Static Private Member Functions

static BankSongRange GetBankSongRange (Bank bank)
 
static uint8_t GetSpcBankId (Bank bank)
 
static constexpr uint16_t GetSongTableAddress ()
 

Private Attributes

std::vector< MusicSongsongs_
 
std::vector< MusicInstrumentinstruments_
 
std::vector< MusicSamplesamples_
 
bool loaded_ = false
 
bool instruments_modified_ = false
 
bool samples_modified_ = false
 
int overworld_song_count_ = 0
 
int dungeon_song_count_ = 0
 
int credits_song_count_ = 0
 
int expanded_song_count_ = 0
 
int auxiliary_song_count_ = 0
 
ExpandedBankInfo expanded_bank_info_
 

Detailed Description

Manages the collection of songs, instruments, and samples from a ROM.

The MusicBank handles:

  • Loading all music data from ROM
  • Saving modified music data back to ROM
  • Managing instrument and sample definitions
  • Tracking space usage within ROM banks

Definition at line 27 of file music_bank.h.

Member Enumeration Documentation

◆ Bank

enum class yaze::zelda3::music::MusicBank::Bank : uint8_t
strong
Enumerator
Overworld 
Dungeon 
Credits 
OverworldExpanded 
Auxiliary 

Definition at line 30 of file music_bank.h.

Constructor & Destructor Documentation

◆ MusicBank() [1/3]

yaze::zelda3::music::MusicBank::MusicBank ( )
default

◆ ~MusicBank()

yaze::zelda3::music::MusicBank::~MusicBank ( )
default

◆ MusicBank() [2/3]

yaze::zelda3::music::MusicBank::MusicBank ( const MusicBank & )
delete

◆ MusicBank() [3/3]

yaze::zelda3::music::MusicBank::MusicBank ( MusicBank && )
default

Member Function Documentation

◆ operator=() [1/2]

MusicBank & yaze::zelda3::music::MusicBank::operator= ( const MusicBank & )
delete

◆ operator=() [2/2]

MusicBank & yaze::zelda3::music::MusicBank::operator= ( MusicBank && )
default

◆ LoadFromRom()

absl::Status yaze::zelda3::music::MusicBank::LoadFromRom ( Rom & rom)

◆ SaveToRom()

absl::Status yaze::zelda3::music::MusicBank::SaveToRom ( Rom & rom)

Save all modified music data back to ROM.

Parameters
romThe ROM to save to.
Returns
Status indicating success or failure.

Definition at line 220 of file music_bank.cc.

References AllSongsFit(), ClearModifications(), Credits, Dungeon, instruments_modified_, yaze::Rom::is_loaded(), loaded_, Overworld, samples_modified_, SaveInstruments(), SaveSamples(), and SaveSongTable().

Referenced by yaze::editor::MusicEditor::Save().

◆ IsLoaded()

bool yaze::zelda3::music::MusicBank::IsLoaded ( ) const
inline

Check if music data has been loaded.

Definition at line 88 of file music_bank.h.

References loaded_.

◆ GetSongCount()

size_t yaze::zelda3::music::MusicBank::GetSongCount ( ) const
inline

◆ GetSong() [1/2]

◆ GetSong() [2/2]

const MusicSong * yaze::zelda3::music::MusicBank::GetSong ( int index) const

Definition at line 268 of file music_bank.cc.

References songs_.

◆ GetSongById()

MusicSong * yaze::zelda3::music::MusicBank::GetSongById ( int song_id)

Get a song by vanilla ID (1-based).

Parameters
song_idThe vanilla song ID (1-34).
Returns
Pointer to the song, or nullptr if not found.

Definition at line 275 of file music_bank.cc.

References songs_.

◆ CreateNewSong()

int yaze::zelda3::music::MusicBank::CreateNewSong ( const std::string & name,
Bank bank )

Create a new empty song.

Parameters
nameThe name of the new song.
bankThe bank to place the song in.
Returns
Index of the new song, or -1 on failure.

Definition at line 283 of file music_bank.cc.

References yaze::zelda3::music::MusicSong::bank, yaze::zelda3::music::TrackEvent::MakeEnd(), yaze::zelda3::music::MusicSong::modified, yaze::zelda3::name, yaze::zelda3::music::MusicSong::name, yaze::zelda3::music::MusicSong::segments, songs_, and yaze::zelda3::music::MusicSegment::tracks.

Referenced by yaze::editor::music::SongBrowserView::Draw().

Here is the call graph for this function:

◆ DeleteSong()

absl::Status yaze::zelda3::music::MusicBank::DeleteSong ( int index)

Delete a song by index.

Parameters
indexThe song index to delete.
Returns
Status indicating success or failure.

Definition at line 317 of file music_bank.cc.

References IsVanilla(), and songs_.

Referenced by yaze::editor::music::SongBrowserView::Draw().

Here is the call graph for this function:

◆ DuplicateSong()

int yaze::zelda3::music::MusicBank::DuplicateSong ( int index)

Duplicate a song.

Parameters
indexThe song index to duplicate.
Returns
Index of the new song, or -1 on failure.

Definition at line 301 of file music_bank.cc.

References GetSong(), yaze::zelda3::music::MusicSong::modified, yaze::zelda3::music::MusicSong::name, and songs_.

Referenced by yaze::editor::music::SongBrowserView::Draw().

Here is the call graph for this function:

◆ IsVanilla()

bool yaze::zelda3::music::MusicBank::IsVanilla ( int index) const

Check if a song is a vanilla (original) song.

Parameters
indexThe song index to check.
Returns
True if vanilla, false if custom.

Definition at line 313 of file music_bank.cc.

Referenced by DeleteSong(), and yaze::editor::music::SongBrowserView::Draw().

◆ HasExpandedMusicPatch()

bool yaze::zelda3::music::MusicBank::HasExpandedMusicPatch ( ) const
inline

Check if the ROM has the Oracle of Secrets expanded music patch.

Returns
True if expanded music is detected.

Definition at line 147 of file music_bank.h.

References yaze::zelda3::music::MusicBank::ExpandedBankInfo::detected, and expanded_bank_info_.

Referenced by yaze::editor::music::SongBrowserView::Draw(), and yaze::editor::music::MusicPlayer::PlaySongDirect().

◆ IsExpandedSong()

bool yaze::zelda3::music::MusicBank::IsExpandedSong ( int index) const

Check if a song is from an expanded bank.

Parameters
indexThe song index to check.
Returns
True if the song is in OverworldExpanded or Auxiliary bank.

Definition at line 631 of file music_bank.cc.

References Auxiliary, OverworldExpanded, and songs_.

Referenced by yaze::editor::MusicEditor::ExportSongToAsm().

◆ GetExpandedBankInfo()

const ExpandedBankInfo & yaze::zelda3::music::MusicBank::GetExpandedBankInfo ( ) const
inline

Get information about the expanded bank configuration.

Returns
ExpandedBankInfo with detection details.

Definition at line 160 of file music_bank.h.

References expanded_bank_info_.

Referenced by yaze::editor::music::SongBrowserView::Draw().

◆ GetSongsInBank()

std::vector< MusicSong * > yaze::zelda3::music::MusicBank::GetSongsInBank ( Bank bank)

Get all songs in a specific bank.

Definition at line 330 of file music_bank.cc.

References songs_.

Referenced by SaveSongTable().

◆ GetInstrumentCount()

size_t yaze::zelda3::music::MusicBank::GetInstrumentCount ( ) const
inline

◆ GetInstrument() [1/2]

◆ GetInstrument() [2/2]

const MusicInstrument * yaze::zelda3::music::MusicBank::GetInstrument ( int index) const

Definition at line 347 of file music_bank.cc.

References instruments_.

◆ CreateNewInstrument()

◆ GetSampleCount()

size_t yaze::zelda3::music::MusicBank::GetSampleCount ( ) const
inline

◆ GetSample() [1/2]

◆ GetSample() [2/2]

const MusicSample * yaze::zelda3::music::MusicBank::GetSample ( int index) const

Definition at line 376 of file music_bank.cc.

References samples_.

◆ ImportSampleFromWav()

absl::StatusOr< int > yaze::zelda3::music::MusicBank::ImportSampleFromWav ( const std::string & filepath,
const std::string & name )

Import a WAV file as a new sample.

Parameters
filepathPath to the WAV file.
nameName for the sample.
Returns
Index of the new sample, or -1 on failure.
Todo
Implement proper WAV loading and BRR encoding

Definition at line 383 of file music_bank.cc.

References yaze::zelda3::name, yaze::zelda3::music::MusicSample::name, yaze::zelda3::music::MusicSample::pcm_data, samples_, and samples_modified_.

Referenced by yaze::editor::music::SampleEditorView::DrawSampleList().

◆ CalculateSpaceUsage()

◆ AllSongsFit()

bool yaze::zelda3::music::MusicBank::AllSongsFit ( ) const

Check if all songs fit in their banks.

Returns
True if all songs fit, false if any bank overflows.

Definition at line 438 of file music_bank.cc.

References CalculateSpaceUsage(), Credits, Dungeon, yaze::zelda3::music::MusicBank::SpaceInfo::free_bytes, and Overworld.

Referenced by yaze::editor::music::SongBrowserView::Draw(), and SaveToRom().

Here is the call graph for this function:

◆ GetBankMaxSize()

◆ GetBankRomAddress()

uint32_t yaze::zelda3::music::MusicBank::GetBankRomAddress ( Bank bank)
static

◆ HasModifications()

bool yaze::zelda3::music::MusicBank::HasModifications ( ) const

Check if any music data has been modified.

Definition at line 466 of file music_bank.cc.

References instruments_modified_, samples_modified_, and songs_.

Referenced by yaze::editor::MusicEditor::Update().

◆ ClearModifications()

void yaze::zelda3::music::MusicBank::ClearModifications ( )

Mark all data as unmodified (after save).

Definition at line 478 of file music_bank.cc.

References instruments_modified_, samples_modified_, and songs_.

Referenced by SaveToRom().

◆ ToJson()

◆ LoadFromJson()

absl::Status yaze::zelda3::music::MusicBank::LoadFromJson ( const nlohmann::json & j)

Definition at line 1092 of file music_bank.cc.

References yaze::zelda3::music::MusicInstrument::attack, yaze::zelda3::music::MusicSong::bank, yaze::zelda3::music::MusicSample::brr_data, yaze::zelda3::music::TrackEvent::Command, yaze::zelda3::music::TrackEvent::command, credits_song_count_, yaze::zelda3::music::MusicInstrument::decay, dungeon_song_count_, yaze::zelda3::music::Note::duration, yaze::zelda3::music::TrackEvent::End, yaze::zelda3::music::MusicInstrument::gain, yaze::zelda3::music::Note::has_duration_prefix, instruments_, yaze::zelda3::music::kNoteRest, loaded_, yaze::zelda3::music::MusicSong::loop_point, yaze::zelda3::music::MusicSample::loop_point, yaze::zelda3::music::MusicSample::loops, yaze::zelda3::music::MusicSong::modified, yaze::zelda3::music::MusicSong::name, yaze::zelda3::music::MusicInstrument::name, yaze::zelda3::music::MusicSample::name, yaze::zelda3::music::TrackEvent::Note, yaze::zelda3::music::TrackEvent::note, yaze::zelda3::music::MusicCommand::opcode, overworld_song_count_, yaze::zelda3::music::MusicCommand::params, yaze::zelda3::music::MusicSample::pcm_data, yaze::zelda3::music::Note::pitch, yaze::zelda3::music::MusicInstrument::pitch_mult, yaze::zelda3::music::MusicSegment::rom_address, yaze::zelda3::music::MusicSong::rom_address, yaze::zelda3::music::TrackEvent::rom_offset, yaze::zelda3::music::MusicInstrument::sample_index, samples_, yaze::zelda3::music::MusicSong::segments, songs_, yaze::zelda3::music::TrackEvent::SubroutineCall, yaze::zelda3::music::MusicInstrument::sustain_level, yaze::zelda3::music::MusicInstrument::sustain_rate, yaze::zelda3::music::TrackEvent::tick, yaze::zelda3::music::MusicSegment::tracks, yaze::zelda3::music::TrackEvent::type, and yaze::zelda3::music::Note::velocity.

Referenced by yaze::editor::MusicEditor::RestoreMusicState().

◆ LoadSongTable()

◆ LoadInstruments()

◆ LoadSamples()

◆ DetectExpandedMusicPatch()

◆ LoadExpandedSongTable()

◆ SaveSongTable()

◆ SaveInstruments()

absl::Status yaze::zelda3::music::MusicBank::SaveInstruments ( Rom & rom)
private
Todo
Implement instrument serialization

Definition at line 896 of file music_bank.cc.

Referenced by SaveToRom().

◆ SaveSamples()

absl::Status yaze::zelda3::music::MusicBank::SaveSamples ( Rom & rom)
private
Todo
Implement BRR encoding and sample saving

Definition at line 966 of file music_bank.cc.

Referenced by SaveToRom().

◆ CalculateSongSize()

int yaze::zelda3::music::MusicBank::CalculateSongSize ( const MusicSong & song) const
private

Definition at line 971 of file music_bank.cc.

References yaze::zelda3::music::MusicSong::HasLoop(), and yaze::zelda3::music::MusicSong::segments.

Referenced by CalculateSpaceUsage().

Here is the call graph for this function:

◆ GetBankSongRange()

MusicBank::BankSongRange yaze::zelda3::music::MusicBank::GetBankSongRange ( Bank bank)
staticprivate

Definition at line 1216 of file music_bank.cc.

Referenced by LoadSongTable().

◆ GetSpcBankId()

uint8_t yaze::zelda3::music::MusicBank::GetSpcBankId ( Bank bank)
staticprivate

Definition at line 1224 of file music_bank.cc.

Referenced by LoadSongTable().

◆ GetSongTableAddress()

static constexpr uint16_t yaze::zelda3::music::MusicBank::GetSongTableAddress ( )
inlinestaticconstexprprivate

Definition at line 312 of file music_bank.h.

References yaze::zelda3::music::kSongTableAram.

Referenced by LoadSongTable(), and SaveSongTable().

Member Data Documentation

◆ songs_

◆ instruments_

std::vector<MusicInstrument> yaze::zelda3::music::MusicBank::instruments_
private

◆ samples_

std::vector<MusicSample> yaze::zelda3::music::MusicBank::samples_
private

◆ loaded_

bool yaze::zelda3::music::MusicBank::loaded_ = false
private

Definition at line 286 of file music_bank.h.

Referenced by IsLoaded(), LoadFromJson(), LoadFromRom(), and SaveToRom().

◆ instruments_modified_

bool yaze::zelda3::music::MusicBank::instruments_modified_ = false
private

Definition at line 287 of file music_bank.h.

Referenced by ClearModifications(), CreateNewInstrument(), HasModifications(), and SaveToRom().

◆ samples_modified_

bool yaze::zelda3::music::MusicBank::samples_modified_ = false
private

Definition at line 288 of file music_bank.h.

Referenced by ClearModifications(), HasModifications(), ImportSampleFromWav(), and SaveToRom().

◆ overworld_song_count_

int yaze::zelda3::music::MusicBank::overworld_song_count_ = 0
private

Definition at line 291 of file music_bank.h.

Referenced by LoadFromJson(), LoadSongTable(), and ToJson().

◆ dungeon_song_count_

int yaze::zelda3::music::MusicBank::dungeon_song_count_ = 0
private

Definition at line 292 of file music_bank.h.

Referenced by LoadFromJson(), LoadSongTable(), and ToJson().

◆ credits_song_count_

int yaze::zelda3::music::MusicBank::credits_song_count_ = 0
private

Definition at line 293 of file music_bank.h.

Referenced by LoadFromJson(), LoadSongTable(), and ToJson().

◆ expanded_song_count_

int yaze::zelda3::music::MusicBank::expanded_song_count_ = 0
private

Definition at line 294 of file music_bank.h.

Referenced by LoadExpandedSongTable(), and LoadFromRom().

◆ auxiliary_song_count_

int yaze::zelda3::music::MusicBank::auxiliary_song_count_ = 0
private

Definition at line 295 of file music_bank.h.

Referenced by LoadFromRom().

◆ expanded_bank_info_

ExpandedBankInfo yaze::zelda3::music::MusicBank::expanded_bank_info_
private

The documentation for this class was generated from the following files: