fluid_phase.h
上传用户: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. #ifndef _FLUID_PHASE_H
  21. #define _FLUID_PHASE_H
  22. #if HAVE_CONFIG_H
  23. #include "config.h"
  24. #endif
  25. /*
  26.  *  phase
  27.  */
  28. #define FLUID_INTERP_BITS        8
  29. #define FLUID_INTERP_BITS_MASK   0xff000000
  30. #define FLUID_INTERP_BITS_SHIFT  24
  31. #define FLUID_INTERP_MAX         256
  32. #define FLUID_FRACT_MAX ((double)4294967296.0)
  33. /* fluid_phase_t
  34. * Purpose:
  35. * Playing pointer for voice playback
  36. *
  37. * When a sample is played back at a different pitch, the playing pointer in the
  38. * source sample will not advance exactly one sample per output sample.
  39. * This playing pointer is implemented using fluid_phase_t.
  40. * It is a 64 bit number. The higher 32 bits contain the 'index' (number of
  41. * the current sample), the lower 32 bits the fractional part.
  42. */
  43. typedef unsigned long long fluid_phase_t;
  44. /* Purpose:
  45.  * Set a to b.
  46.  * a: fluid_phase_t
  47.  * b: fluid_phase_t
  48.  */
  49. #define fluid_phase_set(a,b) a=b;
  50. #define fluid_phase_set_int(a, b)    ((a) = ((unsigned long long)(b)) << 32)
  51. /* Purpose:
  52.  * Sets the phase a to a phase increment given in b.
  53.  * For example, assume b is 0.9. After setting a to it, adding a to
  54.  * the playing pointer will advance it by 0.9 samples. */
  55. #define fluid_phase_set_float(a, b) 
  56.   (a) = (((unsigned long long)(b)) << 32) 
  57.   | (uint32) (((double)(b) - (int)(b)) * (double)FLUID_FRACT_MAX)
  58. /* create a fluid_phase_t from an index and a fraction value */
  59. #define fluid_phase_from_index_fract(index, fract) 
  60.   ((((unsigned long long)(index)) << 32) + (fract))
  61. /* Purpose:
  62.  * Return the index and the fractional part, respectively. */
  63. #define fluid_phase_index(_x) 
  64.   ((unsigned int)((_x) >> 32))
  65. #define fluid_phase_fract(_x) 
  66.   ((uint32)((_x) & 0xFFFFFFFF))
  67. /* Get the phase index with fractional rounding */
  68. #define fluid_phase_index_round(_x) 
  69.   ((unsigned int)(((_x) + 0x80000000) >> 32))
  70. /* Purpose:
  71.  * Takes the fractional part of the argument phase and
  72.  * calculates the corresponding position in the interpolation table.
  73.  * The fractional position of the playing pointer is calculated with a quite high
  74.  * resolution (32 bits). It would be unpractical to keep a set of interpolation
  75.  * coefficients for each possible fractional part...
  76.  */
  77. #define fluid_phase_fract_to_tablerow(_x) 
  78.   ((unsigned int)(fluid_phase_fract(_x) & FLUID_INTERP_BITS_MASK) >> FLUID_INTERP_BITS_SHIFT)
  79. #define fluid_phase_double(_x) 
  80.   ((double)(fluid_phase_index(_x)) + ((double)fluid_phase_fract(_x) / FLUID_FRACT_MAX))
  81. /* Purpose:
  82.  * Advance a by a step of b (both are fluid_phase_t).
  83.  */
  84. #define fluid_phase_incr(a, b)  a += b
  85. /* Purpose:
  86.  * Subtract b from a (both are fluid_phase_t).
  87.  */
  88. #define fluid_phase_decr(a, b)  a -= b
  89. /* Purpose:
  90.  * Subtract b samples from a.
  91.  */
  92. #define fluid_phase_sub_int(a, b)  ((a) -= (unsigned long long)(b) << 32)
  93. /* Purpose:
  94.  * Creates the expression a.index++. */
  95. #define fluid_phase_index_plusplus(a)  (((a) += 0x100000000LL)
  96. #endif  /* _FLUID_PHASE_H */