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
@@ -3,8 +3,9 @@ require 'midilib/utils'
3
3
 
4
4
  module MIDI
5
5
 
6
- # The abstract superclass of all MIDI events.
7
- class Event
6
+ # The abstract superclass of all MIDI events.
7
+ class Event
8
+
8
9
  # Modifying delta_time does not affect time_from_start. You need to call
9
10
  # the event's track's +recalc_time+ method.
10
11
  attr_accessor :delta_time
@@ -28,9 +29,9 @@ class Event
28
29
  attr_accessor :print_channel_numbers_from_one
29
30
 
30
31
  def initialize(status = 0, delta_time = 0)
31
- @status = status
32
- @delta_time = delta_time
33
- @time_from_start = 0 # maintained by tracks
32
+ @status = status
33
+ @delta_time = delta_time
34
+ @time_from_start = 0 # maintained by tracks
34
35
  end
35
36
  protected :initialize
36
37
 
@@ -38,7 +39,7 @@ class Event
38
39
  # MIDI stream. In MIDI::EVENT this raises a "subclass responsibility"
39
40
  # exception.
40
41
  def data_as_bytes
41
- raise "subclass responsibility"
42
+ raise "subclass responsibility"
42
43
  end
43
44
 
44
45
  # Quantize this event's time_from_start by moving it to the nearest
@@ -46,64 +47,64 @@ class Event
46
47
  # modify the event's delta_time, though MIDI::Track#quantize calls
47
48
  # recalc_delta_from_times after it asks each event to quantize itself.
48
49
  def quantize_to(boundary)
49
- diff = @time_from_start % boundary
50
- @time_from_start -= diff
51
- if diff >= boundary / 2
52
- @time_from_start += boundary
53
- end
50
+ diff = @time_from_start % boundary
51
+ @time_from_start -= diff
52
+ if diff >= boundary / 2
53
+ @time_from_start += boundary
54
+ end
54
55
  end
55
56
 
56
57
  # For sorting. Uses @time_from_start, which is maintained by this event's
57
58
  # track. I'm not sure this is necessary, since each track has to
58
59
  # maintain its events' time-from-start values anyway.
59
60
  def <=>(an_event)
60
- return @time_from_start <=> an_event.time_from_start
61
+ return @time_from_start <=> an_event.time_from_start
61
62
  end
62
63
 
63
64
  # Returns +val+ as a decimal or hex string, depending upon the value of
64
65
  # @print_decimal_numbers.
65
66
  def number_to_s(val)
66
- return @print_decimal_numbers ? val.to_s : ('%02x' % val)
67
+ return @print_decimal_numbers ? val.to_s : ('%02x' % val)
67
68
  end
68
69
 
69
70
  # Returns +val+ as a decimal or hex string, depending upon the value of
70
71
  # @print_decimal_numbers.
71
72
  def channel_to_s(val)
72
- val += 1 if @print_channel_numbers_from_one
73
- return number_to_s(val)
73
+ val += 1 if @print_channel_numbers_from_one
74
+ return number_to_s(val)
74
75
  end
75
76
 
76
77
  def to_s
77
- "#{@delta_time}: "
78
+ "#{@delta_time}: "
78
79
  end
79
- end
80
+ end
80
81
 
81
- # The abstract superclass of all channel events (events that have a MIDI
82
- # channel, like notes and program changes).
83
- class ChannelEvent < Event
82
+ # The abstract superclass of all channel events (events that have a MIDI
83
+ # channel, like notes and program changes).
84
+ class ChannelEvent < Event
84
85
  # MIDI channel, 0-15.
85
86
  attr_accessor :channel
86
87
 
87
88
  def initialize(status, channel, delta_time)
88
- super(status, delta_time)
89
- @channel = channel
89
+ super(status, delta_time)
90
+ @channel = channel
90
91
  end
91
92
  protected :initialize
92
93
 
93
94
  def to_s
