midilib 1.2.1 → 2.0.0
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.
- data/ChangeLog +3 -1
- data/Credits +6 -1
- data/README.rdoc +41 -15
- data/Rakefile +3 -11
- data/TODO.rdoc +4 -7
- data/examples/from_scratch.rb +2 -2
- data/examples/measures_mbt.rb +1 -1
- data/examples/print_program_changes.rb +1 -1
- data/examples/strings.rb +1 -1
- data/examples/transpose.rb +1 -1
- data/html/Array.html +382 -0
- data/html/IO.html +277 -0
- data/html/MIDI.html +829 -0
- data/html/MIDI/ActiveSense.html +317 -0
- data/html/MIDI/ChannelEvent.html +347 -0
- data/html/MIDI/ChannelPressure.html +379 -0
- data/html/MIDI/Clock.html +317 -0
- data/html/MIDI/Continue.html +317 -0
- data/html/MIDI/Controller.html +398 -0
- data/html/MIDI/Event.html +659 -0
- data/html/MIDI/IO.html +238 -0
- data/html/MIDI/IO/MIDIFile.html +2269 -0
- data/html/MIDI/IO/SeqReader.html +1051 -0
- data/html/MIDI/IO/SeqWriter.html +706 -0
- data/html/MIDI/KeySig.html +487 -0
- data/html/MIDI/Marker.html +275 -0
- data/html/MIDI/Measure.html +479 -0
- data/html/MIDI/Measures.html +416 -0
- data/html/MIDI/MetaEvent.html +617 -0
- data/html/MIDI/NoteEvent.html +459 -0
- data/html/MIDI/NoteOff.html +341 -0
- data/html/MIDI/NoteOn.html +341 -0
- data/html/MIDI/PitchBend.html +380 -0
- data/html/MIDI/PolyPressure.html +390 -0
- data/html/MIDI/ProgramChange.html +379 -0
- data/html/MIDI/Realtime.html +354 -0
- data/html/MIDI/Sequence.html +1063 -0
- data/html/MIDI/SongPointer.html +380 -0
- data/html/MIDI/SongSelect.html +379 -0
- data/html/MIDI/Start.html +317 -0
- data/html/MIDI/Stop.html +317 -0
- data/html/MIDI/SystemCommon.html +275 -0
- data/html/MIDI/SystemExclusive.html +382 -0
- data/html/MIDI/SystemReset.html +317 -0
- data/html/MIDI/Tempo.html +519 -0
- data/html/MIDI/TimeSig.html +524 -0
- data/html/MIDI/Track.html +859 -0
- data/html/MIDI/TuneRequest.html +354 -0
- data/html/MIDI/Utils.html +350 -0
- data/html/README_rdoc.html +882 -0
- data/html/TODO_rdoc.html +215 -0
- data/html/created.rid +14 -0
- data/html/images/brick.png +0 -0
- data/html/images/brick_link.png +0 -0
- data/html/images/bug.png +0 -0
- data/html/images/bullet_black.png +0 -0
- data/html/images/bullet_toggle_minus.png +0 -0
- data/html/images/bullet_toggle_plus.png +0 -0
- data/html/images/date.png +0 -0
- data/html/images/find.png +0 -0
- data/html/images/loadingAnimation.gif +0 -0
- data/html/images/macFFBgHack.png +0 -0
- data/html/images/package.png +0 -0
- data/html/images/page_green.png +0 -0
- data/html/images/page_white_text.png +0 -0
- data/html/images/page_white_width.png +0 -0
- data/html/images/plugin.png +0 -0
- data/html/images/ruby.png +0 -0
- data/html/images/tag_green.png +0 -0
- data/html/images/wrench.png +0 -0
- data/html/images/wrench_orange.png +0 -0
- data/html/images/zoom.png +0 -0
- data/html/index.html +1266 -0
- data/html/js/darkfish.js +116 -0
- data/html/js/jquery.js +32 -0
- data/html/js/quicksearch.js +114 -0
- data/html/js/thickbox-compressed.js +10 -0
- data/html/lib/midilib/consts_rb.html +55 -0
- data/html/lib/midilib/event_rb.html +56 -0
- data/html/lib/midilib/info_rb.html +52 -0
- data/html/lib/midilib/io/midifile_rb.html +54 -0
- data/html/lib/midilib/io/seqreader_rb.html +58 -0
- data/html/lib/midilib/io/seqwriter_rb.html +59 -0
- data/html/lib/midilib/measure_rb.html +54 -0
- data/html/lib/midilib/sequence_rb.html +58 -0
- data/html/lib/midilib/track_rb.html +54 -0
- data/html/lib/midilib/utils_rb.html +52 -0
- data/html/lib/midilib_rb.html +71 -0
- data/html/rdoc.css +706 -0
- data/install.rb +1 -1
- data/lib/midilib/event.rb +11 -77
- data/lib/midilib/info.rb +4 -4
- data/lib/midilib/io/seqreader.rb +2 -2
- data/lib/midilib/io/seqwriter.rb +1 -1
- data/lib/midilib/sequence.rb +1 -1
- data/lib/midilib/track.rb +54 -8
- data/test/test_event.rb +4 -62
- data/test/test_sequence.rb +1 -1
- data/test/test_track.rb +39 -5
- metadata +102 -9
data/install.rb
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
# This script installs midilib into the Ruby site-local library directory.
|
6
6
|
#
|
7
7
|
# Author:: Jim Menard (mailto:jimm@io.com)
|
8
|
-
# Copyright:: Copyright (c) 2003-
|
8
|
+
# Copyright:: Copyright (c) 2003-2010 by Jim Menard
|
9
9
|
# License:: Distributed under the same license as Ruby.
|
10
10
|
#
|
11
11
|
|
data/lib/midilib/event.rb
CHANGED
@@ -30,16 +30,6 @@ class Event
|
|
30
30
|
def initialize(status = 0, delta_time = 0)
|
31
31
|
@status = status
|
32
32
|
@delta_time = delta_time
|
33
|
-
@is_channel = false # the majority of events are channel events
|
34
|
-
@is_note = false # note on, note off, and poly press return true
|
35
|
-
@is_note_on = false
|
36
|
-
@is_note_off = false
|
37
|
-
@is_meta = false
|
38
|
-
@is_system = false
|
39
|
-
@is_realtime = false
|
40
|
-
@is_timesig = false
|
41
|
-
@is_keysig = false
|
42
|
-
@is_program_change = false
|
43
33
|
@time_from_start = 0 # maintained by tracks
|
44
34
|
end
|
45
35
|
protected :initialize
|
@@ -51,57 +41,6 @@ class Event
|
|
51
41
|
raise "subclass responsibility"
|
52
42
|
end
|
53
43
|
|
54
|
-
# Returns +true+ if this is a channel event.
|
55
|
-
def channel?
|
56
|
-
return @is_channel
|
57
|
-
end
|
58
|
-
|
59
|
-
# Returns +true+ if this is a note on, note off, or polyphonic pressure
|
60
|
-
# event.
|
61
|
-
def note?
|
62
|
-
return @is_note
|
63
|
-
end
|
64
|
-
|
65
|
-
# Returns +true+ if this is a note on event.
|
66
|
-
def note_on?
|
67
|
-
@is_note_on
|
68
|
-
end
|
69
|
-
|
70
|
-
# Returns +true+ if this is a note off event.
|
71
|
-
def note_off?
|
72
|
-
@is_note_off
|
73
|
-
end
|
74
|
-
|
75
|
-
# Returns +true+ if this is a meta event.
|
76
|
-
def meta?
|
77
|
-
return @is_meta
|
78
|
-
end
|
79
|
-
|
80
|
-
# Returns +true+ if this is a system message event.
|
81
|
-
def system?
|
82
|
-
return @is_system
|
83
|
-
end
|
84
|
-
|
85
|
-
# Returns +true+ if this is a time signature event.
|
86
|
-
def timesig?
|
87
|
-
return @is_timesig
|
88
|
-
end
|
89
|
-
|
90
|
-
# Returns +true+ if this is a key signature event.
|
91
|
-
def keysig?
|
92
|
-
return @is_keysig
|
93
|
-
end
|
94
|
-
|
95
|
-
# Returns +true+ if this is a realtime status byte.
|
96
|
-
def realtime?
|
97
|
-
return @is_realtime
|
98
|
-
end
|
99
|
-
|
100
|
-
# Returns +true+ if this is a program change.
|
101
|
-
def program_change?
|
102
|
-
return @is_program_change
|
103
|
-
end
|
104
|
-
|
105
44
|
# Quantize this event's time_from_start by moving it to the nearest
|
106
45
|
# multiple of +boundary+. See MIDI::Track#quantize. *Note*: does not
|
107
46
|
# modify the event's delta_time, though MIDI::Track#quantize calls
|
@@ -148,7 +87,6 @@ class ChannelEvent < Event
|
|
148
87
|
def initialize(status, channel, delta_time)
|
149
88
|
super(status, delta_time)
|
150
89
|
@channel = channel
|
151
|
-
@is_channel = true
|
152
90
|
end
|
153
91
|
protected :initialize
|
154
92
|
|
@@ -166,7 +104,6 @@ class NoteEvent < ChannelEvent
|
|
166
104
|
super(status, channel, delta_time)
|
167
105
|
@note = note
|
168
106
|
@velocity = velocity
|
169
|
-
@is_note = true
|
170
107
|
end
|
171
108
|
protected :initialize
|
172
109
|
|
@@ -193,30 +130,36 @@ class NoteEvent < ChannelEvent
|
|
193
130
|
end
|
194
131
|
end
|
195
132
|
|
196
|
-
class
|
133
|
+
class NoteOn < NoteEvent
|
197
134
|
attr_accessor :off
|
198
135
|
def initialize(channel = 0, note = 64, velocity = 64, delta_time = 0)
|
199
136
|
super(NOTE_ON, channel, note, velocity, delta_time)
|
200
|
-
@is_note_on = true
|
201
137
|
end
|
138
|
+
|
202
139
|
def to_s
|
203
140
|
return super <<
|
204
141
|
"on #{note_to_s} #{number_to_s(@velocity)}"
|
205
142
|
end
|
206
143
|
end
|
207
144
|
|
208
|
-
class
|
145
|
+
# Old class name for compatability
|
146
|
+
NoteOnEvent = NoteOn
|
147
|
+
|
148
|
+
class NoteOff < NoteEvent
|
209
149
|
attr_accessor :on
|
210
150
|
def initialize(channel = 0, note = 64, velocity = 64, delta_time = 0)
|
211
151
|
super(NOTE_OFF, channel, note, velocity, delta_time)
|
212
|
-
@is_note_off = true
|
213
152
|
end
|
153
|
+
|
214
154
|
def to_s
|
215
155
|
return super <<
|
216
156
|
"off #{note_to_s} #{number_to_s(@velocity)}"
|
217
157
|
end
|
218
158
|
end
|
219
159
|
|
160
|
+
# Old class name for compatability
|
161
|
+
NoteOffEvent = NoteOff
|
162
|
+
|
220
163
|
class PolyPressure < NoteEvent
|
221
164
|
def initialize(channel = 0, note = 64, value = 0, delta_time = 0)
|
222
165
|
super(POLY_PRESSURE, channel, note, value, delta_time)
|
@@ -241,7 +184,6 @@ class Controller < ChannelEvent
|
|
241
184
|
super(CONTROLLER, channel, delta_time)
|
242
185
|
@controller = controller
|
243
186
|
@value = value
|
244
|
-
@is_controller = true
|
245
187
|
end
|
246
188
|
|
247
189
|
def data_as_bytes
|
@@ -262,7 +204,6 @@ class ProgramChange < ChannelEvent
|
|
262
204
|
def initialize(channel = 0, program = 0, delta_time = 0)
|
263
205
|
super(PROGRAM_CHANGE, channel, delta_time)
|
264
206
|
@program = program
|
265
|
-
@is_program_change = true
|
266
207
|
end
|
267
208
|
|
268
209
|
def data_as_bytes
|
@@ -318,7 +259,6 @@ end
|
|
318
259
|
class SystemCommon < Event
|
319
260
|
def initialize(status, delta_time)
|
320
261
|
super(status, delta_time)
|
321
|
-
@is_system = true
|
322
262
|
end
|
323
263
|
end
|
324
264
|
|
@@ -401,7 +341,6 @@ end
|
|
401
341
|
class Realtime < Event
|
402
342
|
def initialize(status, delta_time)
|
403
343
|
super(status, delta_time)
|
404
|
-
@is_realtime = true
|
405
344
|
end
|
406
345
|
|
407
346
|
def data_as_bytes
|
@@ -490,7 +429,6 @@ class MetaEvent < Event
|
|
490
429
|
def initialize(meta_type, data = nil, delta_time = 0)
|
491
430
|
super(META_EVENT, delta_time)
|
492
431
|
@meta_type = meta_type
|
493
|
-
@is_meta = true
|
494
432
|
self.data=(data)
|
495
433
|
end
|
496
434
|
|
@@ -573,9 +511,7 @@ class Tempo < MetaEvent
|
|
573
511
|
|
574
512
|
# Translates microseconds per quarter note (beat) to beats per minute.
|
575
513
|
def Tempo.mpq_to_bpm(mpq)
|
576
|
-
|
577
|
-
# 110 bpm (as 545455 msecs) becomes 109.999 (which became 109 bpm)
|
578
|
-
return Integer(MICROSECS_PER_MINUTE.to_f / mpq + 0.49)
|
514
|
+
return MICROSECS_PER_MINUTE.to_f / mpq.to_f
|
579
515
|
end
|
580
516
|
|
581
517
|
def initialize(msecs_per_qnote, delta_time = 0)
|
@@ -611,7 +547,6 @@ class TimeSig < MetaEvent
|
|
611
547
|
# Constructor
|
612
548
|
def initialize(numer, denom, clocks, qnotes, delta_time = 0)
|
613
549
|
super(META_TIME_SIG, [numer, denom, clocks, qnotes], delta_time)
|
614
|
-
@is_timesig = true
|
615
550
|
end
|
616
551
|
|
617
552
|
# Returns the complete event as stored in the sequence
|
@@ -661,7 +596,6 @@ class KeySig < MetaEvent
|
|
661
596
|
# Constructor
|
662
597
|
def initialize(sharpflat, is_minor, delta_time = 0)
|
663
598
|
super(META_KEY_SIG, [sharpflat, is_minor], delta_time)
|
664
|
-
@is_keysig = true
|
665
599
|
end
|
666
600
|
|
667
601
|
# Returns the complete event as stored in the sequence
|
data/lib/midilib/info.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
module MIDI
|
2
2
|
|
3
|
-
VERSION_MAJOR =
|
4
|
-
VERSION_MINOR =
|
5
|
-
VERSION_TWEAK =
|
3
|
+
VERSION_MAJOR = 2
|
4
|
+
VERSION_MINOR = 0
|
5
|
+
VERSION_TWEAK = 0
|
6
6
|
Version = "#{VERSION_MAJOR}.#{VERSION_MINOR}.#{VERSION_TWEAK}"
|
7
|
-
Copyright = 'Copyright (c) 2003-
|
7
|
+
Copyright = 'Copyright (c) 2003-2010 by Jim Menard <jimm@io.com>'
|
8
8
|
|
9
9
|
end
|
data/lib/midilib/io/seqreader.rb
CHANGED
@@ -75,7 +75,7 @@ class SeqReader < MIDIFile
|
|
75
75
|
return
|
76
76
|
end
|
77
77
|
|
78
|
-
on =
|
78
|
+
on = NoteOn.new(chan, note, vel, @curr_ticks)
|
79
79
|
@track.events << on
|
80
80
|
@pending << on
|
81
81
|
track_uses_channel(chan)
|
@@ -96,7 +96,7 @@ class SeqReader < MIDIFile
|
|
96
96
|
end
|
97
97
|
|
98
98
|
def make_note_off(on, vel)
|
99
|
-
off =
|
99
|
+
off = NoteOff.new(on.channel, on.note, vel, @curr_ticks)
|
100
100
|
@track.events << off
|
101
101
|
on.off = off
|
102
102
|
off.on = on
|
data/lib/midilib/io/seqwriter.rb
CHANGED
@@ -91,7 +91,7 @@ class SeqWriter
|
|
91
91
|
# exactly the same, the rest is trivial. If it's note on/note off,
|
92
92
|
# we can combine those further.
|
93
93
|
if status == prev_status
|
94
|
-
data[0,1] =
|
94
|
+
data[0,1] = [] # delete status byte from data
|
95
95
|
return status + chan
|
96
96
|
elsif status == NOTE_OFF && data[2] == 64
|
97
97
|
# If we see a note off and the velocity is 64, we can store
|
data/lib/midilib/sequence.rb
CHANGED
data/lib/midilib/track.rb
CHANGED
@@ -1,5 +1,47 @@
|
|
1
1
|
require 'midilib/event'
|
2
2
|
|
3
|
+
# This is taken from
|
4
|
+
# http://github.com/adamjmurray/cosy/blob/master/lib/cosy/helper/midi_file_renderer_helper.rb
|
5
|
+
# with permission from Adam Murray, who originally suggested this fix.
|
6
|
+
# See http://wiki.github.com/adamjmurray/cosy/midilib-notes for details.
|
7
|
+
# First we need to add some API infrastructure:
|
8
|
+
class Array
|
9
|
+
# This code borrowed from 'Moser' http://codesnippets.joyent.com/posts/show/1699
|
10
|
+
|
11
|
+
# A stable sorting algorithm that maintains the relative order of equal elements
|
12
|
+
def mergesort(&cmp)
|
13
|
+
if cmp == nil
|
14
|
+
cmp = lambda { |a, b| a <=> b }
|
15
|
+
end
|
16
|
+
if size <= 1
|
17
|
+
self.dup
|
18
|
+
else
|
19
|
+
halves = split.map{ |half|
|
20
|
+
half.mergesort(&cmp)
|
21
|
+
}
|
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
|
+
|
3
45
|
module MIDI
|
4
46
|
|
5
47
|
# A Track is a list of events.
|
@@ -32,7 +74,7 @@ class Track
|
|
32
74
|
# Return track name. If there is no name, return UNNAMED.
|
33
75
|
def name
|
34
76
|
event = @events.detect { | e |
|
35
|
-
e.
|
77
|
+
e.kind_of?(MetaEvent) && e.meta_type == META_SEQ_NAME
|
36
78
|
}
|
37
79
|
return event ? event.data_as_str : UNNAMED
|
38
80
|
end
|
@@ -40,7 +82,7 @@ class Track
|
|
40
82
|
# Set track name. Replaces or creates a name meta-event.
|
41
83
|
def name=(name)
|
42
84
|
event = @events.detect { | e |
|
43
|
-
e.
|
85
|
+
e.kind_of?(MetaEvent) && e.meta_type == META_SEQ_NAME
|
44
86
|
}
|
45
87
|
if event
|
46
88
|
event.data = name
|
@@ -74,7 +116,7 @@ class Track
|
|
74
116
|
def merge_event_lists(list1, list2)
|
75
117
|
recalc_times(0, list1)
|
76
118
|
recalc_times(0, list2)
|
77
|
-
|
119
|
+
list = list1 + list2
|
78
120
|
recalc_delta_from_times(0, list)
|
79
121
|
return list
|
80
122
|
end
|
@@ -113,7 +155,10 @@ class Track
|
|
113
155
|
def recalc_delta_from_times(starting_at=0, list=@events)
|
114
156
|
prev_time_from_start = 0
|
115
157
|
# We need to sort the sublist. sublist.sort! does not do what we want.
|
116
|
-
|
158
|
+
# We call mergesort instead of Array.sort because sort is not stable
|
159
|
+
# (it can mix up the order of events that have the same start time).
|
160
|
+
# See http://wiki.github.com/adamjmurray/cosy/midilib-notes for details.
|
161
|
+
list[starting_at .. -1] = list[starting_at .. -1].mergesort { | e1, e2 |
|
117
162
|
e1.time_from_start <=> e2.time_from_start
|
118
163
|
}
|
119
164
|
list[starting_at .. -1].each { | e |
|
@@ -130,10 +175,11 @@ class Track
|
|
130
175
|
# Sort events by their time_from_start. After sorting,
|
131
176
|
# recalc_delta_from_times is called to make sure that the delta times
|
132
177
|
# reflect the possibly new event order.
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
178
|
+
#
|
179
|
+
# Note: this method is redundant, since recalc_delta_from_times sorts
|
180
|
+
# the events first. This method may go away in a future release, or at
|
181
|
+
# least be aliased to recalc_delta_from_times.
|
182
|
+
alias_method :sort, :recalc_delta_from_times
|
137
183
|
end
|
138
184
|
|
139
185
|
end
|
data/test/test_event.rb
CHANGED
@@ -9,7 +9,7 @@ require 'midilib'
|
|
9
9
|
class EventTester < Test::Unit::TestCase
|
10
10
|
|
11
11
|
def test_note_on
|
12
|
-
e = MIDI::
|
12
|
+
e = MIDI::NoteOn.new
|
13
13
|
assert_equal(MIDI::NOTE_ON, e.status)
|
14
14
|
assert_equal(0, e.channel)
|
15
15
|
assert_equal(64, e.note)
|
@@ -19,7 +19,7 @@ class EventTester < Test::Unit::TestCase
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def test_quantize
|
22
|
-
e = MIDI::
|
22
|
+
e = MIDI::NoteOn.new
|
23
23
|
e.quantize_to(4)
|
24
24
|
assert_equal(0, e.time_from_start)
|
25
25
|
|
@@ -45,7 +45,7 @@ class EventTester < Test::Unit::TestCase
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def test_to_s
|
48
|
-
e = MIDI::
|
48
|
+
e = MIDI::NoteOn.new
|
49
49
|
assert_equal("0: ch 00 on 40 40", e.to_s)
|
50
50
|
e.print_decimal_numbers = true
|
51
51
|
assert_equal("0: ch 0 on 64 64", e.to_s)
|
@@ -55,64 +55,6 @@ class EventTester < Test::Unit::TestCase
|
|
55
55
|
assert_equal("0: ch 00 on E4 40", e.to_s)
|
56
56
|
end
|
57
57
|
|
58
|
-
def test_bools_note_on
|
59
|
-
e = MIDI::NoteOnEvent.new
|
60
|
-
assert(e.channel?)
|
61
|
-
assert(e.note?)
|
62
|
-
assert(e.note_on?)
|
63
|
-
assert(!e.note_off?)
|
64
|
-
assert(!e.meta?)
|
65
|
-
assert(!e.system?)
|
66
|
-
assert(!e.realtime?)
|
67
|
-
end
|
68
|
-
|
69
|
-
def test_bools_note_off
|
70
|
-
e = MIDI::NoteOffEvent.new
|
71
|
-
assert(e.channel?)
|
72
|
-
assert(e.note?)
|
73
|
-
assert(!e.note_on?)
|
74
|
-
assert(e.note_off?)
|
75
|
-
assert(!e.meta?)
|
76
|
-
assert(!e.system?)
|
77
|
-
assert(!e.realtime?)
|
78
|
-
end
|
79
|
-
|
80
|
-
def test_bools_realtime
|
81
|
-
e = MIDI::Clock.new
|
82
|
-
assert(!e.channel?)
|
83
|
-
assert(!e.note?)
|
84
|
-
assert(!e.meta?)
|
85
|
-
assert(!e.system?)
|
86
|
-
assert(e.realtime?)
|
87
|
-
end
|
88
|
-
|
89
|
-
def test_bools_controller
|
90
|
-
e = MIDI::Controller.new
|
91
|
-
assert(e.channel?)
|
92
|
-
assert(!e.note?)
|
93
|
-
assert(!e.meta?)
|
94
|
-
assert(!e.system?)
|
95
|
-
assert(!e.realtime?)
|
96
|
-
end
|
97
|
-
|
98
|
-
def test_bools_meta
|
99
|
-
e = MIDI::MetaEvent.new(MIDI::META_SEQ_NUM)
|
100
|
-
assert(!e.channel?)
|
101
|
-
assert(!e.note?)
|
102
|
-
assert(e.meta?)
|
103
|
-
assert(!e.system?)
|
104
|
-
assert(!e.realtime?)
|
105
|
-
end
|
106
|
-
|
107
|
-
def test_bools_system
|
108
|
-
e = MIDI::TuneRequest.new
|
109
|
-
assert(!e.channel?)
|
110
|
-
assert(!e.note?)
|
111
|
-
assert(!e.meta?)
|
112
|
-
assert(e.system?)
|
113
|
-
assert(!e.realtime?)
|
114
|
-
end
|
115
|
-
|
116
58
|
def test_pitch_bend
|
117
59
|
e = MIDI::PitchBend.new(0, 128)
|
118
60
|
b = e.data_as_bytes
|
@@ -126,7 +68,7 @@ class EventTester < Test::Unit::TestCase
|
|
126
68
|
end
|
127
69
|
|
128
70
|
def test_quantize
|
129
|
-
e = MIDI::
|
71
|
+
e = MIDI::NoteOn.new(0, 64, 64, 0)
|
130
72
|
e.quantize_to(80)
|
131
73
|
assert_equal(0, e.time_from_start)
|
132
74
|
|