1
2 /*
3 * Diverse Bristol audio routines.
4 * Copyright (c) by Nick Copeland <nickycopeland@hotmail.com> 1996,2012
5 *
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, see <http://www.gnu.org/licenses/>.
19 *
20 */
21
22 /*#define DEBUG */
23
24 #include "bristol.h"
25 #include "dxop.h"
26
27 extern int bristolGlobalController(struct BAudio *, u_char, u_char, float);
28
29 float *lfobuf, *op0buf, *op1buf, *op2buf, *op3buf, *op4buf, *modbuf;
30
31 int
DXGlobalController(Baudio * baudio,u_char controller,u_char operator,float value)32 DXGlobalController(Baudio *baudio, u_char controller,
33 u_char operator, float value)
34 {
35 int op, index;
36 dxmix *mix = (dxmix *) baudio->mixlocals;
37
38 /*
39 * Rhodes Chorus
40 */
41 if (controller == 123)
42 {
43 if ((baudio->effect[0] == NULL) || (operator > 3))
44 {
45 printf("no effect to process\n");
46 return(0);
47 }
48
49 baudio->effect[0]->param->param[operator].float_val = value;
50
51 return(0);
52 }
53
54 /*
55 * DX global controller code.
56 */
57 /*printf("DXGlobalController(%i, %i, %f)\n", controller, operator, value); */
58
59 if (operator == 99)
60 {
61 /*
62 if (operator == 0) {
63 baudio->gtune = 1.0
64 + (baudio->note_diff - 1)
65 * (value * 2 - 1);
66
67 buildCurrentTable(baudio, baudio->gtune);
68 alterAllNotes(baudio);
69 } else {
70 baudio->midi_pitch = value * 24;
71 }
72 */
73 baudio->midi_pitch = value * 24;
74 return(0);
75 }
76
77 if (operator == 100)
78 {
79 baudio->glide = value * value * baudio->glidemax;
80 return(0);
81 }
82
83 if (operator == 101)
84 {
85 baudio->mixflags &= ~DX_ALGO_M;
86 baudio->mixflags |= (int) (value * CONTROLLER_RANGE);
87 /*printf("flags are now %x from %i\n", baudio->mixflags, */
88 /*(int) (value * CONTROLLER_RANGE)); */
89 return(0);
90 }
91
92 /*
93 * Main volume
94 */
95 if (operator == 102)
96 {
97 mix[0].vol = value;
98 return(0);
99 }
100
101 /*
102 * We have an algorithm parameter which configures the order of IO for the
103 * fm operators, and a set of flags for key tracking per operator.
104 */
105 op = operator / 10;
106 index = operator - (op * 10);
107
108 switch (index) {
109 case 0:
110 mix[op].igain = value * 4;
111 break;
112 case 1:
113 /*
114 * Key tracking (ie, may function as LFO).
115 */
116 if (value != 0)
117 mix[op].flags &= ~DX_KEY;
118 else
119 mix[op].flags |= DX_KEY;
120 break;
121 case 2:
122 mix[op].pan = value;
123 break;
124 case 3:
125 /*
126 * Configure cont controller 1 to adust IGAIN.
127 */
128 if (value == 0)
129 mix[op].flags &= ~DX_IGC;
130 else
131 mix[op].flags |= DX_IGC;
132 break;
133 }
134 return(0);
135 }
136
137 void
dxOpOne(int ind,float * kbuf,float * opbuf,float * obuf,int count,dxmix * mix,audioMain * am,Baudio * ba,bristolVoice * v)138 dxOpOne(int ind, float *kbuf, float *opbuf, float *obuf, int count,
139 dxmix *mix, audioMain *am, Baudio *ba, bristolVoice *v)
140 {
141 float igain = mix[ind].igain;
142 int flags = v->flags & BRISTOL_KEYDONE;
143
144 bufmerge(opbuf, 1.0, modbuf, 0.0, count);
145 /*printf("dxOpOne(%i)\n", ind); */
146
147 if (mix[ind].flags & DX_IGC)
148 igain *= ba->contcontroller[1];
149
150 /*
151 * Check on our mods,
152 */
153 if (mix[ind].flags & DX_KEY)
154 bufmerge(kbuf, 1.0, modbuf, igain, count);
155 else
156 bufmerge(lfobuf, 1.0, modbuf, igain, count);
157
158 /*
159 * Push in our pointers. Note that if we move the pointers into the
160 * params structure we could avoid doing this for each op.
161 */
162 am->palette[(*ba->sound[0]).index]->specs->io[0].buf = modbuf;
163 am->palette[(*ba->sound[0]).index]->specs->io[1].buf = obuf;
164
165 /*
166 * Call the operator.
167 */
168 (*ba->sound[ind]).operate(
169 (am->palette)[9],
170 v,
171 (*ba->sound[ind]).param,
172 v->locals[v->index][ind]);
173
174 v->flags = v->flags & flags? v->flags: v->flags & ~BRISTOL_KEYDONE;
175 }
176
177 int
DXalgoN(audioMain * am,register Baudio * ba,bristolVoice * voice,float * kb)178 DXalgoN(audioMain *am, register Baudio *ba, bristolVoice *voice, float *kb)
179 {
180 register int i, sc = am->samplecount;
181 register float *bufptr = lfobuf;
182 dxmix *mix = (dxmix *) ba->mixlocals;
183
184 /*
185 * Fill the wavetable with the correct note value
186 */
187 fillFreqTable(ba, voice, kb, sc, 1);
188 /*
189 * Build a LFO frequency table
190 */
191 for (i = 0; i < sc ; i+=8)
192 {
193 *bufptr++ = 0.001 + ba->contcontroller[1] / 2;
194 *bufptr++ = 0.001 + ba->contcontroller[1] / 2;
195 *bufptr++ = 0.001 + ba->contcontroller[1] / 2;
196 *bufptr++ = 0.001 + ba->contcontroller[1] / 2;
197 *bufptr++ = 0.001 + ba->contcontroller[1] / 2;
198 *bufptr++ = 0.001 + ba->contcontroller[1] / 2;
199 *bufptr++ = 0.001 + ba->contcontroller[1] / 2;
200 *bufptr++ = 0.001 + ba->contcontroller[1] / 2;
201 }
202
203 bzero(op0buf, am->segmentsize);
204 bzero(op1buf, am->segmentsize);
205 bzero(op2buf, am->segmentsize);
206
207 switch (ba->mixflags & DX_ALGO_M) {
208 case 0:
209 /*
210 * Op0 feeds op1, op2 feeds op3, op4 feeds op5.
211 */
212 dxOpOne(0, kb, op0buf, op1buf, sc, mix, am, ba, voice);
213 dxOpOne(3, kb, op1buf, op2buf, sc, mix, am, ba, voice);
214 bufmerge(op2buf, mix[0].vol * mix[3].pan, ba->rightbuf, 1.0,
215 am->samplecount);
216 bufmerge(op2buf, mix[0].vol * (1.0 - mix[3].pan), ba->leftbuf, 1.0,
217 am->samplecount);
218
219 bzero(op1buf, am->segmentsize);
220 bzero(op2buf, am->segmentsize);
221 dxOpOne(1, kb, op0buf, op1buf, sc, mix, am, ba, voice);
222 dxOpOne(4, kb, op1buf, op2buf, sc, mix, am, ba, voice);
223 bufmerge(op2buf, mix[0].vol * mix[4].pan, ba->rightbuf, 1.0,
224 am->samplecount);
225 bufmerge(op2buf, mix[0].vol * (1.0 - mix[4].pan), ba->leftbuf, 1.0,
226 am->samplecount);
227
228 bzero(op1buf, am->segmentsize);
229 bzero(op2buf, am->segmentsize);
230 dxOpOne(2, kb, op0buf, op1buf, sc, mix, am, ba, voice);
231 dxOpOne(5, kb, op1buf, op2buf, sc, mix, am, ba, voice);
232 bufmerge(op2buf, mix[0].vol * mix[5].pan, ba->rightbuf, 1.0,
233 am->samplecount);
234 bufmerge(op2buf, mix[0].vol * (1.0 - mix[5].pan), ba->leftbuf, 1.0,
235 am->samplecount);
236
237 break;
238 case 1:
239 /*
240 * Op0 feeds op1 into op2, then op3 feeds op4 into op5.
241 */
242 dxOpOne(0, kb, op0buf, op1buf, sc, mix, am, ba, voice);
243 dxOpOne(1, kb, op1buf, op2buf, sc, mix, am, ba, voice);
244 dxOpOne(2, kb, op2buf, op0buf, sc, mix, am, ba, voice);
245 bufmerge(op0buf, mix[0].vol * mix[2].pan, ba->rightbuf, 1.0,
246 am->samplecount);
247 bufmerge(op0buf, mix[0].vol * (1.0 - mix[2].pan), ba->leftbuf, 1.0,
248 am->samplecount);
249
250 bzero(op0buf, am->segmentsize);
251 bzero(op1buf, am->segmentsize);
252 bzero(op2buf, am->segmentsize);
253 dxOpOne(3, kb, op0buf, op1buf, sc, mix, am, ba, voice);
254 dxOpOne(4, kb, op1buf, op2buf, sc, mix, am, ba, voice);
255 dxOpOne(5, kb, op2buf, op0buf, sc, mix, am, ba, voice);
256 bufmerge(op0buf, mix[0].vol * mix[5].pan, ba->rightbuf, 1.0,
257 am->samplecount);
258 bufmerge(op0buf, mix[0].vol * (1.0 - mix[5].pan), ba->leftbuf, 1.0,
259 am->samplecount);
260
261 break;
262 case 2:
263 case 19:
264 case 20:
265 /*
266 * Op0 feeds op1 and op2, then op3 feeds op4 and op5.
267 */
268 dxOpOne(0, kb, op0buf, op1buf, sc, mix, am, ba, voice);
269 dxOpOne(1, kb, op1buf, op2buf, sc, mix, am, ba, voice);
270 dxOpOne(2, kb, op1buf, op0buf, sc, mix, am, ba, voice);
271
272 bufmerge(op2buf, mix[0].vol * mix[1].pan, ba->rightbuf, 1.0,
273 am->samplecount);
274 bufmerge(op2buf, mix[0].vol * (1.0 - mix[1].pan), ba->leftbuf, 1.0,
275 am->samplecount);
276 bufmerge(op0buf, mix[0].vol * mix[2].pan, ba->rightbuf, 1.0,
277 am->samplecount);
278 bufmerge(op0buf, mix[0].vol * (1.0 - mix[2].pan), ba->leftbuf, 1.0,
279 am->samplecount);
280
281 bzero(op0buf, am->segmentsize);
282 bzero(op1buf, am->segmentsize);
283 bzero(op2buf, am->segmentsize);
284 dxOpOne(3, kb, op0buf, op1buf, sc, mix, am, ba, voice);
285 dxOpOne(4, kb, op1buf, op2buf, sc, mix, am, ba, voice);
286 dxOpOne(5, kb, op1buf, op0buf, sc, mix, am, ba, voice);
287
288 bufmerge(op2buf, mix[0].vol * mix[4].pan, ba->rightbuf, 1.0,
289 am->samplecount);
290 bufmerge(op2buf, mix[0].vol * (1.0 - mix[4].pan), ba->leftbuf, 1.0,
291 am->samplecount);
292 bufmerge(op0buf, mix[0].vol * mix[5].pan, ba->rightbuf, 1.0,
293 am->samplecount);
294 bufmerge(op0buf, mix[0].vol * (1.0 - mix[5].pan), ba->leftbuf, 1.0,
295 am->samplecount);
296
297 break;
298 case 3:
299 /*
300 * Op0 and op1 feed op2, then op3 and op4 feed op5.
301 * These then need a crossover between the L and R channels.
302 */
303 bzero(op3buf, am->segmentsize);
304 bzero(op4buf, am->segmentsize);
305 dxOpOne(0, kb, op0buf, op1buf, sc, mix, am, ba, voice);
306 dxOpOne(1, kb, op0buf, op1buf, sc, mix, am, ba, voice);
307 dxOpOne(2, kb, op1buf, op3buf, sc, mix, am, ba, voice);
308
309 bzero(op0buf, am->segmentsize);
310 dxOpOne(3, kb, op0buf, op2buf, sc, mix, am, ba, voice);
311 dxOpOne(4, kb, op0buf, op2buf, sc, mix, am, ba, voice);
312 dxOpOne(5, kb, op2buf, op4buf, sc, mix, am, ba, voice);
313
314 bufmerge(op3buf, mix[0].vol * mix[2].pan, ba->rightbuf, 1.0,
315 am->samplecount);
316 bufmerge(op3buf, mix[0].vol * (1.0 - mix[2].pan), ba->leftbuf, 1.0,
317 am->samplecount);
318 bufmerge(op4buf, mix[0].vol * mix[5].pan, ba->rightbuf, 1.0,
319 am->samplecount);
320 bufmerge(op4buf, mix[0].vol * (1.0 - mix[5].pan), ba->leftbuf, 1.0,
321 am->samplecount);
322 break;
323 case 4:
324 case 11: /* Same algo, just 4 and 5 take no input from 1. */
325 /*
326 * Op0 feeds op1, op2 into op3. It also feeds op4 and op5 into op6.
327 */
328 bzero(op3buf, am->segmentsize);
329 dxOpOne(0, kb, op0buf, op1buf, sc, mix, am, ba, voice);
330 dxOpOne(1, kb, op1buf, op2buf, sc, mix, am, ba, voice);
331 dxOpOne(2, kb, op2buf, op3buf, sc, mix, am, ba, voice);
332 bufmerge(op3buf, mix[0].vol * mix[2].pan, ba->rightbuf, 1.0,
333 am->samplecount);
334 bufmerge(op3buf, mix[0].vol * (1.0 - mix[2].pan), ba->leftbuf, 1.0,
335 am->samplecount);
336
337 bzero(op2buf, am->segmentsize);
338 bzero(op3buf, am->segmentsize);
339 dxOpOne(3, kb, op1buf, op2buf, sc, mix, am, ba, voice);
340 dxOpOne(4, kb, op1buf, op2buf, sc, mix, am, ba, voice);
341 dxOpOne(5, kb, op2buf, op3buf, sc, mix, am, ba, voice);
342 bufmerge(op3buf, mix[0].vol * mix[5].pan, ba->rightbuf, 1.0,
343 am->samplecount);
344 bufmerge(op3buf, mix[0].vol * (1.0 - mix[5].pan), ba->leftbuf, 1.0,
345 am->samplecount);
346 break;
347 case 5:
348 /*
349 * op1 feeds op2 into op3, and op4 into op5 and op6.
350 */
351 bzero(op3buf, am->segmentsize);
352 dxOpOne(0, kb, op0buf, op1buf, sc, mix, am, ba, voice);
353 dxOpOne(1, kb, op1buf, op2buf, sc, mix, am, ba, voice);
354 dxOpOne(2, kb, op2buf, op3buf, sc, mix, am, ba, voice);
355 bufmerge(op3buf, mix[0].vol * mix[2].pan, ba->rightbuf, 1.0,
356 am->samplecount);
357 bufmerge(op3buf, mix[0].vol * (1.0 - mix[2].pan), ba->leftbuf, 1.0,
358 am->samplecount);
359
360 bzero(op2buf, am->segmentsize);
361 bzero(op3buf, am->segmentsize);
362 dxOpOne(3, kb, op1buf, op0buf, sc, mix, am, ba, voice);
363 dxOpOne(4, kb, op0buf, op2buf, sc, mix, am, ba, voice);
364 dxOpOne(5, kb, op0buf, op3buf, sc, mix, am, ba, voice);
365 bufmerge(op2buf, mix[0].vol * mix[4].pan, ba->rightbuf, 1.0,
366 am->samplecount);
367 bufmerge(op2buf, mix[0].vol * (1.0 - mix[4].pan), ba->leftbuf, 1.0,
368 am->samplecount);
369 bufmerge(op3buf, mix[0].vol * mix[5].pan, ba->rightbuf, 1.0,
370 am->samplecount);
371 bufmerge(op3buf, mix[0].vol * (1.0 - mix[5].pan), ba->leftbuf, 1.0,
372 am->samplecount);
373 break;
374 case 6:
375 /*
376 * Op0 feeds op4. Op4 feeds op2, op3, op5 and op6.
377 */
378 dxOpOne(0, kb, op0buf, op1buf, sc, mix, am, ba, voice);
379 dxOpOne(3, kb, op1buf, op2buf, sc, mix, am, ba, voice);
380
381 bzero(op3buf, am->segmentsize);
382 dxOpOne(1, kb, op2buf, op3buf, sc, mix, am, ba, voice);
383 bufmerge(op3buf, mix[0].vol * mix[1].pan, ba->rightbuf, 1.0,
384 am->samplecount);
385 bufmerge(op3buf, mix[0].vol * (1.0 - mix[1].pan), ba->leftbuf, 1.0,
386 am->samplecount);
387
388 bzero(op3buf, am->segmentsize);
389 dxOpOne(2, kb, op2buf, op3buf, sc, mix, am, ba, voice);
390 bufmerge(op3buf, mix[0].vol * mix[2].pan, ba->rightbuf, 1.0,
391 am->samplecount);
392 bufmerge(op3buf, mix[0].vol * (1.0 - mix[2].pan), ba->leftbuf, 1.0,
393 am->samplecount);
394
395 bzero(op3buf, am->segmentsize);
396 dxOpOne(4, kb, op2buf, op3buf, sc, mix, am, ba, voice);
397 bufmerge(op3buf, mix[0].vol * mix[4].pan, ba->rightbuf, 1.0,
398 am->samplecount);
399 bufmerge(op3buf, mix[0].vol * (1.0 - mix[4].pan), ba->leftbuf, 1.0,
400 am->samplecount);
401
402 bzero(op3buf, am->segmentsize);
403 dxOpOne(5, kb, op2buf, op3buf, sc, mix, am, ba, voice);
404 bufmerge(op3buf, mix[0].vol * mix[5].pan, ba->rightbuf, 1.0,
405 am->samplecount);
406 bufmerge(op3buf, mix[0].vol * (1.0 - mix[5].pan), ba->leftbuf, 1.0,
407 am->samplecount);
408
409 break;
410 case 7:
411 case 18:
412 /*
413 * Op0 and op1 feed op2, then op3 feeds op4 and op5.
414 */
415 dxOpOne(0, kb, op0buf, op1buf, sc, mix, am, ba, voice);
416 dxOpOne(1, kb, op0buf, op1buf, sc, mix, am, ba, voice);
417 dxOpOne(2, kb, op1buf, op2buf, sc, mix, am, ba, voice);
418 bufmerge(op2buf, mix[0].vol * mix[2].pan, ba->rightbuf, 1.0,
419 am->samplecount);
420 bufmerge(op2buf, mix[0].vol * (1.0 - mix[2].pan), ba->leftbuf, 1.0,
421 am->samplecount);
422
423 bzero(op2buf, am->segmentsize);
424 bzero(op3buf, am->segmentsize);
425 dxOpOne(3, kb, op0buf, op2buf, sc, mix, am, ba, voice);
426 dxOpOne(4, kb, op2buf, op3buf, sc, mix, am, ba, voice);
427 bufmerge(op3buf, mix[0].vol * mix[4].pan, ba->rightbuf, 1.0,
428 am->samplecount);
429 bufmerge(op3buf, mix[0].vol * (1.0 - mix[4].pan), ba->leftbuf, 1.0,
430 am->samplecount);
431
432 bzero(op3buf, am->segmentsize);
433 dxOpOne(5, kb, op2buf, op3buf, sc, mix, am, ba, voice);
434 bufmerge(op3buf, mix[0].vol * mix[5].pan, ba->rightbuf, 1.0,
435 am->samplecount);
436 bufmerge(op3buf, mix[0].vol * (1.0 - mix[5].pan), ba->leftbuf, 1.0,
437 am->samplecount);
438
439 break;
440 case 8:
441 /*
442 * Op0 and op1 feed op2, and ops 3 to 6 feed eachother.
443 */
444 dxOpOne(0, kb, op0buf, op1buf, sc, mix, am, ba, voice);
445 dxOpOne(1, kb, op1buf, op0buf, sc, mix, am, ba, voice);
446 bufmerge(op0buf, mix[0].vol * mix[1].pan, ba->rightbuf, 1.0,
447 am->samplecount);
448 bufmerge(op0buf, mix[0].vol * (1.0 - mix[1].pan), ba->leftbuf, 1.0,
449 am->samplecount);
450
451 bzero(op0buf, am->segmentsize);
452 bzero(op1buf, am->segmentsize);
453 bzero(op3buf, am->segmentsize);
454 bzero(op4buf, am->segmentsize);
455 dxOpOne(2, kb, op0buf, op1buf, sc, mix, am, ba, voice);
456 dxOpOne(3, kb, op1buf, op2buf, sc, mix, am, ba, voice);
457 dxOpOne(4, kb, op2buf, op3buf, sc, mix, am, ba, voice);
458 dxOpOne(5, kb, op3buf, op4buf, sc, mix, am, ba, voice);
459 bufmerge(op4buf, mix[0].vol * mix[5].pan, ba->rightbuf, 1.0,
460 am->samplecount);
461 bufmerge(op4buf, mix[0].vol * (1.0 - mix[5].pan), ba->leftbuf, 1.0,
462 am->samplecount);
463
464 break;
465 case 9:
466 /*
467 * Op2 feeds op3 into op4. Then 0, 1 and op4 feed 5.
468 */
469 bzero(op3buf, am->segmentsize);
470 dxOpOne(0, kb, op0buf, op1buf, sc, mix, am, ba, voice);
471 dxOpOne(1, kb, op0buf, op1buf, sc, mix, am, ba, voice);
472
473 dxOpOne(2, kb, op0buf, op2buf, sc, mix, am, ba, voice);
474 dxOpOne(3, kb, op2buf, op3buf, sc, mix, am, ba, voice);
475 dxOpOne(4, kb, op3buf, op1buf, sc, mix, am, ba, voice);
476
477 dxOpOne(5, kb, op1buf, op0buf, sc, mix, am, ba, voice);
478 bufmerge(op0buf, mix[0].vol * mix[5].pan, ba->rightbuf, 1.0,
479 am->samplecount);
480 bufmerge(op0buf, mix[0].vol * (1.0 - mix[5].pan), ba->leftbuf, 1.0,
481 am->samplecount);
482
483 break;
484 case 10:
485 /*
486 * Op0 feeds op1, op 3 feed op4, then 4 and 2 feed 5.
487 */
488 dxOpOne(0, kb, op1buf, op0buf, sc, mix, am, ba, voice);
489 dxOpOne(1, kb, op0buf, op1buf, sc, mix, am, ba, voice);
490 bufmerge(op1buf, mix[0].vol * mix[1].pan, ba->rightbuf, 1.0,
491 am->samplecount);
492 bufmerge(op1buf, mix[0].vol * (1.0 - mix[1].pan), ba->leftbuf, 1.0,
493 am->samplecount);
494
495 bzero(op3buf, am->segmentsize);
496 bzero(op4buf, am->segmentsize);
497 dxOpOne(2, kb, op3buf, op4buf, sc, mix, am, ba, voice);
498
499 dxOpOne(3, kb, op2buf, op3buf, sc, mix, am, ba, voice);
500 dxOpOne(4, kb, op3buf, op4buf, sc, mix, am, ba, voice);
501
502 dxOpOne(5, kb, op4buf, op2buf, sc, mix, am, ba, voice);
503 bufmerge(op2buf, mix[0].vol * mix[5].pan, ba->rightbuf, 1.0,
504 am->samplecount);
505 bufmerge(op2buf, mix[0].vol * (1.0 - mix[5].pan), ba->leftbuf, 1.0,
506 am->samplecount);
507
508 break;
509 /*case 11: // offloaded into algo 4 - good as the same. */
510 case 12:
511 /*
512 * Op0 feeds op1, and 2, 3 and 4 feed op 5.
513 */
514 dxOpOne(0, kb, op0buf, op1buf, sc, mix, am, ba, voice);
515 dxOpOne(1, kb, op1buf, op0buf, sc, mix, am, ba, voice);
516 bufmerge(op0buf, mix[0].vol * mix[1].pan, ba->rightbuf, 1.0,
517 am->samplecount);
518 bufmerge(op0buf, mix[0].vol * (1.0 - mix[1].pan), ba->leftbuf, 1.0,
519 am->samplecount);
520
521 bzero(op3buf, am->segmentsize);
522 bzero(op4buf, am->segmentsize);
523 dxOpOne(2, kb, op3buf, op2buf, sc, mix, am, ba, voice);
524 dxOpOne(3, kb, op3buf, op2buf, sc, mix, am, ba, voice);
525 dxOpOne(4, kb, op2buf, op3buf, sc, mix, am, ba, voice);
526 dxOpOne(5, kb, op3buf, op4buf, sc, mix, am, ba, voice);
527 bufmerge(op4buf, mix[0].vol * mix[5].pan, ba->rightbuf, 1.0,
528 am->samplecount);
529 bufmerge(op4buf, mix[0].vol * (1.0 - mix[5].pan), ba->leftbuf, 1.0,
530 am->samplecount);
531
532 break;
533 case 13:
534 bzero(op3buf, am->segmentsize);
535 dxOpOne(0, kb, op3buf, op0buf, sc, mix, am, ba, voice);
536
537 dxOpOne(1, kb, op3buf, op1buf, sc, mix, am, ba, voice);
538 dxOpOne(2, kb, op1buf, op0buf, sc, mix, am, ba, voice);
539
540 dxOpOne(3, kb, op3buf, op2buf, sc, mix, am, ba, voice);
541 dxOpOne(4, kb, op2buf, op0buf, sc, mix, am, ba, voice);
542
543 dxOpOne(5, kb, op0buf, op3buf, sc, mix, am, ba, voice);
544 bufmerge(op4buf, mix[0].vol * mix[5].pan, ba->rightbuf, 1.0,
545 am->samplecount);
546 bufmerge(op4buf, mix[0].vol * (1.0 - mix[5].pan), ba->leftbuf, 1.0,
547 am->samplecount);
548
549 break;
550 case 14:
551 dxOpOne(0, kb, op0buf, op1buf, sc, mix, am, ba, voice);
552 dxOpOne(1, kb, op1buf, op2buf, sc, mix, am, ba, voice);
553 dxOpOne(2, kb, op2buf, op0buf, sc, mix, am, ba, voice);
554 bufmerge(op0buf, mix[0].vol * mix[2].pan, ba->rightbuf, 1.0,
555 am->samplecount);
556 bufmerge(op4buf, mix[0].vol * (1.0 - mix[2].pan), ba->leftbuf, 1.0,
557 am->samplecount);
558
559 bzero(op0buf, am->segmentsize);
560 bzero(op1buf, am->segmentsize);
561 dxOpOne(3, kb, op0buf, op1buf, sc, mix, am, ba, voice);
562 dxOpOne(4, kb, op1buf, op0buf, sc, mix, am, ba, voice);
563 bufmerge(op0buf, mix[0].vol * mix[4].pan, ba->rightbuf, 1.0,
564 am->samplecount);
565 bufmerge(op4buf, mix[0].vol * (1.0 - mix[4].pan), ba->leftbuf, 1.0,
566 am->samplecount);
567
568 bzero(op0buf, am->segmentsize);
569 bzero(op1buf, am->segmentsize);
570 dxOpOne(5, kb, op1buf, op0buf, sc, mix, am, ba, voice);
571 bufmerge(op0buf, mix[0].vol * mix[5].pan, ba->rightbuf, 1.0,
572 am->samplecount);
573 bufmerge(op4buf, mix[0].vol * (1.0 - mix[5].pan), ba->leftbuf, 1.0,
574 am->samplecount);
575
576 break;
577
578 case 15:
579 dxOpOne(0, kb, op0buf, op1buf, sc, mix, am, ba, voice);
580 dxOpOne(1, kb, op1buf, op0buf, sc, mix, am, ba, voice);
581
582 bzero(op2buf, am->segmentsize);
583 dxOpOne(2, kb, op0buf, op2buf, sc, mix, am, ba, voice);
584 bufmerge(op2buf, mix[0].vol * mix[2].pan, ba->rightbuf, 1.0,
585 am->samplecount);
586 bufmerge(op2buf, mix[0].vol * (1.0 - mix[2].pan), ba->leftbuf, 1.0,
587 am->samplecount);
588
589 bzero(op2buf, am->segmentsize);
590 dxOpOne(3, kb, op0buf, op2buf, sc, mix, am, ba, voice);
591 bufmerge(op2buf, mix[0].vol * mix[3].pan, ba->rightbuf, 1.0,
592 am->samplecount);
593 bufmerge(op2buf, mix[0].vol * (1.0 - mix[3].pan), ba->leftbuf, 1.0,
594 am->samplecount);
595
596 bzero(op2buf, am->segmentsize);
597 dxOpOne(4, kb, op0buf, op2buf, sc, mix, am, ba, voice);
598 bufmerge(op2buf, mix[0].vol * mix[4].pan, ba->rightbuf, 1.0,
599 am->samplecount);
600 bufmerge(op2buf, mix[0].vol * (1.0 - mix[4].pan), ba->leftbuf, 1.0,
601 am->samplecount);
602
603 bzero(op2buf, am->segmentsize);
604 dxOpOne(5, kb, op0buf, op2buf, sc, mix, am, ba, voice);
605 bufmerge(op2buf, mix[0].vol * mix[5].pan, ba->rightbuf, 1.0,
606 am->samplecount);
607 bufmerge(op2buf, mix[0].vol * (1.0 - mix[5].pan), ba->leftbuf, 1.0,
608 am->samplecount);
609
610 break;
611 case 16:
612 /*
613 * Op0 feeds op1, and 2, 3 and 4 feed op 5.
614 */
615 dxOpOne(0, kb, op0buf, op1buf, sc, mix, am, ba, voice);
616 dxOpOne(1, kb, op1buf, op0buf, sc, mix, am, ba, voice);
617 bufmerge(op0buf, mix[0].vol * mix[1].pan, ba->rightbuf, 1.0,
618 am->samplecount);
619 bufmerge(op0buf, mix[0].vol * (1.0 - mix[1].pan), ba->leftbuf, 1.0,
620 am->samplecount);
621
622 bzero(op3buf, am->segmentsize);
623 dxOpOne(2, kb, op3buf, op2buf, sc, mix, am, ba, voice);
624 dxOpOne(3, kb, op3buf, op2buf, sc, mix, am, ba, voice);
625 dxOpOne(4, kb, op3buf, op2buf, sc, mix, am, ba, voice);
626
627 dxOpOne(5, kb, op2buf, op3buf, sc, mix, am, ba, voice);
628 bufmerge(op3buf, mix[0].vol * mix[5].pan, ba->rightbuf, 1.0,
629 am->samplecount);
630 bufmerge(op3buf, mix[0].vol * (1.0 - mix[5].pan), ba->leftbuf, 1.0,
631 am->samplecount);
632
633 break;
634 case 17:
635 dxOpOne(0, kb, op0buf, op1buf, sc, mix, am, ba, voice);
636 dxOpOne(1, kb, op1buf, op0buf, sc, mix, am, ba, voice);
637 bufmerge(op0buf, mix[0].vol * mix[1].pan, ba->rightbuf, 1.0,
638 am->samplecount);
639 bufmerge(op0buf, mix[0].vol * (1.0 - mix[1].pan), ba->leftbuf, 1.0,
640 am->samplecount);
641
642 bzero(op3buf, am->segmentsize);
643 dxOpOne(2, kb, op3buf, op2buf, sc, mix, am, ba, voice);
644
645 dxOpOne(3, kb, op2buf, op3buf, sc, mix, am, ba, voice);
646 bufmerge(op3buf, mix[0].vol * mix[3].pan, ba->rightbuf, 1.0,
647 am->samplecount);
648 bufmerge(op3buf, mix[0].vol * (1.0 - mix[3].pan), ba->leftbuf, 1.0,
649 am->samplecount);
650
651 bzero(op3buf, am->segmentsize);
652 dxOpOne(4, kb, op2buf, op3buf, sc, mix, am, ba, voice);
653 bufmerge(op3buf, mix[0].vol * mix[4].pan, ba->rightbuf, 1.0,
654 am->samplecount);
655 bufmerge(op3buf, mix[0].vol * (1.0 - mix[4].pan), ba->leftbuf, 1.0,
656 am->samplecount);
657
658 bzero(op3buf, am->segmentsize);
659 dxOpOne(5, kb, op2buf, op3buf, sc, mix, am, ba, voice);
660 bufmerge(op3buf, mix[0].vol * mix[5].pan, ba->rightbuf, 1.0,
661 am->samplecount);
662 bufmerge(op3buf, mix[0].vol * (1.0 - mix[5].pan), ba->leftbuf, 1.0,
663 am->samplecount);
664
665 break;
666 case 21:
667 case 22:
668 dxOpOne(0, kb, op1buf, op0buf, sc, mix, am, ba, voice);
669
670 dxOpOne(1, kb, op0buf, op1buf, sc, mix, am, ba, voice);
671 bufmerge(op1buf, mix[0].vol * mix[1].pan, ba->rightbuf, 1.0,
672 am->samplecount);
673 bufmerge(op1buf, mix[0].vol * (1.0 - mix[1].pan), ba->leftbuf, 1.0,
674 am->samplecount);
675
676 dxOpOne(2, kb, op0buf, op2buf, sc, mix, am, ba, voice);
677 bufmerge(op2buf, mix[0].vol * mix[2].pan, ba->rightbuf, 1.0,
678 am->samplecount);
679 bufmerge(op2buf, mix[0].vol * (1.0 - mix[2].pan), ba->leftbuf, 1.0,
680 am->samplecount);
681
682 bzero(op2buf, am->segmentsize);
683 dxOpOne(3, kb, op0buf, op2buf, sc, mix, am, ba, voice);
684 bufmerge(op2buf, mix[0].vol * mix[3].pan, ba->rightbuf, 1.0,
685 am->samplecount);
686 bufmerge(op2buf, mix[0].vol * (1.0 - mix[3].pan), ba->leftbuf, 1.0,
687 am->samplecount);
688
689 bzero(op2buf, am->segmentsize);
690 dxOpOne(4, kb, op0buf, op2buf, sc, mix, am, ba, voice);
691 bufmerge(op2buf, mix[0].vol * mix[4].pan, ba->rightbuf, 1.0,
692 am->samplecount);
693 bufmerge(op2buf, mix[0].vol * (1.0 - mix[4].pan), ba->leftbuf, 1.0,
694 am->samplecount);
695
696 bzero(op2buf, am->segmentsize);
697 dxOpOne(5, kb, op0buf, op2buf, sc, mix, am, ba, voice);
698 bufmerge(op2buf, mix[0].vol * mix[5].pan, ba->rightbuf, 1.0,
699 am->samplecount);
700 bufmerge(op2buf, mix[0].vol * (1.0 - mix[5].pan), ba->leftbuf, 1.0,
701 am->samplecount);
702
703 break;
704 case 23:
705 dxOpOne(0, kb, op0buf, op1buf, sc, mix, am, ba, voice);
706 bufmerge(op1buf, mix[0].vol * mix[0].pan, ba->rightbuf, 1.0,
707 am->samplecount);
708 bufmerge(op1buf, mix[0].vol * (1.0 - mix[0].pan), ba->leftbuf, 1.0,
709 am->samplecount);
710
711 dxOpOne(1, kb, op0buf, op2buf, sc, mix, am, ba, voice);
712 bufmerge(op2buf, mix[0].vol * mix[1].pan, ba->rightbuf, 1.0,
713 am->samplecount);
714 bufmerge(op2buf, mix[0].vol * (1.0 - mix[1].pan), ba->leftbuf, 1.0,
715 am->samplecount);
716
717 bzero(op2buf, am->segmentsize);
718 dxOpOne(2, kb, op0buf, op2buf, sc, mix, am, ba, voice);
719 bufmerge(op2buf, mix[0].vol * mix[2].pan, ba->rightbuf, 1.0,
720 am->samplecount);
721 bufmerge(op2buf, mix[0].vol * (1.0 - mix[2].pan), ba->leftbuf, 1.0,
722 am->samplecount);
723
724 bzero(op2buf, am->segmentsize);
725 dxOpOne(3, kb, op0buf, op2buf, sc, mix, am, ba, voice);
726 bufmerge(op2buf, mix[0].vol * mix[3].pan, ba->rightbuf, 1.0,
727 am->samplecount);
728 bufmerge(op2buf, mix[0].vol * (1.0 - mix[3].pan), ba->leftbuf, 1.0,
729 am->samplecount);
730
731 bzero(op2buf, am->segmentsize);
732 dxOpOne(4, kb, op0buf, op2buf, sc, mix, am, ba, voice);
733 bufmerge(op2buf, mix[0].vol * mix[4].pan, ba->rightbuf, 1.0,
734 am->samplecount);
735 bufmerge(op2buf, mix[0].vol * (1.0 - mix[4].pan), ba->leftbuf, 1.0,
736 am->samplecount);
737
738 bzero(op2buf, am->segmentsize);
739 dxOpOne(5, kb, op0buf, op2buf, sc, mix, am, ba, voice);
740 bufmerge(op2buf, mix[0].vol * mix[5].pan, ba->rightbuf, 1.0,
741 am->samplecount);
742 bufmerge(op2buf, mix[0].vol * (1.0 - mix[5].pan), ba->leftbuf, 1.0,
743 am->samplecount);
744
745 break;
746 }
747
748 return(0);
749 }
750
751 int
DXalgoNpostops(audioMain * am,Baudio * ba,bristolVoice * v,register float * s)752 DXalgoNpostops(audioMain *am, Baudio *ba, bristolVoice *v, register float *s)
753 {
754 bufmerge(ba->leftbuf, 0.0, ba->leftbuf, 8.0, am->samplecount);
755 bufmerge(ba->rightbuf, 0.0, ba->rightbuf, 8.0, am->samplecount);
756
757 return(0);
758 }
759
760 int
destroyOneDXVoice(audioMain * audiomain,Baudio * baudio)761 destroyOneDXVoice(audioMain *audiomain, Baudio *baudio)
762 {
763 printf("destroy DX sound\n");
764 return(0);
765 bristolfree(lfobuf);
766 bristolfree(op0buf);
767 bristolfree(op1buf);
768 bristolfree(op2buf);
769 }
770
771 int
bristolDXInit(audioMain * audiomain,Baudio * baudio)772 bristolDXInit(audioMain *audiomain, Baudio *baudio)
773 {
774 printf("initialising one DX sound\n");
775
776 baudio->soundCount = 6; /* Number of operators in this DX voice */
777
778 /*
779 * Assign an array of sound pointers.
780 */
781 baudio->sound = (bristolSound **)
782 bristolmalloc0(sizeof(bristolOP *) * baudio->soundCount);
783 baudio->effect = (bristolSound **)
784 bristolmalloc0(sizeof(bristolOP *) * baudio->soundCount);
785
786 /*
787 * DX oscillators.
788 */
789 initSoundAlgo(9, 0, baudio, audiomain, baudio->sound);
790 initSoundAlgo(9, 1, baudio, audiomain, baudio->sound);
791 initSoundAlgo(9, 2, baudio, audiomain, baudio->sound);
792 initSoundAlgo(9, 3, baudio, audiomain, baudio->sound);
793 initSoundAlgo(9, 4, baudio, audiomain, baudio->sound);
794 initSoundAlgo(9, 5, baudio, audiomain, baudio->sound);
795
796 baudio->param = DXGlobalController;
797 baudio->destroy = destroyOneDXVoice;
798 baudio->operate = DXalgoN;
799 baudio->postops = DXalgoNpostops;
800
801 if (lfobuf == 0)
802 lfobuf = (float *) bristolmalloc0(audiomain->segmentsize);
803 if (op0buf == 0)
804 op0buf = (float *) bristolmalloc0(audiomain->segmentsize);
805 if (op1buf == 0)
806 op1buf = (float *) bristolmalloc0(audiomain->segmentsize);
807 if (op2buf == 0)
808 op2buf = (float *) bristolmalloc0(audiomain->segmentsize);
809 if (op3buf == 0)
810 op3buf = (float *) bristolmalloc0(audiomain->segmentsize);
811 if (op4buf == 0)
812 op4buf = (float *) bristolmalloc0(audiomain->segmentsize);
813 if (modbuf == 0)
814 modbuf = (float *) bristolmalloc0(audiomain->segmentsize);
815
816 baudio->mixlocals = (float *) bristolmalloc0(12 * sizeof(dxmix));
817 baudio->mixflags |= BRISTOL_STEREO;
818 return(0);
819 }
820
821 int
bristolRhodesInit(audioMain * audiomain,Baudio * baudio)822 bristolRhodesInit(audioMain *audiomain, Baudio *baudio)
823 {
824 printf("initialising one Rhodes sound\n");
825
826 baudio->soundCount = 6; /* Number of operators in this DX voice */
827
828 /*
829 * Assign an array of sound pointers.
830 */
831 baudio->sound = (bristolSound **)
832 bristolmalloc0(sizeof(bristolOP *) * baudio->soundCount);
833 baudio->effect = (bristolSound **)
834 bristolmalloc0(sizeof(bristolOP *) * baudio->soundCount);
835
836 /*
837 * DX oscillators.
838 */
839 initSoundAlgo(9, 0, baudio, audiomain, baudio->sound);
840 initSoundAlgo(9, 1, baudio, audiomain, baudio->sound);
841 initSoundAlgo(9, 2, baudio, audiomain, baudio->sound);
842 initSoundAlgo(9, 3, baudio, audiomain, baudio->sound);
843 initSoundAlgo(9, 4, baudio, audiomain, baudio->sound);
844 initSoundAlgo(9, 5, baudio, audiomain, baudio->sound);
845
846 /*
847 * Put in a vibrachorus on our effects list.
848 */
849 initSoundAlgo(12, 0, baudio, audiomain, baudio->effect);
850
851 baudio->param = DXGlobalController;
852 baudio->destroy = destroyOneDXVoice;
853 baudio->operate = DXalgoN;
854 baudio->postops = DXalgoNpostops;
855
856 if (lfobuf == 0)
857 lfobuf = (float *) bristolmalloc0(audiomain->segmentsize);
858 if (op0buf == 0)
859 op0buf = (float *) bristolmalloc0(audiomain->segmentsize);
860 if (op1buf == 0)
861 op1buf = (float *) bristolmalloc0(audiomain->segmentsize);
862 if (op2buf == 0)
863 op2buf = (float *) bristolmalloc0(audiomain->segmentsize);
864 if (op3buf == 0)
865 op3buf = (float *) bristolmalloc0(audiomain->segmentsize);
866 if (op4buf == 0)
867 op4buf = (float *) bristolmalloc0(audiomain->segmentsize);
868 if (modbuf == 0)
869 modbuf = (float *) bristolmalloc0(audiomain->segmentsize);
870
871 baudio->mixlocals = (float *) bristolmalloc0(12 * sizeof(dxmix));
872 baudio->mixflags |= BRISTOL_STEREO;
873 return(0);
874 }
875
876