midilib 1.1.4 → 1.2.0

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 (296) hide show
  1. data/{README → README.rdoc} +12 -3
  2. data/Rakefile +11 -5
  3. data/TODO.rdoc +31 -0
  4. data/html/classes/IO.html +137 -0
  5. data/html/classes/IO.src/M000001.html +20 -0
  6. data/html/classes/MIDI/ActiveSense.html +10 -10
  7. data/html/classes/MIDI/ActiveSense.src/{M000158.html → M000160.html} +1 -1
  8. data/html/classes/MIDI/ActiveSense.src/{M000159.html → M000161.html} +1 -1
  9. data/html/classes/MIDI/ChannelEvent.html +10 -10
  10. data/html/classes/MIDI/ChannelEvent.src/{M000130.html → M000132.html} +0 -0
  11. data/html/classes/MIDI/ChannelEvent.src/{M000131.html → M000133.html} +0 -0
  12. data/html/classes/MIDI/ChannelPressure.html +15 -15
  13. data/html/classes/MIDI/ChannelPressure.src/M000092.html +5 -4
  14. data/html/classes/MIDI/ChannelPressure.src/{M000091.html → M000093.html} +2 -3
  15. data/html/classes/MIDI/ChannelPressure.src/M000094.html +18 -0
  16. data/html/classes/MIDI/Clock.html +10 -10
  17. data/html/classes/MIDI/Clock.src/{M000146.html → M000148.html} +1 -1
  18. data/html/classes/MIDI/Clock.src/{M000147.html → M000149.html} +1 -1
  19. data/html/classes/MIDI/Continue.html +10 -10
  20. data/html/classes/MIDI/Continue.src/{M000144.html → M000146.html} +1 -1
  21. data/html/classes/MIDI/Continue.src/{M000145.html → M000147.html} +1 -1
  22. data/html/classes/MIDI/Controller.html +15 -15
  23. data/html/classes/MIDI/Controller.src/M000137.html +7 -4
  24. data/html/classes/MIDI/Controller.src/{M000136.html → M000138.html} +2 -3
  25. data/html/classes/MIDI/Controller.src/M000139.html +18 -0
  26. data/html/classes/MIDI/Event.html +90 -90
  27. data/html/classes/MIDI/Event.src/M000169.html +16 -4
  28. data/html/classes/MIDI/Event.src/M000170.html +4 -4
  29. data/html/classes/MIDI/Event.src/M000171.html +4 -4
  30. data/html/classes/MIDI/Event.src/M000172.html +4 -4
  31. data/html/classes/MIDI/Event.src/M000173.html +4 -4
  32. data/html/classes/MIDI/Event.src/M000174.html +4 -4
  33. data/html/classes/MIDI/Event.src/M000175.html +4 -4
  34. data/html/classes/MIDI/Event.src/M000176.html +4 -4
  35. data/html/classes/MIDI/Event.src/M000177.html +4 -4
  36. data/html/classes/MIDI/Event.src/M000178.html +4 -4
  37. data/html/classes/MIDI/Event.src/M000179.html +4 -8
  38. data/html/classes/MIDI/Event.src/M000180.html +4 -4
  39. data/html/classes/MIDI/Event.src/M000181.html +8 -4
  40. data/html/classes/MIDI/Event.src/M000182.html +4 -5
  41. data/html/classes/MIDI/Event.src/M000183.html +4 -4
  42. data/html/classes/MIDI/Event.src/M000184.html +19 -0
  43. data/html/classes/MIDI/{PolyPressure.src/M000197.html → Event.src/M000185.html} +4 -4
  44. data/html/classes/MIDI/IO/MIDIFile.html +247 -230
  45. data/html/classes/MIDI/IO/MIDIFile.src/M000031.html +9 -6
  46. data/html/classes/MIDI/IO/MIDIFile.src/M000032.html +11 -6
  47. data/html/classes/MIDI/IO/MIDIFile.src/M000033.html +4 -4
  48. data/html/classes/MIDI/IO/MIDIFile.src/M000034.html +6 -3
  49. data/html/classes/MIDI/IO/MIDIFile.src/M000035.html +5 -3
  50. data/html/classes/MIDI/IO/MIDIFile.src/M000036.html +3 -3
  51. data/html/classes/MIDI/IO/MIDIFile.src/M000037.html +3 -3
  52. data/html/classes/MIDI/IO/MIDIFile.src/M000038.html +3 -3
  53. data/html/classes/MIDI/IO/MIDIFile.src/M000039.html +3 -3
  54. data/html/classes/MIDI/IO/MIDIFile.src/M000040.html +3 -3
  55. data/html/classes/MIDI/IO/MIDIFile.src/M000041.html +3 -3
  56. data/html/classes/MIDI/IO/MIDIFile.src/M000042.html +3 -3
  57. data/html/classes/MIDI/IO/MIDIFile.src/M000043.html +3 -3
  58. data/html/classes/MIDI/IO/MIDIFile.src/M000044.html +3 -3
  59. data/html/classes/MIDI/IO/MIDIFile.src/M000045.html +3 -3
  60. data/html/classes/MIDI/IO/MIDIFile.src/M000046.html +3 -3
  61. data/html/classes/MIDI/IO/MIDIFile.src/M000047.html +3 -3
  62. data/html/classes/MIDI/IO/MIDIFile.src/M000048.html +3 -3
  63. data/html/classes/MIDI/IO/MIDIFile.src/M000049.html +3 -3
  64. data/html/classes/MIDI/IO/MIDIFile.src/M000050.html +3 -3
  65. data/html/classes/MIDI/IO/MIDIFile.src/M000051.html +3 -3
  66. data/html/classes/MIDI/IO/MIDIFile.src/M000052.html +3 -3
  67. data/html/classes/MIDI/IO/MIDIFile.src/M000053.html +3 -3
  68. data/html/classes/MIDI/IO/MIDIFile.src/M000054.html +3 -3
  69. data/html/classes/MIDI/IO/MIDIFile.src/M000055.html +3 -29
  70. data/html/classes/MIDI/IO/MIDIFile.src/M000056.html +3 -20
  71. data/html/classes/MIDI/IO/MIDIFile.src/M000057.html +21 -74
  72. data/html/classes/MIDI/IO/MIDIFile.src/M000058.html +20 -4
  73. data/html/classes/MIDI/IO/MIDIFile.src/M000059.html +81 -33
  74. data/html/classes/MIDI/IO/MIDIFile.src/M000060.html +4 -28
  75. data/html/classes/MIDI/IO/MIDIFile.src/M000061.html +35 -5
  76. data/html/classes/MIDI/IO/MIDIFile.src/M000062.html +28 -5
  77. data/html/classes/MIDI/IO/MIDIFile.src/M000063.html +5 -6
  78. data/html/classes/MIDI/IO/MIDIFile.src/M000064.html +5 -7
  79. data/html/classes/MIDI/IO/MIDIFile.src/M000065.html +5 -16
  80. data/html/classes/MIDI/IO/MIDIFile.src/M000066.html +7 -6
  81. data/html/classes/MIDI/IO/MIDIFile.src/M000067.html +17 -8
  82. data/html/classes/MIDI/IO/MIDIFile.src/M000068.html +6 -16
  83. data/html/classes/MIDI/IO/MIDIFile.src/M000069.html +8 -4
  84. data/html/classes/MIDI/IO/MIDIFile.src/M000070.html +16 -6
  85. data/html/classes/MIDI/IO/MIDIFile.src/M000071.html +4 -4
  86. data/html/classes/MIDI/IO/MIDIFile.src/M000072.html +6 -4
  87. data/html/classes/MIDI/IO/MIDIFile.src/{M000029.html → M000073.html} +4 -8
  88. data/html/classes/MIDI/IO/MIDIFile.src/M000074.html +18 -0
  89. data/html/classes/MIDI/IO/SeqReader.html +98 -98
  90. data/html/classes/MIDI/IO/SeqReader.src/M000002.html +8 -8
  91. data/html/classes/MIDI/IO/SeqReader.src/M000003.html +7 -6
  92. data/html/classes/MIDI/IO/SeqReader.src/M000004.html +6 -19
  93. data/html/classes/MIDI/IO/SeqReader.src/M000005.html +19 -11
  94. data/html/classes/MIDI/IO/SeqReader.src/M000006.html +12 -14
  95. data/html/classes/MIDI/IO/SeqReader.src/M000007.html +14 -7
  96. data/html/classes/MIDI/IO/SeqReader.src/M000008.html +7 -5
  97. data/html/classes/MIDI/IO/SeqReader.src/M000009.html +4 -4
  98. data/html/classes/MIDI/IO/SeqReader.src/M000010.html +4 -4
  99. data/html/classes/MIDI/IO/SeqReader.src/M000011.html +4 -4
  100. data/html/classes/MIDI/IO/SeqReader.src/M000012.html +4 -4
  101. data/html/classes/MIDI/IO/SeqReader.src/M000013.html +5 -4
  102. data/html/classes/MIDI/IO/SeqReader.src/M000014.html +4 -4
  103. data/html/classes/MIDI/IO/SeqReader.src/M000015.html +4 -15
  104. data/html/classes/MIDI/IO/SeqReader.src/M000016.html +15 -5
  105. data/html/classes/MIDI/IO/SeqReader.src/M000017.html +5 -4
  106. data/html/classes/MIDI/IO/SeqReader.src/M000018.html +4 -4
  107. data/html/classes/MIDI/IO/SeqReader.src/M000019.html +4 -4
  108. data/html/classes/MIDI/IO/SeqReader.src/M000020.html +18 -0
  109. data/html/classes/MIDI/IO/SeqWriter.html +60 -45
  110. data/html/classes/MIDI/IO/SeqWriter.src/M000021.html +5 -11
  111. data/html/classes/MIDI/IO/SeqWriter.src/M000022.html +11 -8
  112. data/html/classes/MIDI/IO/SeqWriter.src/M000023.html +8 -40
  113. data/html/classes/MIDI/IO/SeqWriter.src/M000024.html +39 -34
  114. data/html/classes/MIDI/IO/SeqWriter.src/M000025.html +35 -7
  115. data/html/classes/MIDI/IO/SeqWriter.src/M000026.html +7 -5
  116. data/html/classes/MIDI/IO/SeqWriter.src/M000027.html +5 -10
  117. data/html/classes/MIDI/IO/SeqWriter.src/M000028.html +8 -11
  118. data/html/classes/MIDI/IO/SeqWriter.src/M000029.html +24 -0
  119. data/html/classes/MIDI/IO/SeqWriter.src/M000030.html +19 -0
  120. data/html/classes/MIDI/KeySig.html +30 -30
  121. data/html/classes/MIDI/KeySig.src/M000140.html +5 -4
  122. data/html/classes/MIDI/KeySig.src/M000141.html +9 -4
  123. data/html/classes/MIDI/KeySig.src/M000142.html +4 -4
  124. data/html/classes/MIDI/KeySig.src/M000143.html +4 -9
  125. data/html/classes/MIDI/KeySig.src/M000144.html +18 -0
  126. data/html/classes/MIDI/KeySig.src/M000145.html +23 -0
  127. data/html/classes/MIDI/Marker.html +5 -5
  128. data/html/classes/MIDI/Marker.src/{M000112.html → M000114.html} +1 -1
  129. data/html/classes/MIDI/Measure.html +15 -15
  130. data/html/classes/MIDI/Measure.src/M000150.html +9 -4
  131. data/html/classes/MIDI/Measure.src/{M000149.html → M000151.html} +0 -0
  132. data/html/classes/MIDI/Measure.src/M000152.html +18 -0
  133. data/html/classes/MIDI/Measures.html +15 -15
  134. data/html/classes/MIDI/Measures.src/M000108.html +6 -7
  135. data/html/classes/MIDI/Measures.src/{M000107.html → M000109.html} +0 -0
  136. data/html/classes/MIDI/Measures.src/M000110.html +21 -0
  137. data/html/classes/MIDI/MetaEvent.html +15 -15
  138. data/html/classes/MIDI/MetaEvent.src/M000195.html +7 -39
  139. data/html/classes/MIDI/MetaEvent.src/{M000194.html → M000196.html} +3 -3
  140. data/html/classes/MIDI/MetaEvent.src/M000197.html +53 -0
  141. data/html/classes/MIDI/NoteEvent.html +21 -21
  142. data/html/classes/MIDI/NoteEvent.src/M000095.html +7 -4
  143. data/html/classes/MIDI/NoteEvent.src/M000096.html +6 -8
  144. data/html/classes/MIDI/NoteEvent.src/M000097.html +18 -0
  145. data/html/classes/MIDI/NoteEvent.src/M000098.html +21 -0
  146. data/html/classes/MIDI/NoteOffEvent.html +10 -10
  147. data/html/classes/MIDI/NoteOffEvent.src/{M000088.html → M000090.html} +1 -1
  148. data/html/classes/MIDI/NoteOffEvent.src/{M000089.html → M000091.html} +1 -1
  149. data/html/classes/MIDI/NoteOnEvent.html +10 -10
  150. data/html/classes/MIDI/NoteOnEvent.src/{M000104.html → M000106.html} +1 -1
  151. data/html/classes/MIDI/NoteOnEvent.src/{M000105.html → M000107.html} +1 -1
  152. data/html/classes/MIDI/PitchBend.html +15 -15
  153. data/html/classes/MIDI/PitchBend.src/M000111.html +5 -4
  154. data/html/classes/MIDI/PitchBend.src/{M000110.html → M000112.html} +2 -3
  155. data/html/classes/MIDI/PitchBend.src/M000113.html +18 -0
  156. data/html/classes/MIDI/PolyPressure.html +20 -20
  157. data/html/classes/MIDI/PolyPressure.src/M000198.html +4 -4
  158. data/html/classes/MIDI/PolyPressure.src/M000199.html +4 -5
  159. data/html/classes/MIDI/PolyPressure.src/M000200.html +18 -0
  160. data/html/classes/MIDI/PolyPressure.src/M000201.html +19 -0
  161. data/html/classes/MIDI/ProgramChange.html +15 -15
  162. data/html/classes/MIDI/ProgramChange.src/M000103.html +6 -4
  163. data/html/classes/MIDI/ProgramChange.src/{M000102.html → M000104.html} +2 -3
  164. data/html/classes/MIDI/ProgramChange.src/M000105.html +18 -0
  165. data/html/classes/MIDI/Realtime.html +15 -15
  166. data/html/classes/MIDI/Realtime.src/M000087.html +5 -4
  167. data/html/classes/MIDI/Realtime.src/{M000086.html → M000088.html} +2 -3
  168. data/html/classes/MIDI/Realtime.src/M000089.html +18 -0
  169. data/html/classes/MIDI/Sequence.html +76 -76
  170. data/html/classes/MIDI/Sequence.src/M000115.html +14 -8
  171. data/html/classes/MIDI/Sequence.src/{M000114.html → M000116.html} +0 -0
  172. data/html/classes/MIDI/Sequence.src/M000117.html +22 -0
  173. data/html/classes/MIDI/Sequence.src/M000120.html +4 -4
  174. data/html/classes/MIDI/Sequence.src/M000121.html +13 -5
  175. data/html/classes/MIDI/Sequence.src/M000122.html +4 -5
  176. data/html/classes/MIDI/Sequence.src/M000123.html +5 -5
  177. data/html/classes/MIDI/Sequence.src/M000124.html +5 -5
  178. data/html/classes/MIDI/Sequence.src/M000125.html +5 -4
  179. data/html/classes/MIDI/Sequence.src/M000126.html +5 -40
  180. data/html/classes/MIDI/Sequence.src/{M000118.html → M000127.html} +4 -4
  181. data/html/classes/MIDI/Sequence.src/M000128.html +54 -0
  182. data/html/classes/MIDI/SongPointer.html +15 -15
  183. data/html/classes/MIDI/SongPointer.src/M000162.html +5 -4
  184. data/html/classes/MIDI/SongPointer.src/{M000161.html → M000163.html} +2 -3
  185. data/html/classes/MIDI/SongPointer.src/M000164.html +18 -0
  186. data/html/classes/MIDI/SongSelect.html +15 -15
  187. data/html/classes/MIDI/SongSelect.src/M000134.html +5 -4
  188. data/html/classes/MIDI/SongSelect.src/{M000133.html → M000135.html} +2 -3
  189. data/html/classes/MIDI/SongSelect.src/M000136.html +18 -0
  190. data/html/classes/MIDI/Start.html +10 -10
  191. data/html/classes/MIDI/Start.src/{M000099.html → M000101.html} +1 -1
  192. data/html/classes/MIDI/Start.src/{M000100.html → M000102.html} +1 -1
  193. data/html/classes/MIDI/Stop.html +10 -10
  194. data/html/classes/MIDI/Stop.src/{M000097.html → M000099.html} +1 -1
  195. data/html/classes/MIDI/Stop.src/{M000098.html → M000100.html} +1 -1
  196. data/html/classes/MIDI/SystemCommon.html +5 -5
  197. data/html/classes/MIDI/SystemCommon.src/{M000166.html → M000168.html} +1 -1
  198. data/html/classes/MIDI/SystemExclusive.html +15 -15
  199. data/html/classes/MIDI/SystemExclusive.src/M000165.html +5 -4
  200. data/html/classes/MIDI/SystemExclusive.src/{M000164.html → M000166.html} +3 -3
  201. data/html/classes/MIDI/SystemExclusive.src/M000167.html +18 -0
  202. data/html/classes/MIDI/SystemReset.html +10 -10
  203. data/html/classes/MIDI/SystemReset.src/{M000083.html → M000085.html} +1 -1
  204. data/html/classes/MIDI/SystemReset.src/{M000084.html → M000086.html} +1 -1
  205. data/html/classes/MIDI/Tempo.html +35 -35
  206. data/html/classes/MIDI/Tempo.src/M000186.html +4 -4
  207. data/html/classes/MIDI/Tempo.src/M000187.html +6 -4
  208. data/html/classes/MIDI/Tempo.src/M000188.html +4 -4
  209. data/html/classes/MIDI/Tempo.src/M000189.html +4 -11
  210. data/html/classes/MIDI/Tempo.src/M000190.html +4 -4
  211. data/html/classes/MIDI/{TimeSig.src/M000152.html → Tempo.src/M000191.html} +7 -8
  212. data/html/classes/MIDI/{Event.src/M000168.html → Tempo.src/M000192.html} +4 -4
  213. data/html/classes/MIDI/TimeSig.html +37 -37
  214. data/html/classes/MIDI/TimeSig.src/M000153.html +5 -4
  215. data/html/classes/MIDI/TimeSig.src/M000154.html +11 -4
  216. data/html/classes/MIDI/TimeSig.src/M000155.html +4 -4
  217. data/html/classes/MIDI/TimeSig.src/M000156.html +4 -4
  218. data/html/classes/MIDI/TimeSig.src/M000157.html +4 -4
  219. data/html/classes/MIDI/TimeSig.src/M000158.html +18 -0
  220. data/html/classes/MIDI/TimeSig.src/M000159.html +18 -0
  221. data/html/classes/MIDI/Track.html +66 -66
  222. data/html/classes/MIDI/Track.src/M000075.html +9 -12
  223. data/html/classes/MIDI/Track.src/M000076.html +7 -4
  224. data/html/classes/MIDI/Track.src/M000077.html +12 -8
  225. data/html/classes/MIDI/Track.src/M000078.html +4 -11
  226. data/html/classes/MIDI/Track.src/M000079.html +8 -8
  227. data/html/classes/MIDI/Track.src/M000080.html +11 -12
  228. data/html/classes/MIDI/Track.src/M000081.html +8 -4
  229. data/html/classes/MIDI/Track.src/M000082.html +12 -5
  230. data/html/classes/MIDI/Track.src/M000083.html +18 -0
  231. data/html/classes/MIDI/Track.src/{M000073.html → M000084.html} +5 -9
  232. data/html/classes/MIDI/TuneRequest.html +15 -15
  233. data/html/classes/MIDI/TuneRequest.src/M000129.html +4 -4
  234. data/html/classes/MIDI/TuneRequest.src/{M000128.html → M000130.html} +2 -3
  235. data/html/classes/MIDI/TuneRequest.src/M000131.html +18 -0
  236. data/html/classes/MIDI/Utils.html +10 -10
  237. data/html/classes/MIDI/Utils.src/{M000191.html → M000193.html} +0 -0
  238. data/html/classes/MIDI/Utils.src/{M000192.html → M000194.html} +1 -1
  239. data/html/classes/MIDI.html +3 -3
  240. data/html/created.rid +1 -1
  241. data/html/files/{README.html → README_rdoc.html} +30 -11
  242. data/html/files/{TODO.html → TODO_rdoc.html} +14 -6
  243. data/html/files/lib/midilib/consts_rb.html +1 -1
  244. data/html/files/lib/midilib/event_rb.html +1 -1
  245. data/html/files/lib/midilib/info_rb.html +1 -1
  246. data/html/files/lib/midilib/io/midifile_rb.html +1 -1
  247. data/html/files/lib/midilib/io/seqreader_rb.html +1 -1
  248. data/html/files/lib/midilib/io/seqwriter_rb.html +1 -1
  249. data/html/files/lib/midilib/measure_rb.html +1 -1
  250. data/html/files/lib/midilib/sequence_rb.html +1 -1
  251. data/html/files/lib/midilib/track_rb.html +1 -1
  252. data/html/files/lib/midilib/utils_rb.html +1 -1
  253. data/html/files/lib/midilib_rb.html +2 -2
  254. data/html/fr_class_index.html +1 -0
  255. data/html/fr_file_index.html +2 -2
  256. data/html/fr_method_index.html +201 -199
  257. data/html/index.html +1 -1
  258. data/install.rb +1 -1
  259. data/lib/midilib/event.rb +16 -26
  260. data/lib/midilib/info.rb +3 -3
  261. data/lib/midilib/io/midifile.rb +43 -29
  262. data/lib/midilib/io/seqwriter.rb +19 -17
  263. data/lib/midilib/utils.rb +1 -1
  264. data/lib/midilib.rb +1 -1
  265. data/test/test_io.rb +2 -1
  266. data/test/test_midifile.rb +59 -0
  267. data/test/test_varlen.rb +4 -4
  268. metadata +83 -78
  269. data/TODO +0 -25
  270. data/html/classes/MIDI/ChannelPressure.src/M000090.html +0 -19
  271. data/html/classes/MIDI/Controller.src/M000135.html +0 -21
  272. data/html/classes/MIDI/Event.src/M000167.html +0 -30
  273. data/html/classes/MIDI/IO/MIDIFile.src/M000030.html +0 -24
  274. data/html/classes/MIDI/IO/SeqReader.src/M000001.html +0 -22
  275. data/html/classes/MIDI/IO/SeqWriter.src/M000020.html +0 -19
  276. data/html/classes/MIDI/KeySig.src/M000138.html +0 -19
  277. data/html/classes/MIDI/KeySig.src/M000139.html +0 -23
  278. data/html/classes/MIDI/Measure.src/M000148.html +0 -23
  279. data/html/classes/MIDI/Measures.src/M000106.html +0 -20
  280. data/html/classes/MIDI/MetaEvent.src/M000193.html +0 -21
  281. data/html/classes/MIDI/NoteEvent.src/M000093.html +0 -21
  282. data/html/classes/MIDI/NoteEvent.src/M000094.html +0 -20
  283. data/html/classes/MIDI/PitchBend.src/M000109.html +0 -19
  284. data/html/classes/MIDI/PolyPressure.src/M000196.html +0 -18
  285. data/html/classes/MIDI/ProgramChange.src/M000101.html +0 -20
  286. data/html/classes/MIDI/Realtime.src/M000085.html +0 -19
  287. data/html/classes/MIDI/Sequence.src/M000113.html +0 -28
  288. data/html/classes/MIDI/Sequence.src/M000119.html +0 -27
  289. data/html/classes/MIDI/SongPointer.src/M000160.html +0 -19
  290. data/html/classes/MIDI/SongSelect.src/M000132.html +0 -19
  291. data/html/classes/MIDI/SystemExclusive.src/M000163.html +0 -19
  292. data/html/classes/MIDI/Tempo.src/M000184.html +0 -18
  293. data/html/classes/MIDI/Tempo.src/M000185.html +0 -20
  294. data/html/classes/MIDI/TimeSig.src/M000151.html +0 -19
  295. data/html/classes/MIDI/Track.src/M000074.html +0 -21
  296. data/html/classes/MIDI/TuneRequest.src/M000127.html +0 -18
