1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2024-11-15 06:06:04 +00:00
oot/tools/audio/soundfont.h

171 lines
3.7 KiB
C
Raw Normal View History

/**
* SPDX-FileCopyrightText: Copyright (C) 2024 ZeldaRET
* SPDX-License-Identifier: MPL-2.0
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#ifndef SOUNDFONT_H_
#define SOUNDFONT_H_
#include <stdint.h>
#include "aifc.h"
#include "samplebank.h"
// special delay values
#define ADSR_DISABLE 0
#define ADSR_HANG -1
#define ADSR_GOTO -2
#define ADSR_RESTART -3
#define INSTR_LO_NONE 0
#define INSTR_HI_NONE 127
typedef struct sample_data {
struct sample_data *next;
const char *name;
double sample_rate;
int8_t base_note;
bool is_dd;
bool cached;
aifc_data aifc;
} sample_data;
typedef struct {
int16_t delay;
int16_t arg;
} envelope_point;
typedef struct envelope_data {
struct envelope_data *next;
const char *name;
uint8_t release;
envelope_point *points;
size_t n_points;
bool used;
} envelope_data;
typedef struct instr_data {
struct instr_data *next;
unsigned int program_number;
const char *name;
const char *envelope_name;
// for matching only
bool unused;
// these are provided as-is for unused (name == NULL) otherwise they are read from the aifc file
double sample_rate_mid;
double sample_rate_lo;
double sample_rate_hi;
int8_t base_note_mid;
int8_t base_note_lo;
int8_t base_note_hi;
envelope_data *envelope;
uint16_t release;
const char *sample_name_low;
const char *sample_name_mid;
const char *sample_name_high;
int8_t sample_low_end;
int8_t sample_high_start;
sample_data *sample_low;
sample_data *sample_mid;
sample_data *sample_high;
float sample_low_tuning;
float sample_mid_tuning;
float sample_high_tuning;
} instr_data;
typedef struct drum_data {
struct drum_data *next;
const char *name;
const char *sample_name;
const char *envelope_name;
envelope_data *envelope;
uint16_t release;
int8_t note;
int8_t note_start;
int8_t note_end;
int pan;
sample_data *sample;
double sample_rate;
int8_t base_note;
} drum_data;
typedef struct sfx_data {
struct sfx_data *next;
const char *name;
const char *sample_name;
sample_data *sample;
double sample_rate;
int8_t base_note;
float tuning;
} sfx_data;
typedef struct {
bool matching;
struct {
const char *name;
const char *symbol;
int index;
const char *medium;
const char *cache_policy;
const char *bank_path;
int pointer_index;
const char *bank_path_dd;
int pointer_index_dd;
unsigned int pad_to_size;
unsigned int num_instruments; // or the maximum program number (+1), since this also includes empty slots
// between instruments
unsigned int num_drums;
unsigned int num_effects;
bool loops_have_frames;
} info;
uint32_t program_number_bitset[4];
envelope_data *envelopes;
envelope_data *envelope_last;
samplebank sb;
samplebank sbdd;
sample_data *samples;
sample_data *sample_last;
instr_data *instruments;
instr_data *instrument_last;
drum_data *drums;
drum_data *drums_last;
sfx_data *sfx;
sfx_data *sfx_last;
uint8_t *match_padding;
size_t match_padding_num;
} soundfont;
#define NOTE_UNSET (INT8_MIN)
#define RELEASE_UNSET (UINT16_MAX)
envelope_data *
sf_get_envelope(soundfont *sf, const char *name);
sample_data *
sample_data_forname(soundfont *sf, const char *name);
void
read_soundfont_info(soundfont *sf, xmlNodePtr node);
#endif