midilib 1.2.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (265) hide show
  1. data/Credits +5 -0
  2. data/README.rdoc +7 -0
  3. data/lib/midilib/event.rb +37 -10
  4. data/lib/midilib/info.rb +1 -1
  5. data/lib/midilib/track.rb +15 -2
  6. data/test/test_event.rb +29 -0
  7. data/test/test_io.rb +7 -0
  8. data/test/test_track.rb +5 -0
  9. metadata +2 -301
  10. data/html/classes/IO.html +0 -137
  11. data/html/classes/IO.src/M000001.html +0 -20
  12. data/html/classes/MIDI/ActiveSense.html +0 -156
  13. data/html/classes/MIDI/ActiveSense.src/M000160.html +0 -18
  14. data/html/classes/MIDI/ActiveSense.src/M000161.html +0 -18
  15. data/html/classes/MIDI/ChannelEvent.html +0 -179
  16. data/html/classes/MIDI/ChannelEvent.src/M000132.html +0 -20
  17. data/html/classes/MIDI/ChannelEvent.src/M000133.html +0 -18
  18. data/html/classes/MIDI/ChannelPressure.html +0 -184
  19. data/html/classes/MIDI/ChannelPressure.src/M000092.html +0 -19
  20. data/html/classes/MIDI/ChannelPressure.src/M000093.html +0 -20
  21. data/html/classes/MIDI/ChannelPressure.src/M000094.html +0 -18
  22. data/html/classes/MIDI/Clock.html +0 -156
  23. data/html/classes/MIDI/Clock.src/M000148.html +0 -18
  24. data/html/classes/MIDI/Clock.src/M000149.html +0 -18
  25. data/html/classes/MIDI/Continue.html +0 -156
  26. data/html/classes/MIDI/Continue.src/M000146.html +0 -18
  27. data/html/classes/MIDI/Continue.src/M000147.html +0 -18
  28. data/html/classes/MIDI/Controller.html +0 -189
  29. data/html/classes/MIDI/Controller.src/M000137.html +0 -21
  30. data/html/classes/MIDI/Controller.src/M000138.html +0 -21
  31. data/html/classes/MIDI/Controller.src/M000139.html +0 -18
  32. data/html/classes/MIDI/Event.html +0 -507
  33. data/html/classes/MIDI/Event.src/M000169.html +0 -30
  34. data/html/classes/MIDI/Event.src/M000170.html +0 -18
  35. data/html/classes/MIDI/Event.src/M000171.html +0 -18
  36. data/html/classes/MIDI/Event.src/M000172.html +0 -18
  37. data/html/classes/MIDI/Event.src/M000173.html +0 -18
  38. data/html/classes/MIDI/Event.src/M000174.html +0 -18
  39. data/html/classes/MIDI/Event.src/M000175.html +0 -18
  40. data/html/classes/MIDI/Event.src/M000176.html +0 -18
  41. data/html/classes/MIDI/Event.src/M000177.html +0 -18
  42. data/html/classes/MIDI/Event.src/M000178.html +0 -18
  43. data/html/classes/MIDI/Event.src/M000179.html +0 -18
  44. data/html/classes/MIDI/Event.src/M000180.html +0 -18
  45. data/html/classes/MIDI/Event.src/M000181.html +0 -22
  46. data/html/classes/MIDI/Event.src/M000182.html +0 -18
  47. data/html/classes/MIDI/Event.src/M000183.html +0 -18
  48. data/html/classes/MIDI/Event.src/M000184.html +0 -19
  49. data/html/classes/MIDI/Event.src/M000185.html +0 -18
  50. data/html/classes/MIDI/IO/MIDIFile.html +0 -959
  51. data/html/classes/MIDI/IO/MIDIFile.src/M000031.html +0 -22
  52. data/html/classes/MIDI/IO/MIDIFile.src/M000032.html +0 -24
  53. data/html/classes/MIDI/IO/MIDIFile.src/M000033.html +0 -19
  54. data/html/classes/MIDI/IO/MIDIFile.src/M000034.html +0 -20
  55. data/html/classes/MIDI/IO/MIDIFile.src/M000035.html +0 -19
  56. data/html/classes/MIDI/IO/MIDIFile.src/M000036.html +0 -17
  57. data/html/classes/MIDI/IO/MIDIFile.src/M000037.html +0 -17
  58. data/html/classes/MIDI/IO/MIDIFile.src/M000038.html +0 -17
  59. data/html/classes/MIDI/IO/MIDIFile.src/M000039.html +0 -17
  60. data/html/classes/MIDI/IO/MIDIFile.src/M000040.html +0 -17
  61. data/html/classes/MIDI/IO/MIDIFile.src/M000041.html +0 -17
  62. data/html/classes/MIDI/IO/MIDIFile.src/M000042.html +0 -17
  63. data/html/classes/MIDI/IO/MIDIFile.src/M000043.html +0 -17
  64. data/html/classes/MIDI/IO/MIDIFile.src/M000044.html +0 -17
  65. data/html/classes/MIDI/IO/MIDIFile.src/M000045.html +0 -17
  66. data/html/classes/MIDI/IO/MIDIFile.src/M000046.html +0 -17
  67. data/html/classes/MIDI/IO/MIDIFile.src/M000047.html +0 -17
  68. data/html/classes/MIDI/IO/MIDIFile.src/M000048.html +0 -17
  69. data/html/classes/MIDI/IO/MIDIFile.src/M000049.html +0 -17
  70. data/html/classes/MIDI/IO/MIDIFile.src/M000050.html +0 -17
  71. data/html/classes/MIDI/IO/MIDIFile.src/M000051.html +0 -17
  72. data/html/classes/MIDI/IO/MIDIFile.src/M000052.html +0 -17
  73. data/html/classes/MIDI/IO/MIDIFile.src/M000053.html +0 -17
  74. data/html/classes/MIDI/IO/MIDIFile.src/M000054.html +0 -17
  75. data/html/classes/MIDI/IO/MIDIFile.src/M000055.html +0 -17
  76. data/html/classes/MIDI/IO/MIDIFile.src/M000056.html +0 -17
  77. data/html/classes/MIDI/IO/MIDIFile.src/M000057.html +0 -43
  78. data/html/classes/MIDI/IO/MIDIFile.src/M000058.html +0 -34
  79. data/html/classes/MIDI/IO/MIDIFile.src/M000059.html +0 -96
  80. data/html/classes/MIDI/IO/MIDIFile.src/M000060.html +0 -18
  81. data/html/classes/MIDI/IO/MIDIFile.src/M000061.html +0 -49
  82. data/html/classes/MIDI/IO/MIDIFile.src/M000062.html +0 -42
  83. data/html/classes/MIDI/IO/MIDIFile.src/M000063.html +0 -19
  84. data/html/classes/MIDI/IO/MIDIFile.src/M000064.html +0 -19
  85. data/html/classes/MIDI/IO/MIDIFile.src/M000065.html +0 -20
  86. data/html/classes/MIDI/IO/MIDIFile.src/M000066.html +0 -21
  87. data/html/classes/MIDI/IO/MIDIFile.src/M000067.html +0 -31
  88. data/html/classes/MIDI/IO/MIDIFile.src/M000068.html +0 -20
  89. data/html/classes/MIDI/IO/MIDIFile.src/M000069.html +0 -22
  90. data/html/classes/MIDI/IO/MIDIFile.src/M000070.html +0 -30
  91. data/html/classes/MIDI/IO/MIDIFile.src/M000071.html +0 -18
  92. data/html/classes/MIDI/IO/MIDIFile.src/M000072.html +0 -20
  93. data/html/classes/MIDI/IO/MIDIFile.src/M000073.html +0 -18
  94. data/html/classes/MIDI/IO/MIDIFile.src/M000074.html +0 -18
  95. data/html/classes/MIDI/IO/SeqReader.html +0 -476
  96. data/html/classes/MIDI/IO/SeqReader.src/M000002.html +0 -22
  97. data/html/classes/MIDI/IO/SeqReader.src/M000003.html +0 -22
  98. data/html/classes/MIDI/IO/SeqReader.src/M000004.html +0 -21
  99. data/html/classes/MIDI/IO/SeqReader.src/M000005.html +0 -34
  100. data/html/classes/MIDI/IO/SeqReader.src/M000006.html +0 -26
  101. data/html/classes/MIDI/IO/SeqReader.src/M000007.html +0 -28
  102. data/html/classes/MIDI/IO/SeqReader.src/M000008.html +0 -21
  103. data/html/classes/MIDI/IO/SeqReader.src/M000009.html +0 -19
  104. data/html/classes/MIDI/IO/SeqReader.src/M000010.html +0 -19
  105. data/html/classes/MIDI/IO/SeqReader.src/M000011.html +0 -19
  106. data/html/classes/MIDI/IO/SeqReader.src/M000012.html +0 -19
  107. data/html/classes/MIDI/IO/SeqReader.src/M000013.html +0 -19
  108. data/html/classes/MIDI/IO/SeqReader.src/M000014.html +0 -18
  109. data/html/classes/MIDI/IO/SeqReader.src/M000015.html +0 -18
  110. data/html/classes/MIDI/IO/SeqReader.src/M000016.html +0 -29
  111. data/html/classes/MIDI/IO/SeqReader.src/M000017.html +0 -19
  112. data/html/classes/MIDI/IO/SeqReader.src/M000018.html +0 -18
  113. data/html/classes/MIDI/IO/SeqReader.src/M000019.html +0 -18
  114. data/html/classes/MIDI/IO/SeqReader.src/M000020.html +0 -18
  115. data/html/classes/MIDI/IO/SeqWriter.html +0 -282
  116. data/html/classes/MIDI/IO/SeqWriter.src/M000021.html +0 -19
  117. data/html/classes/MIDI/IO/SeqWriter.src/M000022.html +0 -25
  118. data/html/classes/MIDI/IO/SeqWriter.src/M000023.html +0 -22
  119. data/html/classes/MIDI/IO/SeqWriter.src/M000024.html +0 -54
  120. data/html/classes/MIDI/IO/SeqWriter.src/M000025.html +0 -49
  121. data/html/classes/MIDI/IO/SeqWriter.src/M000026.html +0 -21
  122. data/html/classes/MIDI/IO/SeqWriter.src/M000027.html +0 -19
  123. data/html/classes/MIDI/IO/SeqWriter.src/M000028.html +0 -23
  124. data/html/classes/MIDI/IO/SeqWriter.src/M000029.html +0 -24
  125. data/html/classes/MIDI/IO/SeqWriter.src/M000030.html +0 -19
  126. data/html/classes/MIDI/IO.html +0 -121
  127. data/html/classes/MIDI/KeySig.html +0 -241
  128. data/html/classes/MIDI/KeySig.src/M000140.html +0 -19
  129. data/html/classes/MIDI/KeySig.src/M000141.html +0 -23
  130. data/html/classes/MIDI/KeySig.src/M000142.html +0 -18
  131. data/html/classes/MIDI/KeySig.src/M000143.html +0 -18
  132. data/html/classes/MIDI/KeySig.src/M000144.html +0 -18
  133. data/html/classes/MIDI/KeySig.src/M000145.html +0 -23
  134. data/html/classes/MIDI/Marker.html +0 -139
  135. data/html/classes/MIDI/Marker.src/M000114.html +0 -18
  136. data/html/classes/MIDI/Measure.html +0 -242
  137. data/html/classes/MIDI/Measure.src/M000150.html +0 -23
  138. data/html/classes/MIDI/Measure.src/M000151.html +0 -20
  139. data/html/classes/MIDI/Measure.src/M000152.html +0 -18
  140. data/html/classes/MIDI/Measures.html +0 -217
  141. data/html/classes/MIDI/Measures.src/M000108.html +0 -20
  142. data/html/classes/MIDI/Measures.src/M000109.html +0 -18
  143. data/html/classes/MIDI/Measures.src/M000110.html +0 -21
  144. data/html/classes/MIDI/MetaEvent.html +0 -189
  145. data/html/classes/MIDI/MetaEvent.src/M000195.html +0 -21
  146. data/html/classes/MIDI/MetaEvent.src/M000196.html +0 -23
  147. data/html/classes/MIDI/MetaEvent.src/M000197.html +0 -53
  148. data/html/classes/MIDI/NoteEvent.html +0 -233
  149. data/html/classes/MIDI/NoteEvent.src/M000095.html +0 -21
  150. data/html/classes/MIDI/NoteEvent.src/M000096.html +0 -20
  151. data/html/classes/MIDI/NoteEvent.src/M000097.html +0 -18
  152. data/html/classes/MIDI/NoteEvent.src/M000098.html +0 -21
  153. data/html/classes/MIDI/NoteOffEvent.html +0 -169
  154. data/html/classes/MIDI/NoteOffEvent.src/M000090.html +0 -19
  155. data/html/classes/MIDI/NoteOffEvent.src/M000091.html +0 -19
  156. data/html/classes/MIDI/NoteOnEvent.html +0 -169
  157. data/html/classes/MIDI/NoteOnEvent.src/M000106.html +0 -19
  158. data/html/classes/MIDI/NoteOnEvent.src/M000107.html +0 -19
  159. data/html/classes/MIDI/PitchBend.html +0 -184
  160. data/html/classes/MIDI/PitchBend.src/M000111.html +0 -19
  161. data/html/classes/MIDI/PitchBend.src/M000112.html +0 -21
  162. data/html/classes/MIDI/PitchBend.src/M000113.html +0 -18
  163. data/html/classes/MIDI/PolyPressure.html +0 -186
  164. data/html/classes/MIDI/PolyPressure.src/M000198.html +0 -18
  165. data/html/classes/MIDI/PolyPressure.src/M000199.html +0 -18
  166. data/html/classes/MIDI/PolyPressure.src/M000200.html +0 -18
  167. data/html/classes/MIDI/PolyPressure.src/M000201.html +0 -19
  168. data/html/classes/MIDI/ProgramChange.html +0 -184
  169. data/html/classes/MIDI/ProgramChange.src/M000103.html +0 -20
  170. data/html/classes/MIDI/ProgramChange.src/M000104.html +0 -20
  171. data/html/classes/MIDI/ProgramChange.src/M000105.html +0 -18
  172. data/html/classes/MIDI/Realtime.html +0 -171
  173. data/html/classes/MIDI/Realtime.src/M000087.html +0 -19
  174. data/html/classes/MIDI/Realtime.src/M000088.html +0 -19
  175. data/html/classes/MIDI/Realtime.src/M000089.html +0 -18
  176. data/html/classes/MIDI/Sequence.html +0 -500
  177. data/html/classes/MIDI/Sequence.src/M000115.html +0 -28
  178. data/html/classes/MIDI/Sequence.src/M000116.html +0 -21
  179. data/html/classes/MIDI/Sequence.src/M000117.html +0 -22
  180. data/html/classes/MIDI/Sequence.src/M000120.html +0 -18
  181. data/html/classes/MIDI/Sequence.src/M000121.html +0 -27
  182. data/html/classes/MIDI/Sequence.src/M000122.html +0 -18
  183. data/html/classes/MIDI/Sequence.src/M000123.html +0 -19
  184. data/html/classes/MIDI/Sequence.src/M000124.html +0 -19
  185. data/html/classes/MIDI/Sequence.src/M000125.html +0 -19
  186. data/html/classes/MIDI/Sequence.src/M000126.html +0 -19
  187. data/html/classes/MIDI/Sequence.src/M000127.html +0 -18
  188. data/html/classes/MIDI/Sequence.src/M000128.html +0 -54
  189. data/html/classes/MIDI/SongPointer.html +0 -184
  190. data/html/classes/MIDI/SongPointer.src/M000162.html +0 -19
  191. data/html/classes/MIDI/SongPointer.src/M000163.html +0 -21
  192. data/html/classes/MIDI/SongPointer.src/M000164.html +0 -18
  193. data/html/classes/MIDI/SongSelect.html +0 -184
  194. data/html/classes/MIDI/SongSelect.src/M000134.html +0 -19
  195. data/html/classes/MIDI/SongSelect.src/M000135.html +0 -20
  196. data/html/classes/MIDI/SongSelect.src/M000136.html +0 -18
  197. data/html/classes/MIDI/Start.html +0 -156
  198. data/html/classes/MIDI/Start.src/M000101.html +0 -18
  199. data/html/classes/MIDI/Start.src/M000102.html +0 -18
  200. data/html/classes/MIDI/Stop.html +0 -156
  201. data/html/classes/MIDI/Stop.src/M000099.html +0 -18
  202. data/html/classes/MIDI/Stop.src/M000100.html +0 -18
  203. data/html/classes/MIDI/SystemCommon.html +0 -139
  204. data/html/classes/MIDI/SystemCommon.src/M000168.html +0 -19
  205. data/html/classes/MIDI/SystemExclusive.html +0 -184
  206. data/html/classes/MIDI/SystemExclusive.src/M000165.html +0 -19
  207. data/html/classes/MIDI/SystemExclusive.src/M000166.html +0 -23
  208. data/html/classes/MIDI/SystemExclusive.src/M000167.html +0 -18
  209. data/html/classes/MIDI/SystemReset.html +0 -156
  210. data/html/classes/MIDI/SystemReset.src/M000085.html +0 -18
  211. data/html/classes/MIDI/SystemReset.src/M000086.html +0 -18
  212. data/html/classes/MIDI/Tempo.html +0 -250
  213. data/html/classes/MIDI/Tempo.src/M000186.html +0 -18
  214. data/html/classes/MIDI/Tempo.src/M000187.html +0 -20
  215. data/html/classes/MIDI/Tempo.src/M000188.html +0 -18
  216. data/html/classes/MIDI/Tempo.src/M000189.html +0 -18
  217. data/html/classes/MIDI/Tempo.src/M000190.html +0 -18
  218. data/html/classes/MIDI/Tempo.src/M000191.html +0 -24
  219. data/html/classes/MIDI/Tempo.src/M000192.html +0 -18
  220. data/html/classes/MIDI/TimeSig.html +0 -263
  221. data/html/classes/MIDI/TimeSig.src/M000153.html +0 -19
  222. data/html/classes/MIDI/TimeSig.src/M000154.html +0 -25
  223. data/html/classes/MIDI/TimeSig.src/M000155.html +0 -18
  224. data/html/classes/MIDI/TimeSig.src/M000156.html +0 -18
  225. data/html/classes/MIDI/TimeSig.src/M000157.html +0 -18
  226. data/html/classes/MIDI/TimeSig.src/M000158.html +0 -18
  227. data/html/classes/MIDI/TimeSig.src/M000159.html +0 -18
  228. data/html/classes/MIDI/Track.html +0 -389
  229. data/html/classes/MIDI/Track.src/M000075.html +0 -23
  230. data/html/classes/MIDI/Track.src/M000076.html +0 -21
  231. data/html/classes/MIDI/Track.src/M000077.html +0 -26
  232. data/html/classes/MIDI/Track.src/M000078.html +0 -18
  233. data/html/classes/MIDI/Track.src/M000079.html +0 -22
  234. data/html/classes/MIDI/Track.src/M000080.html +0 -25
  235. data/html/classes/MIDI/Track.src/M000081.html +0 -22
  236. data/html/classes/MIDI/Track.src/M000082.html +0 -26
  237. data/html/classes/MIDI/Track.src/M000083.html +0 -18
  238. data/html/classes/MIDI/Track.src/M000084.html +0 -19
  239. data/html/classes/MIDI/TuneRequest.html +0 -171
  240. data/html/classes/MIDI/TuneRequest.src/M000129.html +0 -18
  241. data/html/classes/MIDI/TuneRequest.src/M000130.html +0 -19
  242. data/html/classes/MIDI/TuneRequest.src/M000131.html +0 -18
  243. data/html/classes/MIDI/Utils.html +0 -190
  244. data/html/classes/MIDI/Utils.src/M000193.html +0 -20
  245. data/html/classes/MIDI/Utils.src/M000194.html +0 -25
  246. data/html/classes/MIDI.html +0 -758
  247. data/html/created.rid +0 -1
  248. data/html/files/README_rdoc.html +0 -720
  249. data/html/files/TODO_rdoc.html +0 -150
  250. data/html/files/lib/midilib/consts_rb.html +0 -107
  251. data/html/files/lib/midilib/event_rb.html +0 -109
  252. data/html/files/lib/midilib/info_rb.html +0 -101
  253. data/html/files/lib/midilib/io/midifile_rb.html +0 -108
  254. data/html/files/lib/midilib/io/seqreader_rb.html +0 -110
  255. data/html/files/lib/midilib/io/seqwriter_rb.html +0 -115
  256. data/html/files/lib/midilib/measure_rb.html +0 -108
  257. data/html/files/lib/midilib/sequence_rb.html +0 -110
  258. data/html/files/lib/midilib/track_rb.html +0 -108
  259. data/html/files/lib/midilib/utils_rb.html +0 -101
  260. data/html/files/lib/midilib_rb.html +0 -124
  261. data/html/fr_class_index.html +0 -64
  262. data/html/fr_file_index.html +0 -39
  263. data/html/fr_method_index.html +0 -227
  264. data/html/index.html +0 -24
  265. data/html/rdoc-style.css +0 -208
