2
Copyright (C) 2003-2006 Fons Adriaensen <fons.adriaensen@skynet.be>
4
This program is free software; you can redistribute it and/or modify
5
it under the terms of the GNU General Public License as published by
6
the Free Software Foundation; either version 2 of the License, or
7
(at your option) any later version.
9
This program is distributed in the hope that it will be useful,
10
but WITHOUT ANY WARRANTY; without even the implied warranty of
11
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
GNU General Public License for more details.
14
You should have received a copy of the GNU General Public License
15
along with this program; if not, write to the Free Software
16
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25
#define M (N_NOTE - 1)
28
#define swap4(a, b) { (a)[0] = (b)[3], (a)[1] = (b)[2], (a)[2] = (b)[1], (a)[3] = (b)[0]; }
37
void N_func::reset (float v)
40
for (int i = 0; i < N_NOTE; i++) _v [i] = v;
44
void N_func::setv (int i, float v)
49
if ((i < 0) || (i > M)) return;
53
for (j = i - 1; (j >= 0) && ! (_b & (1 << j)); j--);
54
if (j < 0) while (++j != i) _v [j] = v;
57
d = (_v [j] - v) / (j - i);
58
while (++j != i) _v [j] = v + (j - i) * d;
61
for (j = i + 1; (j <= M) && ! (_b & (1 << j)); j++);
62
if (j > M) while (--j != i) _v [j] = v;
65
d = (_v [j] - v) / (j - i);
66
while (--j != i) _v [j] = v + (j - i) * d;
71
void N_func::clrv (int i)
76
if ((i < 0) || (i > M)) return;
78
if (! (_b & m) || (_b == m)) return;
81
for (j = i - 1; (j >= 0) && ! (_b & (1 << j)); j--);
82
for (k = i + 1; (k <= M) && ! (_b & (1 << k)); k++);
84
if ((j >= 0) && (k <= M))
86
d = (_v [k] - _v [j]) / (k - j);
87
for (i = j + 1; i < k; i++) _v [i] = _v [i] = _v [j] + (i - j) * d;
92
while (j < M) _v [++j] = d;
97
while (k > 0) _v [--k] = d;
102
void N_func::write (FILE *F)
105
#if (__BYTE_ORDER == __LITTLE_ENDIAN)
107
fwrite (&_b, 1, sizeof (S32), F);
108
fwrite (_v, N_NOTE, sizeof (float), F);
110
#elif (__BYTE_ORDER == __BIG_ENDIAN)
113
char d [N_NOTE * sizeof (float)];
115
swap4 (d, (char *)(&_b));
116
fwrite (d, 1, sizeof (S32), F);
117
for (i = 0; i < N_NOTE; i++) swap4 (d + i * sizeof (float), (char *)(_v + i));
118
fwrite (d, N_NOTE, sizeof (float), F);
121
#error Byte order is undefined !
124
#error Byte order is undefined !
130
void N_func::read (FILE *F)
133
#if (__BYTE_ORDER == __LITTLE_ENDIAN)
135
fread (&_b, 1, sizeof (S32), F);
136
fread (&_v, N_NOTE, sizeof (float), F);
138
#elif (__BYTE_ORDER == __BIG_ENDIAN)
141
char d [sizeof (int) + N_NOTE * sizeof (float)];
143
fread (d, 1, sizeof (S32), F);
144
swap4 ((char *)(&_b), d);
145
fread (d, N_NOTE, sizeof (float), F);
146
for (i = 0; i < N_NOTE; i++) swap4 ((char *)(_v + i), d + i * sizeof (float));
149
#error Byte order is undefined !
152
#error Byte order is undefined !
158
HN_func::HN_func (void)
163
void HN_func::reset (float v)
165
for (int j = 0; j < N_HARM; j++) (_h + j)->reset (v);
169
void HN_func::setv (int i, float v)
171
for (int j = 0; j < N_HARM; j++) (_h + j)->setv (i, v);
175
void HN_func::clrv (int i)
177
for (int j = 0; j < N_HARM; j++) (_h + j)->clrv (i);
181
void HN_func::write (FILE *F, int k)
183
for (int j = 0; j < k; j++) (_h + j)->write (F);
187
void HN_func::read (FILE *F, int k)
189
for (int j = 0; j < k; j++) (_h + j)->read (F);
193
Addsynth::Addsynth (void)
199
void Addsynth::reset (void)
209
_n_vol.reset (-20.0f);
212
_n_att.reset (0.01f);
214
_n_dct.reset (0.01f);
217
_h_lev.reset (-100.0f);
219
_h_att.reset (0.050f);
224
int Addsynth::save (const char *sdir)
232
strcat (path, _filename);
234
if (! (F = fopen (path, "w")))
236
fprintf (stderr, "Can't open '%s' for writing\n", path);
241
strcpy (d, "AEOLUS");
249
fwrite (d, 1, 32, F);
250
fwrite (_stopname, 1, 32, F);
251
fwrite (_copyrite, 1, 56, F);
252
fwrite (_mnemonic, 1, 8, F);
253
fwrite (_comments, 1, 56, F);
254
fwrite (_reserved, 1, 8, F);
264
_h_lev.write (F, N_HARM);
265
_h_ran.write (F, N_HARM);
266
_h_att.write (F, N_HARM);
267
_h_atp.write (F, N_HARM);
274
int Addsynth::load (const char *sdir)
283
strcat (path, _filename);
287
if (! (F = fopen (path, "r")))
289
fprintf (stderr, "Can't open '%s' for reading\n", path);
294
if (strcmp (d, "AEOLUS"))
296
fprintf (stderr, "File '%s' is not an Aeolus file\n", _filename);
305
if (_n1 == 0x2E) _n1 = 96; ////// FIX THIS
309
fread (_stopname, 1, 32, F);
310
fread (_copyrite, 1, 56, F);
311
fread (_mnemonic, 1, 8, F);
312
fread (_comments, 1, 56, F);
313
fread (_reserved, 1, 8, F);
326
_h_lev.reset (-100.0f);
328
_h_att.reset (0.050f);