home *** CD-ROM | disk | FTP | other *** search
/ The CDPD Public Domain Collection for CDTV 4 / CDPD_IV.bin / amfm / amfm2 / utilities / mft / mftext.c < prev    next >
C/C++ Source or Header  |  1994-06-20  |  5KB  |  258 lines

  1. /****************************************
  2. *                                       *
  3. * mftext                                *
  4. *                                       *
  5. * Convert a MIDI file to verbose text.  *
  6. *                                       *
  7. ****************************************/
  8.  
  9. #include <stdio.h>
  10. #include <ctype.h>
  11. #include "midifile.h"
  12.  
  13. void prtime();
  14. void initfuncs();
  15.  
  16. static FILE *F;
  17.  
  18.  
  19. filegetc()
  20. {
  21.     return(getc(F));
  22. }
  23.  
  24. main(argc,argv)
  25. char **argv;
  26. {
  27.     FILE *efopen();
  28.  
  29.     if ( argc > 1 )
  30.         F = efopen(argv[1],"r");
  31.     else
  32.         F = stdin;
  33.  
  34.     initfuncs();
  35.     Mf_getc = filegetc;
  36.     midifile();
  37.     fclose(F);
  38.     exit(0);
  39. }
  40.  
  41. FILE *
  42. efopen(name,mode)
  43. char *name;
  44. char *mode;
  45. {
  46.     FILE *f;
  47.     extern int errno;
  48.     extern char *sys_errlist[];
  49.     extern int sys_nerr;
  50.     char *errmess;
  51.  
  52.     if ( (f=fopen(name,mode)) == NULL ) {
  53.         (void) fprintf(stderr,"*** ERROR *** Cannot open '%s'!\n",name);
  54.         if ( errno <= sys_nerr )
  55.             errmess = sys_errlist[errno];
  56.         else
  57.             errmess = "Unknown error!";
  58.         (void) fprintf(stderr,"************* Reason: %s\n",errmess);
  59.         exit(1);
  60.     }
  61.     return(f);
  62. }
  63.  
  64. void error(char *s)
  65. {
  66.     fprintf(stderr,"Error: %s\n",s);
  67. }
  68.  
  69. void txt_header(format,ntrks,division)
  70. {
  71.     printf("Header format=%d ntrks=%d division=%d\n",format,ntrks,division);
  72. }
  73.  
  74. void txt_trackstart()
  75. {
  76.     printf("Track start\n");
  77. }
  78.  
  79. void txt_trackend()
  80. {
  81.     printf("Track end\n");
  82. }
  83.  
  84. void txt_noteon(chan,pitch,vol)
  85. {
  86.     prtime();
  87.     printf("Note on, chan=%d pitch=%d vol=%d\n",chan+1,pitch,vol);
  88. }
  89.  
  90. void txt_noteoff(chan,pitch,vol)
  91. {
  92.     prtime();
  93.     printf("Note off, chan=%d pitch=%d vol=%d\n",chan+1,pitch,vol);
  94. }
  95.  
  96. void txt_pressure(chan,pitch,press)
  97. {
  98.     prtime();
  99.     printf("Pressure, chan=%d pitch=%d press=%d\n",chan+1,pitch,press);
  100. }
  101.  
  102. void txt_parameter(chan,control,value)
  103. {
  104.     prtime();
  105.     printf("Parameter, chan=%d c1=%d c2=%d\n",chan+1,control,value);
  106. }
  107.  
  108. void txt_pitchbend(chan,msb,lsb)
  109. {
  110.     prtime();
  111.     printf("Pitchbend, chan=%d msb=%d lsb=%d\n",chan+1,msb,lsb);
  112. }
  113.  
  114. void txt_program(chan,program)
  115. {
  116.     prtime();
  117.     printf("Program, chan=%d program=%d\n",chan+1,program);
  118. }
  119.  
  120. void txt_chanpressure(chan,press)
  121. {
  122.     prtime();
  123.     printf("Channel pressure, chan=%d pressure=%d\n",chan+1,press);
  124. }
  125.  
  126. void txt_sysex(leng,mess)
  127. char *mess;
  128. {
  129.     prtime();
  130.     printf("Sysex, leng=%d\n",leng);
  131. }
  132.  
  133. void txt_metamisc(type,leng,mess)
  134. char *mess;
  135. {
  136.     prtime();
  137.     printf("Meta event, unrecognized, type=0x%02x leng=%d\n",type,leng);
  138. }
  139.  
  140. void txt_metaspecial(type,leng,mess)
  141. char *mess;
  142. {
  143.     prtime();
  144.     printf("Meta event, sequencer-specific, type=0x%02x leng=%d\n",type,leng);
  145. }
  146.  
  147. void txt_metatext(type,leng,mess)
  148. char *mess;
  149. {
  150.     static char *ttype[] = {
  151.         NULL,
  152.         "Text Event",        /* type=0x01 */
  153.         "Copyright Notice",    /* type=0x02 */
  154.         "Sequence/Track Name",
  155.         "Instrument Name",    /* ...       */
  156.         "Lyric",
  157.         "Marker",
  158.         "Cue Point",        /* type=0x07 */
  159.         "Unrecognized"
  160.     };
  161.     int unrecognized = (sizeof(ttype)/sizeof(char *)) - 1;
  162.     register int n, c;
  163.     register char *p = mess;
  164.  
  165.     if ( type < 1 || type > unrecognized )
  166.         type = unrecognized;
  167.     prtime();
  168.     printf("Meta Text, type=0x%02x (%s)  leng=%d\n",type,ttype[type],leng);
  169.     printf("     Text = <");
  170.     for ( n=0; n<leng; n++ ) {
  171.         c = *p++;
  172.         printf( (isprint(c)||isspace(c)) ? "%c" : "\\0x%02x" , c);
  173.     }
  174.     printf(">\n");
  175. }
  176.  
  177. void txt_metaseq(num)
  178. {
  179.     prtime();
  180.     printf("Meta event, sequence number = %d\n",num);
  181. }
  182.  
  183. void txt_metaeot()
  184. {
  185.     prtime();
  186.     printf("Meta event, end of track\n");
  187. }
  188.  
  189. void txt_keysig(sf,mi)
  190. {
  191.     prtime();
  192.     printf("Key signature, sharp/flats=%d  minor=%d\n",sf,mi);
  193. }
  194.  
  195. void txt_tempo(tempo)
  196. long tempo;
  197. {
  198.     prtime();
  199.     printf("Tempo, microseconds-per-MIDI-quarter-note=%d\n",tempo);
  200. }
  201.  
  202. void txt_timesig(nn,dd,cc,bb)
  203. {
  204.     int denom = 1;
  205.     while ( dd-- > 0 )
  206.         denom *= 2;
  207.     prtime();
  208.     printf("Time signature=%d/%d  MIDI-clocks/click=%d  32nd-notes/24-MIDI-clocks=%d\n",
  209.         nn,denom,cc,bb);
  210. }
  211.  
  212. void txt_smpte(hr,mn,se,fr,ff)
  213. {
  214.     prtime();
  215.     printf("SMPTE, hour=%d minute=%d second=%d frame=%d fract-frame=%d\n",
  216.         hr,mn,se,fr,ff);
  217. }
  218.  
  219. void txt_arbitrary(leng,mess)
  220. char *mess;
  221. {
  222.     prtime();
  223.     printf("Arbitrary bytes, leng=%d\n",leng);
  224. }
  225.  
  226. void prtime()
  227. {
  228.     printf("Time=%ld  ",Mf_currtime);
  229. }
  230.  
  231. void initfuncs()
  232. {
  233.     Mf_error = error;
  234.     Mf_header =  txt_header;
  235.     Mf_starttrack =  txt_trackstart;
  236.     Mf_endtrack =  txt_trackend;
  237.     Mf_on =  txt_noteon;
  238.     Mf_off =  txt_noteoff;
  239.     Mf_pressure =  txt_pressure;
  240.     Mf_controller =  txt_parameter;
  241.     Mf_pitchbend =  txt_pitchbend;
  242.     Mf_program =  txt_program;
  243.     Mf_chanpressure =  txt_chanpressure;
  244.     Mf_sysex =  txt_sysex;
  245.     Mf_metamisc =  txt_metamisc;
  246.     Mf_seqnum =  txt_metaseq;
  247.     Mf_eot =  txt_metaeot;
  248.     Mf_timesig =  txt_timesig;
  249.     Mf_smpte =  txt_smpte;
  250.     Mf_tempo =  txt_tempo;
  251.     Mf_keysig =  txt_keysig;
  252.     Mf_sqspecific =  txt_metaspecial;
  253.     Mf_text =  txt_metatext;
  254.     Mf_arbitrary =  txt_arbitrary;
  255. }
  256.  
  257. /* End of File */
  258.