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

  1. /*
  2.  * GLIB - a Generic LIBrarian and editor for synths
  3.  *
  4.  * TX81Z routines for Performance parameters
  5.  */
  6.  
  7. #define OVERLAY1
  8.  
  9. #include "glib.h"
  10. #include <ctype.h>
  11.  
  12. char *visnum(), *vis1num(), *viseffect(), *visass(), *viskey();
  13. char *vischan(), *visnote(), *vistdetune(), *vistout(), *vislfo();
  14. char *visponoff(), *vispvoice(), *vispshift();
  15.  
  16. static char Pbuff[17];
  17.  
  18. #define PMEMSIZE 76
  19. #define PCEDSIZE 110
  20.  
  21. /* This array contains arbitrary screen labels */
  22. struct labelinfo Ltx81p[] = {
  23. 1,17," 1      2      3      4      5      6      7      8",
  24. 2,17,"---    ---    ---    ---    ---    ---    ---    ---",
  25. 3,2,"Voice",
  26. 7,2,"Max Notes",
  27. 8,2,"Receive Ch.",
  28. 9,2,"Limit Low",
  29. 10,2,"Limit High",
  30. 11,2,"Detune",
  31. 12,2,"Note Shift",
  32. 13,2,"Volume",
  33. 14,2,"Out Assign",
  34. 15,2,"LFO Select",
  35. 16,2,"Micro Tune",
  36. 21,0,"-------------------------+",
  37. 22,0,"Auto-Note:               |",
  38. 23,0,"                         |",
  39. -1,-1,NULL
  40. };
  41.  
  42. /* This array defines all the editable parameters. */
  43. struct paraminfo Ptx81p[] = {
  44. "autopitch",    "Pitch",22, 11, 22, 17, visnum, 0, 127, 60, 0,
  45. "autovol",      "Vol",  23, 0, 23, 4, visnum, 0, 127, 63, 0,
  46. "autodur",      "Dur",  23, 8, 23, 12, visnum, 1, 20, 5, 0,
  47. "autochan",     "Chan", 23, 16, 23, 21, visnum, 1, 16, 1, 0,
  48.  
  49. "op1max",       NULL, -1, -1, 7, 18, visnum, 0, 8, 0, 0,
  50. "op1voice",     NULL, -1, -1, 3, 17, vispvoice, 0, 159, 0, 0,
  51. "op1rec",       NULL, -1, -1, 8, 18, vischan, 0, 16, 0, 0,
  52. "op1liml",      NULL, -1, -1, 9, 18, visnote, 0, 127, 0, 0,
  53. "op1limh",      NULL, -1, -1, 10, 18, visnote, 0, 127, 0, 0,
  54. "op1detune",    NULL, -1, -1, 11, 18, vistdetune, 0, 14, 0, 0,
  55. "op1shift",     NULL, -1, -1, 12, 18, vispshift, 0, 48, 0, 0,
  56. "op1vol",       NULL, -1, -1, 13, 18, visnum, 0, 99, 0, 0,
  57. "op1out",       NULL, -1, -1, 14, 18, vistout, 0, 3, 0, 0,
  58. "op1lfo",       NULL, -1, -1, 15, 18, vislfo, 0, 3, 0, 0,
  59. "op1micro",     NULL, -1, -1, 16, 18, visponoff, 0, 1, 0, 0,
  60.  
  61. "op2max",       NULL, -1, -1, 7, 25, visnum, 0, 8, 0, 0,
  62. "op2voice",     NULL, -1, -1, 3, 24, vispvoice, 0, 159, 0, 0,
  63. "op2rec",       NULL, -1, -1, 8, 25, vischan, 0, 16, 0, 0,
  64. "op2liml",      NULL, -1, -1, 9, 25, visnote, 0, 127, 0, 0,
  65. "op2limh",      NULL, -1, -1, 10, 25, visnote, 0, 127, 0, 0,
  66. "op2detune",    NULL, -1, -1, 11, 25, vistdetune, 0, 14, 0, 0,
  67. "op2shift",     NULL, -1, -1, 12, 25, vispshift, 0, 48, 0, 0,
  68. "op2vol",       NULL, -1, -1, 13, 25, visnum, 0, 99, 0, 0,
  69. "op2out",       NULL, -1, -1, 14, 25, vistout, 0, 3, 0, 0,
  70. "op2lfo",       NULL, -1, -1, 15, 25, vislfo, 0, 3, 0, 0,
  71. "op2micro",     NULL, -1, -1, 16, 25, visponoff, 0, 1, 0, 0,
  72.  
  73. "op3max",       NULL, -1, -1, 7, 32, visnum, 0, 8, 0, 0,
  74. "op3voice",     NULL, -1, -1, 3, 31, vispvoice, 0, 159, 0, 0,
  75. "op3rec",       NULL, -1, -1, 8, 32, vischan, 0, 16, 0, 0,
  76. "op3liml",      NULL, -1, -1, 9, 32, visnote, 0, 127, 0, 0,
  77. "op3limh",      NULL, -1, -1, 10, 32, visnote, 0, 127, 0, 0,
  78. "op3detune",    NULL, -1, -1, 11, 32, vistdetune, 0, 14, 0, 0,
  79. "op3shift",     NULL, -1, -1, 12, 32, vispshift, 0, 48, 0, 0,
  80. "op3vol",       NULL, -1, -1, 13, 32, visnum, 0, 99, 0, 0,
  81. "op3out",       NULL, -1, -1, 14, 32, vistout, 0, 3, 0, 0,
  82. "op3lfo",       NULL, -1, -1, 15, 32, vislfo, 0, 3, 0, 0,
  83. "op3micro",     NULL, -1, -1, 16, 32, visponoff, 0, 1, 0, 0,
  84.  
  85. "op4max",       NULL, -1, -1, 7, 39, visnum, 0, 8, 0, 0,
  86. "op4voice",     NULL, -1, -1, 3, 38, vispvoice, 0, 159, 0, 0,
  87. "op4rec",       NULL, -1, -1, 8, 39, vischan, 0, 16, 0, 0,
  88. "op4liml",      NULL, -1, -1, 9, 39, visnote, 0, 127, 0, 0,
  89. "op4limh",      NULL, -1, -1, 10, 39, visnote, 0, 127, 0, 0,
  90. "op4detune",    NULL, -1, -1, 11, 39, vistdetune, 0, 14, 0, 0,
  91. "op4shift",     NULL, -1, -1, 12, 39, vispshift, 0, 48, 0, 0,
  92. "op4vol",       NULL, -1, -1, 13, 39, visnum, 0, 99, 0, 0,
  93. "op4out",       NULL, -1, -1, 14, 39, vistout, 0, 3, 0, 0,
  94. "op4lfo",       NULL, -1, -1, 15, 39, vislfo, 0, 3, 0, 0,
  95. "op4micro",     NULL, -1, -1, 16, 39, visponoff, 0, 1, 0, 0,
  96.  
  97. "op5max",       NULL, -1, -1, 7, 46, visnum, 0, 8, 0, 0,
  98. "op5voice",     NULL, -1, -1, 3, 45, vispvoice, 0, 159, 0, 0,
  99. "op5rec",       NULL, -1, -1, 8, 46, vischan, 0, 16, 0, 0,
  100. "op5liml",      NULL, -1, -1, 9, 46, visnote, 0, 127, 0, 0,
  101. "op5limh",      NULL, -1, -1, 10, 46, visnote, 0, 127, 0, 0,
  102. "op5detune",    NULL, -1, -1, 11, 46, vistdetune, 0, 14, 0, 0,
  103. "op5shift",     NULL, -1, -1, 12, 46, vispshift, 0, 48, 0, 0,
  104. "op5vol",       NULL, -1, -1, 13, 46, visnum, 0, 99, 0, 0,
  105. "op5out",       NULL, -1, -1, 14, 46, vistout, 0, 3, 0, 0,
  106. "op5lfo",       NULL, -1, -1, 15, 46, vislfo, 0, 3, 0, 0,
  107. "op5micro",     NULL, -1, -1, 16, 46, visponoff, 0, 1, 0, 0,
  108.  
  109. "op6max",       NULL, -1, -1, 7, 53, visnum, 0, 8, 0, 0,
  110. "op6voice",     NULL, -1, -1, 3, 52, vispvoice, 0, 159, 0, 0,
  111. "op6rec",       NULL, -1, -1, 8, 53, vischan, 0, 16, 0, 0,
  112. "op6liml",      NULL, -1, -1, 9, 53, visnote, 0, 127, 0, 0,
  113. "op6limh",      NULL, -1, -1, 10, 53, visnote, 0, 127, 0, 0,
  114. "op6detune",    NULL, -1, -1, 11, 53, vistdetune, 0, 14, 0, 0,
  115. "op6shift",     NULL, -1, -1, 12, 53, vispshift, 0, 48, 0, 0,
  116. "op6vol",       NULL, -1, -1, 13, 53, visnum, 0, 99, 0, 0,
  117. "op6out",       NULL, -1, -1, 14, 53, vistout, 0, 3, 0, 0,
  118. "op6lfo",       NULL, -1, -1, 15, 53, vislfo, 0, 3, 0, 0,
  119. "op6micro",     NULL, -1, -1, 16, 53, visponoff, 0, 1, 0, 0,
  120.  
  121. "op7max",       NULL, -1, -1, 7, 60, visnum, 0, 8, 0, 0,
  122. "op7voice",     NULL, -1, -1, 3, 59, vispvoice, 0, 159, 0, 0,
  123. "op7rec",       NULL, -1, -1, 8, 60, vischan, 0, 16, 0, 0,
  124. "op7liml",      NULL, -1, -1, 9, 60, visnote, 0, 127, 0, 0,
  125. "op7limh",      NULL, -1, -1, 10, 60, visnote, 0, 127, 0, 0,
  126. "op7detune",    NULL, -1, -1, 11, 60, vistdetune, 0, 14, 0, 0,
  127. "op7shift",     NULL, -1, -1, 12, 60, vispshift, 0, 48, 0, 0,
  128. "op7vol",       NULL, -1, -1, 13, 60, visnum, 0, 99, 0, 0,
  129. "op7out",       NULL, -1, -1, 14, 60, vistout, 0, 3, 0, 0,
  130. "op7lfo",       NULL, -1, -1, 15, 60, vislfo, 0, 3, 0, 0,
  131. "op7micro",     NULL, -1, -1, 16, 60, visponoff, 0, 1, 0, 0,
  132.  
  133. "op8max",       NULL, -1, -1, 7, 67, visnum, 0, 8, 0, 0,
  134. "op8voice",     NULL, -1, -1, 3, 66, vispvoice, 0, 159, 0, 0,
  135. "op8rec",       NULL, -1, -1, 8, 67, vischan, 0, 16, 0, 0,
  136. "op8liml",      NULL, -1, -1, 9, 67, visnote, 0, 127, 0, 0,
  137. "op8limh",      NULL, -1, -1, 10, 67, visnote, 0, 127, 0, 0,
  138. "op8detune",    NULL, -1, -1, 11, 67, vistdetune, 0, 14, 0, 0,
  139. "op8shift",     NULL, -1, -1, 12, 67, vispshift, 0, 48, 0, 0,
  140. "op8vol",       NULL, -1, -1, 13, 67, visnum, 0, 99, 0, 0,
  141. "op8out",       NULL, -1, -1, 14, 67, vistout, 0, 3, 0, 0,
  142. "op8lfo",       NULL, -1, -1, 15, 67, vislfo, 0, 3, 0, 0,
  143. "op8micro",     NULL, -1, -1, 16, 67, visponoff, 0, 1, 0, 0,
  144.  
  145. "microtune",    "Micro Tune Table", 19, 32, 19, 53, visnum, 0, 12, 0, 0,
  146. "microkey",     "Micro Tune Key", 20, 32, 20, 53, viskey, 0, 11, 0, 0,
  147. "assmode",      "Assign Mode", 21, 32, 21, 53, visass, 0, 1, 0, 0,
  148. "effect",       "Effect Select", 22, 32, 22, 53, viseffect, 0, 3, 0, 0,
  149. NULL,   NULL, -1, -1, -1, -1, visnum, 0, 0, 0, 0
  150. };
  151.  
  152. char *tx81voices[] = {
  153.         "GrandPiano", "Uprt piano", "Deep Grd", "HonkeyTonk", "Elec Grand",
  154.         "Fuzz Piano", "SkoolPiano", "Thump Pno", "LoTine81Z", "HiTine81Z",
  155.         "ElectroPno", "NewElectro", "DynomiteEP", "DynoWurlie", "Wood Piano",
  156.         "Reed Piano", "PercOrgan", "16 8 4 2 F", "PumpOrgan", "<6 Tease>",
  157.         "Farcheeza", "Small Pipe", "Big Church", "AnalogOrgn", "Thin Clav",
  158.         "EZ Clav", "Fuzz Clavi", "LiteHarpsi", "RichHarpsi", "Celeste",
  159.         "BriteCelst", "Squeezebox",
  160.  
  161.         "Trumpet81Z", "Full Brass", "Flugelhorn", "ChorusBras", "FrenchHorn",
  162.         "AtackBrass", "SpitBoneBC", "Horns BC", "MelloTenor", "RaspAlto",
  163.         "Flute", "Pan Floot", "Bassoon", "Oboe", "Clarinet",
  164.         "Harmonica", "DoubleBass", "BowCello", "BoxCello", "SoloViolin",
  165.         "HiString 1", "LowString", "Pizzicato", "Harp", "ReverbStrg",
  166.         "SynString", "Voices", "HarmoPad", "FanfarTpts", "HiString 2",
  167.         "PercFlute", "BreathOrgn",
  168.  
  169.         "NylonGuit", "Guitar #1", "TwelveStrg", "Funky Pick", "AllThatJaz",
  170.         "HeavyMetal", "Old Banjo", "Zither", "ElecBass 1", "SqncrBass",
  171.         "SynFunkBas", "ElecBass 2", "AnalogBass", "Jaco Bass", "LatelyBass",
  172.         "MonophBass", "StadiumSol", "TrumptSolo", "BCSexyPhon", "Lyrisyn",
  173.         "WarmSquare", "Sync Lead", "MellowSqar", "Jazz Flute", "HeavyLead",
  174.         "Java Jive", "Xylophone", "GreatVibes   ", "Sitar", "Bell Pad",
  175.         "PlasticHit", "DigiAnnie",
  176.  
  177.         "BaadBreath", "VocalNuts", "KrstlChoir", "Metalimba", "WaterGlass",
  178.         "BowedBell", ">>WOW<<", "Fuzzy Koto", "Spc Midiot", "Gurgle",
  179.         "Hole in 1", "Birds", "MalibuNite", "Helicopter", "Flight Sim",
  180.         "Brthbells", "Storm Wind", "Alarm Call", "Racing Car", "Whistling",
  181.         "Space Talk", "Space Vibe", "Timpani", "FM Hi-Hats", "Bass Drum",
  182.         "Tube Bells", "Noise Shot", "Snare 1", "Snare 2", "Hand Drum",
  183.         "Synballs", "Efem Toms"
  184. };
  185.  
  186. /*
  187.  * tx8pdin
  188.  *
  189.  * Take info from 'data' and stuff values in the P array, by using
  190.  * the setval (and setopval) functions.  The data is in PMEM format.
  191.  */
  192.  
  193. tx8pdin(data)
  194. char *data;
  195. {
  196.         int dop, n, msb;
  197.  
  198.         for ( n=1; n<=8; n++ ) {
  199.                 dop = (n-1)*8;
  200.                 setopval(n,"max",data[0+dop] & 017);
  201.                 msb = (data[0+dop]>>4)&01;
  202.                 setopval(n,"voice",128*msb + (data[1+dop]&0177));
  203.                 setopval(n,"rec",data[2+dop] & 037);
  204.                 setopval(n,"liml",data[3+dop] & 0177);
  205.                 setopval(n,"limh",data[4+dop] & 0177);
  206.                 setopval(n,"detune",data[5+dop] & 017);
  207.                 setopval(n,"shift",data[6+dop] & 077);
  208.                 setopval(n,"vol",data[7+dop] & 0177);
  209.                 setopval(n,"out",(data[0+dop]>>5) & 03);
  210.                 setopval(n,"lfo",(data[2+dop]>>5) & 03);
  211.                 setopval(n,"micro",(data[6+dop]>>6) & 01);
  212.         }
  213.         setval("microtune",data[64] & 017);
  214.         setval("assmode",data[65] & 01);
  215.         setval("effect",(data[65]>>1) & 03);
  216.         setval("microkey",(data[65]>>3) & 017);
  217.  
  218.         setval("autochan",Channel);
  219. }
  220.  
  221. /*
  222.  * tx8pdout
  223.  *
  224.  * Take (possibly changed) parameters values out of the P array and
  225.  * put them back into 'data'.
  226.  */
  227.  
  228. tx8pdout(data)
  229. char *data;
  230. {
  231.         int dop, n, voicenum, msb;
  232.  
  233.         for ( n=1; n<=8; n++ ) {
  234.                 dop = (n-1)*8;
  235.                 voicenum = getopval(n,"voice");
  236.                 msb = (voicenum>>7)&01;
  237.                 data[0+dop] = getopval(n,"max") | (msb<<4)
  238.                                 | getopval(n,"out")<<5;
  239.                 data[1+dop] = voicenum & 0177;
  240.                 data[2+dop] = getopval(n,"lfo")<<5 | getopval(n,"rec");
  241.                 data[3+dop] = getopval(n,"liml");
  242.                 data[4+dop] = getopval(n,"limh");
  243.                 data[5+dop] = getopval(n,"detune");
  244.                 data[6+dop] = getopval(n,"micro")<<6 | getopval(n,"shift");
  245.                 data[7+dop] = getopval(n,"vol");
  246.         }
  247.         data[64] = getval("microtune");
  248.         data[65] = getval("microkey")<<3 | getval("effect")<<1
  249.                         | getval("assmode");
  250.         Channel = getval("autochan");
  251. }
  252.  
  253. tx8psedit(data)
  254. char *data;
  255. {
  256.         char pdata[PCEDSIZE];
  257.         int n, cksum, c;
  258.         char *p;
  259.  
  260.         clrdata(pdata,PCEDSIZE);
  261.         pmemtopced(data,pdata);
  262.         sendmidi(0xf0);
  263.         sendmidi(0x43);
  264.         sendmidi(Channel-1);    /* channel # */
  265.         sendmidi(0x7e);         /* format type */
  266.         sendmidi(0x00);         /* byte count */
  267.         sendmidi(0x78);         /* byte count */
  268.         p = "LM  8976PE";
  269.         cksum = 0;
  270.         while ( (c=(int)(*p++)) != '\0' ) {
  271.                 sendmidi(c);
  272.                 cksum += c;
  273.         }
  274.         for ( n=0; n<PCEDSIZE; n++ ) {
  275.                 c = (int)(pdata[n]);
  276.                 sendmidi(c);
  277.                 cksum += c;
  278.         }
  279.         sendmidi((-cksum) & 0x7f);
  280.         sendmidi(EOX);
  281. }
  282.  
  283. /* Convert PMEM to PCED format */
  284. pmemtopced(indata,outdata)
  285. char *indata, *outdata;
  286. {
  287.         int n, inop, outop;
  288.  
  289.         for ( n=1; n<=8; n++ ) {
  290.                 inop = (n-1)*8;
  291.                 outop = (n-1)*12;
  292.  
  293.                 outdata[0+outop] = indata[0+inop] & 017;
  294.  
  295.                 outdata[1+outop] = (indata[0+inop]>>4)&01;
  296.                 outdata[2+outop] = indata[1+inop] & 0177;
  297.                 outdata[3+outop] = indata[2+inop] & 037;
  298.                 outdata[4+outop] = indata[3+inop] & 0177;
  299.                 outdata[5+outop] = indata[4+inop] & 0177;
  300.                 outdata[6+outop] = indata[5+inop] & 017;
  301.                 outdata[7+outop] = indata[6+inop] & 077;
  302.                 outdata[8+outop] = indata[7+inop] & 0177;
  303.                 outdata[9+outop] = (indata[0+inop]>>5) & 03;
  304.                 outdata[10+outop] = (indata[2+inop]>>5) & 03;
  305.                 outdata[11+outop] = (indata[6+inop]>>6) & 01;
  306.         }
  307.         outdata[96] = indata[64] & 017;
  308.         outdata[97] = indata[65] & 01;
  309.         outdata[98] = (indata[65]>>1) & 03;
  310.         outdata[99] = (indata[65]>>3) & 017;
  311.         for ( n=0; n<10; n++ )
  312.                 outdata[100+n] = indata[66+n];
  313. }
  314.  
  315. /* send a bulk performance dump to the tx81z */
  316. tx8psbulk(data)
  317. char *data;
  318. {
  319.         int c, v, n, cksum;
  320.         char *p;
  321.  
  322.         sendmidi(0xf0);
  323.         sendmidi(0x43);
  324.         sendmidi(Channel-1);    /* Channel # */
  325.         sendmidi(0x7e);
  326.         sendmidi(0x13);
  327.         sendmidi(0x0a);
  328.         p = "LM  8976PM";
  329.         cksum = 0;
  330.         while ( (c=(int)(*p++)) != '\0' ) {
  331.                 sendmidi(c);
  332.                 cksum += c;
  333.         }
  334.         /* send 32 PMEM's worth of data */
  335.         for ( v=0; v<32; v++ ) {
  336.                 for ( n=0; n<PMEMSIZE; n++ ) {
  337.                         /* 24 PMEM's are editable, but the bulk dump has 32 */
  338.                         if ( v >= 24 )
  339.                                 c = 0;
  340.                         else
  341.                                 c = VOICEBYTE(data,v,n);
  342.                         sendmidi(c & 0xff);
  343.                         cksum += c;
  344.                 }
  345.         }
  346.         sendmidi((-cksum) & 0x7f);
  347.         sendmidi(0xf7);
  348. }
  349.  
  350. /* Request and read a bulk performance dump from the TX81Z */
  351. tx8pgbulk(data)
  352. char *data;
  353. {
  354.         int c, n, v, b1, b2, cksum, ret = 1;
  355.         long begin, toolong;
  356.         char *p;
  357.  
  358.         flushmidi();
  359.  
  360.         sendmidi(0xf0);
  361.         sendmidi(0x43);
  362.         sendmidi(0x20 | (Channel-1));   /* Channel # */
  363.         sendmidi(0x7e);
  364.         p = "LM  8976PM";
  365.         while ( (c=(int)(*p++)) != '\0' )
  366.                 sendmidi(c);
  367.         sendmidi(EOX);
  368.  
  369.         begin = milliclock();
  370.         toolong = begin + 1000 * TIMEOUT;
  371.  
  372.         /* wait for the x43 byte starting the dump */
  373.         while ( milliclock() < toolong ) {
  374.                 if ( STATMIDI && (c=(getmidi() & 0xff)) == 0x43 )
  375.                         break;
  376.         }
  377.         if ( c != 0x43 ) {
  378.                 Reason = "Timeout waiting for 0x43";
  379.                 goto getout;
  380.         }
  381.         /* get the 14 bytes preceeding the data */
  382.         for ( cksum=n=0; n<14; n++ ) {
  383.                 /* twiddle your thumbs, but not forever */
  384.                 while ( ! STATMIDI ) {
  385.                         if ( milliclock() > toolong )
  386.                                 goto timeout;   /* the end of an era */
  387.                 }
  388.                 c = getmidi();
  389.                 if(n >= 4)
  390.                         cksum += c; /* start of LM... keyword */
  391.         }
  392.         /* 32 memories are dumped */
  393.         for ( v=0; v<32; v++ ) {
  394.                 for ( n=0; n<PMEMSIZE; n++ ) {
  395.                         /* twiddle your thumbs, but not forever */
  396.                         while ( ! STATMIDI ) {
  397.                                 if ( milliclock() > toolong )
  398.                                         goto timeout;   /* the end of an era */
  399.                         }
  400.                         c = (getmidi() & 0xff);
  401.                         /* Ignore non-data bytes ? */
  402.                         if ( c & 0x80 )
  403.                                 continue;
  404.                         /* compute checksum */
  405.                         cksum += c;
  406.                         /* Only 24 memories are used */
  407.                         if ( v < 24 )
  408.                                 VOICEBYTE(data,v,n) = c;
  409.                 }
  410.         }
  411. timeout:
  412.         if ( v < 32 ) {
  413.                 Reason = "Timeout while reading!";
  414.                 goto getout;
  415.         }
  416.         b1 = (getmidi() & 0xff);        /* Checksum */
  417.         b2 = (getmidi() & 0xff);        /* EOX */
  418.         cksum = (-cksum) & 0x7f;        /* convert to what we must match */
  419.         if ( b2 != EOX )
  420.                 Reason = "EOX not received";
  421.         else if ( b1 != cksum ) {
  422.                 static char ckbuff[80];
  423.                 sprintf(ckbuff,"Checksum doesn't match (got %d expected %d)",b1,cksum);
  424.                 /* Reason = "Checksum doesn't match"; */
  425.                 Reason = ckbuff;
  426.         }
  427.         else {
  428.                 Reason = "";
  429.                 ret = 0;        /* all's well */
  430.         }
  431. getout:
  432.         return(ret);
  433. }
  434.  
  435. char *
  436. tx8pnof(data)
  437. char *data;
  438. {
  439.         int n;
  440.  
  441.         for ( n=0; n<10; n++ )
  442.                 Pbuff[n] = data[66+n];
  443.         Pbuff[10] = '\0';
  444.         return(Pbuff);
  445.  
  446. tx8psnof(data,name)
  447. char *data, *name;
  448. {
  449.         int n;
  450.  
  451.         for ( n=0; name[n]!='\0' && n<10; n++ )
  452.                 data[66+n] = name[n];
  453.         for ( ; n<10; n++ )
  454.                 data[66+n] = ' ';
  455.  
  456. char *
  457. visass(v)
  458. {
  459.         switch(v){
  460.         case 0: return("normal");
  461.         case 1: return("alternate");
  462.         }
  463.         return("");
  464. }
  465.  
  466. char *
  467. viskey(v)
  468. {
  469.         switch(v){
  470.         case 0: return("C");
  471.         case 1: return("C#");
  472.         case 2: return("D");
  473.         case 3: return("D#");
  474.         case 4: return("E");
  475.         case 5: return("F");
  476.         case 6: return("F#");
  477.         case 7: return("G");
  478.         case 8: return("G#");
  479.         case 9: return("A");
  480.         case 10: return("A#");
  481.         case 11: return("B");
  482.         }
  483.         return("");
  484. }
  485.  
  486. char *
  487. viseffect(v)
  488. {
  489.         switch(v){
  490.         case 0: return("none");
  491.         case 1: return("delay");
  492.         case 2: return("pan");
  493.         case 3: return("chord");
  494.         }
  495.         return("");
  496. }
  497.  
  498. char *
  499. vischan(v)
  500. {
  501.         if ( v >= 0 && v <= 15 ) {
  502.                 sprintf(Pbuff,"%d",v+1);
  503.                 return(Pbuff);
  504.         }
  505.         if ( v == 16 )
  506.                 return("omni");
  507.         return("");
  508. }
  509.  
  510. char *
  511. visnote(v)
  512. {
  513.         int octave;
  514.  
  515.         octave = (v/12) - 2;
  516.         sprintf(Pbuff,"%s%d",viskey(v%12),octave);
  517.         return(Pbuff);
  518. }
  519.  
  520. char *
  521. vispshift(v)
  522. {
  523.         sprintf(Pbuff,"%d",v-24);
  524.         return(Pbuff);
  525. }
  526.  
  527. char *
  528. vistdetune(v)
  529. {
  530.         sprintf(Pbuff,"%d",v-7);
  531.         return(Pbuff);
  532. }
  533.  
  534. char *
  535. vistout(v)
  536. {
  537.         switch (v) {
  538.         case 0: return("off");
  539.         case 1: return("I");
  540.         case 2: return("II");
  541.         case 3: return("I+II");
  542.         }
  543.         return("");
  544. }
  545.  
  546. char *
  547. vislfo(v)
  548. {
  549.         switch (v) {
  550.         case 0: return("off");
  551.         case 1: return("inst1");
  552.         case 2: return("inst2");
  553.         case 3: return("vib");
  554.         }
  555.         return("");
  556. }
  557.  
  558. char *
  559. visponoff(v)
  560. {
  561.         switch(v){
  562.         case 0: return("off");
  563.         case 1: return("on");
  564.         }
  565.         return("");
  566. }
  567.  
  568. char *
  569. vispvoice(v)
  570. {
  571.         char *p, *prefixes = "IABCD";
  572.         int bank, vnum, vindex;
  573.  
  574.         bank = v/32;
  575.         vnum = (v%32) + 1;
  576.         sprintf(Pbuff,vnum<10?"%c0%d":"%c%d",prefixes[bank],vnum);
  577.         if ( bank > 0 ) {
  578.                 vindex = (bank-1)*32+vnum-1;
  579.                 if ( vindex >= 0 && vindex < 128 ) {
  580.                         strcat(Pbuff,"~d~l~l~l");
  581.                         p = tx81voices[vindex];
  582.                         if ( strlen(p) <= 5 )
  583.                                 strcat(Pbuff,p);
  584.                         else {
  585.                                 char buff[11];
  586.                                 strcpy(buff,p);
  587.                                 buff[5] = '\0';
  588.                                 strcat(Pbuff,buff);
  589.                                 strcat(Pbuff,"~d~l~l~l~l~l");
  590.                                 strcat(Pbuff,&p[5]);
  591.                         }
  592.                 }
  593.         }
  594.         return(Pbuff);
  595. }
  596.