94
- return super << "ch #{channel_to_s(@channel)} "
95
+ return super << "ch #{channel_to_s(@channel)} "
95
96
  end
96
97
 
97
- end
98
+ end
98
99
 
99
- # The abstract superclass of all note on, and note off, and polyphonic
100
- # pressure events.
101
- class NoteEvent < ChannelEvent
100
+ # The abstract superclass of all note on, and note off, and polyphonic
101
+ # pressure events.
102
+ class NoteEvent < ChannelEvent
102
103
  attr_accessor :note, :velocity
103
104
  def initialize(status, channel, note, velocity, delta_time)
104
- super(status, channel, delta_time)
105
- @note = note
106
- @velocity = velocity
105
+ super(status, channel, delta_time)
106
+ @note = note
107
+ @velocity = velocity
107
108
  end
108
109
  protected :initialize
109
110
 
@@ -111,528 +112,528 @@ class NoteEvent < ChannelEvent
111
112
 
112
113
  # Returns note name as a pitch/octave string like "C4" or "F#6".
113
114
  def pch_oct(val=@note)
114
- pch = val % 12
115
- oct = (val / 12) - 1
116
- "#{PITCHES[pch]}#{oct}"
115
+ pch = val % 12
116
+ oct = (val / 12) - 1
117
+ "#{PITCHES[pch]}#{oct}"
117
118
  end
118
119
 
119
120
  # If @print_note_names is true, returns pch_oct(val) else returns value
120
121
  # as a number using number_to_s.
121
122
  def note_to_s
122
- return @print_note_names ? pch_oct(@note) : number_to_s(@note)
123
+ return @print_note_names ? pch_oct(@note) : number_to_s(@note)
123
124
  end
124
125
 
125
126
  def data_as_bytes
126
- data = []
127
- data << (@status + @channel)
128
- data << @note
129
- data << @velocity
127
+ data = []
128
+ data << (@status + @channel)
129
+ data << @note
130
+ data << @velocity
130
131
  end
131
- end
132
+ end
132
133
 
133
- class NoteOn < NoteEvent
134
+ class NoteOn < NoteEvent
134
135
  attr_accessor :off
135
136
  def initialize(channel = 0, note = 64, velocity = 64, delta_time = 0)
136
- super(NOTE_ON, channel, note, velocity, delta_time)
137
+ super(NOTE_ON, channel, note, velocity, delta_time)
137
138
  end
138
139
 
139
140
  def to_s
140
- return super <<
141
- "on #{note_to_s} #{number_to_s(@velocity)}"
141
+ return super <<
142
+ "on #{note_to_s} #{number_to_s(@velocity)}"
142
143
  end
143
- end
144
+ end
144
145
 
145
- # Old class name for compatability
146
- NoteOnEvent = NoteOn
146
+ # Old class name for compatability
147
+ NoteOnEvent = NoteOn
147
148
 
148
- class NoteOff < NoteEvent
149
+ class NoteOff < NoteEvent
149
150
  attr_accessor :on
150
151
  def initialize(channel = 0, note = 64, velocity = 64, delta_time = 0)
151
- super(NOTE_OFF, channel, note, velocity, delta_time)
152
+ super(NOTE_OFF, channel, note, velocity, delta_time)
152
153
  end
153
154
 
154
155
  def to_s
155
- return super <<
156
- "off #{note_to_s} #{number_to_s(@velocity)}"
156
+ return super <<
157
+ "off #{note_to_s} #{number_to_s(@velocity)}"
157
158
  end
158
- end
159
+ end
159
160
 
160
- # Old class name for compatability
161
- NoteOffEvent = NoteOff
161
+ # Old class name for compatability
162
+ NoteOffEvent = NoteOff
162
163
 
163
- class PolyPressure < NoteEvent
164
+ class PolyPressure < NoteEvent
164
165
  def initialize(channel = 0, note = 64, value = 0, delta_time = 0)
165
- super(POLY_PRESSURE, channel, note, value, delta_time)
166
+ super(POLY_PRESSURE, channel, note, value, delta_time)
166
167
  end
