Expose all 8 voices
[zyn.git] / util.c
blob3c733f077e91c9bd62eff7d743e096afb7f30371
1 /* -*- Mode: C ; c-basic-offset: 2 -*- */
2 /*****************************************************************************
4 * Copyright (C) 2006,2007,2008,2009 Nedko Arnaudov <nedko@arnaudov.name>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19 *****************************************************************************/
21 #include <math.h>
22 #include <stdlib.h>
24 #include "common.h"
25 #include "util.h"
28 * Transform the velocity according the scaling parameter (velocity sensing)
30 float
31 VelF(REALTYPE velocity,unsigned char scaling)
33 float x;
35 x = (64.0 - scaling) / 64.0; /* 0 .. 127 -> 1 .. -1 */
37 x = pow(VELOCITY_MAX_SCALE, x);
39 if (scaling == 127 || velocity > 0.99)
41 return 1.0;
43 else
45 return pow(velocity, x);
49 float
50 zyn_velocity_scale(float velocity, float scaling)
52 float x;
54 x = pow(VELOCITY_MAX_SCALE, scaling);
56 if (scaling < -0.99 || velocity > 0.99)
58 return 1.0;
60 else
62 return pow(velocity, x);
67 * Get the detune in cents
69 REALTYPE
70 getdetune(
71 unsigned char type,
72 unsigned short int coarsedetune,
73 unsigned short int finedetune)
75 REALTYPE det=0.0,octdet=0.0,cdet=0.0,findet=0.0;
77 //Get Octave
78 int octave=coarsedetune/1024;
79 if (octave>=8) octave-=16;
80 octdet=octave*1200.0;
82 //Coarse and fine detune
83 int cdetune=coarsedetune%1024;
84 if (cdetune>512) cdetune-=1024;
86 int fdetune=finedetune-8192;
88 switch (type){
89 // case 1: is used for the default (see below)
90 case 2: cdet=fabs(cdetune*10.0);
91 findet=fabs(fdetune/8192.0)*10.0;
92 break;
93 case 3: cdet=fabs(cdetune*100);
94 findet=pow(10,fabs(fdetune/8192.0)*3.0)/10.0-0.1;
95 break;
96 case 4: cdet=fabs(cdetune*701.95500087); //perfect fifth
97 findet=(pow(2,fabs(fdetune/8192.0)*12.0)-1.0)/4095*1200;
98 break;
99 //case ...: need to update N_DETUNE_TYPES, if you'll add more
100 default:cdet=fabs(cdetune*50.0);
101 findet=fabs(fdetune/8192.0)*35.0;//almost like "Paul's Sound Designer 2"
102 break;
104 if (finedetune<8192) findet=-findet;
105 if (cdetune<0) cdet=-cdet;
107 det=octdet+cdet+findet;
108 return(det);
111 void
112 silence_buffer(
113 zyn_sample_type * buffer,
114 size_t size)
116 while (size)
118 size--;
119 buffer[size] = 0.0;
123 void
124 silence_two_buffers(
125 zyn_sample_type * buffer1,
126 zyn_sample_type * buffer2,
127 size_t size)
129 while (size)
131 size--;
132 buffer1[size] = 0.0;
133 buffer2[size] = 0.0;
137 void
138 mix_add_two_buffers(
139 zyn_sample_type * buffer_mix_1,
140 zyn_sample_type * buffer_mix_2,
141 zyn_sample_type * buffer1,
142 zyn_sample_type * buffer2,
143 size_t size)
145 while (size)
147 size--;
148 buffer_mix_1[size] += buffer1[size];
149 buffer_mix_2[size] += buffer2[size];
153 void
154 fadeout_two_buffers(
155 zyn_sample_type * buffer1,
156 zyn_sample_type * buffer2,
157 size_t size)
159 zyn_sample_type fade;
161 while (size)
163 fade = 1.0 - (zyn_sample_type)size / (zyn_sample_type)SOUND_BUFFER_SIZE;
164 size--;
165 buffer1[size] *= fade;
166 buffer2[size] *= fade;
170 void
171 copy_buffer(
172 zyn_sample_type * buffer_dest,
173 zyn_sample_type * buffer_src,
174 size_t size)
176 while (size)
178 size--;
179 buffer_dest[size] = buffer_src[size];
183 void
184 multiply_buffer(
185 zyn_sample_type * buffer,
186 float multiplyer,
187 size_t size)
189 while (size)
191 size--;
192 buffer[size] *= multiplyer;
196 float
197 zyn_random()
199 return rand() / (RAND_MAX + 1.0);