@@ -1,720 +0,0 @@
1
- <?xml version="1.0" encoding="iso-8859-1"?>
2
- <!DOCTYPE html
3
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
-
6
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
- <head>
8
- <title>File: README.rdoc</title>
9
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
- <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
- <link rel="stylesheet" href=".././rdoc-style.css" type="text/css" media="screen" />
12
- <script type="text/javascript">
13
- // <![CDATA[
14
-
15
- function popupCode( url ) {
16
- window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
- }
18
-
19
- function toggleCode( id ) {
20
- if ( document.getElementById )
21
- elem = document.getElementById( id );
22
- else if ( document.all )
23
- elem = eval( "document.all." + id );
24
- else
25
- return false;
26
-
27
- elemStyle = elem.style;
28
-
29
- if ( elemStyle.display != "block" ) {
30
- elemStyle.display = "block"
31
- } else {
32
- elemStyle.display = "none"
33
- }
34
-
35
- return true;
36
- }
37
-
38
- // Make codeblocks hidden by default
39
- document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
-
41
- // ]]>
42
- </script>
43
-
44
- </head>
45
- <body>
46
-
47
-
48
-
49
- <div id="fileHeader">
50
- <h1>README.rdoc</h1>
51
- <table class="header-table">
52
- <tr class="top-aligned-row">
53
- <td><strong>Path:</strong></td>
54
- <td>README.rdoc
55
- </td>
56
- </tr>
57
- <tr class="top-aligned-row">
58
- <td><strong>Last Update:</strong></td>
59
- <td>Sun Jan 04 21:29:11 -0500 2009</td>
60
- </tr>
61
- </table>
62
- </div>
63
- <!-- banner header -->
64
-
65
- <div id="bodyContent">
66
-
67
-
68
-
69
- <div id="contextContent">
70
-
71
- <div id="description">
72
- <h1>midilib</h1>
73
- <p>
74
- midilib is a pure Ruby <a href="../classes/MIDI.html">MIDI</a> library
75
- useful for reading and writing standard <a
76
- href="../classes/MIDI.html">MIDI</a> files and manipulating <a
77
- href="../classes/MIDI.html">MIDI</a> event data. Classes include <a
78
- href="../classes/MIDI/Sequence.html">MIDI::Sequence</a>, <a
79
- href="../classes/MIDI/Track.html">MIDI::Track</a>, <a
80
- href="../classes/MIDI/Event.html">MIDI::Event</a>, and <a
81
- href="../classes/MIDI/IO/MIDIFile.html">MIDI::IO::MIDIFile</a> and its
82
- subclasses <a
83
- href="../classes/MIDI/IO/SeqReader.html">MIDI::IO::SeqReader</a> and <a
84
- href="../classes/MIDI/IO/SeqWriter.html">MIDI::IO::SeqWriter</a>.
85
- </p>
86
- <p>
87
- The Web site of midilib is (<a
88
- href="http://midilib.rubyforge.org">midilib.rubyforge.org</a>). The
89
- RubyForge project page is <a
90
- href="http://rubyforge.org/projects/midilib">rubyforge.org/projects/midilib</a>,
91
- where the latest version of midilib may be downloaded. midilib is also
92
- available as a RubyGem.
93
- </p>
94
- <h2>Dependencies</h2>
95
- <p>
96
- midilib does not require any other packages. The test suite in the tests
97
- directory requires the testing framework TestUnit, which comes with Ruby
98
- 1.8 and later and can also be found in the Ruby Application Archive (<a
99
- href="http://raa.ruby-lang.org">raa.ruby-lang.org</a>).
100
- </p>
101
- <p>
102
- To rebuild the gem or RDocs or run the tests easily, you can use the
103
- Rakefile which requires Rake (<a
104
- href="http://rake.rubyforge.org">rake.rubyforge.org</a>).
105
- </p>
106
- <h2>Installation</h2>
107
- <h3>RubyGems Installation</h3>
108
- <p>
109
- To install midilib as a gem, type
110
- </p>
111
- <pre>
112
- % gem install midilib
113
- </pre>
114
- <p>
115
- or
116
- </p>
117
- <pre>
118
- % gem update midilib
119
- </pre>
120
- <p>
121
- if you already have a previous version. You may need root privileges to
122
- install or update the gem.
123
- </p>
124
- <h3>Manual Installation</h3>
125
- <p>
126
- After downloading and expanding the archive, you can install midilib with
127
- the command
128
- </p>
129
- <pre>
130
- % ruby install.rb
131
- </pre>
132
- <p>
133
- (or)
134
- </p>
135
- <pre>
136
- % ruby install.rb --install-dir=my_directory
137
- </pre>
138
- <p>
139
- You may need root privileges to install.
140
- </p>
141
- <h2>Testing</h2>
142
- <pre>
143
- % rake test
144
- </pre>
145
- <p>
146
- runs all of the tests in the test directory.
147
- </p>
148
- <h2>Overview</h2>
149
- <p>
150
- <a href="../classes/MIDI.html">MIDI</a> file <a
151
- href="../classes/IO.html">IO</a> only understands <a
152
- href="../classes/MIDI.html">MIDI</a> file format 1, where a sequence is
153
- made up of multiple tracks. It doesn&#8216;t yet understand format 0 (a
154
- single track containing all events) or format 2 (a collection of format 0
155
- files in one file).
156
- </p>
157
- <h3><a href="../classes/MIDI/Sequence.html">MIDI::Sequence</a></h3>
158
- <p>
159
- A sequence contains a collection of tracks and global information like the
160
- sequence&#8216;s pulses per quarter note (ppqn) and time signature.
161
- </p>
162
- <p>
163
- The first track in a sequence is special; it holds meta-events like tempo
164
- and sequence name. Don&#8216;t put any notes in this track.
165
- </p>
166
- <p>
167
- <a href="../classes/MIDI/Sequence.html">MIDI::Sequence</a> also contains
168
- some convenience methods that let you set and retrieve the sequence&#8216;s
169
- name, the time signature, and to retrieve the first tempo event&#8216;s
170
- beats-per-minute value.
171
- </p>
172
- <p>
173
- Normally instances of <a
174
- href="../classes/MIDI/IO/SeqReader.html">MIDI::IO::SeqReader</a> and <a
175
- href="../classes/MIDI/IO/SeqWriter.html">MIDI::IO::SeqWriter</a> are used
176
- when a sequence reads itself from or writes itself to a <a
177
- href="../classes/MIDI.html">MIDI</a> file. You can change that by setting a
178
- sequence&#8216;s reader_class or writer_class attributes. Instances of the
179
- classes contained in those attributes are created and used whenever the
180
- sequence reads or writes itself.
181
- </p>
182
- <h3><a href="../classes/MIDI/Track.html">MIDI::Track</a></h3>
183
- <p>
184
- A track contains an array of events.
185
- </p>
186
- <p>
187
- When you modify the <tt>events</tt> array, make sure to call recalc_times
188
- so each event gets its <tt>time_from_start</tt> recalculated. You
189
- don&#8216;t have to do that after every event you add; just remember to do
190
- so before using the track in a way that expects the list of events to be
191
- ordered correctly.
192
- </p>
193
- <p>
194
- A Track also holds a bit mask that specifies the channels used by the
195
- track. This bit mask is set when the track is read from the <a
196
- href="../classes/MIDI.html">MIDI</a> file by a SeqReader but is
197
- <em>not</em> kept up to date by any other methods. Specifically, if you add
198
- events to a track at any other time, the bit mask will not be updated.
199
- </p>
200
- <h3><a href="../classes/MIDI/Measure.html">MIDI::Measure</a></h3>
201
- <p>
202
- This class contains information about a measure from the sequence. Measure
203
- data is based on the time signature information from the sequence and is
204
- not stored in the sequence itself.
205
- </p>
206
- <h3><a href="../classes/MIDI/Measures.html">MIDI::Measures</a></h3>
207
- <p>
208
- The class <a href="../classes/MIDI/Sequence.html">MIDI::Sequence</a> method
209
- get_measures returns a <a
210
- href="../classes/MIDI/Measures.html">MIDI::Measures</a> object. <a
211
- href="../classes/MIDI/Measures.html">MIDI::Measures</a> is a subclass of
212
- Array. It is a specialized container for <a
213
- href="../classes/MIDI/Measure.html">MIDI::Measure</a> objects, which can be
214
- use to map event times to measure numbers. Please note that this object has
215
- to be remade when events are deleted/added in the sequence.
216
- </p>
217
- <p>
218
- <a href="../classes/MIDI/Measure.html">MIDI::Measure</a> and <a
219
- href="../classes/MIDI/Measures.html">MIDI::Measures</a> are brought to us
220
- by Jari Williamsson &lt;jari.williamsson@mailbox.swipnet.se&gt;, who also
221
- contributed some improvements to the <a
222
- href="../classes/MIDI/Event.html">MIDI::Event</a> and <a
223
- href="../classes/MIDI/Track.html">MIDI::Track</a> classes.
224
- </p>
225
- <h3><a href="../classes/MIDI/Event.html">MIDI::Event</a></h3>
226
- <p>
227
- Each event holds not only its delta time but also its time from the start
228
- of the track. The track is responsible for recalculating its events&#8217;
229
- start times. You can call MIDI::Track#recalc_times to do so.
230
- </p>
231
- <p>
232
- Events have a number of boolean methods that identify their types, like
233
- channel?, note?, note_on?, note_off?, meta?, system?, realtime?, and
234
- program_change?. Events know how to print themselves. By default, all
235
- numbers are printed as hexidecimal and channel numbers are printed from
236
- 0-15. Setting print_decimal_numbers to true will output decimal numbers and
237
- setting print_channel_numbers_from_one will output channel numbers from
238
- 1-16.
239
- </p>
240
- <p>
241
- Subclasses of <a href="../classes/MIDI/Event.html">MIDI::Event</a>
242
- implement the various <a href="../classes/MIDI.html">MIDI</a> messages such
243
- as note on and off, controller values, system exclusive data, and realtime
244
- bytes.
245
- </p>
246
- <p>
247
- <a href="../classes/MIDI/Realtime.html">MIDI::Realtime</a> events have
248
- delta values and start times, just like all the other midilib event types
249
- do. (<a href="../classes/MIDI.html">MIDI</a> real time status bytes
250
- don&#8216;t have delta times, but this way we can record when in a track
251
- the realtime byte was received and should be sent. This is useful for
252
- start/continue/stop events that control other devices, for example.) Note
253
- that when a <a href="../classes/MIDI/Realtime.html">MIDI::Realtime</a>
254
- event is written out to a <a href="../classes/MIDI.html">MIDI</a> file, the
255
- delta time is not written.
256
- </p>
257
- <h2>How To Use</h2>
258
- <p>
259
- The following examples show you how to use midilib to read, write, and
260
- manipulate <a href="../classes/MIDI.html">MIDI</a> files and modify track
261
- events. See also the files in the examples directory, which are described
262
- below.
263
- </p>
264
- <h3>Reading a <a href="../classes/MIDI.html">MIDI</a> File</h3>
265
- <p>
266
- To read a <a href="../classes/MIDI.html">MIDI</a> file, create a <a
267
- href="../classes/MIDI/Sequence.html">MIDI::Sequence</a> object and call its
268
- read method, passing in an <a href="../classes/IO.html">IO</a> object.
269
- </p>
270
- <p>
271
- The read method takes an optional block. If present, the block is called
272
- once after each track has finished being read. Each time, it is passed the
273
- total number of tracks and the number of the current track that has just
274
- been read. This is useful for notifying the user of progress, for example
275
- by updating a GUI progress bar.
276
- </p>
277
- <pre>
278
- require 'midi/io/seqreader'
279
-
280
- # Create a new, empty sequence.
281
- seq = MIDI::Sequence.new()
282
-
283
- # Read the contents of a MIDI file into the sequence.
284
- File.open('my_midi_file.mid', 'rb') { | file |
285
- seq.read(file) { | num_tracks, i |
286
- # Print something when each track is read.
287
- puts &quot;read track #{i} of #{num_tracks}&quot;
288
- }
289
- }
290
- </pre>
291
- <h3>Writing a <a href="../classes/MIDI.html">MIDI</a> File</h3>
292
- <p>
293
- To write a <a href="../classes/MIDI.html">MIDI</a> file, call the write
294
- method, passing in an <a href="../classes/IO.html">IO</a> object.
295
- </p>
296
- <pre>
297
- require 'midi/io/seqwriter'
298
-
299
- # Start with a sequence that has something worth saving.
300
- seq = read_or_create_seq_we_care_not_how()
301
-
302
- # Write the sequence to a MIDI file.
303
- File.open('my_output_file.mid', 'wb') { | file | seq.write(file) }
304
- </pre>
305
- <h3>Editing a <a href="../classes/MIDI.html">MIDI</a> File</h3>
306
- <p>
307
- Combining the last two examples, here is a script that reads a <a
308
- href="../classes/MIDI.html">MIDI</a> file, transposes some events, and
309
- writes the sequence out to a different file. This is a useful template for
310
- programatically manipulating <a href="../classes/MIDI.html">MIDI</a> data.
311
- </p>
312
- <p>
313
- This code transposes all of the note events (note on, note off, and poly
314
- pressure) on channel 5 down one octave. It&#8216;s easy to find events that
315
- need to be transposed: the method note? returns true.
316
- </p>
317
- <h4>Transposing One Channel</h4>
318
- <pre>
319
- require 'midi/io/seqreader'
320
- require 'midi/io/seqwriter'
321
-
322
- # Create a new, empty sequence.
323
- seq = MIDI::Sequence.new()
324
-
325
- # Read the contents of a MIDI file into the sequence.
326
- File.open('my_input_file.mid', 'rb') { | file |
327
- seq.read(file) { | num_tracks, i |
328
- # Print something when each track is read.
329
- puts &quot;read track #{i} of #{num_tracks}&quot;
330
- }
331
- }
332
-
333
- # Iterate over every event in every track.
334
- seq.each { | track |
335
- track.each { | event |
336
- # If the event is a note event (note on, note off, or poly
337
- # pressure) and it is on MIDI channel 5 (channels start at
338
- # 0, so we use 4), then transpose the event down one octave.
339
- if event.note? &amp;&amp; event.channel == 4
340
- event.note -= 12
341
- end
342
- }
343
- }
344
-
345
- # Write the sequence to a MIDI file.
346
- File.open('my_output_file.mid', 'wb') { | file | seq.write(file) }
347
- </pre>
348
- <h3>Manipulating tracks</h3>
349
- <p>
350
- If you modify a track&#8216;s list of events directly, don&#8216;t forget
351
- to call MIDI::Track#recalc_times when you are done.
352
- </p>
353
- <pre>
354
- track.events[42, 1] = array_of_events
355
- track.events &lt;&lt; an_event
356
- track.merge(array_of_events)
357
- track.recalc_times
358
- </pre>
359
- <h3>Calculating delta times</h3>
360
- <p>
361
- A few methods in <a href="../classes/MIDI/Sequence.html">MIDI::Sequence</a>
362
- make it easier to calculate the delta times that represent note lengths.
363
- MIDI::Sequence#length_to_delta takes a note length (a multiple of a quarter
364
- note) and returns the delta time given the sequence&#8216;s current ppqn
365
- (pulses per quarter note) setting. 1 is a quarter note, 1.0/32.0 is a 32nd
366
- note (use floating-point numbers to avoid integer rounding), 1.5 is a
367
- dotted quarter, etc. See the documentation for that method for more
368
- information.
369
- </p>
370
- <p>
371
- MIDI::Sequence#note_to_length takes a note name and returns a length value
372
- (again, as a multiple of a quarter note). Legal note names are those found
373
- in MIDI::Sequence::NOTE_TO_LENGTH, and may begin with &quot;dotted&quot;
374
- and/or end with &quot;triplet&quot;. For example, &quot;whole&quot;,
375
- &quot;sixteenth&quot;, &quot;32nd&quot;, &quot;quarter triplet&quot;,
376
- &quot;dotted 16th&quot;, and &quot;dotted 8th triplet&quot; are all legal
377
- note names.
378
- </p>
379
- <p>
380
- Finally, MIDI::Sequence#note_to_delta takes a note name and returns a delta
381
- time. It does this by calling note_to_length, then passing the result to
382
- length_to_delta.
383
- </p>
384
- <h3>Example Scripts</h3>
385
- <p>
386
- Here are short descriptions of each of the examples found in the examples
387
- directory.
388
- </p>
389
- <ul>
390
- <li>examples/from_scratch.rb shows you how to create a new sequence from
391
- scratch and save it to a <a href="../classes/MIDI.html">MIDI</a> file. It
392
- creates a file called &#8216;from_scratch.mid&#8217;.
393
-
394
- </li>
395
- <li>examples/seq2text.rb dumps a <a href="../classes/MIDI.html">MIDI</a> file
396
- as text. It reads in a sequence and uses the to_s method of each event.
397
-
398
- </li>
399
- <li>examples/reader2text.rb dumps a <a href="../classes/MIDI.html">MIDI</a>
400
- file as text. It subclasses MIDI::SeqReader instead of creating a sequence
401
- containing tracks and events.
402
-
403
- </li>
404
- <li>examples/transpose.rb transposes all note events (note on, note off, poly
405
- pressure) on a specified channel by a specified amount.
406
-
407
- </li>
408
- <li>There is also one <a href="../classes/MIDI.html">MIDI</a> file,
409
- examples/NoFences.mid. It is a little pop ditty I wrote. The instruments in
410
- this file use General <a href="../classes/MIDI.html">MIDI</a> patch numbers
411
- and drum note assignments. Since I don&#8216;t normally use GM patches, the
412
- sounds used here are at best approximations of the sounds I use.
413
-
414
- </li>
415
- </ul>
416
- <h2>Resources</h2>
417
- <p>
418
- The Ruby Web site (<a
419
- href="http://www.ruby-lang.org/en/index.html">www.ruby-lang.org/en/index.html</a>)
420
- contains an introduction to Ruby, the Ruby Application Archive (RAA) at <a
421
- href="http://raa.ruby-lang.org">raa.ruby-lang.org</a>, and pointers to more
422
- information.
423
- </p>
424
- <p>
425
- &lt;cite&gt;Programming Ruby, The Pragmatic Programmer&#8216;s
426
- Guide&lt;/cite&gt;, by David Thomas and Andrew Hunt, is a well-written and
427
- practical introduction to Ruby. Its Web page at <a
428
- href="http://www.rubycentral.com/book">www.rubycentral.com/book</a> also
429
- contains a wealth of Ruby information. Though the first edition book is
430
- available online, I encourage you to purchase a copy of the latest edition.
431
- </p>
432
- <p>
433
- A description of the <a href="../classes/MIDI.html">MIDI</a> file format
434
- can be found in a few places such as <a
435
- href="http://www.borg.com/~jglatt/tech/midifile.htm">www.borg.com/~jglatt/tech/midifile.htm</a>.
436
- </p>
437
- <p>
438
- The <a href="../classes/MIDI.html">MIDI</a> message reference at <a
439
- href="http://www.io.com/~jimm/midi_ref.html">www.io.com/~jimm/midi_ref.html</a>
440
- describes the format of <a href="../classes/MIDI.html">MIDI</a> commands.
441
- </p>
442
- <h1>To Do</h1>
443
- <h2>Bugs</h2>
444
- <ul>
445
- <li>Track#recalc_delta_from_times needs to use a stable sorting algorithm. See
446
- Adam&#8216;s notes at <a
447
- href="http://github.com/adamjmurray/cosy/wikis/midilib-notes">github.com/adamjmurray/cosy/wikis/midilib-notes</a>
448
- and solution at <a
449
- href="http://github.com/adamjmurray/cosy/tree/master/lib/cosy/renderer/midi_file_renderer.rb">github.com/adamjmurray/cosy/tree/master/lib/cosy/renderer/midi_file_renderer.rb</a>.
450
- Adam has given me permission to include his fix.
451
-
452
- </li>
453
- </ul>
454
- <h2>Features</h2>
455
- <ul>
456
- <li>Method to translate event&#8216;s time_from_start to number of milliseconds
457
- from start.
458
-
459
- </li>
460
- <li>Swing quantizing. (Implied by list email from Carl Youngblood
461
- &lt;carl.youngblood@gmail.com&gt;)
462
-
463
- </li>
464
- <li>Implement key signature in SeqReader.
465
-
466
- </li>
467
- <li>Format 0 files.
468
-
469
- </li>
470
- <li>Format 2 files(?).
471
-
472
- </li>
473
- </ul>
474
- <h2>Documentation</h2>
475
- <ul>
476
- <li>Write better docs.
477
-
478
- </li>
479
- </ul>
480
- <h2>Tests</h2>
481
- <ul>
482
- <li>Tests for Adam&#8216;s stable sorting algorithm.
483
-
484
- </li>
485
- <li>Tests for Noah Thorp&#8216;s midilib bug fixes.
486
-
487
- </li>
488
- </ul>
489
- <h1>Support</h1>
490
- <ul>
491
- <li>Visit the forums, bug list, and mailing list pages at <a
492
- href="http://rubyforge.org/projects/midilib">rubyforge.org/projects/midilib</a>
493
-
494
- </li>
495
- <li>Send email to Jim Menard at <a href="mailto:jimm@io.com">jimm@io.com</a>
496
-
497
- </li>
498
- <li>Ask on the ruby-talk mailing list
499
-
500
- </li>
501
- </ul>
502
- <h1>Administrivia</h1>
503
- <table>
504
- <tr><td valign="top">Author:</td><td>Jim Menard (<a href="mailto:jimm@io.com">jimm@io.com</a>)
505
-
506
- </td></tr>
507
- <tr><td valign="top">Copyright:</td><td>Copyright (c) 2003-2009 Jim Menard
508
-
509
- </td></tr>
510
- <tr><td valign="top">License:</td><td>Distributed under the same license as Ruby.
511
-
512
- </td></tr>
513
- </table>
514
- <h2>Copying</h2>
515
- <p>
516
- midilib is copyrighted free software by Jim Menard and is released under
517
- the same license as Ruby. See the Ruby license at <a
518
- href="http://www.ruby-lang.org/en/LICENSE.txt">www.ruby-lang.org/en/LICENSE.txt</a>.
519
- </p>
520
- <p>
521
- midilib may be freely copied in its entirety providing this notice, all
522
- source code, all documentation, and all other files are included.
523
- </p>
524
- <p>
525
- midilib is Copyright (c) 2003-2009 by Jim Menard.
526
- </p>
527
- <p>
528
- The song &quot;No Fences&quot; contained in the <a
529
- href="../classes/MIDI.html">MIDI</a> file examples/NoFences.mid is
530
- Copyright (c) 1992 by Jim Menard (jimm@io.com). It may be freely used for
531
- non-commercial purposes as long as the author is given credit.
532
- </p>
533
- <h3>Recent Changes</h3>
534
- <h4>Changes for 1.2.0:</h4>
535
- <p>
536
- Use byte arrays instead of strings for passing around data. All tests now
537
- pass for both Ruby 1.8.X and 1.9.X.
538
- </p>
539
- <h4>New code repository</h4>
540
- <p>
541
- The midilib code is now hosted at Github (<a
542
- href="http://github.com/jimm/midilib">github.com/jimm/midilib</a>).
543
- </p>
544
- <h4>Changes for 1.1.4:</h4>
545
- <ul>
546
- <li>Fixed a bug in KeySig.data_as_bytes. Thanks to Noah Thorp for finding this
547
- and the bug fixed in 1.1.3.
548
-
549
- </li>
550
- </ul>
551
- <h4>Changes for 1.1.3:</h4>
552
- <ul>
553
- <li>Fixed the way midilib detects the behavior of IO.getc.
554
-
555
- </li>
556
- </ul>
557
- <h4>Changes for 1.1.2:</h4>
558
- <ul>
559
- <li>Define MIDI::IO::MIDIFile.getc differently for different Ruby versions,
560
- instead of checking for String.bytes every time we read a byte.
561
-
562
- </li>
563
- </ul>
564
- <h4>Changes for 1.1.1:</h4>
565
- <ul>
566
- <li>Make MIDI::IO::MIDIFile.getc do the right thing for both Ruby 1.8 and 1.9.
567
-
568
- </li>
569
- </ul>
570
- <h4>Changes for 1.1.0:</h4>
571
- <ul>
572
- <li>Added test/test.mid to list of files to be included when packaging midifile
573
- for distribution.
574
-
575
- </li>
576
- </ul>
577
- <h4>Changes for 1.0.0:</h4>
578
- <ul>
579
- <li>Fixed the bug in Track#recalc_delta_from_times found by Christopher Rose.
580
-
581
- </li>
582
- </ul>
583
- <h4>Changes for 0.8.7:</h4>
584
- <ul>
585
- <li>Fixed the misspelled POLY_PRESSURE constant, thanks to Mario Pehle.
586
-
587
- </li>
588
- </ul>
589
- <h4>Changes for 0.8.6:</h4>
590
- <ul>
591
- <li>Added missing test/test.mid.
592
-
593
- </li>
594
- </ul>
595
- <h4>Changes for 0.8.5:</h4>
596
- <ul>
597
- <li>Fixed bugs in <a href="../classes/MIDI/PitchBend.html">MIDI::PitchBend</a>
598
- reading and writing, thanks to Emanuel Borsboom.
599
-
600
- </li>
601
- <li>Fixed a bug in MIDI::Track#quantize.
602
-
603
- </li>
604
- <li>The argument to MIDI::Track#quantize has changed: it is now either a note
605
- name (&quot;sixteenth&quot;, &quot;32nd&quot;, &quot;8th triplet&quot;) or
606
- a length (1 = quarter, 0.25 = sixteenth). This is a drastic change that
607
- will break all previous calls to quantize. However, since that method was
608
- broken already, I don&#8216;t feel it&#8216;s a burden to anybody to change
609
- the arguments.
610
-
611
- </li>
612
- </ul>
613
- <h4>Changes for 0.8.4:</h4>
614
- <ul>
615
- <li>Realtime status bytes now set @is_realtime to true and return true when
616
- realtime? is called.
617
-
618
- </li>
619
- <li>All system common events now set @is_system to true and return true when
620
- system? is called, not just system exclusive events.
621
-
622
- </li>
623
- <li>Added examples/from_scratch.rb, which shows how to create a sequence
624
- manually.
625
-
626
- </li>
627
- <li>New <a href="../classes/MIDI/Sequence.html">MIDI::Sequence</a> methods that
628
- turn note length names like &quot;32nd&quot;, &quot;dotted quarter&quot;,
629
- and &quot;16th triplet&quot; into delta times. See the docs below and
630
- MIDI::Sequence::length_to_delta, MIDI::Sequence::note_to_length, and
631
- MIDI::Sequence::note_to_delta.
632
-
633
- </li>
634
- </ul>
635
- <h4>Changes for 0.8.3:</h4>
636
- <ul>
637
- <li>Added MIDI::NoteEvent.note_to_s, which returns note name as a string like
638
- &quot;C4&quot; or &quot;F#6&quot;.
639
-
640
- </li>
641
- <li>Added new boolean attributes to <a
642
- href="../classes/MIDI/Event.html">MIDI::Event</a>: @print_decimal_numbers
643
- and @print_note_names. These are used by all Event to_s methods. See
644
- examples/seq2text.rb for an example.
645
-
646
- </li>
647
- </ul>
648
- <h4>Changes for 0.8.2:</h4>
649
- <ul>
650
- <li>Changed MIDI::MetaEvent.type to MIDI::MetaEvent.event_type to avoid runtime
651
- complaints about Object#type calls.
652
-
653
- </li>
654
- <li>Added &#8216;b&#8217; binary flag to file open modes for Windows.
655
-
656
- </li>
657
- <li>Fixed $LOAD_PATH in example files.
658
-
659
- </li>
660
- <li>Fixed read and write block arguments.
661
-
662
- </li>
663
- <li>Fixed other example script bugs.
664
-
665
- </li>
666
- </ul>
667
- <h4>Changes for 0.8.1:</h4>
668
- <ul>
669
- <li>Fixed track sorting.
670
-
671
- </li>
672
- <li>Fixed track&#8216;s recalc_delta_from_times method.
673
-
674
- </li>
675
- <li>Fixed event quantization.
676
-
677
- </li>
678
- <li>More tests and documentation.
679
-
680
- </li>
681
- </ul>
682
- <h2>Warranty</h2>
683
- <p>
684
- This software is provided &quot;as is&quot; and without any express or
685
- implied warranties, including, without limitation, the implied warranties
686
- of merchantability and fitness for a particular purpose.
687
- </p>
688
-
689
- </div>
690
-
691
-
692
- </div>
693
-
694
-
695
- </div>
696
-
697
-
698
- <!-- if includes -->
699
-
700
- <div id="section">
701
-
702
-
703
-
704
-
705
-
706
-
707
-
708
-
709
- <!-- if method_list -->
710
-
711
-
712
- </div>
713
-
714
-
715
- <div id="validator-badges">
716
- <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
717
- </div>
718
-
719
- </body>
720
- </html>