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

  1. /*        M    I    D    I    R    E    C
  2.  
  3.                   Little MIDI Recorder
  4.         Written, arranged, produced by Carl Ch. v. Loesch.
  5.  
  6.     V0.1    February'89,    V0.2    August'89,    V0.3    July'90
  7.     V1.0    August'90.
  8. #define    DEBUG
  9. */
  10. #include "Lynx.h"
  11. extern    struct    Menu        Menu1;
  12. extern    struct    NewWindow    NewWindowStructure1;
  13. EXPORT    char    ret[80];
  14.  
  15. #include <MIDI/MIDI.h>
  16. EXPORT    struct    MidiBase    *MidiBase;
  17. EXPORT    struct    MSource        *source=0;
  18. EXPORT    struct    MDest        *dest=0;
  19. EXPORT    struct    MRoute        *droute=0, *sroute=0, *troute;
  20. static    struct    MRouteInfo    routeinfo = { MMF_CHAN + MMF_SYSRT, 0xffff };
  21.  
  22. EXPORT    char    prgname[] =    "Recorder",    *name  = prgname;
  23. EXPORT    char    midiin[] =    "MidiIn",    *input = midiin;
  24. EXPORT    char    midiout[] =    "MidiOut",    *output= midiout;
  25.  
  26. #include <libraries/ARPbase.h>
  27. EXPORT    struct    ArpBase        *ArpBase;
  28. EXPORT    struct    IntuitionBase    *IntuitionBase;
  29. EXPORT    char    file[FCHARS+DSIZE+1]="", dir[DSIZE+1]="Sequences",
  30.         loadname[FCHARS+1]="Hello", savename[FCHARS+1]="Hello";
  31. EXPORT    struct    FileRequester    *freq;
  32. EXPORT    struct    Window        *win;
  33.  
  34. #define    TAPELEN        15000
  35. EXPORT    struct Tape {
  36.     union Event event;
  37.     short clock;
  38. } *tape;
  39.  
  40. #define    RECORDERPRIO    3L
  41. EXPORT    char    banner[] =
  42.  "*| Little MIDI Recorder V1.0 by Carlo \"Lynx\" von Loesch (c)90 |*";
  43. EXPORT    char    *title = banner;
  44. EXPORT    char    nomem[] = "Out of RAM";
  45. EXPORT    ULONG    tc = 0, tl = 0, ck = 0, nextck, lastck;
  46. EXPORT    FLAG    on = YES, thru = NO, play = NO, rec = NO;
  47. EXPORT    long    midisig, videosig, sigs;
  48.  
  49. main(argc, argv) long argc; char *argv[]; {
  50.     register    long    t;
  51.     register    short    s;
  52.     register    union Event    *e;
  53.  
  54.     ifnot (ArpBase = OpenLibrary("arp.library",ArpVersion))
  55.         Ciao("No ARP.Library");
  56.     IntuitionBase =    ArpBase -> IntuiBase;
  57.     ifnot (MidiBase = ArpOpenLibrary (MIDINAME,MIDIVERSION))
  58.         Ciao ("No MIDI.Library");
  59.     ifnot (tape = ArpAlloc (TAPELEN * sizeof(struct Tape)))
  60.         Ciao (nomem);
  61.  
  62.     for (t=1; t<argc; t++) {
  63.         if (argv[t][0]=='-') select (argv[t][1]) {
  64.             when 'i':    input = argv[++t]; break;
  65.             when 'o':    output = argv[++t]; break;
  66.             when 't':    Thru(); break;
  67.             otherwise    Ciao("Bad args");
  68.         }
  69.         else title = name = argv[t];
  70.     }
  71.     ifnot (source = CreateMSource (name, NULL))    Ciao (nomem);
  72.     ifnot (sroute = MRouteSource (source, output, NULL))
  73.         Ciao ("No route out");
  74.     ifnot (dest = CreateMDest (name, NULL))        Ciao (nomem);
  75.     ifnot (droute = MRouteDest (input, dest, &routeinfo))
  76.         Ciao ("No route in");
  77.     midisig = 1L<<dest->DestPort->SIGH;
  78.  
  79.     win = MyOpenWindow(&NewWindowStructure1); Say (banner);
  80.     SetMenuStrip (win, &Menu1);
  81.     sigs = videosig | midisig;
  82.  
  83.     ifnot (freq = ArpAllocFreq()) Ciao (nomem); 
  84.     freq->fr_Dir = dir; freq->fr_Window = win;
  85.     freq -> fr_FuncFlags = FRF_NewWindFunc;
  86.  
  87. #ifdef RECORDERPRIO
  88.     SetTaskPri(FindTask((char *) 0L), RECORDERPRIO);
  89. #endif
  90.     while (on) {
  91.         t = Wait (sigs);
  92.         if (t == midisig) while (e = GetMidiMsg (dest)) {
  93.             HandleMIDI (e->l); FreeMidiMsg (e);
  94.         } else MyCheckTui();
  95.     }
  96.     Ciao (NULL);
  97. }
  98.  
  99. HandleMIDI (e) union Event e; {
  100.     if (e.p[0] > 0xf0) select (e.p[0]) {
  101. when MS_CLOCK:        if (play) PlayIt(); break;
  102. when MS_START:        Rewind();
  103. when MS_CONTINUE:    play=YES; LBUG ("PLAY at clk", ck); break;
  104. when MS_STOP:        play=NO; LBUG ("STOP at clk", ck); break;
  105. otherwise        XBUG ("Weird Event", e.l);
  106.     }
  107.     else if (rec && play && tl < TAPELEN) {
  108. #ifdef TOUCHSTART
  109.         if (!tl) ck=1;
  110.     /* start counting from first input, ignoring sync */
  111. #endif
  112.         tape[tl].clock = ck - lastck;
  113.         tape[tl++].event = e;
  114.         lastck = ck;
  115.     }
  116. }
  117.  
  118. PlayIt() {
  119.     if (!rec && (ck == nextck)) {
  120.         PutMidiMsg (source, &tape[tc++].event);
  121.         while (tape[tc].clock == 0)
  122.             PutMidiMsg (source, &tape[tc++].event);
  123.         if (tc < tl) nextck = ck + tape[tc].clock;
  124.         else nextck = 0;
  125.     }
  126.     ck++;
  127. }
  128.  
  129. Thru() {
  130.     if (thru = !thru)
  131.       if (troute = MRoutePublic (input, output, routeinfo))
  132.         SPrintf (ret,
  133. "Route between %s and %s has been established.", input, output);
  134.       else { thru = NO; SPrintf (ret,
  135. "No route between %s and %s could be established.", input, output);
  136.       }
  137.     else {
  138.         DeleteMRoute (troute);
  139.         SPrintf (ret, "Ok. No more route between %s and %s.",
  140.             input, output);
  141.     }
  142.     Say (ret);
  143. }
  144.  
  145. Record() {
  146.     rec=!rec;
  147.     FBUG ("RECORD", rec);
  148.     Rewind();
  149. }
  150. Rewind() {
  151.     tc=0; ck=1; nextck=(ULONG) tape[0].clock; lastck=1;
  152.     if (rec) tl=0;
  153.     LBUG ("REWIND with tl", tl);
  154. }
  155. SaveIt() {
  156.     if (tl) Save (file, &tape[0],(long) tl*sizeof(struct Tape));
  157. }
  158. LoadIt() {
  159.     play=NO; Rewind();
  160.     tl = Load (file, &tape[0],(long) TAPELEN*sizeof(struct Tape))
  161.         / sizeof(struct Tape);
  162. }
  163. Help() {
  164.     SPrintf (ret, "Clock: %ld, Counter: %ld, SeqLength: %ld.",
  165.         ck, tc, tl); Say (ret);
  166. }
  167.  
  168. MyCheckTui() {
  169.     register struct    IntuiMessage    *tuimsg;
  170.     register ULONG    class, obj;
  171.     register USHORT    code;
  172.  
  173.     while (tuimsg = GetMsg (win->UserPort)) {
  174.         class =    tuimsg->Class;
  175.         code =    tuimsg->Code;
  176.         obj=    tuimsg->IAddress;    ReplyMsg (tuimsg);
  177.         switch (class) {
  178. case MENUPICK:        DoMenu(code);        break;
  179. case GADGETUP:        HandleEvent (obj);    break;
  180. case CLOSEWINDOW:    Ciao (NULL);
  181.         }
  182.     }
  183. }
  184.  
  185. DoMenu (code) USHORT code; {
  186.     NBUG (" MenuCode", code);
  187.     select (MENUNUM(code)) {
  188. when 0:        select (ITEMNUM(code)) {
  189.     when 0:        LoadAs(); break;
  190.     when 1:        LoadIt(); break;
  191.     when 2:        SaveAs(); break;
  192.     when 3:        SaveIt(); break;
  193.     when 4:        Ciao(NULL);
  194.         } break;
  195. when 1:        select (ITEMNUM(code)) {
  196.     when 0:        Help(); break;
  197.     when 1:        Thru();
  198.         }
  199.     }
  200. }
  201.  
  202. Say (str) char *str; { if (win) SetWindowTitles (win, -1L, str); }
  203.  
  204. Ciao (str)  char *str; {
  205.     if (win)    CloseWindowSafely (win);
  206.     if (droute)    DeleteMRoute    (droute);
  207.     if (sroute)    DeleteMRoute    (sroute);
  208.     if (thru)    DeleteMRoute    (troute);
  209.     if (dest)    DeleteMDest    (dest);
  210.     if (source)    DeleteMSource    (source);
  211.     if (ArpBase) {
  212.         if (str)    Puts(str);
  213.         CloseLibrary    (ArpBase);
  214.     }
  215.     exit (str ? 4404L : 0L);
  216. }
  217.