midilib 2.0.5 → 3.0.1

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,39 @@
1
+ # This code was originally taken from
2
+ # http://github.com/adamjmurray/cosy/blob/master/lib/cosy/helper/midi_file_renderer_helper.rb
3
+ # with permission from Adam Murray, who originally suggested this fix.
4
+ # See http://wiki.github.com/adamjmurray/cosy/midilib-notes for details.
5
+
6
+ # A stable sorting algorithm that maintains the relative order of equal
7
+ # elements.
8
+ #
9
+ # This code used to be in a new subclass of Array, but that started causing
10
+ # problems in Ruby 3.0, apparently due to the return type of the `[]`
11
+ # operator which was the parent Array class.
12
+ #
13
+ # This code borrowed from 'Moser' http://codesnippets.joyent.com/posts/show/1699
14
+ def mergesort(arr, &cmp)
15
+ cmp = ->(a, b) { a <=> b } if cmp.nil?
16
+ if arr.size <= 1
17
+ arr.dup
18
+ else
19
+ halves = mergesort_split(arr).map { |half| mergesort(half, &cmp) }
20
+ mergesort_merge(*halves, &cmp)
21
+ end
22
+ end
23
+
24
+ def mergesort_split(arr)
25
+ n = (arr.length / 2).floor - 1
26
+ [arr[0..n], arr[n + 1..-1]]
27
+ end
28
+
29
+ def mergesort_merge(first, second, &predicate)
30
+ result = []
31
+ until first.empty? || second.empty?
32
+ result << if predicate.call(first.first, second.first) <= 0
33
+ first.shift
34
+ else
35
+ second.shift
36
+ end
37
+ end
38
+ result.concat(first).concat(second)
39
+ end
@@ -1,12 +1,10 @@
1
- require 'midilib/io/seqreader'
2
- require 'midilib/io/seqwriter'
3
- require 'midilib/measure.rb'
1
+ require_relative 'io/seqreader'
2
+ require_relative 'io/seqwriter'
3
+ require_relative 'measure'
4
4
 
5
5
  module MIDI
6
-
7
6
  # A MIDI::Sequence contains MIDI::Track objects.
8
7
  class Sequence
9
-
10
8
  include Enumerable
11
9
 
12
10
  UNNAMED = 'Unnamed Sequence'
@@ -43,13 +41,13 @@ module MIDI
43
41
  attr_accessor :writer_class
44
42
 
45
43
  def initialize
46
- @tracks = Array.new()
44
+ @tracks = []
47
45
  @ppqn = 480
48
46
 
49
47
  # Time signature
50
- @numer = 4 # Numer + denom = 4/4 time default
48
+ @numer = 4 # Numer + denom = 4/4 time default
51
49
  @denom = 2
52
- @clocks = 24 # Bug fix Nov 11, 2007 - this is not the same as ppqn!
50
+ @clocks = 24 # Bug fix Nov 11, 2007 - this is not the same as ppqn!
53
51
  @qnotes = 8
54
52
 
55
53
  @reader_class = IO::SeqReader
@@ -67,24 +65,25 @@ module MIDI
67
65
  # Returns the song tempo in beats per minute.
68
66
  def beats_per_minute
69
67
  return DEFAULT_TEMPO if @tracks.nil? || @tracks.empty?
70
- event = @tracks.first.events.detect { |e| e.kind_of?(MIDI::Tempo) }
71
- return event ? (Tempo.mpq_to_bpm(event.tempo)) : DEFAULT_TEMPO
68
+
69
+ event = @tracks.first.events.detect { |e| e.is_a?(MIDI::Tempo) }
70
+ event ? Tempo.mpq_to_bpm(event.tempo) : DEFAULT_TEMPO
72
71
  end
73
- alias_method :bpm, :beats_per_minute
74
- alias_method :tempo, :beats_per_minute
72
+ alias bpm beats_per_minute
73
+ alias tempo beats_per_minute
75
74
 
76
75
  # Pulses (also called ticks) are the units of delta times and event
77
76
  # time_from_start values. This method converts a number of pulses to a
78
77
  # float value that is a time in seconds.
79
78
  def pulses_to_seconds(pulses)
