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 *****************************************************************************/
28 * Transform the velocity according the scaling parameter (velocity sensing)
31 VelF(REALTYPE velocity
,unsigned char scaling
)
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)
45 return pow(velocity
, x
);
50 zyn_velocity_scale(float velocity
, float scaling
)
54 x
= pow(VELOCITY_MAX_SCALE
, scaling
);
56 if (scaling
< -0.99 || velocity
> 0.99)
62 return pow(velocity
, x
);
67 * Get the detune in cents
72 unsigned short int coarsedetune
,
73 unsigned short int finedetune
)
75 REALTYPE det
=0.0,octdet
=0.0,cdet
=0.0,findet
=0.0;
78 int octave
=coarsedetune
/1024;
79 if (octave
>=8) octave
-=16;
82 //Coarse and fine detune
83 int cdetune
=coarsedetune
%1024;
84 if (cdetune
>512) cdetune
-=1024;
86 int fdetune
=finedetune
-8192;
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;
93 case 3: cdet
=fabs(cdetune
*100);
94 findet
=pow(10,fabs(fdetune
/8192.0)*3.0)/10.0-0.1;
96 case 4: cdet
=fabs(cdetune
*701.95500087); //perfect fifth
97 findet
=(pow(2,fabs(fdetune
/8192.0)*12.0)-1.0)/4095*1200;
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"
104 if (finedetune
<8192) findet
=-findet
;
105 if (cdetune
<0) cdet
=-cdet
;
107 det
=octdet
+cdet
+findet
;
113 zyn_sample_type
* buffer
,
125 zyn_sample_type
* buffer1
,
126 zyn_sample_type
* buffer2
,
139 zyn_sample_type
* buffer_mix_1
,
140 zyn_sample_type
* buffer_mix_2
,
141 zyn_sample_type
* buffer1
,
142 zyn_sample_type
* buffer2
,
148 buffer_mix_1
[size
] += buffer1
[size
];
149 buffer_mix_2
[size
] += buffer2
[size
];
155 zyn_sample_type
* buffer1
,
156 zyn_sample_type
* buffer2
,
159 zyn_sample_type fade
;
163 fade
= 1.0 - (zyn_sample_type
)size
/ (zyn_sample_type
)SOUND_BUFFER_SIZE
;
165 buffer1
[size
] *= fade
;
166 buffer2
[size
] *= fade
;
172 zyn_sample_type
* buffer_dest
,
173 zyn_sample_type
* buffer_src
,
179 buffer_dest
[size
] = buffer_src
[size
];
185 zyn_sample_type
* buffer
,
192 buffer
[size
] *= multiplyer
;
199 return rand() / (RAND_MAX
+ 1.0);