mirror of
https://github.com/zeldaret/oot
synced 2026-08-22 06:44:46 -04:00
[Audio 6/?] Build Soundfonts and the Soundfont Table (#2056)
* [Audio 6/?] Build Soundfonts and the Soundfont Table * Improve lots of error messages * First suggested changes * Make audio build debugging more friendly Co-authored-by: Dragorn421 <Dragorn421@users.noreply.github.com> * Some fixes from MM review * Make soundfont_table.h generation depend on the samplebank xmls since they are read, report from which soundfont the invalid pointer indirect warning originates from --------- Co-authored-by: Dragorn421 <Dragorn421@users.noreply.github.com>
This commit is contained in:
@@ -5,9 +5,10 @@
|
||||
#define __attribute__(x)
|
||||
#endif
|
||||
|
||||
#define UNUSED __attribute__((unused))
|
||||
#define FALLTHROUGH __attribute__((fallthrough))
|
||||
#define NORETURN __attribute__((noreturn))
|
||||
#define NO_REORDER __attribute__((no_reorder))
|
||||
#define UNUSED __attribute__((unused))
|
||||
#define FALLTHROUGH __attribute__((fallthrough))
|
||||
#define NORETURN __attribute__((noreturn))
|
||||
#define NO_REORDER __attribute__((no_reorder))
|
||||
#define SECTION_DATA __attribute__((section(".data")))
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
#ifndef SOUNDFONT_FILE_H
|
||||
#define SOUNDFONT_FILE_H
|
||||
|
||||
#include "libc/stdbool.h"
|
||||
#include "alignment.h"
|
||||
#include "attributes.h"
|
||||
#include "z64audio.h"
|
||||
|
||||
// Envelope definitions
|
||||
|
||||
#define ENVELOPE_POINT(delay, target) { (delay), (target) }
|
||||
#define ENVELOPE_DISABLE() { ADSR_DISABLE, 0 }
|
||||
#define ENVELOPE_HANG() { ADSR_HANG, 0 }
|
||||
#define ENVELOPE_GOTO(index) { ADSR_GOTO, (index) }
|
||||
#define ENVELOPE_RESTART() { ADSR_RESTART, 0 }
|
||||
|
||||
// Instrument definitions
|
||||
|
||||
#define INSTR_SAMPLE_NONE { NULL, 0.0f }
|
||||
#define INSTR_SAMPLE_LO_NONE 0
|
||||
#define INSTR_SAMPLE_HI_NONE 127
|
||||
|
||||
// Explicit padding is sometimes required where soundfont data was padded to 0x10 bytes (possibly due to source file
|
||||
// splits in the original soundfonts?)
|
||||
// It's less convenient for us to emit multiple files per soundfont, so instead we fill in the padding manually.
|
||||
|
||||
#ifndef GLUE
|
||||
#define GLUE(a,b) a##b
|
||||
#endif
|
||||
#ifndef GLUE2
|
||||
#define GLUE2(a,b) GLUE(a,b)
|
||||
#endif
|
||||
|
||||
#ifdef __sgi
|
||||
// For IDO, we have to add explicit padding arrays
|
||||
#define SF_PAD4() static u8 GLUE2(_pad, __LINE__) [] = { 0,0,0,0 }
|
||||
#define SF_PAD8() static u8 GLUE2(_pad, __LINE__) [] = { 0,0,0,0,0,0,0,0 }
|
||||
#define SF_PADC() static u8 GLUE2(_pad, __LINE__) [] = { 0,0,0,0,0,0,0,0,0,0,0,0 }
|
||||
#else
|
||||
// For other compilers, the soundfont compiler (sfc) emits alignment attributes that handle this automatically
|
||||
#define SF_PAD4()
|
||||
#define SF_PAD8()
|
||||
#define SF_PADC()
|
||||
#endif
|
||||
|
||||
#endif
|
||||
+1
-1
@@ -168,7 +168,7 @@ extern s32 __osPfsLastChannel;
|
||||
extern const TempoData gTempoData;
|
||||
extern const AudioHeapInitSizes gAudioHeapInitSizes;
|
||||
extern s16 gOcarinaSongItemMap[];
|
||||
extern u8 gSoundFontTable[];
|
||||
extern AudioTable gSoundFontTable;
|
||||
extern u8 gSequenceFontTable[];
|
||||
extern u8 gSequenceTable[];
|
||||
extern AudioTable gSampleBankTable;
|
||||
|
||||
+19
-5
@@ -177,18 +177,32 @@ typedef struct EnvelopePoint {
|
||||
/* 0x2 */ s16 arg;
|
||||
} EnvelopePoint; // size = 0x4
|
||||
|
||||
typedef struct AdpcmLoop {
|
||||
typedef struct AdpcmLoopHeader {
|
||||
/* 0x00 */ u32 start;
|
||||
/* 0x04 */ u32 end;
|
||||
/* 0x08 */ u32 count;
|
||||
/* 0x04 */ u32 end; // s16 sample position where the loop ends
|
||||
/* 0x08 */ u32 count; // The number of times the loop is played before the sound completes. Setting count to -1 indicates that the loop should play indefinitely.
|
||||
/* 0x0C */ char unk_0C[0x4];
|
||||
} AdpcmLoopHeader; // size = 0x10
|
||||
|
||||
typedef struct AdpcmLoop {
|
||||
/* 0x00 */ AdpcmLoopHeader header;
|
||||
/* 0x10 */ s16 predictorState[16]; // only exists if count != 0. 8-byte aligned
|
||||
} AdpcmLoop; // size = 0x30 (or 0x10)
|
||||
|
||||
typedef struct AdpcmBook {
|
||||
typedef struct AdpcmBookHeader {
|
||||
/* 0x00 */ s32 order;
|
||||
/* 0x04 */ s32 numPredictors;
|
||||
/* 0x08 */ s16 book[1]; // size 8 * order * numPredictors. 8-byte aligned
|
||||
} AdpcmBookHeader; // size = 0x8
|
||||
|
||||
/**
|
||||
* The procedure used to design the codeBook is based on an adaptive clustering algorithm.
|
||||
* The size of the codeBook is (8 * order * numPredictors) and is 8-byte aligned
|
||||
*/
|
||||
typedef s16 AdpcmBookData[];
|
||||
|
||||
typedef struct AdpcmBook {
|
||||
/* 0x00 */ AdpcmBookHeader header;
|
||||
/* 0x08 */ AdpcmBookData book; // size 8 * order * numPredictors. 8-byte aligned
|
||||
} AdpcmBook; // size >= 0x8
|
||||
|
||||
typedef struct Sample {
|
||||
|
||||
Reference in New Issue
Block a user