data/lib/midilib/event.rb CHANGED
@@ -186,11 +186,10 @@ class NoteEvent < ChannelEvent
186
186
  end
187
187
 
188
188
  def data_as_bytes
189
- data = ''
189
+ data = []
190
190
  data << (@status + @channel)
191
191
  data << @note
192
192
  data << @velocity
193
- return data
194
193
  end
195
194
  end
196
195
 
@@ -246,11 +245,10 @@ class Controller < ChannelEvent
246
245
  end
247
246
 
248
247
  def data_as_bytes
249
- data = ''
248
+ data = []
250
249
  data << (@status + @channel)
251
250
  data << @controller
252
251
  data << @value
253
- return data
254
252
  end
255
253
 
256
254
  def to_s
@@ -268,10 +266,9 @@ class ProgramChange < ChannelEvent
268
266
  end
269
267
 
270
268
  def data_as_bytes
271
- data = ''
269
+ data = []
272
270
  data << (@status + @channel)
273
271
  data << @program
274
- return data
275
272
  end
276
273
 
277
274
  def to_s
@@ -288,10 +285,9 @@ class ChannelPressure < ChannelEvent
288
285
  end
289
286
 
290
287
  def data_as_bytes
291
- data = ''
288
+ data = []
292
289
  data << (@status + @channel)
