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

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 _FLUID_SYNTH_H
  21. #define _FLUID_SYNTH_H
  22. /***************************************************************
  23.  *
  24.  *                         INCLUDES
  25.  */
  26. #if HAVE_CONFIG_H
  27. #include "config.h"
  28. #endif
  29. #include "fluidsynth_priv.h"
  30. #include "fluid_event_queue.h"
  31. #include "fluid_list.h"
  32. #include "fluid_rev.h"
  33. #include "fluid_voice.h"
  34. #include "fluid_chorus.h"
  35. #include "fluid_ladspa.h"
  36. #include "fluid_midi_router.h"
  37. #include "fluid_sys.h"
  38. /***************************************************************
  39.  *
  40.  *                         DEFINES
  41.  */
  42. #define FLUID_NUM_PROGRAMS      128
  43. #define DRUM_INST_BANK 128
  44. #define FLUID_UNSET_PROGRAM     128     /* Program number used to unset a preset */
  45. #if defined(WITH_FLOAT)
  46. #define FLUID_SAMPLE_FORMAT     FLUID_SAMPLE_FLOAT
  47. #else
  48. #define FLUID_SAMPLE_FORMAT     FLUID_SAMPLE_DOUBLE
  49. #endif
  50. /***************************************************************
  51.  *
  52.  *                         ENUM
  53.  */
  54. enum fluid_loop {
  55.   FLUID_UNLOOPED = 0,
  56.   FLUID_LOOP_DURING_RELEASE = 1,
  57.   FLUID_NOTUSED = 2,
  58.   FLUID_LOOP_UNTIL_RELEASE = 3
  59. };
  60. enum fluid_synth_status
  61. {
  62.   FLUID_SYNTH_CLEAN,
  63.   FLUID_SYNTH_PLAYING,
  64.   FLUID_SYNTH_QUIET,
  65.   FLUID_SYNTH_STOPPED
  66. };
  67. #define SYNTH_REVERB_CHANNEL 0
  68. #define SYNTH_CHORUS_CHANNEL 1
  69. /**
  70.  * Structure used for sfont_info field in #fluid_synth_t for each loaded
  71.  * SoundFont with the SoundFont instance and additional fields.
  72.  */
  73. typedef struct _fluid_sfont_info_t {
  74.   fluid_sfont_t *sfont; /**< Loaded SoundFont */
  75.   fluid_synth_t *synth; /**< Parent synth */
  76.   int refcount;         /**< SoundFont reference count (0 if no presets referencing it) */
  77.   int bankofs;          /**< Bank offset */
  78. } fluid_sfont_info_t;
  79. /*
  80.  * fluid_synth_t
  81.  *
  82.  * Mutual exclusion notes:
  83.  *
  84.  * Set only once on init:
  85.  * ----------------------
  86.  * verbose
  87.  * dump
  88.  * sample_rate (will be runtime change-able in the future)
  89.  * min_note_length_ticks
  90.  * midi_channels
  91.  * audio_channels
  92.  * audio_groups
  93.  * effects_channels
  94.  * start
  95.  * channel[] (Contents change)
  96.  * nvoice
  97.  * voice[] (Contents change)
  98.  * nbuf
  99.  * left_buf[], right_buf[] (Contents change)
  100.  * fx_left_buf[], fx_right_buf[] (Contents change)
  101.  * LADSPA_FxUnit (Contents change)
  102.  * cores
  103.  * core_threads[]
  104.  *
  105.  * Single thread use only (modify only prior to synthesis):
  106.  * loaders<>
  107.  * midi_router
  108.  *
  109.  * Mutex protected:
  110.  * settings{} (has its own mutex)
  111.  * sfont_info<>
  112.  * tuning
  113.  * sfont_id
  114.  * reverb_roomsize, reverb_damping, reverb_width, reverb_level
  115.  * chorus_nr, chorus_level, chorus_speed, chorus_depth, chorus_type
  116.  *
  117.  * Atomic operations:
  118.  * ----------------------
  119.  * with_reverb
  120.  * with_chorus
  121.  * state
  122.  * gain
  123.  * cpu_load
  124.  * noteid
  125.  * storeid
  126.  * outbuf
  127.  * sample_timers
  128.  *
  129.  * Only synth thread changes (atomic operations for non-synth thread reads)
  130.  * -------------------------
  131.  * ticks
  132.  * reverb{}
  133.  * chorus{}
  134.  * cur
  135.  * dither_index
  136.  * polyphony
  137.  * active_voice_count
  138.  */
  139. struct _fluid_synth_t
  140. {
  141.   fluid_thread_id_t synth_thread_id; /**< ID of the synthesis thread or FLUID_THREAD_ID_NULL if not yet set */
  142.   fluid_private_t thread_queues;     /**< Thread private data for event queues for each non-synthesis thread queuing events */
  143.   fluid_event_queue_t *queues[FLUID_MAX_EVENT_QUEUES];   /**< Thread event queues (NULL for unused elements) */
  144.   fluid_rec_mutex_t mutex;           /**< Lock for multi-thread sensitive variables (not used by synthesis process) */
  145.   fluid_list_t *queue_pool;          /**< List of event queues whose threads have been destroyed and which can be re-used */
  146.   fluid_event_queue_t *return_queue; /**< Event queue for events from synthesis thread to non-synthesis threads (memory frees, etc) */
  147.   fluid_thread_t *return_queue_thread;  /**< Return event queue processing thread */
  148.   fluid_cond_mutex_t *return_queue_mutex;       /**< Mutex for return queue condition */
  149.   fluid_cond_t *return_queue_cond;   /**< Return queue thread synchronization condition */
  150.   fluid_settings_t* settings;        /**< the synthesizer settings */
  151.   int device_id;                     /**< Device ID used for SYSEX messages */
  152.   int polyphony;                     /**< Maximum polyphony */
  153.   int shadow_polyphony;              /**< Maximum polyphony shadow value (for non-synth threads) */
  154.   int with_reverb;                  /**< Should the synth use the built-in reverb unit? */
  155.   int with_chorus;                  /**< Should the synth use the built-in chorus unit? */
  156.   int verbose;                      /**< Turn verbose mode on? */
  157.   int dump;                         /**< Dump events to stdout to hook up a user interface? */
  158.   double sample_rate;                /**< The sample rate */
  159.   int midi_channels;                 /**< the number of MIDI channels (>= 16) */
  160.   int audio_channels;                /**< the number of audio channels (1 channel=left+right) */
  161.   int audio_groups;                  /**< the number of (stereo) 'sub'groups from the synth.
  162.   Typically equal to audio_channels. */
  163.   int effects_channels;              /**< the number of effects channels (>= 2) */
  164.   int state;                         /**< the synthesizer state */
  165.   unsigned int ticks;                /**< the number of audio samples since the start */
  166.   unsigned int start;                /**< the start in msec, as returned by system clock */
  167.   fluid_list_t *loaders;             /**< the SoundFont loaders */
  168.   fluid_list_t *sfont_info;          /**< List of fluid_sfont_info_t for each loaded SoundFont (remains until SoundFont is unloaded) */
  169.   fluid_hashtable_t *sfont_hash;     /**< Hash of fluid_sfont_t->fluid_sfont_info_t (remains until SoundFont is deleted) */
  170.   unsigned int sfont_id;             /**< Incrementing ID assigned to each loaded SoundFont */
  171.   float gain;                        /**< master gain */
  172.   fluid_channel_t** channel;         /**< the channels */
  173.   int nvoice;                        /**< the length of the synthesis process array (max polyphony allowed) */
  174.   fluid_voice_t** voice;             /**< the synthesis voices */
  175.   int active_voice_count;            /**< count of active voices */
  176.   unsigned int noteid;               /**< the id is incremented for every new note. it's used for noteoff's  */
  177.   unsigned int storeid;
  178.   int nbuf;                          /**< How many audio buffers are used? (depends on nr of audio channels / groups)*/
  179.   fluid_real_t** left_buf;
  180.   fluid_real_t** right_buf;
  181.   fluid_real_t** fx_left_buf;
  182.   fluid_real_t** fx_right_buf;
  183.   fluid_revmodel_t* reverb;
  184.   fluid_chorus_t* chorus;
  185.   float reverb_roomsize;             /**< Shadow of reverb roomsize */
  186.   float reverb_damping;              /**< Shadow of reverb damping */
  187.   float reverb_width;                /**< Shadow of reverb width */
  188.   float reverb_level;                /**< Shadow of reverb level */
  189.   int chorus_nr;                     /**< Shadow of chorus number */
  190.   float chorus_level;                /**< Shadow of chorus level */
  191.   float chorus_speed;                /**< Shadow of chorus speed */
  192.   float chorus_depth;                /**< Shadow of chorus depth */
  193.   int chorus_type;                   /**< Shadow of chorus type */
  194.   int cur;                           /**< the current sample in the audio buffers to be output */
  195.   int dither_index;      /**< current index in random dither value buffer: fluid_synth_(write_s16|dither_s16) */
  196.   char outbuf[256];                  /**< buffer for message output */
  197.   float cpu_load;                    /**< CPU load in percent (CPU time required / audio synthesized time * 100) */
  198.   fluid_tuning_t*** tuning;          /**< 128 banks of 128 programs for the tunings */
  199.   fluid_private_t tuning_iter;       /**< Tuning iterators per each thread */
  200.   fluid_midi_router_t* midi_router;  /**< The midi router. Could be done nicer. */
  201.   fluid_sample_timer_t* sample_timers; /**< List of timers triggered before a block is processed */
  202.   unsigned int min_note_length_ticks; /**< If note-offs are triggered just after a note-on, they will be delayed */
  203.   int cores;                         /**< Number of CPU cores (1 by default) */
  204.   fluid_thread_t **core_threads;     /**< Array of core threads (cores - 1 in length) */
  205.   unsigned char cores_active;        /**< TRUE if core slave threads should remain active, FALSE to terminate them */
  206.   /* Multi-core variables (protected by core_mutex) */
  207.   fluid_cond_mutex_t *core_mutex;    /**< Mutex to protect all core_ variables and use with core_cond and core_wait_last_cond */
  208.   fluid_cond_t *core_cond;           /**< Thread condition for signaling core slave threads */
  209.   int core_work;                     /**< Boolean: TRUE if there is work, FALSE otherwise */
  210.   /* Used in a lockless atomic fashion */
  211.   int core_voice_index;              /**< Next voice index to process */
  212.   fluid_voice_t **core_voice_processed;  /**< Array for processed voices */
  213.   fluid_real_t *core_bufs;           /**< Block containing audio buffers for each voice (FLUID_BUFSIZE in length each) */
  214.   int core_inprogress;               /**< Count of secondary core threads in progress */
  215.   int core_waiting_for_last;         /**< Boolean: Set to TRUE if primary synthesis thread is waiting for last slave thread to finish */
  216.   fluid_cond_t *core_wait_last_cond; /**< Thread condition for signaling primary synthesis thread when last slave thread finishes */
  217. #ifdef LADSPA
  218.   fluid_LADSPA_FxUnit_t* LADSPA_FxUnit; /**< Effects unit for LADSPA support */
  219. #endif
  220. };
  221. int fluid_synth_setstr(fluid_synth_t* synth, const char* name, const char* str);
  222. int fluid_synth_dupstr(fluid_synth_t* synth, const char* name, char** str);
  223. int fluid_synth_setnum(fluid_synth_t* synth, const char* name, double val);
  224. int fluid_synth_getnum(fluid_synth_t* synth, const char* name, double* val);
  225. int fluid_synth_setint(fluid_synth_t* synth, const char* name, int val);
  226. int fluid_synth_getint(fluid_synth_t* synth, const char* name, int* val);
  227. fluid_preset_t* fluid_synth_find_preset(fluid_synth_t* synth,
  228.       unsigned int banknum,
  229.       unsigned int prognum);
  230. int fluid_synth_all_notes_off(fluid_synth_t* synth, int chan);
  231. int fluid_synth_all_sounds_off(fluid_synth_t* synth, int chan);
  232. int fluid_synth_kill_voice(fluid_synth_t* synth, fluid_voice_t * voice);
  233. void fluid_synth_print_voice(fluid_synth_t* synth);
  234. void fluid_synth_dither_s16(int *dither_index, int len, float* lin, float* rin,
  235.     void* lout, int loff, int lincr,
  236.     void* rout, int roff, int rincr);
  237. int fluid_synth_set_reverb_preset(fluid_synth_t* synth, int num);
  238. int fluid_synth_set_reverb_full(fluid_synth_t* synth, int set, double roomsize,
  239.                                 double damping, double width, double level);
  240. int fluid_synth_set_chorus_full(fluid_synth_t* synth, int set, int nr, double level,
  241.                                 double speed, double depth_ms, int type);
  242. fluid_sample_timer_t* new_fluid_sample_timer(fluid_synth_t* synth, fluid_timer_callback_t callback, void* data);
  243. int delete_fluid_sample_timer(fluid_synth_t* synth, fluid_sample_timer_t* timer);
  244. /*
  245.  * misc
  246.  */
  247. void fluid_synth_settings(fluid_settings_t* settings);
  248. #endif  /* _FLUID_SYNTH_H */