167
168
 
168
169
  def pressure
169
- return @velocity
170
+ return @velocity
170
171
  end
171
172
  def pressure=(val)
172
- @velocity = val
173
+ @velocity = val
173
174
  end
174
175
  def to_s
175
- return super <<
176
- "poly press #{channel_to_s(@channel)} #{note_to_s} #{number_to_s(@velocity)}"
176
+ return super <<
177
+ "poly press #{channel_to_s(@channel)} #{note_to_s} #{number_to_s(@velocity)}"
177
178
  end
178
- end
179
+ end
179
180
 
180
- class Controller < ChannelEvent
181
+ class Controller < ChannelEvent
181
182
  attr_accessor :controller, :value
182
183
 
183
184
  def initialize(channel = 0, controller = 0, value = 0, delta_time = 0)
184
- super(CONTROLLER, channel, delta_time)
185
- @controller = controller
186
- @value = value
185
+ super(CONTROLLER, channel, delta_time)
186
+ @controller = controller
187
+ @value = value
187
188
  end
188
189
 
189
190
  def data_as_bytes
190
- data = []
191
- data << (@status + @channel)
192
- data << @controller
193
- data << @value
191
+ data = []
192
+ data << (@status + @channel)
193
+ data << @controller
194
+ data << @value
194
195
  end
195
196
 
196
197
  def to_s
197
- return super << "cntl #{number_to_s(@controller)} #{number_to_s(@value)}"
198
+ return super << "cntl #{number_to_s(@controller)} #{number_to_s(@value)}"
198
199
  end
199
- end
200
+ end
200
201
 
201
- class ProgramChange < ChannelEvent
202
+ class ProgramChange < ChannelEvent
202
203
  attr_accessor :program
203
204
 
204
205
  def initialize(channel = 0, program = 0, delta_time = 0)
205
- super(PROGRAM_CHANGE, channel, delta_time)
206
- @program = program
206
+ super(PROGRAM_CHANGE, channel, delta_time)
207
+ @program = program
207
208
  end
208
209
 
209
210
  def data_as_bytes
210
- data = []
211
- data << (@status + @channel)
212
- data << @program
211
+ data = []
212
+ data << (@status + @channel)
213
+ data << @program
213
214
  end
214
215
 
215
216
  def to_s
216
- return super << "prog #{number_to_s(@program)}"
217
+ return super << "prog #{number_to_s(@program)}"
217
218
  end
218
- end
219
+ end
219
220
 
220
- class ChannelPressure < ChannelEvent
221
+ class ChannelPressure < ChannelEvent
221
222
  attr_accessor :pressure
222
223
 
223
224
  def initialize(channel = 0, pressure = 0, delta_time = 0)
224
- super(CHANNEL_PRESSURE, channel, delta_time)
225
- @pressure = pressure
225
+ super(CHANNEL_PRESSURE, channel, delta_time)
226
+ @pressure = pressure
226
227
  end
227
228
 
228
229
  def data_as_bytes
229
- data = []
230
- data << (@status + @channel)
231
- data << @pressure
230
+ data = []
231
+ data << (@status + @channel)
232
+ data << @pressure
232
233
  end
233
234
 
234
235
  def to_s
235
- return super << "chan press #{number_to_s(@pressure)}"
236
+ return super << "chan press #{number_to_s(@pressure)}"
236
237
  end
237
- end
238
+ end
238
239
 
239
- class PitchBend < ChannelEvent
240
+ class PitchBend < ChannelEvent
240
241
  attr_accessor :value
241
242
 
242
243
  def initialize(channel = 0, value = 0, delta_time = 0)
243
- super(PITCH_BEND, channel, delta_time)
244
- @value = value
244
+ super(PITCH_BEND, channel, delta_time)
245
+ @value = value
245
246
  end
246
247
 
247
248
  def data_as_bytes