293
290
  data << @pressure
294
- return data
295
291
  end
296
292
 
297
293
  def to_s
@@ -308,11 +304,10 @@ class PitchBend < ChannelEvent
308
304
  end
309
305
 
310
306
  def data_as_bytes
311
- data = ''
307
+ data = []
312
308
  data << (@status + @channel)
313
309
  data << (@value & 0x7f) # lsb
314
310
  data << ((@value >> 7) & 0x7f) # msb
315
- return data
316
311
  end
317
312
 
318
313
  def to_s
@@ -336,12 +331,12 @@ class SystemExclusive < SystemCommon
336
331
  end
337
332
 
338
333
  def data_as_bytes
339
- data = ''
334
+ data = []
340
335
  data << @status
341
336
  data << Utils.as_var_len(@data.length)
342
337
  data << @data
343
338
  data << EOX
344
- return data
339
+ data.flatten
345
340
  end
346
341
 
347
342
  def to_s
@@ -358,11 +353,10 @@ class SongPointer < SystemCommon
358
353
  end
359
354
 
360
355
  def data_as_bytes
361
- data = ''
356
+ data = []
362
357
  data << @status
363
358
  data << ((@pointer >> 8) & 0xff)
364
359
  data << (@pointer & 0xff)
365
- return data
366
360
  end
