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