midilib 0.8.4

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 (252) hide show
  1. data/ChangeLog +87 -0
  2. data/Credits +8 -0
  3. data/README +361 -0
  4. data/Rakefile +68 -0
  5. data/TODO +25 -0
  6. data/examples/NoFences.mid +0 -0
  7. data/examples/from_scratch.mid +0 -0
  8. data/examples/from_scratch.rb +56 -0
  9. data/examples/reader2text.rb +220 -0
  10. data/examples/seq2text.rb +41 -0
  11. data/examples/strings.rb +34 -0
  12. data/examples/transpose.rb +75 -0
  13. data/html/classes/MIDI.html +738 -0
  14. data/html/classes/MIDI/ActiveSense.html +156 -0
  15. data/html/classes/MIDI/ActiveSense.src/M000136.html +18 -0
  16. data/html/classes/MIDI/ActiveSense.src/M000137.html +18 -0
  17. data/html/classes/MIDI/ChannelEvent.html +179 -0
  18. data/html/classes/MIDI/ChannelEvent.src/M000124.html +20 -0
  19. data/html/classes/MIDI/ChannelEvent.src/M000125.html +18 -0
  20. data/html/classes/MIDI/ChannelPressure.html +184 -0
  21. data/html/classes/MIDI/ChannelPressure.src/M000088.html +19 -0
  22. data/html/classes/MIDI/ChannelPressure.src/M000089.html +21 -0
  23. data/html/classes/MIDI/ChannelPressure.src/M000090.html +18 -0
  24. data/html/classes/MIDI/Clock.html +156 -0
  25. data/html/classes/MIDI/Clock.src/M000134.html +18 -0
  26. data/html/classes/MIDI/Clock.src/M000135.html +18 -0
  27. data/html/classes/MIDI/Continue.html +156 -0
  28. data/html/classes/MIDI/Continue.src/M000132.html +18 -0
  29. data/html/classes/MIDI/Continue.src/M000133.html +18 -0
  30. data/html/classes/MIDI/Controller.html +189 -0
  31. data/html/classes/MIDI/Controller.src/M000129.html +21 -0
  32. data/html/classes/MIDI/Controller.src/M000130.html +22 -0
  33. data/html/classes/MIDI/Controller.src/M000131.html +18 -0
  34. data/html/classes/MIDI/Event.html +424 -0
  35. data/html/classes/MIDI/Event.src/M000145.html +27 -0
  36. data/html/classes/MIDI/Event.src/M000146.html +18 -0
  37. data/html/classes/MIDI/Event.src/M000147.html +18 -0
  38. data/html/classes/MIDI/Event.src/M000148.html +18 -0
  39. data/html/classes/MIDI/Event.src/M000149.html +18 -0
  40. data/html/classes/MIDI/Event.src/M000150.html +18 -0
  41. data/html/classes/MIDI/Event.src/M000151.html +18 -0
  42. data/html/classes/MIDI/Event.src/M000152.html +18 -0
  43. data/html/classes/MIDI/Event.src/M000153.html +18 -0
  44. data/html/classes/MIDI/Event.src/M000154.html +22 -0
  45. data/html/classes/MIDI/Event.src/M000155.html +18 -0
  46. data/html/classes/MIDI/Event.src/M000156.html +18 -0
  47. data/html/classes/MIDI/Event.src/M000157.html +18 -0
  48. data/html/classes/MIDI/IO.html +121 -0
  49. data/html/classes/MIDI/IO/MIDIFile.html +925 -0
  50. data/html/classes/MIDI/IO/MIDIFile.src/M000028.html +22 -0
  51. data/html/classes/MIDI/IO/MIDIFile.src/M000029.html +24 -0
  52. data/html/classes/MIDI/IO/MIDIFile.src/M000030.html +19 -0
  53. data/html/classes/MIDI/IO/MIDIFile.src/M000031.html +19 -0
  54. data/html/classes/MIDI/IO/MIDIFile.src/M000032.html +17 -0
  55. data/html/classes/MIDI/IO/MIDIFile.src/M000033.html +17 -0
  56. data/html/classes/MIDI/IO/MIDIFile.src/M000034.html +17 -0
  57. data/html/classes/MIDI/IO/MIDIFile.src/M000035.html +17 -0
  58. data/html/classes/MIDI/IO/MIDIFile.src/M000036.html +17 -0
  59. data/html/classes/MIDI/IO/MIDIFile.src/M000037.html +17 -0
  60. data/html/classes/MIDI/IO/MIDIFile.src/M000038.html +17 -0
  61. data/html/classes/MIDI/IO/MIDIFile.src/M000039.html +17 -0
  62. data/html/classes/MIDI/IO/MIDIFile.src/M000040.html +17 -0
  63. data/html/classes/MIDI/IO/MIDIFile.src/M000041.html +17 -0
  64. data/html/classes/MIDI/IO/MIDIFile.src/M000042.html +17 -0
  65. data/html/classes/MIDI/IO/MIDIFile.src/M000043.html +17 -0
  66. data/html/classes/MIDI/IO/MIDIFile.src/M000044.html +17 -0
  67. data/html/classes/MIDI/IO/MIDIFile.src/M000045.html +17 -0
  68. data/html/classes/MIDI/IO/MIDIFile.src/M000046.html +17 -0
  69. data/html/classes/MIDI/IO/MIDIFile.src/M000047.html +17 -0
  70. data/html/classes/MIDI/IO/MIDIFile.src/M000048.html +17 -0
  71. data/html/classes/MIDI/IO/MIDIFile.src/M000049.html +17 -0
  72. data/html/classes/MIDI/IO/MIDIFile.src/M000050.html +17 -0
  73. data/html/classes/MIDI/IO/MIDIFile.src/M000051.html +17 -0
  74. data/html/classes/MIDI/IO/MIDIFile.src/M000052.html +17 -0
  75. data/html/classes/MIDI/IO/MIDIFile.src/M000053.html +43 -0
  76. data/html/classes/MIDI/IO/MIDIFile.src/M000054.html +34 -0
  77. data/html/classes/MIDI/IO/MIDIFile.src/M000055.html +96 -0
  78. data/html/classes/MIDI/IO/MIDIFile.src/M000056.html +18 -0
  79. data/html/classes/MIDI/IO/MIDIFile.src/M000057.html +48 -0
  80. data/html/classes/MIDI/IO/MIDIFile.src/M000058.html +42 -0
  81. data/html/classes/MIDI/IO/MIDIFile.src/M000059.html +19 -0
  82. data/html/classes/MIDI/IO/MIDIFile.src/M000060.html +19 -0
  83. data/html/classes/MIDI/IO/MIDIFile.src/M000061.html +20 -0
  84. data/html/classes/MIDI/IO/MIDIFile.src/M000062.html +21 -0
  85. data/html/classes/MIDI/IO/MIDIFile.src/M000063.html +31 -0
  86. data/html/classes/MIDI/IO/MIDIFile.src/M000064.html +20 -0
  87. data/html/classes/MIDI/IO/MIDIFile.src/M000065.html +22 -0
  88. data/html/classes/MIDI/IO/MIDIFile.src/M000066.html +30 -0
  89. data/html/classes/MIDI/IO/MIDIFile.src/M000067.html +18 -0
  90. data/html/classes/MIDI/IO/MIDIFile.src/M000068.html +20 -0
  91. data/html/classes/MIDI/IO/MIDIFile.src/M000069.html +18 -0
  92. data/html/classes/MIDI/IO/MIDIFile.src/M000070.html +18 -0
  93. data/html/classes/MIDI/IO/SeqReader.html +460 -0
  94. data/html/classes/MIDI/IO/SeqReader.src/M000001.html +22 -0
  95. data/html/classes/MIDI/IO/SeqReader.src/M000002.html +22 -0
  96. data/html/classes/MIDI/IO/SeqReader.src/M000003.html +21 -0
  97. data/html/classes/MIDI/IO/SeqReader.src/M000004.html +34 -0
  98. data/html/classes/MIDI/IO/SeqReader.src/M000005.html +26 -0
  99. data/html/classes/MIDI/IO/SeqReader.src/M000006.html +28 -0
  100. data/html/classes/MIDI/IO/SeqReader.src/M000007.html +21 -0
  101. data/html/classes/MIDI/IO/SeqReader.src/M000008.html +19 -0
  102. data/html/classes/MIDI/IO/SeqReader.src/M000009.html +19 -0
  103. data/html/classes/MIDI/IO/SeqReader.src/M000010.html +19 -0
  104. data/html/classes/MIDI/IO/SeqReader.src/M000011.html +19 -0
  105. data/html/classes/MIDI/IO/SeqReader.src/M000012.html +19 -0
  106. data/html/classes/MIDI/IO/SeqReader.src/M000013.html +18 -0
  107. data/html/classes/MIDI/IO/SeqReader.src/M000014.html +18 -0
  108. data/html/classes/MIDI/IO/SeqReader.src/M000015.html +27 -0
  109. data/html/classes/MIDI/IO/SeqReader.src/M000016.html +18 -0
  110. data/html/classes/MIDI/IO/SeqReader.src/M000017.html +18 -0
  111. data/html/classes/MIDI/IO/SeqReader.src/M000018.html +18 -0
  112. data/html/classes/MIDI/IO/SeqWriter.html +267 -0
  113. data/html/classes/MIDI/IO/SeqWriter.src/M000019.html +19 -0
  114. data/html/classes/MIDI/IO/SeqWriter.src/M000020.html +25 -0
  115. data/html/classes/MIDI/IO/SeqWriter.src/M000021.html +22 -0
  116. data/html/classes/MIDI/IO/SeqWriter.src/M000022.html +54 -0
  117. data/html/classes/MIDI/IO/SeqWriter.src/M000023.html +49 -0
  118. data/html/classes/MIDI/IO/SeqWriter.src/M000024.html +21 -0
  119. data/html/classes/MIDI/IO/SeqWriter.src/M000025.html +19 -0
  120. data/html/classes/MIDI/IO/SeqWriter.src/M000026.html +24 -0
  121. data/html/classes/MIDI/IO/SeqWriter.src/M000027.html +26 -0
  122. data/html/classes/MIDI/Marker.html +139 -0
  123. data/html/classes/MIDI/Marker.src/M000107.html +18 -0
  124. data/html/classes/MIDI/MetaEvent.html +189 -0
  125. data/html/classes/MIDI/MetaEvent.src/M000167.html +21 -0
  126. data/html/classes/MIDI/MetaEvent.src/M000168.html +23 -0
  127. data/html/classes/MIDI/MetaEvent.src/M000169.html +53 -0
  128. data/html/classes/MIDI/NoteEvent.html +233 -0
  129. data/html/classes/MIDI/NoteEvent.src/M000091.html +21 -0
  130. data/html/classes/MIDI/NoteEvent.src/M000092.html +20 -0
  131. data/html/classes/MIDI/NoteEvent.src/M000093.html +18 -0
  132. data/html/classes/MIDI/NoteEvent.src/M000094.html +22 -0
  133. data/html/classes/MIDI/NoteOffEvent.html +169 -0
  134. data/html/classes/MIDI/NoteOffEvent.src/M000086.html +19 -0
  135. data/html/classes/MIDI/NoteOffEvent.src/M000087.html +19 -0
  136. data/html/classes/MIDI/NoteOnEvent.html +169 -0
  137. data/html/classes/MIDI/NoteOnEvent.src/M000102.html +19 -0
  138. data/html/classes/MIDI/NoteOnEvent.src/M000103.html +19 -0
  139. data/html/classes/MIDI/PitchBend.html +184 -0
  140. data/html/classes/MIDI/PitchBend.src/M000104.html +19 -0
  141. data/html/classes/MIDI/PitchBend.src/M000105.html +22 -0
  142. data/html/classes/MIDI/PitchBend.src/M000106.html +18 -0
  143. data/html/classes/MIDI/PolyPressure.html +186 -0
  144. data/html/classes/MIDI/PolyPressure.src/M000170.html +18 -0
  145. data/html/classes/MIDI/PolyPressure.src/M000171.html +18 -0
  146. data/html/classes/MIDI/PolyPressure.src/M000172.html +18 -0
  147. data/html/classes/MIDI/PolyPressure.src/M000173.html +19 -0
  148. data/html/classes/MIDI/ProgramChange.html +184 -0
  149. data/html/classes/MIDI/ProgramChange.src/M000099.html +19 -0
  150. data/html/classes/MIDI/ProgramChange.src/M000100.html +21 -0
  151. data/html/classes/MIDI/ProgramChange.src/M000101.html +18 -0
  152. data/html/classes/MIDI/Realtime.html +171 -0
  153. data/html/classes/MIDI/Realtime.src/M000083.html +19 -0
  154. data/html/classes/MIDI/Realtime.src/M000084.html +20 -0
  155. data/html/classes/MIDI/Realtime.src/M000085.html +18 -0
  156. data/html/classes/MIDI/Sequence.html +469 -0
  157. data/html/classes/MIDI/Sequence.src/M000108.html +28 -0
  158. data/html/classes/MIDI/Sequence.src/M000109.html +21 -0
  159. data/html/classes/MIDI/Sequence.src/M000110.html +22 -0
  160. data/html/classes/MIDI/Sequence.src/M000113.html +18 -0
  161. data/html/classes/MIDI/Sequence.src/M000114.html +27 -0
  162. data/html/classes/MIDI/Sequence.src/M000115.html +18 -0
  163. data/html/classes/MIDI/Sequence.src/M000116.html +19 -0
  164. data/html/classes/MIDI/Sequence.src/M000117.html +19 -0
  165. data/html/classes/MIDI/Sequence.src/M000118.html +20 -0
  166. data/html/classes/MIDI/Sequence.src/M000119.html +19 -0
  167. data/html/classes/MIDI/Sequence.src/M000120.html +18 -0
  168. data/html/classes/MIDI/SongPointer.html +184 -0
  169. data/html/classes/MIDI/SongPointer.src/M000138.html +19 -0
  170. data/html/classes/MIDI/SongPointer.src/M000139.html +22 -0
  171. data/html/classes/MIDI/SongPointer.src/M000140.html +18 -0
  172. data/html/classes/MIDI/SongSelect.html +184 -0
  173. data/html/classes/MIDI/SongSelect.src/M000126.html +19 -0
  174. data/html/classes/MIDI/SongSelect.src/M000127.html +21 -0
  175. data/html/classes/MIDI/SongSelect.src/M000128.html +18 -0
  176. data/html/classes/MIDI/Start.html +156 -0
  177. data/html/classes/MIDI/Start.src/M000097.html +18 -0
  178. data/html/classes/MIDI/Start.src/M000098.html +18 -0
  179. data/html/classes/MIDI/Stop.html +156 -0
  180. data/html/classes/MIDI/Stop.src/M000095.html +18 -0
  181. data/html/classes/MIDI/Stop.src/M000096.html +18 -0
  182. data/html/classes/MIDI/SystemCommon.html +139 -0
  183. data/html/classes/MIDI/SystemCommon.src/M000144.html +19 -0
  184. data/html/classes/MIDI/SystemExclusive.html +184 -0
  185. data/html/classes/MIDI/SystemExclusive.src/M000141.html +19 -0
  186. data/html/classes/MIDI/SystemExclusive.src/M000142.html +23 -0
  187. data/html/classes/MIDI/SystemExclusive.src/M000143.html +18 -0
  188. data/html/classes/MIDI/SystemReset.html +156 -0
  189. data/html/classes/MIDI/SystemReset.src/M000081.html +18 -0
  190. data/html/classes/MIDI/SystemReset.src/M000082.html +18 -0
  191. data/html/classes/MIDI/Tempo.html +250 -0
  192. data/html/classes/MIDI/Tempo.src/M000158.html +18 -0
  193. data/html/classes/MIDI/Tempo.src/M000159.html +18 -0
  194. data/html/classes/MIDI/Tempo.src/M000160.html +18 -0
  195. data/html/classes/MIDI/Tempo.src/M000161.html +18 -0
  196. data/html/classes/MIDI/Tempo.src/M000162.html +18 -0
  197. data/html/classes/MIDI/Tempo.src/M000163.html +25 -0
  198. data/html/classes/MIDI/Tempo.src/M000164.html +18 -0
  199. data/html/classes/MIDI/Track.html +380 -0
  200. data/html/classes/MIDI/Track.src/M000071.html +23 -0
  201. data/html/classes/MIDI/Track.src/M000072.html +21 -0
  202. data/html/classes/MIDI/Track.src/M000073.html +26 -0
  203. data/html/classes/MIDI/Track.src/M000074.html +18 -0
  204. data/html/classes/MIDI/Track.src/M000075.html +22 -0
  205. data/html/classes/MIDI/Track.src/M000076.html +20 -0
  206. data/html/classes/MIDI/Track.src/M000077.html +22 -0
  207. data/html/classes/MIDI/Track.src/M000078.html +22 -0
  208. data/html/classes/MIDI/Track.src/M000079.html +18 -0
  209. data/html/classes/MIDI/Track.src/M000080.html +19 -0
  210. data/html/classes/MIDI/TuneRequest.html +171 -0
  211. data/html/classes/MIDI/TuneRequest.src/M000121.html +18 -0
  212. data/html/classes/MIDI/TuneRequest.src/M000122.html +20 -0
  213. data/html/classes/MIDI/TuneRequest.src/M000123.html +18 -0
  214. data/html/classes/MIDI/Utils.html +190 -0
  215. data/html/classes/MIDI/Utils.src/M000165.html +20 -0
  216. data/html/classes/MIDI/Utils.src/M000166.html +25 -0
  217. data/html/created.rid +1 -0
  218. data/html/files/README.html +599 -0
  219. data/html/files/TODO.html +142 -0
  220. data/html/files/lib/midilib/consts_rb.html +107 -0
  221. data/html/files/lib/midilib/event_rb.html +109 -0
  222. data/html/files/lib/midilib/info_rb.html +101 -0
  223. data/html/files/lib/midilib/io/midifile_rb.html +108 -0
  224. data/html/files/lib/midilib/io/seqreader_rb.html +110 -0
  225. data/html/files/lib/midilib/io/seqwriter_rb.html +115 -0
  226. data/html/files/lib/midilib/sequence_rb.html +109 -0
  227. data/html/files/lib/midilib/track_rb.html +108 -0
  228. data/html/files/lib/midilib/utils_rb.html +101 -0
  229. data/html/files/lib/midilib_rb.html +124 -0
  230. data/html/fr_class_index.html +59 -0
  231. data/html/fr_file_index.html +38 -0
  232. data/html/fr_method_index.html +199 -0
  233. data/html/index.html +24 -0
  234. data/html/rdoc-style.css +208 -0
  235. data/install.rb +57 -0
  236. data/lib/midilib.rb +16 -0
  237. data/lib/midilib/consts.rb +422 -0
  238. data/lib/midilib/event.rb +559 -0
  239. data/lib/midilib/info.rb +9 -0
  240. data/lib/midilib/io/midifile.rb +446 -0
  241. data/lib/midilib/io/seqreader.rb +198 -0
  242. data/lib/midilib/io/seqwriter.rb +151 -0
  243. data/lib/midilib/sequence.rb +144 -0
  244. data/lib/midilib/track.rb +115 -0
  245. data/lib/midilib/utils.rb +36 -0
  246. data/test/event_equality.rb +81 -0
  247. data/test/test_event.rb +116 -0
  248. data/test/test_io.rb +55 -0
  249. data/test/test_sequence.rb +68 -0
  250. data/test/test_track.rb +111 -0
  251. data/test/test_varlen.rb +40 -0
  252. metadata +330 -0
