fluid_defsfont.h
上传用户:tjmskj2
上传日期:2020-08-17
资源大小:577k
文件大小:18k
源码类别:

midi

开发平台:

C/C++

  1. /* FluidSynth - A Software Synthesizer
  2.  *
  3.  * Copyright (C) 2003  Peter Hanappe and others.
  4.  *
  5.  * SoundFont loading code borrowed from Smurf SoundFont Editor by Josh Green
  6.  *
  7.  * This library is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU Library General Public License
  9.  * as published by the Free Software Foundation; either version 2 of
  10.  * the License, or (at your option) any later version.
  11.  *
  12.  * This library is distributed in the hope that it will be useful, but
  13.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15.  * Library General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU Library General Public
  18.  * License along with this library; if not, write to the Free
  19.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
  20.  * 02111-1307, USA
  21.  */
  22. #ifndef _FLUID_DEFSFONT_H
  23. #define _FLUID_DEFSFONT_H
  24. #include "fluidsynth.h"
  25. #include "fluidsynth_priv.h"
  26. #include "fluid_list.h"
  27. /********************************************************************************/
  28. /********************************************************************************/
  29. /********************************************************************************/
  30. /********************************************************************************/
  31. /********************************************************************************/
  32. /*-----------------------------------sfont.h----------------------------*/
  33. #define SF_SAMPMODES_LOOP 1
  34. #define SF_SAMPMODES_UNROLL 2
  35. #define SF_MIN_SAMPLERATE 400
  36. #define SF_MAX_SAMPLERATE 50000
  37. #define SF_MIN_SAMPLE_LENGTH 32
  38. /* Sound Font structure defines */
  39. typedef struct _SFVersion
  40. { /* version structure */
  41.   unsigned short major;
  42.   unsigned short minor;
  43. }
  44. SFVersion;
  45. typedef struct _SFMod
  46. { /* Modulator structure */
  47.   unsigned short src; /* source modulator */
  48.   unsigned short dest; /* destination generator */
  49.   signed short amount; /* signed, degree of modulation */
  50.   unsigned short amtsrc; /* second source controls amnt of first */
  51.   unsigned short trans; /* transform applied to source */
  52. }
  53. SFMod;
  54. typedef union _SFGenAmount
  55. { /* Generator amount structure */
  56.   signed short sword; /* signed 16 bit value */
  57.   unsigned short uword; /* unsigned 16 bit value */
  58.   struct
  59.   {
  60.     unsigned char lo; /* low value for ranges */
  61.     unsigned char hi; /* high value for ranges */
  62.   }
  63.   range;
  64. }
  65. SFGenAmount;
  66. typedef struct _SFGen
  67. { /* Generator structure */
  68.   unsigned short id; /* generator ID */
  69.   SFGenAmount amount; /* generator value */
  70. }
  71. SFGen;
  72. typedef struct _SFZone
  73. { /* Sample/instrument zone structure */
  74.   fluid_list_t *instsamp; /* instrument/sample pointer for zone */
  75.   fluid_list_t *gen; /* list of generators */
  76.   fluid_list_t *mod; /* list of modulators */
  77. }
  78. SFZone;
  79. typedef struct _SFSample
  80. { /* Sample structure */
  81.   char name[21]; /* Name of sample */
  82.   unsigned char samfile; /* Loaded sfont/sample buffer = 0/1 */
  83.   unsigned int start; /* Offset in sample area to start of sample */
  84.   unsigned int end; /* Offset from start to end of sample,
  85.    this is the last point of the
  86.    sample, the SF spec has this as the
  87.    1st point after, corrected on
  88.    load/save */
  89.   unsigned int loopstart; /* Offset from start to start of loop */
  90.   unsigned int loopend; /* Offset from start to end of loop,
  91.    marks the first point after loop,
  92.    whose sample value is ideally
  93.    equivalent to loopstart */
  94.   unsigned int samplerate; /* Sample rate recorded at */
  95.   unsigned char origpitch; /* root midi key number */
  96.   signed char pitchadj; /* pitch correction in cents */
  97.   unsigned short sampletype; /* 1 mono,2 right,4 left,linked 8,0x8000=ROM */
  98. }
  99. SFSample;
  100. typedef struct _SFInst
  101. { /* Instrument structure */
  102.   char name[21]; /* Name of instrument */
  103.   fluid_list_t *zone; /* list of instrument zones */
  104. }
  105. SFInst;
  106. typedef struct _SFPreset
  107. { /* Preset structure */
  108.   char name[21]; /* preset name */
  109.   unsigned short prenum; /* preset number */
  110.   unsigned short bank; /* bank number */
  111.   unsigned int libr; /* Not used (preserved) */
  112.   unsigned int genre; /* Not used (preserved) */
  113.   unsigned int morph; /* Not used (preserved) */
  114.   fluid_list_t *zone; /* list of preset zones */
  115. }
  116. SFPreset;
  117. /* NOTE: sffd is also used to determine if sound font is new (NULL) */
  118. typedef struct _SFData
  119. { /* Sound font data structure */
  120.   SFVersion version; /* sound font version */
  121.   SFVersion romver; /* ROM version */
  122.   unsigned int samplepos; /* position within sffd of the sample chunk */
  123.   unsigned int samplesize; /* length within sffd of the sample chunk */
  124.   char *fname; /* file name */
  125.   FILE *sffd; /* loaded sfont file descriptor */
  126.   fluid_list_t *info;      /* linked list of info strings (1st byte is ID) */
  127.   fluid_list_t *preset; /* linked list of preset info */
  128.   fluid_list_t *inst; /* linked list of instrument info */
  129.   fluid_list_t *sample; /* linked list of sample info */
  130. }
  131. SFData;
  132. /* sf file chunk IDs */
  133. enum
  134. { UNKN_ID, RIFF_ID, LIST_ID, SFBK_ID,
  135.   INFO_ID, SDTA_ID, PDTA_ID, /* info/sample/preset */
  136.   IFIL_ID, ISNG_ID, INAM_ID, IROM_ID, /* info ids (1st byte of info strings) */
  137.   IVER_ID, ICRD_ID, IENG_ID, IPRD_ID, /* more info ids */
  138.   ICOP_ID, ICMT_ID, ISFT_ID, /* and yet more info ids */
  139.   SNAM_ID, SMPL_ID, /* sample ids */
  140.   PHDR_ID, PBAG_ID, PMOD_ID, PGEN_ID, /* preset ids */
  141.   IHDR_ID, IBAG_ID, IMOD_ID, IGEN_ID, /* instrument ids */
  142.   SHDR_ID /* sample info */
  143. };
  144. /* generator types */
  145. typedef enum
  146. { Gen_StartAddrOfs, Gen_EndAddrOfs, Gen_StartLoopAddrOfs,
  147.   Gen_EndLoopAddrOfs, Gen_StartAddrCoarseOfs, Gen_ModLFO2Pitch,
  148.   Gen_VibLFO2Pitch, Gen_ModEnv2Pitch, Gen_FilterFc, Gen_FilterQ,
  149.   Gen_ModLFO2FilterFc, Gen_ModEnv2FilterFc, Gen_EndAddrCoarseOfs,
  150.   Gen_ModLFO2Vol, Gen_Unused1, Gen_ChorusSend, Gen_ReverbSend, Gen_Pan,
  151.   Gen_Unused2, Gen_Unused3, Gen_Unused4,
  152.   Gen_ModLFODelay, Gen_ModLFOFreq, Gen_VibLFODelay, Gen_VibLFOFreq,
  153.   Gen_ModEnvDelay, Gen_ModEnvAttack, Gen_ModEnvHold, Gen_ModEnvDecay,
  154.   Gen_ModEnvSustain, Gen_ModEnvRelease, Gen_Key2ModEnvHold,
  155.   Gen_Key2ModEnvDecay, Gen_VolEnvDelay, Gen_VolEnvAttack,
  156.   Gen_VolEnvHold, Gen_VolEnvDecay, Gen_VolEnvSustain, Gen_VolEnvRelease,
  157.   Gen_Key2VolEnvHold, Gen_Key2VolEnvDecay, Gen_Instrument,
  158.   Gen_Reserved1, Gen_KeyRange, Gen_VelRange,
  159.   Gen_StartLoopAddrCoarseOfs, Gen_Keynum, Gen_Velocity,
  160.   Gen_Attenuation, Gen_Reserved2, Gen_EndLoopAddrCoarseOfs,
  161.   Gen_CoarseTune, Gen_FineTune, Gen_SampleId, Gen_SampleModes,
  162.   Gen_Reserved3, Gen_ScaleTune, Gen_ExclusiveClass, Gen_OverrideRootKey,
  163.   Gen_Dummy
  164. }
  165. Gen_Type;
  166. #define Gen_MaxValid  Gen_Dummy - 1 /* maximum valid generator */
  167. #define Gen_Count Gen_Dummy /* count of generators */
  168. #define GenArrSize sizeof(SFGenAmount)*Gen_Count /* gen array size */
  169. /* generator unit type */
  170. typedef enum
  171. {
  172.   None, /* No unit type */
  173.   Unit_Smpls, /* in samples */
  174.   Unit_32kSmpls, /* in 32k samples */
  175.   Unit_Cent, /* in cents (1/100th of a semitone) */
  176.   Unit_HzCent, /* in Hz Cents */
  177.   Unit_TCent, /* in Time Cents */
  178.   Unit_cB, /* in centibels (1/100th of a decibel) */
  179.   Unit_Percent, /* in percentage */
  180.   Unit_Semitone, /* in semitones */
  181.   Unit_Range /* a range of values */
  182. }
  183. Gen_Unit;
  184. /* global data */
  185. extern unsigned short badgen[];  /* list of bad generators */
  186. extern unsigned short badpgen[];  /* list of bad preset generators */
  187. /* functions */
  188. void sfont_init_chunks (void);
  189. void sfont_close (SFData * sf);
  190. void sfont_free_zone (SFZone * zone);
  191. int sfont_preset_compare_func (void* a, void* b);
  192. void sfont_zone_delete (SFData * sf, fluid_list_t ** zlist, SFZone * zone);
  193. fluid_list_t *gen_inlist (int gen, fluid_list_t * genlist);
  194. int gen_valid (int gen);
  195. int gen_validp (int gen);
  196. /*-----------------------------------sffile.h----------------------------*/
  197. /*
  198.    File structures and routines (used to be in sffile.h)
  199. */
  200. #define CHNKIDSTR(id)           &idlist[(id - 1) * 4]
  201. /* sfont file chunk sizes */
  202. #define SFPHDRSIZE 38
  203. #define SFBAGSIZE 4
  204. #define SFMODSIZE 10
  205. #define SFGENSIZE 4
  206. #define SFIHDRSIZE 22
  207. #define SFSHDRSIZE 46
  208. /* sfont file data structures */
  209. typedef struct _SFChunk
  210. { /* RIFF file chunk structure */
  211.   unsigned int id; /* chunk id */
  212.   unsigned int size; /* size of the following chunk */
  213. }
  214. SFChunk;
  215. typedef struct _SFPhdr
  216. {
  217.   unsigned char name[20]; /* preset name */
  218.   unsigned short preset; /* preset number */
  219.   unsigned short bank; /* bank number */
  220.   unsigned short pbagndx; /* index into preset bag */
  221.   unsigned int library; /* just for preserving them */
  222.   unsigned int genre; /* Not used */
  223.   unsigned int morphology; /* Not used */
  224. }
  225. SFPhdr;
  226. typedef struct _SFBag
  227. {
  228.   unsigned short genndx; /* index into generator list */
  229.   unsigned short modndx; /* index into modulator list */
  230. }
  231. SFBag;
  232. typedef struct _SFIhdr
  233. {
  234.   char name[20]; /* Name of instrument */
  235.   unsigned short ibagndx; /* Instrument bag index */
  236. }
  237. SFIhdr;
  238. typedef struct _SFShdr
  239. { /* Sample header loading struct */
  240.   char name[20]; /* Sample name */
  241.   unsigned int start; /* Offset to start of sample */
  242.   unsigned int end; /* Offset to end of sample */
  243.   unsigned int loopstart; /* Offset to start of loop */
  244.   unsigned int loopend; /* Offset to end of loop */
  245.   unsigned int samplerate; /* Sample rate recorded at */
  246.   unsigned char origpitch; /* root midi key number */
  247.   signed char pitchadj; /* pitch correction in cents */
  248.   unsigned short samplelink; /* Not used */
  249.   unsigned short sampletype; /* 1 mono,2 right,4 left,linked 8,0x8000=ROM */
  250. }
  251. SFShdr;
  252. /* data */
  253. extern char idlist[];
  254. /* functions */
  255. SFData *sfload_file (const char * fname);
  256. /********************************************************************************/
  257. /********************************************************************************/
  258. /********************************************************************************/
  259. /********************************************************************************/
  260. /********************************************************************************/
  261. /* GLIB - Library of useful routines for C programming
  262.  * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
  263.  *
  264.  * This library is free software; you can redistribute it and/or
  265.  * modify it under the terms of the GNU Library General Public
  266.  * License as published by the Free Software Foundation; either
  267.  * version 2 of the License, or (at your option) any later version.
  268.  *
  269.  * This library is distributed in the hope that it will be useful,
  270.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  271.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  272.  * Library General Public License for more details.
  273.  *
  274.  * You should have received a copy of the GNU Library General Public
  275.  * License along with this library; if not, write to the
  276.  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  277.  * Boston, MA 02111-1307, USA.
  278.  */
  279. #include <glib.h>
  280. /*-----------------------------------util.h----------------------------*/
  281. /*
  282.   Utility functions (formerly in util.h)
  283.  */
  284. #define FAIL 0
  285. #define OK 1
  286. enum
  287. { ErrWarn, ErrFatal, ErrStatus, ErrCorr, ErrEof, ErrMem, Errno,
  288.   ErrRead, ErrWrite
  289. };
  290. #define ErrMax ErrWrite
  291. #define ErrnoStart Errno
  292. #define ErrnoEnd ErrWrite
  293. int gerr (int ev, char * fmt, ...);
  294. int safe_fread (void *buf, int count, FILE * fd);
  295. int safe_fwrite (void *buf, int count, FILE * fd);
  296. int safe_fseek (FILE * fd, long ofs, int whence);
  297. /********************************************************************************/
  298. /********************************************************************************/
  299. /********************************************************************************/
  300. /********************************************************************************/
  301. /********************************************************************************/
  302. /***************************************************************
  303.  *
  304.  *       FORWARD DECLARATIONS
  305.  */
  306. typedef struct _fluid_defsfont_t fluid_defsfont_t;
  307. typedef struct _fluid_defpreset_t fluid_defpreset_t;
  308. typedef struct _fluid_preset_zone_t fluid_preset_zone_t;
  309. typedef struct _fluid_inst_t fluid_inst_t;
  310. typedef struct _fluid_inst_zone_t fluid_inst_zone_t;
  311. /*
  312.   Public interface
  313.  */
  314. fluid_sfloader_t* new_fluid_defsfloader(void);
  315. int delete_fluid_defsfloader(fluid_sfloader_t* loader);
  316. fluid_sfont_t* fluid_defsfloader_load(fluid_sfloader_t* loader, const char* filename);
  317. int fluid_defsfont_sfont_delete(fluid_sfont_t* sfont);
  318. char* fluid_defsfont_sfont_get_name(fluid_sfont_t* sfont);
  319. fluid_preset_t* fluid_defsfont_sfont_get_preset(fluid_sfont_t* sfont, unsigned int bank, unsigned int prenum);
  320. void fluid_defsfont_sfont_iteration_start(fluid_sfont_t* sfont);
  321. int fluid_defsfont_sfont_iteration_next(fluid_sfont_t* sfont, fluid_preset_t* preset);
  322. int fluid_defpreset_preset_delete(fluid_preset_t* preset);
  323. char* fluid_defpreset_preset_get_name(fluid_preset_t* preset);
  324. int fluid_defpreset_preset_get_banknum(fluid_preset_t* preset);
  325. int fluid_defpreset_preset_get_num(fluid_preset_t* preset);
  326. int fluid_defpreset_preset_noteon(fluid_preset_t* preset, fluid_synth_t* synth, int chan, int key, int vel);
  327. /*
  328.  * fluid_defsfont_t
  329.  */
  330. struct _fluid_defsfont_t
  331. {
  332.   char* filename;           /* the filename of this soundfont */
  333.   unsigned int samplepos;   /* the position in the file at which the sample data starts */
  334.   unsigned int samplesize;  /* the size of the sample data */
  335.   short* sampledata;        /* the sample data, loaded in ram */
  336.   fluid_list_t* sample;      /* the samples in this soundfont */
  337.   fluid_defpreset_t* preset; /* the presets of this soundfont */
  338.   fluid_preset_t iter_preset;        /* preset interface used in the iteration */
  339.   fluid_defpreset_t* iter_cur;       /* the current preset in the iteration */
  340. };
  341. fluid_defsfont_t* new_fluid_defsfont(void);
  342. int delete_fluid_defsfont(fluid_defsfont_t* sfont);
  343. int fluid_defsfont_load(fluid_defsfont_t* sfont, const char* file);
  344. char* fluid_defsfont_get_name(fluid_defsfont_t* sfont);
  345. fluid_defpreset_t* fluid_defsfont_get_preset(fluid_defsfont_t* sfont, unsigned int bank, unsigned int prenum);
  346. void fluid_defsfont_iteration_start(fluid_defsfont_t* sfont);
  347. int fluid_defsfont_iteration_next(fluid_defsfont_t* sfont, fluid_preset_t* preset);
  348. int fluid_defsfont_load_sampledata(fluid_defsfont_t* sfont);
  349. int fluid_defsfont_add_sample(fluid_defsfont_t* sfont, fluid_sample_t* sample);
  350. int fluid_defsfont_add_preset(fluid_defsfont_t* sfont, fluid_defpreset_t* preset);
  351. fluid_sample_t* fluid_defsfont_get_sample(fluid_defsfont_t* sfont, char *s);
  352. /*
  353.  * fluid_preset_t
  354.  */
  355. struct _fluid_defpreset_t
  356. {
  357.   fluid_defpreset_t* next;
  358.   fluid_defsfont_t* sfont;                  /* the soundfont this preset belongs to */
  359.   char name[21];                        /* the name of the preset */
  360.   unsigned int bank;                    /* the bank number */
  361.   unsigned int num;                     /* the preset number */
  362.   fluid_preset_zone_t* global_zone;        /* the global zone of the preset */
  363.   fluid_preset_zone_t* zone;               /* the chained list of preset zones */
  364. };
  365. fluid_defpreset_t* new_fluid_defpreset(fluid_defsfont_t* sfont);
  366. int delete_fluid_defpreset(fluid_defpreset_t* preset);
  367. fluid_defpreset_t* fluid_defpreset_next(fluid_defpreset_t* preset);
  368. int fluid_defpreset_import_sfont(fluid_defpreset_t* preset, SFPreset* sfpreset, fluid_defsfont_t* sfont);
  369. int fluid_defpreset_set_global_zone(fluid_defpreset_t* preset, fluid_preset_zone_t* zone);
  370. int fluid_defpreset_add_zone(fluid_defpreset_t* preset, fluid_preset_zone_t* zone);
  371. fluid_preset_zone_t* fluid_defpreset_get_zone(fluid_defpreset_t* preset);
  372. fluid_preset_zone_t* fluid_defpreset_get_global_zone(fluid_defpreset_t* preset);
  373. int fluid_defpreset_get_banknum(fluid_defpreset_t* preset);
  374. int fluid_defpreset_get_num(fluid_defpreset_t* preset);
  375. char* fluid_defpreset_get_name(fluid_defpreset_t* preset);
  376. int fluid_defpreset_noteon(fluid_defpreset_t* preset, fluid_synth_t* synth, int chan, int key, int vel);
  377. /*
  378.  * fluid_preset_zone
  379.  */
  380. struct _fluid_preset_zone_t
  381. {
  382.   fluid_preset_zone_t* next;
  383.   char* name;
  384.   fluid_inst_t* inst;
  385.   int keylo;
  386.   int keyhi;
  387.   int vello;
  388.   int velhi;
  389.   fluid_gen_t gen[GEN_LAST];
  390.   fluid_mod_t * mod; /* List of modulators */
  391. };
  392. fluid_preset_zone_t* new_fluid_preset_zone(char* name);
  393. int delete_fluid_preset_zone(fluid_preset_zone_t* zone);
  394. fluid_preset_zone_t* fluid_preset_zone_next(fluid_preset_zone_t* preset);
  395. int fluid_preset_zone_import_sfont(fluid_preset_zone_t* zone, SFZone* sfzone, fluid_defsfont_t* sfont);
  396. int fluid_preset_zone_inside_range(fluid_preset_zone_t* zone, int key, int vel);
  397. fluid_inst_t* fluid_preset_zone_get_inst(fluid_preset_zone_t* zone);
  398. /*
  399.  * fluid_inst_t
  400.  */
  401. struct _fluid_inst_t
  402. {
  403.   char name[21];
  404.   fluid_inst_zone_t* global_zone;
  405.   fluid_inst_zone_t* zone;
  406. };
  407. fluid_inst_t* new_fluid_inst(void);
  408. int delete_fluid_inst(fluid_inst_t* inst);
  409. int fluid_inst_import_sfont(fluid_inst_t* inst, SFInst *sfinst, fluid_defsfont_t* sfont);
  410. int fluid_inst_set_global_zone(fluid_inst_t* inst, fluid_inst_zone_t* zone);
  411. int fluid_inst_add_zone(fluid_inst_t* inst, fluid_inst_zone_t* zone);
  412. fluid_inst_zone_t* fluid_inst_get_zone(fluid_inst_t* inst);
  413. fluid_inst_zone_t* fluid_inst_get_global_zone(fluid_inst_t* inst);
  414. /*
  415.  * fluid_inst_zone_t
  416.  */
  417. struct _fluid_inst_zone_t
  418. {
  419.   fluid_inst_zone_t* next;
  420.   char* name;
  421.   fluid_sample_t* sample;
  422.   int keylo;
  423.   int keyhi;
  424.   int vello;
  425.   int velhi;
  426.   fluid_gen_t gen[GEN_LAST];
  427.   fluid_mod_t * mod; /* List of modulators */
  428. };
  429. fluid_inst_zone_t* new_fluid_inst_zone(char* name);
  430. int delete_fluid_inst_zone(fluid_inst_zone_t* zone);
  431. fluid_inst_zone_t* fluid_inst_zone_next(fluid_inst_zone_t* zone);
  432. int fluid_inst_zone_import_sfont(fluid_inst_zone_t* zone, SFZone *sfzone, fluid_defsfont_t* sfont);
  433. int fluid_inst_zone_inside_range(fluid_inst_zone_t* zone, int key, int vel);
  434. fluid_sample_t* fluid_inst_zone_get_sample(fluid_inst_zone_t* zone);
  435. fluid_sample_t* new_fluid_sample(void);
  436. int delete_fluid_sample(fluid_sample_t* sample);
  437. int fluid_sample_import_sfont(fluid_sample_t* sample, SFSample* sfsample, fluid_defsfont_t* sfont);
  438. int fluid_sample_in_rom(fluid_sample_t* sample);
  439. #endif  /* _FLUID_SFONT_H */