80
- (pulses.to_f / @ppqn.to_f / beats_per_minute()) * 60.0
79
+ (pulses.to_f / @ppqn.to_f / beats_per_minute) * 60.0
81
80
  end
82
81
 
83
82
  # Given a note length name like "whole", "dotted quarter", or "8th
84
83
  # triplet", return the length of that note in quarter notes as a delta
85
84
  # time.
86
85
  def note_to_delta(name)
87
- return length_to_delta(note_to_length(name))
86
+ length_to_delta(note_to_length(name))
88
87
  end
89
88
 
90
89
  # Given a note length name like "whole", "dotted quarter", or "8th
@@ -99,55 +98,61 @@ module MIDI
99
98
  def note_to_length(name)
100
99
  name.strip!
101
100
  name =~ /^(dotted)?(.*?)(triplet)?$/
102
- dotted, note_name, triplet = $1, $2, $3
101
+ dotted = Regexp.last_match(1)
102
+ note_name = Regexp.last_match(2)
103
+ triplet = Regexp.last_match(3)
103
104
  note_name.strip!
104
105
  mult = 1.0
105
106
  mult = 1.5 if dotted
106
107
  mult /= 3.0 if triplet
107
108
  len = NOTE_TO_LENGTH[note_name]
108
109
  raise "Sequence.note_to_length: \"#{note_name}\" not understood in \"#{name}\"" unless len
109
- return len * mult
110
+
111
+ len * mult
110
112
  end
111
113
 
112
114
  # Translates +length+ (a multiple of a quarter note) into a delta time.
113
115
  # For example, 1 is a quarter note, 1.0/32.0 is a 32nd note, 1.5 is a
114
116
  # dotted quarter, etc. Be aware when using division; 1/32 is zero due to
115
117
  # integer mathematics and rounding. Use floating-point numbers like 1.0
116
- # and 32.0. This method always returns an integer.
118
+ # and 32.0. This method always returns an integer by calling `.round` on
119
+ # the floating-point result.
117
120
  #
118
121
  # See also note_to_delta and note_to_length.
119
122
  def length_to_delta(length)
120
- return (@ppqn * length).to_i
123
+ (@ppqn * length).round
121
124
  end
122
125
 
123
126
  # Returns the name of the first track (track zero). If there are no
124
127
  # tracks, returns UNNAMED.
125
128
  def name
126
129
  return UNNAMED if @tracks.empty?
127
- return @tracks.first.name()
130
+
131
+ @tracks.first.name
128
132
  end
129
133
 
130
134
  # Hands the name to the first track. Does nothing if there are no tracks.
131
135
  def name=(name)
132
136
  return if @tracks.empty?
137
+
133
138
  @tracks.first.name = name
134
139
  end
135
140
 
136
141
  # Reads a MIDI stream.
137
- def read(io, proc = nil) # :yields: track, num_tracks, index
138
- reader = @reader_class.new(self, block_given?() ? Proc.new() : proc)
142
+ def read(io, &block) # :yields: track, num_tracks, index
143
+ reader = @reader_class.new(self, &block)
139
144
  reader.read_from(io)
140
145
  end
141
146
 
142
- # Writes to a MIDI stream.
143
- def write(io, proc = nil) # :yields: track, num_tracks, index
144
- writer = @writer_class.new(self, block_given?() ? Proc.new() : proc)
147
+ # Writes to a MIDI stream. +midi_format+ defaults to 1.
148
+ def write(io, midi_format = 1, &block) # :yields: track, num_tracks, index
149
+ writer = @writer_class.new(self, midi_format, &block)
145
150
  writer.write_to(io)
146
151
  end
147
152
 
148
153
  # Iterates over the tracks.
149
- def each # :yields: track
150
- @tracks.each { |track| yield track }
154
+ def each(&block) # :yields: track
155
+ @tracks.each(&block)
151
156
  end
152
157
 
153
158
  # Returns a Measures object, which is an array container for all measures
@@ -156,13 +161,13 @@ module MIDI
156
161
  # Collect time sig events and scan for last event time
157
162
  time_sigs = []
158
163
  max_pos = 0
159
- @tracks.each do |t|
164
+ @tracks.each do |t|
160
165
  t.each do |e|
