midilib 2.0.4 → 2.0.5

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 (94) hide show
  1. checksums.yaml +7 -0
  2. data/README.rdoc +9 -4
  3. data/Rakefile +2 -6
  4. data/examples/from_scratch.rb +3 -5
  5. data/examples/measures_mbt.rb +4 -4
  6. data/examples/print_program_changes.rb +9 -9
  7. data/examples/reader2text.rb +188 -188
  8. data/examples/seq2text.rb +17 -17
  9. data/examples/split.rb +19 -19
  10. data/examples/strings.rb +14 -14
  11. data/examples/transpose.rb +31 -31
  12. data/html/IO.html +65 -169
  13. data/html/MIDI.html +138 -256
  14. data/html/MIDI/ActiveSense.html +89 -178
  15. data/html/MIDI/ChannelEvent.html +95 -183
  16. data/html/MIDI/ChannelPressure.html +105 -190
  17. data/html/MIDI/Clock.html +89 -178
  18. data/html/MIDI/Continue.html +89 -178
  19. data/html/MIDI/Controller.html +107 -192
  20. data/html/MIDI/Event.html +138 -222
  21. data/html/MIDI/IO.html +45 -157
  22. data/html/MIDI/IO/MIDIFile.html +596 -568
  23. data/html/MIDI/IO/SeqReader.html +272 -314
  24. data/html/MIDI/IO/SeqWriter.html +229 -305
  25. data/html/MIDI/KeySig.html +129 -211
  26. data/html/MIDI/MIDI.html +45 -154
  27. data/html/MIDI/MIDI/MIDI.html +45 -154
  28. data/html/MIDI/MIDI/MIDI/Array.html +87 -185
  29. data/html/MIDI/Marker.html +71 -170
  30. data/html/MIDI/Measure.html +95 -190
  31. data/html/MIDI/Measures.html +103 -193
  32. data/html/MIDI/MetaEvent.html +180 -253
  33. data/html/MIDI/NoteEvent.html +118 -204
  34. data/html/MIDI/NoteOff.html +95 -183
  35. data/html/MIDI/NoteOn.html +95 -183
  36. data/html/MIDI/PitchBend.html +106 -191
  37. data/html/MIDI/PolyPressure.html +106 -189
  38. data/html/MIDI/ProgramChange.html +105 -190
  39. data/html/MIDI/Realtime.html +98 -184
  40. data/html/MIDI/Sequence.html +246 -311
  41. data/html/MIDI/SongPointer.html +106 -191
  42. data/html/MIDI/SongSelect.html +105 -190
  43. data/html/MIDI/Start.html +89 -178
  44. data/html/MIDI/Stop.html +89 -178
  45. data/html/MIDI/SystemCommon.html +71 -170
  46. data/html/MIDI/SystemExclusive.html +108 -193
  47. data/html/MIDI/SystemReset.html +89 -178
  48. data/html/MIDI/Tempo.html +135 -213
  49. data/html/MIDI/TimeSig.html +135 -214
  50. data/html/MIDI/Track.html +217 -291
  51. data/html/MIDI/TuneRequest.html +98 -184
  52. data/html/MIDI/Utils.html +89 -189
  53. data/html/README_rdoc.html +237 -257
  54. data/html/TODO_rdoc.html +64 -139
  55. data/html/created.rid +14 -14
  56. data/html/css/fonts.css +167 -0
  57. data/html/{rdoc.css → css/rdoc.css} +265 -218
  58. data/html/fonts/Lato-Light.ttf +0 -0
  59. data/html/fonts/Lato-LightItalic.ttf +0 -0
  60. data/html/fonts/Lato-Regular.ttf +0 -0
  61. data/html/fonts/Lato-RegularItalic.ttf +0 -0
  62. data/html/fonts/SourceCodePro-Bold.ttf +0 -0
  63. data/html/fonts/SourceCodePro-Regular.ttf +0 -0
  64. data/html/images/add.png +0 -0
  65. data/html/images/arrow_up.png +0 -0
  66. data/html/images/delete.png +0 -0
  67. data/html/images/tag_blue.png +0 -0
  68. data/html/index.html +187 -169
  69. data/html/js/darkfish.js +41 -33
  70. data/html/js/jquery.js +4 -18
  71. data/html/js/navigation.js.gz +0 -0
  72. data/html/js/search.js +20 -5
  73. data/html/js/search_index.js +1 -1
  74. data/html/js/search_index.js.gz +0 -0
  75. data/html/js/searcher.js.gz +0 -0
  76. data/html/table_of_contents.html +1111 -498
  77. data/install.rb +43 -32
  78. data/lib/midilib/consts.rb +407 -407
  79. data/lib/midilib/event.rb +295 -294
  80. data/lib/midilib/info.rb +5 -5
  81. data/lib/midilib/io/midifile.rb +266 -267
  82. data/lib/midilib/io/seqreader.rb +106 -106
  83. data/lib/midilib/io/seqwriter.rb +59 -60
  84. data/lib/midilib/measure.rb +69 -69
  85. data/lib/midilib/sequence.rb +68 -70
  86. data/lib/midilib/track.rb +96 -102
  87. data/lib/midilib/utils.rb +15 -15
  88. data/test/event_equality.rb +50 -50
  89. data/test/test_event.rb +120 -122
  90. data/test/test_io.rb +35 -48
  91. data/test/test_sequence.rb +60 -60
  92. data/test/test_track.rb +154 -154
  93. data/test/test_varlen.rb +23 -25
  94. metadata +65 -57
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a7ad7b3f46a7550efe7a5f33bebc63280704ad12
4
+ data.tar.gz: 7b03d6a94f4e8de161e54f650bfaa07c325df930
5
+ SHA512:
6
+ metadata.gz: 626f1286f221899c310571c26f60c1d57abbf51694a5f13b3b2e56d038763388db63e799ecda03bf0d874c84ea85390ea122e3ecab2b6762bff0c5aaa4faf79c
7
+ data.tar.gz: 088f6fba5f281fd024089f7f919995cd4653abc1f0ee3361fbd0cc3ccb43ebb7120efe4b38e5cf76449fe65072cff8f18376368e7507216a94c3714d386728dd
@@ -8,7 +8,7 @@ http://github.com/jimm/midilib and the RubyGems.org page is
8
8
  http://rubygems.org/gems/midilib, where you can also find all the RDoc