367
361
 
368
362
  def to_s
@@ -379,10 +373,9 @@ class SongSelect < SystemCommon
379
373
  end
380
374
 
381
375
  def data_as_bytes
382
- data = ''
376
+ data = []
383
377
  data << @status
384
378
  data << @song
385
- return data
386
379
  end
387
380
 
388
381
  def to_s
@@ -396,9 +389,8 @@ class TuneRequest < SystemCommon
396
389
  end
397
390
 
398
391
  def data_as_bytes
399
- data = ''
392
+ data = []
400
393
  data << @status
401
- return data
402
394
  end
403
395
 
404
396
  def to_s
@@ -413,9 +405,8 @@ class Realtime < Event
413
405
  end
414
406
 
415
407
  def data_as_bytes
416
- data = ''
408
+ data = []
417
409
  data << @status
418
- return data
419
410
  end
420
411
 
421
412
  def to_s
@@ -490,12 +481,12 @@ class MetaEvent < Event
490
481
  end
491
482
 
492
483
  def data_as_bytes
493
- data = ''
484
+ data = []
494
485
  data << @status
495
486
  data << @meta_type
496
487
  data << (@data ? Utils.as_var_len(@data.length) : 0)
497
488
  data << @data if @data
498
- return data
489
+ data.flatten
499
490
  end
