home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_progs / sound / algorhyt.lha / source / Gadgets.c < prev    next >
C/C++ Source or Header  |  1992-02-21  |  26KB  |  833 lines

  1. /* Gadgets.c
  2.    Copyright (c) 1990,1991,1992 by Thomas E. Janzen
  3.    All Rights Reserved
  4.  
  5.    THIS SOFTWARE IS FURNISHED FREE OF CHARGE FOR STUDY AND USE AND MAY
  6.    BE COPIED ONLY FOR PERSONAL USE OR COMPLETELY AS OFFERED WITH NO
  7.    CHANGES FOR FREE DISTRIBUTION.  NO TITLE TO AND OWNERSHIP OF THE
  8.    SOFTWARE IS HEREBY TRANSFERRED.  THOMAS E. JANZEN ASSUMES NO 
  9.    RESPONSBILITY FOR THE USE OR RELIABILITY OF THIS SOFTWARE.
  10.    
  11.    Thomas E. Janzen
  12.    58A School St. Apt. 2-L
  13.    Hudson, MA 01749
  14.    (508)562-1295
  15. */
  16. /*
  17. **  FACILITY:
  18. **
  19. **    AlgoRhythms music improviser on Commodore (TM) Amiga (TM)
  20. **    compiled with SAS/C V5.10b
  21. **
  22. **  ABSTRACT:
  23. **
  24. **    Gadgets.c sets up and interacts with the gadgets and requesters.
  25. **
  26. **  AUTHORS: Thomas E. Janzen
  27. **
  28. **  CREATION DATE:    26-MAR-1990
  29. **
  30. **  MODIFICATION HISTORY:
  31. **    DATE    NAME    DESCRIPTION
  32.       12 Aug 90 T Janzen Correct proportions of gadgets and borders.
  33. **    8 DEC 91 T. Janzen conform to SAS/C 5.10b remove extern from functs
  34. **  4 Jan 92 TEJ  last changes for 2.0
  35. **--
  36. */
  37.  
  38. #include <stdlib.h>
  39. #include <ctype.h>
  40. #include <stdio.h>
  41. #include <math.h>
  42. #include <string.h>
  43. #include <intuition/intuition.h>
  44. #include <graphics/text.h>
  45. #include <proto/dos.h>
  46. #include <proto/graphics.h>
  47. #include <proto/exec.h>
  48. #include <proto/mathffp.h>
  49. #include <proto/intuition.h>
  50. #include "Window.h" /* An AlgoRhythms header file for Window.c */
  51.  
  52. #define STRINGSIZE 80
  53.  
  54. /* GADGET */
  55. #define GADGETTEXTDOWN  (12L)    /* vertical pixel positioning down    */
  56. #define CLEFT           (10L)    /* horizontal position for string gadgets*/
  57. #define CTOP            ( 6L)    /* vertical position for string gadgets */
  58. #define GADGETWIDTH     (300L)/* width of string gadgets        */
  59. #define GADGETHEIGHT    (24L)    /* height of string gadgets        */
  60. #define LEFTEDGE        (-1L)    /* position for borders around gadgets    */
  61. #define TOPEDGE         (-1L)    /* position for borders around gadgets    */
  62. #define REQUESTERTEXTDOWN (34L)    /* position for requester text        */
  63. #define REQUESTERWIDTH (304L)    /* position for requester text        */
  64. #define REQUESTERHEIGHT (47L)    /* height for requester text        */
  65. /*for last routine*/
  66. #define GADGETWIDE      (230L) /* width for channel requester         */
  67. #define CHANNELGADGETWIDE (40L)
  68. #define GADGETHIGH      (10L)    /* height for channel requester        */
  69. #define TOP             (1L)
  70. #define LEFT            (100L)
  71.  
  72. #define WALKGADGWIDE 61
  73. #define WALKGADGHI   13
  74.  
  75. /* internal routines for converting pitch names to MIDI numbers,vis versa*/
  76. static char *MIDItoPitchName(int NoteNum, char *PitchName);
  77. static int PitchNametoMIDI(char *PitchName);
  78.  
  79. extern char *GetGadgetInput (
  80.    char Previous[],          /* input: Previous value for variable */
  81.     char RemindString[],     /* Help string */
  82.     char PromptString[])
  83. {    
  84.    auto unsigned int Wait_Signal, 
  85.                      Signal_Recvd;
  86.    /* Title string for variable */
  87.     register int classb;    /* intuition message class */
  88.     static char GadgetString[32];    /* string for holding answer */
  89.     static struct IntuiText GadgetTxt =
  90.         {1, 2, JAM2, -140, 0, &font_choice, NULL, NULL};
  91.     static struct StringInfo 
  92.         StringStuff = {NULL, NULL, 0, STRINGSIZE, 0, 0, 0, 0, 
  93.         CLEFT, CTOP, NULL, 0, NULL};
  94.     SHORT GadgetPairs[] =     /* coordinates of border for gadget */
  95.        {98, 0, 98, 9, 0,9, 1,10, 99, 10, 99, 1, 98, 0, 0, 0, 0, 9};
  96.     struct Border GadgetBorder =  /* border structure */
  97.     {LEFTEDGE, TOPEDGE, 1, 2, JAM1, 9, NULL, NULL};
  98.     static struct Gadget StringBox = {
  99.         NULL, 150, 10, 100, 11, 
  100.         GADGHCOMP, RELVERIFY|STRINGCENTER, 
  101.         STRGADGET|REQGADGET, 
  102.         NULL, NULL, NULL, 0L, NULL, 1, NULL};
  103.  
  104.     /*REQUESTER*/
  105.     static UBYTE RequestString[32];
  106.     static struct IntuiText RequestTxt = 
  107.       {1, 2, JAM2, 10, 2, &font_choice, RequestString, NULL};
  108.     static SHORT RequesterPairs[] = 
  109.       {251, 0, 251, 24, 0, 24, 1, 25, 252, 25, 252, 1, 251, 0, 0, 0, 0, 24};
  110.     static struct Border RequesterBorder = 
  111.             {0, 0, 1, 0, JAM1, 9, NULL, NULL};
  112.  
  113.     struct Requester AnswerRequest;    /* An Intuition structure */
  114.     struct IntuiMessage *message;    /* An Exec structure */
  115.  
  116.     BOOL Waiton = TRUE;
  117.     
  118.     InitRequester (&AnswerRequest);    /* zero out requester */
  119.     strcpy (RequestString, RemindString);
  120.     strcpy (GadgetString, PromptString);
  121.     /* Set up the requester variables */
  122.     AnswerRequest.OlderRequest    = NULL;
  123.     AnswerRequest.LeftEdge        = 10; /*position*/
  124.     AnswerRequest.TopEdge         = 30;
  125.     AnswerRequest.Width           = 253;
  126.     AnswerRequest.Height          = 25;
  127.     AnswerRequest.RelLeft         = 0;
  128.     AnswerRequest.RelTop          = 0;
  129.     AnswerRequest.ReqGadget       = &StringBox;
  130.     AnswerRequest.ReqBorder       = &RequesterBorder;
  131.     AnswerRequest.ReqText         = &RequestTxt;
  132.     AnswerRequest.Flags           = 0;
  133.     AnswerRequest.BackFill        = 3;
  134.     AnswerRequest.ReqLayer        = NULL;
  135.     AnswerRequest.ImageBMap       = NULL;
  136.     AnswerRequest.RWindow         = w;
  137.  
  138.     GadgetTxt.IText         = GadgetString;
  139.     GadgetBorder.XY         = GadgetPairs;
  140.     StringStuff.Buffer      = Previous;
  141.     StringStuff.UndoBuffer  = Previous;
  142.     StringBox.GadgetRender  = (APTR)&GadgetBorder;
  143.     StringBox.GadgetText    = &GadgetTxt;
  144.     StringBox.SpecialInfo   = (APTR)&StringStuff;
  145.     RequesterBorder.XY      = RequesterPairs;
  146.  
  147.     Request (&AnswerRequest, w);
  148.     OnGadget (&StringBox, w, &AnswerRequest);
  149.     RefreshGadgets (&StringBox, w, &AnswerRequest);
  150.  
  151.    Wait_Signal = 1L << w->UserPort->mp_SigBit;
  152.    while (Waiton)
  153.    {
  154.       Signal_Recvd = Wait (Wait_Signal);
  155.       if (!(Signal_Recvd & Wait_Signal))
  156.       {
  157.          continue;
  158.       }
  159.       while (message = (struct IntuiMessage *)GetMsg(w->UserPort))
  160.       {
  161.             if (message != NULL) 
  162.          {
  163.                 classb = message->Class;
  164.                 ReplyMsg ((struct Message *)message);
  165.             if (classb == REQSET)
  166.             {
  167.                Waiton = FALSE;
  168.             }
  169.          }
  170.       }
  171.    }
  172.    Waiton = TRUE;
  173.    ActivateGadget (&StringBox, w, &AnswerRequest);
  174.     /* wait for mouse event and completion of string gadget */
  175.     while (Waiton) 
  176.    {
  177.       Wait_Signal = 1 << w->UserPort->mp_SigBit;
  178.       Signal_Recvd = Wait (Wait_Signal);
  179.       if (!(Signal_Recvd & Wait_Signal))
  180.       {
  181.          continue;
  182.       }
  183.       while (message = (struct IntuiMessage *)GetMsg(w->UserPort))
  184.       {
  185.             if (message != NULL) 
  186.          {
  187.                 classb = message->Class;
  188.                 ReplyMsg ((struct Message *)message);
  189.                 switch (classb) 
  190.             {
  191.                     case GADGETUP:
  192.                        EndRequest (&AnswerRequest, w);
  193.                        Waiton = FALSE;
  194.                        break;
  195.                default:
  196.                   break;
  197.                 }
  198.             }
  199.       }
  200.    }
  201.     return Previous; /* return the new value */
  202. }
  203.  
  204. const char OKString[4] = "OK";
  205. const struct IntuiText OKTxt = {1, 2, JAM2, 14, 1, &font_choice, 
  206.       OKString, NULL};
  207. const static SHORT OKPairs[] = 
  208. {41, 0, 41, 12, 0,12, 1, 13, 42, 13, 42, 1, 41, 0, 0, 0, 0, 12};
  209. struct Border OKBorder = {-1, -1, 1, 0, JAM2, 9, OKPairs, NULL};
  210. struct Gadget OKGadget  =  {
  211.     NULL, /* next gadget */
  212.     250, 30, 41, 12, /*left , top, wide, high*/
  213.     GADGHCOMP, RELVERIFY|ENDGADGET,
  214.     BOOLGADGET|REQGADGET,
  215.     (APTR)&OKBorder, NULL, &OKTxt, 0L, NULL, 2, NULL
  216. };
  217.  
  218. struct PropInfo SliderInfo = { /*Flags*/AUTOKNOB|FREEHORIZ, 
  219.     0x8000 /*HorizPot %*/, 0x8000 /*VertPot*/, 
  220.     /*HorizBody*/ 0x100 , /* VertBody*/ 0x0, 
  221.     0 /*CWidth*/, 0 /*CHeight*/, 0 /*HpotRes*/, 0 /*VPotRes*/, 
  222.     0 /*LeftBorder*/, 0 /*TopBorder*/
  223. };
  224.     
  225. const SHORT SliderPairs[] = 
  226.    {GADGETWIDTH, 0, GADGETWIDTH, GADGETHEIGHT, 0, 
  227.     GADGETHEIGHT, 1, GADGETHEIGHT + 1,
  228.     GADGETWIDTH + 1, GADGETHEIGHT + 1, GADGETWIDTH + 1, 1, 
  229.     GADGETWIDTH, 0, 0, 0, 0, GADGETHEIGHT};
  230. const struct Border SliderBorder = 
  231.     {LEFTEDGE, TOPEDGE, 1, 2, JAM1, 9, SliderPairs, NULL};
  232. struct Gadget SliderGadget = {
  233.     &OKGadget,
  234.     1, 20, GADGETWIDTH, 8, /* left, top, wide, high*/
  235.     GADGHCOMP, RELVERIFY|GADGIMMEDIATE, 
  236.     PROPGADGET|REQGADGET, 
  237.     (APTR)&SliderBorder, NULL, NULL, 0L, 
  238.     (APTR)&SliderInfo, 1, NULL};
  239.  
  240. /*REQUESTER*/
  241. struct IntuiText RemindTxt = {1, 2, JAM2, 5, 33, &font_choice, NULL, NULL};
  242. const UBYTE TitleString[32] = "Phase in Radians";
  243. const struct IntuiText TitleTxt = {1, 2, JAM2, 
  244.     10 /*left */, 2 /*top*/, &font_choice, TitleString, &RemindTxt};
  245. const char PhaseString[] = "-pi   -pi/2       0      pi/2      pi";
  246. struct IntuiText PhaseTxt = {1, 2, JAM2, 1, 11 /*text down*/, &font_choice,
  247.     PhaseString, &TitleTxt};
  248. SHORT RequesterPairs[] = 
  249. {REQUESTERWIDTH - 2, 0, REQUESTERWIDTH - 2, REQUESTERHEIGHT - 2, 
  250. 0, REQUESTERHEIGHT - 2, 1, REQUESTERHEIGHT - 1, 
  251. REQUESTERWIDTH - 1, REQUESTERHEIGHT - 1, REQUESTERWIDTH - 1, 1, 
  252. REQUESTERWIDTH - 2, 0, 0, 0, 0, REQUESTERHEIGHT - 1};
  253.  
  254. struct Border RequesterBorder = {0, 0, 1, 0, JAM1, 9, NULL, NULL};    
  255.  
  256. extern double GetPhaseInput (double Previous, char TypeString[]) 
  257. {
  258.    auto unsigned int Wait_Signal, 
  259.                      Signal_Recvd;
  260.  
  261.     struct IntuiMessage *message;
  262.     double Answer;
  263.     USHORT GadgetNum;
  264.     struct Gadget *TempPtr;
  265.     register int classb;
  266.     struct Requester PhaseRequest;
  267.     BOOL Waiton = TRUE;
  268.  
  269.     InitRequester(&PhaseRequest); /* zero out requester */
  270.     /* build up phase requester */
  271.     /* this is a slider gadget for phase from - pi to + pi */
  272.     PhaseRequest.OlderRequest = NULL;
  273.     PhaseRequest.LeftEdge = 10; /*position*/
  274.     PhaseRequest.TopEdge = 30;
  275.     PhaseRequest.Width = REQUESTERWIDTH;
  276.     PhaseRequest.Height = REQUESTERHEIGHT;
  277.     PhaseRequest.RelLeft = 0;
  278.     PhaseRequest.RelTop = 0;
  279.     PhaseRequest.ReqGadget = &SliderGadget;
  280.     PhaseRequest.ReqBorder = &RequesterBorder;
  281.     PhaseRequest.ReqText = &PhaseTxt;
  282.     PhaseRequest.Flags = 0;
  283.     PhaseRequest.BackFill = 3;
  284.     PhaseRequest.ReqLayer = NULL;
  285.     PhaseRequest.ImageBMap = NULL;
  286.     PhaseRequest.RWindow  =  w;
  287.     RequesterBorder.XY = RequesterPairs;
  288.     RemindTxt.IText = TypeString;
  289.     
  290.     if (fabs(Previous) > 3.141593) 
  291.    {
  292.        Previous = (Previous / (fabs(Previous))) 
  293.                * (fabs(Previous) - 3.141593);
  294.     }
  295.     SliderInfo.HorizPot = 
  296.         (short)(int)((double)10430 * Previous + (double)0x8000);
  297.     
  298.     Request (&PhaseRequest, w);
  299.     OnGadget (&SliderGadget, w, &PhaseRequest);
  300.     RefreshGadgets (&SliderGadget, w, &PhaseRequest);
  301.  
  302.    Wait_Signal = 1 << w->UserPort->mp_SigBit;
  303.     while (Waiton) 
  304.    { /* wait for mouse to move the slider for phase */
  305.             /* and for the OK gadget to be hit */
  306.       Signal_Recvd = Wait (Wait_Signal);
  307.       if (!(Signal_Recvd & Wait_Signal))
  308.       {
  309.          continue;
  310.       }
  311.       while (message = (struct IntuiMessage *) GetMsg (w->UserPort))
  312.       {
  313.             if (message != NULL) 
  314.          {
  315.                 classb = message->Class;
  316.                 TempPtr = (struct Gadget *)message->IAddress;
  317.                 ReplyMsg((struct Message *)message);
  318.                 if (classb == GADGETUP) 
  319.             {
  320.                     GadgetNum = TempPtr->GadgetID;
  321.                 }
  322.                 if (GadgetNum == 2) 
  323.             {
  324.                     switch (classb) 
  325.                {
  326.                         case GADGETUP:
  327.                            EndRequest (&PhaseRequest, w);
  328.                            Waiton = FALSE;
  329.                            Answer   = ((95.9E-6) 
  330.                                  * (double)(SliderInfo.HorizPot))
  331.                                  - 3.141593;
  332.                            break;
  333.                      default:
  334.                         break;
  335.                     }
  336.                 }
  337.             }
  338.       }
  339.     }
  340.     return Answer; /* return new phase */
  341. }
  342.  
  343. extern int GetStringInput (char Previous[], /* string input for file names */
  344.     char RemindString[], 
  345.     char PromptString[]) 
  346. {
  347.    auto unsigned int Wait_Signal, 
  348.                      Signal_Recvd;
  349.     int failure = 0;
  350.     USHORT GadgetNum;
  351.     struct Gadget *TempPtr;
  352.     
  353.     char OKString[4] = "OK";
  354.     struct IntuiText OKTxt = {1, 2, JAM2, 14, 1, &font_choice, NULL, NULL};
  355.     static SHORT OKPairs[] = 
  356.     {41, 0, 41, 12, 0, 12, 1, 13, 42, 13, 42, 1, 41, 0, 0, 0, 0, 12};
  357.  
  358.     struct Border OKBorder = {-1, -1, 1, 0, JAM2, 9, NULL, NULL};
  359.     struct Gadget OKGadget  =  {
  360.     NULL, /* next gadget */
  361.     250, 31, 41, 12, /*left , top, wide, high*/
  362.     GADGHCOMP, RELVERIFY|ENDGADGET, 
  363.     BOOLGADGET|REQGADGET, 
  364.     NULL, NULL, NULL, 0L, NULL, 1, NULL};
  365.  
  366.     char QuitString[8] = "Quit";
  367.     struct IntuiText QuitTxt = {1, 2, JAM2, 4, 1, &font_choice, NULL, NULL};
  368.     struct Gadget QuitGadget = {
  369.        NULL, /* next gadget */
  370.        190, 31, 41, 12, /*left , top, wide, high*/
  371.        GADGHCOMP, RELVERIFY|ENDGADGET, 
  372.        BOOLGADGET|REQGADGET, 
  373.        NULL, NULL, NULL, 0L, NULL, 2, NULL};
  374.     
  375.     register int classb;
  376.     static char GadgetString[32];
  377.     static struct IntuiText GadgetTxt = 
  378.         {1, 2, JAM2, 10, GADGETTEXTDOWN, &font_choice, NULL, NULL};
  379.     static struct StringInfo 
  380.         StringStuff = {NULL, NULL, 0, STRINGSIZE, 0, 0, 0, 0, 
  381.         CLEFT, CTOP, NULL, 0, NULL};
  382.     static SHORT GadgetPairs[] = 
  383.    {GADGETWIDTH, 0, GADGETWIDTH, GADGETHEIGHT, 0, GADGETHEIGHT, 1, 
  384.       GADGETHEIGHT + 1, 
  385.    GADGETWIDTH + 1, GADGETHEIGHT + 1, GADGETWIDTH + 1, 1, 
  386.    GADGETWIDTH, 0, 0, 0, 0, GADGETHEIGHT};
  387.     static struct Border GadgetBorder = 
  388.     {LEFTEDGE, TOPEDGE, 1, 2, JAM1, 9, NULL, NULL};
  389.     static struct Gadget StringBox = {
  390.         NULL, 2, 3, GADGETWIDTH, GADGETHEIGHT, 
  391.         GADGHCOMP, RELVERIFY|STRINGCENTER, 
  392.         STRGADGET|REQGADGET, 
  393.         NULL, NULL, NULL, 0L, NULL, 1, NULL};
  394.  
  395.     /*REQUESTER*/
  396.     static UBYTE RequestString[32];
  397.     static struct IntuiText RequestTxt = 
  398.    {1, 2, JAM2, 10, REQUESTERTEXTDOWN, 
  399.     &font_choice, RequestString, NULL};
  400.     static SHORT RequesterPairs[] = 
  401.        {REQUESTERWIDTH - 2, 0, REQUESTERWIDTH - 2, REQUESTERHEIGHT - 2, 
  402.        0, REQUESTERHEIGHT - 2, 1, REQUESTERHEIGHT - 1, 
  403.        REQUESTERWIDTH - 1, REQUESTERHEIGHT - 1, REQUESTERWIDTH - 1, 1, 
  404.        REQUESTERWIDTH - 2, 0, 0, 0, 0, REQUESTERHEIGHT - 1};
  405.  
  406.     static struct Border RequesterBorder = 
  407.       {0, 0, 1, 0, JAM1, 9, NULL, NULL};
  408.  
  409.     struct Requester AnswerRequest;
  410.     struct IntuiMessage *message;
  411.  
  412.     BOOL Waiton             = TRUE;
  413.     InitRequester (&AnswerRequest);
  414.     OKGadget.NextGadget     = &QuitGadget;
  415.     OKBorder.XY             = OKPairs;
  416.     OKGadget.GadgetRender   = (APTR)&OKBorder;
  417.     OKGadget.GadgetText     = &OKTxt;
  418.     QuitGadget.GadgetRender = (APTR)&OKBorder;
  419.     QuitTxt.IText           = QuitString;
  420.     QuitGadget.GadgetText   = &QuitTxt;
  421.     OKTxt.IText             = OKString;
  422.     StringBox.NextGadget    = &OKGadget;
  423.  
  424.     strcpy (RequestString, RemindString);
  425.     strcpy (GadgetString, PromptString);
  426.  
  427.     AnswerRequest.OlderRequest    = NULL;
  428.     AnswerRequest.LeftEdge        = 10; /*position*/
  429.     AnswerRequest.TopEdge         = 30;
  430.     AnswerRequest.Width           = REQUESTERWIDTH;
  431.     AnswerRequest.Height          = REQUESTERHEIGHT;
  432.     AnswerRequest.RelLeft         = 0;
  433.     AnswerRequest.RelTop          = 0;
  434.     AnswerRequest.ReqGadget       = &StringBox;
  435.     AnswerRequest.ReqBorder       = &RequesterBorder;
  436.     AnswerRequest.ReqText         = &RequestTxt;
  437.     AnswerRequest.Flags           = 0;
  438.     AnswerRequest.BackFill        = 3;
  439.     AnswerRequest.ReqLayer        = NULL;
  440.     AnswerRequest.ImageBMap       = NULL;
  441.     AnswerRequest.RWindow         = w;
  442.  
  443.     GadgetTxt.IText            = GadgetString;
  444.     GadgetBorder.XY            = GadgetPairs;
  445.     StringStuff.Buffer         = Previous;
  446.     StringStuff.UndoBuffer     = Previous;
  447.     StringBox.GadgetRender     = (APTR)&GadgetBorder;
  448.     StringBox.GadgetText       = &GadgetTxt;
  449.     StringBox.SpecialInfo      = (APTR)&StringStuff;
  450.     RequesterBorder.XY         = RequesterPairs;
  451.  
  452.     Request (&AnswerRequest, w);
  453.     OnGadget (&StringBox, w, &AnswerRequest);
  454.     RefreshGadgets (&StringBox, w, &AnswerRequest);
  455.    /*
  456.    ** Libs & Devices p 99, should not do the Activate until you hear
  457.    ** a ACTIVEWINDOW or REQSET, which you also set in the window IDCMP
  458.    */
  459.    ActivateGadget (&StringBox, w, &AnswerRequest);
  460.    Wait_Signal = 1L << w->UserPort->mp_SigBit;
  461.    while (Waiton)
  462.    {
  463.       Signal_Recvd = Wait (Wait_Signal);
  464.       if (!(Signal_Recvd & Wait_Signal))
  465.       {
  466.          continue;
  467.       }
  468.       while (message = (struct IntuiMessage *)GetMsg (w->UserPort))
  469.       {
  470.             if (message != NULL) 
  471.          {
  472.                 classb   = message->Class;
  473.                 TempPtr  = (struct Gadget *)message->IAddress;
  474.                 ReplyMsg ((struct Message *)message);
  475.                 if (classb == GADGETUP) 
  476.             {
  477.                     GadgetNum = TempPtr->GadgetID;
  478.                     switch (GadgetNum) 
  479.                {
  480.                         case 0: /*got string*/
  481.                             failure = 0;
  482.                             break;
  483.                         case 1: /*string OK*/
  484.                             failure = 0;
  485.                             break;
  486.                         case 2: /*quit*/
  487.                             failure = 1;
  488.                             break;
  489.                      default:
  490.                         break;
  491.                     }
  492.                     EndRequest (&AnswerRequest, w);
  493.                     Waiton = FALSE;
  494.                     break;
  495.                 }
  496.             }
  497.       }
  498.     }
  499.     return failure;
  500. }
  501.  
  502. #include "AlgoRhythms.h"
  503.  
  504. /* Channel parameters: high note, low note, MIDI channel, walking*/
  505.  
  506. extern int GetChannelStuff (NOTEEVENT *Event, int Number) 
  507. {
  508.    auto unsigned int Wait_Signal, 
  509.                      Signal_Recvd;
  510.     /* TempWalking is int */
  511.     /* ->Walking is int*/
  512.     /* Gadget.Flags is USHORT*/
  513.     int TempHigh, TempLow, TempChannel, TempWalking;
  514.     char OKString[4] = "OK"; /*        L  T      txt  next*/
  515.     struct IntuiText OKTxt = {1, 2, JAM2, 24, 1, &font_choice, NULL, NULL};
  516.     static SHORT OKPairs[] = 
  517.     {61, 0, 61, 12, 0, 12, 1, 13, 62, 13, 62, 1, 61, 0, 0, 0, 0, 12};
  518.     struct Border OKBorder = {-1, -1, 1, 0, JAM2, 9, NULL, NULL};
  519.     struct Gadget OKGadget = {NULL, /* next gadget */
  520.     140, 47, 61, 12, /*left , top, wide, high*/
  521.     GADGHCOMP, RELVERIFY|ENDGADGET, BOOLGADGET|REQGADGET, 
  522.     NULL, NULL, NULL, 0L, NULL, 1, NULL};
  523.  
  524.     char CancelString[8]       = "Cancel";
  525.     struct IntuiText CancelTxt = {1, 2, JAM2, 4, 1,&font_choice,NULL, NULL};
  526.    struct Gadget CancelGadget = {NULL, /* next gadget */
  527.        140, 32, 61, 12, /*left , top, wide, high*/
  528.     GADGHCOMP, RELVERIFY|ENDGADGET, BOOLGADGET|REQGADGET, 
  529.        NULL, NULL, NULL, 0L, NULL, 2, NULL};
  530.  
  531.     static UBYTE HighString[16]      = "High Note";
  532.     static struct IntuiText HighTxt  = 
  533.    {1, 2, JAM2, -80, 0, &font_choice, NULL, NULL};
  534.     static char HighBuff[80];
  535.     static struct StringInfo HighInfo = 
  536.    {NULL, NULL, 0, STRINGSIZE, 0, 0, 0, 0, 
  537.         LEFT, TOP, NULL, 0, NULL};
  538.     static USHORT HighPairs[18]      =
  539.     {CHANNELGADGETWIDE, 0, CHANNELGADGETWIDE, 9, 
  540.     0, 9, 1, 10, CHANNELGADGETWIDE +1, 10, CHANNELGADGETWIDE + 1, 1, 
  541.     CHANNELGADGETWIDE, 0, 0, 0, 0, 9};
  542.  
  543.     static struct Border HighBorder = 
  544.         {LEFTEDGE, TOPEDGE, 1, 2, JAM1, 9, NULL, NULL};
  545.     static struct Gadget HighGadg  =  {NULL, 90, 34, CHANNELGADGETWIDE, 
  546.         GADGETHIGH, GADGHCOMP, RELVERIFY|STRINGCENTER, STRGADGET|REQGADGET, 
  547.         NULL, NULL, NULL, 0L, NULL, 3, NULL};
  548.     
  549.     static UBYTE LowString[16] = "Low Note";
  550.     static struct IntuiText LowTxt = 
  551.       {1, 2, JAM2, -80, 0, &font_choice, NULL, NULL};
  552.     static char LowBuff[80];
  553.     static struct StringInfo LowInfo = 
  554.       {NULL, NULL, 0, STRINGSIZE, 0, 0, 0, 0, LEFT, TOP, NULL, 0, NULL};
  555.     static struct Gadget LowGadg = {NULL, 90, 49, 
  556.         CHANNELGADGETWIDE, GADGETHIGH, 
  557.         GADGHCOMP, RELVERIFY|STRINGCENTER, STRGADGET|REQGADGET, 
  558.         NULL, NULL, NULL, 0L, NULL, 4, NULL};
  559.  
  560.     static UBYTE ChannelString[16] = "Channel";
  561.     static struct IntuiText ChannelTxt = 
  562.         {1, 2, JAM2, -80, 0, &font_choice, NULL, NULL};
  563.     static char ChannelBuff[80];
  564.     static struct StringInfo 
  565.         ChannelInfo = {NULL, NULL, 0, STRINGSIZE, 0, 0, 0, 0, 
  566.         LEFT, TOP, NULL, 0, NULL};
  567.     static struct Gadget ChannelGadg = {NULL, 90, 19, 
  568.         CHANNELGADGETWIDE, GADGETHIGH, 
  569.         GADGHCOMP, RELVERIFY|STRINGCENTER, 
  570.         LONGINT|STRGADGET|REQGADGET, NULL, NULL, NULL, 0L, NULL, 5, NULL};
  571.  
  572.     static UBYTE WalkString[16] = "Walk";
  573.    static short int WalkGadgBorderAry1 [14] = {
  574.       0,0,
  575.       0,WALKGADGHI-1,
  576.       1,WALKGADGHI-2,
  577.       1,1,
  578.       WALKGADGWIDE-2,1,
  579.       WALKGADGWIDE-1,0,0,0
  580.       };
  581.    static short int WalkGadgBorderAry2 [14] = {
  582.          WALKGADGWIDE-2,WALKGADGHI-2,
  583.          1,WALKGADGHI-2,
  584.          0,WALKGADGHI-1,
  585.          WALKGADGWIDE-1,WALKGADGHI-1,
  586.          WALKGADGWIDE-1,0,
  587.          WALKGADGWIDE-2,1,
  588.          WALKGADGWIDE-2,WALKGADGHI-2
  589.       };
  590.    static struct Border WalkGadgBorder1 = 
  591.       {0,0,1,0,JAM1,7,WalkGadgBorderAry1,NULL};
  592.    static struct Border WalkGadgBorder2 = 
  593.       {0,0,6,0,JAM1,7,WalkGadgBorderAry2, &WalkGadgBorder1};
  594.    
  595.     static struct IntuiText WalkTxt=
  596.         {1, 2, JAM1, 15, 3, &font_choice, NULL, NULL};
  597.     static struct Gadget WalkGadg = {NULL, 140, 17, WALKGADGWIDE, 
  598.       WALKGADGHI,
  599.         GADGHCOMP, TOGGLESELECT|RELVERIFY, 
  600.         BOOLGADGET|REQGADGET, NULL, NULL, NULL, 0L, NULL, 6, NULL};
  601.  
  602.     /*REQUESTER*/
  603.     static UBYTE RequestString[48];
  604.     static struct IntuiText RequestTxt = {1, 2, JAM2, 45, 4, 
  605.     &font_choice, RequestString, NULL};
  606.     static SHORT RequesterPairs[] = 
  607.     {209, 0, 209, 61, 0, 61, 1, 62, 210, 62, 210, 1, 209, 0, 0, 0, 0, 61};
  608.     static struct Border RequesterBorder = 
  609.       {0, 0, 1, 0, JAM1, 9, NULL, NULL};
  610.  
  611.     struct Requester AnswerRequest;
  612.     struct IntuiMessage *message;
  613.     register int classb;
  614.     int failure = 0;
  615.     USHORT GadgetNum;
  616.     struct Gadget *TempPtr;
  617.     BOOL Waiton = TRUE;
  618.  
  619.     sprintf(RequestString, "%s %2d", "Setup Voice", Number);
  620.     TempHigh    = Event->HighPitch;
  621.     TempLow     = Event->LowPitch;
  622.     TempWalking = Event->Walking;
  623.     TempChannel = Event->Channel;
  624.  
  625.     InitRequester(&AnswerRequest);
  626.  
  627.     if (Event->Walking)
  628.    { 
  629.        WalkGadg.Flags |=  SELECTED;
  630.    }
  631.     else
  632.    {
  633.         WalkGadg.Flags &= ~(SELECTED);
  634.    }
  635.     OKGadget.NextGadget     = NULL;
  636.     CancelGadget.NextGadget = &OKGadget;
  637.     HighGadg.NextGadget     = &CancelGadget;
  638.     LowGadg.NextGadget      = &HighGadg;
  639.     ChannelGadg.NextGadget  = &LowGadg;
  640.     WalkGadg.NextGadget     = &ChannelGadg;
  641.  
  642.     OKTxt.IText       = OKString;
  643.     CancelTxt.IText   = CancelString;
  644.     HighTxt.IText     = HighString;
  645.     LowTxt.IText      = LowString;
  646.     ChannelTxt.IText  = ChannelString;
  647.     WalkTxt.IText     = WalkString;
  648.  
  649.     OKBorder.XY       = OKPairs;
  650.     HighBorder.XY     = HighPairs;
  651.  
  652.     OKGadget.GadgetRender     = (APTR)&OKBorder;
  653.     CancelGadget.GadgetRender = (APTR)&OKBorder;
  654.     HighGadg.GadgetRender     = (APTR)&HighBorder;
  655.     LowGadg.GadgetRender      = (APTR)&HighBorder;
  656.     ChannelGadg.GadgetRender  = (APTR)&HighBorder;
  657.     WalkGadg.GadgetRender     = (APTR)&WalkGadgBorder2;
  658.  
  659.     OKGadget.GadgetText     = &OKTxt;
  660.     CancelGadget.GadgetText = &CancelTxt;
  661.     HighGadg.GadgetText     = &HighTxt;
  662.     LowGadg.GadgetText      = &LowTxt;
  663.     ChannelGadg.GadgetText  = &ChannelTxt;
  664.     WalkGadg.GadgetText     = &WalkTxt;
  665.  
  666.     HighGadg.SpecialInfo    = (APTR)&HighInfo;
  667.     LowGadg.SpecialInfo     = (APTR)&LowInfo;
  668.     ChannelGadg.SpecialInfo = (APTR)&ChannelInfo;
  669.  
  670.     HighInfo.Buffer      = HighBuff;
  671.     LowInfo.Buffer       = LowBuff;
  672.     ChannelInfo.Buffer   = ChannelBuff;
  673.     
  674.     AnswerRequest.OlderRequest = NULL;
  675.     AnswerRequest.LeftEdge     = 94; /*position*/
  676.     AnswerRequest.TopEdge      = 33;
  677.     AnswerRequest.Width        = 210;
  678.     AnswerRequest.Height       = 63;
  679.     AnswerRequest.RelLeft      = 0;
  680.     AnswerRequest.RelTop       = 0;
  681.     AnswerRequest.ReqGadget    = &WalkGadg;
  682.     AnswerRequest.ReqBorder    = &RequesterBorder;
  683.     AnswerRequest.ReqText      = &RequestTxt;
  684.     AnswerRequest.Flags        = 0;
  685.     AnswerRequest.BackFill     = 3;
  686.     AnswerRequest.ReqLayer     = NULL;
  687.     AnswerRequest.ImageBMap    = NULL;
  688.     AnswerRequest.RWindow      = w;
  689.     RequesterBorder.XY         = RequesterPairs;
  690.     sprintf (ChannelBuff, "%2d", Event->Channel + 1);
  691.     MIDItoPitchName (Event->HighPitch, HighBuff);
  692.     MIDItoPitchName (Event->LowPitch, LowBuff);
  693.     
  694.     Request (&AnswerRequest, w);
  695.     OnGadget (&WalkGadg, w, &AnswerRequest);
  696.     RefreshGadgets (&WalkGadg, w, &AnswerRequest);
  697.    Wait_Signal = 1L << w->UserPort->mp_SigBit;
  698.    while (Waiton)
  699.    {
  700.       Signal_Recvd = Wait (Wait_Signal);
  701.       if (!(Signal_Recvd & Wait_Signal))
  702.       {
  703.          continue;
  704.       }
  705.       while (message = (struct IntuiMessage *)GetMsg(w->UserPort))
  706.       {
  707.             if (message != NULL) 
  708.          {
  709.                 classb = message->Class;
  710.                 ReplyMsg ((struct Message *)message);
  711.             if (classb == REQSET)
  712.             {
  713.                Waiton = FALSE;
  714.             }
  715.          }
  716.       }
  717.    }
  718.    Waiton = TRUE;
  719.    ActivateGadget (&ChannelGadg, w, &AnswerRequest);
  720.  
  721.    while (Waiton)
  722.    {
  723.       Signal_Recvd = Wait (Wait_Signal);
  724.       if (!(Signal_Recvd & Wait_Signal))
  725.       {
  726.          continue;
  727.       }
  728.       while (message = (struct IntuiMessage *)GetMsg (w->UserPort))
  729.       {
  730.          if (message != NULL) 
  731.          {
  732.                 classb = message->Class;
  733.                 TempPtr = (struct Gadget *)message->IAddress;
  734.                 ReplyMsg ((struct Message *)message);
  735.                 if (classb == GADGETUP) 
  736.             {
  737.                     GadgetNum = TempPtr->GadgetID;
  738.                     switch (GadgetNum) 
  739.                {
  740.                        case 1: /*OK*/
  741.                           failure = 0;
  742.                           if (TempHigh > 0) 
  743.                      {
  744.                            Event->HighPitch = TempHigh;
  745.                           }
  746.                           if (TempLow > 0) 
  747.                      {
  748.                              Event->LowPitch =TempLow;
  749.                           }
  750.                           Event->Channel = TempChannel;
  751.                           Event->Walking = TempWalking;
  752.                           Waiton = FALSE;
  753.                           break;
  754.                        case 2: /*Cancel*/
  755.                            failure = 1;
  756.                            Waiton = FALSE;
  757.                         break;
  758.                        case 3: /*HighPitch*/
  759.                            failure = 0;
  760.                           TempHigh = PitchNametoMIDI (HighBuff);
  761.                         break;
  762.                        case 4: /*LowPitch*/
  763.                            failure = 0;
  764.                           TempLow = PitchNametoMIDI (LowBuff);
  765.                         break;
  766.                        case 5: /*Channel*/
  767.                         failure = 0;
  768.                           TempChannel = (atoi (ChannelBuff) - 1) & 0xF;
  769.                         break;
  770.                        case 6: /*Walking*/
  771.                            failure = 0;
  772.                            TempWalking = ((WalkGadg.Flags & SELECTED) != 0);
  773.                         break;
  774.                   default:
  775.                      break;
  776.                     }
  777.                 }
  778.             }
  779.       }
  780.     }
  781.     EndRequest (&AnswerRequest, w);
  782.     return failure;
  783. }
  784.  
  785. static int PitchNametoMIDI(char *PitchName)
  786. {
  787.     /* convert pitch name strings to MIDI note numbers */
  788.     /* C4 is middle C is MIDI 60 */
  789.     char TempString[4] = {0, 0, 0, 0};
  790.     int PitchMIDI;
  791.     const int SmallScale[7] = {9, 11, 0, 2, 4, 5, 7};
  792.  
  793.     if ((toupper(PitchName[0]) > 64) && (toupper(PitchName[0]) < 72))
  794.    {
  795.         PitchMIDI = SmallScale[toupper (PitchName[0])-65];
  796.     }
  797.     else return 0;
  798.     
  799.     if ((strlen (PitchName) < 2) || (strlen (PitchName) >3)) return 0;
  800.  
  801.     if (strlen (PitchName) == 3) 
  802.    {
  803.         switch (PitchName[1]) 
  804.       {
  805.             case 'b':
  806.                PitchMIDI = PitchMIDI - 1;
  807.                break;
  808.             case 'B':
  809.                PitchMIDI = PitchMIDI - 1;
  810.                break;
  811.             case '#':
  812.                PitchMIDI = PitchMIDI + 1;
  813.                break;
  814.          default:
  815.             break;
  816.         }
  817.     }
  818.     TempString[0] = PitchName[strlen (PitchName) - 1];
  819.     PitchMIDI = PitchMIDI + (12 * (atoi (TempString) + 1));
  820.     return PitchMIDI;
  821. }
  822.  
  823. static char *MIDItoPitchName (int NoteNum, char *PitchName) 
  824. {
  825.     /* convert MIDI note numbers to pitch name string */
  826.     /* C4 is middle C is MIDI 60 */
  827.     const char NoteNames[12][4] = 
  828.    {"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"};
  829.     sprintf (PitchName, "%s%1d", NoteNames[NoteNum % 12], (NoteNum/12)-1);
  830.     return PitchName;
  831. }
  832.  
  833.