@@ -0,0 +1,190 @@
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>Class: MIDI::Utils</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="classHeader">
50
+ <table class="header-table">
51
+ <tr class="top-aligned-row">
52
+ <td><strong>Class</strong></td>
53
+ <td class="class-name-in-header">MIDI::Utils</td>
54
+ </tr>
55
+ <tr class="top-aligned-row">
56
+ <td><strong>In:</strong></td>
57
+ <td>
58
+ <a href="../../files/lib/midilib/utils_rb.html">
59
+ lib/midilib/utils.rb
60
+ </a>
61
+ <br />
62
+ </td>
63
+ </tr>
64
+
65
+ <tr class="top-aligned-row">
66
+ <td><strong>Parent:</strong></td>
67
+ <td>
68
+ Object
69
+ </td>
70
+ </tr>
71
+ </table>
72
+ </div>
73
+ <!-- banner header -->
74
+
75
+ <div id="bodyContent">
76
+
77
+
78
+
79
+ <div id="contextContent">
80
+
81
+ <div id="description">
82
+ <p>
83
+ Utility methods.
84
+ </p>
85
+
86
+ </div>
87
+
88
+
89
+ </div>
90
+
91
+ <div id="method-list">
92
+ <h3 class="section-bar">Methods</h3>
93
+
94
+ <div class="name-list">
95
+ <a href="#M000166">as_var_len</a>&nbsp;&nbsp;
96
+ <a href="#M000165">note_to_s</a>&nbsp;&nbsp;
97
+ </div>
98
+ </div>
99
+
100
+ </div>
101
+
102
+
103
+ <!-- if includes -->
104
+
105
+ <div id="section">
106
+
107
+
108
+ <div id="constants-list">
109
+ <h3 class="section-bar">Constants</h3>
110
+
111
+ <div class="name-list">
112
+ <table summary="Constants">
113
+ <tr class="top-aligned-row context-row">
114
+ <td class="context-item-name">NOTE_NAMES</td>
115
+ <td>=</td>
116
+ <td class="context-item-value">[ 'C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B'</td>
117
+ <td width="3em">&nbsp;</td>
118
+ <td class="context-item-desc">
119
+ <a href="../MIDI.html">MIDI</a> note names. NOTE_NAMES[0] is
120
+ &#8216;C&#8217;, NOTE_NAMES[1] is &#8216;C#&#8217;, etc.
121
+
122
+ </td>
123
+ </tr>
124
+ </table>
125
+ </div>
126
+ </div>
127
+
128
+
129
+
130
+
131
+
132
+
133
+ <!-- if method_list -->
134
+ <div id="methods">
135
+ <h3 class="section-bar">Public Class methods</h3>
136
+
137
+ <div id="method-M000166" class="method-detail">
138
+ <a name="M000166"></a>
139
+
140
+ <div class="method-heading">
141
+ <a href="Utils.src/M000166.html" target="Code" class="method-signature"
142
+ onclick="popupCode('Utils.src/M000166.html');return false;">
143
+ <span class="method-name">as_var_len</span><span class="method-args">(val)</span>
144
+ </a>
145
+ </div>
146
+
147
+ <div class="method-description">
148
+ <p>
149
+ Given an integer, returns it as a variable length array of bytes (the
150
+ format used by <a href="../MIDI.html">MIDI</a> files).
151
+ </p>
152
+ <p>
153
+ The converse operation&#8212;converting a var len into a
154
+ number&#8212;requires input from a stream of bytes. Therefore we
155
+ don&#8217;t supply it here. That is a part of the MIDIFile class.
156
+ </p>
157
+ </div>
158
+ </div>
159
+
160
+ <div id="method-M000165" class="method-detail">
161
+ <a name="M000165"></a>
162
+
163
+ <div class="method-heading">
164
+ <a href="Utils.src/M000165.html" target="Code" class="method-signature"
165
+ onclick="popupCode('Utils.src/M000165.html');return false;">
166
+ <span class="method-name">note_to_s</span><span class="method-args">(num)</span>
167
+ </a>
168
+ </div>
169
+
170
+ <div class="method-description">
171
+ <p>
172
+ Given a <a href="../MIDI.html">MIDI</a> note number, return the name and
173
+ octave as a string.
174
+ </p>
175
+ </div>
176
+ </div>
177
+
178
+
179
+ </div>
180
+
181
+
182
+ </div>
183
+
184
+
185
+ <div id="validator-badges">
186
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
187
+ </div>
188
+
189
+ </body>
190
+ </html>
@@ -0,0 +1,20 @@
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>
7
+ <head>
8
+ <title>note_to_s (MIDI::Utils)</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
11
+ </head>
12
+ <body class="standalone-code">
13
+ <pre><span class="ruby-comment cmt"># File lib/midilib/utils.rb, line 12</span>
14
+ <span class="ruby-keyword kw">def</span> <span class="ruby-constant">Utils</span>.<span class="ruby-identifier">note_to_s</span>(<span class="ruby-identifier">num</span>)
15
+ <span class="ruby-identifier">note</span> = <span class="ruby-identifier">num</span> <span class="ruby-operator">%</span> <span class="ruby-value">12</span>
16
+ <span class="ruby-identifier">octave</span> = <span class="ruby-identifier">num</span> <span class="ruby-operator">/</span> <span class="ruby-value">12</span>
17
+ <span class="ruby-keyword kw">return</span> <span class="ruby-node">&quot;#{NOTE_NAMES[note]}#{octave - 1}&quot;</span>
18
+ <span class="ruby-keyword kw">end</span></pre>
19
+ </body>
20
+ </html>
@@ -0,0 +1,25 @@
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>
7
+ <head>
8
+ <title>as_var_len (MIDI::Utils)</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
11
+ </head>
12
+ <body class="standalone-code">
13
+ <pre><span class="ruby-comment cmt"># File lib/midilib/utils.rb, line 24</span>
14
+ <span class="ruby-keyword kw">def</span> <span class="ruby-constant">Utils</span>.<span class="ruby-identifier">as_var_len</span>(<span class="ruby-identifier">val</span>)
15
+ <span class="ruby-identifier">buffer</span> = <span class="ruby-value str">''</span>
16
+ <span class="ruby-identifier">buffer</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">val</span> <span class="ruby-operator">&amp;</span> <span class="ruby-value">0x7f</span>)
17
+ <span class="ruby-identifier">val</span> = (<span class="ruby-identifier">val</span> <span class="ruby-operator">&gt;&gt;</span> <span class="ruby-value">7</span>)
18
+ <span class="ruby-keyword kw">while</span> <span class="ruby-identifier">val</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span>
19
+ <span class="ruby-identifier">buffer</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-value">0x80</span> <span class="ruby-operator">+</span> (<span class="ruby-identifier">val</span> <span class="ruby-operator">&amp;</span> <span class="ruby-value">0x7f</span>))
20
+ <span class="ruby-identifier">val</span> = (<span class="ruby-identifier">val</span> <span class="ruby-operator">&gt;&gt;</span> <span class="ruby-value">7</span>)
21
+ <span class="ruby-keyword kw">end</span>
22
+ <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">buffer</span>.<span class="ruby-identifier">reverse!</span>
23
+ <span class="ruby-keyword kw">end</span></pre>
24
+ </body>
25
+ </html>
data/html/created.rid ADDED
@@ -0,0 +1 @@
1
+ Mon Mar 21 21:17:47 EST 2005
@@ -0,0 +1,599 @@
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</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</h1>
51
+ <table class="header-table">
52
+ <tr class="top-aligned-row">
53
+ <td><strong>Path:</strong></td>
54
+ <td>README
55
+ </td>
56
+ </tr>
57
+ <tr class="top-aligned-row">
58
+ <td><strong>Last Update:</strong></td>
59
+ <td>Mon Mar 21 21:17:03 EST 2005</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
+ <h3>Recent Changes</h3>
95
+ <h4>Changes for 0.8.4:</h4>
96
+ <ul>
97
+ <li>Realtime status bytes now set @is_realtime to true and return true when
98
+ realtime? is called.
99
+
100
+ </li>
101
+ <li>All system common events now set @is_system to true and return true when
102
+ system? is called, not just system exclusive events.
103
+
104
+ </li>
105
+ <li>Added examples/from_scratch.rb, which shows how to create a sequence
106
+ manually.
107
+
108
+ </li>
109
+ <li>New <a href="../classes/MIDI/Sequence.html">MIDI::Sequence</a> methods that
110
+ turn note length names like &quot;32nd&quot;, &quot;dotted quarter&quot;,
111
+ and &quot;16th triplet&quot; into delta times. See the docs below and
112
+ MIDI::Sequence::length_to_delta, MIDI::Sequence::note_to_length, and
113
+ MIDI::Sequence::note_to_delta.
114
+
115
+ </li>
116
+ </ul>
117
+ <h4>Changes for 0.8.3:</h4>
118
+ <ul>
119
+ <li>Added <a
120
+ href="../classes/MIDI/NoteEvent.html#M000093">MIDI::NoteEvent.note_to_s</a>,
121
+ which returns note name as a string like &quot;C4&quot; or &quot;F#6&quot;.
122
+
123
+ </li>
124
+ <li>Added new boolean attributes to <a
125
+ href="../classes/MIDI/Event.html">MIDI::Event</a>: @print_decimal_numbers
126
+ and @print_note_names. These are used by all Event to_s methods. See
127
+ examples/seq2text.rb for an example.
128
+
129
+ </li>
130
+ </ul>
131
+ <h4>Changes for 0.8.2:</h4>
132
+ <ul>
133
+ <li>Changed MIDI::MetaEvent.type to MIDI::MetaEvent.event_type to avoid runtime
134
+ complaints about Object#type calls.
135
+
136
+ </li>
137
+ <li>Added &#8216;b&#8217; binary flag to file open modes for Windows.
138
+
139
+ </li>
140
+ <li>Fixed $LOAD_PATH in example files.
141
+
142
+ </li>
143
+ <li>Fixed read and write block arguments.
144
+
145
+ </li>
146
+ <li>Fixed other example script bugs.
147
+
148
+ </li>
149
+ </ul>
150
+ <h4>Changes for 0.8.1:</h4>
151
+ <ul>
152
+ <li>Fixed track sorting.
153
+
154
+ </li>
155
+ <li>Fixed track&#8217;s recalc_delta_from_times method.
156
+
157
+ </li>
158
+ <li>Fixed event quantization.
159
+
160
+ </li>
161
+ <li>More tests and documentation.
162
+
163
+ </li>
164
+ </ul>
165
+ <h2>Dependencies</h2>
166
+ <p>
167
+ midilib does not require any other packages. The test suite in the tests
168
+ directory requires the testing framework TestUnit, which comes with Ruby
169
+ 1.8 and later and can also be found in the Ruby Application Archive (<a
170
+ href="http://raa.ruby-lang.org">raa.ruby-lang.org</a>).
171
+ </p>
172
+ <p>
173
+ To rebuild the gem or RDocs or run the tests easily, you can use the
174
+ Rakefile which requires Rake (<a
175
+ href="http://rake.rubyforge.org">rake.rubyforge.org</a>).
176
+ </p>
177
+ <h2>Installation</h2>
178
+ <h3>RubyGems Installation</h3>
179
+ <p>
180
+ To install midilib as a gem, type
181
+ </p>
182
+ <pre>
183
+ % gem install midilib
184
+ </pre>
185
+ <p>
186
+ You may need root privileges to install the gem.
187
+ </p>
188
+ <h3>Manual Installation</h3>
189
+ <p>
190
+ After downloading and expanding the archive, you can install midilib with
191
+ the command
192
+ </p>
193
+ <pre>
194
+ % ruby install.rb
195
+ </pre>
196
+ <p>
197
+ (or)
198
+ </p>
199
+ <pre>
200
+ % ruby install.rb --install-dir=my_directory
201
+ </pre>
202
+ <p>
203
+ You may need root privileges to install.
204
+ </p>
205
+ <h2>Testing</h2>
206
+ <pre>
207
+ % rake test
208
+ </pre>
209
+ <p>
210
+ runs all of the tests in the test directory.
211
+ </p>
212
+ <h2>Overview</h2>
213
+ <p>
214
+ <a href="../classes/MIDI.html">MIDI</a> file IO only understands <a
215
+ href="../classes/MIDI.html">MIDI</a> file format 1, where a sequence is
216
+ made up of multiple tracks. It doesn&#8217;t yet understand format 0 (a
217
+ single track containing all events) or format 2 (a collection of format 0
218
+ files in one file).
219
+ </p>
220
+ <h3><a href="../classes/MIDI/Sequence.html">MIDI::Sequence</a></h3>
221
+ <p>
222
+ A sequence contains a collection of tracks and global information like the
223
+ sequence&#8217;s pulses per quarter note (ppqn) and time signature.
224
+ </p>
225
+ <p>
226
+ The first track in a sequence is special; it holds meta-events like tempo
227
+ and sequence name. Don&#8216;t put any notes in this track.
228
+ </p>
229
+ <p>
230
+ <a href="../classes/MIDI/Sequence.html">MIDI::Sequence</a> also contains
231
+ some convenience methods that let you set and retrieve the sequence&#8217;s
232
+ name, the time signature, and to retrieve the first tempo event&#8217;s
233
+ beats-per-minute value.
234
+ </p>
235
+ <p>
236
+ Normally instances of <a
237
+ href="../classes/MIDI/IO/SeqReader.html">MIDI::IO::SeqReader</a> and <a
238
+ href="../classes/MIDI/IO/SeqWriter.html">MIDI::IO::SeqWriter</a> are used
239
+ when a sequence reads itself from or writes itself to a <a
240
+ href="../classes/MIDI.html">MIDI</a> file. You can change that by setting a
241
+ sequence&#8217;s reader_class or writer_class attributes. Instances of the
242
+ classes contained in those attributes are created and used whenever the
243
+ sequence reads or writes itself.
244
+ </p>
245
+ <h3><a href="../classes/MIDI/Track.html">MIDI::Track</a></h3>
246
+ <p>
247
+ A track contains an array of events.
248
+ </p>
249
+ <p>
250
+ When you modify the <tt>events</tt> array, make sure to call recalc_times
251
+ so each event gets its <tt>time_from_start</tt> recalculated. You
252
+ don&#8217;t have to do that after every event you add; just remember to do
253
+ so before using the track in a way that expects the list of events to be
254
+ ordered correctly.
255
+ </p>
256
+ <p>
257
+ A Track also holds a bit mask that specifies the channels used by the
258
+ track. This bit mask is set when the track is read from the <a
259
+ href="../classes/MIDI.html">MIDI</a> file by a SeqReader but is
260
+ <em>not</em> kept up to date by any other methods. Specifically, if you add
261
+ events to a track at any other time, the bit mask will not be updated.
262
+ </p>
263
+ <h3><a href="../classes/MIDI/Event.html">MIDI::Event</a></h3>
264
+ <p>
265
+ Each event holds not only its delta time but also its time from the start
266
+ of the track. The track is responsible for recalculating its events&#8217;
267
+ start times. You can call <a
268
+ href="../classes/MIDI/Track.html#M000077">MIDI::Track#recalc_times</a> to
269
+ do so.
270
+ </p>
271
+ <p>
272
+ Events have a number of boolean methods that identify their types, like
273
+ channel?, note?, note_on?, note_off?, meta?, system?, and realtime?.
274
+ </p>
275
+ <p>
276
+ Subclasses of <a href="../classes/MIDI/Event.html">MIDI::Event</a>
277
+ implement the various <a href="../classes/MIDI.html">MIDI</a> messages such
278
+ as note on and off, controller values, system exclusive data, and realtime
279
+ bytes.
280
+ </p>
281
+ <p>
282
+ <a href="../classes/MIDI/Realtime.html">MIDI::Realtime</a> events have
283
+ delta values and start times, just like all the other midilib event types
284
+ do. (<a href="../classes/MIDI.html">MIDI</a> real time status bytes
285
+ don&#8217;t have delta times, but this way we can record when in a track
286
+ the realtime byte was received and should be sent. This is useful for
287
+ start/continue/stop events that control other devices, for example.) Note
288
+ that when a <a href="../classes/MIDI/Realtime.html">MIDI::Realtime</a>
289
+ event is written out to a <a href="../classes/MIDI.html">MIDI</a> file, the
290
+ delta time is not written.
291
+ </p>
292
+ <h2>How To Use</h2>
293
+ <p>
294
+ The following examples show you how to use midilib to read, write, and
295
+ manipulate <a href="../classes/MIDI.html">MIDI</a> files and modify track
296
+ events. See also the files in the examples directory, which are described
297
+ below.
298
+ </p>
299
+ <h3>Reading a <a href="../classes/MIDI.html">MIDI</a> File</h3>
300
+ <p>
301
+ To read a <a href="../classes/MIDI.html">MIDI</a> file, create a <a
302
+ href="../classes/MIDI/Sequence.html">MIDI::Sequence</a> object and call its
303
+ read method, passing in an IO object.
304
+ </p>
305
+ <p>
306
+ The read method takes an optional block. If present, the block is called
307
+ once after each track has finished being read. Each time, it is passed the
308
+ total number of tracks and the number of the current track that has just
309
+ been read. This is useful for notifying the user of progress, for example
310
+ by updating a GUI progress bar.
311
+ </p>
312
+ <pre>
313
+ require 'midi/io/seqreader'
314
+
315
+ # Create a new, empty sequence.
316
+ seq = MIDI::Sequence.new()
317
+
318
+ # Read the contents of a MIDI file into the sequence.
319
+ File.open('my_midi_file.mid', 'rb') { | file |
320
+ seq.read(file) { | num_tracks, i |
321
+ # Print something when each track is read.
322
+ puts &quot;read track #{i} of #{num_tracks}&quot;
323
+ }
324
+ }
325
+ </pre>
326
+ <h3>Writing a <a href="../classes/MIDI.html">MIDI</a> File</h3>
327
+ <p>
328
+ To write a <a href="../classes/MIDI.html">MIDI</a> file, call the write
329
+ method, passing in an IO object.
330
+ </p>
331
+ <pre>
332
+ require 'midi/io/seqwriter'
333
+
334
+ # Start with a sequence that has something worth saving.
335
+ seq = read_or_create_seq_we_care_not_how()
336
+
337
+ # Write the sequence to a MIDI file.
338
+ File.open('my_output_file.mid', 'wb') { | file | seq.write(file) }
339
+ </pre>
340
+ <h3>Editing a <a href="../classes/MIDI.html">MIDI</a> File</h3>
341
+ <p>
342
+ Combining the last two examples, here is a script that reads a <a
343
+ href="../classes/MIDI.html">MIDI</a> file, transposes some events, and
344
+ writes the sequence out to a different file. This is a useful template for
345
+ programatically manipulating <a href="../classes/MIDI.html">MIDI</a> data.
346
+ </p>
347
+ <p>
348
+ This code transposes all of the note events (note on, note off, and poly
349
+ pressure) on channel 5 down one octave. It&#8217;s easy to find events that
350
+ need to be transposed: the method note? returns true.
351
+ </p>
352
+ <h4>Transposing One Channel</h4>
353
+ <pre>
354
+ require 'midi/io/seqreader'
355
+ require 'midi/io/seqwriter'
356
+
357
+ # Create a new, empty sequence.
358
+ seq = MIDI::Sequence.new()
359
+
360
+ # Read the contents of a MIDI file into the sequence.
361
+ File.open('my_input_file.mid', 'rb') { | file |
362
+ seq.read(file) { | num_tracks, i |
363
+ # Print something when each track is read.
364
+ puts &quot;read track #{i} of #{num_tracks}&quot;
365
+ }
366
+ }
367
+
368
+ # Iterate over every event in every track.
369
+ seq.each { | track |
370
+ track.each { | event |
371
+ # If the event is a note event (note on, note off, or poly
372
+ # pressure) and it is on MIDI channel 5 (channels start at
373
+ # 0, so we use 4), then transpose the event down one octave.
374
+ if event.note? &amp;&amp; event.channel == 4
375
+ event.note -= 12
376
+ end
377
+ }
378
+ }
379
+
380
+ # Write the sequence to a MIDI file.
381
+ File.open('my_output_file.mid', 'wb') { | file | seq.write(file) }
382
+ </pre>
383
+ <h3>Manipulating tracks</h3>
384
+ <p>
385
+ If you modify a track&#8217;s list of events directly, don&#8217;t forget
386
+ to call <a
387
+ href="../classes/MIDI/Track.html#M000077">MIDI::Track#recalc_times</a> when
388
+ you are done.
389
+ </p>
390
+ <pre>
391
+ track.events[42, 1] = array_of_events
392
+ track.events &lt;&lt; an_event
393
+ track.merge(array_of_events)
394
+ track.recalc_times
395
+ </pre>
396
+ <h3>Calculating delta times</h3>
397
+ <p>
398
+ A few methods in <a href="../classes/MIDI/Sequence.html">MIDI::Sequence</a>
399
+ make it easier to calculate the delta times that represent note lengths. <a
400
+ href="../classes/MIDI/Sequence.html#M000115">MIDI::Sequence#length_to_delta</a>
401
+ takes a note length (a multiple of a quarter note) and returns the delta
402
+ time given the sequence&#8217;s current ppqn (pulses per quarter note)
403
+ setting. 1 is a quarter note, 1.0/32.0 is a 32nd note (use floating-point
404
+ numbers to avoid integer rounding), 1.5 is a dotted quarter, etc. See the
405
+ documentation for that method for more information.
406
+ </p>
407
+ <p>
408
+ MIDI::Sequence::note_to_length takes a note name and returns a length value
409
+ (again, as a multiple of a quarter note). Legal note names are those found
410
+ in MIDI::Sequence::NOTE_TO_LENGTH, and may begin with &quot;dotted&quot;
411
+ and/or end with &quot;triplet&quot;. For example, &quot;whole&quot;,
412
+ &quot;sixteenth&quot;, &quot;32nd&quot;, &quot;quarter triplet&quot;,
413
+ &quot;dotted 16th&quot;, and &quot;dotted 8th triplet&quot; are all legal
414
+ note names.
415
+ </p>
416
+ <p>
417
+ Finally, MIDI::Sequence::note_to_delta takes a note name and returns a
418
+ delta time.
419
+ </p>
420
+ <h3>Example Scripts</h3>
421
+ <p>
422
+ Here are short descriptions of each of the examples found in the examples
423
+ directory.
424
+ </p>
425
+ <ul>
426
+ <li>examples/from_scratch.rb shows you how to create a new sequence from
427
+ scratch and save it to a <a href="../classes/MIDI.html">MIDI</a> file. It
428
+ creates a file called &#8216;from_scratch.mid&#8217;.
429
+
430
+ </li>
431
+ <li>examples/seq2text.rb dumps a <a href="../classes/MIDI.html">MIDI</a> file
432
+ as text. It reads in a sequence and uses the to_s method of each event.
433
+
434
+ </li>
435
+ <li>examples/reader2text.rb dumps a <a href="../classes/MIDI.html">MIDI</a>
436
+ file as text. It subclasses MIDI::SeqReader instead of creating a sequence
437
+ containing tracks and events.
438
+
439
+ </li>
440
+ <li>examples/transpose.rb transposes all note events (note on, note off, poly
441
+ pressure) on a specified channel by a specified amount.
442
+
443
+ </li>
444
+ <li>There is also one <a href="../classes/MIDI.html">MIDI</a> file,
445
+ examples/NoFences.mid. It is a little pop ditty I wrote. The instruments in
446
+ this file use General <a href="../classes/MIDI.html">MIDI</a> patch numbers
447
+ and drum note assignments. Since I don&#8217;t normally use GM patches, the
448
+ sounds used here are at best approximations of the sounds I use.
449
+
450
+ </li>
451
+ </ul>
452
+ <h2>Resources</h2>
453
+ <p>
454
+ The Ruby Web site (<a
455
+ href="http://www.ruby-lang.org/en/index.html">www.ruby-lang.org/en/index.html</a>)
456
+ contains an introduction to Ruby, the Ruby Application Archive (RAA) at <a
457
+ href="http://raa.ruby-lang.org">raa.ruby-lang.org</a>, and pointers to more
458
+ information.
459
+ </p>
460
+ <p>
461
+ &lt;em&gt;Programming Ruby, The Pragmatic Programmer&#8217;s
462
+ Guide&lt;em&gt;, by David Thomas and Andrew Hunt, is a well-written and
463
+ practical introduction to Ruby. Its Web page at <a
464
+ href="http://www.rubycentral.com/book">www.rubycentral.com/book</a> also
465
+ contains a wealth of Ruby information. Though the book is available online,
466
+ I encourage you to purchase a copy.
467
+ </p>
468
+ <p>
469
+ A description of the <a href="../classes/MIDI.html">MIDI</a> file format
470
+ can be found in a few places such as <a
471
+ href="http://www.borg.com/~jglatt/tech/midifile.htm">www.borg.com/~jglatt/tech/midifile.htm</a>.
472
+ </p>
473
+ <p>
474
+ The <a href="../classes/MIDI.html">MIDI</a> message reference at <a
475
+ href="http://www.io.com/~jimm/midi_ref.html">www.io.com/~jimm/midi_ref.html</a>
476
+ describes the format of <a href="../classes/MIDI.html">MIDI</a> commands.
477
+ </p>
478
+ <h1>To Do</h1>
479
+ <h2>Bugs</h2>
480
+ <ul>
481
+ <li>None known.
482
+
483
+ </li>
484
+ </ul>
485
+ <h2>Features</h2>
486
+ <ul>
487
+ <li>Method to translate event&#8217;s time_from_start to number of milliseconds
488
+ from start.
489
+
490
+ </li>
491
+ <li>Swing quantizing. (Implied by list email from Carl Youngblood
492
+ &lt;carl.youngblood@gmail.com&gt;)
493
+
494
+ </li>
495
+ <li>Implement key signature in SeqReader.
496
+
497
+ </li>
498
+ <li>Format 0 files.
499
+
500
+ </li>
501
+ <li>Format 2 files(?).
502
+
503
+ </li>
504
+ </ul>
505
+ <h2>Documentation</h2>
506
+ <ul>
507
+ <li>Write better docs.
508
+
509
+ </li>
510
+ </ul>
511
+ <h2>Tests</h2>
512
+ <ul>
513
+ <li>More needed?
514
+
515
+ </li>
516
+ </ul>
517
+ <h1>Support</h1>
518
+ <ul>
519
+ <li>Visit the forums, bug list, and mailing list pages at <a
520
+ href="http://rubyforge.org/projects/midilib">rubyforge.org/projects/midilib</a>
521
+
522
+ </li>
523
+ <li>Send email to Jim Menard at <a href="mailto:jimm@io.com">jimm@io.com</a>
524
+
525
+ </li>
526
+ <li>Ask on the ruby-talk mailing list
527
+
528
+ </li>
529
+ </ul>
530
+ <h1>Administrivia</h1>
531
+ <table>
532
+ <tr><td valign="top">Author:</td><td>Jim Menard (<a href="mailto:jimm@io.com">jimm@io.com</a>)
533
+
534
+ </td></tr>
535
+ <tr><td valign="top">Copyright:</td><td>Copyright &#169; 2003-2004 Jim Menard
536
+
537
+ </td></tr>
538
+ <tr><td valign="top">License:</td><td>Distributed under the same license as Ruby.
539
+
540
+ </td></tr>
541
+ </table>
542
+ <h2>Copying</h2>
543
+ <p>
544
+ midilib is copyrighted free software by Jim Menard and is released under
545
+ the same license as Ruby. See the Ruby license at <a
546
+ href="http://www.ruby-lang.org/en/LICENSE.txt">www.ruby-lang.org/en/LICENSE.txt</a>.
547
+ </p>
548
+ <p>
549
+ midilib may be freely copied in its entirety providing this notice, all
550
+ source code, all documentation, and all other files are included.
551
+ </p>
552
+ <p>
553
+ midilib is Copyright &#169; 2003-2004 by Jim Menard.
554
+ </p>
555
+ <p>
556
+ The song &quot;No Fences&quot; contained in the <a
557
+ href="../classes/MIDI.html">MIDI</a> file examples/NoFences.mid is
558
+ Copyright &#169; 1992 by Jim Menard (jimm@io.com). It may be freely used
559
+ for non-commercial purposes as long as the author is given credit.
560
+ </p>
561
+ <h2>Warranty</h2>
562
+ <p>
563
+ This software is provided &quot;as is&quot; and without any express or
564
+ implied warranties, including, without limitation, the implied warranties
565
+ of merchantability and fitness for a particular purpose.
566
+ </p>
567
+
568
+ </div>
569
+
570
+
571
+ </div>
572
+
573
+
574
+ </div>
575
+
576
+
577
+ <!-- if includes -->
578
+
579
+ <div id="section">
580
+
581
+
582
+
583
+
584
+
585
+
586
+
587
+
588
+ <!-- if method_list -->
589
+
590
+
591
+ </div>
592
+
593
+
594
+ <div id="validator-badges">
595
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
596
+ </div>
597
+
598
+ </body>
599
+ </html>