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

midi

开发平台:

C/C++

  1. /* FluidSynth - A Software Synthesizer
  2.  *
  3.  * Copyright (C) 2003  Peter Hanappe and others.
  4.  *
  5.  * This library is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU Library General Public License
  7.  * as published by the Free Software Foundation; either version 2 of
  8.  * the License, or (at your option) any later version.
  9.  *
  10.  * This library is distributed in the hope that it will be useful, but
  11.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  * Library General Public License for more details.
  14.  *  
  15.  * You should have received a copy of the GNU Library General Public
  16.  * License along with this library; if not, write to the Free
  17.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
  18.  * 02111-1307, USA
  19.  */
  20. #ifndef _FLUIDSYNTH_SFONT_H
  21. #define _FLUIDSYNTH_SFONT_H
  22. #ifdef __cplusplus
  23. extern "C" {
  24. #endif
  25. /**
  26.  * @file sfont.h
  27.  * @brief SoundFont plugins
  28.  *
  29.  * It is possible to add new SoundFont loaders to the
  30.  * synthesizer. The API uses a couple of "interfaces" (structures
  31.  * with callback functions): #fluid_sfloader_t, #fluid_sfont_t, and
  32.  * #fluid_preset_t.  This API allows for virtual SoundFont files to be loaded
  33.  * and synthesized, which may not actually be SoundFont files, as long as they
  34.  * can be represented by the SoundFont synthesis model.
  35.  *
  36.  * To add a new SoundFont loader to the synthesizer, call
  37.  * fluid_synth_add_sfloader() and pass a pointer to an
  38.  * fluid_sfloader_t structure. The important callback function in
  39.  * this structure is "load", which should try to load a file and
  40.  * returns a #fluid_sfont_t structure, or NULL if it fails.
  41.  *
  42.  * The #fluid_sfont_t structure contains a callback to obtain the
  43.  * name of the SoundFont. It contains two functions to iterate
  44.  * though the contained presets, and one function to obtain a
  45.  * preset corresponding to a bank and preset number. This
  46.  * function should return a #fluid_preset_t structure.
  47.  *
  48.  * The #fluid_preset_t structure contains some functions to obtain
  49.  * information from the preset (name, bank, number). The most
  50.  * important callback is the noteon function. The noteon function
  51.  * should call fluid_synth_alloc_voice() for every sample that has
  52.  * to be played. fluid_synth_alloc_voice() expects a pointer to a
  53.  * #fluid_sample_t structure and returns a pointer to the opaque
  54.  * #fluid_voice_t structure. To set or increment the values of a
  55.  * generator, use fluid_voice_gen_set() or fluid_voice_gen_incr(). When you are
  56.  * finished initializing the voice call fluid_voice_start() to
  57.  * start playing the synthesis voice.
  58.  */
  59. /**
  60.  * Some notification enums for presets and samples.
  61.  */
  62. enum {
  63.   FLUID_PRESET_SELECTED,                /**< Preset selected notify */
  64.   FLUID_PRESET_UNSELECTED,              /**< Preset unselected notify */
  65.   FLUID_SAMPLE_DONE                     /**< Sample no longer needed notify */
  66. };
  67. /**
  68.  * SoundFont loader structure.
  69.  */
  70. struct _fluid_sfloader_t {
  71.   void* data;           /**< User defined data pointer */
  72.   /**
  73.    * The free method should free the memory allocated for the loader in
  74.    * addition to any private data.
  75.    * @param loader SoundFont loader
  76.    * @return Should return 0 if no error occured, non-zero otherwise
  77.    */
  78.   int (*free)(fluid_sfloader_t* loader);
  79.   /**
  80.    * Method to load an instrument file (does not actually need to be a real file name,
  81.    * could be another type of string identifier that the a loader understands).
  82.    * @param loader SoundFont loader
  83.    * @param filename File name or other string identifier
  84.    * @return The loaded instrument file (SoundFont) or NULL if an error occured.
  85.    */
  86.   fluid_sfont_t* (*load)(fluid_sfloader_t* loader, const char* filename);
  87. };
  88. /**
  89.  * Virtual SoundFont instance structure.
  90.  */
  91. struct _fluid_sfont_t {
  92.   void* data;           /**< User defined data */
  93.   unsigned int id;      /**< SoundFont ID */
  94.   /**
  95.    * Method to free a virtual SoundFont bank.
  96.    * @param sfont Virtual SoundFont to free.
  97.    * @return Should return 0 when it was able to free all resources or non-zero
  98.    *   if some of the samples could not be freed because they are still in use,
  99.    *   in which case the free will be tried again later, until success.
  100.    */
  101.   int (*free)(fluid_sfont_t* sfont);
  102.   /**
  103.    * Method to return the name of a virtual SoundFont.
  104.    * @param sfont Virtual SoundFont
  105.    * @return The name of the virtual SoundFont.
  106.    */
  107.   char* (*get_name)(fluid_sfont_t* sfont);
  108.   /**
  109.    * Get a virtual SoundFont preset by bank and program numbers.
  110.    * @param sfont Virtual SoundFont
  111.    * @param bank MIDI bank number (0-16384)
  112.    * @param prenum MIDI preset number (0-127)
  113.    * @return Should return an allocated virtual preset or NULL if it could not
  114.    *   be found.
  115.    */
  116.   fluid_preset_t* (*get_preset)(fluid_sfont_t* sfont, unsigned int bank, unsigned int prenum);
  117.   /**
  118.    * Start virtual SoundFont preset iteration method.
  119.    * @param sfont Virtual SoundFont
  120.    *
  121.    * Starts/re-starts virtual preset iteration in a SoundFont.
  122.    */
  123.   void (*iteration_start)(fluid_sfont_t* sfont);
  124.   /**
  125.    * Virtual SoundFont preset iteration function.
  126.    * @param sfont Virtual SoundFont
  127.    * @param preset Caller supplied preset to fill in with current preset information
  128.    * @return 0 when no more presets are available, 1 otherwise
  129.    *
  130.    * Should store preset information to the caller supplied a preset structure
  131.    * and advance the internal iteration state to the next preset for subsequent
  132.    * calls.
  133.    */
  134.   int (*iteration_next)(fluid_sfont_t* sfont, fluid_preset_t* preset);
  135. };
  136. #define fluid_sfont_get_id(_sf) ((_sf)->id)
  137. /**
  138.  * Virtual SoundFont preset.
  139.  */
  140. struct _fluid_preset_t {
  141.   void* data;                                   /**< User supplied data */
  142.   fluid_sfont_t* sfont;                         /**< Parent virtual SoundFont */
  143.   /**
  144.    * Method to free a virtual SoundFont preset.
  145.    * @param preset Virtual SoundFont preset
  146.    * @return Should return 0
  147.    */
  148.   int (*free)(fluid_preset_t* preset);
  149.   /**
  150.    * Method to get a virtual SoundFont preset name.
  151.    * @param preset Virtual SoundFont preset
  152.    * @return Should return the name of the preset.  The returned string must be
  153.    *   valid for the duration of the virtual preset (or the duration of the
  154.    *   SoundFont, in the case of preset iteration).
  155.    */
  156.   char* (*get_name)(fluid_preset_t* preset);
  157.   /**
  158.    * Method to get a virtual SoundFont preset MIDI bank number.
  159.    * @param preset Virtual SoundFont preset
  160.    * @param return The bank number of the preset
  161.    */
  162.   int (*get_banknum)(fluid_preset_t* preset);
  163.   /**
  164.    * Method to get a virtual SoundFont preset MIDI program number.
  165.    * @param preset Virtual SoundFont preset
  166.    * @param return The program number of the preset
  167.    */
  168.   int (*get_num)(fluid_preset_t* preset);
  169.   /**
  170.    * Method to handle a noteon event (synthesize the instrument).
  171.    * @param preset Virtual SoundFont preset
  172.    * @param synth Synthesizer instance
  173.    * @param chan MIDI channel number of the note on event
  174.    * @param key MIDI note number (0-127)
  175.    * @param vel MIDI velocity (0-127)
  176.    * @return #FLUID_OK on success (0) or #FLUID_FAILED (-1) otherwise
  177.    *
  178.    * This method may be called from within synthesis context and therefore
  179.    * should be as efficient as possible and not perform any operations considered
  180.    * bad for realtime audio output (memory allocations and other OS calls).
  181.    *
  182.    * Call fluid_synth_alloc_voice() for every sample that has
  183.    * to be played. fluid_synth_alloc_voice() expects a pointer to a
  184.    * #fluid_sample_t structure and returns a pointer to the opaque
  185.    * #fluid_voice_t structure. To set or increment the values of a
  186.    * generator, use fluid_voice_gen_set() or fluid_voice_gen_incr(). When you are
  187.    * finished initializing the voice call fluid_voice_start() to
  188.    * start playing the synthesis voice.  Starting with FluidSynth 1.1.0 all voices
  189.    * created will be started at the same time.
  190.    */
  191.   int (*noteon)(fluid_preset_t* preset, fluid_synth_t* synth, int chan, int key, int vel);
  192.   /**
  193.    * Virtual SoundFont preset notify method.
  194.    * @param preset Virtual SoundFont preset
  195.    * @param reason #FLUID_PRESET_SELECTED or #FLUID_PRESET_UNSELECTED
  196.    * @param chan MIDI channel number
  197.    * @return Should return #FLUID_OK
  198.    *
  199.    * Implement this optional method if the preset needs to be notified about
  200.    * preset select and unselect events.
  201.    *
  202.    * This method may be called from within synthesis context and therefore
  203.    * should be as efficient as possible and not perform any operations considered
  204.    * bad for realtime audio output (memory allocations and other OS calls).
  205.    */
  206.   int (*notify)(fluid_preset_t* preset, int reason, int chan);
  207. };
  208. /**
  209.  * Virtual SoundFont sample.
  210.  */
  211. struct _fluid_sample_t
  212. {
  213.   char name[21];                /**< Sample name */
  214.   unsigned int start;           /**< Start index */
  215.   unsigned int end;         /**< End index, index of last valid sample point (contrary to SF spec) */
  216.   unsigned int loopstart;       /**< Loop start index */
  217.   unsigned int loopend;         /**< Loop end index, first point following the loop (superimposed on loopstart) */
  218.   unsigned int samplerate;      /**< Sample rate */
  219.   int origpitch;                /**< Original pitch (MIDI note number, 0-127) */
  220.   int pitchadj;                 /**< Fine pitch adjustment (+/- 99 cents) */
  221.   int sampletype;               /**< Values: #FLUID_SAMPLETYPE_MONO, FLUID_SAMPLETYPE_RIGHT, FLUID_SAMPLETYPE_LEFT, FLUID_SAMPLETYPE_ROM */
  222.   int valid;                    /**< Should be TRUE if sample data is valid, FALSE otherwise (in which case it will not be synthesized) */
  223.   short* data;                  /**< Pointer to the sample's data */
  224.   int amplitude_that_reaches_noise_floor_is_valid;      /**< Indicates if a amplitude_that_reaches_noise_floor is valid (TRUE), set to FALSE initially to calculate. */
  225.   double amplitude_that_reaches_noise_floor;            /**< The amplitude at which the sample's loop will be below the noise floor.  For voice off optimization, calculated automatically. */
  226.   unsigned int refcount;        /**< Count of voices using this sample (use #fluid_sample_refcount to access this field) */
  227.   /**
  228.    * Implement this function to receive notification when sample is no longer used.
  229.    * @param sample Virtual SoundFont sample
  230.    * @param reason #FLUID_SAMPLE_DONE only currently
  231.    * @return Should return #FLUID_OK
  232.    */
  233.   int (*notify)(fluid_sample_t* sample, int reason);
  234.   void* userdata;       /**< User defined data */
  235. };
  236. #define fluid_sample_refcount(_sample) ((_sample)->refcount)    /**< Get the reference count of a sample.  Should only be called from within synthesis context (noteon method for example) */
  237. #define FLUID_SAMPLETYPE_MONO 1       /**< Flag for #fluid_sample_t a sampletype field for mono samples */
  238. #define FLUID_SAMPLETYPE_RIGHT 2       /**< Flag for #fluid_sample_t a sampletype field for right samples of a stereo pair */
  239. #define FLUID_SAMPLETYPE_LEFT 4       /**< Flag for #fluid_sample_t a sampletype field for left samples of a stereo pair */
  240. #define FLUID_SAMPLETYPE_LINKED 8       /**< Flag for #fluid_sample_t a sampletype field, not used currently */
  241. #define FLUID_SAMPLETYPE_ROM 0x8000  /**< Flag for #fluid_sample_t a sampletype field, ROM sample, causes sample to be ignored */
  242. #ifdef __cplusplus
  243. }
  244. #endif
  245. #endif /* _FLUIDSYNTH_SFONT_H */