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 >
Wrap
C/C++ Source or Header
|
1990-08-16
|
4KB
|
191 lines
/* C L O C K
#define VBLANK
*/
#define OVERHEAD_HANDLE
#define NO_ACCURACY
#define CLOCKPRIO 19L
extern struct Gadget Gadget4SInfo;
extern struct NewWindow NewWindowStructure1;
extern struct IntuiText IText1;
#ifdef VBLANK
# define UNIT UNIT_VBLANK
#else
# define UNIT UNIT_MICROHZ
#endif
#include "LYNX.H"
#include <hardware/cia.h>
#include <MIDI/MIDI.h>
EXPORT struct MidiBase *MidiBase;
EXPORT struct MSource *source=0;
EXPORT struct MRoute *sroute=0;
char prgname[] = "Clock", *name = prgname;
char midiout[] = "MidiOut", *output= midiout;
char banner[] =
"*| MIDI Clock Generator V0.3 by Carlo \"Lynx\" von Loesch '90 |*";
union Event clockevent;
#include <libraries/ARPbase.h>
EXPORT struct ArpBase *ArpBase;
EXPORT struct IntuitionBase *IntuitionBase;
EXPORT struct GfxBase *GfxBase;
EXPORT struct Window *win;
EXPORT struct RastPort *rp;
#include <devices/timer.h>
long timersig;
struct MsgPort *timpo;
struct timerequest *tr;
#ifdef ACCURACY
long TimerBase;
struct timeval t1=NULL, t2=NULL;
struct timerequest *tr2;
ULONG normic;
#endif
char nomem[]="Don't do that, Dave";
FLAG on = NO, play = NO;
EXPORT long sigs, videosig;
main(argc, argv) long argc; char *argv[]; {
register struct timerequest *time;
register ULONG t;
ifnot (ArpBase = OpenLibrary("arp.library",ArpVersion))
Ciao("No ARP.Library");
IntuitionBase = ArpBase -> IntuiBase;
GfxBase = ArpBase -> GfxBase;
ifnot (MidiBase = ArpOpenLibrary (MIDINAME,MIDIVERSION))
Ciao ("No MIDI.Library");
for (t=1; t<argc; t++) {
if (argv[t][0]=='-') switch (argv[t][1]) {
case 'o': output = argv[++t]; break;
default: Ciao("Bad args");
}
else name = argv[t];
}
win = MyOpenWindow(&NewWindowStructure1);
SetWindowTitles (win, -1L, banner);
rp = win -> RPort;
if (!(source = CreateMSource (name, NULL))) Ciao (nomem);
if (!(sroute = MRouteSource (source, output, NULL)))
Ciao ("no route out");
if (! (timpo = CreatePort (0L, 0L))) Ciao (nomem);
if (! (tr = CreateExtIO (timpo, sizeof(struct timerequest)) ))
Ciao (nomem);
if (OpenDevice (TIMERNAME, UNIT, tr, 0)) Ciao ("No Timer");
timersig = 1L<<timpo->SIGH; time = tr;
sigs = timersig | videosig;
clockevent.p[0] = (char) MS_CLOCK;
#ifdef ACCURACY
TimerBase = (long) time->tr_node.io_Device;
if (! (tr2 = CreateExtIO (timpo, sizeof(struct timerequest)) ))
Ciao (nomem);
if (OpenDevice (TIMERNAME, UNIT_MICROHZ, tr2,0)) Ciao ("No Timer");
tr2 ->tr_node.io_Command = TR_GETSYSTIME;
normic =
#endif
time->tr_time.tv_micro = Speed2Mic(120);
time->tr_node.io_Command = TR_ADDREQUEST;
time->tr_time.tv_secs = 0;
#ifdef CLOCKPRIO
SetTaskPri(FindTask(NULL), CLOCKPRIO);
#endif
forever if (play) {
#ifdef ACCURACY
DoIO (time); GetTime (&t1);
#else
SendIO (time);
#endif
PutMidiMsg (source, &clockevent);
#ifdef ACCURACY
GetTime (&t2);
SubTime (&t2, &t1);
if ((time->tr_time.tv_micro = normic - t2.tv_micro) < 0)
TOG_LED;
#else
# ifdef OVERHEAD_HANDLE
if (CheckIO(time)) {
AbortIO(time); TOG_LED; DoIO(time);
} else
# endif
if (timersig != Wait(sigs)) CheckTui();
#endif
} else if (timersig != Wait(sigs)) CheckTui();
}
NewSpeed () {
register long a;
static char s[3];
a = 1 + (Gadget4SInfo.HorizPot / Gadget4SInfo.HorizBody);
NumToString (a, s, 3, ' ');
IText1.IText = s;
RefreshGadgets (win->FirstGadget, win, NULL);
tr->tr_time.tv_micro = Speed2Mic (a);
}
Stop() {
SendMIDI (MS_STOP); play = NO;
}
Start() {
if (!play) {
SendMIDI (MS_START); play = YES;
}
}
Continue() {
if (!play) {
SendMIDI (MS_CONTINUE); play = YES;
}
}
HitaKey() {}
SendMIDI (command) ULONG command; {
static union Event otherevent;
otherevent.p[0] = (UBYTE) command;
PutMidiMsg (source, &otherevent);
}
#ifdef ACCURACY
GetTime (ti)
struct timeval *ti; {
DoIO (tr2);
ti->tv_secs = tr2->tr_time.tv_secs;
ti->tv_micro= tr2->tr_time.tv_micro;
}
#endif
Ciao (str) char *str; {
if (str) {
INFO (str);
if (win) SetWindowTitles (win, str, str);
Delay (44L);
}
if (win) CloseWindowSafely (win);
if (sroute) DeleteMRoute (sroute);
if (source) DeleteMSource (source);
#ifdef ACCURACY
if (tr2) {
CloseDevice (tr);
DeleteExtIO (tr, sizeof(struct timerequest));
}
#endif
if (tr) {
AbortIO (tr); CloseDevice (tr);
DeleteExtIO (tr, sizeof(struct timerequest));
}
if (timpo) DeletePort (timpo);
if (ArpBase) CloseLibrary (ArpBase);
OFF_LED;
exit(str ? 4404L : 0L);
}
long Speed2Mic (speed) ULONG speed; {
return (156250000/speed);
}