qmus2mid.c
上传用户:xuyinpeng
上传日期:2021-05-12
资源大小:455k
文件大小:18k
源码类别:

射击游戏

开发平台:

Visual C++

  1. /*
  2.    Quick MUS to Midi converter.
  3.    (C) 1995,96 Sebastien Bacquet  ( bacquet@iie.cnam.fr )
  4.    Ported to unix by Hans Peter Verne ( hpv@kjemi.uio.no )
  5.    This is free software, distributed under the terms of the
  6.    GNU General Public License. For details see the file COPYING.
  7.    Use gcc to compile, if possible.  Please look in  "qmus2mid.h"
  8.    for system dependencies, in particular the int2 and int4 typedef's.
  9.    To compile for MS-DOS, #define MSDOG or use -DMSDOG parameter
  10.    Otherwise, vanilla unix is assumed, but it still compiles under dos.
  11.    For the time being, this only works for little-endian machines,
  12.    such as i86, dec-mips, alpha;  but not rs6000, sparc....
  13. */
  14. /* Hacked for DOOM Win32 port by Petteri Kangaslampi <pekangas@sci.fi> */
  15. //#define MSDOG
  16. #include <ctype.h>
  17. #include <stdio.h>
  18. #include <stdlib.h>
  19. #include <string.h>
  20. /* [Petteri]  warning C4761: integral size mismatch in argument; conversion
  21.    supplied */
  22. #ifdef _MSC_VER
  23. #   pragma warning(disable:4761)
  24. #endif
  25. #ifdef MSDOG
  26. #include <io.h>
  27. #include <dir.h>
  28. //#include <pc.h>
  29. #include <process.h>
  30. //#include <keys.h>
  31. #else
  32. #include <sys/types.h>
  33. #endif
  34. #include <sys/stat.h>
  35. #include "qmus2mid.h"
  36. FILE *file_mus, *file_mid ;
  37. int4 TRACKBUFFERSIZE = 65536L ;  /* 64 Ko */
  38. #ifdef MSDOG
  39. char tmp[MAXPATH] ;
  40. #endif
  41. size_t fwrite2(const int2 *ptr, size_t size, FILE *file)
  42. {
  43.   int4 rev = 0;
  44.   int i;
  45.   for( i = 0 ; (size_t)i < size ; i++ )
  46.     rev = (rev << 8) + (((*ptr) >> (i*8)) & 0xFF) ;
  47.   return fwrite( &rev, size, 1, file ) ;
  48. }
  49. void FreeTracks( struct Track track[] )
  50. {
  51.   int i ;
  52.   for( i = 0 ; i < 16 ; i++ )
  53.     if( track[i].data )
  54.       free( track[i].data ) ;
  55. }
  56. #ifdef MSDOG
  57. void Close( void )
  58. {
  59.     fclose(file_mus);
  60.     fclose(file_mid);
  61.     unlink( tmp ) ;
  62. }
  63. #else
  64. #define Close()
  65. char LittleEndian(void)
  66. {
  67.   short i = 0x0001;
  68.   char *p = (char *) &i;
  69.   return *p;
  70. }
  71. #endif
  72. void TWriteByte( char MIDItrack, char byte, struct Track track[] )
  73. {
  74.   int4 pos ;
  75.   pos = track[MIDItrack].current ;
  76.   if( pos < TRACKBUFFERSIZE )
  77.     track[MIDItrack].data[pos] = byte ;
  78.   else
  79.     {
  80.       printf("ERROR : Track buffer full.n"
  81.              "Increase the track buffer size (option -size).n" ) ;
  82.       FreeTracks( track ) ;
  83.       Close() ;
  84.       exit( EXIT_FAILURE ) ;
  85.     }
  86.   track[MIDItrack].current++ ;
  87. }
  88. void TWriteVarLen( int tracknum, register int4 value,
  89.                   struct Track track[] )
  90. {
  91.   register int4 buffer ;
  92.   buffer = value & 0x7f ;
  93.   while( (value >>= 7) )
  94.     {
  95.       buffer <<= 8 ;
  96.       buffer |= 0x80 ;
  97.       buffer += (value & 0x7f) ;
  98.     }
  99.   while( 1 )
  100.     {
  101.       TWriteByte( tracknum, buffer, track ) ;
  102.       if( buffer & 0x80 )
  103.         buffer >>= 8 ;
  104.       else
  105.         break;
  106.     }
  107. }
  108. int ReadMUSheader( MUSheader *MUSh, FILE *file )
  109. {
  110.   if( fread( MUSh->ID, 4, 1, file ) != 1 ) return COMUSFILE ;
  111.   if( strncmp( MUSh->ID, MUSMAGIC, 4 ) )
  112.     return NOTMUSFILE ;
  113.   if( fread( &(MUSh->ScoreLength),  2, 1, file ) != 1 ) return COMUSFILE ;
  114.   if( fread( &(MUSh->ScoreStart),  2, 1, file ) != 1 ) return COMUSFILE ;
  115.   if( fread( &(MUSh->channels),  2, 1, file ) != 1 ) return COMUSFILE ;
  116.   if( fread( &(MUSh->SecChannels),  2, 1, file ) != 1 ) return COMUSFILE ;
  117.   if( fread( &(MUSh->InstrCnt),  2, 1, file ) != 1 ) return COMUSFILE ;
  118.   if( fread( &(MUSh->dummy),  2, 1, file ) != 1 ) return COMUSFILE ;
  119.   MUSh->instruments = (int2 *) calloc(MUSh->InstrCnt, sizeof(int2)) ;
  120.   if( fread( MUSh->instruments, 2, MUSh->InstrCnt, file ) != MUSh->InstrCnt )
  121.     {
  122.       free( MUSh->instruments ) ;
  123.       return COMUSFILE ;
  124.     }
  125.   free( MUSh->instruments ) ; /* suppress this line if you want to display
  126.  instruments later */
  127.   return 0 ;
  128. }
  129. int WriteMIDheader( int2 ntrks, int2 division, FILE *file )
  130. {
  131.   fwrite( MIDIMAGIC , 10, 1, file ) ;
  132.   fwrite2( &ntrks, 2, file) ;
  133.   fwrite2( &division, 2, file ) ;
  134.   return 0 ;
  135. }
  136.         /* maybe for ms-dog too ? */ /* Yes, why not ?... */
  137. #define last(e)         ((unsigned char)(e & 0x80))
  138. #define event_type(e)   ((unsigned char)((e & 0x7F) >> 4))
  139. #define channel(e)      ((unsigned char)(e & 0x0F))
  140. void TWriteString( char tracknum, const char *string, int length,
  141.                    struct Track track[] )
  142. {
  143.   register int i ;
  144.   for( i = 0 ; i < length ; i++ )
  145.     TWriteByte( tracknum, string[i], track ) ;
  146. }
  147. void WriteTrack( int tracknum, FILE *file, struct Track track[] )
  148. {
  149.   int2 size ;
  150.   size_t quot, rem ;
  151.   /* Do we risk overflow here ? */
  152.   size = (int2) track[tracknum].current+4 ;
  153.   fwrite( "MTrk", 4, 1, file ) ;
  154.   if( !tracknum ) size += 33 ;
  155.   fwrite2( &size, 4, file ) ;
  156.   if( !tracknum)
  157.     fwrite( TRACKMAGIC1 "Quick MUS->MID ! by S.Bacquet", 33, 1, file ) ;
  158.   quot = (size_t) (track[tracknum].current / 4096) ;
  159.   rem = (size_t) (track[tracknum].current - quot*4096) ;
  160.   fwrite( track[tracknum].data, 4096, quot, file ) ;
  161.   fwrite( ((const unsigned char *) track[tracknum].data)+4096*quot, rem,
  162.                          1, file ) ;
  163.   fwrite( TRACKMAGIC2, 4, 1, file ) ;
  164. }
  165. void WriteFirstTrack( FILE *file )
  166. {
  167.   int2 size ;
  168.   size = 43 ;
  169.   fwrite( "MTrk", 4, 1, file ) ;
  170.   fwrite2( &size, 4, file ) ;
  171.   fwrite( TRACKMAGIC3 , 4, 1, file ) ;
  172.   fwrite( "QMUS2MID (C) S.Bacquet", 22, 1, file ) ;
  173.   fwrite( TRACKMAGIC4, 6, 1, file ) ;
  174.   fwrite( TRACKMAGIC5, 7, 1, file ) ;
  175.   fwrite( TRACKMAGIC6, 4, 1, file ) ;
  176. }
  177. int4 ReadTime( FILE *file )
  178. {
  179.   register int4 time = 0 ;
  180.   int byte ;
  181.   do
  182.     {
  183.       byte = getc( file ) ;
  184.       if( byte != EOF ) time = (time << 7) + (byte & 0x7F) ;
  185.     } while( (byte != EOF) && (byte & 0x80) ) ;
  186.   return time ;
  187. }
  188. char FirstChannelAvailable( signed char MUS2MIDchannel[] )
  189. {
  190.   int i ;
  191.   signed char old15 = MUS2MIDchannel[15], max = -1 ;
  192.   MUS2MIDchannel[15] = -1 ;
  193.   for( i = 0 ; i < 16 ; i++ )
  194.     if( MUS2MIDchannel[i] > max ) max = MUS2MIDchannel[i] ;
  195.   MUS2MIDchannel[15] = old15 ;
  196.   return (max == 8 ? 10 : max+1) ;
  197. }
  198. int qmus2mid( const char *mus, const char *mid, int nodisplay,
  199.              int2 division, int BufferSize, int nocomp )
  200. {
  201.   struct Track track[16] ;
  202.   int2 TrackCnt = 0 ;
  203.   unsigned char et, MUSchannel, MIDIchannel, MIDItrack, NewEvent ;
  204.   int i, event, data, r ;
  205.   static MUSheader MUSh ;
  206.   int4 DeltaTime, TotalTime = 0, time, min, n = 0 ;
  207.   unsigned char MUS2MIDcontrol[15] = {
  208.     0,                          /* Program change - not a MIDI control change */
  209.     0x00,                       /* Bank select */
  210.     0x01,                       /* Modulation pot */
  211.     0x07,                       /* Volume */
  212.     0x0A,                       /* Pan pot */
  213.     0x0B,                       /* Expression pot */
  214.     0x5B,                       /* Reverb depth */
  215.     0x5D,                       /* Chorus depth */
  216.     0x40,                       /* Sustain pedal */
  217.     0x43,                       /* Soft pedal */
  218.     0x78,                       /* All sounds off */
  219.     0x7B,                       /* All notes off */
  220.     0x7E,                       /* Mono */
  221.     0x7F,                       /* Poly */
  222.     0x79                        /* Reset all controllers */
  223.   }, MIDIchan2track[16] ;
  224.   signed char MUS2MIDchannel[16] ;
  225. #ifdef MSDOG
  226.   char drive[MAXDRIVE], dir[MAXDIR], name[MAXFILE], ext[MAXEXT] ;
  227. #endif
  228.   char ouch = 0, sec ;
  229.   struct stat file_data ;
  230.   if( (file_mus = fopen( mus, "rb" )) == NULL )
  231.     return COMUSFILE ;
  232.   stat( mus, &file_data ) ;
  233. #ifdef MSDOG
  234.   fnsplit( mid, drive, dir, name, ext ) ;
  235.   fnmerge( tmp, drive, dir, "tempmid", ".tmp" ) ;
  236.   if( (file_mid = fopen( tmp, "wb" )) == NULL )
  237.     {
  238.       Close() ;
  239.       return COTMPFILE ;
  240.     }
  241. #else
  242.   /*  Why bother with a tmp-file anyway ? */
  243.   /*  If I could have done differently...You know, DOS is DOS... */
  244.   if( (file_mid = fopen( mid, "wb" )) == NULL )
  245.     return CWMIDFILE ;
  246. #endif
  247.   r = ReadMUSheader( &MUSh, file_mus ) ;
  248.   if( r )
  249.     {
  250.       Close() ;
  251.       return r ;
  252.     }
  253.   if( fseek( file_mus, MUSh.ScoreStart, SEEK_SET ) )
  254.     {
  255.       Close() ;
  256.       return MUSFILECOR ;
  257.     }
  258.   if( !nodisplay )
  259.     printf( "%s (%lu bytes) contains %d melodic channel%s.n", mus,
  260.            (unsigned long) file_data.st_size, MUSh.channels,
  261.            MUSh.channels >= 2 ? "s" : "" );
  262.   if( MUSh.channels > 15 )      /* <=> MUSchannels+drums > 16 */
  263.     {
  264.       Close() ;
  265.       return TOOMCHAN ;
  266.     }
  267.   for( i = 0 ; i < 16 ; i++ )
  268.     {
  269.       MUS2MIDchannel[i] = -1 ;
  270.       track[i].current = 0 ;
  271.       track[i].vel = 64 ;
  272.       track[i].DeltaTime = 0 ;
  273.       track[i].LastEvent = 0 ;
  274.       track[i].data = NULL ;
  275.     }
  276.   if( BufferSize )
  277.     {
  278.       TRACKBUFFERSIZE = ((int4) BufferSize) << 10 ;
  279.       if( !nodisplay )
  280.         printf( "Track buffer size set to %d KB.n", BufferSize ) ;
  281.     }
  282.   if( !nodisplay )
  283.     {
  284.       printf( "Converting..." ) ;
  285.       fflush( stdout ) ;
  286.     }
  287.   event = getc( file_mus ) ;
  288.   et = event_type( event ) ;
  289.   MUSchannel = channel( event ) ;
  290.   while( (et != 6) && !feof( file_mus ) && (event != EOF) )
  291.     {
  292.       if( MUS2MIDchannel[MUSchannel] == -1 )
  293.         {
  294.           MIDIchannel = MUS2MIDchannel[MUSchannel ] =
  295.             (MUSchannel == 15 ? 9 : FirstChannelAvailable( MUS2MIDchannel)) ;
  296.           MIDItrack   = MIDIchan2track[MIDIchannel] = (unsigned char) (TrackCnt++);
  297.           if( !(track[MIDItrack].data = (char *) malloc( TRACKBUFFERSIZE )) )
  298.             {
  299.               FreeTracks( track ) ;
  300.               Close() ;
  301.               return MEMALLOC ;
  302.             }
  303.         }
  304.       else
  305.         {
  306.           MIDIchannel = MUS2MIDchannel[MUSchannel] ;
  307.           MIDItrack   = MIDIchan2track [MIDIchannel] ;
  308.         }
  309.       TWriteVarLen( MIDItrack, track[MIDItrack].DeltaTime, track ) ;
  310.       track[MIDItrack].DeltaTime = 0 ;
  311.       switch( et )
  312.         {
  313.         case 0 :                /* release note */
  314.           NewEvent = 0x90 | MIDIchannel ;
  315.           if( (NewEvent != track[MIDItrack].LastEvent) || nocomp )
  316.             {
  317.               TWriteByte( MIDItrack, NewEvent, track ) ;
  318.               track[MIDItrack].LastEvent = NewEvent ;
  319.             }
  320.           else
  321.             n++ ;
  322.           data = getc( file_mus ) ;
  323.           TWriteByte( MIDItrack, data, track ) ;
  324.           TWriteByte( MIDItrack, 0, track ) ;
  325.           break ;
  326.         case 1 :
  327.           NewEvent = 0x90 | MIDIchannel ;
  328.           if( (NewEvent != track[MIDItrack].LastEvent) || nocomp )
  329.             {
  330.               TWriteByte( MIDItrack, NewEvent, track ) ;
  331.               track[MIDItrack].LastEvent = NewEvent ;
  332.             }
  333.           else
  334.             n++ ;
  335.           data = getc( file_mus ) ;
  336.           TWriteByte( MIDItrack, data & 0x7F, track ) ;
  337.           if( data & 0x80 )
  338.             track[MIDItrack].vel = getc( file_mus ) ;
  339.           TWriteByte( MIDItrack, track[MIDItrack].vel, track ) ;
  340.           break ;
  341.         case 2 :
  342.           NewEvent = 0xE0 | MIDIchannel ;
  343.           if( (NewEvent != track[MIDItrack].LastEvent) || nocomp )
  344.             {
  345.               TWriteByte( MIDItrack, NewEvent, track ) ;
  346.               track[MIDItrack].LastEvent = NewEvent ;
  347.             }
  348.           else
  349.             n++ ;
  350.           data = getc( file_mus ) ;
  351.           TWriteByte( MIDItrack, (data & 1) << 6, track ) ;
  352.           TWriteByte( MIDItrack, data >> 1, track ) ;
  353.           break ;
  354.         case 3 :
  355.           NewEvent = 0xB0 | MIDIchannel ;
  356.           if( (NewEvent != track[MIDItrack].LastEvent) || nocomp )
  357.             {
  358.               TWriteByte( MIDItrack, NewEvent, track ) ;
  359.               track[MIDItrack].LastEvent = NewEvent ;
  360.             }
  361.           else
  362.             n++ ;
  363.           data = getc( file_mus ) ;
  364.           TWriteByte( MIDItrack, MUS2MIDcontrol[data], track ) ;
  365.           if( data == 12 )
  366.             TWriteByte( MIDItrack, MUSh.channels+1, track ) ;
  367.           else
  368.             TWriteByte( MIDItrack, 0, track ) ;
  369.           break ;
  370.         case 4 :
  371.           data = getc( file_mus ) ;
  372.           if( data )
  373.             {
  374.               NewEvent = 0xB0 | MIDIchannel ;
  375.               if( (NewEvent != track[MIDItrack].LastEvent) || nocomp )
  376.                 {
  377.                   TWriteByte( MIDItrack, NewEvent, track ) ;
  378.                   track[MIDItrack].LastEvent = NewEvent ;
  379.                 }
  380.               else
  381.                 n++ ;
  382.               TWriteByte( MIDItrack, MUS2MIDcontrol[data], track ) ;
  383.             }
  384.           else
  385.             {
  386.               NewEvent = 0xC0 | MIDIchannel ;
  387.               if( (NewEvent != track[MIDItrack].LastEvent) || nocomp )
  388.                 {
  389.                   TWriteByte( MIDItrack, NewEvent, track ) ;
  390.                   track[MIDItrack].LastEvent = NewEvent ;
  391.                 }
  392.               else
  393.                 n++ ;
  394.             }
  395.           data = getc( file_mus ) ;
  396.           TWriteByte( MIDItrack, data, track ) ;
  397.           break ;
  398.         case 5 :
  399.         case 7 :
  400.           FreeTracks( track ) ;
  401.           Close() ;
  402.           return MUSFILECOR ;
  403.         default : break ;
  404.         }
  405.       if( last( event ) )
  406. {
  407.           DeltaTime = ReadTime( file_mus ) ;
  408.           TotalTime += DeltaTime ;
  409.   for( i = 0 ; i < (int) TrackCnt ; i++ )
  410.     track[i].DeltaTime += DeltaTime ;
  411.         }
  412.       event = getc( file_mus ) ;
  413.       if( event != EOF )
  414.                   {
  415.           et = event_type( event ) ;
  416.           MUSchannel = channel( event ) ;
  417.         }
  418.       else
  419.         ouch = 1 ;
  420.     }
  421.   if( !nodisplay ) printf( "done !n" ) ;
  422.   if( ouch )
  423.     printf( "WARNING : There are bytes missing at the end of %s.n          "
  424.            "The end of the MIDI file might not fit the original one.n", mus ) ;
  425.   if( !division )
  426.     division = 89 ;
  427.   else
  428.     if( !nodisplay ) printf( "Ticks per quarter note set to %d.n", division ) ;
  429.   if( !nodisplay )
  430.     {
  431.       if( division != 89 )
  432.         {
  433.           time = TotalTime / 140 ;
  434.           min = time / 60 ;
  435.           sec = (char) (time - min*60) ;
  436.           printf( "Playing time of the MUS file : %u'%.2u''.n", min, sec ) ;
  437.         }
  438.       time = (TotalTime * 89) / (140 * division) ;
  439.       min = time / 60 ;
  440.       sec = (char) (time - min*60) ;
  441.       if( division != 89 )
  442.         printf( "                    MID file" ) ;
  443.       else
  444.         printf( "Playing time" ) ;
  445.       printf( " : %u'%.2u''.n", min, sec ) ;
  446.     }
  447.   if( !nodisplay )
  448.     {
  449.       printf( "Writing..." ) ;
  450.       fflush( stdout ) ;
  451.     }
  452.   WriteMIDheader( TrackCnt+1, division, file_mid ) ;
  453.   WriteFirstTrack( file_mid ) ;
  454.   for( i = 0 ; i < (int) TrackCnt ; i++ )
  455.     WriteTrack( i, file_mid, track ) ;
  456.   if( !nodisplay )
  457.     printf( "done !n" ) ;
  458.   if( !nodisplay && !nocomp )
  459.     printf( "Compression : %u%%.n",
  460.            (100 * n) / (n+ (int4) ftell( file_mid )) ) ;
  461.   FreeTracks( track ) ;
  462. #ifdef MSDOG
  463.   fclose(file_mus);
  464.   fclose(file_mid);
  465.   if( !access( mid, 0 ) )
  466.     if( unlink( mid ) )
  467.       return( CWMIDFILE ) ;
  468.   if( rename( tmp, mid ) )
  469.     return( CWMIDFILE ) ;
  470. #else
  471.   fclose(file_mus);
  472.   fclose(file_mid);
  473. #endif
  474.   return 0 ;
  475. }
  476. int convert( const char *mus, const char *mid, int nodisplay, int div,
  477.             int size, int nocomp, int *ow )
  478. {
  479.   FILE *file ;
  480.   int error;
  481. #ifdef MSDOG
  482.   int n ;
  483. #endif
  484.   struct stat file_data ;
  485.   char buffer[30] ;
  486.   /* we don't need _all_ that checking, do we ? */
  487.   /* Answer : it's more user-friendly */
  488. #ifdef MSDOG
  489.   if( access( mus, 0 ) )
  490.     {
  491.       printf( "ERROR : %s does not exist.n", mus ) ;
  492.       return 1 ;
  493.     }
  494. #else
  495.   if ( !*ow ) {
  496.     file = fopen(mid, "r");
  497.     if ( file ) {
  498.       fclose(file);
  499.       printf( "qmus2mid: file %s exists, not removed.n", mid ) ;
  500.       return 2 ;
  501.     }
  502.   }
  503. #endif
  504.   error = qmus2mid( mus, mid, nodisplay, div, size, nocomp ) ;
  505.   if( error )
  506.     {
  507.       printf( "ERROR : " ) ;
  508.       switch( error )
  509.         {
  510.         case NOTMUSFILE :
  511.           printf( "%s is not a MUS file.n", mus ) ; break ;
  512.         case COMUSFILE :
  513.           printf( "Can't open %s for read.n", mus ) ; break ;
  514.         case COTMPFILE :
  515.           printf( "Can't open temp file.n" ) ; break  ;
  516.         case CWMIDFILE :
  517.           printf( "Can't write %s (?).n", mid ) ; break ;
  518.         case MUSFILECOR :
  519.           printf( "%s is corrupted.n", mus ) ; break ;
  520.         case TOOMCHAN :
  521.           printf( "%s contains more than 16 channels.n", mus ) ; break ;
  522.         case MEMALLOC :
  523.           printf( "Not enough memory.n" ) ; break ;
  524.         default : break ;
  525.         }
  526.       return 4 ;
  527.     }
  528.   if( !nodisplay )
  529.     {
  530.       printf( "%s converted successfully.n", mus ) ;
  531.       if( (file = fopen( mid, "rb" )) != NULL )
  532.         {
  533.           stat( mid, &file_data ) ;
  534.           fclose( file ) ;
  535.           sprintf( buffer, " : %lu bytes", (unsigned long) file_data.st_size ) ;
  536.         }
  537.       printf( "%s (%scompressed) written%s.n", mid, nocomp ? "NOT " : "",
  538.              file ? buffer : ""  ) ;
  539.     }
  540.   return 0 ;
  541. }
  542. int CheckParm( char *check, int argc, char *argv[] )
  543. {
  544.   int i;
  545.   for ( i = 1 ; i<argc ; i++ )
  546. #ifdef MSDOG
  547.     if( !stricmp( check, argv[i] ) )
  548. #else
  549.     if( !strcmp( check, argv[i] ) )
  550. #endif
  551.       return i ;
  552.   return 0;
  553. }
  554. void PrintHeader( void )
  555. {
  556. /*  Print( "===============================================================================n"
  557.          "              Quick MUS->MID v2.0 ! (C) 1995,96 Sebastien Bacquetn"
  558.          "                        E-mail : bacquet@iie.cnam.frn"
  559.          "===============================================================================n" ) ;*/
  560. }
  561. void PrintSyntax( void )
  562. {
  563.   PrintHeader() ;
  564.   printf(
  565. #ifdef MSDOG
  566.          "nSyntax : QMUS2MID musfile1[.mus] {musfile2[.mus] ... | "
  567.          "midifile.mid} [options]n"
  568.          "   Wildcards are accepted.n"
  569.          "   Options are :n"
  570.          "     -query    : Query before processingn"
  571.          "     -ow       : OK, overwrite (without query)n"
  572. #else
  573.          "nSyntax : QMUS2MID musfile midifile [options]n"
  574.          "   Options are :n"
  575. #endif
  576.          "     -noow     : Don't overwrite !n"
  577.          "     -nodisp   : Display nothing ! (except errors)n"
  578.          "     -nocomp   : Don't compress !n"
  579.          "     -size ### : Set the track buffer size to ### (in KB). "
  580.          "Default = 64 KBn"
  581.          "     -t ###    : Ticks per quarter note. Default = 89n"
  582.          ) ;
  583. }