9
9
  documentation.
10
10
 
11
- midilib is compatible with both Ruby 1.8.x and 1.9.x.
11
+ midilib is compatible with Ruby 1.8.x 1.9.x, and 2.x.
12
12
 
13
13
 
14
14
  == Dependencies
@@ -60,7 +60,7 @@ sequence is made up of multiple tracks. It doesn't yet understand format 0
60
60
  (a single track containing all events) or format 2 (a collection of format 0
61
61
  files in one file).
62
62
 
63
- d=== MIDI::Sequence
63
+ === MIDI::Sequence
64
64
 
65
65
  A sequence contains a collection of tracks and global information like the
66
66
  sequence's pulses per quarter note (ppqn) and time signature.
@@ -314,7 +314,7 @@ describes the format of MIDI commands.
314
314
  = Administrivia
315
315
 
316
316
  Author:: Jim Menard (mailto:jim@jimmenard.com)
317
- Copyright:: Copyright (c) 2003-2012 Jim Menard
317
+ Copyright:: Copyright (c) 2003-2013 Jim Menard
318
318
  License:: Distributed under the same license as Ruby.
319
319
 
320
320
 
@@ -327,7 +327,7 @@ http://www.ruby-lang.org/en/LICENSE.txt.
327
327
  midilib may be freely copied in its entirety providing this notice, all
328
328
  source code, all documentation, and all other files are included.
329
329
 
330
- midilib is Copyright (c) 2003-2012 by Jim Menard.
330
+ midilib is Copyright (c) 2003-2013 by Jim Menard.
331
331
 
332
332
  The song "No Fences" contained in the MIDI file examples/NoFences.mid is
333
333
  Copyright (c) 1992 by Jim Menard (jim@jimmenard.com). It may be freely used
@@ -336,6 +336,11 @@ for non-commercial purposes as long as the author is given credit.
336
336
 
337
337
  == Recent Changes
338
338
 
339
+ === Changes for 2.0.5:
340
+
341
+ Updated +install.rb+ to work with newer versions of Ruby by using
342
+ +fileutils+ instead of +ftools+.
343
+
339
344
  === Changes for 2.0.3:
340
345
 
341
346
  New MIDI::Sequence.pulses_to_seconds method.
data/Rakefile CHANGED
@@ -41,6 +41,7 @@ spec = Gem::Specification.new do |s|
41
41
  s.email = 'jim@jimmenard.com'