500
491
 
501
492
  def to_s
@@ -573,14 +564,13 @@ class Tempo < MetaEvent
573
564
  end
574
565
 
575
566
  def data_as_bytes
576
- data = ''
567
+ data = []
577
568
  data << @status
578
569
  data << @meta_type
579
570
  data << 3
580
571
  data << ((@data >> 16) & 0xff)
581
572
  data << ((@data >> 8) & 0xff)
582
573
  data << (@data & 0xff)
583
- return data
584
574
  end
585
575
 
586
576
  def to_s
@@ -599,7 +589,7 @@ class TimeSig < MetaEvent
599
589
 
600
590
  # Returns the complete event as stored in the sequence
601
591
  def data_as_bytes
602
- data = ''
592
+ data = []
603
593
  data << @status
604
594
  data << @meta_type
605
595
  data << 4
@@ -649,7 +639,7 @@ class KeySig < MetaEvent
649
639
 
650
640
  # Returns the complete event as stored in the sequence
651
641
  def data_as_bytes
652
- data = ''
642
+ data = []
653
643
  data << @status
654
644
  data << @meta_type
655
645
  data << 2
data/lib/midilib/info.rb CHANGED
@@ -1,9 +1,9 @@
1
1
  module MIDI
2
2
 
3
3
  VERSION_MAJOR = 1
