source: buchla-68k/ram/ptfield.c@ 0c834c5

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

Prototypes for global function pointers. Consistent global types.

  • Property mode set to 100644
File size: 16.4 KB
Line 
1/*
2 =============================================================================
3 ptfield.c -- MIDAS-VII patch display field functions
4 Version 35 -- 1989-11-16 -- D.N. Lynx Crowe
5 =============================================================================
6*/
7
8#define DEBUGXP 0
9
10#define USEVECTR 0 /* to force vector cursor control */
11
12#include "stddefs.h"
13#include "hwdefs.h"
14#include "graphdef.h"
15#include "vsdd.h"
16#include "fields.h"
17#include "curpak.h"
18#include "patch.h"
19#include "macros.h"
20
21#include "midas.h"
22#include "ptdisp.h"
23
24#if DEBUGXP
25extern short debugsw;
26
27short debugxp = 1;
28#endif
29
30#if USEVECTR
31short usevect = TRUE;
32
33extern void (*cx_key)(void);
34extern void (*cy_key)(void);
35#endif
36
37extern void (*xy_up)(void);
38extern void (*xy_dn)(void);
39extern void (*premove)(void);
40extern void (*pstmove)(void);
41extern short (*curtype)(void);
42
43extern unsigned fromfpu(unsigned fputime);
44
45extern void select(void);
46extern short nokey(void);
47extern short stdctp5(void);
48extern void cxkstd(void);
49extern void cykstd(void);
50extern void stdmkey(void);
51extern void stddkey(void);
52extern void stopcm(void);
53extern void smxupd(void);
54extern void smyupd(void);
55extern void aftercm(void);
56extern void ptdkey(void);
57
58extern short astat;
59extern short chtime;
60extern short chwait;
61extern short cmfirst;
62extern short cmtype;
63extern short curhold;
64extern short cvtime;
65extern short cvwait;
66extern short ncvwait;
67extern short ptbflag;
68extern short ptecpos;
69extern short ptedef;
70extern short ptedfok;
71extern short pteset;
72extern short ptestm;
73extern short ptestok;
74extern short ss_ptsw;
75extern short ss_sqsw;
76extern short stccol;
77extern short stcrow;
78extern short syrate;
79extern short tvcwval;
80extern short vcwval;
81
82extern short crate1[];
83
84extern char ptdebuf[];
85
86extern struct selbox *csbp;
87extern struct selbox ptboxes[];
88
89extern struct patch ptebuf;
90
91void ptxkey(void);
92void ptmkey(void);
93void ptekey(void);
94
95/*
96
97*/
98
99char *trdata[] = { "Trans", "Stop ", "Start" };
100char *ssdata[] = { "Stop ", "Start" };
101
102char *stdata[] = { "Srce" , "Mult", "Time", "Valu", "Func" };
103
104char *smdata[] = {
105
106 " ", /* SM_NONE 0 No source - always 0 */
107 "Randm", /* SM_RAND 1 Random source */
108 "GPC/V", /* SM_CTL1 2 Control Voltage 1 / MIDI GPC 1 */
109 "??3??", /* ------- 3 -unused- */
110 "??4??", /* ------- 4 -unused- */
111 "Pitch", /* SM_PTCH 5 Key Pitch */
112 "KeyPr", /* SM_KPRS 6 Key Pressure */
113 "KeyVL", /* SM_KVEL 7 Key Velocity */
114 "Pedal", /* SM_PED1 8 Pedal 1 */
115 "??9??", /* ------- 9 -unused- */
116 "Freq ", /* SM_FREQ 10 Key Frequency */
117 "PchWh", /* SM_HTPW 11 Tablet X / MIDI Pitch Wheel */
118 "ModWh", /* SM_VTMW 12 Tablet Y / MIDI Mod Wheel */
119 "Breth", /* SM_LPBR 13 LongPot / MIDI Breath Controller */
120};
121
122struct curpak pt_flds = {
123
124 stdctp5, /* curtype */
125 nokey, /* premove */
126 aftercm, /* pstmove */
127 cxkstd, /* cx_key */
128 cykstd, /* cy_key */
129 smxupd, /* cx_upd */
130 smyupd, /* cy_upd */
131 stopcm, /* xy_up */
132 nokey, /* xy_dn */
133 ptxkey, /* x_key */
134 ptekey, /* e_key */
135 ptmkey, /* m_key */
136 ptdkey, /* d_key */
137 nokey, /* not_fld */
138 (struct fet *)NULL, /* curfet */
139 ptboxes, /* csbp */
140 crate1, /* cratex */
141 crate1, /* cratey */
142 CT_SMTH, /* cmtype */
143 CTOX(2), /* cxval */
144 RTOY(DATAROW) /* cyval */
145};
146
147/*
148
149*/
150
151/*
152 =============================================================================
153 ptmkey() -- M key processing for the patch display
154 =============================================================================
155*/
156
157void ptmkey(void)
158{
159 register short nc;
160
161 if (astat) {
162
163 if (stccol EQ 48) {
164
165 if (ss_sqsw EQ 0) {
166
167 (*xy_dn)(); /* handle KEY_DOWN functions */
168
169 (*premove)(); /* handle PRE-MOVE functions */
170
171 nc = (*curtype)(); /* get new CURSOR TYPE wanted */
172
173 cvtime = syrate;
174 ncvwait = curhold;
175
176 ss_ptsw = -1;
177 cmtype = nc;
178 cvwait = 1;
179 }
180
181 } else
182 stdmkey();
183
184 } else {
185
186 if (stccol EQ 48) {
187
188 ss_ptsw = 0;
189 cvwait = 1;
190 ncvwait = cvtime;
191 cmfirst = TRUE;
192
193 if (ss_sqsw EQ 0)
194 (*xy_up)();
195
196 (*pstmove)(); /* handle POST-MOVE functions */
197
198 } else
199 stdmkey();
200 }
201}
202
203/*
204
205*/
206
207/*
208 =============================================================================
209 ptekey() -- E key processing for the patch display
210 =============================================================================
211*/
212
213void ptekey(void)
214{
215 register short nc;
216
217 if (astat) {
218
219 if (stccol EQ 48) {
220
221 if (ss_sqsw EQ 0) {
222
223 (*xy_dn)(); /* handle KEY_DOWN functions */
224
225 (*premove)(); /* handle PRE-MOVE functions */
226
227 nc = (*curtype)(); /* get new CURSOR TYPE wanted */
228
229 cvtime = syrate;
230 ncvwait = curhold;
231
232 ss_ptsw = 1;
233 cmtype = nc;
234 cvwait = 1;
235 }
236
237 } else
238 select();
239
240 } else {
241
242 if (stccol EQ 48) {
243
244 ss_ptsw = 0;
245 cvwait = 1;
246 ncvwait = cvtime;
247 cmfirst = TRUE;
248
249 if (ss_sqsw EQ 0)
250 (*xy_up)();
251
252 (*pstmove)(); /* handle POST-MOVE functions */
253
254 } else
255 select();
256 }
257}
258
259/*
260
261*/
262
263/*
264 =============================================================================
265 ptxkey() -- X key processing for the patch display
266 =============================================================================
267*/
268
269void ptxkey(void)
270{
271 register short i, cp, pp, sp, stm;
272
273 if (NOT astat) /* only on key closures ... */
274 return;
275
276 if (inrange(stccol, 2, 13)) { /* definer -- clear definer */
277
278 if (ptecpos AND NOT ptbflag) { /* refresh data entry stuff */
279
280 memcpyw(&ptebuf.defnum, &patches[ptecpos].defnum, 6);
281 pteset = TRUE;
282 pte2buf();
283 }
284
285 ptedef = NULL_DEF;
286 ptedfok = TRUE;
287
288 memset(&ptdebuf[2], ' ', 12);
289
290 for (i = 0; i < 48; i++)
291 if (ptdebuf[i] EQ '\0')
292 ptdebuf[i] = ' ';
293
294 ptdebuf[0] = '\260';
295 ptdebuf[48] = '\0';
296
297 UpdVid(7, 0, ptdebuf, PTEATR);
298 movectc(stcrow, stccol);
299
300/*
301
302*/
303 } else if (inrange(stccol, 15, 26)) { /* stimulus -- clear stimulus */
304
305 if (ptecpos AND NOT ptbflag) { /* refresh data entry stuff */
306
307 memcpyw(&ptebuf.defnum, &patches[ptecpos].defnum, 6);
308 pteset = TRUE;
309 pte2buf();
310 }
311
312 ptestm = NULL_DEF;
313 ptestok = FALSE;
314
315 memset(&ptdebuf[15], ' ', 12);
316
317 for (i = 0; i < 48; i++)
318 if (ptdebuf[i] EQ '\0')
319 ptdebuf[i] = ' ';
320
321 ptdebuf[0] = '\260';
322 ptdebuf[48] = '\0';
323
324 UpdVid(7, 0, ptdebuf, PTEATR);
325 movectc(stcrow, stccol);
326
327 } else if (inrange(stccol, 28, 40)) { /* destination -- clear line */
328
329 voidpb(); /* void the patch buffer */
330
331 ptdebuf[0] = '\260';
332 ptdebuf[48] = '\0';
333
334 UpdVid(7, 0, ptdebuf, PTEATR);
335 movectc(stcrow, stccol);
336/*
337
338*/
339 } else if (inrange(stccol, 42, 46)) { /* datum -- delete the patch */
340
341 if (ptecpos) {
342
343 cp = ptecpos; /* setup indices */
344 pp = patches[cp].prevstm;
345 sp = patches[cp].nextstm;
346
347 stm = patches[cp].stmnum; /* get stimulus used */
348#if DEBUGXP
349 if (debugsw AND debugxp)
350 printf("ptxkey(): DELETING PATCH pp = %d cp = %d sp = %d\n",
351 pp, cp, sp);
352#endif
353
354 if (pp) /* adjust predecessor */
355 patches[pp].nextstm = sp;
356 else /* adjust stmptr */
357 stmptr[TRG_MASK & stm] = sp;
358
359 if (sp) /* adjust successor */
360 patches[sp].prevstm = pp;
361
362 if (sp = findnxt(cp)) /* adjust ptecpos */
363 ptecpos = sp;
364 else if (pp = findprv(cp))
365 ptecpos = pp;
366 else
367 ptecpos = 0;
368
369 pt_del(cp); /* delete the patch entry */
370/*
371
372*/
373 for (i = 0; i < NDEFSTMS; ++i) { /* adjust defptr list */
374
375 if (cp = defptr[i]) { /* in use ? */
376
377 pp = 0; /* initial predecessor */
378
379 while (cp) { /* check the chain */
380
381 sp = defents[cp].nextdef; /* successor */
382
383 if (defents[cp].stm EQ stm) {
384
385#if DEBUGXP
386 if (debugsw AND debugxp) {
387
388 printf("ptxkey(): DELETING DEF trg=$%04.4X stm=$%04.4X\n",
389 i, stm);
390
391 printf("ptxkey(): DELETING DEF pp=%d cp=%d sp=%d\n",
392 pp, cp, sp);
393 }
394#endif
395
396 if (pp) /* adjust predecessor */
397 defents[pp].nextdef = sp;
398 else /* adjust defptr */
399 defptr[i] = sp;
400
401 dt_del(cp); /* delete def entry */
402
403 } else {
404
405 pp = cp; /* update predecessor index */
406 }
407
408 cp = sp; /* next defent */
409 }
410 }
411 }
412
413 dptw(); /* update the display */
414 }
415 }
416}
417
418/*
419
420*/
421
422/*
423 =============================================================================
424 dspdfst() -- convert a patch DEF or STM value for display
425 =============================================================================
426*/
427
428void dspdfst(char *buf, unsigned short val)
429{
430 register unsigned short chan, port, stim;
431
432 if (val EQ NULL_DEF) { /* handle possible blank definer */
433
434 strcpy(buf, " ");
435 return;
436 }
437
438 port = (val >> 11) & 0x0003;
439 chan = (val >> 7) & 0x000F;
440 stim = val & 0x007F;
441
442 switch (port) { /* use port to decode possible types */
443
444 case 0: /* MIDI-1 - Keys */
445 case 1: /* MIDI-2 - Keys */
446
447 sprintf(buf, "%s %03u %u %02u",
448 (val & 0x8000) ? "Rel" : "Key",
449 1 + stim, 1 + port, 1 + chan);
450
451 break;
452/*
453
454*/
455
456 case 2: /* Local Keys */
457
458 switch (chan) { /* use channel to further decode */
459
460 case 0: /* Keys - Local Keyboard */
461
462 sprintf(buf, "%s %03u L ",
463 (val & 0x8000) ? "Rel" : "Key",
464 1 + stim);
465
466 break;
467
468 case 2: /* Triggers */
469
470 sprintf(buf, "Trig %02u ", 1 + stim);
471 break;
472
473 case 3: /* Pulses */
474
475 sprintf(buf, "Pulse %u ", 1 + stim);
476 break;
477
478 default: /* spurious type -- shouldn't happen */
479
480 sprintf(buf, "%s?? %03u L %02u",
481 (val & 0x8000) ? "r" : "c",
482 1 + stim, 1 + chan);
483 break;
484
485 }
486
487 break;
488
489 default: /* spurious port -- should never happen */
490
491 sprintf(buf, "??? %03u %u %02u", 1 + stim, 1 + port, 1 + chan);
492 break;
493 }
494}
495
496/*
497
498*/
499
500/*
501 =============================================================================
502 dfpdat() -- convert FPU datum for display
503 =============================================================================
504*/
505
506char *dfpdat(struct patch *pp)
507{
508 static char buf[32];
509 unsigned short sgn, vp1, vp2;
510 short val;
511
512 val = pp->padat2;
513
514 switch (pp->padat1) {
515
516 case PSA_SRC: /* source */
517
518 strcpy(buf, smdata[val]);
519 break;
520
521 case PSA_MLT: /* multiplier */
522
523 fr2dec(val, ebuf);
524
525 buf[0] = ebuf[3];
526 buf[1] = ebuf[0];
527 buf[2] = '.';
528 buf[3] = ebuf[1];
529 buf[4] = ebuf[2];
530 buf[5] = '\0';
531 break;
532/*
533
534*/
535 case PSA_VAL: /* value */
536
537 val >>= 5;
538
539 if (val < 0) {
540
541 val = -val;
542 sgn = '-';
543
544 } else {
545
546 sgn = '+';
547 }
548
549 vp1 = val / 100;
550 vp2 = val - (vp1 * 100);
551
552 if (vp1 > 9) {
553
554 vp1 = 0;
555
556 if (sgn EQ '+')
557 sgn = '\240';
558 else
559 sgn = '\241';
560 }
561
562 sprintf(buf, "%c%u.%02u", sgn, vp1, vp2);
563 break;
564/*
565
566*/
567 case PSA_TIM: /* time */
568
569 vp1 = fromfpu(val);
570
571 sprintf(buf, "%5u", vp1);
572 break;
573
574 case PSA_FNC: /* function / control */
575
576 if ((PE_SPEC & pp->paspec) EQ PA_AUX)
577 sprintf(buf, "%s", (val & 0x0001) ? "On " : "Off ");
578 else
579 sprintf(buf, "%s", (val & 0x0001) ? "Start" : "Stop ");
580
581 break;
582
583 default:
584
585 sprintf(buf, "$%04.4X", val);
586 break;
587 }
588
589 return(buf);
590}
591
592/*
593
594*/
595
596/*
597 =============================================================================
598 pafpu1() -- convert patch for display -- aaaaa ssss tn ddddd
599
600 Level, Filtr, Fil Q, Loctn, Dynmc
601 =============================================================================
602*/
603
604void pafpu1(char *bf, char *ad, unsigned short gt, unsigned short gn, struct patch *pp)
605{
606 sprintf(bf, "%s %s %c%c %s", ad, stdata[pp->padat1], gt, gn, dfpdat(pp));
607}
608
609/*
610 =============================================================================
611 pafpu2() -- convert patch for display -- aaa n ssss tn ddddd
612
613 Index, Freq
614 =============================================================================
615*/
616
617void pafpu2(char *bf, char *ad, unsigned short os, unsigned short gt, unsigned short gn, struct patch *pp)
618{
619 sprintf(bf, "%s %d %s %c%c %s", ad, os, stdata[pp->padat1], gt, gn, dfpdat(pp));
620}
621
622/*
623 =============================================================================
624 pafpu3() -- convert patch for display -- aaaaa ssss ddddd
625
626 Aux, Rate, Inten, Depth, Vlt
627 =============================================================================
628*/
629
630void pafpu3(char *bf, char *ad, struct patch *pp)
631{
632 sprintf(bf, "%s %s %s", ad, stdata[pp->padat1], dfpdat(pp));
633}
634
635/*
636
637*/
638
639/*
640 =============================================================================
641 dspdest() -- convert patch destination and datum for display
642 =============================================================================
643*/
644
645void dspdest(char *buf, struct patch *pp)
646{
647 unsigned short chan, osc, port, stim, vg, vgt, vgn, vp1, vp2, sgn;
648 short val;
649 char buf2[16], *rtype;
650
651 port = (pp->pasuba >> 11) & 0x0003; /* for trg types */
652 chan = (pp->pasuba >> 7) & 0x000F;
653 stim = pp->pasuba & 0x007F;
654
655 vg = (pp->pasuba >> 8) & 0x00FF; /* for vg types */
656 osc = (pp->pasuba & 0x00FF) + 1;
657
658 if (vg > 11) {
659
660 vgt = 'G';
661 vgn = vg - 11;
662
663 } else {
664
665 vgt = 'V';
666 vgn = vg + 1;
667 }
668
669 vgn = vgn + ((vgn > 9) ? '\242' : '0');
670
671/*
672
673*/
674 switch (PE_SPEC & pp->paspec) {
675
676 case PA_KEY: /* key action */
677
678 sprintf(buf, "K %03u %u %02u %s",
679 1 + stim, 1 + port, 1 + chan,
680 trdata[pp->padat2 & 0x0003]);
681
682 break;
683
684 case PA_TRG:
685
686 sprintf(buf, "Trigger %02u %s",
687 1 + stim,
688 ssdata[pp->padat2 & 0x0001]);
689
690 break;
691
692 case PA_PLS:
693
694 sprintf(buf, "Pulse %u %s",
695 1 + stim,
696 trdata[pp->padat2 & 0x0003]);
697
698 break;
699/*
700
701*/
702 case PA_LED:
703
704 if (pp->pasuba & 0x0001) {
705
706 sprintf(buf, "LED %c %c%c%c%c",
707 'A' + pp->pasuba,
708 '0' + ((pp->padat1 >> 14) & 0x0003),
709 '0' + ((pp->padat1 >> 12) & 0x0003),
710 '0' + ((pp->padat1 >> 10) & 0x0003),
711 '0' + ((pp->padat1 >> 8) & 0x0003));
712
713 } else {
714
715 sprintf(buf, "LED %c %c%c%c",
716 'A' + pp->pasuba,
717 '0' + ((pp->padat1 >> 14) & 0x0003),
718 '0' + ((pp->padat1 >> 12) & 0x0003),
719 '0' + ((pp->padat1 >> 10) & 0x0003));
720 }
721
722 break;
723
724 case PA_SLIN:
725
726 sprintf(buf, "Seq %02u Lin %03u",
727 1 + pp->pasuba,
728 pp->padat1);
729
730 break;
731
732 case PA_SCTL:
733
734 sprintf(buf, "Seq %02u Ctl %s",
735 1 + pp->pasuba,
736 ssdata[pp->padat2 & 0x0001]);
737
738 break;
739
740 case PA_TUNE:
741
742 sprintf(buf, "Tune Table %u",
743 pp->padat1);
744
745 break;
746/*
747
748*/
749 case PA_RSET:
750
751 rtype = "Set";
752 goto doregs;
753
754 case PA_RADD:
755
756 rtype = "Add";
757
758doregs:
759
760 if (pp->padat1 & 0x0001) {
761
762 sprintf(buf, "Reg %02u %s R%02u",
763 1 + pp->pasuba, rtype,
764 1 + pp->padat2);
765
766 } else {
767
768 if ((val = pp->padat2) < 0) {
769
770 sgn = '-';
771 val = - val;
772
773 } else {
774
775 sgn = '+';
776 }
777
778 sprintf(buf, "Reg %02u %s %c%02u",
779 1 + pp->pasuba, rtype,
780 sgn, val);
781 }
782
783 break;
784
785 case PA_INST:
786
787 sprintf(buf, "Instrument %c%c %02u",
788 vgt, vgn, pp->padat1);
789
790 break;
791/*
792
793*/
794 case PA_OSC:
795
796 val = pp->padat2 >> 1;
797
798 switch (pp->padat1) {
799
800 case PSO_INT: /* interval */
801
802 if (val < 0) {
803
804 sgn = '-';
805 val = -val;
806
807 } else {
808
809 sgn = '+';
810 }
811
812 sprintf(buf, "Osc %u Int %c%c %c%04u",
813 osc, vgt, vgn, sgn, val);
814
815 break;
816
817 case PSO_RAT: /* ratio */
818
819 int2rat(val);
820
821 sprintf(buf, "Osc %u Rat %c%c %s",
822 osc, vgt, vgn, ebuf);
823
824 break;
825
826 case PSO_FRQ: /* frequency */
827
828 vp1 = val / 10;
829 vp2 = val - (vp1 * 10);
830
831 sprintf(buf, "Osc %u Frq %c%c %02u.%u",
832 osc, vgt, vgn, vp1, vp2);
833
834 break;
835/*
836
837*/
838 case PSO_PCH: /* pitch */
839
840 cnvc2p(ebuf, val);
841
842 sprintf(buf, "Osc %u Pch %c%c %s",
843 osc, vgt, vgn, ebuf);
844
845 break;
846
847 default:
848
849 break;
850 }
851
852 break;
853/*
854
855*/
856 case PA_WAVA:
857
858 sgn = 'A';
859 goto dowaves;
860
861 case PA_WAVB:
862
863 sgn = 'B';
864
865dowaves:
866
867 sprintf(buf, "Waveshape%c %c%c %02u",
868 sgn, vgt, vgn, pp->padat1);
869
870 break;
871
872 case PA_CNFG:
873
874 sprintf(buf, "Configure %c%c %02u",
875 vgt, vgn, pp->padat1);
876
877 break;
878/*
879
880*/
881 case PA_LEVL:
882
883 pafpu1(buf, "Level", vgt, vgn, pp);
884 break;
885
886 case PA_INDX:
887
888 pafpu2(buf, "Ind", osc, vgt, vgn, pp);
889 break;
890
891 case PA_FREQ:
892
893 pafpu2(buf, "Frq", osc, vgt, vgn, pp);
894 break;
895
896 case PA_FILT:
897
898 pafpu1(buf, "Filtr", vgt, vgn, pp);
899 break;
900
901 case PA_FILQ:
902
903 pafpu1(buf, "Fil Q", vgt, vgn, pp);
904 break;
905
906 case PA_LOCN:
907
908 pafpu1(buf, "Loctn", vgt, vgn, pp);
909 break;
910
911 case PA_DYNM:
912
913 pafpu1(buf, "Dynmc", vgt, vgn, pp);
914 break;
915/*
916
917*/
918 case PA_AUX:
919
920 pafpu3(buf, "Aux ", pp);
921 break;
922
923 case PA_RATE:
924
925 pafpu3(buf, "Rate ", pp);
926 break;
927
928 case PA_INTN:
929
930 pafpu3(buf, "Inten", pp);
931 break;
932
933 case PA_DPTH:
934
935 pafpu3(buf, "Depth", pp);
936 break;
937
938 case PA_VOUT:
939
940 sprintf(buf2, "Vlt %u", pp->pasuba);
941 pafpu3(buf, buf2, pp);
942 break;
943
944 default:
945
946 break;
947 }
948}
949
950/*
951
952*/
953
954/*
955 =============================================================================
956 ptfield() -- setup field routines for the patch editor
957 =============================================================================
958*/
959
960void ptfield(void)
961{
962 curset(&pt_flds);
963
964#if USEVECTR
965 if (usevect) {
966
967 cx_key = cxkstd;
968 cy_key = cykstd;
969 }
970#endif
971
972}
Note: See TracBrowser for help on using the repository browser.