42
42
  s.homepage = 'http://github.com/jimm/midilib'
43
43
  s.rubyforge_project = PROJECT_NAME
44
+ s.license = 'Ruby'
44
45
 
45
46
  s.summary = "MIDI file and event manipulation library"
46
47
  s.description = <<EOF
@@ -79,12 +80,7 @@ task :publish => [:rdoc, :package] do
79
80
  end
80
81
 
81
82
  if RUBY_VERSION >= '1.9'
82
- Rake::TestTask.new do |t|
83
- t.libs << File.join(File.dirname(__FILE__), 'test')
84
- t.libs << File.join(File.dirname(__FILE__), 'lib')
85
- t.ruby_opts << '-rubygems'
86
- t.pattern = "test/**/test_*.rb"
87
- end
83
+ Rake::TestTask.new
88
84
  else
89
85
  task :test do
90
86
  Rake::run_tests
@@ -40,10 +40,10 @@ track.events << Controller.new(0, CC_VOLUME, 127)
40
40
  # delta time length of a single quarter note.
41
41
  track.events << ProgramChange.new(0, 1, 0)
42
42
  quarter_note_length = seq.note_to_delta('quarter')
43
- [0, 2, 4, 5, 7, 9, 11, 12].each { | offset |
43
+ [0, 2, 4, 5, 7, 9, 11, 12].each do |offset|
44
44
  track.events << NoteOn.new(0, 64 + offset, 127, 0)
45
45
  track.events << NoteOff.new(0, 64 + offset, 127, quarter_note_length)
46
- }
46
+ end
47
47
 
48
48
  # Calling recalc_times is not necessary, because that only sets the events'
49
49
  # start times, which are not written out to the MIDI file. The delta times are
@@ -51,6 +51,4 @@ quarter_note_length = seq.note_to_delta('quarter')
51
51
 
52
52
  # track.recalc_times
53
53
 
54
- File.open('from_scratch.mid', 'wb') { | file |
55
- seq.write(file)
56
- }
54
+ File.open('from_scratch.mid', 'wb') { |file| seq.write(file) }
@@ -19,12 +19,12 @@ File.open(ARGV[0], 'rb') { | file | seq.read(file) }
19
19
  # Get all measures, so events can be mapped to measures:
20
20
  measures = seq.get_measures
21
21
 
