/* gadgets.c */ /* Copyright 1990 Thomas E. Janzen All Rights Reserved */ /* ** FACILITY: ** ** AlgoRhythms music improviser on Commodore (TM) Amiga (TM) ** compiled with Lattice (TM) C 5.05 ** ** ABSTRACT: ** ** Algorhythms improvises music over the MIDI serial port. ** ** AUTHORS: Thomas E. Janzen ** ** CREATION DATE: 26-MAR-1990 ** ** MODIFICATION HISTORY: ** DATE NAME DESCRIPTION **-- */ #include #include #include #include #include #include #include #include #include #include #include #include #define STRINGSIZE 80 /*WINDOW*/ extern struct Window *w; /* GADGET */ #define GADGETTEXTDOWN (12) #define CLEFT (10) #define CTOP (6) #define GADGETWIDTH (300) #define GADGETHEIGHT (24) #define LEFTEDGE (-1) #define TOPEDGE (-1) #define REQUESTERTEXTDOWN (34) #define REQUESTERWIDTH (350) #define REQUESTERHEIGHT (47) /*for last routine*/ #define GADGETWIDE 230 #define GADGETHIGH 10 #define TOP 1 #define LEFT 100 extern struct GfxBase *GfxBase; extern struct IntuitionBase *IntuitionBase; extern struct DOSBase *DOSBase; extern struct MathBase *MathBase; char *MIDItoPitchName(int NoteNum, char *PitchName); int PitchNametoMIDI(char *PitchName); char *GetGadgetInput( char Previous[], char RemindString[], char PromptString[]) { register int classb; static char GadgetString[32]; static struct IntuiText GadgetTxt= {1,2,JAM2,10,GADGETTEXTDOWN,NULL,NULL,NULL}; static struct StringInfo StringStuff={NULL,NULL,0,STRINGSIZE,0,0,0,0, CLEFT,CTOP,NULL,0,NULL}; SHORT GadgetPairs[]= {0,0,GADGETWIDTH,0,GADGETWIDTH,GADGETHEIGHT,0, GADGETHEIGHT,0,0}; struct Border GadgetBorder= {LEFTEDGE,TOPEDGE,1,2,JAM1,5,NULL,NULL}; static struct Gadget StringBox = { NULL,2,6,GADGETWIDTH,GADGETHEIGHT, GADGHCOMP,RELVERIFY|STRINGCENTER, STRGADGET|REQGADGET, NULL,NULL,NULL,0L,NULL,1,NULL}; /*REQUESTER*/ static UBYTE RequestString[32]; static struct IntuiText RequestTxt={1,2,JAM2,10,REQUESTERTEXTDOWN, NULL,RequestString,NULL}; static SHORT RequesterPairs[]={0,0,REQUESTERWIDTH-1,0, REQUESTERWIDTH-1,REQUESTERHEIGHT-1,0,REQUESTERHEIGHT-1,0,0}; static struct Border RequesterBorder={0,0,1,0,JAM1,5,NULL,NULL}; struct Requester AnswerRequest; struct IntuiMessage *message; BOOL Waiton=TRUE; InitRequester(&AnswerRequest); strcpy(RequestString,RemindString); strcpy(GadgetString,PromptString); AnswerRequest.OlderRequest=NULL; AnswerRequest.LeftEdge=10; /*position*/ AnswerRequest.TopEdge=30; AnswerRequest.Width=REQUESTERWIDTH; AnswerRequest.Height=REQUESTERHEIGHT; AnswerRequest.RelLeft=0; AnswerRequest.RelTop=0; AnswerRequest.ReqGadget=&StringBox; AnswerRequest.ReqBorder=&RequesterBorder; AnswerRequest.ReqText=&RequestTxt; AnswerRequest.Flags=0; AnswerRequest.BackFill=3; AnswerRequest.ReqLayer=NULL; AnswerRequest.ImageBMap=NULL; AnswerRequest.RWindow = w; GadgetTxt.IText=GadgetString; GadgetBorder.XY=GadgetPairs; StringStuff.Buffer=Previous; StringStuff.UndoBuffer=Previous; StringBox.GadgetRender=(APTR)&GadgetBorder; StringBox.GadgetText=&GadgetTxt; StringBox.SpecialInfo=(APTR)&StringStuff; RequesterBorder.XY=RequesterPairs; Request(&AnswerRequest,w); OnGadget(&StringBox,w,&AnswerRequest); RefreshGadgets(&StringBox,w,&AnswerRequest); while (Waiton) { if(w->UserPort->mp_SigBit) { message=(struct IntuiMessage *)GetMsg(w->UserPort); if(message != NULL) { classb=message->Class; ReplyMsg((struct Message *)message); switch (classb) { case GADGETUP: EndRequest(&AnswerRequest,w); Waiton=FALSE; break; } } } } return Previous; } const char OKString[4]="OK"; const struct IntuiText OKTxt={1,2,JAM2,14,1,NULL,OKString,NULL}; const static SHORT OKPairs[]={0,0,41,0,41,12,0,12,0,0}; struct Border OKBorder={-1,-1,1,0,JAM1,5,OKPairs,NULL}; struct Gadget OKGadget = { NULL, /* next gadget */ 250,30,41,12, /*left , top, wide, high*/ GADGHCOMP,RELVERIFY|ENDGADGET, BOOLGADGET|REQGADGET, (APTR)&OKBorder,NULL,&OKTxt,0L,NULL,2,NULL}; struct PropInfo SliderInfo={ /*Flags*/AUTOKNOB|FREEHORIZ, 0x8000 /*HorizPot %*/,0x8000 /*VertPot*/, /*HorizBody*/ 0x100 ,/* VertBody*/ 0x0, 0 /*CWidth*/,0 /*CHeight*/,0 /*HpotRes*/,0 /*VPotRes*/, 0 /*LeftBorder*/,0 /*TopBorder*/ }; const SHORT SliderPairs[]={0,0,GADGETWIDTH,0,GADGETWIDTH,GADGETHEIGHT,0, GADGETHEIGHT,0,0}; const struct Border SliderBorder= {LEFTEDGE,TOPEDGE,1,2,JAM1,5,SliderPairs,NULL}; struct Gadget SliderGadget = { &OKGadget, 23,20,GADGETWIDTH,8, /* left,top,wide,high*/ GADGHCOMP,RELVERIFY|GADGIMMEDIATE, PROPGADGET|REQGADGET, (APTR)&SliderBorder,NULL,NULL,0L, (APTR)&SliderInfo,1,NULL}; /*REQUESTER*/ struct IntuiText RemindTxt={1,2,JAM2,5,30,NULL,NULL,NULL}; const UBYTE TitleString[32]="Phase in Radians"; const struct IntuiText TitleTxt={1,2,JAM2, 10 /*left */,1 /*top*/,NULL,TitleString,&RemindTxt}; const char PhaseString[]="-pi -pi/2 0 pi/2 pi"; struct IntuiText PhaseTxt={1,2,JAM2,25,11 /*text down*/,NULL, PhaseString,&TitleTxt}; SHORT RequesterPairs[]={0,0,REQUESTERWIDTH-1,0, REQUESTERWIDTH-1,REQUESTERHEIGHT-1,0,REQUESTERHEIGHT-1,0,0}; struct Border RequesterBorder={0,0,1,0,JAM1,5,NULL,NULL}; double GetPhaseInput(double Previous, char TypeString[]) { struct IntuiMessage *message; double Answer; USHORT GadgetNum; struct Gadget *TempPtr; register int classb; struct Requester PhaseRequest; BOOL Waiton=TRUE; InitRequester(&PhaseRequest); PhaseRequest.OlderRequest=NULL; PhaseRequest.LeftEdge=10; /*position*/ PhaseRequest.TopEdge=30; PhaseRequest.Width=REQUESTERWIDTH; PhaseRequest.Height=REQUESTERHEIGHT; PhaseRequest.RelLeft=0; PhaseRequest.RelTop=0; PhaseRequest.ReqGadget=&SliderGadget; PhaseRequest.ReqBorder=&RequesterBorder; PhaseRequest.ReqText=&PhaseTxt; PhaseRequest.Flags=0; PhaseRequest.BackFill=3; PhaseRequest.ReqLayer=NULL; PhaseRequest.ImageBMap=NULL; PhaseRequest.RWindow = w; RequesterBorder.XY=RequesterPairs; RemindTxt.IText=TypeString; if (fabs(Previous) > 3.141593) { Previous=(Previous/(fabs(Previous)))*(fabs(Previous)-3.141593); } SliderInfo.HorizPot= (short)(int)((double)10430*Previous+(double)0x8000); Request(&PhaseRequest,w); OnGadget(&SliderGadget,w,&PhaseRequest); RefreshGadgets(&SliderGadget,w,&PhaseRequest); while (Waiton) { if(w->UserPort->mp_SigBit) { message=(struct IntuiMessage *)GetMsg(w->UserPort); if(message != NULL) { classb=message->Class; TempPtr=(struct Gadget *)message->IAddress; ReplyMsg((struct Message *)message); if (classb == GADGETUP) { GadgetNum=TempPtr->GadgetID; } if (GadgetNum == 2) { switch (classb) { case GADGETUP: EndRequest(&PhaseRequest,w); Waiton=FALSE; Answer= ((95.9E-6)*(double)(SliderInfo.HorizPot))-3.141593; break; } } } } } return Answer; } int GetStringInput(char Previous[], char RemindString[], char PromptString[]) { int failure=0; USHORT GadgetNum; struct Gadget *TempPtr; char OKString[4]="OK"; struct IntuiText OKTxt={1,2,JAM2,14,1,NULL,NULL,NULL}; static SHORT OKPairs[]={0,0,41,0,41,12,0,12,0,0}; struct Border OKBorder={-1,-1,1,0,JAM1,5,NULL,NULL}; struct Gadget OKGadget = { NULL, /* next gadget */ 250,32,41,12, /*left , top, wide, high*/ GADGHCOMP,RELVERIFY|ENDGADGET, BOOLGADGET|REQGADGET, NULL,NULL,NULL,0L,NULL,1,NULL}; char QuitString[8]="Quit"; struct IntuiText QuitTxt={1,2,JAM2,4,1,NULL,NULL,NULL}; struct Gadget QuitGadget = { NULL, /* next gadget */ 190,32,41,12, /*left , top, wide, high*/ GADGHCOMP,RELVERIFY|ENDGADGET, BOOLGADGET|REQGADGET, NULL,NULL,NULL,0L,NULL,2,NULL}; register int classb; static char GadgetString[32]; static struct IntuiText GadgetTxt= {1,2,JAM2,10,GADGETTEXTDOWN,NULL,NULL,NULL}; static struct StringInfo StringStuff={NULL,NULL,0,STRINGSIZE,0,0,0,0, CLEFT,CTOP,NULL,0,NULL}; static SHORT GadgetPairs[]= {0,0,GADGETWIDTH,0,GADGETWIDTH,GADGETHEIGHT,0, GADGETHEIGHT,0,0}; static struct Border GadgetBorder= {LEFTEDGE,TOPEDGE,1,2,JAM1,5,NULL,NULL}; static struct Gadget StringBox = { NULL,2,6,GADGETWIDTH,GADGETHEIGHT, GADGHCOMP,RELVERIFY|STRINGCENTER, STRGADGET|REQGADGET, NULL,NULL,NULL,0L,NULL,1,NULL}; /*REQUESTER*/ static UBYTE RequestString[32]; static struct IntuiText RequestTxt={1,2,JAM2,10,REQUESTERTEXTDOWN, NULL,RequestString,NULL}; static SHORT RequesterPairs[]={0,0,REQUESTERWIDTH-1,0, REQUESTERWIDTH-1,REQUESTERHEIGHT-1+25,0,REQUESTERHEIGHT-1+25,0,0}; static struct Border RequesterBorder={0,0,1,0,JAM1,5,NULL,NULL}; struct Requester AnswerRequest; struct IntuiMessage *message; BOOL Waiton=TRUE; InitRequester(&AnswerRequest); OKGadget.NextGadget=&QuitGadget; OKBorder.XY=OKPairs; OKGadget.GadgetRender=(APTR)&OKBorder; OKGadget.GadgetText=&OKTxt; QuitGadget.GadgetRender=(APTR)&OKBorder; QuitTxt.IText=QuitString; QuitGadget.GadgetText=&QuitTxt; OKTxt.IText=OKString; StringBox.NextGadget=&OKGadget; strcpy(RequestString,RemindString); strcpy(GadgetString,PromptString); AnswerRequest.OlderRequest=NULL; AnswerRequest.LeftEdge=10; /*position*/ AnswerRequest.TopEdge=30; AnswerRequest.Width=REQUESTERWIDTH; AnswerRequest.Height=REQUESTERHEIGHT; AnswerRequest.RelLeft=0; AnswerRequest.RelTop=0; AnswerRequest.ReqGadget=&StringBox; AnswerRequest.ReqBorder=&RequesterBorder; AnswerRequest.ReqText=&RequestTxt; AnswerRequest.Flags=0; AnswerRequest.BackFill=3; AnswerRequest.ReqLayer=NULL; AnswerRequest.ImageBMap=NULL; AnswerRequest.RWindow = w; GadgetTxt.IText=GadgetString; GadgetBorder.XY=GadgetPairs; StringStuff.Buffer=Previous; StringStuff.UndoBuffer=Previous; StringBox.GadgetRender=(APTR)&GadgetBorder; StringBox.GadgetText=&GadgetTxt; StringBox.SpecialInfo=(APTR)&StringStuff; RequesterBorder.XY=RequesterPairs; Request(&AnswerRequest,w); OnGadget(&StringBox,w,&AnswerRequest); RefreshGadgets(&StringBox,w,&AnswerRequest); while (Waiton) { if(w->UserPort->mp_SigBit) { message=(struct IntuiMessage *)GetMsg(w->UserPort); if(message != NULL) { classb=message->Class; TempPtr=(struct Gadget *)message->IAddress; ReplyMsg((struct Message *)message); if(classb == GADGETUP) { GadgetNum=TempPtr->GadgetID; switch(GadgetNum) { case 0: /*got string*/ failure=0; break; case 1: /*string OK*/ failure=0; break; case 2: /*quit*/ failure=1; break; } EndRequest(&AnswerRequest,w); Waiton=FALSE; break; } } } } return failure; } #include "AlgoRhythms.h" int GetChannelStuff(struct NoteEvent *Event, int Number) { /* TempWalking is int */ /* ->Walking is int*/ /* Gadget.Flags is USHORT*/ int TempHigh,TempLow,TempChannel,TempWalking; char OKString[4]="OK"; /* L T txt next*/ struct IntuiText OKTxt={1,2,JAM2,24,1,NULL,NULL,NULL}; static SHORT OKPairs[]={0,0,61,0,61,12,0,12,0,0}; /* XY */ struct Border OKBorder={-1,-1,1,0,JAM1,5,NULL,NULL}; struct Gadget OKGadget = {NULL, /* next gadget */ 185,67,61,12, /*left , top, wide, high*/ GADGHCOMP,RELVERIFY|ENDGADGET,BOOLGADGET|REQGADGET, NULL,NULL,NULL,0L,NULL,1,NULL}; char CancelString[8]="Cancel"; struct IntuiText CancelTxt={1,2,JAM2,4,1,NULL,NULL,NULL}; struct Gadget CancelGadget = {NULL, /* next gadget */ 5,67,61,12, /*left , top, wide, high*/ GADGHCOMP,RELVERIFY|ENDGADGET,BOOLGADGET|REQGADGET, NULL,NULL,NULL,0L,NULL,2,NULL}; static UBYTE HighString[16]="High Note"; static struct IntuiText HighTxt={1,2,JAM2,1,-8,NULL,NULL,NULL}; static char HighBuff[80]; static struct StringInfo HighInfo={NULL,NULL,0,STRINGSIZE,0,0,0,0, LEFT,TOP,NULL,0,NULL}; static USHORT HighPairs[10]={0,0,GADGETWIDE,0, GADGETWIDE,8,0,8,0,0}; static struct Border HighBorder= {LEFTEDGE,TOPEDGE,1,2,JAM1,5,NULL,NULL}; static struct Gadget HighGadg = {NULL,2,8,GADGETWIDE,GADGETHIGH, GADGHCOMP,RELVERIFY|STRINGCENTER,STRGADGET|REQGADGET, NULL,NULL,NULL,0L,NULL,3,NULL}; static UBYTE LowString[16]="Low Note"; static struct IntuiText LowTxt={1,2,JAM2,1,-8,NULL,NULL,NULL}; static char LowBuff[80]; static struct StringInfo LowInfo={NULL,NULL,0,STRINGSIZE,0,0,0,0, LEFT,TOP,NULL,0,NULL}; static struct Gadget LowGadg = {NULL,2,24,GADGETWIDE,GADGETHIGH, GADGHCOMP,RELVERIFY|STRINGCENTER,STRGADGET|REQGADGET, NULL,NULL,NULL,0L,NULL,4,NULL}; static UBYTE ChannelString[16]="Channel"; static struct IntuiText ChannelTxt= {1,2,JAM2,1,-8,NULL,NULL,NULL}; static char ChannelBuff[80]; static struct StringInfo ChannelInfo={NULL,NULL,0,STRINGSIZE,0,0,0,0, LEFT,TOP,NULL,0,NULL}; static struct Gadget ChannelGadg = {NULL,2,40,GADGETWIDE,GADGETHIGH, GADGHCOMP,RELVERIFY|STRINGCENTER, LONGINT|STRGADGET|REQGADGET,NULL,NULL,NULL,0L,NULL,5,NULL}; static UBYTE WalkString[16]="Walk"; static struct IntuiText WalkTxt= {1,2,JAM2,15,1,NULL,NULL,NULL}; static struct Gadget WalkGadg = {NULL,95,67,61,12, GADGHCOMP,TOGGLESELECT|RELVERIFY, BOOLGADGET|REQGADGET,NULL,NULL,NULL,0L,NULL,6,NULL}; /*REQUESTER*/ static UBYTE RequestString[48]; static struct IntuiText RequestTxt={1,2,JAM2,55,50, NULL,RequestString,NULL}; static SHORT RequesterPairs[]={0,0,249,0,249,79,0,79,0,0}; static struct Border RequesterBorder={0,0,1,0,JAM1,5,NULL,NULL}; struct Requester AnswerRequest; struct IntuiMessage *message; register int classb; int failure=0; USHORT GadgetNum; struct Gadget *TempPtr; BOOL Waiton=TRUE; sprintf(RequestString,"%s %2d","Setup Channel",Number); TempHigh=Event->HighPitch; TempLow=Event->LowPitch; TempWalking=Event->Walking; TempChannel=Event->Channel; InitRequester(&AnswerRequest); /*NEW*/ if(Event->Walking) { WalkGadg.Flags |= SELECTED; } else { WalkGadg.Flags &= ~(SELECTED); } OKGadget.NextGadget = NULL; CancelGadget.NextGadget=&OKGadget; HighGadg.NextGadget=&CancelGadget; LowGadg.NextGadget=&HighGadg; ChannelGadg.NextGadget=&LowGadg; WalkGadg.NextGadget=&ChannelGadg; /*NEW STRINGS*/ OKTxt.IText=OKString; CancelTxt.IText=CancelString; HighTxt.IText=HighString; LowTxt.IText=LowString; ChannelTxt.IText=ChannelString; WalkTxt.IText=WalkString; /*NEW PAIRS*/ OKBorder.XY=OKPairs; HighBorder.XY=HighPairs; /*NEW Borders*/ OKGadget.GadgetRender = (APTR)&OKBorder; CancelGadget.GadgetRender = (APTR)&OKBorder; HighGadg.GadgetRender = (APTR)&HighBorder; LowGadg.GadgetRender = (APTR)&HighBorder; WalkGadg.GadgetRender = (APTR)&OKBorder; /*New txts*/ OKGadget.GadgetText=&OKTxt; CancelGadget.GadgetText=&CancelTxt; HighGadg.GadgetText=&HighTxt; LowGadg.GadgetText=&LowTxt; ChannelGadg.GadgetText=&ChannelTxt; WalkGadg.GadgetText=&WalkTxt; /*NEW INFO*/ HighGadg.SpecialInfo=(APTR)&HighInfo; LowGadg.SpecialInfo=(APTR)&LowInfo; ChannelGadg.SpecialInfo=(APTR)&ChannelInfo; /*New BUFFS*/ HighInfo.Buffer=HighBuff; LowInfo.Buffer=LowBuff; ChannelInfo.Buffer=ChannelBuff; AnswerRequest.OlderRequest=NULL; AnswerRequest.LeftEdge=4; /*position*/ AnswerRequest.TopEdge=3; AnswerRequest.Width=250; AnswerRequest.Height=80; AnswerRequest.RelLeft=0; AnswerRequest.RelTop=0; AnswerRequest.ReqGadget=&WalkGadg; AnswerRequest.ReqBorder=&RequesterBorder; AnswerRequest.ReqText=&RequestTxt; AnswerRequest.Flags=0; AnswerRequest.BackFill=3; AnswerRequest.ReqLayer=NULL; AnswerRequest.ImageBMap=NULL; AnswerRequest.RWindow = w; RequesterBorder.XY=RequesterPairs; sprintf(ChannelBuff,"%2d",Event->Channel); MIDItoPitchName(Event->HighPitch,HighBuff); MIDItoPitchName(Event->LowPitch,LowBuff); Request(&AnswerRequest,w); OnGadget(&WalkGadg,w,&AnswerRequest); RefreshGadgets(&WalkGadg,w,&AnswerRequest); while (Waiton) { if(w->UserPort->mp_SigBit) { message=(struct IntuiMessage *)GetMsg(w->UserPort); if(message != NULL) { classb=message->Class; TempPtr=(struct Gadget *)message->IAddress; ReplyMsg((struct Message *)message); if(classb == GADGETUP) { GadgetNum=TempPtr->GadgetID; switch(GadgetNum) { case 1: /*OK*/ failure=0; if(TempHigh > 0) { Event->HighPitch=TempHigh; } if(TempLow > 0) { Event->LowPitch =TempLow; } Event->Channel=TempChannel; Event->Walking=TempWalking; Waiton=FALSE; break; case 2: /*Cancel*/ failure=1; Waiton=FALSE; break; case 3: /*HighPitch*/ failure=0; TempHigh=PitchNametoMIDI(HighBuff); break; case 4: /*LowPitch*/ failure=0; TempLow=PitchNametoMIDI(LowBuff); break; case 5: /*Channel*/ failure=0; TempChannel=atoi(ChannelBuff); break; case 6: /*Walking*/ failure=0; TempWalking = ((WalkGadg.Flags & SELECTED) != 0); break; } } } } } EndRequest(&AnswerRequest,w); return failure; } char *MIDItoPitchName(int NoteNum, char *PitchName) { const char NoteNames[12][4]={"C","C#","D","D#","E","F","F#","G", "G#","A","A#","B"}; sprintf(PitchName,"%s%1d",NoteNames[NoteNum % 12],(NoteNum/12)-1); return PitchName; } int PitchNametoMIDI(char *PitchName) { char TempString[4]={0,0,0,0}; int PitchMIDI; const int SmallScale[7]={9,11,0,2,4,5,7}; if((toupper(PitchName[0]) > 64) && (toupper(PitchName[0])<72)) { PitchMIDI = SmallScale[toupper(PitchName[0])-65]; } else { return 0; } if((strlen(PitchName) < 2) || (strlen(PitchName) >3)) return 0; if (strlen(PitchName) == 3) { switch (PitchName[1]) { case 'b': PitchMIDI = PitchMIDI-1; break; case 'B': PitchMIDI = PitchMIDI-1; break; case '#': PitchMIDI = PitchMIDI + 1; break; } } TempString[0]=PitchName[strlen(PitchName)-1]; PitchMIDI=PitchMIDI+(12*(atoi(TempString)+1)); return PitchMIDI; }