161
- time_sigs << e if e.kind_of?(MIDI::TimeSig)
166
+ time_sigs << e if e.is_a?(MIDI::TimeSig)
162
167
  max_pos = e.time_from_start if e.time_from_start > max_pos
163
168
  end
164
169
  end
165
- time_sigs.sort { |x,y| x.time_from_start <=> y.time_from_start }
170
+ time_sigs.sort { |x, y| x.time_from_start <=> y.time_from_start }
166
171
 
167
172
  # Add a "fake" time sig event at the very last position of the sequence,
168
173
  # just to make sure the whole sequence is calculated.
@@ -172,7 +177,9 @@ module MIDI
172
177
 
173
178
  # Default to 4/4
174
179
  measure_length = @ppqn * 4
175
- oldnumer, olddenom, oldbeats = 4, 2, 24
180
+ oldnumer = 4
181
+ olddenom = 2
182
+ oldbeats = 24
176
183
 
177
184
  measures = MIDI::Measures.new(max_pos, @ppqn)
178
185
  curr_pos = 0
@@ -186,11 +193,12 @@ module MIDI
186
193
  curr_meas_no += 1
187
194
  curr_pos += measure_length
188
195
  end
189
- oldnumer, olddenom, oldbeats = te.numerator, te.denominator, te.metronome_ticks
196
+ oldnumer = te.numerator
197
+ olddenom = te.denominator
198
+ oldbeats = te.metronome_ticks
190
199
  measure_length = te.measure_duration(@ppqn)
191
200
  end
192
201
  measures
193
202
  end
194
-
195
203
  end
196
204
  end
data/lib/midilib/track.rb CHANGED
@@ -1,47 +1,7 @@
1
- require 'midilib/event'
1
+ require_relative 'event'
2
+ require_relative 'mergesort'
2
3
 
3
4
  module MIDI
4
-
5
- # This is taken from
6
- # http://github.com/adamjmurray/cosy/blob/master/lib/cosy/helper/midi_file_renderer_helper.rb
7
- # with permission from Adam Murray, who originally suggested this fix.
8
- # See http://wiki.github.com/adamjmurray/cosy/midilib-notes for details.
9
- # First we need to add some API infrastructure:
10
- class MIDI::Array < ::Array
11
- # This code borrowed from 'Moser' http://codesnippets.joyent.com/posts/show/1699
12
-
13
- # A stable sorting algorithm that maintains the relative order of equal elements
14
- def mergesort(&cmp)
15
- if cmp == nil
16
- cmp = lambda { |a, b| a <=> b }
17
- end
18
- if size <= 1
19
- self.dup
20
- else
21
- halves = split.map { |half| half.mergesort(&cmp) }
22
- merge(*halves, &cmp)
23
- end
24
- end
25
-
26
- protected
27
- def split
28
- n = (length / 2).floor - 1
29
- [self[0..n], self[n+1..-1]]
30
- end
31
-
32
- def merge(first, second, &predicate)
33
- result = []
34
- until first.empty? || second.empty?
35
- if predicate.call(first.first, second.first) <= 0
36
- result << first.shift
37
- else
38
- result << second.shift
39
- end
40
- end
41
- result.concat(first).concat(second)
42
- end
43
- end
44
-
45
5
  # A Track is a list of events.
46
6
  #
47
7
  # When you modify the +events+ array, make sure to call recalc_times so
@@ -52,7 +12,6 @@ module MIDI
52
12
  # IO::SeqReader but is _not_ kept up to date by any other methods.
53
13
 
54
14
  class Track
55
-
56
15
  include Enumerable
57
16
 
58
17
  UNNAMED = 'Unnamed'
@@ -62,22 +21,23 @@ module MIDI
62
21
 
63
22
  def initialize(sequence)
64
23
  @sequence = sequence
65
- @events = Array.new()
24
+ @events = []
66
25
 
67
26
  # Bitmask of all channels used. Set when track is read in from
68
27
  # a MIDI file.
69
28
  @channels_used = 0
29
+ @instrument = nil
70
30
  end
71
31
 
72
32
  # Return track name. If there is no name, return UNNAMED.
73
33
  def name
