source: buchla-68k/ram/lcdlbls.c@ 0580615

Last change on this file since 0580615 was 0580615, checked in by Thomas Lopatic <thomas@…>, 7 years ago

Point of no return.

  • Property mode set to 100644
File size: 39.3 KB
Line 
1/*
2 =============================================================================
3 lcdlbls.c -- MIDAS-VII front panel support functions
4 Version 48 -- 1989-12-19 -- D.N. Lynx Crowe
5 =============================================================================
6*/
7
8#define ROMPOK 1 /* non-zero enables the ROMP switch */
9
10#include "stddefs.h"
11#include "biosdefs.h"
12#include "graphdef.h"
13#include "glcfns.h"
14#include "glcdefs.h"
15#include "lcdline.h"
16#include "vsdd.h"
17#include "vsddvars.h"
18#include "hwdefs.h"
19#include "memory.h"
20#include "cmeta.h"
21#include "fields.h"
22#include "fpu.h"
23#include "macros.h"
24#include "panel.h"
25#include "patch.h"
26#include "smdefs.h"
27#include "sclock.h"
28
29#include "midas.h"
30#include "instdsp.h"
31#include "libdsp.h"
32#include "score.h"
33#include "scdsp.h"
34#include "scfns.h"
35
36#define ARTIVAL(x) (x << 5)
37#define SL2GAIN(x) (sl2gain[(x >> 11) + 16])
38
39#if ROMPOK
40#define ROMPFN trapper /* ROMP switch table entry */
41#else
42#define ROMPFN nokey /* ROMP switch table entry */
43#endif
44
45#define PCHMAX 21920L /* maximum pitch value */
46
47/*
48
49*/
50extern char gain2eq(short gain);
51
52extern short nokey(void);
53extern unsigned setsr(unsigned sr);
54
55extern short (*d_key)();
56extern short (*e_key)();
57extern short (*m_key)();
58extern short (*x_key)();
59extern short (*olddkey)();
60extern short (*oldekey)();
61extern short (*oldmkey)();
62extern short (*oldxkey)();
63extern short (*point)();
64
65extern PFS (*oldsw)[];
66extern PFS (*swpt)[];
67
68extern PFS aswtbl[14];
69
70extern short asig;
71extern short asmode;
72extern short astat;
73extern short aval;
74extern short clkrun;
75extern short ctrsw;
76extern short curasg;
77extern short gomode;
78extern short ismode;
79extern short lampio;
80extern short lampsw;
81extern short loadrow;
82extern short loadsw;
83extern short ltagged;
84extern short ndisp;
85extern short oldpk;
86extern short oldsl;
87extern short pkctrl;
88extern short recsw;
89extern short sliders;
90extern short tagslot;
91extern short tmpomlt;
92extern short tmpoval;
93extern short tuneval;
94
95extern unsigned short seqdupd;
96
97extern short BGeq[];
98extern short BGother[];
99extern short BGprmtr[];
100
101extern short articen[];
102extern short grpmode[];
103extern short grpsel[];
104extern short grpstat[];
105extern short ins2grp[];
106extern short lastart[];
107extern short s_trns[];
108extern short vce2grp[];
109extern short vce2trg[];
110
111extern short anrs[][16];
112
113extern long iotime;
114extern long lcdontm;
115extern long lcdtime;
116
117extern struct gdsel *gdstbc[];
118
119extern struct valent valents[];
120
121/*
122
123*/
124
125/* forward references */
126
127void l_prmtr(short stat, short sig);
128void l_other(short stat, short sig);
129void l_voice(short stat, short vce);
130void l_init(short stat, short sig);
131void l_clock(short stat);
132void l_eq(short stat, short sig);
133void trapper(short stat);
134void setlamp(stat);
135void rpctl(short stat);
136void quiet(void);
137void l_group(short stat, short grp);
138void l_dflt(short stat);
139void l_inst(short stat);
140void l_goto(short stat);
141void l_asgn(short stat);
142void l_adfl(short stat);
143void l_load(short stat);
144
145/* initialized stuff */
146
147/* BarType -- LCD slider bar graph type table -- 0 = bottom, 1 = centered */
148
149short BarType[14] = { 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0 };
150
151short artitab[] = { /* articulation pot initialization values */
152
153 ARTIVAL(500), /* locn */
154 ARTIVAL(0), /* level */
155 ARTIVAL(0), /* ind 1 */
156 ARTIVAL(0), /* ind 2 */
157 ARTIVAL(0), /* ind 3 */
158 ARTIVAL(500), /* frq 1 */
159 ARTIVAL(500), /* frq 2 */
160 ARTIVAL(500), /* frq 3 */
161 ARTIVAL(500), /* frq 4 */
162 ARTIVAL(0), /* ind 4 */
163 ARTIVAL(0), /* ind 5 */
164 ARTIVAL(0), /* ind 6 */
165 ARTIVAL(500), /* filtr */
166 ARTIVAL(0) /* reson */
167};
168
169/* arpar[] -- articulation parameter map */
170/* sigtab[ 25 26 27 28 29 30 31 32 33 34 35 36 37 38] */
171
172short arpar[] = { 4, 2, 9, 11, 12, 1, 3, 5, 7, 13, 14, 15, 10, 6};
173
174/*
175
176*/
177
178short sl2gain[32] = { /* slider value to EQ gain conversion table */
179
180 -12, -12, -12, -12, -12, -11, -10, -9 ,-8 ,-7, -6, -5, -4, -3, -2, -1,
181 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 12, 12
182};
183
184short vmasks[16] = { /* variable resolution masks */
185
186 0x8000, 0xC000, 0xE000, 0xF000,
187 0xF800, 0xFC00, 0xFE00, 0xFF00,
188 0xFF80, 0xFFC0, 0xFFE0, 0xFFF0,
189 0xFFF8, 0xFFFC, 0xFFFE, 0xFFFF
190};
191
192short src2var[14] = { /* source number to analog variable number map */
193
194 -1, -1, 3, -1, -1, -1, 5, -1, 4, -1, -1, 0, 1, 2 };
195
196char *potlbls[] = { /* LCD pot labels */
197
198 /* Pot: 25 26 27 28 29 30 31 32 33 34 35 36 37 38 */
199
200 /* 0 */ "Locn Level Ind 1 Ind 2 Ind 3 Frq 1 Frq 2 Frq 3 Frq 4 Ind 4 Ind 5 Ind 6 Filtr Reson",
201 /* 1 */ "Locn Level Ind 1 Ind 2 Ind 3 Frq 1 Frq 2 Frq 3 Frq 4 Ind 4 Ind 5 Ind 6 Filtr Reson",
202 /* 2 */ " Aux Depth Rate Inten CV 1 CV 2 CV 3 CV 4 ",
203 /* 3 */ " 50 150 400 1k 2.5k 6k 15k 50 150 400 1k 2.5k 6k 15k ",
204 /* 4 */ "Locn Level Ind 1 Ind 2 Ind 3 Frq 1 Frq 2 Frq 3 Frq 4 Ind 4 Ind 5 Ind 6 Filtr Reson",
205 /* 5 */ "Locn Level Ind 1 Ind 2 Ind 3 Frq 1 Frq 2 Frq 3 Frq 4 Ind 4 Ind 5 Ind 6 Filtr Reson",
206 /* 6 */ "Locn Level Ind 1 Ind 2 Ind 3 Frq 1 Frq 2 Frq 3 Frq 4 Ind 4 Ind 5 Ind 6 Filtr Reson",
207 /* 7 */ "Locn Level Ind 1 Ind 2 Ind 3 Frq 1 Frq 2 Frq 3 Frq 4 Ind 4 Ind 5 Ind 6 Filtr Reson"
208};
209
210#if ROMPOK
211char *swtlbls[] = { /* LCD switch labels -- ROMP ENABLED */
212
213 /* 0 */ "Quiet ROMP Lamp Clock P/R Go To Instr Asgmt Load Other Voice Init ",
214 /* 1 */ " Voice Init ",
215 /* 2 */ "Quiet ROMP Lamp Clock P/R Go To Instr Asgmt Load EQ Voice Init ",
216 /* 3 */ "Quiet ROMP Lamp Clock P/R Go To Instr Asgmt Load Prmtr Voice Init ",
217 /* 4 */ " +00 Deflt",
218 /* 5 */ "Quiet ROMP Lamp Clock P/R Go To Instr Asgmt Load Other Voice Deflt",
219 /* 6 */ "Quiet ROMP Lamp Clock P/R ",
220 /* 7 */ "Quiet ROMP Lamp Load "
221};
222#else
223char *swtlbls[] = { /* LCD switch labels -- ROMP DISABLED */
224
225 /* 0 */ "Quiet Lamp Clock P/R Go To Instr Asgmt Load Other Voice Init ",
226 /* 1 */ " Voice Init ",
227 /* 2 */ "Quiet Lamp Clock P/R Go To Instr Asgmt Load EQ Voice Init ",
228 /* 3 */ "Quiet Lamp Clock P/R Go To Instr Asgmt Load Prmtr Voice Init ",
229 /* 4 */ " +00 Deflt",
230 /* 5 */ "Quiet Lamp Clock P/R Go To Instr Asgmt Load Other Voice Deflt",
231 /* 6 */ "Quiet Lamp Clock P/R ",
232 /* 7 */ "Quiet Lamp Load "
233};
234#endif
235
236char *aslbls[] = { /* Assignment select key labels */
237
238 "Asgmt", /* 0 */
239 " +00 ", /* 1 */
240 " +20 ", /* 2 */
241 " +40 ", /* 3 */
242 " +60 ", /* 4 */
243 " +80 " /* 5 */
244};
245
246/*
247
248*/
249
250PFS t_prmtr[] = { /* switch assignments for LS_PRMTR */
251
252 quiet, /* 0: Quiet */
253 ROMPFN, /* 1: ROMP */
254
255 setlamp, /* 2: Lamp */
256 l_clock, /* 3: Clock */
257 rpctl, /* 4: R/P */
258
259 l_goto, /* 5: Go To */
260 l_inst, /* 6: Instr */
261 l_asgn, /* 7: Asgmt */
262 l_load, /* 8: Load */
263
264 nokey, /* 9: -unused- */
265 nokey, /* 10: -unused- */
266 l_other, /* 11: Other */
267
268 l_prmtr, /* 12: Prmtr */
269 l_init /* 13: Init */
270};
271
272PFS t_voice[] = { /* switch assignments for LS_VOICE */
273
274 l_voice, /* 0: toggle voice status */
275 l_voice, /* 1: toggle voice status */
276
277 l_voice, /* 2: toggle voice status */
278 l_voice, /* 3: toggle voice status */
279 l_voice, /* 4: toggle voice status */
280
281 l_voice, /* 5: toggle voice status */
282 l_voice, /* 6: toggle voice status */
283 l_voice, /* 7: toggle voice status */
284 l_voice, /* 8: toggle voice status */
285
286 l_voice, /* 9: toggle voice status */
287 l_voice, /* 10: toggle voice status */
288 l_voice, /* 11: toggle voice status */
289
290 l_prmtr, /* 12: Prmtr */
291 l_init /* 13: Init */
292};
293
294/*
295
296*/
297
298PFS t_other[] = { /* switch assignments for LS_OTHER */
299
300 quiet, /* 0: Quiet */
301 ROMPFN, /* 1: ROMP */
302
303 setlamp, /* 2: Lamp */
304 l_clock, /* 3: Clock */
305 rpctl, /* 4: R/P */
306
307 l_goto, /* 5: Go To */
308 l_inst, /* 6: Instr */
309 l_asgn, /* 7: Asgmt */
310 l_load, /* 8: Load */
311
312 nokey, /* 9: -unused- */
313 nokey, /* 10: -unused- */
314 l_eq, /* 11: EQ */
315
316 l_prmtr, /* 12: Prmtr */
317 l_init /* 13: Init */
318};
319
320PFS t_eq[] = { /* switch assignments for LS_EQ */
321
322 quiet, /* 0: Quiet */
323 ROMPFN, /* 1: ROMP */
324
325 setlamp, /* 2: Lamp */
326 l_clock, /* 3: Clock */
327 rpctl, /* 4: R/P */
328
329 l_goto, /* 5: Go To */
330 l_inst, /* 6: Instr */
331 l_asgn, /* 7: Asgmt */
332 l_load, /* 8: Load */
333
334 nokey, /* 9: -unused- */
335 nokey, /* 10: -unused- */
336 l_eq, /* 11: Prmtr */
337
338 l_prmtr, /* 12: Voice */
339 l_init /* 13: Init */
340};
341
342/*
343
344*/
345
346PFS t_inst[] = { /* switch assignments for LS_INST */
347
348 l_group, /* 0: toggle group status */
349 l_group, /* 1: toggle group status */
350
351 l_group, /* 2: toggle group status */
352 l_group, /* 3: toggle group status */
353 l_group, /* 4: toggle group status */
354
355 l_group, /* 5: toggle group status */
356 l_group, /* 6: toggle group status */
357 l_group, /* 7: toggle group status */
358 l_group, /* 8: toggle group status */
359
360 l_group, /* 9: toggle group status */
361 l_group, /* 10: toggle group status */
362 l_group, /* 11: toggle group status */
363
364 l_inst, /* 12: 01-20 / 21-40 */
365 l_dflt /* 13: Deflt */
366};
367
368PFS t_libr[] = { /* switch assignments for LS_LIBR */
369
370 quiet, /* 0: Quiet */
371 ROMPFN, /* 1: ROMP */
372
373 setlamp, /* 2: Lamp */
374 l_clock, /* 3: Clock */
375 rpctl, /* 4: R/P */
376
377 nokey, /* 5: -unused- */
378 nokey, /* 6: -unused- */
379 nokey, /* 7: -unused- */
380 nokey, /* 8: -unused- */
381
382 nokey, /* 9: -unused- */
383 nokey, /* 10: -unused- */
384 nokey, /* 11: -unused- */
385
386 nokey, /* 12: -unused- */
387 nokey /* 13: -unused- */
388};
389
390/*
391
392*/
393
394PFS t_ngrp[] = { /* switch assignments for LS_NGRP */
395
396 quiet, /* 0: Quiet */
397 ROMPFN, /* 1: ROMP */
398
399 setlamp, /* 2: Lamp */
400 l_clock, /* 3: Clock */
401 rpctl, /* 4: R/P */
402
403 nokey, /* 5: -unused- */
404 nokey, /* 6: -unused- */
405 nokey, /* 7: -unused- */
406 nokey, /* 8: -unused- */
407
408 nokey, /* 9: -unused- */
409 nokey, /* 10: -unused- */
410 nokey, /* 11: -unused- */
411
412 nokey, /* 12: -unused- */
413 nokey /* 13: -unused- */
414};
415
416PFS t_load[] = { /* switch assignments for LS_LOAD */
417
418 quiet, /* 0: Quiet */
419 ROMPFN, /* 1: ROMP */
420
421 setlamp, /* 2: Lamp */
422 nokey, /* 3: -unused- */
423 nokey, /* 4: -unused- */
424
425 nokey, /* 5: -unused- */
426 nokey, /* 6: -unused- */
427 nokey, /* 7: -unused- */
428 l_load, /* 8: Load */
429
430 nokey, /* 9: -unused- */
431 nokey, /* 10: -unused- */
432 nokey, /* 11: -unused- */
433
434 nokey, /* 12: -unused- */
435 nokey /* 13: -unused- */
436};
437
438/*
439
440*/
441
442/*
443 =============================================================================
444 quiet() -- quiet the instrument
445 =============================================================================
446*/
447
448void quiet(void)
449{
450 register short vce;
451
452 for (vce = 0; vce < 12; vce++) /* for each voice ... */
453 sendval(vce, 2, 0); /* ... set level = 0 */
454
455 memsetw(seqflag, 0, 16); /* stop the sequences */
456 memsetw(seqtime, 0, 16); /* ... */
457
458 memsetw(trstate, 0, 16); /* reset the triggers */
459
460 seqdupd = 0xFFFF; /* request display update */
461
462 stmproc(NULL_DEF); /* trigger the blank definer */
463}
464
465/*
466 =============================================================================
467 rpctl() -- toggle record/play switch
468 =============================================================================
469*/
470
471void rpctl(short stat)
472{
473 if (NOT stat)
474 return;
475
476 recsw = NOT recsw;
477 dsrpmod();
478}
479
480/*
481
482*/
483
484/*
485 =============================================================================
486 trapper() -- trap to ROMP
487 =============================================================================
488*/
489
490void trapper(short stat)
491{
492 if (stat)
493 xtrap15();
494}
495
496/*
497 =============================================================================
498 l_clock() -- process 'Clock' switch
499 =============================================================================
500*/
501
502void l_clock(short stat)
503{
504 if (NOT stat)
505 return;
506
507 clkset(NOT clkrun);
508 dclkmd();
509}
510
511/*
512 =============================================================================
513 ulamp() -- underline lamp if forced on
514 =============================================================================
515*/
516
517void ulamp(void)
518{
519 if ((sliders EQ LS_VOICE) OR (sliders EQ LS_INST))
520 return;
521
522 point = GLCplot; /* setup to draw line */
523 GLCcurs(G_ON);
524
525 if (lampsw)
526 lseg (LAMP_XL, LAMP_Y, LAMP_XR, LAMP_Y, 1);
527 else
528 lseg (LAMP_XL, LAMP_Y, LAMP_XR, LAMP_Y, 0);
529
530 GLCcurs(G_OFF);
531}
532
533/*
534
535*/
536
537/*
538 =============================================================================
539 preio() -- turn off LCD backlight before disk I/O
540 =============================================================================
541*/
542
543void preio(void)
544{
545 short oldipl;
546
547 oldipl = setipl(TIM_DI);
548
549 lampio = lampsw;
550 iotime = lcdtime;
551 lampsw = FALSE;
552 io_leds = 0x1F;
553
554 setipl(oldipl);
555}
556
557/*
558 =============================================================================
559 postio() -- restore LCD backlight state after disk I/O
560 =============================================================================
561*/
562
563void postio(void)
564{
565 short oldipl;
566
567 oldipl = setipl(TIM_DI);
568
569 lampsw = lampio;
570
571 if (iotime OR lampsw) {
572
573 lcdtime = lcdontm;
574 io_leds = 0x9F;
575 }
576
577 setipl(oldipl);
578}
579
580/*
581
582*/
583
584/*
585 =============================================================================
586 setlamp() -- toggle LCD backlight mode
587 =============================================================================
588*/
589
590void setlamp(stat)
591{
592 register short oldi;
593
594 if (NOT stat) /* only act on key closures */
595 return;
596
597 oldi = setipl(TIM_DI); /* disable interrupts to keep out the timer */
598
599 lcdtime = lcdontm; /* set the LCD backlight timer */
600
601 if (lampsw) {
602
603 lampsw = FALSE; /* enable LCD timeouts */
604 io_leds = 0x1F; /* turn off the LCD backlight */
605
606 } else {
607
608 lampsw = TRUE; /* disable LCD timeouts */
609 io_leds = 0x9F; /* turn on the LCD backlight */
610 }
611
612 setipl(oldi); /* turn interrupts back on */
613
614 ulamp(); /* update underline on lamp key label */
615}
616
617/*
618 =============================================================================
619 lcd_on() -- turn on the LCD backlight
620 =============================================================================
621*/
622
623void lcd_on(void)
624{
625 register short oldi;
626
627 oldi = setipl(TIM_DI); /* disable interrupts to keep out the timer */
628
629 lcdtime = lcdontm; /* set the LCD backlight timer */
630 io_leds = 0x9F; /* turn on the LCD backlight */
631
632 setipl(oldi); /* turn interrupts back on */
633}
634
635/*
636
637*/
638
639/*
640 =============================================================================
641 loadkey() -- process data keys in load mode
642 =============================================================================
643*/
644
645void loadkey(short key)
646{
647 if (NOT astat)
648 return;
649
650 if (loadsw) { /* if it's load time */
651
652 if (key < 7) { /* ... and the key is valid */
653
654 loadem(key + 'A'); /* ... load the files */
655
656 loadsw = FALSE;
657 ltagged = FALSE;
658 d_key = olddkey;
659 x_key = oldxkey;
660 e_key = oldekey;
661 m_key = oldmkey;
662 pkctrl = oldpk;
663 sliders = oldsl;
664 swpt = oldsw;
665 lcdlbls();
666 }
667
668 return;
669 }
670}
671
672/*
673
674*/
675
676/*
677 =============================================================================
678 pcancel() -- cancel panel modes
679 =============================================================================
680*/
681
682void pcancel(short pm)
683{
684 point = GLCplot; /* setup to plot on LCD */
685 GLCcurs(G_ON);
686
687 if ((pm NE 0) AND asmode) {
688
689 /* cancel assignment mode */
690
691 asmode = 0;
692 pkctrl = oldpk;
693 swpt = oldsw;
694 lseg(ASGN_XL, ASGN_Y, ASGN_XR, ASGN_Y, 0);
695 }
696
697 if ((pm NE 1) AND (gomode NE GO_NULL)) {
698
699 /* cancel Go To mode */
700
701 gomode = GO_NULL;
702 pkctrl = oldpk;
703 lseg(GOTO_XL, GOTO_Y, GOTO_XR, GOTO_Y, 0);
704 }
705
706 if ((pm NE 2) AND (ismode NE IS_NULL)) {
707
708 /* cancel instrument select mode */
709
710 ismode = IS_NULL;
711 pkctrl = oldpk;
712 sliders = oldsl;
713 swpt = oldsw;
714 lcdlbls();
715 }
716
717 GLCcurs(G_OFF);
718 setleds();
719}
720
721/*
722
723*/
724
725/*
726 =============================================================================
727 l_load() -- process "Load" key
728 =============================================================================
729*/
730
731void l_load(short stat)
732{
733 if (NOT stat)
734 return;
735
736 pcancel(3); /* cancel panel selections */
737 lcancel(3); /* cancel librarian selections */
738
739 point = GLCplot; /* setup to plot on LCD */
740 GLCcurs(G_ON);
741
742 if (loadsw) { /* if load is selected, deselect */
743
744 d_key = olddkey;
745 e_key = oldekey;
746 m_key = oldmkey;
747 x_key = oldxkey;
748
749 pkctrl = oldpk;
750 sliders = oldsl;
751 swpt = oldsw;
752
753 loadsw = FALSE;
754
755 lcdlbls();
756/*
757
758*/
759 } else { /* setup for load mode */
760
761 clkset(0); /* stop the clock */
762
763 if (ltagged) { /* cancel tag mode */
764
765 dslslot(tagslot, exp_c(LCFBX01), loadrow);
766 ltagged = FALSE;
767 }
768
769 if ((pkctrl EQ PK_PFRM) OR (pkctrl EQ PK_NOTE))
770 oldpk = pkctrl;
771
772 if (sliders NE LS_LOAD)
773 oldsl = sliders;
774
775 pkctrl = PK_LOAD;
776 sliders = LS_LOAD;
777 oldsw = swpt;
778 swpt = t_load;
779
780 olddkey = d_key;
781 oldxkey = x_key;
782 oldekey = e_key;
783 oldmkey = m_key;
784 d_key = loadkey;
785 x_key = l_load;
786 e_key = l_load;
787 m_key = l_load;
788
789 loadsw = TRUE;
790
791 lcdlbls();
792 lseg(LOAD_XL, LOAD_Y, LOAD_XR, LOAD_Y, 1);
793 }
794
795 GLCcurs(G_OFF);
796 setleds();
797}
798
799/*
800
801*/
802
803/*
804 =============================================================================
805 lcdlbls() -- put up the labels on the LCD display
806 =============================================================================
807*/
808
809void lcdlbls(void)
810{
811 register short i, barval;
812 char buf[8];
813 char dsp[86];
814
815 point = GLCplot; /* set up to plot on the LCD */
816
817 GLCinit(); /* clear the LCD display */
818 GLCcurs(G_ON);
819
820 /* label the switches */
821
822 switch (sliders) {
823
824 case LS_PRMTR: /* parameter articulation */
825 case LS_OTHER: /* other stuff */
826 case LS_EQ: /* equalization */
827
828 GLCtext(0, 1, swtlbls[sliders]);
829
830 switch (gomode) {
831
832 case GO_SECT:
833
834 GLCtext(0, 31, "Sectn");
835 lseg(GOTO_XL, GOTO_Y, GOTO_XR, GOTO_Y, 1);
836 break;
837
838 case GO_SCOR:
839
840 GLCtext(0, 31, "Score");
841 lseg(GOTO_XL, GOTO_Y, GOTO_XR, GOTO_Y, 1);
842 break;
843
844 default:
845
846 GLCtext(0, 31, "Go To");
847 lseg(GOTO_XL, GOTO_Y, GOTO_XR, GOTO_Y, 0);
848 break;
849 }
850
851 break;
852/*
853
854*/
855 case LS_VOICE: /* voice selection */
856
857 dsp[0] = '\0';
858
859 for (i = 0; i < 12; i++) {
860
861 sprintf(buf, "%c%2d %c ",
862 (articen[i] ? '\176' : ' '), i + 1,
863 (articen[i] ? '\177' : ' '));
864
865 strcat(dsp, buf);
866 }
867
868 strcat(dsp, "Voice Init ");
869
870 GLCtext(0, 1, dsp);
871 break;
872
873 case LS_INST: /* instrument selection */
874
875 dsp[0] = '\0';
876
877 for (i = 0; i < 12; i++) {
878
879 sprintf(buf, "%c%2d %c ",
880 (grpsel[i] ? '\176' : ' '), i + 1,
881 (grpsel[i] ? '\177' : ' '));
882
883 strcat(dsp, buf);
884 }
885
886 if (ismode EQ IS_HORC)
887 strcat(dsp, " +20 "); /* hi orc */
888 else
889 strcat(dsp, " +00 "); /* lo orc */
890
891 strcat(dsp, " Deflt");
892
893 GLCtext(0, 1, dsp);
894 break;
895
896 case LS_LIBR:
897 case LS_NGRP:
898 case LS_LOAD:
899
900 GLCtext(0, 1, swtlbls[sliders]);
901 break;
902 }
903
904/*
905
906*/
907 GLCtext(7, 1, potlbls[sliders]); /* label the pots */
908
909 for (i = 0; i < 13; i++)
910 lseg(39 + (i * 36), 0, 39 + (i * 36), 63, 1);
911
912 switch (sliders) { /* draw the slider bars */
913
914 case LS_PRMTR: /* parameter articulation */
915 case LS_VOICE: /* voice articulation enable */
916 case LS_INST: /* instrument select */
917 case LS_LIBR: /* library select */
918 case LS_NGRP: /* group select */
919 case LS_LOAD: /* load select */
920
921 for (i = 0; i < 14; i++) {
922
923 if (BarType[i]) {
924
925 barval = (((BGprmtr[i] >> 5) - 500) << 6) / 252;
926 BarCset(i, barval);
927
928 } else {
929
930 barval = BGprmtr[i] / 252;
931 BarBset(i, barval);
932 }
933 }
934
935 break;
936
937 case LS_OTHER:
938
939 for (i = 0; i < 14; i++)
940 BarBset(i, (BGother[i] / 252));
941
942 break;
943
944 case LS_EQ:
945
946 for (i = 0; i < 14; i++)
947 BarCset(i, BGeq[i]);
948
949 break;
950
951 default:
952
953 break;
954 }
955
956 GLCcurs(G_OFF);
957 dsrpmod();
958 dclkmd();
959 ulamp();
960}
961
962/*
963
964*/
965
966/*
967 =============================================================================
968 selasg() -- select assignment table
969 =============================================================================
970*/
971
972void selasg(short n)
973{
974 register struct s_entry *ep;
975
976 getasg(curasg = n); /* set the assignment */
977
978 if (recsw) { /* if we're recording ... */
979
980 if (E_NULL NE (ep = findev(p_cur, t_cur, EV_ASGN, -1, -1))) {
981
982 ep->e_data1 = n; /* update old event */
983
984 } else if (E_NULL NE (ep = e_alc(E_SIZE2))) {
985
986 ep->e_type = EV_ASGN; /* create new event */
987 ep->e_data1 = n;
988 ep->e_time = t_cur;
989 p_cur = e_ins(ep, ep_adj(p_cur, 0, t_cur))->e_fwd;
990 eh_ins(ep, EH_ASGN);
991
992 if (ndisp EQ 2) { /* if the score is up ... */
993
994 ctrsw = TRUE;
995 se_disp(ep, D_FWD, gdstbc, 1);
996 scupd();
997 }
998 }
999 }
1000
1001 asmode = 0; /* drop out of assignment mode */
1002 pkctrl = oldpk; /* restore previous mode */
1003 swpt = oldsw;
1004
1005 point = GLCplot; /* update the LCD */
1006 GLCcurs(G_ON);
1007 lseg(ASGN_XL, ASGN_Y, ASGN_XR, ASGN_Y, 0);
1008 GLCtext(0, 1, swtlbls[sliders]);
1009 GLCcurs(G_OFF);
1010
1011 mpcupd(); /* update the video display ... */
1012 setleds(); /* ... and the LEDs */
1013}
1014
1015/*
1016
1017*/
1018
1019/*
1020 =============================================================================
1021 l_adfl() -- select default assignment table
1022 =============================================================================
1023*/
1024
1025void l_adfl(short stat)
1026{
1027 if (NOT stat)
1028 return;
1029
1030 selasg(0);
1031}
1032
1033/*
1034
1035*/
1036
1037/*
1038 =============================================================================
1039 l_asgn() -- select assignment
1040 =============================================================================
1041*/
1042
1043void l_asgn(short stat)
1044{
1045 if (NOT stat) /* only do this on key closure */
1046 return;
1047
1048 point = GLCplot; /* set up to plot on the LCD */
1049 GLCcurs(G_ON);
1050
1051 if (ismode NE IS_NULL) { /* cancel instrument select mode */
1052
1053 ismode = IS_NULL;
1054 pkctrl = oldpk;
1055 sliders = oldsl;
1056 swpt = oldsw;
1057 lcdlbls();
1058 }
1059
1060 if (gomode NE GO_NULL) { /* cancel Go To mode */
1061
1062 gomode = GO_NULL;
1063 pkctrl = oldpk;
1064 lseg(GOTO_XL, GOTO_Y, GOTO_XR, GOTO_Y, 0);
1065 }
1066/*
1067
1068*/
1069 switch (asmode) {
1070
1071 case 0: /* initial actuation */
1072
1073 if ((pkctrl EQ PK_PFRM) OR (pkctrl EQ PK_NOTE))
1074 oldpk = pkctrl;
1075
1076 asmode = (curasg ? ((curasg - 1) / 20) : 0) + 1;
1077 pkctrl = PK_ASGN;
1078 memcpy(aswtbl, swpt, sizeof t_prmtr);
1079 oldsw = swpt;
1080 swpt = aswtbl;
1081 aswtbl[13] = l_adfl;
1082 lseg(ASGN_XL, ASGN_Y, ASGN_XR, ASGN_Y, 1);
1083 GLCtext(0, 79, "Deflt");
1084 break;
1085
1086 case 1: /* +00 -- 01..20 to +20 */
1087 case 2: /* +20 -- 21..40 to +40 */
1088 case 3: /* +40 -- 41..60 to +60 */
1089 case 4: /* +60 -- 61..80 to +80 */
1090
1091 ++asmode;
1092 break;
1093
1094 case 5: /* +80 -- 81..99 to +00 */
1095
1096 asmode = 1;
1097 break;
1098
1099 }
1100
1101 GLCtext(0, 43, aslbls[asmode]);
1102 GLCcurs(G_OFF);
1103 setleds();
1104}
1105
1106/*
1107
1108*/
1109
1110/*
1111 =============================================================================
1112 l_inst() -- set select instrument mode
1113 =============================================================================
1114*/
1115
1116void l_inst(short stat)
1117{
1118 if (NOT stat)
1119 return;
1120
1121 point = GLCplot; /* set up to plot on the LCD */
1122 GLCcurs(G_ON);
1123
1124 if (asmode) { /* cancel assignment mode */
1125
1126 asmode = 0;
1127 pkctrl = oldpk;
1128 swpt = oldsw;
1129 lseg(ASGN_XL, ASGN_Y, ASGN_XR, ASGN_Y, 0);
1130 }
1131
1132 if (gomode NE GO_NULL) { /* cancel Go To mode */
1133
1134 gomode = GO_NULL;
1135 pkctrl = oldpk;
1136 lseg(GOTO_XL, GOTO_Y, GOTO_XR, GOTO_Y, 0);
1137 }
1138
1139 GLCcurs(G_OFF);
1140/*
1141
1142*/
1143 switch (ismode) {
1144
1145 case IS_NULL: /* select +00 -- low orchestra */
1146
1147 if ((pkctrl EQ PK_PFRM) OR (pkctrl EQ PK_NOTE))
1148 oldpk = pkctrl;
1149
1150 if (sliders NE LS_INST)
1151 oldsl = sliders;
1152
1153 oldsw = swpt;
1154 swpt = t_inst;
1155 pkctrl = PK_INST;
1156 ismode = IS_LORC;
1157 sliders = LS_INST;
1158 lcdlbls();
1159 break;
1160
1161 case IS_LORC: /* select +20 -- high orchestra */
1162
1163 ismode = IS_HORC;
1164 GLCcurs(G_ON);
1165 GLCtext(0, 73, " +20 ");
1166 GLCcurs(G_OFF);
1167 break;
1168
1169 case IS_HORC: /* deselect */
1170 default:
1171
1172 ismode = IS_NULL;
1173 pkctrl = oldpk;
1174 sliders = oldsl;
1175 swpt = oldsw;
1176 lcdlbls();
1177 break;
1178 }
1179
1180 setleds();
1181}
1182
1183/*
1184
1185*/
1186
1187/*
1188 =============================================================================
1189 selins() -- select an instrument
1190 =============================================================================
1191*/
1192
1193void selins(short ival)
1194{
1195 register short n;
1196 register struct s_entry *ep;
1197
1198 for (n = 0; n < 12; n++) {
1199
1200 if (FALSE EQ grpsel[n])
1201 continue;
1202
1203 ins2grp[n] = ival | (ins2grp[n] & 0xFF00);
1204 setv2gi(n);
1205
1206 if (recsw AND grpstat[n] AND (2 EQ grpmode[n])) {
1207
1208 if (E_NULL NE (ep = findev(p_cur, t_cur, EV_INST, n, -1))) {
1209
1210 ep->e_data2 = ival;
1211
1212 } else if (E_NULL NE (ep = e_alc(E_SIZE2))) {
1213
1214 ep->e_type = EV_INST;
1215 ep->e_data1 = n;
1216 ep->e_data2 = ival;
1217 ep->e_time = t_cur;
1218 p_cur = e_ins(ep, ep_adj(p_cur, 0, t_cur))->e_fwd;
1219 eh_ins(ep, EH_INST);
1220
1221 if (ndisp EQ 2) {
1222
1223 ctrsw = TRUE;
1224 se_disp(ep, D_FWD, gdstbc, 1);
1225 scupd();
1226 }
1227 }
1228 }
1229 }
1230
1231 setinst();
1232
1233/*
1234
1235*/
1236 ismode = IS_NULL;
1237 pkctrl = oldpk;
1238 sliders = oldsl;
1239 swpt = oldsw;
1240 lcdlbls();
1241 setleds();
1242 mpcupd();
1243}
1244
1245/*
1246
1247*/
1248
1249/*
1250 =============================================================================
1251 l_dflt() -- select default isntrument
1252 =============================================================================
1253*/
1254
1255void l_dflt(short stat)
1256{
1257 if (NOT stat)
1258 return;
1259
1260 selins(0);
1261}
1262
1263/*
1264
1265*/
1266
1267/*
1268 =============================================================================
1269 l_goto() -- go to (section / score)
1270 =============================================================================
1271*/
1272
1273void l_goto(short stat)
1274{
1275 if (NOT stat) /* only do this on key closure */
1276 return;
1277
1278 point = GLCplot; /* set up to plot on the LCD */
1279 GLCcurs(G_ON);
1280
1281 if (asmode) { /* cancel assignment mode */
1282
1283 asmode = 0;
1284 pkctrl = oldpk;
1285 swpt = oldsw;
1286 lseg(ASGN_XL, ASGN_Y, ASGN_XR, ASGN_Y, 0);
1287 }
1288
1289 if (ismode NE IS_NULL) { /* cancel instrument select mode */
1290
1291 ismode = IS_NULL;
1292 sliders = oldsl;
1293 pkctrl = oldpk;
1294 swpt = oldsw;
1295 lcdlbls();
1296 }
1297
1298 recsw = FALSE; /* force play mode */
1299 dsrpmod();
1300/*
1301
1302*/
1303 switch (gomode) { /* select Go To mode */
1304
1305 case GO_NULL:
1306
1307 if ((pkctrl EQ PK_PFRM) OR (pkctrl EQ PK_NOTE))
1308 oldpk = pkctrl;
1309
1310 pkctrl = PK_GOTO;
1311 gomode = GO_SECT;
1312 GLCtext(0, 31, "Sectn");
1313 lseg(GOTO_XL, GOTO_Y, GOTO_XR, GOTO_Y, 1);
1314 break;
1315
1316 case GO_SECT:
1317
1318 gomode = GO_SCOR;
1319 GLCtext(0, 31, "Score");
1320 lseg(GOTO_XL, GOTO_Y, GOTO_XR, GOTO_Y, 1);
1321 break;
1322
1323 case GO_SCOR:
1324 default:
1325
1326 pkctrl = oldpk;
1327 gomode = GO_NULL;
1328 GLCtext(0, 31, "Go To");
1329 lseg(GOTO_XL, GOTO_Y, GOTO_XR, GOTO_Y, 0);
1330 break;
1331 }
1332
1333 GLCcurs(G_OFF);
1334 setleds();
1335}
1336
1337/*
1338
1339*/
1340
1341/*
1342 =============================================================================
1343 newpps() -- send out new polyphonic pressure source value
1344 =============================================================================
1345*/
1346
1347void newpps(short trg, short grp, short src, short ival)
1348{
1349 register struct sment *smf, *smp;
1350 register unsigned *fpu;
1351 register long ltmp;
1352 register short val;
1353 register short vce;
1354 short gs, oldi;
1355
1356 gs = (grp << 4) | src; /* calculate group/source index */
1357 fpu = io_fpu + FPU_OFNC; /* point at FPU base */
1358 valents[gs].val = ival; /* update value in table */
1359 smp = smf = (struct sment *)&valents[gs];
1360
1361/*
1362
1363*/
1364 while (smf NE (smp = smp->nxt)) { /* for each function ... */
1365
1366 vce = (smp->vp >> 4) & 0x0F; /* extract voice number */
1367
1368 if (vce2trg[vce] EQ trg) { /* for each key that matches ... */
1369
1370 switch (smp->vp & 0x000F) {
1371
1372 case 1: /* frq 1 */
1373 case 3: /* frq 2 */
1374 case 5: /* frq 3 */
1375 case 7: /* frq 4 */
1376
1377 val = ival >> 3;
1378 break;
1379
1380 case 10: /* filtr */
1381
1382 ltmp = ((long)ival >> 1) + ((long)ival >> 2);
1383
1384 if (ltmp > (long)VALMAX)
1385 ltmp = (long)VALMAX;
1386 else if (ltmp < (long)VALMIN)
1387 ltmp = (long)VALMIN;
1388
1389 val = (short)ltmp;
1390 break;
1391
1392 default:
1393
1394 val = ival;
1395 }
1396
1397 oldi = setipl(FPU_DI);
1398
1399/* ++++++++++++++++++++++++++++ FPU interrupts disabled +++++++++++++++++++++ */
1400
1401 *(fpu + (smp->vp << 4) + FPU_TCV1) = val;
1402
1403 setipl(oldi);
1404
1405/* ++++++++++++++++++++++++++++ Interrupts restored +++++++++++++++++++++++++ */
1406
1407 }
1408 }
1409}
1410
1411/*
1412
1413*/
1414
1415/*
1416 =============================================================================
1417 newsv() -- send out new source value if it's changed
1418 =============================================================================
1419*/
1420
1421short newsv(short grp, short src, short ival)
1422{
1423 register struct sment *smf, *smp;
1424 register unsigned *fpu;
1425 register long ltmp;
1426 register short val;
1427 register short gs;
1428 register short oldi;
1429 short vmask, var;
1430
1431 gs = (grp << 4) | src; /* calculate grp/src index */
1432
1433 if (-1 NE (var = src2var[src])) { /* see if its a variable */
1434
1435 vmask = vmasks[anrs[var][grp]]; /* setup resolution mask */
1436
1437 /* see if we have a change in the selected significant bits */
1438
1439 if (((val = valents[gs].val) & vmask) EQ (ival & vmask)) {
1440
1441 /* make sure we always see a change to zero */
1442
1443 if (NOT ((ival EQ 0) AND val)) /* if not becoming zero */
1444 return(FALSE); /* ... it didn't change enough */
1445 }
1446 }
1447
1448 fpu = io_fpu + FPU_OFNC; /* point to FPU */
1449
1450 valents[gs].val = ival; /* update value in table */
1451
1452 smf = (struct sment *)&valents[gs]; /* point at value table */
1453 smp = smf;
1454
1455/*
1456
1457*/
1458 while (smf NE (smp = smp->nxt)) { /* update functions */
1459
1460 switch (smp->vp & 0x000F) {
1461
1462 case 1: /* frq 1 */
1463 case 3: /* frq 2 */
1464 case 5: /* frq 3 */
1465 case 7: /* frq 4 */
1466
1467 val = ival >> 3;
1468 break;
1469
1470 case 10: /* filtr */
1471
1472 ltmp = ((long)ival >> 1) + ((long)ival >> 2);
1473
1474 if (ltmp > (long)VALMAX)
1475 ltmp = (long)VALMAX;
1476 else if (ltmp < (long)VALMIN)
1477 ltmp = (long)VALMIN;
1478
1479 val = (short)ltmp;
1480 break;
1481
1482 default:
1483
1484 val = ival;
1485 }
1486
1487 oldi = setipl(FPU_DI);
1488
1489/* ++++++++++++++++++++++++++++ FPU interrupts disabled +++++++++++++++++++++ */
1490
1491 *(fpu + (smp->vp << 4) + FPU_TCV1) = val;
1492
1493 setipl(oldi);
1494
1495/* ++++++++++++++++++++++++++++ Interrupts restored +++++++++++++++++++++++++ */
1496
1497 }
1498
1499 return(TRUE);
1500}
1501
1502/*
1503
1504*/
1505
1506/*
1507 =============================================================================
1508 setsv() -- unconditionally send out new source value
1509 =============================================================================
1510*/
1511
1512void setsv(short grp, short src, short ival)
1513{
1514 register struct sment *smf, *smp;
1515 register unsigned *fpu;
1516 register long ltmp;
1517 register short val;
1518 register short gs;
1519 register short oldi;
1520
1521 gs = (grp << 4) | src; /* calculate grp/src index */
1522 fpu = io_fpu + FPU_OFNC; /* point to FPU */
1523
1524 valents[gs].val = ival; /* update value in table */
1525
1526 smf = (struct sment *)&valents[gs]; /* point at value table */
1527 smp = smf;
1528
1529/*
1530
1531*/
1532 while (smf NE (smp = smp->nxt)) { /* update functions */
1533
1534 switch (smp->vp & 0x000F) {
1535
1536 case 1: /* frq 1 */
1537 case 3: /* frq 2 */
1538 case 5: /* frq 3 */
1539 case 7: /* frq 4 */
1540
1541 val = ival >> 3;
1542 break;
1543
1544 case 10: /* filtr */
1545
1546 ltmp = ((long)ival >> 1) + ((long)ival >> 2);
1547
1548 if (ltmp > (long)VALMAX)
1549 ltmp = (long)VALMAX;
1550 else if (ltmp < (long)VALMIN)
1551 ltmp = (long)VALMIN;
1552
1553 val = (short)ltmp;
1554 break;
1555
1556 default:
1557
1558 val = ival;
1559 }
1560
1561 oldi = setipl(FPU_DI);
1562
1563/* ++++++++++++++++++++++++++++ FPU interrupts disabled +++++++++++++++++++++ */
1564
1565 *(fpu + (smp->vp << 4) + FPU_TCV1) = val;
1566
1567 setipl(oldi);
1568
1569/* ++++++++++++++++++++++++++++ Interrupts restored +++++++++++++++++++++++++ */
1570
1571 }
1572}
1573
1574/*
1575
1576*/
1577
1578/*
1579 =============================================================================
1580 l_prmtr() -- set parameter articulation status
1581 =============================================================================
1582*/
1583
1584void l_prmtr(short stat, short sig)
1585{
1586 if (NOT stat)
1587 return;
1588
1589 switch (sliders) {
1590
1591 case LS_PRMTR:
1592 case LS_OTHER:
1593 case LS_EQ:
1594
1595 sliders = LS_VOICE;
1596 swpt = t_voice;
1597 break;
1598
1599 case LS_VOICE:
1600 default:
1601
1602 sliders = LS_PRMTR;
1603 swpt = t_prmtr;
1604 break;
1605 }
1606
1607 lcdlbls();
1608 setleds();
1609}
1610
1611/*
1612
1613*/
1614
1615/*
1616 =============================================================================
1617 l_voice() -- set voice selection status
1618 =============================================================================
1619*/
1620
1621void l_voice(short stat, short vce)
1622{
1623 register short ap, j, par;
1624 register unsigned *fpu;
1625
1626 char buf[8];
1627
1628 if (NOT stat)
1629 return;
1630
1631 articen[vce] = NOT articen[vce]; /* toggle voice enable */
1632
1633 sprintf(buf, "%c%2d %c", (articen[vce] ? '\176' : ' '), vce + 1,
1634 (articen[vce] ? '\177' : ' '));
1635
1636 GLCcurs(G_ON);
1637 GLCtext(0, (1 + (6 * vce)), buf);
1638 GLCcurs(G_OFF);
1639
1640 if (articen[vce]) { /* turn articulation on if voice is enabled */
1641
1642 for (ap = 0; ap < 14; ap++) {
1643
1644 par = arpar[ap];
1645 sendart(vce, par, lastart[par]);
1646 }
1647
1648 } else { /* ... or turn it off if voice is disabled */
1649
1650 fpu = io_fpu + FPU_OFNC + (vce << 8);
1651
1652 for (j = 1; j < 16; j++)
1653 *(fpu + (j << 4) + FPU_TSF2) = 0;
1654 }
1655}
1656
1657/*
1658
1659*/
1660
1661/*
1662 =============================================================================
1663 l_group() -- set group selection status
1664 =============================================================================
1665*/
1666
1667void l_group(short stat, short grp)
1668{
1669 char buf[8];
1670
1671 if (NOT stat)
1672 return;
1673
1674 grpsel[grp] = NOT grpsel[grp]; /* toggle voice enable */
1675
1676 sprintf(buf, "%c%2d %c", (grpsel[grp] ? '\176' : ' '), grp + 1,
1677 (grpsel[grp] ? '\177' : ' '));
1678
1679 GLCcurs(G_ON);
1680 GLCtext(0, (1 + (6 * grp)), buf);
1681 GLCcurs(G_OFF);
1682}
1683
1684/*
1685 =============================================================================
1686 l_other -- set aux function status
1687 =============================================================================
1688*/
1689
1690void l_other(short stat, short sig)
1691{
1692 if (NOT stat)
1693 return;
1694
1695 sliders = LS_OTHER;
1696 swpt = t_other;
1697
1698 lcdlbls();
1699}
1700
1701/*
1702
1703*/
1704
1705/*
1706 =============================================================================
1707 l_eq -- set eq mode
1708 =============================================================================
1709*/
1710
1711void l_eq(short stat, short sig)
1712{
1713 if (NOT stat)
1714 return;
1715
1716 if (sliders EQ LS_EQ) {
1717
1718 sliders = LS_PRMTR;
1719 swpt = t_prmtr;
1720
1721 } else {
1722
1723 sliders = LS_EQ;
1724 swpt = t_eq;
1725 }
1726
1727 lcdlbls();
1728}
1729
1730/*
1731 =============================================================================
1732 artclr() -- clear the articulation pot values
1733 =============================================================================
1734*/
1735
1736void artclr(void)
1737{
1738 register short i;
1739
1740 for (i = 0; i < 14; i++)
1741 lastart[arpar[i]] = artitab[i];
1742}
1743
1744/*
1745
1746*/
1747
1748/*
1749 =============================================================================
1750 l_init() -- initialize articulation values (reset the sliders)
1751 =============================================================================
1752*/
1753
1754void l_init(short stat, short sig)
1755{
1756 register unsigned *fpu;
1757 register short barval, i, j;
1758 char buf[16];
1759
1760 if (NOT stat)
1761 return;
1762
1763 fpu = io_fpu + FPU_OFNC;
1764
1765 switch (sliders) {
1766
1767 case LS_PRMTR:
1768 case LS_VOICE:
1769 case LS_INST:
1770 case LS_LIBR:
1771 case LS_NGRP:
1772 case LS_LOAD:
1773
1774 /* clear all but spares in voices 1..12 */
1775
1776 for (i = 0; i < 12; i++)
1777 for (j = 1; j < 16; j++)
1778 *(fpu + (i << 8) + (j << 4) + FPU_TSF2) = 0;
1779
1780 artclr();
1781
1782 for (i = 0; i < 14; i++) {
1783
1784 BGprmtr[i] = artitab[i];
1785
1786 if (BarType[i]) {
1787
1788 barval = (((artitab[i] >> 5) - 500) << 6) / 252;
1789 BarCset(i, barval);
1790
1791 } else {
1792
1793 barval = artitab[i] / 252;
1794 BarBset(i, barval);
1795 }
1796 }
1797
1798 break;
1799
1800 case LS_OTHER:
1801
1802 /* clear spares in voices 2..12 */
1803
1804 for (i = 1; i < 12; i++)
1805 *(fpu + (i << 8) + FPU_TSF2) = 0;
1806
1807 for (i = 0; i < 14; i++)
1808 BarBset(i, BGother[i] = 0);
1809
1810 break;
1811
1812 case LS_EQ:
1813
1814 for (i = 0; i < 14; i++) {
1815
1816 sendeq(i, gain2eq(0));
1817 BarCset(i, BGeq[i] = 0);
1818 }
1819
1820 break;
1821 }
1822}
1823
1824/*
1825
1826*/
1827
1828/*
1829 =============================================================================
1830 sendart() -- send out an articulation value
1831 =============================================================================
1832*/
1833
1834void sendart(short vce, short par, short ival)
1835{
1836 register unsigned *fpu;
1837 register short val, oldi, mult;
1838 short nop;
1839
1840 lastart[par] = ival;
1841
1842 fpu = io_fpu + FPU_OFNC + (vce << 8) + (par << 4);
1843 mult = 0x7FFF;
1844
1845 switch (par) {
1846
1847 case 1: /* freq 1 */
1848 case 3: /* freq 2 */
1849 case 5: /* freq 3 */
1850 case 7: /* freq 4 */
1851
1852 val = addpch(ival, 0);
1853 break;
1854
1855 case 10: /* filter */
1856
1857 val = ((ival >> 5) - 500) << 5;
1858 break;
1859
1860/*
1861
1862*/
1863
1864 case 2: /* level */
1865
1866 val = ival;
1867 mult = 0xFFFF;
1868 break;
1869
1870 case 4: /* location */
1871
1872 val = ((ival >> 5) - 500) << 5;
1873 mult = 0xFFFF;
1874 break;
1875
1876 default:
1877
1878 val = ival;
1879 }
1880
1881 oldi = setipl(FPU_DI);
1882
1883/* ++++++++++++++++++++++++++++ FPU interrupts disabled +++++++++++++++++++++ */
1884
1885 *(fpu + FPU_TCV2) = val;
1886 ++nop; ++nop; ++nop;
1887 *(fpu + FPU_TSF2) = mult;
1888
1889 setipl(oldi);
1890
1891/* ++++++++++++++++++++++++++++ Interrupts restored +++++++++++++++++++++++++ */
1892
1893}
1894
1895/*
1896
1897*/
1898
1899/*
1900 =============================================================================
1901 doslide() -- update a changed slider value
1902 =============================================================================
1903*/
1904
1905void doslide(void)
1906{
1907 register short arp, bar, barval, i, slval;
1908
1909 slval = ART_VAL(aval); /* scaled articulation value */
1910 bar = asig - 25; /* bar number */
1911
1912 switch (sliders) {
1913
1914 case LS_PRMTR: /* parameter articulation */
1915 case LS_VOICE:
1916 case LS_INST:
1917 case LS_LIBR:
1918 case LS_NGRP:
1919 case LS_LOAD:
1920
1921 BGprmtr[bar] = slval;
1922 arp = arpar[bar];
1923
1924 for (i = 0; i < 12; i++)
1925 if (articen[i])
1926 sendart(i, arp, slval);
1927
1928 if (BarType[bar]) { /* center-zero bar */
1929
1930 barval = (((slval >> 5) - 500) << 6) / 252;
1931 BarCadj(bar, barval);
1932
1933 } else { /* bottom-zero bar */
1934
1935 barval = slval / 252;
1936 BarBadj(bar, barval);
1937 }
1938
1939 return;
1940/*
1941
1942*/
1943 case LS_OTHER: /* aux, dome, cv control */
1944
1945 switch (asig) {
1946
1947 case 26: /* aux mod */
1948 sendart(9, 0, slval);
1949 break;
1950
1951 case 27: /* depth */
1952 sendart(3, 0, slval);
1953 break;
1954
1955 case 28: /* rate */
1956 sendart(2, 0, slval);
1957 break;
1958
1959 case 29: /* intensity */
1960 sendart(1, 0, slval);
1961 break;
1962
1963 case 30: /* cv1 */
1964 sendart(11, 0, slval);
1965 break;
1966
1967 case 31: /* cv2 */
1968 sendart(10, 0, slval);
1969 break;
1970
1971 case 32: /* cv3 */
1972 sendart(6, 0, slval);
1973 break;
1974
1975 case 33: /* cv4 */
1976 sendart(8, 0, slval);
1977 break;
1978
1979 default:
1980 slval = 0; /* force unused pots to stay zero */
1981 break;
1982 }
1983
1984 BGother[bar] = slval;
1985 barval = slval / 252;
1986 BarBadj(bar, barval);
1987
1988 return;
1989
1990/*
1991
1992*/
1993 case LS_EQ: /* eq control */
1994
1995 barval = (((slval >> 5) - 500) << 6) / 252;
1996 BGeq[bar] = barval;
1997 sendeq(bar, gain2eq(SL2GAIN(slval)));
1998 BarCadj(bar, barval);
1999
2000 return;
2001
2002 default:
2003 return;
2004 }
2005}
2006
2007/*
2008
2009*/
2010
2011/*
2012 =============================================================================
2013 settmpo() -- set the tempo
2014 =============================================================================
2015*/
2016
2017void settmpo(short val)
2018{
2019 register short timeval;
2020
2021 tmpoval = val;
2022 timeval = ( ( (tmpomlt + 50) * tmpoval) / 100);
2023 timeval = (short)( (192000L / timeval) - 1);
2024 TIME_T2H = timeval >> 8;
2025 TIME_T2L = timeval & 0x00FF;
2026}
2027
2028/*
2029
2030*/
2031
2032/*
2033 =============================================================================
2034 settune() -- send the fine tuning from tuneval to the FPU
2035 =============================================================================
2036*/
2037
2038void settune(void)
2039{
2040 register short oldi, i, grp;
2041 register unsigned *fpu;
2042 register long trval, trmax;
2043 short nop;
2044
2045 trmax = PCHMAX;
2046
2047 oldi = setsr(0x2200);
2048
2049/* +++++++++++++++++++++++ FPU interrupts disabled ++++++++++++++++++++++++++ */
2050
2051 for (i = 0; i < 12; i++) {
2052
2053 if (-1 NE (grp = vce2grp[i])) {
2054
2055 trval = (long)tuneval + ((long)s_trns[grp - 1] << 1);
2056
2057 if (trval > trmax)
2058 trval = trmax;
2059
2060 } else {
2061
2062 trval = (long)tuneval;
2063 }
2064
2065 fpu = io_fpu + FPU_OFNC + (i << 8) + 0x0010; /* freq 1 */
2066
2067 *(fpu + FPU_TCV3) = (unsigned)(0x0000FFFFL & trval);
2068 ++nop; ++nop; ++nop;
2069 *(fpu + FPU_TSF3) = 0x7FFF;
2070 }
2071
2072 setsr(oldi);
2073
2074/* ++++++++++++++++++++++++++++ Interrupts restored +++++++++++++++++++++++++ */
2075
2076}
Note: See TracBrowser for help on using the repository browser.