4
- VERSION_MINOR = 1
5
- VERSION_TWEAK = 4
4
+ VERSION_MINOR = 2
5
+ VERSION_TWEAK = 0
6
6
  Version = "#{VERSION_MAJOR}.#{VERSION_MINOR}.#{VERSION_TWEAK}"
7
- Copyright = 'Copyright (c) 2003-2008 by Jim Menard <jimm@io.com>'
7
+ Copyright = 'Copyright (c) 2003-2009 by Jim Menard <jimm@io.com>'
8
8
 
9
9
  end
@@ -1,5 +1,15 @@
1
1
  require 'midilib/consts'
2
2
 
3
+ if RUBY_VERSION < '1.9'
4
+ class IO
5
+ def readbyte
6
+ c = getc()
7
+ raise 'unexpected EOF' unless c
8
+ c
9
+ end
10
+ end
11
+ end
12
+
3
13
  module MIDI
4
14
 
5
15
  module IO
@@ -13,6 +23,9 @@ module IO
13
23
  # objects.
14
24
  class MIDIFile
15
25
 
26
+ MThd_BYTE_ARRAY = [77, 84, 104, 100] # "MThd"
27
+ MTrk_BYTE_ARRAY = [77, 84, 114, 107] # "MTrk"
28
+
16
29
  # This array is indexed by the high half of a status byte. Its
17
30
  # value is either the number of bytes needed (1 or 2) for a channel
18
31
  # message, or 0 if it's not a channel message.
@@ -53,18 +66,18 @@ class MIDIFile
53
66
  ntrks.times { read_track() }
54
67
  end
55
68
 
56
- # This default getc implementation tries to read a single character
69
+ # This default getc implementation tries to read a single byte
57
70
  # from io and returns it as an integer.
58
- if RUBY_VERSION >= '1.9'
59
- def getc
60
- @bytes_to_be_read -= 1
61
- @io.getc().bytes.first
62
- end
63
- else
64
- def getc
65
- @bytes_to_be_read -= 1
66
- @io.getc()
67
- end
71
+ def getc
72
+ @bytes_to_be_read -= 1
73
+ @io.readbyte()
74
+ end
75
+
76
+ # Return the next +n+ bytes from @io as an array.
77
+ def get_bytes(n)
78
+ buf = []
79
+ n.times { buf << getc() }
80
+ buf
68
81
  end
69
82
 
70
83
  # The default error handler.
@@ -144,31 +157,31 @@ class MIDIFile
144
157
 
145
158
  # Read through 'MThd' or 'MTrk' header string. If skip is true, attempt
146
159
  # to skip initial trash. If there is an error, #error is called.
147
- def read_mt_header_string(s, skip)
148
- b = ''
160
+ def read_mt_header_string(bytes, skip)
161
+ b = []
149
162
  bytes_to_read = 4
150
163
  while true
151
- b << @io.read(bytes_to_read)
164
+ data = get_bytes(bytes_to_read)
165
+ b += data
152
166
  if b.length < 4
153
167
  error("unexpected EOF while trying to read header" +
154
168
  " string #{s}")
155
169
  end
156
- @bytes_to_be_read -= bytes_to_read
157
170
 
158
- # See if we found the string we're looking for
159
- return if b == s
171
+ # See if we found the bytes we're looking for
172
+ return if b == bytes
160
173
 
161
174
  if skip # Try again with the next char
162
- i = b.index(s[0], 1)
175
+ i = b[1..-1].index(bytes[0])
163
176
  if i.nil?
164
- b = ''
177
+ b = []
165
178
  bytes_to_read = 4
