midilib 2.0.5 → 3.0.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 (124) hide show
  1. checksums.yaml +5 -5
  2. data/ChangeLog +2 -1
  3. data/Credits +39 -2
  4. data/README.rdoc +5 -6
  5. data/Rakefile +36 -49
  6. data/TODO.rdoc +13 -2
  7. data/examples/from_scratch.rb +1 -1
  8. data/examples/measures_mbt.rb +11 -11
  9. data/examples/print_program_changes.rb +2 -2
  10. data/examples/reader2text.rb +47 -47
  11. data/examples/seq2text.rb +1 -1
  12. data/examples/split.rb +4 -3
  13. data/examples/strings.rb +4 -4
  14. data/examples/transpose.rb +19 -20
  15. data/install.rb +21 -13
  16. data/lib/midilib/consts.rb +237 -239
  17. data/lib/midilib/event.rb +128 -100
  18. data/lib/midilib/info.rb +3 -5
  19. data/lib/midilib/io/midifile.rb +155 -182
  20. data/lib/midilib/io/seqreader.rb +80 -85
  21. data/lib/midilib/io/seqwriter.rb +93 -88
  22. data/lib/midilib/measure.rb +78 -80
  23. data/lib/midilib/mergesort.rb +39 -0
  24. data/lib/midilib/sequence.rb +40 -32
  25. data/lib/midilib/track.rb +16 -57
  26. data/lib/midilib/utils.rb +4 -7
  27. data/lib/midilib.rb +5 -5
  28. data/test/event_equality.rb +28 -30
  29. data/test/test_event.rb +9 -11
  30. data/test/test_io.rb +83 -3
  31. data/test/test_mergesort.rb +37 -0
  32. data/test/test_midifile.rb +6 -19
  33. data/test/test_sequence.rb +5 -4
  34. data/test/test_track.rb +9 -38
  35. data/test/test_varlen.rb +1 -3
  36. metadata +8 -95
  37. data/html/IO.html +0 -155
  38. data/html/MIDI/ActiveSense.html +0 -206
  39. data/html/MIDI/ChannelEvent.html +0 -231
  40. data/html/MIDI/ChannelPressure.html +0 -265
  41. data/html/MIDI/Clock.html +0 -206
  42. data/html/MIDI/Continue.html +0 -206
  43. data/html/MIDI/Controller.html +0 -280
  44. data/html/MIDI/Event.html +0 -489
  45. data/html/MIDI/IO/MIDIFile.html +0 -2024
  46. data/html/MIDI/IO/SeqReader.html +0 -904
  47. data/html/MIDI/IO/SeqWriter.html +0 -572
  48. data/html/MIDI/IO.html +0 -95
  49. data/html/MIDI/KeySig.html +0 -353
  50. data/html/MIDI/MIDI/MIDI/Array.html +0 -255
  51. data/html/MIDI/MIDI/MIDI.html +0 -95
  52. data/html/MIDI/MIDI.html +0 -95
  53. data/html/MIDI/Marker.html +0 -158
  54. data/html/MIDI/Measure.html +0 -328
  55. data/html/MIDI/Measures.html +0 -285
  56. data/html/MIDI/MetaEvent.html +0 -461
  57. data/html/MIDI/NoteEvent.html +0 -331
  58. data/html/MIDI/NoteOff.html +0 -228
  59. data/html/MIDI/NoteOn.html +0 -228
  60. data/html/MIDI/PitchBend.html +0 -266
  61. data/html/MIDI/PolyPressure.html +0 -277
  62. data/html/MIDI/ProgramChange.html +0 -265
  63. data/html/MIDI/Realtime.html +0 -242
  64. data/html/MIDI/Sequence.html +0 -896
  65. data/html/MIDI/SongPointer.html +0 -266
  66. data/html/MIDI/SongSelect.html +0 -265
  67. data/html/MIDI/Start.html +0 -206
  68. data/html/MIDI/Stop.html +0 -206
  69. data/html/MIDI/SystemCommon.html +0 -158
  70. data/html/MIDI/SystemExclusive.html +0 -268
  71. data/html/MIDI/SystemReset.html +0 -206
  72. data/html/MIDI/Tempo.html +0 -396
  73. data/html/MIDI/TimeSig.html +0 -388
  74. data/html/MIDI/Track.html +0 -695
  75. data/html/MIDI/TuneRequest.html +0 -242
  76. data/html/MIDI/Utils.html +0 -220
  77. data/html/MIDI.html +0 -547
  78. data/html/README_rdoc.html +0 -731
  79. data/html/TODO_rdoc.html +0 -125
  80. data/html/created.rid +0 -14
  81. data/html/css/fonts.css +0 -167
  82. data/html/css/rdoc.css +0 -590
  83. data/html/fonts/Lato-Light.ttf +0 -0
  84. data/html/fonts/Lato-LightItalic.ttf +0 -0
  85. data/html/fonts/Lato-Regular.ttf +0 -0
  86. data/html/fonts/Lato-RegularItalic.ttf +0 -0
  87. data/html/fonts/SourceCodePro-Bold.ttf +0 -0
  88. data/html/fonts/SourceCodePro-Regular.ttf +0 -0
  89. data/html/images/add.png +0 -0
  90. data/html/images/arrow_up.png +0 -0
  91. data/html/images/brick.png +0 -0
  92. data/html/images/brick_link.png +0 -0
  93. data/html/images/bug.png +0 -0
  94. data/html/images/bullet_black.png +0 -0
  95. data/html/images/bullet_toggle_minus.png +0 -0
  96. data/html/images/bullet_toggle_plus.png +0 -0
  97. data/html/images/date.png +0 -0
  98. data/html/images/delete.png +0 -0
  99. data/html/images/find.png +0 -0
  100. data/html/images/loadingAnimation.gif +0 -0
  101. data/html/images/macFFBgHack.png +0 -0
  102. data/html/images/package.png +0 -0
  103. data/html/images/page_green.png +0 -0
  104. data/html/images/page_white_text.png +0 -0
  105. data/html/images/page_white_width.png +0 -0
  106. data/html/images/plugin.png +0 -0
  107. data/html/images/ruby.png +0 -0
  108. data/html/images/tag_blue.png +0 -0
  109. data/html/images/tag_green.png +0 -0
  110. data/html/images/transparent.png +0 -0
  111. data/html/images/wrench.png +0 -0
  112. data/html/images/wrench_orange.png +0 -0
  113. data/html/images/zoom.png +0 -0
  114. data/html/index.html +0 -768
  115. data/html/js/darkfish.js +0 -161
  116. data/html/js/jquery.js +0 -4
  117. data/html/js/navigation.js +0 -142
  118. data/html/js/navigation.js.gz +0 -0
  119. data/html/js/search.js +0 -109
  120. data/html/js/search_index.js +0 -1
  121. data/html/js/search_index.js.gz +0 -0
  122. data/html/js/searcher.js +0 -228
  123. data/html/js/searcher.js.gz +0 -0
  124. data/html/table_of_contents.html +0 -1265
