home *** CD-ROM | disk | FTP | other *** search
- /**************************************************************/
- /* $VER: SY22.c Revison 1.1 */
- /* This file is part of Synth Librarian v1.1 */
- /* ©1993-1994 Jean-Alexis MONTIGNIES */
- /* This file must not be distributed modified or separatly */
- /* without my written permission */
- /* See Synth_Librarian.guide for more details */
- /**************************************************************/
-
- #include <proto/exec.h>
- #include <stdlib.h>
- #include <math.h>
- #include <string.h>
- #include <stdio.h>
- #include <intuition/intuition.h>
- #include <proto/intuition.h>
-
- #include "SynthLib.h"
- #include <libraries/locale.h>
- #include <proto/locale.h>
- #define CATCOMP_BLOCK
- #define CATCOMP_NUMBERS
- #include "Sy22loc.h"
-
- #define STEPD_CHECK_YAMAHA 0
- #define STEPD_G1P 1
- #define STEPD_G1P_DATA 2
- #define STEPD_GP_LENGTH 3
- #define STEPD_GP_DATA 4
-
- #define STEPD_WAIT_SYSEX 5
- #define STEPD_WAIT_YAMAHA 6
-
- #define STEPD_WAIT100 0
- #define STEPD_S1P 1
- #define STEPD_SEND_END 2
-
- #define TYPE_VOICE &SY22TypesNodes[0]
- #define TYPE_ALL &SY22TypesNodes[1]
-
- #define BUFFER_SIZE 40000L
-
- struct LocaleInfo DLi;
- #ifndef DEBUG_SL
- struct Library *LocaleBase;
- struct DosBase *DOSBase;
- struct ExecBase *SysBase;
- struct IntuitionBase *IntuitionBase ;
- #endif
-
- char Message[256];
- static struct DriverData DD;
- extern struct MinList SY22TypesList;
- struct Node SY22TypesNodes[] = {
- &SY22TypesNodes[1], ( struct Node * )&SY22TypesList.mlh_Head, 0, 0, "SY22 Voice",
- ( struct Node * )&SY22TypesList.mlh_Tail, &SY22TypesNodes[0], 0, 0, "SY22 All" };
-
- struct MinList SY22TypesList = {
- ( struct MinNode * )&SY22TypesNodes[0], ( struct MinNode * )NULL, ( struct MinNode * )&SY22TypesNodes[1] };
- struct EasyStruct AboutES_SY22 = {
- sizeof (struct EasyStruct),
- 0,
- NULL,
- NULL,
- NULL
- };
-
-
- struct DriverData * InitDriver(ULONG (*GetData)(ULONG Number));
- void Close(void);
- STRPTR GetString_SY22(struct LocaleInfo *li, LONG stringNum);
- ULONG Driver(ULONG *StepPtr,struct Exchange *Ex);
- STRPTR About(void);
- struct Node* RecognizeNode2(struct DumpNode *Node,int *Error);
- struct Node* RecognizeNode(struct DumpNode *Node);
- int CheckYamaha(struct DumpNode *Node);
-
- __saveds struct DriverData *InitDriver(ULONG (*GetData)(ULONG Number))
- {
- #ifndef DEBUG_SL
- DOSBase=(struct DosBase *)GetData(GTD_DosBase);
- SysBase=(struct ExecBase *)GetData(GTD_ExecBase);
- LocaleBase=(struct LocaleBase *)GetData(GTD_LocaleBase);
- IntuitionBase=(struct IntuitionBase *)GetData(GTD_IntuitionBase);
- #endif
-
- if (DLi.li_LocaleBase=LocaleBase)
- DLi.li_Catalog=OpenCatalog(NULL,"SynthLib/SY22.catalog",OC_BuiltInLanguage,"english",TAG_DONE);
-
- DD.Flags=0;
- DD.Driver=Driver;
- DD.Close=Close;
- DD.About=About;
- DD.TypeList=&SY22TypesList;
- DD.Recognize=RecognizeNode;
-
- return(&DD);
- }
-
- __saveds void Close(void)
- {if (LocaleBase)
- CloseCatalog(DLi.li_Catalog);
- }
-
- __saveds STRPTR About()
- {return(GetString_SY22(&DLi,MSGD_ABOUT));
- }
-
- __saveds ULONG Driver(ULONG *StepPtr,struct Exchange *Ex)
- {static UBYTE * BufferSY22;
- static StepD;
- static USHORT PacketLength;
- static struct Node *Type;
- static struct DumpNode *Node;
- static UBYTE NPackets;
- static ULONG DataLength;
- static UBYTE * DataPtr;
- ULONG ReturnCode=0;
- int Error;
-
- switch(*StepPtr)
- {
- case STEP_INIT_DRIVER:
-
- BufferSY22=NULL;
-
- break;
-
- case STEP_EXIT_DRIVER:
- case STEP_ABORT:
- if (BufferSY22)
- {BufferSY22=0;
- FreeMem(BufferSY22,BUFFER_SIZE);
- }
-
- break;
-
- case STEP_START:
- if (!BufferSY22)
- BufferSY22=AllocMem(BUFFER_SIZE,0L);
- if (BufferSY22)
- {
- BufferSY22[0]=0xF0;
- Ex->DataPtr=BufferSY22+1;
- Ex->Length=3;
- *StepPtr=STEP_RECIEVE;
- StepD=STEPD_CHECK_YAMAHA;
- }
- else
- {Ex->Message=GetString_SY22(&DLi,ERRORD_OUT_OF_MEMORY);
- ReturnCode=1;
- *StepPtr=STEP_WAIT;
- }
-
- break;
-
- case STEP_CONTINUE:
- switch(StepD)
- {case STEPD_CHECK_YAMAHA:
- if (Ex->DataPtr[-3]==0x43 && !(Ex->DataPtr[-2]&0xF0) && Ex->DataPtr[-1]==0x7E)
- {StepD=STEPD_G1P;
- Ex->Length=2;
- *StepPtr=STEP_RECIEVE;
- }
- else
- *StepPtr=STEP_WAIT;
-
- break;
-
- case STEPD_G1P:
- PacketLength=(((UWORD)Ex->DataPtr[-2])<<7)+Ex->DataPtr[-1];
-
- if (BUFFER_SIZE+(BufferSY22-Ex->DataPtr)<PacketLength+1)
- {Ex->Message=GetString_SY22(&DLi,ERRORD_TOO_MANY_DATA);
- ReturnCode=1;
- *StepPtr=STEP_WAIT;
- }
- else
- {*StepPtr=STEP_RECIEVE;
- Ex->Length=PacketLength+1;
- StepD=STEPD_G1P_DATA;
- sprintf(Message,GetString_SY22(&DLi,MSGD_RECIEVEPACKET),1);
- Ex->Message=Message;
- }
-
- break;
-
- case STEPD_G1P_DATA:
- Type=0;
- NPackets=1;
-
- if (!memcmp(&(Ex->DataPtr[-PacketLength-1]),"PK 2203AE",10))
- Type=TYPE_VOICE;
- else
- if (!memcmp(&(Ex->DataPtr[-PacketLength-1]),"PK 2203VM",10))
- Type=TYPE_ALL;
-
- if (Type)
- {
- *StepPtr=STEP_RECIEVE_EOF;
- Ex->Length=2;
- Ex->Data1=0xF7F7F7F7;
- StepD=STEPD_GP_LENGTH;
- }
- else
- {*StepPtr=STEP_WAIT;
- Ex->Message=GetString_SY22(&DLi,ERRORD_UNKNOWN_FORMAT);
- ReturnCode=1;
- }
-
- break;
-
- case STEPD_GP_LENGTH:
-
- if (Ex->DataPtr[-1]!=0xF7)
- {PacketLength=(((UWORD)Ex->DataPtr[-2])<<7)+Ex->DataPtr[-1];
-
- if (BUFFER_SIZE+(BufferSY22-Ex->DataPtr)<PacketLength+1)
- {Ex->Message=GetString_SY22(&DLi,ERRORD_TOO_MANY_DATA);
- ReturnCode=1;
- *StepPtr=STEP_WAIT;
- }
- else
- {*StepPtr=STEP_RECIEVE;
- Ex->Length=PacketLength+1;
- StepD=STEPD_GP_DATA;
- sprintf(Message,GetString_SY22(&DLi,MSGD_RECIEVEPACKET),NPackets+1);
- Ex->Message=Message;
- }
- }
- else
- {DataLength=Ex->DataPtr-BufferSY22;
- if (Node=AllocMem(sizeof(struct DumpNode),0L))
- {
- Node->Data=NULL;
- Node->DataLength=0;
- Node->DumpLength=DataLength;
- Node->Name[0]='\0';
- Node->Flags=0;
- Ex->Node=Node;
- strcpy(Node->Type,Type->ln_Name);
- if (Type==TYPE_VOICE)
- {Ex->Message=GetString_SY22(&DLi,MSGD_RECIEVEENDVOICE);
- memcpy(Node->Name,BufferSY22+19,8);
- Node->Name[8]='\0';
- }
- if (Type==TYPE_ALL)
- {Ex->Message=GetString_SY22(&DLi,MSGD_RECIEVEENDALL);
- }
- if (Node->Dump=AllocMem(DataLength,0L))
- {memcpy(Node->Dump,BufferSY22,DataLength);
-
- Ex->DataPtr=(APTR)Node;
- *StepPtr=STEP_RECIEVE_COMPLETE;
- }
- else
- {Ex->Message=GetString_SY22(&DLi,ERRORD_OUT_OF_MEMORY);
- ReturnCode=1;
- *StepPtr=STEP_WAIT;
- FreeMem(Node,sizeof(struct DumpNode));
- }
- }
- else
- {Ex->Message=GetString_SY22(&DLi,ERRORD_OUT_OF_MEMORY);
- ReturnCode=1;
- *StepPtr=STEP_WAIT;
- }
- FreeMem(BufferSY22,BUFFER_SIZE);
- BufferSY22=0;
- }
-
- break;
-
- case STEPD_GP_DATA:
- NPackets++;
-
- *StepPtr=STEP_RECIEVE_EOF;
- Ex->Length=2;
- Ex->Data1=0xF7F7F7F7;
- StepD=STEPD_GP_LENGTH;
-
- break;
- }
- break;
-
- case STEP_SEND_ABORT:
-
- break;
-
-
- case STEP_SEND_START:
- Node=(struct DumpNode *)Ex->Node;
- Type=0;
- NPackets=0;
-
- Type=RecognizeNode2(Node,&Error);
-
- if (Error)
- { Ex->Message=GetString_SY22(&DLi,Error);
- ReturnCode=1;
- *StepPtr=STEP_SEND_COMPLETE;
- }
-
- if (Type==TYPE_VOICE)
- {sprintf(Message,GetString_SY22(&DLi,MSGD_SENDVOICE),Node->Name);
- Ex->Message=Message;
- }
-
- if (Type==TYPE_ALL)
- {sprintf(Message,GetString_SY22(&DLi,MSGD_SENDALLPACKET),1);
- Ex->Message=Message;
- }
-
- if (Type)
- {DataPtr=Node->Dump;
- Ex->DataPtr=DataPtr;
- PacketLength=(((UWORD)Ex->DataPtr[4])<<7)+Ex->DataPtr[5];
- Ex->Length=PacketLength+7;
- DataPtr+=Ex->Length;
- *StepPtr=STEP_SEND_SEND;
- StepD=STEPD_WAIT100;
- }
-
- break;
-
- case STEP_SEND_CONTINUE:
- switch(StepD)
- {case STEPD_WAIT100:
-
- NPackets++;
-
- if (DataPtr[0]==0xF7)
- {Ex->Length=1;
- Ex->DataPtr=DataPtr;
- *StepPtr=STEP_SEND_SEND;
- StepD=STEPD_SEND_END;
- }
- else
- {
- Ex->Data1=100000;
- *StepPtr=STEP_SEND_DELAY;
- StepD=STEPD_S1P;
- }
-
- break;
-
- case STEPD_S1P:
- PacketLength=(((UWORD)DataPtr[0])<<7)+DataPtr[1];
- Ex->Length=PacketLength+3;
- Ex->DataPtr=DataPtr;
- DataPtr+=Ex->Length;
-
- Ex->Message=Message;
- sprintf(Message,GetString_SY22(&DLi,MSGD_SENDALLPACKET),NPackets+1);
-
- *StepPtr=STEP_SEND_SEND;
- StepD=STEPD_WAIT100;
-
- break;
-
- case STEPD_SEND_END:
- *StepPtr=STEP_SEND_COMPLETE;
- Ex->Message=Message;
- sprintf(Message,GetString_SY22(&DLi,MSGD_SENDEND),Node->Name);
-
- }
- break;
-
- case STEP_REQ_START:
- Node=Ex->Node;
- Ex->Node=NULL;
- Type=0;
- NPackets=0;
-
- if (!strcmp(((struct Node *)Node)->ln_Name,"SY22 Voice"))
- {Ex->DataPtr="\xF0\x43 \x7EPK 2203AE\xF7";
- Type=TYPE_VOICE;
- }
- else
- if (!strcmp(((struct Node *)Node)->ln_Name,"SY22 All"))
- {Ex->DataPtr="\xF0\x43 \x7EPK 2203VM\xF7";
- Type=TYPE_ALL;
- }
-
- if (Type)
- {
- Ex->Length=15;
- *StepPtr=STEP_REQ_SEND;
- StepD=STEPD_WAIT_SYSEX;
- }
- else
- {Ex->Message=GetString_SY22(&DLi,ERRORD_UNKNOWN_TYPE);
- ReturnCode=1;
- *StepPtr=STEP_REQ_COMPLETE;
- }
-
- break;
-
- case STEP_REQ_ABORT:
- if (BufferSY22)
- {BufferSY22=0;
- FreeMem(BufferSY22,BUFFER_SIZE);
- }
-
- break;
-
- case STEP_REQ_CONTINUE:
- switch(StepD)
- {
- case STEPD_WAIT_SYSEX:
- if (!BufferSY22)
- BufferSY22=AllocMem(BUFFER_SIZE,0L);
- if (!BufferSY22)
- {Ex->Message=GetString_SY22(&DLi,ERRORD_OUT_OF_MEMORY);
- ReturnCode=1;
- *StepPtr=STEP_REQ_COMPLETE;
- }
- else
- {*StepPtr=STEP_REQ_WAIT;
- StepD=STEPD_WAIT_YAMAHA;
- }
-
- break;
-
- case STEPD_WAIT_YAMAHA:
- BufferSY22[0]=0xF0;
- Ex->DataPtr=BufferSY22+1;
- Ex->Length=3;
- *StepPtr=STEP_REQ_RECIEVE;
- StepD=STEPD_CHECK_YAMAHA;
-
- break;
-
- case STEPD_CHECK_YAMAHA:
- if (Ex->DataPtr[-3]==0x43 && !(Ex->DataPtr[-2]&0xF0) && Ex->DataPtr[-1]==0x7E)
- {StepD=STEPD_G1P;
- Ex->Length=2;
- *StepPtr=STEP_REQ_RECIEVE;
- }
- else
- {
- *StepPtr=STEP_REQ_COMPLETE;
- Ex->Message=GetString_SY22(&DLi,ERRORD_UNEXPECTED_ANSWER);
- ReturnCode=1;
- }
-
- break;
-
- case STEPD_G1P:
- PacketLength=(((UWORD)Ex->DataPtr[-2])<<7)+Ex->DataPtr[-1];
-
- if (BUFFER_SIZE+(BufferSY22-Ex->DataPtr)<PacketLength+1)
- {
- Ex->Message=GetString_SY22(&DLi,ERRORD_TOO_MANY_DATA);
- ReturnCode=1;
- *StepPtr=STEP_REQ_COMPLETE;
- }
- else
- {*StepPtr=STEP_REQ_RECIEVE;
- Ex->Length=PacketLength+1;
- StepD=STEPD_G1P_DATA;
- Ex->Message=Message;
- sprintf(Message,GetString_SY22(&DLi,MSGD_RECIEVEPACKET),1);
- }
-
- break;
-
- case STEPD_G1P_DATA:
- NPackets=1;
-
- if (Type==TYPE_VOICE)
- if (memcmp(&(Ex->DataPtr[-PacketLength-1]),"PK 2203AE",10))
- Type=0;
-
- if (Type==TYPE_ALL)
- if (memcmp(&(Ex->DataPtr[-PacketLength-1]),"PK 2203VM",10))
- Type=0;
-
- if (Type)
- {
- *StepPtr=STEP_REQ_RECIEVE_EOF;
- Ex->Length=2;
- Ex->Data1=0xF7F7F7F7;
- StepD=STEPD_GP_LENGTH;
- }
- else
- {*StepPtr=STEP_REQ_COMPLETE;
- ReturnCode=1;
- Ex->Message=GetString_SY22(&DLi,ERRORD_UNEXPECTED_ANSWER);
- }
-
- break;
-
- case STEPD_GP_LENGTH:
-
- if (Ex->DataPtr[-1]!=0xF7)
- {PacketLength=(((UWORD)Ex->DataPtr[-2])<<7)+Ex->DataPtr[-1];
-
- if (BUFFER_SIZE+(BufferSY22-Ex->DataPtr)<PacketLength+1)
- {Ex->Message=GetString_SY22(&DLi,ERRORD_TOO_MANY_DATA);
- ReturnCode=1;
- *StepPtr=STEP_REQ_COMPLETE;
- }
- else
- {*StepPtr=STEP_REQ_RECIEVE;
- Ex->Length=PacketLength+1;
- StepD=STEPD_GP_DATA;
- Ex->Message=Message;
- sprintf(Message,GetString_SY22(&DLi,MSGD_RECIEVEPACKET),NPackets+1);
- }
- }
- else
- {DataLength=Ex->DataPtr-BufferSY22;
- if (Node=AllocMem(sizeof(struct DumpNode),0L))
- {
- Node->Data=NULL;
- Node->DataLength=0;
- Node->DumpLength=DataLength;
- Node->Name[0]='\0';
- Node->Flags=0;
- Ex->Node=Node;
- strcpy(Node->Type,Type->ln_Name);
- if (Type==TYPE_VOICE)
- {Ex->Message=GetString_SY22(&DLi,MSGD_RECIEVEENDVOICE);
- memcpy(Node->Name,BufferSY22+19,8);
- Node->Name[8]='\0';
- }
- if (Type==TYPE_ALL)
- {Ex->Message=GetString_SY22(&DLi,MSGD_RECIEVEENDALL);
- }
- if (Node->Dump=AllocMem(DataLength,0L))
- {memcpy(Node->Dump,BufferSY22,DataLength);
-
- Ex->DataPtr=(APTR)Node;
- *StepPtr=STEP_REQ_COMPLETE;
- }
- else
- {Ex->Message=GetString_SY22(&DLi,ERRORD_OUT_OF_MEMORY);
- ReturnCode=1;
- *StepPtr=STEP_REQ_COMPLETE;
- FreeMem(Node,sizeof(struct DumpNode));
- }
- }
- else
- {Ex->Message=GetString_SY22(&DLi,ERRORD_OUT_OF_MEMORY);
- ReturnCode=1;
- *StepPtr=STEP_REQ_COMPLETE;
- }
- FreeMem(BufferSY22,BUFFER_SIZE);
- BufferSY22=0;
- }
-
- break;
-
- case STEPD_GP_DATA:
- NPackets++;
-
- *StepPtr=STEP_REQ_RECIEVE_EOF;
- Ex->Length=2;
- Ex->Data1=0xF7F7F7F7;
- StepD=STEPD_GP_LENGTH;
-
- break;
- }
- break;
-
- }
- return(ReturnCode);
- }
-
- __saveds struct Node* RecognizeNode(struct DumpNode *Node)
- {
- int Dummy;
-
- return (RecognizeNode2(Node,&Dummy));
- }
-
- struct Node* RecognizeNode2(struct DumpNode *Node,int *Error)
- {
- struct Node *Type=NULL;
-
- if (!(*Error=CheckYamaha(Node)))
- if (Node->DumpLength>=18)
- {
- if (!memcmp(&(Node->Dump[6]),"PK 2203AE",10))
- Type=TYPE_VOICE;
- else
- if (!memcmp(&(Node->Dump[6]),"PK 2203VM",10))
- Type=TYPE_ALL;
- else
- *Error=ERRORD_UNKNOWN_TYPE;
- }
-
- return (Type);
- }
-
- int CheckYamaha(struct DumpNode *Node)
- {
- char *Dump;
- char CheckSum;
- short Length;
- char *End;
- int ReturnCode=0;
- int Stop=0;
- long i;
-
- if (Node)
- {
- Dump=Node->Dump;
-
- if (Dump)
- { End=Dump+Node->DumpLength;
-
- if (Node->DumpLength>7)
- if (Dump[1]==0x43)
- if (!(Dump[2]&0xF))
- if (Dump[3]==0x7E)
- { Dump+=4;
- do
- {
- CheckSum=0;
- if (Dump+2<=End)
- { Length=Dump[1]+(Dump[0]<<7);
- Dump+=2;
-
- if (Dump+Length+2<=End)
- {
- for (i=0;i<Length;i++)
- CheckSum+=Dump[i];
-
- Dump+=Length;
- if ((*(Dump++)+CheckSum)& 0x7F)
- ReturnCode=ERRORD_BAD_CHECKSUM;
-
- if (*Dump=='\xF7')
- Stop=1;
- }
- else
- ReturnCode=ERRORD_UNKNOWN_TYPE;
- }
- else
- ReturnCode=ERRORD_UNKNOWN_TYPE;
- }
- while (!ReturnCode && !Stop);
- }
- else
- ReturnCode=ERRORD_UNKNOWN_TYPE;
- else
- ReturnCode=ERRORD_UNKNOWN_TYPE;
- else
- ReturnCode=ERRORD_UNKNOWN_TYPE;
- else
- ReturnCode=ERRORD_UNKNOWN_TYPE;
- }
- }
- else
- ReturnCode=ERRORD_UNKNOWN_TYPE;
-
- return ReturnCode;
- }
-
- STRPTR GetString_SY22(struct LocaleInfo *li, LONG stringNum)
- {
- LONG *l;
- UWORD *w;
- STRPTR builtIn;
-
- l = (LONG *)CatCompBlock;
-
- while (*l != stringNum)
- {
- w = (UWORD *)((ULONG)l + 4);
- l = (LONG *)((ULONG)l + (ULONG)*w + 6);
- }
- builtIn = (STRPTR)((ULONG)l + 6);
-
- if (LocaleBase)
- return(GetCatalogStr(li->li_Catalog,stringNum,builtIn));
-
- return(builtIn);
- }
-