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

midi

开发平台:

C/C++

  1. /* FluidSynth FX - An example of using effects with fluidsynth
  2.  *
  3.  * This code is in the public domain.
  4.  *
  5.  * To compile:
  6.  *   gcc -g -O -o fluidsynth_fx fluidsynth_fx.c -lfluidsynth
  7.  *
  8.  * To run
  9.  *   fluidsynth_fx soundfont gain
  10.  *
  11.  * [Peter Hanappe]
  12.  */
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <fluidsynth.h>
  16. /* The structure with the effects data. This example simply applies a
  17.  * linear gain the to synthesizer output. */
  18. struct fx_data_t {
  19. fluid_synth_t* synth;
  20. float gain;
  21. } fx_data_t;
  22. /* This function implements the callback function of the audio driver
  23.  * (see new_fluid_audio_driver2 below). The data argument is a pointer
  24.  * to your private data structure. 'len' is the number of samples in
  25.  * the buffers. 'nin' and 'nout' are the number of input and output
  26.  * audio buffers. 'in' and 'out' are an array of float buffers with
  27.  * the samples. The audio driver fills the 'in' buffers the incoming
  28.  * audio. The 'out' buffers should be filled by your function. The
  29.  * 'out' buffers will be sent to the audio output of the sound card.
  30.  *
  31.  * IMPORTANT NOTE: The API was designed to be generic but none of the
  32.  * audio drivers currently handles audio input. Either 'nin' will be
  33.  * zero, or the buffers will be filled with zero samples.
  34.  */
  35. int fx_function(void* data, int len, 
  36. int nin, float** in, 
  37. int nout, float** out)
  38. {
  39. struct fx_data_t* fx_data = (struct fx_data_t*) data;
  40. int i, k;
  41. float* out_i;
  42. /* Call the synthesizer to fill the output buffers with its
  43.  * audio output. */
  44. if (fluid_synth_process(fx_data->synth, len, nin, in, nout, out) != 0) {
  45. /* Some error occured. Very unlikely to happen, though. */
  46. return -1;
  47. }
  48. /* Apply your effects here. In this example, the gain is
  49.  * applied to all the output buffers. */
  50. for (i = 0; i < nout; i++) {
  51. out_i = out[i];
  52. for (k = 0; k < len; k++) {
  53. out_i[k] *= fx_data->gain;
  54. }
  55. }
  56. return 0;
  57. }
  58. int main(int argc, char** argv) 
  59. {
  60. fluid_settings_t* settings;
  61. fluid_synth_t* synth = NULL;
  62. fluid_audio_driver_t* adriver = NULL;
  63. int err = 0;
  64. struct fx_data_t fx_data;
  65. if (argc != 3) {
  66. fprintf(stderr, "Usage: fluidsynth_simple [soundfont] [gain]n");
  67. return 1;
  68. }
  69. /* Create the settings object. This example uses the default
  70.  * values for the settings. */
  71. settings = new_fluid_settings();
  72. if (settings == NULL) {
  73. fprintf(stderr, "Failed to create the settingsn");
  74. err = 2;
  75. goto cleanup;
  76. }
  77.   
  78. /* Create the synthesizer */
  79. synth = new_fluid_synth(settings);
  80. if (synth == NULL) {
  81. fprintf(stderr, "Failed to create the synthesizern");
  82. err = 3;
  83. goto cleanup;
  84. }
  85. /* Load the soundfont */
  86. if (fluid_synth_sfload(synth, argv[1], 1) == -1) {
  87. fprintf(stderr, "Failed to load the SoundFontn");
  88. err = 4;
  89. goto cleanup;
  90. }
  91. /* Fill in the data of the effects unit */
  92. fx_data.synth = synth;
  93. fx_data.gain = atof(argv[2]);
  94. /* Create the audio driver. As soon as the audio driver is
  95.  * created, the synthesizer can be played. */
  96. adriver = new_fluid_audio_driver2(settings, fx_function, (void*) &fx_data);
  97. if (adriver == NULL) {
  98. fprintf(stderr, "Failed to create the audio drivern");
  99. err = 5;
  100. goto cleanup;
  101. }
  102. /* Play a note */
  103. fluid_synth_noteon(synth, 0, 60, 100);
  104. printf("Press "Enter" to stop: ");
  105. fgetc(stdin);
  106. printf("donen");
  107.  cleanup:
  108. if (adriver) {
  109. delete_fluid_audio_driver(adriver);
  110. }
  111. if (synth) {
  112. delete_fluid_synth(synth);
  113. }
  114. if (settings) {
  115. delete_fluid_settings(settings);
  116. }
  117. return err;
  118. }