74
- event = @events.detect { |e| e.kind_of?(MetaEvent) && e.meta_type == META_SEQ_NAME }
34
+ event = @events.detect { |e| e.is_a?(MetaEvent) && e.meta_type == META_SEQ_NAME }
75
35
  event ? event.data_as_str : UNNAMED
76
36
  end
77
37
 
78
38
  # Set track name. Replaces or creates a name meta-event.
79
39
  def name=(name)
80
- event = @events.detect { |e| e.kind_of?(MetaEvent) && e.meta_type == META_SEQ_NAME }
40
+ event = @events.detect { |e| e.is_a?(MetaEvent) && e.meta_type == META_SEQ_NAME }
81
41
  if event
82
42
  event.data = name
83
43
  else
@@ -112,7 +72,7 @@ module MIDI
112
72
  recalc_times(0, list2)
113
73
  list = list1 + list2
114
74
  recalc_delta_from_times(0, list)
115
- return list
75
+ list
116
76
  end
117
77
 
118
78
  # Quantize every event. length_or_note is either a length (1 = quarter,
@@ -134,9 +94,9 @@ module MIDI
134
94
 
135
95
  # Recalculate start times for all events in +list+ from starting_at to
136
96
  # end.
137
- def recalc_times(starting_at=0, list=@events)
138
- t = (starting_at == 0) ? 0 : list[starting_at - 1].time_from_start
139
- list[starting_at .. -1].each do |e|
97
+ def recalc_times(starting_at = 0, list = @events)
98
+ t = starting_at == 0 ? 0 : list[starting_at - 1].time_from_start
99
+ list[starting_at..-1].each do |e|
140
100
  t += e.delta_time
141
101
  e.time_from_start = t
142
102
  end
@@ -146,24 +106,24 @@ module MIDI
146
106
  # from each event's time_from_start. This is useful, for example, when
147
107
  # merging two event lists. As a side-effect, elements from starting_at
148
108
  # are sorted by time_from_start.
149
- def recalc_delta_from_times(starting_at=0, list=@events)
109
+ def recalc_delta_from_times(starting_at = 0, list = @events)
150
110
  prev_time_from_start = 0
151
111
  # We need to sort the sublist. sublist.sort! does not do what we want.
152
112
  # We call mergesort instead of Array.sort because sort is not stable
153
113
  # (it can mix up the order of events that have the same start time).
154
114
  # See http://wiki.github.com/adamjmurray/cosy/midilib-notes for details.
155
- list[starting_at .. -1] = MIDI::Array.new(list[starting_at .. -1]).mergesort do |e1, e2|
115
+ list[starting_at..-1] = mergesort(list[starting_at..-1]) do |e1, e2|
156
116
  e1.time_from_start <=> e2.time_from_start
157
117
  end
158
- list[starting_at .. -1].each do |e|
118
+ list[starting_at..-1].each do |e|
159
119
  e.delta_time = e.time_from_start - prev_time_from_start
160
120
  prev_time_from_start = e.time_from_start
161
121
  end
162
122
  end
163
123
 
164
124
  # Iterate over events.
165
- def each # :yields: event
166
- @events.each { |event| yield event }
125
+ def each(&block) # :yields: event
126
+ @events.each(&block)
167
127
  end
168
128
 
169
129
  # Sort events by their time_from_start. After sorting,
@@ -173,7 +133,6 @@ module MIDI
173
133
  # Note: this method is redundant, since recalc_delta_from_times sorts
174
134
  # the events first. This method may go away in a future release, or at
175
135
  # least be aliased to recalc_delta_from_times.
176
- alias_method :sort, :recalc_delta_from_times
136
+ alias sort recalc_delta_from_times
177
137
  end
178
-
179
138
  end
data/lib/midilib/utils.rb CHANGED
@@ -1,18 +1,16 @@
1
1
  module MIDI
2
-
3
2
  # Utility methods.
4
3
  class Utils
5
-
6
4
  # MIDI note names. NOTE_NAMES[0] is 'C', NOTE_NAMES[1] is 'C#', etc.
7
5
  NOTE_NAMES = [
8
6
  'C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B'
9
7
  ]
10
8
 
11
9
  # Given a MIDI note number, return the name and octave as a string.
12
- def Utils.note_to_s(num)
10
+ def self.note_to_s(num)
13
11
  note = num % 12
