sm64coopdx/sound
eros71 3ed76d6a5c
Add Extended Soundbank (#254)
* Add Extended Soundbank

This PR adds a soundbank to the game with every instrument in the game, so there's no need to only use one set of instruments for m64 sequences.

Use the soundbank ID "42" when replacing sequences with lua to use it.

* Remove hardcoded.h include duplicate

There's a duplicated line that shouldn't be there since hardcoded.h is already included.

* Reinclude duplicate include

I'm still learning the commits system and I've noticed I should push this into a different PR instead by making a fork, sorry about that
2023-03-22 19:04:16 -04:00
..
samples Updated Andrat's Luigi sound pack 2022-02-15 01:00:09 -08:00
sequences Update to Refresh 13 (#19) 2022-03-13 00:17:10 -08:00
sound_banks Add Extended Soundbank (#254) 2023-03-22 19:04:16 -04:00
README.md Refresh 3 2019-11-03 14:36:27 -05:00
sequences.json Update to Refresh 13 (#19) 2022-03-13 00:17:10 -08:00
sound_data.c Update to Refresh 13 (#19) 2022-03-13 00:17:10 -08:00
sound_data.h Update to Refresh 13 (#19) 2022-03-13 00:17:10 -08:00

Sound in SM64 consists of three parts: samples, sound banks, and sequences.

Samples represent raw sound data, given as AIFF files with a custom ADPCM-based compression format that reduces file sizes by ~70% compared to uncompressed AIFF (with 16-bit samples). The build system automatically converts uncompressed AIFF files into this format.

Samples are collected into banks, given by directories. The order in which each bank's samples end up in the final binary is determined by their file names. Thus, to keep the ROM OK, sample files should be prefixed by a number to maintain sort order. (Bank directories are ordered by their usages in way that automatically makes the ROM match.)

Samples cannot be referred to directly from sequence files. Instead, there is an indirect step in the form of sound banks. Each sound bank refers to a single sample bank, and amends it with extra information in the form of a JSON file. This JSON file contains a set of "instruments", which describe how note values (pitches) map to samples, which pitch corrections to perform, and what ADSR envelopes to use. The instrument_list key maps indices to instruments; these indices are what sequence files can refer to. A special instrument percussion is also supported, as an array with (usually) 64 different entries, covering note values 0..63. It is referred to as instrument ID 0x7f.

C-style comments are supported in the JSON. Similar to samples, the sound banks come in alphabetical order in the ROM, so they should be prefixed to maintain sort order.

Sequence files are what actually controls the audio. The are in .m64 format, which is similar to MIDI, but Turing complete. An .m64 file has a sequence script that can spawn channels, which have channel scripts that can spawn layers, which have layer scripts that can play notes. Each note is performed using an instrument from a sound bank. A sequence file can use multiple banks; sequences.json describes the mapping from sequences to sound banks. Channels can switch between banks using a command. However, in practice most sequences limit themselves to a single sound bank. The main exception is sequence 0, which is responsible for sound effects.

Like samples and sound banks, sequence files are included in the ROM in alphabetical file name order. They can be located in either sound/sequences/ or sound/sequences/<version>/, and can optionally be given in disassembled form -- see include/seq_macros.inc for more details on the format.

The repo gitignores .m64 and .aiff files by default, unless they include "custom" somewhere in the name (including in a directory name). Thus, for new custom-made samples and sequences it is advisable to include that substring in the file name (this also helps distinguish custom sounds from ones from the game). git add -f also works for adding edited existing files to git.