data/html/index.html DELETED
@@ -1,768 +0,0 @@
1
- <!DOCTYPE html>
2
-
3
- <html>
4
- <head>
5
- <meta charset="UTF-8">
6
-
7
- <title>midilib</title>
8
-
9
- <script type="text/javascript">
10
- var rdoc_rel_prefix = "./";
11
- </script>
12
-
13
- <script src="./js/jquery.js"></script>
14
- <script src="./js/darkfish.js"></script>
15
-
16
- <link href="./css/fonts.css" rel="stylesheet">
17
- <link href="./css/rdoc.css" rel="stylesheet">
18
-
19
-
20
-
21
- <body id="top" role="document" class="file">
22
- <nav role="navigation">
23
- <div id="project-navigation">
24
- <div id="home-section" role="region" title="Quick navigation" class="nav-section">
25
- <h2>
26
- <a href="./index.html" rel="home">Home</a>
27
- </h2>
28
-
29
- <div id="table-of-contents-navigation">
30
- <a href="./table_of_contents.html#pages">Pages</a>
31
- <a href="./table_of_contents.html#classes">Classes</a>
32
- <a href="./table_of_contents.html#methods">Methods</a>
33
- </div>
34
- </div>
35
-
36
-
37
- <div id="search-section" role="search" class="project-section initially-hidden">
38
- <form action="#" method="get" accept-charset="utf-8">
39
- <div id="search-field-wrapper">
40
- <input id="search-field" role="combobox" aria-label="Search"
41
- aria-autocomplete="list" aria-controls="search-results"
42
- type="text" name="search" placeholder="Search" spellcheck="false"
43
- title="Type to search, Up and Down to navigate, Enter to load">
44
- </div>
45
-
46
- <ul id="search-results" aria-label="Search Results"
47
- aria-busy="false" aria-expanded="false"
48
- aria-atomic="false" class="initially-hidden"></ul>
49
- </form>
50
- </div>
51
-
52
- </div>
53
-
54
- <div id="project-metadata">
55
- <div id="fileindex-section" class="nav-section">
56
- <h3>Pages</h3>
57
-
58
- <ul class="link-list">
59
-
60
- <li><a href="./README_rdoc.html">README</a>
61
-
62
- <li><a href="./TODO_rdoc.html">TODO</a>
63
-
64
- </ul>
65
- </div>
66
-
67
- <div id="classindex-section" class="nav-section">
68
- <h3>Class and Module Index</h3>
69
-
70
- <ul class="link-list">
71
-
72
- <li><a href="./IO.html">IO</a>
73
-
74
- <li><a href="./MIDI.html">MIDI</a>
75
-
76
- <li><a href="./MIDI/ActiveSense.html">MIDI::ActiveSense</a>
77
-
78
- <li><a href="./MIDI/ChannelEvent.html">MIDI::ChannelEvent</a>
79
-
80
- <li><a href="./MIDI/ChannelPressure.html">MIDI::ChannelPressure</a>
81
-
82
- <li><a href="./MIDI/Clock.html">MIDI::Clock</a>
83
-
84
- <li><a href="./MIDI/Continue.html">MIDI::Continue</a>
85
-
86
- <li><a href="./MIDI/Controller.html">MIDI::Controller</a>
87
-
88
- <li><a href="./MIDI/Event.html">MIDI::Event</a>
89
-
90
- <li><a href="./MIDI/IO.html">MIDI::IO</a>
91
-
92
- <li><a href="./MIDI/IO/MIDIFile.html">MIDI::IO::MIDIFile</a>
93
-
94
- <li><a href="./MIDI/IO/SeqReader.html">MIDI::IO::SeqReader</a>
95
-
96
- <li><a href="./MIDI/IO/SeqWriter.html">MIDI::IO::SeqWriter</a>
97
-
98
- <li><a href="./MIDI/KeySig.html">MIDI::KeySig</a>
99
-
100
- <li><a href="./MIDI/MIDI.html">MIDI::MIDI</a>
101
-
102
- <li><a href="./MIDI/MIDI/MIDI.html">MIDI::MIDI::MIDI</a>
103
-
104
- <li><a href="./MIDI/MIDI/MIDI/Array.html">MIDI::MIDI::MIDI::Array</a>
105
-
106
- <li><a href="./MIDI/Marker.html">MIDI::Marker</a>
107
-
108
- <li><a href="./MIDI/Measure.html">MIDI::Measure</a>
109
-
110
- <li><a href="./MIDI/Measures.html">MIDI::Measures</a>
111
-
112
- <li><a href="./MIDI/MetaEvent.html">MIDI::MetaEvent</a>
113
-
114
- <li><a href="./MIDI/NoteEvent.html">MIDI::NoteEvent</a>
115
-
116
- <li><a href="./MIDI/NoteOff.html">MIDI::NoteOff</a>
117
-
118
- <li><a href="./MIDI/NoteOff.html">MIDI::NoteOffEvent</a>
119
-
120
- <li><a href="./MIDI/NoteOn.html">MIDI::NoteOn</a>
121
-
122
- <li><a href="./MIDI/NoteOn.html">MIDI::NoteOnEvent</a>
123
-
124
- <li><a href="./MIDI/PitchBend.html">MIDI::PitchBend</a>
125
-
126
- <li><a href="./MIDI/PolyPressure.html">MIDI::PolyPressure</a>
127
-
128
- <li><a href="./MIDI/ProgramChange.html">MIDI::ProgramChange</a>
129
-
130
- <li><a href="./MIDI/Realtime.html">MIDI::Realtime</a>
131
-
132
- <li><a href="./MIDI/Sequence.html">MIDI::Sequence</a>
133
-
134
- <li><a href="./MIDI/SongPointer.html">MIDI::SongPointer</a>
135
-
136
- <li><a href="./MIDI/SongSelect.html">MIDI::SongSelect</a>
137
-
138
- <li><a href="./MIDI/Start.html">MIDI::Start</a>
139
-
140
- <li><a href="./MIDI/Stop.html">MIDI::Stop</a>
141
-
142
- <li><a href="./MIDI/SystemCommon.html">MIDI::SystemCommon</a>
143
-
144
- <li><a href="./MIDI/SystemExclusive.html">MIDI::SystemExclusive</a>
145
-
146
- <li><a href="./MIDI/SystemReset.html">MIDI::SystemReset</a>
147
-
148
- <li><a href="./MIDI/Tempo.html">MIDI::Tempo</a>
149
-
150
- <li><a href="./MIDI/TimeSig.html">MIDI::TimeSig</a>
151
-
152
- <li><a href="./MIDI/Track.html">MIDI::Track</a>
153
-
154
- <li><a href="./MIDI/TuneRequest.html">MIDI::TuneRequest</a>
155
-
156
- <li><a href="./MIDI/Utils.html">MIDI::Utils</a>
157
-
158
- </ul>
159
- </div>
160
-
161
- </div>
162
- </nav>
163
-
164
- <main role="main">
165
-
166
-
167
- <h1 id="label-midilib">midilib<span><a href="#label-midilib">&para;</a> <a href="#top">&uarr;</a></span></h1>
168
-
169
- <p>midilib is a pure Ruby <a href="MIDI.html">MIDI</a> library useful for
170
- reading and writing standard <a href="MIDI.html">MIDI</a> files and
171
- manipulating <a href="MIDI.html">MIDI</a> event data.</p>
172
-
173
- <p>The GitHub project page and Web site of midilib is <a
174
- href="http://github.com/jimm/midilib">github.com/jimm/midilib</a> and the
175
- RubyGems.org page is <a
176
- href="http://rubygems.org/gems/midilib">rubygems.org/gems/midilib</a>,
177
- where you can also find all the RDoc documentation.</p>
178
-
179
- <p>midilib is compatible with Ruby 1.8.x 1.9.x, and 2.x.</p>
180
-
181
- <h2 id="label-Dependencies">Dependencies<span><a href="#label-Dependencies">&para;</a> <a href="#top">&uarr;</a></span></h2>
182
-
183
- <p>midilib does not require any other packages. The test suite in the tests
184
- directory requires the testing framework TestUnit, which comes with Ruby
185
- 1.8 and later and can also be found in the Ruby Application Archive (<a
186
- href="http://raa.ruby-lang.org">raa.ruby-lang.org</a>).</p>
187
-
188
- <p>To rebuild the gem or RDocs or run the tests easily, you can use the
189
- Rakefile which requires Rake (<a
190
- href="http://rake.rubyforge.org">rake.rubyforge.org</a>).</p>
191
-
192
- <h2 id="label-Installation">Installation<span><a href="#label-Installation">&para;</a> <a href="#top">&uarr;</a></span></h2>
193
-
194
- <h3 id="label-RubyGems+Installation">RubyGems Installation<span><a href="#label-RubyGems+Installation">&para;</a> <a href="#top">&uarr;</a></span></h3>
195
-
196
- <p>To install midilib as a gem, type</p>
197
-
198
- <pre>% gem install midilib</pre>
199
-
200
- <p>or, if you already have a previous version, use</p>
201
-
202
- <pre>% gem update midilib</pre>
203
-
204
- <p>You may need root privileges to install or update the gem.</p>
205
-
206
- <h3 id="label-Manual+Installation">Manual Installation<span><a href="#label-Manual+Installation">&para;</a> <a href="#top">&uarr;</a></span></h3>
207
-
208
- <p>After downloading and expanding the archive, you can install midilib with
209
- the command</p>
210
-
211
- <pre>% ruby install.rb</pre>
212
-
213
- <p>(or)</p>
214
-
215
- <pre>% ruby install.rb --install-dir=my_directory</pre>
216
-
217
- <p>You may need root privileges to install.</p>
218
-
219
- <h2 id="label-Testing">Testing<span><a href="#label-Testing">&para;</a> <a href="#top">&uarr;</a></span></h2>
220
-
221
- <pre>% rake test</pre>
222
-
223
- <p>runs all of the tests in the test directory.</p>
224
-
225
- <h2 id="label-Overview">Overview<span><a href="#label-Overview">&para;</a> <a href="#top">&uarr;</a></span></h2>
226
-
227
- <p>The midilib <a href="MIDI.html">MIDI</a> file reader only understands <a
228
- href="MIDI.html">MIDI</a> file format 1, where a sequence is made up of
229
- multiple tracks. It doesn&#39;t yet understand format 0 (a single track
230
- containing all events) or format 2 (a collection of format 0 files in one
231
- file).</p>
232
-
233
- <h3 id="label-MIDI-3A-3ASequence"><a href="MIDI/Sequence.html">MIDI::Sequence</a><span><a href="#label-MIDI-3A-3ASequence">&para;</a> <a href="#top">&uarr;</a></span></h3>
234
-
235
- <p>A sequence contains a collection of tracks and global information like the
236
- sequence&#39;s pulses per quarter note (ppqn) and time signature.</p>
237
-
238
- <p>The first track in a sequence is special; it holds meta-events like tempo
239
- and sequence name. Don&#39;t put any notes in this track.</p>
240
-
241
- <p><a href="MIDI/Sequence.html">MIDI::Sequence</a> also contains some
242
- convenience methods that let you set and retrieve the sequence&#39;s name,
243
- the time signature, and to retrieve the first tempo event&#39;s
244
- beats-per-minute value.</p>
245
-
246
- <p>Normally instances of <a
247
- href="MIDI/IO/SeqReader.html">MIDI::IO::SeqReader</a> and <a
248
- href="MIDI/IO/SeqWriter.html">MIDI::IO::SeqWriter</a> are used when a
249
- sequence reads itself from or writes itself to a <a
250
- href="MIDI.html">MIDI</a> file. You can change that by setting a
251
- sequence&#39;s reader_class or writer_class attributes. Instances of the
252
- classes contained in those attributes are created and used whenever the
253
- sequence reads or writes itself.</p>
254
-
255
- <h3 id="label-MIDI-3A-3ATrack"><a href="MIDI/Track.html">MIDI::Track</a><span><a href="#label-MIDI-3A-3ATrack">&para;</a> <a href="#top">&uarr;</a></span></h3>
256
-
257
- <p>A track contains an array of events.</p>
258
-
259
- <p>When you modify the <code>events</code> array, make sure to call
260
- recalc_times so each event gets its <code>time_from_start</code>
261
- recalculated. You don&#39;t have to do that after every event you add; just
262
- remember to do so before using the track in a way that expects the list of
263
- events to be ordered correctly.</p>
264
-
265
- <p>A Track also holds a bit mask that specifies the channels used by the
266
- track. This bit mask is set when the track is read from the <a
267
- href="MIDI.html">MIDI</a> file by a SeqReader but is <em>not</em> kept up
268
- to date by any other methods. Specifically, if you add events to a track at
269
- any other time, the bit mask will not be updated.</p>
270
-
271
- <h3 id="label-MIDI-3A-3AMeasure"><a href="MIDI/Measure.html">MIDI::Measure</a><span><a href="#label-MIDI-3A-3AMeasure">&para;</a> <a href="#top">&uarr;</a></span></h3>
272
-
273
- <p>This class contains information about a measure from the sequence. Measure
274
- data is based on the time signature information from the sequence and is
275
- not stored in the sequence itself.</p>
276
-
277
- <h3 id="label-MIDI-3A-3AMeasures"><a href="MIDI/Measures.html">MIDI::Measures</a><span><a href="#label-MIDI-3A-3AMeasures">&para;</a> <a href="#top">&uarr;</a></span></h3>
278
-
279
- <p>The class <a href="MIDI/Sequence.html">MIDI::Sequence</a> method
280
- get_measures returns a <a href="MIDI/Measures.html">MIDI::Measures</a>
281
- object. <a href="MIDI/Measures.html">MIDI::Measures</a> is a subclass of
282
- Array. It is a specialized container for <a
283
- href="MIDI/Measure.html">MIDI::Measure</a> objects, which can be use to map
284
- event times to measure numbers. Please note that this object has to be
285
- remade when events are deleted/added in the sequence.</p>
286
-
287
- <p><a href="MIDI/Measure.html">MIDI::Measure</a> and <a
288
- href="MIDI/Measures.html">MIDI::Measures</a> are brought to us by Jari
289
- Williamsson &lt;jari.williamsson@mailbox.swipnet.se&gt;, who also
290
- contributed some improvements to the <a
291
- href="MIDI/Event.html">MIDI::Event</a> and <a
292
- href="MIDI/Track.html">MIDI::Track</a> classes.</p>
293
-
294
- <h3 id="label-MIDI-3A-3AEvent"><a href="MIDI/Event.html">MIDI::Event</a><span><a href="#label-MIDI-3A-3AEvent">&para;</a> <a href="#top">&uarr;</a></span></h3>
295
-
296
- <p>Each event holds not only its delta time but also its time from the start
297
- of the track. The track is responsible for recalculating its events&#39;
298
- start times. You can call <a
299
- href="MIDI/Track.html#method-i-recalc_times">MIDI::Track#recalc_times</a>
300
- to do so.</p>
301
-
302
- <p>Subclasses of <a href="MIDI/Event.html">MIDI::Event</a> implement the
303
- various <a href="MIDI.html">MIDI</a> messages such as note on and off,
304
- controller values, system exclusive data, and realtime bytes.</p>
305
-
306
- <p><a href="MIDI/Realtime.html">MIDI::Realtime</a> events have delta values
307
- and start times, just like all the other midilib event types do. (MIDI real
308
- time status bytes don&#39;t have delta times, but this way we can record
309
- when in a track the realtime byte was received and should be sent. This is
310
- useful for start/continue/stop events that control other devices, for
311
- example.) Note that when a <a href="MIDI/Realtime.html">MIDI::Realtime</a>
312
- event is written out to a <a href="MIDI.html">MIDI</a> file, the delta time
313
- is not written.</p>
314
-
315
- <p><a href="MIDI/MetaEvent.html">MIDI::MetaEvent</a> events hold an array of
316
- bytes named &#39;data&#39;. Many meta events are string holders (text,
317
- lyric, marker, etc.) Though the &#39;data&#39; value is always an array of
318
- bytes, <a href="MIDI/MetaEvent.html">MIDI::MetaEvent</a> helps with saving
319
- and accessing string. The <a
320
- href="MIDI/MetaEvent.html#method-i-data_as_str">MIDI::MetaEvent#data_as_str</a>
321
- method returns the data bytes as a string. When assigning to a meta
322
- event&#39;s data, if you pass in a string it will get converted to an array
323
- of bytes.</p>
324
-
325
- <h2 id="label-How+To+Use">How To Use<span><a href="#label-How+To+Use">&para;</a> <a href="#top">&uarr;</a></span></h2>
326
-
327
- <p>The following examples show you how to use midilib to read, write, and
328
- manipulate <a href="MIDI.html">MIDI</a> files and modify track events. See
329
- also the files in the examples directory, which are described below.</p>
330
-
331
- <h3 id="label-Reading+a+MIDI+File">Reading a <a href="MIDI.html">MIDI</a> File<span><a href="#label-Reading+a+MIDI+File">&para;</a> <a href="#top">&uarr;</a></span></h3>
332
-
333
- <p>To read a <a href="MIDI.html">MIDI</a> file, create a <a
334
- href="MIDI/Sequence.html">MIDI::Sequence</a> object and call its read
335
- method, passing in an <a href="IO.html">IO</a> object.</p>
336
-
337
- <p>The read method takes an optional block. If present, the block is called
338
- once after each track has finished being read. Each time, it is passed the
339
- track object, the total number of tracks and the number of the current
340
- track that has just been read. This is useful for notifying the user of
341
- progress, for example by updating a GUI progress bar.</p>
342
-
343
- <pre class="ruby"><span class="ruby-identifier">require</span> <span class="ruby-string">&#39;midilib/io/seqreader&#39;</span>
344
-
345
- <span class="ruby-comment"># Create a new, empty sequence.</span>
346
- <span class="ruby-identifier">seq</span> = <span class="ruby-constant">MIDI</span><span class="ruby-operator">::</span><span class="ruby-constant">Sequence</span>.<span class="ruby-identifier">new</span>()
347
-
348
- <span class="ruby-comment"># Read the contents of a MIDI file into the sequence.</span>
349
- <span class="ruby-constant">File</span>.<span class="ruby-identifier">open</span>(<span class="ruby-string">&#39;my_midi_file.mid&#39;</span>, <span class="ruby-string">&#39;rb&#39;</span>) { <span class="ruby-operator">|</span> <span class="ruby-identifier">file</span> <span class="ruby-operator">|</span>
350
- <span class="ruby-identifier">seq</span>.<span class="ruby-identifier">read</span>(<span class="ruby-identifier">file</span>) { <span class="ruby-operator">|</span> <span class="ruby-identifier">track</span>, <span class="ruby-identifier">num_tracks</span>, <span class="ruby-identifier">i</span> <span class="ruby-operator">|</span>
351
- <span class="ruby-comment"># Print something when each track is read.</span>
352
- <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;read track #{i} of #{num_tracks}&quot;</span>
353
- }
354
- }
355
- </pre>
356
-
357
- <h3 id="label-Writing+a+MIDI+File">Writing a <a href="MIDI.html">MIDI</a> File<span><a href="#label-Writing+a+MIDI+File">&para;</a> <a href="#top">&uarr;</a></span></h3>
358
-
359
- <p>To write a <a href="MIDI.html">MIDI</a> file, call the write method,
360
- passing in an <a href="IO.html">IO</a> object.</p>
361
-
362
- <pre class="ruby"><span class="ruby-identifier">require</span> <span class="ruby-string">&#39;midilib/io/seqwriter&#39;</span>
363
-
364
- <span class="ruby-comment"># Start with a sequence that has something worth saving.</span>
365
- <span class="ruby-identifier">seq</span> = <span class="ruby-identifier">read_or_create_seq_we_care_not_how</span>()
366
-
367
- <span class="ruby-comment"># Write the sequence to a MIDI file.</span>
368
- <span class="ruby-constant">File</span>.<span class="ruby-identifier">open</span>(<span class="ruby-string">&#39;my_output_file.mid&#39;</span>, <span class="ruby-string">&#39;wb&#39;</span>) { <span class="ruby-operator">|</span> <span class="ruby-identifier">file</span> <span class="ruby-operator">|</span> <span class="ruby-identifier">seq</span>.<span class="ruby-identifier">write</span>(<span class="ruby-identifier">file</span>) }
369
- </pre>
370
-
371
- <h3 id="label-Editing+a+MIDI+File">Editing a <a href="MIDI.html">MIDI</a> File<span><a href="#label-Editing+a+MIDI+File">&para;</a> <a href="#top">&uarr;</a></span></h3>
372
-
373
- <p>Combining the last two examples, here is a script that reads a <a
374
- href="MIDI.html">MIDI</a> file, transposes some events, and writes the
375
- sequence out to a different file. This is a useful template for
376
- programatically manipulating <a href="MIDI.html">MIDI</a> data.</p>
377
-
378
- <p>This code transposes all of the note events (note on, note off, and poly
379
- pressure) on channel 5 down one octave.</p>
380
-
381
- <h4 id="label-Transposing+One+Channel">Transposing One Channel<span><a href="#label-Transposing+One+Channel">&para;</a> <a href="#top">&uarr;</a></span></h4>
382
-
383
- <pre class="ruby"><span class="ruby-identifier">require</span> <span class="ruby-string">&#39;midilib/io/seqreader&#39;</span>
384
- <span class="ruby-identifier">require</span> <span class="ruby-string">&#39;midilib/io/seqwriter&#39;</span>
385
-
386
- <span class="ruby-comment"># Create a new, empty sequence.</span>
387
- <span class="ruby-identifier">seq</span> = <span class="ruby-constant">MIDI</span><span class="ruby-operator">::</span><span class="ruby-constant">Sequence</span>.<span class="ruby-identifier">new</span>()
388
-
389
- <span class="ruby-comment"># Read the contents of a MIDI file into the sequence.</span>
390
- <span class="ruby-constant">File</span>.<span class="ruby-identifier">open</span>(<span class="ruby-string">&#39;my_input_file.mid&#39;</span>, <span class="ruby-string">&#39;rb&#39;</span>) { <span class="ruby-operator">|</span> <span class="ruby-identifier">file</span> <span class="ruby-operator">|</span>
391
- <span class="ruby-identifier">seq</span>.<span class="ruby-identifier">read</span>(<span class="ruby-identifier">file</span>) { <span class="ruby-operator">|</span> <span class="ruby-identifier">track</span>, <span class="ruby-identifier">num_tracks</span>, <span class="ruby-identifier">i</span> <span class="ruby-operator">|</span>
392
- <span class="ruby-comment"># Print something when each track is read.</span>
393
- <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;read track #{i} of #{num_tracks}&quot;</span>
394
- }
395
- }
396
-
397
- <span class="ruby-comment"># Iterate over every event in every track.</span>
398
- <span class="ruby-identifier">seq</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span> <span class="ruby-identifier">track</span> <span class="ruby-operator">|</span>
399
- <span class="ruby-identifier">track</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span> <span class="ruby-identifier">event</span> <span class="ruby-operator">|</span>
400
- <span class="ruby-comment"># If the event is a note event (note on, note off, or poly</span>
401
- <span class="ruby-comment"># pressure) and it is on MIDI channel 5 (channels start at</span>
402
- <span class="ruby-comment"># 0, so we use 4), then transpose the event down one octave.</span>
403
- <span class="ruby-keyword">if</span> <span class="ruby-constant">MIDI</span><span class="ruby-operator">::</span><span class="ruby-constant">NoteEvent</span> <span class="ruby-operator">===</span> <span class="ruby-identifier">event</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">event</span>.<span class="ruby-identifier">channel</span> <span class="ruby-operator">==</span> <span class="ruby-value">4</span>
404
- <span class="ruby-identifier">event</span>.<span class="ruby-identifier">note</span> <span class="ruby-operator">-=</span> <span class="ruby-value">12</span>
405
- <span class="ruby-keyword">end</span>
406
- }
407
- }
408
-
409
- <span class="ruby-comment"># Write the sequence to a MIDI file.</span>
410
- <span class="ruby-constant">File</span>.<span class="ruby-identifier">open</span>(<span class="ruby-string">&#39;my_output_file.mid&#39;</span>, <span class="ruby-string">&#39;wb&#39;</span>) { <span class="ruby-operator">|</span> <span class="ruby-identifier">file</span> <span class="ruby-operator">|</span> <span class="ruby-identifier">seq</span>.<span class="ruby-identifier">write</span>(<span class="ruby-identifier">file</span>) }
411
- </pre>
412
-
413
- <h3 id="label-Manipulating+tracks">Manipulating tracks<span><a href="#label-Manipulating+tracks">&para;</a> <a href="#top">&uarr;</a></span></h3>
414
-
415
- <p>If you modify a track&#39;s list of events directly, don&#39;t forget to
416
- call <a
417
- href="MIDI/Track.html#method-i-recalc_times">MIDI::Track#recalc_times</a>
418
- when you are done.</p>
419
-
420
- <pre class="ruby"><span class="ruby-identifier">track</span>.<span class="ruby-identifier">events</span>[<span class="ruby-value">42</span>, <span class="ruby-value">1</span>] = <span class="ruby-identifier">array_of_events</span>
421
- <span class="ruby-identifier">track</span>.<span class="ruby-identifier">events</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">an_event</span>
422
- <span class="ruby-identifier">track</span>.<span class="ruby-identifier">merge</span>(<span class="ruby-identifier">array_of_events</span>)
423
- <span class="ruby-identifier">track</span>.<span class="ruby-identifier">recalc_times</span>
424
- </pre>
425
-
426
- <h3 id="label-Calculating+delta+times">Calculating delta times<span><a href="#label-Calculating+delta+times">&para;</a> <a href="#top">&uarr;</a></span></h3>
427
-
428
- <p>A few methods in <a href="MIDI/Sequence.html">MIDI::Sequence</a> make it
429
- easier to calculate the delta times that represent note lengths. <a
430
- href="MIDI/Sequence.html#method-i-length_to_delta">MIDI::Sequence#length_to_delta</a>
431
- takes a note length (a multiple of a quarter note) and returns the delta
432
- time given the sequence&#39;s current ppqn (pulses per quarter note)
433
- setting. 1 is a quarter note, 1.0/32.0 is a 32nd note (use floating-point
434
- numbers to avoid integer rounding), 1.5 is a dotted quarter, etc. See the
435
- documentation for that method for more information.</p>
436
-
437
- <p><a
438
- href="MIDI/Sequence.html#method-i-note_to_length">MIDI::Sequence#note_to_length</a>
439
- takes a note name and returns a length value (again, as a multiple of a
440
- quarter note). Legal note names are those found in
441
- MIDI::Sequence::NOTE_TO_LENGTH, and may begin with “dotted” and/or end with
442
- “triplet”. For example, “whole”, “sixteenth”, “32nd”, “quarter triplet”,
443
- “dotted 16th”, and “dotted 8th triplet” are all legal note names.</p>
444
-
445
- <p>Finally, <a
446
- href="MIDI/Sequence.html#method-i-note_to_delta">MIDI::Sequence#note_to_delta</a>
447
- takes a note name and returns a delta time. It does this by calling
448
- note_to_length, then passing the result to length_to_delta.</p>
449
-
450
- <h3 id="label-Example+Scripts">Example Scripts<span><a href="#label-Example+Scripts">&para;</a> <a href="#top">&uarr;</a></span></h3>
451
-
452
- <p>Here are short descriptions of each of the examples found in the examples
453
- directory.</p>
454
- <ul><li>
455
- <p>examples/from_scratch.rb shows you how to create a new sequence from
456
- scratch and save it to a <a href="MIDI.html">MIDI</a> file. It creates a
457
- file called &#39;from_scratch.mid&#39;.</p>
458
- </li><li>
459
- <p>examples/seq2text.rb dumps a <a href="MIDI.html">MIDI</a> file as text. It
460
- reads in a sequence and uses the to_s method of each event.</p>
461
- </li><li>
462
- <p>examples/reader2text.rb dumps a <a href="MIDI.html">MIDI</a> file as text.
463
- It subclasses MIDI::SeqReader instead of creating a sequence containing
464
- tracks and events.</p>
465
- </li><li>
466
- <p>examples/transpose.rb transposes all note events (note on, note off, poly
467
- pressure) on a specified channel by a specified amount.</p>
468
- </li><li>
469
- <p>There is also one <a href="MIDI.html">MIDI</a> file, examples/NoFences.mid.
470
- It is a little pop ditty I wrote. The instruments in this file use General
471
- <a href="MIDI.html">MIDI</a> patch numbers and drum note assignments. Since
472
- I don&#39;t normally use GM patches, the sounds used here are at best
473
- approximations of the sounds I use.</p>
474
- </li></ul>
475
-
476
- <h2 id="label-Resources">Resources<span><a href="#label-Resources">&para;</a> <a href="#top">&uarr;</a></span></h2>
477
-
478
- <p>The Ruby Web site (<a
479
- href="http://www.ruby-lang.org/en/index.html">www.ruby-lang.org/en/index.html</a>)
480
- contains an introduction to Ruby, the Ruby Application Archive (RAA) at <a
481
- href="http://raa.ruby-lang.org">raa.ruby-lang.org</a>, and pointers to more
482
- information.</p>
483
-
484
- <p>&lt;cite&gt;Programming Ruby, The Pragmatic Programmer&#39;s
485
- Guide&lt;/cite&gt;, by David Thomas and Andrew Hunt, is a well-written and
486
- practical introduction to Ruby. Its Web page at <a
487
- href="http://www.rubycentral.com/book">www.rubycentral.com/book</a> also
488
- contains a wealth of Ruby information. Though the first edition book is
489
- available online, I encourage you to purchase a copy of the latest edition.</p>
490
-
491
- <p>A description of the <a href="MIDI.html">MIDI</a> file format can be found
492
- in a few places such as <a
493
- href="http://www.borg.com/~jglatt/tech/midifile.htm">www.borg.com/~jglatt/tech/midifile.htm</a>.</p>
494
-
495
- <p>The <a href="MIDI.html">MIDI</a> message reference at <a
496
- href="http://www.jimmenard.com/midi_ref.html">www.jimmenard.com/midi_ref.html</a>
497
- describes the format of <a href="MIDI.html">MIDI</a> commands.</p>
498
-
499
- <h1 id="label-To+Do">To Do<span><a href="#label-To+Do">&para;</a> <a href="#top">&uarr;</a></span></h1>
500
-
501
- <h2 id="label-Bugs">Bugs<span><a href="#label-Bugs">&para;</a> <a href="#top">&uarr;</a></span></h2>
502
-
503
- <p>No known bugs. (If that&#39;s not a challenge, I don&#39;t know what is.)</p>
504
-
505
- <h2 id="label-Features">Features<span><a href="#label-Features">&para;</a> <a href="#top">&uarr;</a></span></h2>
506
- <ul><li>
507
- <p><code>print_decimal_numbers</code> and
508
- <code>print_channel_numbers_from_one</code> should be associated with
509
- sequence, or perhaps track, not event.</p>
510
- </li><li>
511
- <p>Method to translate event&#39;s time_from_start to number of milliseconds
512
- from start.</p>
513
- </li><li>
514
- <p>Swing quantizing. (Implied by list email from Carl Youngblood
515
- &lt;carl.youngblood@gmail.com&gt;)</p>
516
- </li><li>
517
- <p>Implement key signature in SeqReader.</p>
518
- </li><li>
519
- <p>Format 0 files.</p>
520
- </li><li>
521
- <p>Format 2 files(?).</p>
522
- </li></ul>
523
-
524
- <h2 id="label-Documentation">Documentation<span><a href="#label-Documentation">&para;</a> <a href="#top">&uarr;</a></span></h2>
525
- <ul><li>
526
- <p>Write better docs.</p>
527
- </li></ul>
528
-
529
- <h2 id="label-Tests">Tests<span><a href="#label-Tests">&para;</a> <a href="#top">&uarr;</a></span></h2>
530
- <ul><li>
531
- <p>Tests for Noah Thorp&#39;s midilib bug fixes.</p>
532
- </li></ul>
533
-
534
- <h1 id="label-Support">Support<span><a href="#label-Support">&para;</a> <a href="#top">&uarr;</a></span></h1>
535
- <ul><li>
536
- <p>Visit the forums, bug list, and mailing list pages at <a
537
- href="http://rubyforge.org/projects/midilib">rubyforge.org/projects/midilib</a></p>
538
- </li><li>
539
- <p>Send email to Jim Menard at <a
540
- href="mailto:jim@jimmenard.com">jim@jimmenard.com</a></p>
541
- </li><li>
542
- <p>Ask on the ruby-talk mailing list</p>
543
- </li></ul>
544
-
545
- <h1 id="label-Administrivia">Administrivia<span><a href="#label-Administrivia">&para;</a> <a href="#top">&uarr;</a></span></h1>
546
- <dl class="rdoc-list note-list"><dt>Author
547
- <dd>
548
- <p>Jim Menard (<a href="mailto:jim@jimmenard.com">jim@jimmenard.com</a>)</p>
549
- </dd><dt>Copyright
550
- <dd>
551
- <p>Copyright © 2003-2013 Jim Menard</p>
552
- </dd><dt>License
553
- <dd>
554
- <p>Distributed under the same license as Ruby.</p>
555
- </dd></dl>
556
-
557
- <h2 id="label-Copying">Copying<span><a href="#label-Copying">&para;</a> <a href="#top">&uarr;</a></span></h2>
558
-
559
- <p>midilib is copyrighted free software by Jim Menard and is released under
560
- the same license as Ruby. See the Ruby license at <a
561
- href="http://www.ruby-lang.org/en/LICENSE.txt">www.ruby-lang.org/en/LICENSE.txt</a>.</p>
562
-
563
- <p>midilib may be freely copied in its entirety providing this notice, all
564
- source code, all documentation, and all other files are included.</p>
565
-
566
- <p>midilib is Copyright © 2003-2013 by Jim Menard.</p>
567
-
568
- <p>The song “No Fences” contained in the <a href="MIDI.html">MIDI</a> file
569
- examples/NoFences.mid is Copyright © 1992 by Jim Menard
570
- (jim@jimmenard.com). It may be freely used for non-commercial purposes as
571
- long as the author is given credit.</p>
572
-
573
- <h2 id="label-Recent+Changes">Recent Changes<span><a href="#label-Recent+Changes">&para;</a> <a href="#top">&uarr;</a></span></h2>
574
-
575
- <h3 id="label-Changes+for+2.0.5-3A">Changes for 2.0.5:<span><a href="#label-Changes+for+2.0.5-3A">&para;</a> <a href="#top">&uarr;</a></span></h3>
576
-
577
- <p>Updated <code>install.rb</code> to work with newer versions of Ruby by
578
- using <code>fileutils</code> instead of <code>ftools</code>.</p>
579
-
580
- <h3 id="label-Changes+for+2.0.3-3A">Changes for 2.0.3:<span><a href="#label-Changes+for+2.0.3-3A">&para;</a> <a href="#top">&uarr;</a></span></h3>
581
-
582
- <p>New <a
583
- href="MIDI/Sequence.html#method-i-pulses_to_seconds">MIDI::Sequence#pulses_to_seconds</a>
584
- method.</p>
585
-
586
- <h3 id="label-Changes+for+2.0.2-3A">Changes for 2.0.2:<span><a href="#label-Changes+for+2.0.2-3A">&para;</a> <a href="#top">&uarr;</a></span></h3>
587
-
588
- <p>Stop monkeypatching Array in <a href="MIDI/Track.html">MIDI::Track</a>.</p>
589
-
590
- <h3 id="label-Changes+for+2.0.0-3A">Changes for 2.0.0:<span><a href="#label-Changes+for+2.0.0-3A">&para;</a> <a href="#top">&uarr;</a></span></h3>
591
-
592
- <p><a href="MIDI/NoteOn.html">MIDI::NoteOnEvent</a> and <a
593
- href="MIDI/NoteOff.html">MIDI::NoteOffEvent</a> renamed to <a
594
- href="MIDI/NoteOn.html">MIDI::NoteOn</a> and <a
595
- href="MIDI/NoteOff.html">MIDI::NoteOff</a>. The old names will still work
596
- for a while.</p>
597
-
598
- <p>The <a href="MIDI/Event.html">MIDI::Event</a> boolean methods like meta?
599
- and note? have been removed. Use the event classes themselves (for example,
600
- <a href="MIDI/MetaEvent.html">MIDI::MetaEvent</a> === my_event or
601
- my_event.kind_of?(MIDI::MetaEvent)). Case statements that use classes work,
602
- too:</p>
603
-
604
- <pre class="ruby"><span class="ruby-keyword">case</span> <span class="ruby-identifier">my_event</span>
605
- <span class="ruby-keyword">when</span> <span class="ruby-constant">MIDI</span><span class="ruby-operator">::</span><span class="ruby-constant">NoteEvent</span> <span class="ruby-comment"># superclass of note on, note off, poly press</span>
606
- <span class="ruby-identifier">do_this</span>()
607
- <span class="ruby-keyword">when</span> <span class="ruby-constant">MIDI</span><span class="ruby-operator">::</span><span class="ruby-constant">Controller</span>
608
- <span class="ruby-identifier">do_that</span>()
609
- <span class="ruby-keyword">end</span>
610
- </pre>
611
-
612
- <p>Introduced Adam Murray&#39;s stable sorting code for <a
613
- href="MIDI/Track.html#method-i-recalc_delta_from_times">MIDI::Track#recalc_delta_from_times</a>.
614
- See <a
615
- href="http://wiki.github.com/adamjmurray/cosy/midilib-notes">wiki.github.com/adamjmurray/cosy/midilib-notes</a>
616
- and <a
617
- href="http://github.com/adamjmurray/cosy/blob/master/lib/cosy/helper/midi_file_renderer_helper.rb">github.com/adamjmurray/cosy/blob/master/lib/cosy/helper/midi_file_renderer_helper.rb</a>
618
- for details.</p>
619
-
620
- <p>Aliased <a href="MIDI/Track.html#method-i-sort">MIDI::Track#sort</a> to <a
621
- href="MIDI/Track.html#method-i-recalc_delta_from_times">MIDI::Track#recalc_delta_from_times</a>,
622
- since all sort did was sort the events then call recalc_delta_from_times,
623
- and recalc_delta_from_times sorts the events before doing anything else.</p>
624
-
625
- <p>MIDI::Tempo#mpq_to_bpm now returns a float.</p>
626
-
627
- <h3 id="label-Changes+for+1.2.0-3A">Changes for 1.2.0:<span><a href="#label-Changes+for+1.2.0-3A">&para;</a> <a href="#top">&uarr;</a></span></h3>
628
-
629
- <p>Use byte arrays instead of strings for passing around data. All tests now
630
- pass for both Ruby 1.8.X and 1.9.X.</p>
631
-
632
- <h3 id="label-New+code+repository">New code repository<span><a href="#label-New+code+repository">&para;</a> <a href="#top">&uarr;</a></span></h3>
633
-
634
- <p>The midilib code is now hosted at Github (<a
635
- href="http://github.com/jimm/midilib">github.com/jimm/midilib</a>).</p>
636
-
637
- <h3 id="label-Changes+for+1.1.4-3A">Changes for 1.1.4:<span><a href="#label-Changes+for+1.1.4-3A">&para;</a> <a href="#top">&uarr;</a></span></h3>
638
- <ul><li>
639
- <p>Fixed a bug in KeySig.data_as_bytes. Thanks to Noah Thorp for finding this
640
- and the bug fixed in 1.1.3.</p>
641
- </li></ul>
642
-
643
- <h3 id="label-Changes+for+1.1.3-3A">Changes for 1.1.3:<span><a href="#label-Changes+for+1.1.3-3A">&para;</a> <a href="#top">&uarr;</a></span></h3>
644
- <ul><li>
645
- <p>Fixed the way midilib detects the behavior of IO.getc.</p>
646
- </li></ul>
647
-
648
- <h3 id="label-Changes+for+1.1.2-3A">Changes for 1.1.2:<span><a href="#label-Changes+for+1.1.2-3A">&para;</a> <a href="#top">&uarr;</a></span></h3>
649
- <ul><li>
650
- <p>Define <a
651
- href="MIDI/IO/MIDIFile.html#method-i-getc">MIDI::IO::MIDIFile#getc</a>
652
- differently for different Ruby versions, instead of checking for
653
- String.bytes every time we read a byte.</p>
654
- </li></ul>
655
-
656
- <h3 id="label-Changes+for+1.1.1-3A">Changes for 1.1.1:<span><a href="#label-Changes+for+1.1.1-3A">&para;</a> <a href="#top">&uarr;</a></span></h3>
657
- <ul><li>
658
- <p>Make <a
659
- href="MIDI/IO/MIDIFile.html#method-i-getc">MIDI::IO::MIDIFile#getc</a> do
660
- the right thing for both Ruby 1.8 and 1.9.</p>
661
- </li></ul>
662
-
663
- <h3 id="label-Changes+for+1.1.0-3A">Changes for 1.1.0:<span><a href="#label-Changes+for+1.1.0-3A">&para;</a> <a href="#top">&uarr;</a></span></h3>
664
- <ul><li>
665
- <p>Added test/test.mid to list of files to be included when packaging midifile
666
- for distribution.</p>
667
- </li></ul>
668
-
669
- <h3 id="label-Changes+for+1.0.0-3A">Changes for 1.0.0:<span><a href="#label-Changes+for+1.0.0-3A">&para;</a> <a href="#top">&uarr;</a></span></h3>
670
- <ul><li>
671
- <p>Fixed the bug in Track#recalc_delta_from_times found by Christopher Rose.</p>
672
- </li></ul>
673
-
674
- <h3 id="label-Changes+for+0.8.7-3A">Changes for 0.8.7:<span><a href="#label-Changes+for+0.8.7-3A">&para;</a> <a href="#top">&uarr;</a></span></h3>
675
- <ul><li>
676
- <p>Fixed the misspelled POLY_PRESSURE constant, thanks to Mario Pehle.</p>
677
- </li></ul>
678
-
679
- <h3 id="label-Changes+for+0.8.6-3A">Changes for 0.8.6:<span><a href="#label-Changes+for+0.8.6-3A">&para;</a> <a href="#top">&uarr;</a></span></h3>
680
- <ul><li>
681
- <p>Added missing test/test.mid.</p>
682
- </li></ul>
683
-
684
- <h3 id="label-Changes+for+0.8.5-3A">Changes for 0.8.5:<span><a href="#label-Changes+for+0.8.5-3A">&para;</a> <a href="#top">&uarr;</a></span></h3>
685
- <ul><li>
686
- <p>Fixed bugs in <a href="MIDI/PitchBend.html">MIDI::PitchBend</a> reading and
687
- writing, thanks to Emanuel Borsboom.</p>
688
- </li><li>
689
- <p>Fixed a bug in <a
690
- href="MIDI/Track.html#method-i-quantize">MIDI::Track#quantize</a>.</p>
691
- </li><li>
692
- <p>The argument to <a
693
- href="MIDI/Track.html#method-i-quantize">MIDI::Track#quantize</a> has
694
- changed: it is now either a note name (“sixteenth”, “32nd”, “8th triplet”)
695
- or a length (1 = quarter, 0.25 = sixteenth). This is a drastic change that
696
- will break all previous calls to quantize. However, since that method was
697
- broken already, I don&#39;t feel it&#39;s a burden to anybody to change the
698
- arguments.</p>
699
- </li></ul>
700
-
701
- <h3 id="label-Changes+for+0.8.4-3A">Changes for 0.8.4:<span><a href="#label-Changes+for+0.8.4-3A">&para;</a> <a href="#top">&uarr;</a></span></h3>
702
- <ul><li>
703
- <p>Realtime status bytes now set @is_realtime to true and return true when
704
- realtime? is called.</p>
705
- </li><li>
706
- <p>All system common events now set @is_system to true and return true when
707
- system? is called, not just system exclusive events.</p>
708
- </li><li>
709
- <p>Added examples/from_scratch.rb, which shows how to create a sequence
710
- manually.</p>
711
- </li><li>
712
- <p>New <a href="MIDI/Sequence.html">MIDI::Sequence</a> methods that turn note
713
- length names like “32nd”, “dotted quarter”, and “16th triplet” into delta
714
- times. See the docs below and MIDI::Sequence::length_to_delta,
715
- MIDI::Sequence::note_to_length, and MIDI::Sequence::note_to_delta.</p>
716
- </li></ul>
717
-
718
- <h3 id="label-Changes+for+0.8.3-3A">Changes for 0.8.3:<span><a href="#label-Changes+for+0.8.3-3A">&para;</a> <a href="#top">&uarr;</a></span></h3>
719
- <ul><li>
720
- <p>Added <a
721
- href="MIDI/NoteEvent.html#method-i-note_to_s">MIDI::NoteEvent#note_to_s</a>,
722
- which returns note name as a string like “C4” or “F#6”.</p>
723
- </li><li>
724
- <p>Added new boolean attributes to MIDI::Event: @print_decimal_numbers and
725
- @print_note_names. These are used by all Event to_s methods. See
726
- examples/seq2text.rb for an example.</p>
727
- </li></ul>
728
-
729
- <h3 id="label-Changes+for+0.8.2-3A">Changes for 0.8.2:<span><a href="#label-Changes+for+0.8.2-3A">&para;</a> <a href="#top">&uarr;</a></span></h3>
730
- <ul><li>
731
- <p>Changed MIDI::MetaEvent.type to MIDI::MetaEvent.event_type to avoid runtime
732
- complaints about Object#type calls.</p>
733
- </li><li>
734
- <p>Added &#39;b&#39; binary flag to file open modes for Windows.</p>
735
- </li><li>
736
- <p>Fixed $LOAD_PATH in example files.</p>
737
- </li><li>
738
- <p>Fixed read and write block arguments.</p>
739
- </li><li>
740
- <p>Fixed other example script bugs.</p>
741
- </li></ul>
742
-
743
- <h3 id="label-Changes+for+0.8.1-3A">Changes for 0.8.1:<span><a href="#label-Changes+for+0.8.1-3A">&para;</a> <a href="#top">&uarr;</a></span></h3>
744
- <ul><li>
745
- <p>Fixed track sorting.</p>
746
- </li><li>
747
- <p>Fixed track&#39;s recalc_delta_from_times method.</p>
748
- </li><li>
749
- <p>Fixed event quantization.</p>
750
- </li><li>
751
- <p>More tests and documentation.</p>
752
- </li></ul>
753
-
754
- <h2 id="label-Warranty">Warranty<span><a href="#label-Warranty">&para;</a> <a href="#top">&uarr;</a></span></h2>
755
-
756
- <p>This software is provided “as is” and without any express or implied
757
- warranties, including, without limitation, the implied warranties of
758
- merchantability and fitness for a particular purpose.</p>
759
- </main>
760
-
761
-
762
-
763
- <footer id="validator-badges" role="contentinfo">
764
- <p><a href="http://validator.w3.org/check/referer">Validate</a>
765
- <p>Generated by <a href="http://docs.seattlerb.org/rdoc/">RDoc</a> 4.2.0.
766
- <p>Based on <a href="http://deveiate.org/projects/Darkfish-RDoc/">Darkfish</a> by <a href="http://deveiate.org">Michael Granger</a>.
767
- </footer>
768
-