248
- data = []
249
- data << (@status + @channel)
250
- data << (@value & 0x7f) # lsb
251
- data << ((@value >> 7) & 0x7f) # msb
249
+ data = []
250
+ data << (@status + @channel)
251
+ data << (@value & 0x7f) # lsb
252
+ data << ((@value >> 7) & 0x7f) # msb
252
253
  end
253
254
 
254
255
  def to_s
255
- return super << "pb #{number_to_s(@value)}"
256
+ return super << "pb #{number_to_s(@value)}"
256
257
  end
257
- end
258
+ end
258
259
 
259
- class SystemCommon < Event
260
+ class SystemCommon < Event
260
261
  def initialize(status, delta_time)
261
- super(status, delta_time)
262
+ super(status, delta_time)
262
263
  end
263
- end
264
+ end
264
265
 
265
- class SystemExclusive < SystemCommon
266
+ class SystemExclusive < SystemCommon
266
267
  attr_accessor :data
267
268
 
268
269
  def initialize(data, delta_time = 0)
269
- super(SYSEX, delta_time)
270
- @data = data
270
+ super(SYSEX, delta_time)
271
+ @data = data
271
272
  end
272
273
 
273
274
  def data_as_bytes
274
- data = []
275
- data << @status
276
- data << Utils.as_var_len(@data.length)
277
- data << @data
278
- data << EOX
279
- data.flatten
275
+ data = []
276
+ data << @status
277
+ data << Utils.as_var_len(@data.length)
278
+ data << @data
279
+ data << EOX
280
+ data.flatten
280
281
  end
281
282
 
282
283
  def to_s
283
- return super << "sys ex"
284
+ return super << "sys ex"
284
285
  end
285
- end
286
+ end
286
287
 
287
- class SongPointer < SystemCommon
288
+ class SongPointer < SystemCommon
288
289
  attr_accessor :pointer
289
290
 
290
291
  def initialize(pointer = 0, delta_time = 0)
291
- super(SONG_POINTER, delta_time)
292
- @pointer = pointer
292
+ super(SONG_POINTER, delta_time)
293
+ @pointer = pointer
293
294
  end
294
295
 
295
296
  def data_as_bytes
296
- data = []
297
- data << @status
298
- data << ((@pointer >> 8) & 0xff)
299
- data << (@pointer & 0xff)
297
+ data = []
298
+ data << @status
299
+ data << ((@pointer >> 8) & 0xff)
300
+ data << (@pointer & 0xff)
300
301
  end
301
302
 
302
303
  def to_s
303
- return super << "song ptr #{number_to_s(@pointer)}"
304
+ return super << "song ptr #{number_to_s(@pointer)}"
304
305
  end
305
- end
306
+ end
306
307
 
307
- class SongSelect < SystemCommon
308
+ class SongSelect < SystemCommon
308
309
  attr_accessor :song
309
310
 
310
311
  def initialize(song = 0, delta_time = 0)
311
- super(SONG_SELECT, delta_time)
312
- @song = song
312
+ super(SONG_SELECT, delta_time)
313
+ @song = song
313
314
  end
314
315
 
315
316
  def data_as_bytes
316
- data = []
317
- data << @status
318
- data << @song
317
+ data = []
318
+ data << @status
319
+ data << @song
319
320
  end
320
321
 
321
322
  def to_s
322
- return super << "song sel #{number_to_s(@song)}"
323
+ return super << "song sel #{number_to_s(@song)}"
323
324
  end
324
- end
325
+ end
325
326
 
326
- class TuneRequest < SystemCommon
327
+ class TuneRequest < SystemCommon
327
328
  def initialize(delta_time = 0)
328
- super(TUNE_REQUEST, delta_time)
329
+ super(TUNE_REQUEST, delta_time)
329
330
  end
330
331
 
331
332
  def data_as_bytes
332
- data = []
333
- data << @status
333
+ data = []
334
+ data << @status
334
335
  end
335
336
 
336
337
  def to_s
337
- return super << "tune req"
338
+ return super << "tune req"
338
339
  end
