Path: blob/master/libs/fluidsynth/src/sfloader/fluid_defsfont.h
4396 views
/* FluidSynth - A Software Synthesizer1*2* Copyright (C) 2003 Peter Hanappe and others.3*4* SoundFont loading code borrowed from Smurf SoundFont Editor by Josh Green5*6* This library is free software; you can redistribute it and/or7* modify it under the terms of the GNU Lesser General Public License8* as published by the Free Software Foundation; either version 2.1 of9* the License, or (at your option) any later version.10*11* This library is distributed in the hope that it will be useful, but12* WITHOUT ANY WARRANTY; without even the implied warranty of13* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU14* Lesser General Public License for more details.15*16* You should have received a copy of the GNU Lesser General Public17* License along with this library; if not, write to the Free18* Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA19* 02110-1301, USA20*/212223#ifndef _FLUID_DEFSFONT_H24#define _FLUID_DEFSFONT_H252627#include "fluidsynth.h"28#include "fluidsynth_priv.h"29#include "fluid_sffile.h"30#include "fluid_list.h"31#include "fluid_mod.h"32#include "fluid_gen.h"33343536/*-----------------------------------sfont.h----------------------------*/3738#define SF_SAMPMODES_LOOP 139#define SF_SAMPMODES_UNROLL 24041#define SF_MIN_SAMPLERATE 40042#define SF_MAX_SAMPLERATE 500004344#define SF_MIN_SAMPLE_LENGTH 324546/***************************************************************47*48* FORWARD DECLARATIONS49*/50typedef struct _fluid_defsfont_t fluid_defsfont_t;51typedef struct _fluid_defpreset_t fluid_defpreset_t;52typedef struct _fluid_preset_zone_t fluid_preset_zone_t;53typedef struct _fluid_inst_t fluid_inst_t;54typedef struct _fluid_inst_zone_t fluid_inst_zone_t; /**< Soundfont Instrument Zone */55typedef struct _fluid_voice_zone_t fluid_voice_zone_t;5657/* defines the velocity and key range for a zone */58struct _fluid_zone_range_t59{60int keylo;61int keyhi;62int vello;63int velhi;64unsigned char ignore; /* set to TRUE for legato playing to ignore this range zone */65};6667/* Stored on a preset zone to keep track of the inst zones that could start a voice68* and their combined preset zone/instrument zone ranges */69struct _fluid_voice_zone_t70{71fluid_inst_zone_t *inst_zone;72fluid_zone_range_t range;73};7475/*7677Public interface7879*/8081fluid_sfont_t *fluid_defsfloader_load(fluid_sfloader_t *loader, const char *filename);828384int fluid_defsfont_sfont_delete(fluid_sfont_t *sfont);85const char *fluid_defsfont_sfont_get_name(fluid_sfont_t *sfont);86fluid_preset_t *fluid_defsfont_sfont_get_preset(fluid_sfont_t *sfont, int bank, int prenum);87void fluid_defsfont_sfont_iteration_start(fluid_sfont_t *sfont);88fluid_preset_t *fluid_defsfont_sfont_iteration_next(fluid_sfont_t *sfont);899091void fluid_defpreset_preset_delete(fluid_preset_t *preset);92const char *fluid_defpreset_preset_get_name(fluid_preset_t *preset);93int fluid_defpreset_preset_get_banknum(fluid_preset_t *preset);94int fluid_defpreset_preset_get_num(fluid_preset_t *preset);95int fluid_defpreset_preset_noteon(fluid_preset_t *preset, fluid_synth_t *synth, int chan, int key, int vel);9697int fluid_zone_inside_range(fluid_zone_range_t *zone_range, int key, int vel);9899/*100* fluid_defsfont_t101*/102struct _fluid_defsfont_t103{104const fluid_file_callbacks_t *fcbs; /* the file callbacks used to load this Soundfont */105char *filename; /* the filename of this soundfont */106unsigned int samplepos; /* the position in the file at which the sample data starts */107unsigned int samplesize; /* the size of the sample data in bytes */108short *sampledata; /* the sample data, loaded in ram */109110unsigned int sample24pos; /* position within sffd of the sm24 chunk, set to zero if no 24 bit sample support */111unsigned int sample24size; /* length within sffd of the sm24 chunk */112char *sample24data; /* if not NULL, the least significant byte of the 24bit sample data, loaded in ram */113114fluid_sfont_t *sfont; /* pointer to parent sfont */115fluid_list_t *sample; /* the samples in this soundfont */116fluid_list_t *preset; /* the presets of this soundfont */117fluid_list_t *inst; /* the instruments of this soundfont */118int mlock; /* Should we try memlock (avoid swapping)? */119int dynamic_samples; /* Enables dynamic sample loading if set */120121fluid_list_t *preset_iter_cur; /* the current preset in the iteration */122};123124125fluid_defsfont_t *new_fluid_defsfont(fluid_settings_t *settings);126int delete_fluid_defsfont(fluid_defsfont_t *defsfont);127int fluid_defsfont_load(fluid_defsfont_t *defsfont, const fluid_file_callbacks_t *file_callbacks, const char *file);128const char *fluid_defsfont_get_name(fluid_defsfont_t *defsfont);129fluid_preset_t *fluid_defsfont_get_preset(fluid_defsfont_t *defsfont, int bank, int prenum);130void fluid_defsfont_iteration_start(fluid_defsfont_t *defsfont);131fluid_preset_t *fluid_defsfont_iteration_next(fluid_defsfont_t *defsfont);132int fluid_defsfont_load_sampledata(fluid_defsfont_t *defsfont, SFData *sfdata, fluid_sample_t *sample);133int fluid_defsfont_load_all_sampledata(fluid_defsfont_t *defsfont, SFData *sfdata);134135int fluid_defsfont_add_sample(fluid_defsfont_t *defsfont, fluid_sample_t *sample);136int fluid_defsfont_add_preset(fluid_defsfont_t *defsfont, fluid_defpreset_t *defpreset);137138139/*140* fluid_preset_t141*/142struct _fluid_defpreset_t143{144fluid_defpreset_t *next;145char name[21]; /* the name of the preset */146unsigned int bank; /* the bank number */147unsigned int num; /* the preset number */148fluid_preset_zone_t *global_zone; /* the global zone of the preset */149fluid_preset_zone_t *zone; /* the chained list of preset zones */150int pinned; /* preset samples pinned to sample cache? */151};152153fluid_defpreset_t *new_fluid_defpreset(void);154void delete_fluid_defpreset(fluid_defpreset_t *defpreset);155fluid_defpreset_t *fluid_defpreset_next(fluid_defpreset_t *defpreset);156int fluid_defpreset_import_sfont(fluid_defpreset_t *defpreset, SFPreset *sfpreset, fluid_defsfont_t *defsfont, SFData *sfdata);157int fluid_defpreset_set_global_zone(fluid_defpreset_t *defpreset, fluid_preset_zone_t *zone);158int fluid_defpreset_add_zone(fluid_defpreset_t *defpreset, fluid_preset_zone_t *zone);159fluid_preset_zone_t *fluid_defpreset_get_zone(fluid_defpreset_t *defpreset);160fluid_preset_zone_t *fluid_defpreset_get_global_zone(fluid_defpreset_t *defpreset);161int fluid_defpreset_get_banknum(fluid_defpreset_t *defpreset);162int fluid_defpreset_get_num(fluid_defpreset_t *defpreset);163const char *fluid_defpreset_get_name(fluid_defpreset_t *defpreset);164int fluid_defpreset_noteon(fluid_defpreset_t *defpreset, fluid_synth_t *synth, int chan, int key, int vel);165166/*167* fluid_preset_zone168*/169struct _fluid_preset_zone_t170{171fluid_preset_zone_t *next;172char *name;173fluid_inst_t *inst;174fluid_list_t *voice_zone;175fluid_zone_range_t range;176fluid_gen_t gen[GEN_LAST];177fluid_mod_t *mod; /* List of modulators */178};179180fluid_preset_zone_t *new_fluid_preset_zone(char *name);181void delete_fluid_list_mod(fluid_mod_t *mod);182void delete_fluid_preset_zone(fluid_preset_zone_t *zone);183fluid_preset_zone_t *fluid_preset_zone_next(fluid_preset_zone_t *zone);184int fluid_preset_zone_import_sfont(fluid_preset_zone_t *zone, fluid_preset_zone_t *global_zone, SFZone *sfzone, fluid_defsfont_t *defssfont, SFData *sfdata);185fluid_inst_t *fluid_preset_zone_get_inst(fluid_preset_zone_t *zone);186187/*188* fluid_inst_t189*/190struct _fluid_inst_t191{192char name[21];193int source_idx; /* Index of instrument in source Soundfont */194fluid_inst_zone_t *global_zone;195fluid_inst_zone_t *zone;196};197198fluid_inst_t *new_fluid_inst(void);199fluid_inst_t *fluid_inst_import_sfont(int inst_idx, fluid_defsfont_t *defsfont, SFData *sfdata);200void delete_fluid_inst(fluid_inst_t *inst);201int fluid_inst_set_global_zone(fluid_inst_t *inst, fluid_inst_zone_t *zone);202int fluid_inst_add_zone(fluid_inst_t *inst, fluid_inst_zone_t *zone);203fluid_inst_zone_t *fluid_inst_get_zone(fluid_inst_t *inst);204fluid_inst_zone_t *fluid_inst_get_global_zone(fluid_inst_t *inst);205206/*207* fluid_inst_zone_t208*/209struct _fluid_inst_zone_t210{211fluid_inst_zone_t *next;212char *name;213fluid_sample_t *sample;214fluid_zone_range_t range;215fluid_gen_t gen[GEN_LAST];216fluid_mod_t *mod; /* List of modulators */217};218219220fluid_inst_zone_t *new_fluid_inst_zone(char *name);221void delete_fluid_inst_zone(fluid_inst_zone_t *zone);222fluid_inst_zone_t *fluid_inst_zone_next(fluid_inst_zone_t *zone);223int fluid_inst_zone_import_sfont(fluid_inst_zone_t *inst_zone, fluid_inst_zone_t *global_inst_zone, SFZone *sfzone, fluid_defsfont_t *defsfont, SFData *sfdata);224fluid_sample_t *fluid_inst_zone_get_sample(fluid_inst_zone_t *zone);225226227int fluid_sample_import_sfont(fluid_sample_t *sample, SFSample *sfsample, fluid_defsfont_t *defsfont);228int fluid_sample_in_rom(fluid_sample_t *sample);229230231#endif /* _FLUID_SFONT_H */232233234