#ifndef SOUNDFONT_FILE_H
#define SOUNDFONT_FILE_H

#include "stdbool.h"
#include "alignment.h"
#include "attributes.h"
#include "audio.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