166
179
  else
167
180
  b = b[i..-1]
168
181
  bytes_to_read = 4 - i
169
182
  end
170
183
  else
171
- error("header string #{s} not found")
184
+ error("header string #{bytes.collect{|b| b.chr}.join} not found")
172
185
  end
173
186
  end
174
187
  end
@@ -176,7 +189,7 @@ class MIDIFile
176
189
  # Read a header chunk.
177
190
  def read_header
178
191
  @bytes_to_be_read = 0
179
- read_mt_header_string('MThd', @skip_init)
192
+ read_mt_header_string(MThd_BYTE_ARRAY, @skip_init) # "MThd"
180
193
 
181
194
  @bytes_to_be_read = read32()
182
195
  format = read16()
@@ -187,7 +200,7 @@ class MIDIFile
187
200
 
188
201
  # Flush any extra stuff, in case the length of the header is not 6
189
202
  if @bytes_to_be_read > 0
190
- @io.read(@bytes_to_be_read)
203
+ get_bytes(@bytes_to_be_read)
191
204
  @bytes_to_be_read = 0
192
205
  end
193
206
 
@@ -202,7 +215,7 @@ class MIDIFile
202
215
  status = 0 # (Possibly running) status byte
203
216
 
204
217
  @bytes_to_be_read = 0
205
- read_mt_header_string('MTrk', false)
218
+ read_mt_header_string(MTrk_BYTE_ARRAY, false)
206
219
 
207
220
  @bytes_to_be_read = read32()
208
221
  @curr_ticks = @ticks_so_far = 0
@@ -287,11 +300,12 @@ class MIDIFile
287
300
  m = msg() # Copy of internal message buffer
288
301
 
289
302
  # Create raw data array
290
- @raw_data = ''
303
+ @raw_data = []
291
304
  @raw_data << META_EVENT
292
305
  @raw_data << type
293
306
  @raw_data << @raw_var_num_data
294
307
  @raw_data << m
308
+ @raw_data.flatten!
295
309
 
296
310
  case type
297
311
  when META_SEQ_NUM
@@ -375,7 +389,7 @@ class MIDIFile
375
389
 
376
390
  # Read a varlen value.
377
391
  def read_var_len
378
- @raw_var_num_data = ''
392
+ @raw_var_num_data = []
379
393
  c = getc()
380
394
  @raw_var_num_data << c
381
395
  val = c
@@ -414,7 +428,7 @@ class MIDIFile
414
428
  return
415
429
  end
416
430
 
417
- buf = Array.new()
431
+ buf = []
418
432
 
419
433
  buf << (val & 0x7f)
420
434
  while (value >>= 7) > 0
@@ -432,14 +446,14 @@ class MIDIFile
432
446
  # Read and add a number of bytes to the message buffer. Return
433
447
  # the last byte (so we can see if it's an EOX or not).
434
448
  def msg_read(n_bytes)
435
- @msg_buf << @io.read(n_bytes)
436
- @bytes_to_be_read -= n_bytes
449
+ @msg_buf += get_bytes(n_bytes)
450
+ @msg_buf.flatten!
437
451
  return @msg_buf[-1]
438
452
  end
439
453
 
440
454
  # Initialize the internal message buffer.
441
455
  def msg_init
442
- @msg_buf = ''
456
+ @msg_buf = []
443
457
  end
444
458
 
445
459
  # Return a copy of the internal message buffer.
@@ -56,7 +56,7 @@ class SeqWriter
56
56
  status = possibly_munge_due_to_running_status_byte(data,
57
57
  prev_status)
58
58
 
59
- @bytes_written += @io.write(data)
59
+ @bytes_written += write_bytes(data)
60
60
 
61
61
  prev_event = event
62
62
  prev_status = status
@@ -65,7 +65,7 @@ class SeqWriter
65
65
  # Write track end event.
66
66
  event = MetaEvent.new(META_TRACK_END)
67
67
  write_var_len(0)
68
- @bytes_written += @io.write(event.data_as_bytes())
68
+ @bytes_written += write_bytes(event.data_as_bytes())
69
69
 
70
70
  # Go back to beginning of track data and write number of bytes,
71
71
  # then come back here to end of file.
@@ -91,7 +91,7 @@ class SeqWriter
91
91
  # exactly the same, the rest is trivial. If it's note on/note off,
92
92
  # we can combine those further.
93
93
  if status == prev_status
94
- data[0] = '' # delete status byte from data
94
+ data[0,1] = nil # delete status byte from data
95
95
  return status + chan
96
96
  elsif status == NOTE_OFF && data[2] == 64
97
97
  # If we see a note off and the velocity is 64, we can store
@@ -101,7 +101,7 @@ class SeqWriter
101
101
  data[2] = 0 # set vel to 0; do before possible shrinking
102
102
  status = NOTE_ON + chan
103
103
  if prev_status == NOTE_ON
104
- data[0] = '' # delete status byte
104
+ data[0,1] = [] # delete status byte
105
105
  else
106
106
  data[0] = status
107
107
  end
@@ -116,34 +116,36 @@ class SeqWriter
116
116
  event = MetaEvent.new(META_INSTRUMENT, instrument)
117
117
  write_var_len(0)
118
118
  data = event.data_as_bytes()
119
- @bytes_written += @io.write(data)
119
+ @bytes_written += write_bytes(data)
120
120
  end
121
121
 
122
122
  def write_var_len(val)
123
123
  buffer = Utils.as_var_len(val)
124
- @bytes_written += @io.write(buffer)
124
+ @bytes_written += write_bytes(buffer)
125
125
  end
126
126
 
