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

  1. /*            C    L    O    C    K
  2. #define    VBLANK
  3. */
  4. #define    OVERHEAD_HANDLE
  5. #define    NO_ACCURACY
  6. #define    CLOCKPRIO    19L
  7.  
  8. extern    struct    Gadget        Gadget4SInfo;
  9. extern    struct    NewWindow    NewWindowStructure1;
  10. extern    struct    IntuiText    IText1;
  11.  
  12. #ifdef    VBLANK
  13. # define UNIT    UNIT_VBLANK
  14. #else
  15. # define UNIT    UNIT_MICROHZ
  16. #endif
  17.  
  18. #include "LYNX.H"
  19. #include <hardware/cia.h>
  20.  
  21. #include <MIDI/MIDI.h>
  22. EXPORT    struct    MidiBase    *MidiBase;
  23. EXPORT    struct    MSource        *source=0;
  24. EXPORT    struct    MRoute        *sroute=0;
  25. char    prgname[] =    "Clock",    *name = prgname;
  26. char    midiout[] =    "MidiOut",    *output= midiout;
  27. char    banner[] =
  28.  "*| MIDI Clock Generator V0.3 by Carlo \"Lynx\" von Loesch '90 |*";
  29. union    Event clockevent;
  30.  
  31. #include <libraries/ARPbase.h>
  32. EXPORT    struct    ArpBase        *ArpBase;
  33. EXPORT    struct    IntuitionBase    *IntuitionBase;
  34. EXPORT    struct    GfxBase        *GfxBase;
  35. EXPORT    struct    Window        *win;
  36. EXPORT    struct    RastPort    *rp;
  37.  
  38. #include <devices/timer.h>
  39. long    timersig;
  40. struct    MsgPort        *timpo;
  41. struct    timerequest    *tr;
  42. #ifdef ACCURACY
  43. long    TimerBase;
  44. struct    timeval    t1=NULL, t2=NULL;
  45. struct    timerequest    *tr2;
  46. ULONG    normic;
  47. #endif
  48.  
  49. char    nomem[]="Don't do that, Dave";
  50. FLAG    on = NO, play = NO;
  51. EXPORT    long    sigs, videosig;
  52.  
  53. main(argc, argv) long argc; char *argv[]; {
  54.     register struct timerequest *time;
  55.     register ULONG t;
  56.  
  57.     ifnot (ArpBase = OpenLibrary("arp.library",ArpVersion))
  58.         Ciao("No ARP.Library");
  59.     IntuitionBase =    ArpBase -> IntuiBase;
  60.     GfxBase =    ArpBase -> GfxBase;
  61.     ifnot (MidiBase = ArpOpenLibrary (MIDINAME,MIDIVERSION))
  62.         Ciao ("No MIDI.Library");
  63.  
  64.     for (t=1; t<argc; t++) {
  65.         if (argv[t][0]=='-') switch (argv[t][1]) {
  66.             case 'o':    output = argv[++t]; break;
  67.             default:    Ciao("Bad args");
  68.         }
  69.         else name = argv[t];
  70.     }
  71.     win = MyOpenWindow(&NewWindowStructure1);
  72.     SetWindowTitles (win, -1L, banner);
  73.     rp = win -> RPort;
  74.     if (!(source = CreateMSource (name, NULL))) Ciao (nomem);
  75.     if (!(sroute = MRouteSource (source, output, NULL)))
  76.         Ciao ("no route out");
  77.     if (! (timpo = CreatePort (0L, 0L)))    Ciao (nomem);
  78.     if (! (tr = CreateExtIO (timpo, sizeof(struct timerequest)) ))
  79.         Ciao (nomem);
  80.     if (OpenDevice (TIMERNAME, UNIT, tr, 0)) Ciao ("No Timer");
  81.     timersig = 1L<<timpo->SIGH; time = tr;
  82.     sigs = timersig | videosig;
  83.     clockevent.p[0] = (char) MS_CLOCK;
  84.  
  85. #ifdef ACCURACY
  86.     TimerBase = (long) time->tr_node.io_Device;
  87.     if (! (tr2 = CreateExtIO (timpo, sizeof(struct timerequest)) ))
  88.         Ciao (nomem);
  89.     if (OpenDevice (TIMERNAME, UNIT_MICROHZ, tr2,0)) Ciao ("No Timer");
  90.     tr2 ->tr_node.io_Command = TR_GETSYSTIME;
  91.     normic =
  92. #endif
  93.     time->tr_time.tv_micro   = Speed2Mic(120);
  94.     time->tr_node.io_Command = TR_ADDREQUEST;
  95.     time->tr_time.tv_secs    = 0;
  96. #ifdef CLOCKPRIO
  97.     SetTaskPri(FindTask(NULL), CLOCKPRIO);
  98. #endif
  99.     forever if (play) {
  100. #ifdef ACCURACY
  101.         DoIO (time); GetTime (&t1);
  102. #else
  103.         SendIO (time);
  104. #endif
  105.         PutMidiMsg (source, &clockevent);
  106. #ifdef ACCURACY
  107.         GetTime (&t2);
  108.         SubTime (&t2, &t1);
  109.         if ((time->tr_time.tv_micro = normic - t2.tv_micro) < 0)
  110.             TOG_LED;
  111. #else
  112. # ifdef OVERHEAD_HANDLE
  113.         if (CheckIO(time)) {
  114.             AbortIO(time); TOG_LED; DoIO(time);
  115.         } else
  116. # endif
  117.         if (timersig != Wait(sigs)) CheckTui();
  118. #endif
  119.         } else if (timersig != Wait(sigs)) CheckTui();
  120. }
  121.  
  122. NewSpeed () {
  123.     register long a;
  124.     static char s[3];
  125.  
  126.     a = 1 + (Gadget4SInfo.HorizPot / Gadget4SInfo.HorizBody);
  127.     NumToString (a, s, 3, ' ');
  128.     IText1.IText = s;
  129.     RefreshGadgets (win->FirstGadget, win, NULL);
  130.     tr->tr_time.tv_micro = Speed2Mic (a);
  131. }
  132. Stop() {
  133.     SendMIDI (MS_STOP); play = NO;
  134. }
  135. Start() {
  136.     if (!play) {
  137.         SendMIDI (MS_START); play = YES;
  138.     }
  139. }
  140. Continue() {
  141.     if (!play) {
  142.         SendMIDI (MS_CONTINUE); play = YES;
  143.     }
  144. }
  145. HitaKey() {}
  146.  
  147. SendMIDI (command) ULONG command; {
  148.     static union Event otherevent;
  149.  
  150.     otherevent.p[0] = (UBYTE) command;
  151.     PutMidiMsg (source, &otherevent);
  152. }
  153.  
  154. #ifdef    ACCURACY
  155. GetTime    (ti)
  156. struct timeval *ti; {
  157.     DoIO (tr2);
  158.     ti->tv_secs = tr2->tr_time.tv_secs;
  159.     ti->tv_micro= tr2->tr_time.tv_micro;
  160. }
  161. #endif
  162.  
  163. Ciao (str) char *str; {
  164.     if (str) {
  165.         INFO (str);
  166.         if (win) SetWindowTitles (win, str, str);
  167.         Delay (44L);
  168.     }
  169.     if (win)    CloseWindowSafely (win);
  170.     if (sroute)    DeleteMRoute    (sroute);
  171.     if (source)    DeleteMSource    (source);
  172. #ifdef ACCURACY
  173.     if (tr2) {
  174.         CloseDevice (tr);
  175.         DeleteExtIO (tr, sizeof(struct timerequest));
  176.     }
  177. #endif
  178.     if (tr)    {
  179.         AbortIO (tr); CloseDevice (tr);
  180.         DeleteExtIO (tr, sizeof(struct timerequest));
  181.     }
  182.     if (timpo)    DeletePort (timpo);
  183.     if (ArpBase)    CloseLibrary    (ArpBase);
  184.     OFF_LED;
  185.     exit(str ? 4404L : 0L);
  186. }
  187.  
  188. long Speed2Mic (speed) ULONG speed; {
  189.     return (156250000/speed);
  190. }
  191.