peterb@ima (04/17/86)
x Help... I bought my 520ST to use to drive my MIDI keyboards, and don;t find any documentation on how to access them. And since I understand assembler, could some kind soul give me a quick hack of a routine that can read and write to the MIDI ports. Also if there is any other documentation on them, please point me to it. It would be nice to get some C code to go with the stubs... (wishful thinking). If worse comes to worse, send me the address of the ports and their status addresses. I'll hack something together from that. Peter Barada {decvax|harvard|ihnp4}!ima!pbear!peterb
sansom@trwrba.UUCP (04/22/86)
In article <9000001@ima> peterb@ima writes: > >Help... I bought my 520ST to use to drive my MIDI keyboards, and don't find >any documentation on how to access them. And since I understand assembler, >could some kind soul give me a quick hack of a routine that can read and write >to the MIDI ports. Also if there is any other documentation on them, please >point me to it. It would be nice to get some C code to go with the stubs... > The following program will give a rudimentary introduction to the ST's MIDI capabilities. I pulled this from the net a couple of months ago. Richard E. Sansom TRW Electronics & Defense Sector {...decvax,ucbvax,ihnp4}!trwrb!trwrba!sansom -------------------------------------------------------------------------- /* mr.c */ /* Nigel Roles 1986 */ #include "osbind.h" #define MIDI 3 #define CON 2 #define GM (Bconin(MIDI)&0xff) struct event { int delay; char cmd[3]; }; struct event *buffer; int empty=1; long bc; long memsize; long bmax; long hz200() { register long save_ssp=Super(0L); register long uhz200= *(long *)0x4ba; Super(save_ssp); return uhz200; } record() { register struct event *bp; long now,then; printf("Recording (any key to stop):\n"); while (Bconstat(MIDI)) Bconin(MIDI); then=0; bp=buffer; bc=0; for (;;) { if (Bconstat(CON)) { Bconin(CON); bp->delay= -1; bc++; break; } if (Bconstat(MIDI)) { int b=GM; if (b==0xfe) continue; /* Ignore active sensing */ if (b==0x90) { now=hz200(); if (then==0) bp->delay=0; else bp->delay=now-then; then=now; bp->cmd[0]=b; bp->cmd[1]=GM; bp++->cmd[2]=GM; if (++bc==bmax) { printf("Buffer full\n"); break; } } } } } play() { register struct event *bp=buffer; long target; printf("Playing:\n"); while (bp->delay!= -1) { if (Bconstat(CON)) { Bconin(CON); break; } target=hz200()+bp->delay; while (hz200()<target) ; Midiws(2,bp->cmd); bp++; } } #define FNSIZE 20 struct filename { char lin,lout; char name[FNSIZE+1]; } fn; int h; getfn() { printf("Filename: "); fn.lin=FNSIZE; Cconrs((char *)&fn); printf("\n"); fn.name[fn.lout]='\0'; } load() { getfn(); if ((h=Fopen(fn.name,0))<0) { printf("Can't open %s for reading (error %d)\n",fn.name,h); return; } if (Fread(h,memsize,buffer)<0) printf("Read error\n"); else empty=0; Fclose(h); } save() { getfn(); Fdelete(fn.name); if ((h=Fcreate(fn.name,0))<0) { printf("Can't create %s (error %d)\n",fn.name,h); return; } if (Fwrite(h,sizeof(struct event)*(long)bc,buffer)<0) printf("Write error\n"); Fclose(h); } main() { char c; char *malloc(); memsize=(long)malloc(-1L); if ((buffer=(struct event *)malloc(memsize))==(struct event *)0L) { printf("malloc failure\n"); exit(1); } bmax=memsize/sizeof(struct event); printf("\033EMidi Recorder Version 1.0 (definitely)\n"); printf("(C) N. G. Roles 1985\n\n"); printf("Capacity: %D events\n",bmax); for (;;) { printf("MR> "); c=Bconin(CON); printf("%c\n",c); switch (c) { case 'q': break; case 'r': record(); continue; case 'p': if (empty) printf("Nothing to play!\n"); else play(); continue; case 's': if (empty) printf("Nothing to save!\n"); else save(); continue; case 'l': load(); continue; default: printf("???\n"); continue; } break; } } -- Richard E. Sansom TRW Electronics & Defense Sector {...decvax,ucbvax,ihnp4}!trwrb!trwrba!sansom