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

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. #include "fluid_tuning.h"
  21. #include "fluidsynth_priv.h"
  22. #include "fluid_sys.h"
  23. fluid_tuning_t* new_fluid_tuning(const char* name, int bank, int prog)
  24. {
  25.   fluid_tuning_t* tuning;
  26.   int i;
  27.   tuning = FLUID_NEW(fluid_tuning_t);
  28.   if (tuning == NULL) {
  29.     FLUID_LOG(FLUID_PANIC, "Out of memory");
  30.     return NULL;
  31.   }
  32.   tuning->name = NULL;
  33.   if (name != NULL) {
  34.     tuning->name = FLUID_STRDUP(name);
  35.   }
  36.   tuning->bank = bank;
  37.   tuning->prog = prog;
  38.   for (i = 0; i < 128; i++) {
  39.     tuning->pitch[i] = i * 100.0;
  40.   }
  41.   tuning->refcount = 1;         /* Start with a refcount of 1 */
  42.   return tuning;
  43. }
  44. /* Duplicate a tuning */
  45. fluid_tuning_t *
  46. fluid_tuning_duplicate (fluid_tuning_t *tuning)
  47. {
  48.   fluid_tuning_t *new_tuning;
  49.   int i;
  50.   new_tuning = FLUID_NEW (fluid_tuning_t);
  51.   if (!new_tuning) {
  52.     FLUID_LOG (FLUID_PANIC, "Out of memory");
  53.     return NULL;
  54.   }
  55.   if (tuning->name)
  56.   {
  57.     new_tuning->name = FLUID_STRDUP (tuning->name);
  58.     if (!new_tuning->name)
  59.     {
  60.       FLUID_FREE (new_tuning);
  61.       FLUID_LOG (FLUID_PANIC, "Out of memory");
  62.       return NULL;
  63.     }
  64.   }
  65.   else new_tuning->name = NULL;
  66.   new_tuning->bank = tuning->bank;
  67.   new_tuning->prog = tuning->prog;
  68.   for (i = 0; i < 128; i++)
  69.     new_tuning->pitch[i] = tuning->pitch[i];
  70.   new_tuning->refcount = 1;     /* Start with a refcount of 1 */
  71.   return new_tuning;
  72. }
  73. void
  74. delete_fluid_tuning (fluid_tuning_t *tuning)
  75. {
  76.   if (tuning->name) FLUID_FREE (tuning->name);
  77.   FLUID_FREE (tuning);
  78. }
  79. /* Add a reference to a tuning object */
  80. void
  81. fluid_tuning_ref (fluid_tuning_t *tuning)
  82. {
  83.   fluid_return_if_fail (tuning != NULL);
  84.   fluid_atomic_int_inc (&tuning->refcount);
  85. }
  86. /* Unref a tuning object, when it reaches 0 it is deleted, returns TRUE if deleted */
  87. int
  88. fluid_tuning_unref (fluid_tuning_t *tuning, int count)
  89. {
  90.   fluid_return_val_if_fail (tuning != NULL, FALSE);
  91.   /* Add and compare are separate, but that is OK, since refcount will only
  92.    * reach 0 when there are no references and therefore no possibility of
  93.    * another thread adding a reference in between */
  94.   fluid_atomic_int_add (&tuning->refcount, -count);
  95.   /* Delete when refcount reaches 0 */
  96.   if (!fluid_atomic_int_get (&tuning->refcount))
  97.   {
  98.     delete_fluid_tuning (tuning);
  99.     return TRUE;
  100.   }
  101.   else return FALSE;
  102. }
  103. void fluid_tuning_set_name(fluid_tuning_t* tuning, char* name)
  104. {
  105.   if (tuning->name != NULL) {
  106.     FLUID_FREE(tuning->name);
  107.     tuning->name = NULL;
  108.   }
  109.   if (name != NULL) {
  110.     tuning->name = FLUID_STRDUP(name);
  111.   }
  112. }
  113. char* fluid_tuning_get_name(fluid_tuning_t* tuning)
  114. {
  115.   return tuning->name;
  116. }
  117. void fluid_tuning_set_key(fluid_tuning_t* tuning, int key, double pitch)
  118. {
  119.   tuning->pitch[key] = pitch;
  120. }
  121. void fluid_tuning_set_octave(fluid_tuning_t* tuning, const double* pitch_deriv)
  122. {
  123.   int i;
  124.   for (i = 0; i < 128; i++) {
  125.     tuning->pitch[i] = i * 100.0 + pitch_deriv[i % 12];
  126.   }
  127. }
  128. void fluid_tuning_set_all(fluid_tuning_t* tuning, const double* pitch)
  129. {
  130.   int i;
  131.   for (i = 0; i < 128; i++) {
  132.     tuning->pitch[i] = pitch[i];
  133.   }
  134. }
  135. void fluid_tuning_set_pitch(fluid_tuning_t* tuning, int key, double pitch)
  136. {
  137.   if ((key >= 0) && (key < 128)) {
  138.     tuning->pitch[key] = pitch;
  139.   }
  140. }