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 *****************************************************************************/
29 * Transform the velocity according the scaling parameter (velocity sensing)
32 VelF(REALTYPE velocity
,unsigned char scaling
)
36 x
= (64.0 - scaling
) / 64.0; /* 0 .. 127 -> 1 .. -1 */
38 x
= pow(VELOCITY_MAX_SCALE
, x
);
40 if (scaling
== 127 || velocity
> 0.99)
46 return pow(velocity
, x
);
51 zyn_velocity_scale(float velocity
, float scaling
)
55 x
= pow(VELOCITY_MAX_SCALE
, scaling
);
57 if (scaling
< -0.99 || velocity
> 0.99)
63 return pow(velocity
, x
);
68 * Get the detune in cents
82 case ZYN_DETUNE_TYPE_L35CENTS
:
84 findet
= fabs(fine
) * 35.0; // almost like "Paul's Sound Designer 2"
85 case ZYN_DETUNE_TYPE_L10CENTS
:
86 cdet
= fabs(coarse
* 10.0);
87 findet
= fabs(fine
) * 10.0;
89 case ZYN_DETUNE_TYPE_E100CENTS
:
91 findet
= pow(10, fabs(fine
) * 3.0) / 10.0 - 0.1;
93 case ZYN_DETUNE_TYPE_E1200CENTS
:
94 cdet
= coarse
* 701.95500087; // perfect fifth
95 findet
= (pow(2, fabs(fine
) * 12.0) - 1.0) / 4095 * 1200;
102 /* we compute detune using fabs(fine) so we need to adjust detune sign */
108 return octave
* 1200.0 + 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);