127
127
  def write16(val)
128
128
  val = (-val | 0x8000) if val < 0
129
129
 
130
- buffer = ''
131
- buffer << ((val >> 8) & 0xff)
132
- buffer << (val & 0xff)
133
-
134
- @bytes_written += @io.write(buffer)
130
+ buffer = []
131
+ @io.putc((val >> 8) & 0xff)
132
+ @io.putc(val & 0xff)
133
+ @bytes_written += 2
135
134
  end
136
135
 
137
136
  def write32(val)
138
137
  val = (-val | 0x80000000) if val < 0
139
138
 
140
- buffer = ''
141
- buffer << ((val >> 24) & 0xff)
142
- buffer << ((val >> 16) & 0xff)
143
- buffer << ((val >> 8) & 0xff)
144
- buffer << (val & 0xff)
139
+ @io.putc((val >> 24) & 0xff)
140
+ @io.putc((val >> 16) & 0xff)
141
+ @io.putc((val >> 8) & 0xff)
142
+ @io.putc(val & 0xff)
143
+ @bytes_written += 4
144
+ end
145
145
 
146
- @bytes_written += @io.write(buffer)
146
+ def write_bytes(bytes)
147
+ bytes.each { |b| @io.putc(b) }
148
+ bytes.length
147
149
  end
148
150
  end
149
151
 
data/lib/midilib/utils.rb CHANGED
@@ -22,7 +22,7 @@ class Utils
22
22
  # input from a stream of bytes. Therefore we don't supply it here. That is
23
23
  # a part of the MIDIFile class.
24
24
  def Utils.as_var_len(val)
25
- buffer = ''
25
+ buffer = []
26
26
  buffer << (val & 0x7f)
27
27
  val = (val >> 7)
28
28
  while val > 0
data/lib/midilib.rb CHANGED
@@ -3,7 +3,7 @@
3
3
  # This is the top-level include file for midilib. You can require this
4
4
  # file or require individual files from the midilib directory.
5
5
  #
6
- # See the README file or http://midilib.rubyforge.org for details.
6
+ # See the README.rdoc file or http://midilib.rubyforge.org for details.
7
7
 
8
8
  require 'midilib/info'
9
9
  require 'midilib/sequence'
data/test/test_io.rb CHANGED
@@ -49,7 +49,8 @@ class IOTester < Test::Unit::TestCase
49
49
 
50
50
  puts ' comparing sequences' if $DEBUG
51
51
  compare_sequences(seq0, seq1)
52
- File.delete(OUTPUT_FILE)
52
+ ensure
53
+ File.delete(OUTPUT_FILE) if File.exist?(OUTPUT_FILE)
53
54
  end
54
55
 
55
56
  end
@@ -0,0 +1,59 @@
1
+ # Start looking for MIDI classes in the directory above this one.
2
+ # This forces us to use the local copy of MIDI, even if there is
3
+ # a previously installed version out there somewhere.
4
+ $LOAD_PATH[0, 0] = File.join(File.dirname(__FILE__), '..', 'lib')
5
+
6
+ require 'test/unit'
7
+ require 'stringio'
8
+ require 'midilib'
9
+
10
+ class MIDI::IO::MIDIFile
11
+ def io=(io)
12
+ @io = io
13
+ end
14
+ end
15
+ if RUBY_VERSION < '1.9'
16
+ class StringIO
17
+ def readbyte
18
+ c = getc()
19
+ raise 'unexpected EOF' unless c
20
+ c
21
+ end
22
+ end
23
+ end
24
+
25
+ class MIDIFileTester < Test::Unit::TestCase
26
+
27
+ def setup
28
+ @m = MIDI::IO::MIDIFile.new
29
+ end
30
+
31
+ def test_msg_io
32
+ io = StringIO.new
33
+ io.write("abcdef")
34
+ io.rewind()
35
+ @m.io = io
36
+ @m.msg_init
37
+ @m.msg_read(6)
38
+ assert_equal [97, 98, 99, 100, 101, 102], @m.msg
39
+ end
40
+
41
+ def test_read32
42
+ io = StringIO.new
43
+ io.write("\0\0\0\6")
44
+ io.rewind()
45
+ @m.io = io
46
+ assert_equal 6, @m.read32()
47
+ end
48
+
49
+ def test_write32
50
+ io = StringIO.new
51
+ old_stdout = $stdout
52
+ $stdout = io
53
+ @m.write32(6)
54
+ $stdout = old_stdout
55
+ io.rewind()
56
+ assert_equal "\0\0\0\6", io.string
57
+ end
58
+
59
+ end
data/test/test_varlen.rb CHANGED
@@ -1,11 +1,11 @@
1
- require 'midilib'
2
- require 'test/unit'
3
-
4
1
  # Start looking for MIDI classes in the directory above this one.
5
2
  # This forces us to use the local copy of MIDI, even if there is
6
3
  # a previously installed version out there somewhere.
7
4
  $LOAD_PATH[0, 0] = File.join(File.dirname(__FILE__), '..', 'lib')
8
5
 
6
+ require 'test/unit'
7
+ require 'midilib'
8
+
9
9
  class VarLenTester < Test::Unit::TestCase
10
10
 
11
11
  VAR_LEN_TEST_DATA = {
@@ -25,7 +25,7 @@ class VarLenTester < Test::Unit::TestCase
25
25
 
26
26
  def num_to_var_len(num, answer)
27
27
  varlen = MIDI::Utils.as_var_len(num)
28
- varlen.reverse.each_byte { | b |
28
+ varlen.reverse.each { | b |
29
29
  assert_equal(answer & 0xff, b)
30
30
  answer = answer >> 8
31
31
  }