home *** CD-ROM | disk | FTP | other *** search
/ Audio 4.94 - Over 11,000 Files / audio-11000.iso / amiga / midi / mstuffpr.zoo / MIDIstuff / src / MIDIdump.c < prev    next >
C/C++ Source or Header  |  1990-08-16  |  5KB  |  208 lines

  1. /*             MIDI-System-Exclusive Dumper
  2.         Written, arranged, produced by Carl Ch. v. Loesch.
  3.  
  4.         V1.0alpha    Saturday 19. 8. 89
  5. Changes:    V1.0beta    Saturday  9. 6. 90
  6.         V1.0gamma    Tuesday  25. 7. 90  now uses midi.library!
  7.         V1.0        Wednesday 15.8. 90  now uses arp.lib too
  8. */
  9. #include "Lynx.h"
  10. #define    XBUFSIZE    50000L
  11.  
  12. #include <libraries/ARPbase.h>
  13. EXPORT    struct    ArpBase        *ArpBase;
  14. EXPORT    struct    IntuitionBase    *IntuitionBase;
  15. EXPORT    char    file[FCHARS+DSIZE+1]="", dir[DSIZE+1]="SysX",
  16.         loadname[FCHARS+1]="out.x", savename[FCHARS+1]="in.x";
  17. EXPORT    struct    FileRequester    *freq;
  18. EXPORT    struct    Window        *win;
  19.  
  20. #include <MIDI/MIDI.h>
  21. EXPORT    struct    MidiBase    *MidiBase;
  22. EXPORT    struct    MSource        *source=0;
  23. EXPORT    struct    MDest        *dest=0;
  24. EXPORT    struct    MRoute        *droute=0, *sroute=0;
  25. EXPORT    struct    MidiPacket    *packet=0;
  26. static    struct    MRouteInfo routeinfo = { MMF_SYSEX };
  27.      /* receive only sys/ex msg's */
  28.  
  29. struct NewWindow nw = {
  30.     10, 24, 620, 117,
  31.     3, 2, CLOSEWINDOW+RAWKEY, WINDOWCLOSE+WINDOWDEPTH+WINDOWDRAG
  32.     +SMART_REFRESH+WINDOWSIZING+NOCAREREFRESH,
  33.     NULL, NULL, "*| MIDI SysX Dumper V1.0 by Carlo von Loesch '89/90 |*",
  34.     NULL, NULL,
  35.     300, 11, 640, 500,
  36.     WBENCHSCREEN
  37. };
  38.  
  39. EXPORT    char    name[]="MIDIdump";
  40. EXPORT    char    nomem[] = "Out of RAM";
  41. EXPORT    UBYTE    *xbuffer, ret[77];
  42. EXPORT    FLAG    timer = NO, cons = NO, logon = YES, spool = NO;
  43. EXPORT    long    xlen = 0, sigs, videosig, midisig;
  44. struct    IOStdReq conreq;
  45.  
  46. _main    () {
  47.     ifnot (ArpBase = OpenLibrary("arp.library",ArpVersion))
  48.         Ciao("No ARP.Library");
  49.     IntuitionBase =    ArpBase -> IntuiBase;
  50.     ifnot (MidiBase = ArpOpenLibrary (MIDINAME,MIDIVERSION))
  51.         Ciao ("No MIDI.Library");
  52.  
  53.     conreq.io_Data = win = MyOpenWindow (&nw);
  54.     OpenDevice("console.device", NULL, &conreq, NULL); cons=YES;
  55.     ifnot (xbuffer = ArpAlloc (XBUFSIZE)) Ciao (nomem);
  56.  
  57.     ifnot (freq = ArpAllocFreq()) Ciao (nomem); 
  58.     freq->fr_Dir = dir; freq->fr_Window = win;
  59.     freq -> fr_FuncFlags = FRF_NewWindFunc;
  60.  
  61.     ifnot (source = CreateMSource (name, NULL))    Ciao (nomem);
  62.     ifnot (sroute = MRouteSource (source, "MidiOut", NULL))
  63.         Ciao ("No route out");
  64.     ifnot (dest = CreateMDest (name, NULL))        Ciao (nomem);
  65.     ifnot (droute = MRouteDest ("MidiIn", dest, &routeinfo))
  66.         Ciao ("No route in");
  67.     midisig = 1L<<dest->DestPort->SIGH;
  68.     sigs = midisig | videosig;
  69.  
  70.     HelpX ();
  71.     while (logon) {
  72.         if (midisig == Wait (sigs)) HandleMIDI();
  73.         else CheckTui ();
  74.     }
  75.     Ciao (NULL);
  76. }
  77.  
  78. HandleMIDI () {
  79.     register long i;
  80.  
  81.     if (packet = GetMidiPacket (dest)) {
  82.         xlen = packet->Length;
  83.         if (xlen < XBUFSIZE)
  84.             for (i=0; i<xlen; i++) xbuffer[i]=packet->MidiMsg[i];
  85.         else {
  86.             SPrintf (ret, "Buffer too small for %ld bytes.", xlen);
  87.             Say (ret);
  88.             xlen = 0;
  89.         }
  90.         FreeMidiPacket    (packet);
  91.         SPrintf (ret, "%ld bytes received.", xlen);
  92.         Say (ret);
  93.     }
  94. }
  95.  
  96. HitaKey    (raw)
  97. ULONG    raw; {
  98.     static    FLAG ctrl = NO;
  99.     register UBYTE z;
  100.  
  101.     z = raw & 0x7f;
  102.     if (z == 99) { 
  103.         if (raw & 0x80) ctrl=NO;
  104.         else ctrl=YES;
  105.         return;
  106.     }
  107.     if (ctrl) switch (raw) {
  108.         case 16:/* Q */ logon = NO;
  109.     } else if (z == raw) {
  110.         switch (raw) {
  111.             case 20:/* T */ Transmit();    break;
  112.             case 51:/* C */ CheckX();    break;
  113.             case 40:/* L */ LoadAs();    break;
  114.             case 33:/* S */ SaveAs();    break;
  115.             case 69:/*ESC*/ logon = NO;
  116.             case 68:/*RET*/ HelpX ();
  117.         }
  118.         spool = NO;
  119.     }
  120. }
  121.  
  122. LoadIt() {    xlen = Load (file, xbuffer,(long) XBUFSIZE);    }
  123. SaveIt() {    if (xlen) Save (file, xbuffer,(long) xlen);    }
  124. LogOut() {    logon = NO;    }
  125. HandleEvent() {}    /* no gadgets */
  126. Transmit () {
  127.     if (xlen) SendMIDI ("sysx buffer", xbuffer, xlen);
  128.     else Say ("*yawn*");
  129. }
  130.  
  131. long SendMIDI (inf, buf, len)
  132.  char    *inf;
  133.  UBYTE    *buf;
  134.  long    len;    {
  135.     register long r;
  136.  
  137.     if (inf) {
  138.         SPrintf (ret, "Sending %s: %ld bytes.", inf, len);
  139.         Say (ret);
  140.     }
  141.     PutMidiMsg (source, xbuffer);
  142.     if (inf) Say ("sent.");
  143. }
  144.  
  145. #define    ZOTARK    15
  146. CheckX () {
  147.     register UBYTE n;
  148.     register long i, j;
  149.     UBYTE    line[16];
  150.  
  151.     if (xlen) {
  152.         spool = YES;
  153.         Say ("dump buffer:");
  154.         for (i=0; i<xlen; i++) {
  155.             n = xbuffer[i];
  156.             SPrintf (ret, " %s", C2X(n)); SayMore (ret);
  157.             j = i & ZOTARK;
  158.             if (n<32 || (n>127 && n<160)) n = '.';
  159.             line[j] = n;
  160.             if (j==ZOTARK) {
  161.                 SPrintf (ret, " \xab %s \xbb",line);
  162.                 Say (ret); CheckTui(); if (!spool) break;
  163.             }
  164.         }
  165.         Say (".");
  166.     }
  167.     else Say ("*yawn*");
  168. }
  169.  
  170. HelpX () {
  171.     Say (" [L]oad into buffer.");
  172.     Say (" [T]ransmit to MIDI.");
  173.     Say (" [S]ave to disk.");
  174.     Say (" [C]heck buffer contents.");
  175.     Say ("\n [ESC]ape from here!");
  176.     Say (" [RET] type this info again.");
  177.     Say ("\nWhatever system-exclusive data arrives");
  178.     Say ("will be stored into buffer rightaway.");
  179.     SPrintf (ret, "\nBuffer currently contains %ld bytes.", xlen);
  180.     Say (ret);
  181. }
  182.  
  183. Say (text) char *text; {
  184.     char tmp[78];
  185.     SPrintf (tmp, "%s\n", text); SayMore (tmp);
  186. }
  187. SayMore (text) char *text; {
  188.     conreq.io_Data = (APTR) text;
  189.     conreq.io_Length = -1;
  190.     conreq.io_Command = CMD_WRITE;
  191.     DoIO(&conreq);
  192. }
  193.  
  194. Ciao (str) char *str; {
  195.     if (cons) {
  196.         if (str) {
  197.             Say (str); Delay(21L);
  198.         }
  199.         CloseDevice (&conreq);
  200.     }
  201.     if (win)    CloseWindowSafely (win);
  202.     if (droute)    DeleteMRoute    (droute);
  203.     if (sroute)    DeleteMRoute    (sroute);
  204.     if (dest)    DeleteMDest    (dest);
  205.     if (source)    DeleteMSource    (source);
  206.     if (ArpBase)    CloseLibrary    (ArpBase);
  207.     exit (str ? 4404L : 0L);
  208. }