339
- end
340
+ end
340
341
 
341
- class Realtime < Event
342
+ class Realtime < Event
342
343
  def initialize(status, delta_time)
343
- super(status, delta_time)
344
+ super(status, delta_time)
344
345
  end
345
346
 
346
347
  def data_as_bytes
347
- data = []
348
- data << @status
348
+ data = []
349
+ data << @status
349
350
  end
350
351
 
351
352
  def to_s
352
- return super << "realtime #{number_to_s(@status)}"
353
+ return super << "realtime #{number_to_s(@status)}"
353
354
  end
354
- end
355
+ end
355
356
 
356
- class Clock < Realtime
357
+ class Clock < Realtime
357
358
  def initialize(delta_time = 0)
358
- super(CLOCK, delta_time)
359
+ super(CLOCK, delta_time)
359
360
  end
360
361
 
361
362
  def to_s
362
- return super << "clock"
363
+ return super << "clock"
363
364
  end
364
- end
365
+ end
365
366
 
366
- class Start < Realtime
367
+ class Start < Realtime
367
368
  def initialize(delta_time = 0)
368
- super(START, delta_time)
369
+ super(START, delta_time)
369
370
  end
370
371
  def to_s
371
- return super << "start"
372
+ return super << "start"
372
373
  end
373
- end
374
+ end
374
375
 
375
- class Continue < Realtime
376
+ class Continue < Realtime
376
377
  def initialize(delta_time = 0)
377
- super(CONTINUE, delta_time)
378
+ super(CONTINUE, delta_time)
378
379
  end
379
380
  def to_s
380
- return super << "continue"
381
+ return super << "continue"
381
382
  end
382
- end
383
+ end
383
384
 
384
- class Stop < Realtime
385
+ class Stop < Realtime
385
386
  def initialize(delta_time = 0)
386
- super(STOP, delta_time)
387
+ super(STOP, delta_time)
387
388
  end
388
389
  def to_s
389
- return super << "stop"
390
+ return super << "stop"
390
391
  end
391
- end
392
+ end
392
393
 
393
- class ActiveSense < Realtime
394
+ class ActiveSense < Realtime
394
395
  def initialize(delta_time = 0)
395
- super(ACTIVE_SENSE, delta_time)
396
+ super(ACTIVE_SENSE, delta_time)
396
397
  end
397
398
  def to_s
398
- return super << "act sens"
399
+ return super << "act sens"
399
400
  end
400
- end
401
+ end
401
402
 
402
- class SystemReset < Realtime
403
+ class SystemReset < Realtime
403
404
  def initialize(delta_time = 0)
404
- super(SYSTEM_RESET, delta_time)
405
+ super(SYSTEM_RESET, delta_time)
405
406
  end
406
407
  def to_s
407
- return super << "sys reset"
408
+ return super << "sys reset"
408
409
  end
409
- end
410
+ end
410
411
 
411
- class MetaEvent < Event
412
+ class MetaEvent < Event
412
413
  attr_reader :meta_type
413
414
  attr_reader :data
414
415
 
415
416
  def self.bytes_as_str(bytes)
416
- bytes ? bytes.collect { |byte| byte.chr }.join : nil
417
+ bytes ? bytes.collect { |byte| byte.chr }.join : nil
417
418
  end
418
419
 
419
420
  if RUBY_VERSION >= '1.9'
