home *** CD-ROM | disk | FTP | other *** search
/ Audio Version 4.94 / audioversion4.94knowledgemediaresourcelibraryoctober1994.iso / unix / midi / mf2t.txt < prev    next >
Text File  |  1991-11-16  |  9KB  |  234 lines

  1.         MF2T/T2MF
  2.  
  3. Two programs to manipulate standard midifiles.
  4.  
  5. mf2t is a program that reads a standard midifile (format 0 or 1) and
  6. writes an ASCII representation of it that is both compact and easily parsable.
  7.  
  8. t2mf is the companion program that reparses the text representation
  9. into a midifile.
  10. -----------------------------------------------------------------------
  11. Please report any problems, suggestion for improvement, or actual
  12. improvements to:
  13.  
  14. Piet van Oostrum, Dept of Computer Science, Utrecht University,
  15. P.O. Box 80.089, 2508 TB Utrecht, The Netherlands
  16. email: piet@cs.ruu.nl
  17.  
  18. -----------------------------------------------------------------------
  19. You can do with this program what you like, but if you think it is
  20. useful I would appreciate if you send me some of your midifiles. Not
  21. ones that I can find on the Internet. And only PD ones. Please send
  22. them uu- or btoa-encoded. Zoo and Arc archives (encoded) are also OK,
  23. Zip and Lharc may be problematic.
  24. ------------------------------------------------------------------------
  25.  
  26. The text representation is chosen such that it is easily recognized and
  27. manipulated by programs like sed, awk or perl. Yet it is also humanly
  28. readable so that it can be manipulated with an ordianary text editor.
  29.  
  30. In this way you can make changes to your midifiles using these
  31. powerful programs or even a Fortran program :=). Or you can write
  32. algorithmic compositions using a familiar programming language.
  33.  
  34. The programs use the midifile library written by Tim Thompson
  35. (tjt@blink.att.com) and updated by Michael Czeiszperger (mike@pan.com).
  36. However, there were some bugs in the write code and I added some
  37. features that I needed. I also changes some of the names to cope with
  38. the 7-character limit for external identifiers in the Sozobon
  39. compiler. I will make an updated version of the library available
  40. soon. I also anticipate to split the read and write portions.
  41.  
  42. Usage:
  43.     mf2t [-mntv] [-f[n]] [midifile [textfile]]
  44.     
  45.     translate midifile to textfile.
  46.     
  47. When textfile is not given, the text is written to standard output.
  48. When midifile is not given it is read from standard input. The meaning
  49. of the options is:
  50.  
  51. -m    merge partial sysex into a single sysex message
  52. -n    write notes in symbolic rather than numeric form. A-C
  53.     optionally followed by # (sharp) followed by octave number.
  54. -b    or
  55. -t    event times are written as bar:beat:click rather than a click number
  56. -v    use a slightly more verbose output
  57. -f<n>    fold long text and hex entries into more lines <n>=line length
  58.     (default 80).
  59.  
  60.     t2mf [-r] [[textfile] midifile]
  61.     
  62.     translate textfile to midifile.
  63.     
  64. When textfile is not given, text is read from standard input, when
  65. midifile is not given it is written to standard output.
  66.  
  67. -r    Use running status
  68.  
  69. Note that if one file is given it is always the midifile. This is so
  70. that on systems like Unix you can write a pipeline:
  71.  
  72.     mf2t x.mid | sed ... | t2mf y.mid
  73.     
  74. Format of the textfile:
  75. -----------------------
  76.  
  77. The following representation of the midievents is generated (between
  78. [] the form when -v is used:
  79.  
  80. File header:        Mfile <format> <ntrks> <division>
  81. Start of track:        MTrk
  82. End of track:        TrkEnd
  83.  
  84. Note On:        On <ch> <note> <vol>
  85. Note Off:        Off <ch> <note> <vol>
  86. Poly Pressure:        PoPr[PolyPr] <ch> <note> <val>
  87. Channel Pressure:    ChPr[ChanPr] <ch> <val>
  88. Controller parameter:    Par[Param] <ch> <con> <val>
  89. Pitch bend:        Pb <ch> <val>
  90. Program change:        PrCh[ProgCh] <ch> <prog>
  91. Sysex message:        SysEx <hex>
  92. Arbutrary midi bytes:    Arb <hex>
  93.  
  94. Sequence nr:        Seqnr <num>
  95. Key signature:        KeySig <num> <manor>
  96. Tempo:            Tempo <num>
  97. Time signature:        TimeSig <num>/<num> <num> <num>
  98. SMPTE event:        SMPTE <num> <num> <num> <num> <num>
  99.  
  100. Meta text events:    Meta <texttype> <string>
  101. Meta end of track:    Meta TrkEnd
  102. Sequencer specific:    SeqSpec <type> <hex>
  103. Misc meta events:    Meta <type> <hex>
  104.  
  105. The <> have the following meaning:
  106.  
  107. <ch>        ch=<num>
  108. <note>        n=<noteval>  [note=<noteval>]
  109. <vol>        v=<num> [vol=<num>]
  110. <val>        v=<num> [val=<num>]
  111. <con>        c=<num> [con=<num>]
  112. <prog>        p=<num> [prog=<num>]
  113. <manor>        minor or major
  114. <noteval>    either a <num> or A-G optionally followed by #,
  115.         followed by <num> without intermediate spaces.
  116.  
  117. <texttype>    Text Copyright SeqName TrkName InstrName Lyric Marker Cue
  118.         or <type>
  119. <type>        a hex number of the form 0xab
  120. <hex>        a sequence of 2-digit hex numbers (without 0x)
  121.         separated by space
  122. <string>    a string between double quotes (like "text").
  123.  
  124. Channel numbers are 1-based, all other numbers are as they appear in
  125. the midifile.
  126. <division> is either a positive number (giving the time resolution in
  127. clicks per quarter note) or a negative number followed by a positive
  128. number (giving SMPTE timing).
  129. <format> <ntrks> <num> are decimal numbers.
  130. The <num> in the Pb is the real value (two midibytes combined)
  131. In Tempo it is a long (32 bits) value. Others are in the interval 0-127
  132. The SysEx sequence contains the leading F0 and the trailing F7.
  133.  
  134. In a string certain characters are escaped:
  135. " and \ are escaped with a \
  136. a zero byte is written as \0
  137. CR and LF are written as \r and \n respectively
  138. other non-printable characters are written as \x<2 hex digits>
  139. When -f is given long strings and long hex sequences are folded by inserting
  140. \<newline><tab>. If in a string the next character would be a space or
  141. tab it will be escaped by \
  142. This facility is for those programs that have a limited buffer length.
  143. Of course parsing is more difficult with this option (see below).
  144.  
  145. Input:
  146. ------
  147. t2mf will accept all formats that mf2t can produce, plus a number of others.
  148. Input is case insensitive (except in strings) and extra tabs and
  149. spaces are allowed. Newlines are required but empty lines are allowed.
  150. Comment starts with # at the beginning of a lexical item and continues
  151. to the end of the line. The only other places where a # is legal are
  152. insides strings and as a sharp symbol in a symbolic note.
  153.  
  154. In symbolic notes + and # are allowed for sharp, b and - for flat.
  155.  
  156. In bar:beat:click time the : may also be /
  157.  
  158. On input a string may also contain \t for a tab, and in a folded
  159. string any whitespace at the beginning of a continuation line is skipped.
  160.  
  161. Hex sequences may be input without intervening spaces if each byte is
  162. given as exactly 2 hex digits.
  163.  
  164. Hex sequences may be given where a string is required and vice versa.
  165.  
  166. Hex numbers of the form 0xaaa and decimal numbers are equivalent.
  167. Also allowed as numbers are "bank numbers" of the form '123. In fact
  168. this is equivalent to the octal number 012 (subtract 1 from each
  169. digit, digits 1-8 allowed). The letters a-h may also be used for 1-8.
  170.  
  171. The input is checked for correctness but not extensively. An
  172. errormessage will generally imply that the resulting midifile is illegal.
  173.  
  174. Implementation:
  175. ---------------
  176.  
  177. I have compiled the programs on an Atari ST with the Sozobon compiler
  178. and the dlibs library. The scanner is generated using flex 2.3. The
  179. output of flex (t2mflex.c) is included for those that do not have
  180. flex.  The module yyread.c is a flex library module that you need on
  181. TOS (and on MSDOS).  The corresponding makefile is makefile.st. For
  182. Unix use makefile.unx. The makefiles may need minor changes for other
  183. systems. 
  184.  
  185. Useful hints:
  186. -------------
  187.  
  188. channel number can be recognized by the regular expression /ch=/.
  189. note numbers by /n=/ or /note=/, program numbers by /p=/ or /prog=/.
  190. Meta events by /^Meta/ or /^SeqSpec/.
  191. Text events by /"/, continued lines by /\\$/, continuation lines by /$\t/
  192. (that was a TAB character).
  193.  
  194. In awk each parameter is a field, in perl you can use split to get the
  195. parameters (except for strings).
  196.  
  197. The following perl script changes note off messages to note on with
  198. vol=0, deletes controller 3 changes, makes some note reassignments on
  199. channel 10, and changes the channel numbers from channel 1 depending
  200. on the track number. 
  201.  
  202. ------------------------------- test.pl -------------------------------
  203. %drum = (62, 36, 63, 47, 65, 61, 67, 40, 68, 54);
  204.  
  205. while (<>) {
  206.     next if /c=3/;
  207.     s/Off(.*)v=[0-9]*/On\1v=0/;
  208.     if (/ch=10/ && /n=([0-9]*)/ && $drum{$1}) {
  209.         s/n=$1/"n=".$drum{$1}/e;
  210.     }
  211.     if (/^MTrk/) {++$trknr ; print "track $trknr\n";}
  212.     if ($trknr > 2) { s/ch=1\b/ch=3/; }
  213.     else  { s/ch=1\b/ch=4/; }
  214.     print || die "Error: $!\n";
  215. }    
  216. ------------------------------------------------------------------------
  217.  
  218. and this is the corresponding awk script.
  219.  
  220. ------------------------------- test.awk -------------------------------
  221. BEGIN { drum[62] = 36; drum[63] = 47; drum[65] = 61; \
  222.     drum[67] = 40; drum[68] = 54 }
  223. /c=3/ { next }
  224. ($2 == "Off") { $2 = "On"; $5 = "v=0" }
  225. /ch=10/ { n = substr($4, 3); if (n in drum) $4 = "n=" drum[n] }
  226. /^MTrk/ { trknr++ }
  227. /ch=1 / { if (trknr > 2) { $3 = "ch=2" } else { $3 = "ch=3" } } 
  228. { print }
  229. ------------------------------------------------------------------------
  230.  
  231. Good luck!
  232.  
  233. $Id: readme.,v 1.5 1991/11/16 20:26:48 piet Rel $
  234.