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