14
12
  octave = num / 12
15
- return "#{NOTE_NAMES[note]}#{octave - 1}"
13
+ "#{NOTE_NAMES[note]}#{octave - 1}"
16
14
  end
17
15
 
18
16
  # Given an integer, returns it as a variable length array of bytes (the
@@ -21,7 +19,7 @@ module MIDI
21
19
  # The converse operation--converting a var len into a number--requires
22
20
  # input from a stream of bytes. Therefore we don't supply it here. That is
23
21
  # a part of the MIDIFile class.
24
- def Utils.as_var_len(val)
22
+ def self.as_var_len(val)
25
23
  buffer = []
26
24
  buffer << (val & 0x7f)
27
25
  val = (val >> 7)
@@ -29,8 +27,7 @@ module MIDI
29
27
  buffer << (0x80 + (val & 0x7f))
30
28
  val = (val >> 7)
31
29
  end
32
- return buffer.reverse!
30
+ buffer.reverse!
33
31
  end
34
-
35
32
  end
36
33
  end
data/lib/midilib.rb CHANGED
@@ -5,11 +5,11 @@
5
5
  #
6
6
  # See the README.rdoc file or http://midilib.rubyforge.org for details.
7
7
 
8
- require 'midilib/info'
9
- require 'midilib/sequence'
10
- require 'midilib/track'
11
- require 'midilib/io/seqreader'
12
- require 'midilib/io/seqwriter'
8
+ require_relative 'midilib/info'
9
+ require_relative 'midilib/sequence'
10
+ require_relative 'midilib/track'
11
+ require_relative 'midilib/io/seqreader'
12
+ require_relative 'midilib/io/seqwriter'
13
13
 
14
14
  # --
15
15
  # consts.rb, utils.rb, and event.rb are included by these files.
@@ -5,77 +5,75 @@
5
5
  # classes. If someone disagrees, it would be trivial to move them there.
6
6
 
7
7
  module MIDI
8
-
9
8
  class Event
10
- def ==(an_obj)
11
- return an_obj.instance_of?(self.class) &&
12
- @status == an_obj.status &&
13
- @delta_time == an_obj.delta_time &&
14
- @time_from_start == an_obj.time_from_start
9
+ def ==(other)
10
+ other.instance_of?(self.class) &&
11
+ @status == other.status &&
12
+ @delta_time == other.delta_time &&
13
+ @time_from_start == other.time_from_start
15
14
  end
16
15
  end
17
16
 
18
17
  class ChannelEvent
19
- def ==(an_obj)
20
- return super(an_obj) && @channel == an_obj.channel
18
+ def ==(other)
19
+ super(other) && @channel == other.channel
21
20
  end
22
21
  end
23
22
 
24
23
  class NoteEvent < ChannelEvent
25
- def ==(an_obj)
26
- return super(an_obj) &&
27
- @note == an_obj.note && @velocity == an_obj.velocity
24
+ def ==(other)
25
+ super(other) &&
26
+ @note == other.note && @velocity == other.velocity
28
27
  end
29
28
  end
30
29
 
31
30
  class Controller < ChannelEvent
32
- def ==(an_obj)
33
- return super(an_obj) &&
34
- @controller == an_obj.controller && @value == an_obj.value
31
+ def ==(other)
32
+ super(other) &&
33
+ @controller == other.controller && @value == other.value
35
34
  end
36
35
  end
37
36
 
38
37
  class ProgramChange < ChannelEvent
39
- def ==(an_obj)
40
- return super(an_obj) && @program == an_obj.program
38
+ def ==(other)
39
+ super(other) && @program == other.program
41
40
  end
42
41
  end
43
42
 
44
43
  class ChannelPressure < ChannelEvent
45
- def ==(an_obj)
46
- return super(an_obj) && @pressure == an_obj.pressure
44
+ def ==(other)
45
+ super(other) && @pressure == other.pressure
47
46
  end
48
47
  end
49
48
 
50
49
  class PitchBend < ChannelEvent
51
- def ==(an_obj)
52
- return super(an_obj) && @value == an_obj.value
50
+ def ==(other)
51
+ super(other) && @value == other.value
53
52
  end
