home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_disks / 300-399 / ff332.lzh / K1_Editor / PutDump.c < prev    next >
C/C++ Source or Header  |  1990-03-20  |  5KB  |  186 lines

  1. #include <workbench/startup.h>
  2. #include <midi/kawai_k1.h>
  3. #include <libraries/reqbase.h>
  4.  
  5. struct IntuitionBase    *IntuitionBase;
  6. struct GfxBase            *GfxBase;
  7. struct MidiBase            *MidiBase;
  8. struct ReqBase            *ReqBase;
  9.  
  10. struct MDest            *dest;
  11. struct MSource            *src;
  12. struct MRoute            *inroute, *outroute;
  13.  
  14. struct FileRequester    MyFileReqStruct;
  15. char                    filename[FCHARS],
  16.                         directoryname[DSIZE],
  17.                         answerarray[DSIZE+FCHARS],
  18.                         *WriteError[4] =
  19.                         { "Einfacher Schreibfehler","Der Synthspeicher ist schreibgeschützt!",
  20.                           "Keine Cartridge vorhanden!","K1 antwortet nicht!" };
  21. struct TRStructure        meintrs = { 0,0,0,0,0,0,"Sag mir:",0xFFFF,0,0,0,0,0,0 };
  22.  
  23. UBYTE                    data[8082],        /* kplt. SoundBank 64 S + 32 M */
  24.                         request[9] = { MS_SYSEX,MID_KAWAI,0,K1_OBDR,K1_GROUP,KAWAI_K1,K1_INT,0,MS_EOX };
  25.  
  26. struct MRouteInfo        riin = { MMF_SYSEX, -1, 0, 0, { 0,0,0,0 }, { 0,0,0,0 } };
  27.                         /* d.h. nur SysExs passieren die Route */
  28.  
  29.  
  30. /***************************************************************************/
  31.  
  32.  
  33. int WoIsK1()                    /* -1 bei nirgends Ack, sonst 0..15 */
  34. {    static UBYTE req[5] = { MS_SYSEX,MID_KAWAI,0,K1_MIR,MS_EOX };
  35.     UBYTE *ack;
  36.     int chn;
  37.  
  38.     for(chn=0; chn<16; chn++)
  39.     {    req[OFFS_CHAN] = chn;
  40.         PutMidiMsg(src, req);
  41.         Delay(25L);
  42.         while(ack = GetMidiMsg(dest))
  43.             if(ack[OFFS_FUNC] == K1_MIA) return chn;
  44.     }
  45.     return -1;
  46. }
  47.  
  48. PutBlock(channel, ie, nr, data)        /* Einmal vollpumpen, bitte */
  49.   int channel, ie, nr;
  50.   UBYTE *data;
  51. {    UBYTE *msg, *reply;
  52.     int err = 4, bs = (nr < 64) ? 32*88 : 32*76;    /* BlockSize abh. von Single/Multi */
  53.     register int i;
  54.  
  55.     if(msg = AllocMem(9+bs, MEMF_PUBLIC+MEMF_CLEAR))
  56.     {    movmem(request, msg, 9);    /* den Header vom Request übernehmen */
  57.         msg[OFFS_CHAN] = channel;
  58.         msg[OFFS_FUNC] = K1_ABDD;
  59.         msg[OFFS_SUB1] = ie;
  60.         msg[OFFS_SUB2] = nr;
  61.         movmem(data, msg+OFFS_DATA, bs);
  62.         msg[OFFS_DATA+bs] = MS_EOX;
  63.         PutMidiMsg(src, msg);        /* Hinfort! Weiche von mir, elender Dump! */
  64.     }
  65.  
  66.     WaitPort(dest->DestPort);
  67.     if(reply = GetMidiMsg(dest))
  68.     {    err = reply[OFFS_FUNC];
  69.         FreeMidiMsg(reply);
  70.     }
  71.  
  72.     if(msg) FreeMem(msg, 9+bs);
  73.     return(err & 7);
  74. }
  75.  
  76. int UserRequest(text,a,b,c)
  77.   char *text,*a,*b,*c;
  78. {
  79.     meintrs.Text = text;
  80.     meintrs.NegativeText = a;        /* 0 (rechts) */
  81.     meintrs.PositiveText = b;        /* 1 (links) */
  82.     meintrs.MiddleText = c;            /* 2 (mitte) */
  83.  
  84.     return TextRequest(&meintrs);
  85. }
  86.  
  87. Init()
  88. {
  89.     if(!(IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",0L)))
  90.         shit(NULL);
  91.     GfxBase=IntuitionBase->GfxBase;
  92.     if(!(ReqBase = (struct ReqBase *)OpenLibrary("req.library", 0L)))
  93.     {    DisplayBeep(0L);
  94.         shit(NULL);
  95.     }
  96.     if(!(MidiBase = OpenLibrary(MIDINAME, MIDIVERSION)))
  97.         shit("Keine midi.library!");
  98.     dest = CreateMDest(NULL, NULL);
  99.     src = CreateMSource(NULL, NULL);
  100.     inroute = MRouteDest("MidiIn", dest, &riin);
  101.     outroute = MRouteSource(src, "MidiOut", &riin);
  102.  
  103.     MyFileReqStruct.PathName = answerarray;
  104.     MyFileReqStruct.Dir = directoryname;
  105.     MyFileReqStruct.File = filename;
  106.     MyFileReqStruct.dirnamescolor = 2;
  107.     MyFileReqStruct.devicenamescolor = 2;
  108. }
  109.  
  110. shit(t)
  111.   char *t;
  112. {
  113.     if(t) UserRequest(t,NULL,NULL," Tschüß! ");
  114.     if(inroute) DeleteMRoute(inroute);
  115.     if(outroute) DeleteMRoute(outroute);
  116.     if(dest) DeleteMDest(dest);
  117.     if(src) DeleteMSource(src);
  118.     if(ReqBase) { PurgeFiles(&MyFileReqStruct); CloseLibrary(ReqBase); }
  119.     if(MidiBase) CloseLibrary(MidiBase);
  120.     if(IntuitionBase) CloseLibrary(IntuitionBase);
  121.     exit(0);
  122. }
  123.  
  124. char *extend(name,ext)
  125.   char *name, *ext;
  126. {    static char buffer[64];
  127.     char *s;
  128.  
  129.     if(s = rindex(name, '.'))
  130.         if(strncmp(s, ext) == 0) return name;
  131.  
  132.     strcpy(buffer,name);
  133.     strcat(buffer,ext);
  134.     return buffer;
  135. }
  136.  
  137. main(argc, argv)
  138.   int argc;
  139.   char *argv[];
  140. {    int c, e, err;
  141.     char *s;
  142.     FILE *fp;
  143.     struct WBArg *liste;
  144.  
  145.     Init();
  146.     if((c = WoIsK1()) == -1)
  147.         shit("Kein K1 gefunden.");
  148.  
  149.     MyFileReqStruct.Flags = FRQCACHINGM+FRQINFOGADGETM+FRQLOADINGM;
  150.     MyFileReqStruct.Title = "Dumpdatei laden:";
  151.     MyFileReqStruct.Show[0] = '*';
  152.     strcpy(MyFileReqStruct.Show + 1, ".dump");
  153.     err = TRUE;        /* falsch herum! */
  154.  
  155.     if(argc == 0)    /* von Workbench */
  156.     {    liste = (struct WBArg *)(((struct WBStartup *)argv)->sm_ArgList);
  157.         if(((struct WBStartup *)argv)->sm_NumArgs < 2)
  158.             err = FileRequester(&MyFileReqStruct);
  159.         else
  160.             strcpy(answerarray, liste[1].wa_Name);
  161.     }
  162.     else            /* vom CLI */
  163.     {    if(argc < 2)
  164.             err = FileRequester(&MyFileReqStruct);
  165.         else
  166.             strcpy(answerarray, argv[1]);
  167.     }
  168.  
  169.     if(err) if(fp = fopen(s = extend(answerarray, ".dump"), "r"))
  170.     {    err = fread(data, 8082, 1, fp);
  171.         fclose(fp);
  172.  
  173.         if(err) do
  174.         {    e = UserRequest("PUT in welche Bank?"," INT "," EXT ",NULL);
  175.             if(!(err = PutBlock(c, e, 0 , data)))
  176.                 if(!(err = PutBlock(c, e, 32, &data[2816])))
  177.                     err = PutBlock(c, e, 64, &data[5650]);
  178.             if(err) SimpleRequest("%s", WriteError[err]);
  179.         } while(UserRequest("Datei noch einmal PUTten?"," NEIN ","  JA  ",NULL));
  180.         else SimpleRequest("Datei %s fehlerhaft.", s);
  181.     }
  182.     else SimpleRequest("Ich kann %s nicht öffnen.", s);
  183.  
  184.     shit(NULL);
  185. }
  186.