22
- seq.each { | track |
23
- track.each { | e |
22
+ seq.each { |track|
23
+ track.each { |e|
24
24
  if e.kind_of?(MIDI::NoteOn) then
25
25
  # Print out start of notes
26
26
  e.print_note_names = true
27
27
  puts measures.to_mbt(e) + " ch #{e.channel}: #{e.note_to_s}"
28
- end
29
- }
28
+ end
29
+ }
30
30
  }
@@ -11,18 +11,18 @@ DEFAULT_MIDI_TEST_FILE = 'NoFences.mid'
11
11
  # Read from MIDI file
12
12
  seq = MIDI::Sequence.new()
13
13
 
14
- File.open(ARGV[0] || DEFAULT_MIDI_TEST_FILE, 'rb') { | file |
15
- # The block we pass in to Sequence.read is called at the end of every
16
- # track read. It is optional, but is useful for progress reports.
17
- seq.read(file)
18
- }
14
+ File.open(ARGV[0] || DEFAULT_MIDI_TEST_FILE, 'rb') do |file|
15
+ # The block we pass in to Sequence.read is called at the end of every
16
+ # track read. It is optional, but is useful for progress reports.
17
+ seq.read(file)
18
+ end
19
19
 
20
- seq.each { | track |
20
+ seq.each do |track|
21
21
  puts
22
22
  puts "*** track name \"#{track.name}\", \"#{track.instrument}\""
23
- track.each { | e |
23
+ track.each do |e|
24
24
  e.print_decimal_numbers = true
25
25
  e.print_channel_numbers_from_one = true
26
26
  puts e if e.kind_of?(MIDI::ProgramChange)
27
- }
28
- }
27
+ end
28
+ end
@@ -21,187 +21,187 @@ DEFAULT_MIDI_TEST_FILE = 'NoFences.mid'
21
21
 
22
22
  class TextTranslator < MIDI::IO::MIDIFile
23
23
 
24
- def initialize(seq, proc = nil)
25
- super()
26
- @seq = seq
27
- @track = nil
28
- @update_block = block_given?() ? Proc.new() : proc
29
- end
30
-
31
- # Generate a unique number for a channel/note combination. This is used
32
- # to remember pending note on events.
33
- def note_hash(chan, note)
34
- return (chan << 8) + note
35
- end
36
-
37
- # Print a delta time.
38
- def pdelta
39
- print "#{@curr_ticks}: "
40
- end
41
-
42
- # The remaining methods are overrides of methods in MIDI::IO::MIDIFile.
43
-
44
- def header(format, ntrks, division)
45
- puts "header: format = #{format}, ntrks = #{ntrks}," +
46
- " division = #{division}"
47
-
48
- @ntrks = ntrks
49
- @update_block.call(nil, @ntrks, 0) if @update_block
50
- end
51
-
52
- def start_track()
53
- pdelta()
54
- puts "track start"
55
-
56
- @pending = []
57
- @chan_mask = 0
58
- end
59
-
60
- def end_track()
61
- pdelta()
62
- puts "track end; chans used bitmask = #{@chan_mask}"
63
- # Write message for any pending note on messages
64
- @pending.each_with_index { | num, chan |
65
- puts "pending note off missing for chan #{num >> 8}," +
66
- " note #{num & 0xff}" if note_obj
67
- }
68
- @pending = nil
69
-
70
- # call update block
71
- @update_block.call(@track, @ntrks, @seq.tracks.length) if @update_block
72
- end
73
-
74
- def note_on(chan, note, vel)
75
- pdelta()
76
- if vel == 0
77
- print "(note on, vel 0) "
78
- note_off(chan, note, 64)
79
- return
80
- end
81
-
82
- puts "note on chan #{chan}, note #{note}, vel #{vel}"
83
- @pending << note_hash(chan, note)
84
- track_uses_channel(chan)
85
- end
86
-
87
- def note_off(chan, note, vel)
88
- pdelta()
89
- # Find note on, create note off, connect the two, and remove
90
- # note on from pending list.
91
- pnum = note_hash(chan, note)
92
- @pending.each_with_index { | num, i |
93
- if pnum == num
94
- puts "note off chan #{chan}, note #{note}, vel #{vel}"
95
- @pending.delete_at(i)
96
- return
97
- end
98
- }
99
- puts "note off with no earlier note on (ch #{chan}, note" +
100
- " #{note}, vel #{vel})"
101
- end
102
-
103
- def pressure(chan, note, press)
104
- pdelta()
105
- puts "pressure chan #{chan}, note #{note}, press #{press}"
106
- track_uses_channel(chan)
107
- end
108
-
109
- def controller(chan, control, value)
110
- pdelta()
111
- puts "controller chan #{chan}, control #{control}, value #{value}"
112
- track_uses_channel(chan)
113
- end
114
-
115
- def pitch_bend(chan, msb, lsb)
116
- pdelta()
117
- puts "pitch bend chan #{chan}, msb #{msb}, lsb #{lsb}"
118
- track_uses_channel(chan)
119
- end
120
-
121
- def program(chan, program)
122
- pdelta()
123
- puts "program chan #{chan}, program #{program}"
124
- track_uses_channel(chan)
125
- end
126
-
127
- def chan_pressure(chan, press)
128
- pdelta()
129
- puts "chan press chan #{chan}, press #{press}"
130
- track_uses_channel(chan)
131
- end
132
-
133
- def sysex(msg)
134
- pdelta()
135
- puts "sysex size #{msg.length}"
136
- end
137
-
138
- def meta_misc(type, msg)
139
- pdelta()
140
- puts "meta misc type #{type}, length #{msg.length}"
141
- end
142
-
143
- def sequencer_specific(type, msg)
144
- pdelta()
145
- puts "sequencer specific type #{type}, msg #{msg.length}"
146
- end
147
-
148
- def sequence_number(num)
149
- pdelta()
150
- puts "sequence number #{num}"
151
- end
152
-
153
- def text(type, msg)
154
- pdelta()
155
- msg = MIDI::MetaEvent.bytes_as_str(msg)
156
- case type
157
- when MIDI::META_SEQ_NAME
158
- puts "seq or track name #{msg}"
159
- when MIDI::META_INSTRUMENT
160
- puts "instrument name #{msg}"
161
- when MIDI::META_MARKER
162
- puts "marker #{msg}"
163
- else
164
- puts "text = #{msg}, type = #{type}"
165
- end
166
- end
167
-
168
- def eot()
169
- pdelta()
170
- puts "end of track event"
171
- end
172
-
173
- def time_signature(numer, denom, clocks, qnotes)
174
- pdelta()
175
- puts "time sig numer #{numer}, denom #{denom}, clocks #{clocks}," +
176
- " qnotes #{qnotes}"
177
- end
178
-
179
- def smpte(hour, min, sec, frame, fract)
180
- pdelta()
181
- puts "smpte #{hour}:#{min}.#{sec}, frame #{frame}, fract #{fract}"
182
- end
183
-
184
- def tempo(microsecs)
185
- pdelta()
186
- bpm = 1.0 / microsecs # quarter notes per microsecond
187
- bpm *= 1000000.0 # quarter notes per second
188
- bpm *= 60.0 # quarter notes per minute
189
- puts "tempo microsecs pqn = #{microsecs} (#{bpm} bpm)"
190
- end
191
-
192
- def key_signature(sharpflat, is_minor)
193
- pdelta()
194
- puts "key sig sharpflat #{sharpflat}, is_minor #{is_minor}"
195
- end
196
-
197
- def arbitrary(msg)
198
- pdelta()
199
- puts "arbitrary length = #{msg.length}"
200
- end
201
-
202
- def track_uses_channel(chan)
203
- @chan_mask = @chan_mask | (1 << chan)
204
- end
24
+ def initialize(seq, proc = nil)
25
+ super()
26
+ @seq = seq
27
+ @track = nil
28
+ @update_block = block_given?() ? Proc.new() : proc
29
+ end
30
+
31
+ # Generate a unique number for a channel/note combination. This is used
32
+ # to remember pending note on events.
33
+ def note_hash(chan, note)
34
+ return (chan << 8) + note
35
+ end
36
+
37
+ # Print a delta time.
38
+ def pdelta
39
+ print "#{@curr_ticks}: "
40
+ end
41
+
42
+ # The remaining methods are overrides of methods in MIDI::IO::MIDIFile.
43
+
44
+ def header(format, ntrks, division)
45
+ puts "header: format = #{format}, ntrks = #{ntrks}," +
46
+ " division = #{division}"
47
+
48
+ @ntrks = ntrks
49
+ @update_block.call(nil, @ntrks, 0) if @update_block
50
+ end
51
+
52
+ def start_track()
53
+ pdelta()
54
+ puts "track start"
55
+
56
+ @pending = []
57
+ @chan_mask = 0
58
+ end
59
+
60
+ def end_track()
61
+ pdelta()
62
+ puts "track end; chans used bitmask = #{@chan_mask}"
63
+ # Write message for any pending note on messages
64
+ @pending.each_with_index do |num, chan|
65
+ puts "pending note off missing for chan #{num >> 8}," +
66
+ " note #{num & 0xff}" if note_obj
67
+ end
68
+ @pending = nil
69
+
70
+ # call update block
71
+ @update_block.call(@track, @ntrks, @seq.tracks.length) if @update_block
72
+ end
73
+
74
+ def note_on(chan, note, vel)
75
+ pdelta()
76
+ if vel == 0
77
+ print "(note on, vel 0) "
78
+ note_off(chan, note, 64)
79
+ return
80
+ end
81
+
82
+ puts "note on chan #{chan}, note #{note}, vel #{vel}"
83
+ @pending << note_hash(chan, note)
84
+ track_uses_channel(chan)
85
+ end
86
+
87
+ def note_off(chan, note, vel)
88
+ pdelta()
89
+ # Find note on, create note off, connect the two, and remove
90
+ # note on from pending list.
91
+ pnum = note_hash(chan, note)
92
+ @pending.each_with_index do |num, i|
93
+ if pnum == num
94
+ puts "note off chan #{chan}, note #{note}, vel #{vel}"
95
+ @pending.delete_at(i)
96
+ return
97
+ end
98
+ end
99
+ puts "note off with no earlier note on (ch #{chan}, note" +
100
+ " #{note}, vel #{vel})"
101
+ end
102
+
103
+ def pressure(chan, note, press)
104
+ pdelta()
105
+ puts "pressure chan #{chan}, note #{note}, press #{press}"
106
+ track_uses_channel(chan)
107
+ end
108
+
109
+ def controller(chan, control, value)
110
+ pdelta()
111
+ puts "controller chan #{chan}, control #{control}, value #{value}"
112
+ track_uses_channel(chan)
113
+ end
114
+
115
+ def pitch_bend(chan, msb, lsb)
116
+ pdelta()
117
+ puts "pitch bend chan #{chan}, msb #{msb}, lsb #{lsb}"
118
+ track_uses_channel(chan)
119
+ end
120
+
121
+ def program(chan, program)
122
+ pdelta()
123
+ puts "program chan #{chan}, program #{program}"
124
+ track_uses_channel(chan)
125
+ end
126
+
127
+ def chan_pressure(chan, press)
128
+ pdelta()
129
+ puts "chan press chan #{chan}, press #{press}"
130
+ track_uses_channel(chan)
131
+ end
132
+
133
+ def sysex(msg)
134
+ pdelta()
135
+ puts "sysex size #{msg.length}"
136
+ end
137
+
138
+ def meta_misc(type, msg)
139
+ pdelta()
140
+ puts "meta misc type #{type}, length #{msg.length}"
141
+ end
142
+
143
+ def sequencer_specific(type, msg)
144
+ pdelta()
145
+ puts "sequencer specific type #{type}, msg #{msg.length}"
146
+ end
147
+
148
+ def sequence_number(num)
149
+ pdelta()
150
+ puts "sequence number #{num}"
151
+ end
152
+
153
+ def text(type, msg)
154
+ pdelta()
155
+ msg = MIDI::MetaEvent.bytes_as_str(msg)
156
+ case type
157
+ when MIDI::META_SEQ_NAME
158
+ puts "seq or track name #{msg}"
159
+ when MIDI::META_INSTRUMENT
160
+ puts "instrument name #{msg}"
161
+ when MIDI::META_MARKER
162
+ puts "marker #{msg}"
163
+ else
164
+ puts "text = #{msg}, type = #{type}"
165
+ end
166
+ end
167
+
168
+ def eot()
169
+ pdelta()
170
+ puts "end of track event"
171
+ end
172
+
173
+ def time_signature(numer, denom, clocks, qnotes)
174
+ pdelta()
175
+ puts "time sig numer #{numer}, denom #{denom}, clocks #{clocks}," +
176
+ " qnotes #{qnotes}"
177
+ end
178
+
179
+ def smpte(hour, min, sec, frame, fract)
180
+ pdelta()
181
+ puts "smpte #{hour}:#{min}.#{sec}, frame #{frame}, fract #{fract}"
182
+ end
183
+
184
+ def tempo(microsecs)
185
+ pdelta()
186
+ bpm = 1.0 / microsecs # quarter notes per microsecond
187
+ bpm *= 1000000.0 # quarter notes per second
188
+ bpm *= 60.0 # quarter notes per minute
189
+ puts "tempo microsecs pqn = #{microsecs} (#{bpm} bpm)"
190
+ end
191
+
192
+ def key_signature(sharpflat, is_minor)
193
+ pdelta()
194
+ puts "key sig sharpflat #{sharpflat}, is_minor #{is_minor}"
195
+ end
196
+
197
+ def arbitrary(msg)
198
+ pdelta()
199
+ puts "arbitrary length = #{msg.length}"
200
+ end
201
+
202
+ def track_uses_channel(chan)
203
+ @chan_mask = @chan_mask | (1 << chan)
204
+ end
205
205
 
206
206
  end
207
207
 
@@ -212,10 +212,10 @@ seq = MIDI::Sequence.new()
212
212
  # Specify what class to use when reading the MIDI file.
213
213
  seq.reader_class = TextTranslator
214
214
 
215
- File.open(ARGV[0] || DEFAULT_MIDI_TEST_FILE, 'rb') { | file |
216
- # The block we pass in to Sequence.read is called at the end of every
217
- # track read. It is optional, but is useful for progress reports.
218
- seq.read(file) { | track, num_tracks, i |
219
- puts "read track #{track ? track.name : ''} (#{i} of #{num_tracks})"
220
- }
221
- }
215
+ File.open(ARGV[0] || DEFAULT_MIDI_TEST_FILE, 'rb') do | file |
216
+ # The block we pass in to Sequence.read is called at the end of every
217
+ # track read. It is optional, but is useful for progress reports.
218
+ seq.read(file) do |track, num_tracks, i|
219
+ puts "read track #{track ? track.name : ''} (#{i} of #{num_tracks})"
220
+ end
221
+ end