home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 242.lha / GenericLIBrarian / source / dw8000.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-04-07  |  18.8 KB  |  645 lines

  1. /*
  2.  * GLIB - a Generic LIBrarian and editor for synths
  3.  *
  4.  * DW8000 Librarian
  5.  *
  6.  * Code completed 8/24/87 --  Steven A. Falco  moss!saf
  7.  */
  8.  
  9. #define OVERLAY2
  10.  
  11. #include "glib.h"
  12.  
  13. #define DW8VSIZE 51
  14.  
  15. char *visnum(), *visd8wave(), *visd8oct(), *visd8trk();
  16. char *visd8ival(), *visd8detu(), *visd8asel(), *dw8vnum(), *visd8amod();
  17. char *visd8mgw(), *visd8mode(), *visd8pol(),*visd8sem(), *visonoff();
  18.  
  19. /* This array contains arbitrary screen labels */
  20. struct labelinfo Ldw800[] = {
  21.  2,0,"+----------------------------------+----------------+------------------+------+",
  22.  3,0,"|         Osc 1     Osc 2     Noise|          ModGen|          AutoBend| Mode |",
  23.  4,0,"|Octave",4,35,"|Waveform",4,52,"|Select",4,71,"|      |",
  24.  5,0,"|Waveform",5,35,"|Frequency",5,52,"|Mode",5,71,"|      |",
  25.  6,0,"|Level",6,35,"|Delay",6,52,"|Time",6,71,"|      |",
  26.  7,0,"|Interval",7,35,"|Osc",7,52,"|Intensity",7,71,"|      |",
  27.  8,0,"|Detune",8,35,"|VCF",8,52,"|",8,71,"|      |",
  28.  9,0,"+------------------+---------------+----------------+------------------+------+",
  29. 10,0,"|",10,11,"VCF  VCA|",10,30,"Delay|    Joystick    |     Portamento   |Key   |",
  30. 11,0,"|Attack",11,19,"|Time",11,35,"|Osc",11,52,"|Time",11,71,"|Param |",
  31. 12,0,"|Decay",12,19,"|Factor",12,35,"|VCF",12,52,"|",12,71,"|      |",
  32. 13,0,"|Break Pt.",13,19,"|Feedback",13,35,"+----------------+------------------+------+",
  33. 14,0,"|Slope",14,19,"|Frequency      |",
  34. 15,0,"|Sustain",15,19,"|Intensity      | +-------------------------+--------------+",
  35. 16,0,"|Release",16,19,"|Eff.Level      | |Space = Play Note",16,63,"| Auto-Note    |",
  36. 17,0,"|V.Sensitv",17,19,"+---------------+ |",17,63,"|",17,78,"|",
  37. 18,0,"|Cutoff",18,19,"|       AftTouch| |h = left   q = quit      |Pitch",18,78,"|",
  38. 19,0,"|Resonance",19,19,"|Osc.MG",19,35,"| |j = down   N = Set Name  |Duration      |",
  39. 20,0,"|Tracking",20,19,"|VCF",20,35,"| |k = up     J = Decrement |Volume",20,78,"|",
  40. 21,0,"|Polarity",21,19,"|VCA",21,35,"| |l = right  K = Increment |Channel       |",
  41. 22,0,"|EG.Intens",22,19,"|",22,35,"| |",22,63,"|",22,78,"|",
  42. 23,0,"+------------------+---------------+ +-------------------------+--------------+",
  43. -1,-1,NULL
  44. };
  45.  
  46. /* This array defines all the editable parameters. */
  47. struct paraminfo Pdw800[] = {
  48. "autopitch",NULL,       -1,-1, 18, 73, visnum,          0, 127, 60, 0,
  49. "autovol",      NULL,   -1,-1, 19, 73, visnum,          0, 127, 63, 0,
  50. "autodur",      NULL,   -1,-1, 20, 73, visnum,          1,  20,  5, 0,
  51. "autochan",     NULL,   -1,-1, 21, 73, visnum,          1,  16,  1, 0,
  52.  
  53. "o1oct",        NULL,   -1,-1,  4, 10, visd8oct,        0,   3, 0, 0,
  54. "o1wave",       NULL,   -1,-1,  5, 10, visd8wave,       0,  15, 0, 0,
  55. "o1lev",        NULL,   -1,-1,  6, 10, visnum,          0,  31, 0, 0,
  56. "o2oct",        NULL,   -1,-1,  4, 20, visd8oct,        0,   3, 0, 0,
  57. "o2wave",       NULL,   -1,-1,  5, 20, visd8wave,       0,  15, 0, 0,
  58. "o2lev",        NULL,   -1,-1,  6, 20, visnum,          0,  31, 0, 0,
  59. "o2ival",       NULL,   -1,-1,  7, 20, visd8ival,       0,   7, 0, 0,
  60. "o2detu",       NULL,   -1,-1,  8, 20, visd8detu,       0,   7, 0, 0,
  61. "noise",        NULL,   -1,-1,  6, 30, visnum,          0,  31, 0, 0,
  62.  
  63. "mgwave",       NULL,   -1,-1,  4, 46, visd8mgw,        0,   3, 0, 0,
  64. "mgfrew",       NULL,   -1,-1,  5, 46, visnum,          0,  31, 0, 0,
  65. "mgdela",       NULL,   -1,-1,  6, 46, visnum,          0,  31, 0, 0,
  66. "mgosc",        NULL,   -1,-1,  7, 46, visnum,          0,  31, 0, 0,
  67. "mgvcf",        NULL,   -1,-1,  8, 46, visnum,          0,  31, 0, 0,
  68.  
  69. "abndsel",      NULL,   -1,-1,  4, 63, visd8asel,       0,   3, 0, 0,
  70. "abndmod",      NULL,   -1,-1,  5, 63, visd8amod,       0,   1, 0, 0,
  71. "abndtim",      NULL,   -1,-1,  6, 63, visnum,          0,  31, 0, 0,
  72. "abndins",      NULL,   -1,-1,  7, 63, visnum,          0,  31, 0, 0,
  73.  
  74. "mode",         NULL,   -1,-1,  4, 72, visd8mode,       0,   3, 0, 0,
  75.  
  76. "fatt",         NULL,   -1,-1, 11, 11, visnum,          0,  31, 0, 0,
  77. "fdec",         NULL,   -1,-1, 12, 11, visnum,          0,  31, 0, 0,
  78. "fbrk",         NULL,   -1,-1, 13, 11, visnum,          0,  31, 0, 0,
  79. "fslp",         NULL,   -1,-1, 14, 11, visnum,          0,  31, 0, 0,
  80. "fsus",         NULL,   -1,-1, 15, 11, visnum,          0,  31, 0, 0,
  81. "frel",         NULL,   -1,-1, 16, 11, visnum,          0,  31, 0, 0,
  82. "fsens",        NULL,   -1,-1, 17, 11, visnum,          0,   7, 0, 0,
  83. "fcut",         NULL,   -1,-1, 18, 11, visnum,          0,  63, 0, 0,
  84. "fres",         NULL,   -1,-1, 19, 11, visnum,          0,  31, 0, 0,
  85. "ftrk",         NULL,   -1,-1, 20, 11, visd8trk,        0,   3, 0, 0,
  86. "fpol",         NULL,   -1,-1, 21, 11, visd8pol,        0,   1, 0, 0,
  87. "fegi",         NULL,   -1,-1, 22, 11, visnum,          0,  31, 0, 0,
  88. "aatt",         NULL,   -1,-1, 11, 16, visnum,          0,  31, 0, 0,
  89. "adec",         NULL,   -1,-1, 12, 16, visnum,          0,  31, 0, 0,
  90. "abrk",         NULL,   -1,-1, 13, 16, visnum,          0,  31, 0, 0,
  91. "aslp",         NULL,   -1,-1, 14, 16, visnum,          0,  31, 0, 0,
  92. "asus",         NULL,   -1,-1, 15, 16, visnum,          0,  31, 0, 0,
  93. "arel",         NULL,   -1,-1, 16, 16, visnum,          0,  31, 0, 0,
  94. "asens",        NULL,   -1,-1, 17, 16, visnum,          0,   7, 0, 0,
  95.  
  96. "dtim",         NULL,   -1,-1, 11, 30, visnum,          0,   7, 0, 0,
  97. "dfact",        NULL,   -1,-1, 12, 30, visnum,          0,  15, 0, 0,
  98. "dfeed",        NULL,   -1,-1, 13, 30, visnum,          0,  15, 0, 0,
  99. "dfreq",        NULL,   -1,-1, 14, 30, visnum,          0,  31, 0, 0,
  100. "dintns",       NULL,   -1,-1, 15, 30, visnum,          0,  31, 0, 0,
  101. "deff",         NULL,   -1,-1, 16, 30, visnum,          0,  15, 0, 0,
  102.  
  103. "atosc",        NULL,   -1,-1, 19, 27, visnum,          0,   3, 0, 0,
  104. "atvcf",        NULL,   -1,-1, 20, 27, visnum,          0,   3, 0, 0,
  105. "atvca",        NULL,   -1,-1, 21, 27, visnum,          0,   3, 0, 0,
  106.  
  107. "joyosc",       NULL,   -1,-1, 11, 40, visd8sem,        0,  15, 0, 0,
  108. "joyvcf",       NULL,   -1,-1, 12, 40, visonoff,        0,   1, 0, 0,
  109.  
  110. "portam",       NULL,   -1,-1, 11, 58, visnum,          0,  31, 0, 0,
  111.  
  112. "vnumb",        NULL,   -1,-1, 12, 72, dw8vnum,         0,  63, 0, 0,
  113.  
  114. NULL,           NULL,   -1,-1, -1, -1, visnum,          0,   0, 0, 0
  115. };
  116.  
  117. /*
  118.  * dw8vnum
  119.  *
  120.  * Convert a voice number (0 to 63) to the string displayed in the
  121.  * librarian (ie. 11 to 88).
  122.  */
  123.  
  124. char *
  125. dw8vnum(n)
  126. {
  127.         static char v[3];
  128.  
  129.         if ( n < 0 || n > 63 )
  130.                 return("??");
  131.  
  132.         v[0] = n/8 + '1';
  133.         v[1] = n%8 + '1';
  134.         v[2] = '\0';
  135.         return(v);
  136. }
  137.  
  138. /*
  139.  * dw8numv
  140.  *
  141.  * Convert a display-style voice number (11 to 88) to internal
  142.  * format (0 - 63).
  143.  */
  144.  
  145. dw8numv(n)
  146. int n;
  147. {
  148.         int ld, rd;
  149.         
  150.         /* crack out the digits as octal codes */
  151.         ld = (n / 10) - 1; /* left digit */
  152.         rd = (n % 10) - 1; /* right digit */
  153.         
  154.         if(ld < 0 || ld > 7 || rd < 0 || rd > 7) {
  155.                 return(-1);
  156.         } else {
  157.                 return(ld * 8 + rd); /* combine as octal */
  158.         }
  159. }
  160.  
  161. /*
  162.  * dw8din
  163.  *
  164.  * Take library bank 'data' and stuff values in the P array, by using
  165.  * the setval function.
  166.  */
  167.  
  168. dw8din(data)
  169. char *data;
  170. {
  171.         /* The first 20 bytes are reserved (arbitrarily) for the voice name */
  172.         setval("o1oct",data[20]);
  173.         setval("o1wave",data[21]);
  174.         setval("o1lev",data[22]);
  175.         setval("abndsel",data[23]);
  176.         setval("abndmod",data[24]);
  177.         setval("abndtim",data[25]);
  178.         setval("abndins",data[26]);     
  179.         setval("o2oct",data[27]);
  180.         setval("o2wave",data[28]);
  181.         setval("o2lev",data[29]);
  182.         setval("o2ival",data[30]);
  183.         setval("o2detu",data[31]);
  184.         setval("noise",data[32]);
  185.         setval("mode",data[33]);
  186.         setval("vnumb",data[34]);
  187.         setval("fcut",data[35]);
  188.         setval("fres",data[36]);
  189.         setval("ftrk",data[37]);
  190.         setval("fpol",data[38]);
  191.         setval("fegi",data[39]);
  192.         setval("fatt",data[40]);
  193.         setval("fdec",data[41]);
  194.         setval("fbrk",data[42]);
  195.         setval("fslp",data[43]);
  196.         setval("fsus",data[44]);
  197.         setval("frel",data[45]);
  198.         setval("fsens",data[46]);
  199.         setval("aatt",data[47]);
  200.         setval("adec",data[48]);
  201.         setval("abrk",data[49]);
  202.         setval("aslp",data[50]);
  203.         setval("asus",data[51]);
  204.         setval("arel",data[52]);
  205.         setval("asens",data[53]);
  206.         setval("mgwave",data[54]);
  207.         setval("mgfrew",data[55]);
  208.         setval("mgdela",data[56]);
  209.         setval("mgosc",data[57]);
  210.         setval("mgvcf",data[58]);
  211.         setval("joyosc",data[59]);
  212.         setval("joyvcf",data[60]);
  213.         setval("dtim",data[61]);
  214.         setval("dfact",data[62]);
  215.         setval("dfeed",data[63]);
  216.         setval("dfreq",data[64]);
  217.         setval("dintns",data[65]);
  218.         setval("deff",data[66]);
  219.         setval("portam",data[67]);
  220.         setval("atosc",data[68]);
  221.         setval("atvcf",data[69]);
  222.         setval("atvca",data[70]);
  223.  
  224.         /* We set the 'auto-note' channel upon entry */
  225.         setval("autochan",Channel);
  226. }
  227.  
  228. /*
  229.  * dw8dout
  230.  *
  231.  * Take (possibly changed) parameters values out of the P array and
  232.  * put them back into the library bank 'data'.
  233.  */
  234.  
  235. dw8dout(data)
  236. char *data;
  237. {
  238.         data[20] = getval("o1oct");
  239.         data[21] = getval("o1wave");
  240.         data[22] = getval("o1lev");
  241.         data[23] = getval("abndsel");
  242.         data[24] = getval("abndmod");
  243.         data[25] = getval("abndtim");
  244.         data[26] = getval("abndins");
  245.         data[27] = getval("o2oct");
  246.         data[28] = getval("o2wave");
  247.         data[29] = getval("o2lev");
  248.         data[30] = getval("o2ival");
  249.         data[31] = getval("o2detu");
  250.         data[32] = getval("noise");
  251.         data[33] = getval("mode");
  252.         data[34] = getval("vnumb");
  253.         data[35] = getval("fcut");
  254.         data[36] = getval("fres");
  255.         data[37] = getval("ftrk");
  256.         data[38] = getval("fpol");
  257.         data[39] = getval("fegi");
  258.         data[40] = getval("fatt");
  259.         data[41] = getval("fdec");
  260.         data[42] = getval("fbrk");
  261.         data[43] = getval("fslp");
  262.         data[44] = getval("fsus");
  263.         data[45] = getval("frel");
  264.         data[46] = getval("fsens");
  265.         data[47] = getval("aatt");
  266.         data[48] = getval("adec");
  267.         data[49] = getval("abrk");
  268.         data[50] = getval("aslp");
  269.         data[51] = getval("asus");
  270.         data[52] = getval("arel");
  271.         data[53] = getval("asens");
  272.         data[54] = getval("mgwave");
  273.         data[55] = getval("mgfrew");
  274.         data[56] = getval("mgdela");
  275.         data[57] = getval("mgosc");
  276.         data[58] = getval("mgvcf");
  277.         data[59] = getval("joyosc");
  278.         data[60] = getval("joyvcf");
  279.         data[61] = getval("dtim");
  280.         data[62] = getval("dfact");
  281.         data[63] = getval("dfeed");
  282.         data[64] = getval("dfreq");
  283.         data[65] = getval("dintns");
  284.         data[66] = getval("deff");
  285.         data[67] = getval("portam");
  286.         data[68] = getval("atosc");
  287.         data[69] = getval("atvcf");
  288.         data[70] = getval("atvca");
  289.  
  290.         /* If the autochan parameter has changed, update Channel */
  291.         Channel = getval("autochan");
  292. }
  293.  
  294. /*
  295.  * dw8sedit
  296.  *
  297.  * Send a single voice to the edit buffer of the DW8000.  This will be whatever
  298.  * voice is currently selected.
  299.  */
  300.  
  301. dw8sedit(data)
  302. char *data;
  303. {
  304.         int n;
  305.         
  306.         sendmidi(0xf0);
  307.         sendmidi(0x42);
  308.         sendmidi(0x30 | (Channel - 1));
  309.         sendmidi(0x03);
  310.         sendmidi(0x40);
  311.         for(n = 0; n < DW8VSIZE; n++) {
  312.                 sendmidi(data[n + 20] & 0x7f);
  313.         }
  314.         sendmidi(EOX);
  315. }
  316.  
  317. /*
  318.  * dw8nof
  319.  *
  320.  * Return a pointer to the voice name buried in library bank data.
  321.  */
  322. char *
  323. dw8nof(data)
  324. char *data;
  325. {
  326.         static char currbuff[17];
  327.         char *p;
  328.         int m;
  329.  
  330.         p = currbuff;
  331.         for ( m=0; m<16; m++ )
  332.                 *p++ = data[m];
  333.         *p = '\0';
  334.         return(currbuff);
  335. }
  336.  
  337. /*
  338.  * dw8snof
  339.  *
  340.  * Set the voice name buried in data to name.
  341.  */
  342. dw8snof(data,name)
  343. char *data;
  344. char *name;
  345. {
  346.         char *p;
  347.         int m;
  348.  
  349.         for ( p=name,m=0; *p!='\0' && m<16; p++,m++ )
  350.                 data[m] = *p;
  351.         for ( ; m<16; m++ )
  352.                 data[m] = ' ';
  353. }
  354.  
  355. /* dw8sone - send a single voice to the DW8000 */
  356. dw8sone(iv, data)
  357. int iv;
  358. char *data;
  359. {
  360.         int c, b2, ret = 1;
  361.         long begin, toolong;
  362.  
  363.         /* select voice n */
  364.         sendmidi(0xc0 | (Channel - 1));
  365.         sendmidi(iv);
  366.         
  367.         /* send data */
  368.         dw8sedit(data);
  369.         
  370.         /* request write */
  371.         sendmidi(0xf0);
  372.         sendmidi(0x42);
  373.         sendmidi(0x30 | (Channel - 1));
  374.         sendmidi(0x03);
  375.         sendmidi(0x11); /* write request */
  376.         sendmidi(iv);   /* the now-current voice */
  377.         sendmidi(EOX);
  378.         
  379.         /* read the ack/nack - set up for timeout */
  380.         begin = milliclock();
  381.         toolong = begin + 1000 * TIMEOUT;
  382.  
  383.         /* wait for the 0x03 byte (dw8000 ID byte) */
  384.         while ( milliclock() < toolong ) {
  385.                 if ( STATMIDI && (c=(getmidi() & 0xff)) == 0x03 )
  386.                         break;
  387.         }
  388.         if ( c != 0x03 ) {
  389.                 Reason = "Timeout waiting for 0x03";
  390.                 goto getout;
  391.         }
  392.         
  393.         /* next byte is the result code */
  394.         while((b2 = getmidi() & 0xff) == 0xfe)
  395.                 ; /* burn active sensing */
  396.         if(b2 != 0x21) {
  397.                 Reason = "Write failed - check protect switch!";
  398.                 goto getout;
  399.         }
  400.  
  401.         while((b2 = getmidi() & 0xff) == 0xfe)
  402.                 ;       /* want EOX - burn active sensing */
  403.         if ( b2 != EOX )
  404.                 Reason = "EOX not received";
  405.         else {
  406.                 Reason = "";
  407.                 ret = 0;        /* all's well */
  408.         }
  409.         
  410. getout:
  411.         return(ret);
  412. }
  413.  
  414. /* dw8gbulk - Request and read a bulk dump from the DW8000 */
  415. dw8gbulk(data)
  416. char *data;
  417. {
  418.         int c, n, v, b2, ret = 1;
  419.         long begin, toolong;
  420.  
  421.         flushmidi();
  422.  
  423.         for(v = 0; v < Nvoices; v++) {
  424.                 /* select voice */
  425.                 sendmidi(0xc0 | (Channel - 1));
  426.                 sendmidi(v);
  427.                 
  428.                 /* request the voice */
  429.                 sendmidi(0xf0);
  430.                 sendmidi(0x42);
  431.                 sendmidi(0x30 | (Channel-1));   /* Channel # */
  432.                 sendmidi(0x03);
  433.                 sendmidi(0x10); 
  434.                 sendmidi(EOX);
  435.         
  436.                 /* set up for timeout */
  437.                 begin = milliclock();
  438.                 toolong = begin + 1000 * TIMEOUT;
  439.         
  440.                 /* wait for the x40 byte starting the dump */
  441.                 while ( milliclock() < toolong ) {
  442.                         if ( STATMIDI && (c=(getmidi() & 0xff)) == 0x40 )
  443.                                 break;
  444.                 }
  445.                 if ( c != 0x40 ) {
  446.                         Reason = "Timeout waiting for 0x40";
  447.                         goto getout;
  448.                 }
  449.                 
  450.                 /* now read 51 bytes of voice data */
  451.                 for(n = 0; n < DW8VSIZE; n++) {
  452.                         /* twiddle your thumbs, but not forever */
  453.                         while ( ! STATMIDI ) {
  454.                                 if ( milliclock() > toolong )
  455.                                         goto timeout;   /* the end of an era */
  456.                         }
  457.                         while((b2 = getmidi() & 0xff) == 0xfe)
  458.                                 ; /* burn active sensing */
  459.                         VOICEBYTE(data,v,n + 20) = b2;  
  460.                 }
  461.  
  462.         timeout:
  463.                 if ( n != DW8VSIZE ) {
  464.                         Reason = "Timeout while reading!";
  465.                         goto getout;
  466.                 }
  467.                 while((b2 = getmidi() & 0xff) == 0xfe)
  468.                         ;       /* want EOX - burn active sensing */
  469.                 if ( b2 != EOX )
  470.                         Reason = "EOX not received";
  471.                 else {
  472.                         Reason = "";
  473.                         ret = 0;        /* all's well */
  474.                 }
  475.         } /* go back for another voice */
  476.         
  477. getout:
  478.         return(ret);
  479. }
  480.  
  481. /*
  482.  * Below are functions used for display of parameter values
  483.  */
  484.  
  485. char *
  486. visd8wave(v)
  487. {
  488.         switch (v) {
  489.         case 0: return("ramp");
  490.         case 1: return("square");
  491.         case 2: return("ac. piano");
  492.         case 3: return("el. piano");
  493.         case 4: return("hd. piano");
  494.         case 5: return("clavinet");
  495.         case 6: return("organ");
  496.         case 7: return("brass");
  497.         case 8: return("sax");
  498.         case 9: return("violin");
  499.         case 10: return("a. guitar");
  500.         case 11: return("d. guitar");
  501.         case 12: return("el. bass");
  502.         case 13: return("dg. bass");
  503.         case 14: return("bell");
  504.         case 15: return("sine");
  505.         }
  506.         return("*");
  507. }
  508.  
  509. char *
  510. visd8oct(v)
  511. {
  512.         switch(v) {
  513.         case 0: return("16");
  514.         case 1: return("8");
  515.         case 2: return("4");
  516.         case 3: return("*");
  517.         }
  518.         return("*");
  519. }
  520.  
  521. char *
  522. visd8ival(v)
  523. {       
  524.         switch(v) {
  525.         case 0: return("unison");
  526.         case 1: return("min 3rd");
  527.         case 2: return("maj 3rd");
  528.         case 3: return("4th");
  529.         case 4: return("5th");
  530.         case 5: case 6: case 7: return("*");
  531.         }
  532.         return("*");
  533. }
  534.  
  535. char *
  536. visd8detu(v)
  537. {
  538.         switch(v) {
  539.         case 0: return("in tune");
  540.         case 1: return("1 cent");
  541.         case 2: return("2 cents");
  542.         case 3: return("3 cents");
  543.         case 4: return("4 cents");
  544.         case 5: return("5 cents");
  545.         case 6: return("6 cents");
  546.         case 7: return("*");
  547.         }
  548.         return("*");
  549. }
  550.  
  551. char *Semicode[] = {
  552.         "none",
  553.         "1 semitone",
  554.         "2 semitones",
  555.         "3 semitones",
  556.         "4 semitones",
  557.         "5 semitones",
  558.         "6 semitones",
  559.         "7 semitones",
  560.         "8 semitones",
  561.         "9 semitones",
  562.         "10 semitones",
  563.         "11 semitones",
  564.         "1 octave"
  565. };
  566.  
  567. char *
  568. visd8sem(v)
  569. {
  570.         if(v >= 0 && v <= 12) {
  571.                 return(Semicode[v]);
  572.         }
  573.         return("*");
  574. }
  575.  
  576. char *
  577. visd8asel(v)
  578. {
  579.         switch(v) {
  580.         case 0: return("off");
  581.         case 1: return("Osc 1");
  582.         case 2: return("Osc 2");
  583.         case 3: return("Osc 1+2");
  584.         }
  585.         return("*");
  586. }
  587.  
  588. char *
  589. visd8amod(v)
  590. {
  591.         switch(v) {
  592.         case 0: return("Up");
  593.         case 1: return("Down");
  594.         }
  595.         return("*");
  596. }
  597.  
  598. char *
  599. visd8pol(v)
  600. {
  601.         switch(v) {
  602.         case 0: return("/-\\");
  603.         case 1: return("\\_/");
  604.         }
  605.         return("*");
  606. }
  607.  
  608. char *
  609. visd8mode(v)
  610. {
  611.         switch(v) {
  612.         case 0: return("Poly 1");
  613.         case 1: return("Poly 2");
  614.         case 2: return("Uni 1");
  615.         case 3: return("Uni 2");
  616.         }
  617.         return("*");
  618. }
  619.  
  620. char *
  621. visd8mgw(v)
  622. {
  623.         switch(v) {
  624.         case 0: return("/\\");
  625.         case 1: return("|\\");
  626.         case 2: return("/|");
  627.         case 3: return("_|-|");
  628.         }
  629.         return("*");
  630. }
  631.  
  632. char *
  633. visd8trk(v)
  634. {
  635.         switch(v) {
  636.         case 0: return("0");
  637.         case 1: return("1/4");
  638.         case 2: return("1/2");
  639.         case 3: return("1");
  640.         }
  641.         return("*");
  642. }
  643.  
  644. /* end */
  645.