420
- def self.str_as_bytes(str)
421
- str.split(//).collect { |chr| chr.ord }
422
- end
421
+ def self.str_as_bytes(str)
422
+ str.split(//).collect { |chr| chr.ord }
423
+ end
423
424
  else
424
- def self.str_as_bytes(str)
425
- str.split(//).collect { |chr| chr[0] }
426
- end
425
+ def self.str_as_bytes(str)
426
+ str.split(//).collect { |chr| chr[0] }
427
+ end
427
428
  end
428
429
 
429
430
  def initialize(meta_type, data = nil, delta_time = 0)
430
- super(META_EVENT, delta_time)
431
- @meta_type = meta_type
432
- self.data=(data)
431
+ super(META_EVENT, delta_time)
432
+ @meta_type = meta_type
433
+ self.data=(data)
433
434
  end
434
435
 
435
436
  def data_as_bytes
436
- data = []
437
- data << @status
438
- data << @meta_type
439
- data << (@data ? Utils.as_var_len(@data.length) : 0)
440
- data << @data if @data
441
- data.flatten
437
+ data = []
438
+ data << @status
439
+ data << @meta_type
440
+ data << (@data ? Utils.as_var_len(@data.length) : 0)
441
+ data << @data if @data
442
+ data.flatten
442
443
  end
443
444
 
444
445
  def data_as_str
445
- MetaEvent.bytes_as_str(@data)
446
+ MetaEvent.bytes_as_str(@data)
446
447
  end
447
448
 
448
449
  # Stores bytes. If data is a string, splits it into an array of bytes.
449
450
  def data=(data)
450
- case data
451
- when String
452
- @data = MetaEvent.str_as_bytes(data)
453
- else
454
- @data = data
455
- end
451
+ case data
452
+ when String
453
+ @data = MetaEvent.str_as_bytes(data)
454
+ else
455
+ @data = data
456
+ end
456
457
  end
457
458
 
458
459
  def to_s
459
- str = super()
460
- str << "meta #{number_to_s(@meta_type)} "
461
- # I know, I know...this isn't OO.
462
- case @meta_type
463
- when META_SEQ_NUM
464
- str << "sequence number"
465
- when META_TEXT
466
- str << "text: #{data_as_str}"
467
- when META_COPYRIGHT
468
- str << "copyright: #{data_as_str}"
469
- when META_SEQ_NAME
470
- str << "sequence or track name: #{data_as_str}"
471
- when META_INSTRUMENT
472
- str << "instrument name: #{data_as_str}"
473
- when META_LYRIC
474
- str << "lyric: #{data_as_str}"
475
- when META_MARKER
476
- str << "marker: #{data_as_str}"
477
- when META_CUE
478
- str << "cue point: #{@data}"
479
- when META_TRACK_END
480
- str << "track end"
481
- when META_SMPTE
482
- str << "smpte"
483
- when META_TIME_SIG
484
- str << "time signature"
485
- when META_KEY_SIG
486
- str << "key signature"
487
- when META_SEQ_SPECIF
488
- str << "sequence specific"
489
- else
490
- # Some other possible @meta_type values are handled by subclasses.
491
- str << "(other)"
492
- end
493
- return str
494
- end
495
- end
496
-
497
- class Marker < MetaEvent
460
+ str = super()
461
+ str << "meta #{number_to_s(@meta_type)} "
462
+ # I know, I know...this isn't OO.
463
+ case @meta_type
464
+ when META_SEQ_NUM
465
+ str << "sequence number"
466
+ when META_TEXT
467
+ str << "text: #{data_as_str}"
468
+ when META_COPYRIGHT
469
+ str << "copyright: #{data_as_str}"
470
+ when META_SEQ_NAME
471
+ str << "sequence or track name: #{data_as_str}"
472
+ when META_INSTRUMENT
473
+ str << "instrument name: #{data_as_str}"
474
+ when META_LYRIC
475
+ str << "lyric: #{data_as_str}"
476
+ when META_MARKER
477
+ str << "marker: #{data_as_str}"
478
+ when META_CUE
479
+ str << "cue point: #{@data}"
480
+ when META_TRACK_END
481
+ str << "track end"
482
+ when META_SMPTE
483
+ str << "smpte"
484
+ when META_TIME_SIG
485
+ str << "time signature"
486
+ when META_KEY_SIG
487
+ str << "key signature"
488
+ when META_SEQ_SPECIF
489
+ str << "sequence specific"
490
+ else
491
+ # Some other possible @meta_type values are handled by subclasses.
492
+ str << "(other)"
493
+ end
494
+ return str
495
+ end
496
+ end
497
+
498
+ class Marker < MetaEvent
498
499
  def initialize(msg, delta_time = 0)
499
- super(META_MARKER, msg, delta_time)
500
+ super(META_MARKER, msg, delta_time)
500
501
  end
501
- end
502
+ end
502
503
 
503
- class Tempo < MetaEvent
504
+ class Tempo < MetaEvent
504
505
 
505
506
  MICROSECS_PER_MINUTE = 1_000_000 * 60
506
507
 
507
508
  # Translates beats per minute to microseconds per quarter note (beat).
508
509
  def Tempo.bpm_to_mpq(bpm)
509
- return MICROSECS_PER_MINUTE / bpm
510
+ return MICROSECS_PER_MINUTE / bpm
510
511
  end
511
512
 
512
513
  # Translates microseconds per quarter note (beat) to beats per minute.
513
514
  def Tempo.mpq_to_bpm(mpq)
514
- return MICROSECS_PER_MINUTE.to_f / mpq.to_f
515
+ return MICROSECS_PER_MINUTE.to_f / mpq.to_f
515
516
  end
516
517
 
517
518
  def initialize(msecs_per_qnote, delta_time = 0)
518
- super(META_SET_TEMPO, msecs_per_qnote, delta_time)
519
+ super(META_SET_TEMPO, msecs_per_qnote, delta_time)
519
520
  end
520
521
 
521
522
  def tempo
522
- return @data
523
+ return @data
523
524
  end
524
525
 
525
526
  def tempo=(val)
526
- @data = val
527
+ @data = val
527
528
  end
528
529
 
529
530
  def data_as_bytes
530
- data = []
531
- data << @status
532
- data << @meta_type
533
- data << 3
534
- data << ((@data >> 16) & 0xff)
535
- data << ((@data >> 8) & 0xff)
536
- data << (@data & 0xff)
531
+ data = []
532
+ data << @status
533
+ data << @meta_type
534
+ data << 3
535
+ data << ((@data >> 16) & 0xff)
536
+ data << ((@data >> 8) & 0xff)
537
+ data << (@data & 0xff)
537
538
  end
538
539
 
539
540
  def to_s
540
- "tempo #{@data} msecs per qnote (#{Tempo.mpq_to_bpm(@data)} bpm)"
541
+ "tempo #{@data} msecs per qnote (#{Tempo.mpq_to_bpm(@data)} bpm)"
541
542
  end
542
- end
543
+ end
544
+
545
+ # Container for time signature events
546
+ class TimeSig < MetaEvent
543
547
 
544
- # Container for time signature events
545
- class TimeSig < MetaEvent
546
-
547
548
  # Constructor
548
549
  def initialize(numer, denom, clocks, qnotes, delta_time = 0)
549
- super(META_TIME_SIG, [numer, denom, clocks, qnotes], delta_time)
550
+ super(META_TIME_SIG, [numer, denom, clocks, qnotes], delta_time)
550
551
  end
551
-
552
+
552
553
  # Returns the complete event as stored in the sequence
553
554
  def data_as_bytes
554
- data = []
555
- data << @status
556
- data << @meta_type
557
- data << 4
558
- data << @data[0]
559
- data << @data[1]
560
- data << @data[2]
561
- data << @data[3]
555
+ data = []
556
+ data << @status
557
+ data << @meta_type
558
+ data << 4
559
+ data << @data[0]
560
+ data << @data[1]
561
+ data << @data[2]
562
+ data << @data[3]
562
563
  end
563
564
 
564
- # Calculates the duration (in ticks) for a full measure
565
- def measure_duration(ppqn)
566
- (4 * ppqn * @data[0]) / (2**@data[1])
565
+ # Calculates the duration (in ticks) for a full measure
566
+ def measure_duration(ppqn)
567
+ (4 * ppqn * @data[0]) / (2**@data[1])
567
568
  end
568
-
569
+
569
570
  # Returns the numerator (the top digit) for the time signature
570
571
  def numerator
571
- @data[0]
572
+ @data[0]
572
573
  end
573
-
574
+
574
575
  # Returns the denominator of the time signature. Use it as a power of 2
575
576
  # to get the displayed (lower-part) digit of the time signature.
576
577
  def denominator
577
- @data[1]
578
+ @data[1]
578
579
  end
579
-
580
+
580
581
  # Returns the metronome tick duration for the time signature. On
581
582
  # each quarter note, there's 24 ticks.
582
583
  def metronome_ticks
583
- @data[2]
584
+ @data[2]
584
585
  end
585
-
586
+
586
587
  # Returns the time signature for the event as a string.
587
588
  # Example: "time sig 3/4"
588
589
  def to_s
589
- "time sig #{@data[0]}/#{2**@data[1]}"
590
+ "time sig #{@data[0]}/#{2**@data[1]}"
590
591
  end
591
- end
592
+ end
593
+
594
+ # Container for key signature events
595
+ class KeySig < MetaEvent
592
596
 
593
- # Container for key signature events
594
- class KeySig < MetaEvent
595
-
596
597
  # Constructor
597
598
  def initialize(sharpflat, is_minor, delta_time = 0)
598
- super(META_KEY_SIG, [sharpflat, is_minor], delta_time)
599
+ super(META_KEY_SIG, [sharpflat, is_minor], delta_time)
599
600
  end
600
-
601
+
601
602
  # Returns the complete event as stored in the sequence
602
603
  def data_as_bytes
603
- data = []
604
- data << @status
605
- data << @meta_type
606
- data << 2
607
- data << @data[0]
608
- data << (@data[1] ? 1 : 0)
609
- end
610
-
604
+ data = []
605
+ data << @status
606
+ data << @meta_type
607
+ data << 2
608
+ data << @data[0]
609
+ data << (@data[1] ? 1 : 0)
610
+ end
611
+
611
612
  # Returns true if it's a minor key, false if major key
612
613
  def minor_key?
613
- @data[1]
614
+ @data[1]
614
615
  end
615
-
616
+
616
617
  # Returns true if it's a major key, false if minor key
617
618
  def major_key?
618
- !@data[1]
619
+ !@data[1]
619
620
  end
620
-
621
+
621
622
  # Returns the number of sharps/flats in the key sig. Negative for flats.
622
623
  def sharpflat
623
- @data[0] > 7 ? @data[0] - 256 : @data[0]
624
+ @data[0] > 7 ? @data[0] - 256 : @data[0]
624
625
  end
625
-
626
+
626
627
  # Returns the key signature as a text string.
627
628
  # Example: "key sig A flat major"
628
629
  def to_s
629
- majorkeys = ['C flat', 'G flat', 'D flat', 'A flat', 'E flat', 'B flat', 'F',
630
- 'C', 'G', 'D', 'A', 'E', 'B', 'F#', 'C#']
631
- minorkeys = ['a flat', 'e flat', 'b flat', 'f', 'c', 'g', 'd',
632
- 'a', 'e', 'b', 'f#', 'c#', 'g#', 'd#', 'a#']
633
- minor_key? ? "key sig #{minorkeys[sharpflat + 7]} minor" :
634
- "key sig #{majorkeys[sharpflat + 7]} major"
635
- end
636
- end
630
+ majorkeys = ['C flat', 'G flat', 'D flat', 'A flat', 'E flat', 'B flat', 'F',
631
+ 'C', 'G', 'D', 'A', 'E', 'B', 'F#', 'C#']
632
+ minorkeys = ['a flat', 'e flat', 'b flat', 'f', 'c', 'g', 'd',
633
+ 'a', 'e', 'b', 'f#', 'c#', 'g#', 'd#', 'a#']
634
+ minor_key? ? "key sig #{minorkeys[sharpflat + 7]} minor" :
635
+ "key sig #{majorkeys[sharpflat + 7]} major"
636
+ end
637
+ end
637
638
 
638
639
  end