54
53
  end
55
54
 
56
55
  class SystemExclusive < SystemCommon
57
- def ==(an_obj)
58
- return super(an_obj) && @data == an_obj.data
56
+ def ==(other)
57
+ super(other) && @data == other.data
59
58
  end
60
59
  end
61
60
 
62
61
  class SongPointer < SystemCommon
63
- def ==(an_obj)
64
- return super(an_obj) && @pointer == an_obj.pointer
62
+ def ==(other)
63
+ super(other) && @pointer == other.pointer
65
64
  end
66
65
  end
67
66
 
68
67
  class SongSelect < SystemCommon
69
- def ==(an_obj)
70
- return super(an_obj) && @song == an_obj.song
68
+ def ==(other)
69
+ super(other) && @song == other.song
71
70
  end
72
71
  end
73
72
 
74
73
  class MetaEvent < Event
75
- def ==(an_obj)
76
- return super(an_obj) && @meta_type == an_obj.meta_type &&
77
- @data == an_obj.data
74
+ def ==(other)
75
+ super(other) && @meta_type == other.meta_type &&
76
+ @data == other.data
78
77
  end
79
78
  end
80
-
81
79
  end
data/test/test_event.rb CHANGED
@@ -7,7 +7,6 @@ require 'test/unit'
7
7
  require 'midilib'
8
8
 
9
9
  class EventTester < Test::Unit::TestCase
10
-
11
10
  def test_note_on
12
11
  e = MIDI::NoteOn.new
13
12
  assert_equal(MIDI::NOTE_ON, e.status)
@@ -20,25 +19,25 @@ class EventTester < Test::Unit::TestCase
20
19
 
21
20
  def test_to_s
22
21
  e = MIDI::NoteOn.new
23
- assert_equal("0: ch 00 on 40 40", e.to_s)
22
+ assert_equal('0: ch 00 on 40 40', e.to_s)
24
23
  e.print_decimal_numbers = true
25
- assert_equal("0: ch 0 on 64 64", e.to_s)
24
+ assert_equal('0: ch 0 on 64 64', e.to_s)
26
25
  e.print_note_names = true
27
- assert_equal("0: ch 0 on E4 64", e.to_s)
26
+ assert_equal('0: ch 0 on E4 64', e.to_s)
28
27
  e.print_decimal_numbers = false
29
- assert_equal("0: ch 00 on E4 40", e.to_s)
28
+ assert_equal('0: ch 00 on E4 40', e.to_s)
30
29
  end
31
30
 
32
31
  def test_pitch_bend
33
32
  e = MIDI::PitchBend.new(0, 128)
34
33
  b = e.data_as_bytes
35
- assert_equal(0, b[1]) # lsb, 7 bits
36
- assert_equal(1, b[2]) # msb, 7 bits
34
+ assert_equal(0, b[1]) # lsb, 7 bits
35
+ assert_equal(1, b[2]) # msb, 7 bits
37
36
 
38
37
  e.value = (3 << 7) + 42
39
38
  b = e.data_as_bytes
40
- assert_equal(42, b[1]) # lsb, 7 bits
41
- assert_equal(3, b[2]) # msb, 7 bits
39
+ assert_equal(42, b[1]) # lsb, 7 bits
40
+ assert_equal(3, b[2]) # msb, 7 bits
42
41
  end
43
42
 
44
43
  def test_quantize_1
@@ -58,7 +57,7 @@ class EventTester < Test::Unit::TestCase
58
57
 
59
58
  # Test with quantize_to(6)
60
59
  [0, 0, 0, 6, 6, 6, 6, 6, 6, 12, 12, 12, 12, 12, 12,
61
- 18, 18, 18, 18, 18, 18, 24].each_with_index do |after, before|
60
+ 18, 18, 18, 18, 18, 18, 24].each_with_index do |after, before|
62
61
  e.time_from_start = before
63
62
  e.quantize_to(6)
64
63
  assert_equal(after, e.time_from_start)
@@ -131,5 +130,4 @@ class EventTester < Test::Unit::TestCase
131
130
  assert_equal('foobar', e.data_as_str)
132
131
  assert_equal(foobar_as_array, e.data)
133
132
  end
134
-
135
133
  end