midilib 2.0.4 → 2.0.5

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -1,18 +1,18 @@
1
1
  module MIDI
2
2
 
3
- # Utility methods.
4
- class Utils
3
+ # Utility methods.
4
+ class Utils
5
5
 
6
6
  # MIDI note names. NOTE_NAMES[0] is 'C', NOTE_NAMES[1] is 'C#', etc.
7
7
  NOTE_NAMES = [
8
- 'C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B'
8
+ 'C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B'
9
9
  ]
10
10
 
11
11
  # Given a MIDI note number, return the name and octave as a string.
12
12
  def Utils.note_to_s(num)
13
- note = num % 12
14
- octave = num / 12
15
- return "#{NOTE_NAMES[note]}#{octave - 1}"
13
+ note = num % 12
14
+ octave = num / 12
15
+ return "#{NOTE_NAMES[note]}#{octave - 1}"
16
16
  end
17
17
 
18
18
  # Given an integer, returns it as a variable length array of bytes (the
@@ -22,15 +22,15 @@ class Utils
22
22
  # input from a stream of bytes. Therefore we don't supply it here. That is
23
23
  # a part of the MIDIFile class.
24
24
  def Utils.as_var_len(val)
25
- buffer = []
26
- buffer << (val & 0x7f)
27
- val = (val >> 7)
28
- while val > 0
29
- buffer << (0x80 + (val & 0x7f))
30
- val = (val >> 7)
31
- end
32
- return buffer.reverse!
25
+ buffer = []
26
+ buffer << (val & 0x7f)
27
+ val = (val >> 7)
28
+ while val > 0
29
+ buffer << (0x80 + (val & 0x7f))
30
+ val = (val >> 7)
31
+ end
32
+ return buffer.reverse!
33
33
  end
34
34
 
35
- end
35
+ end
36
36
  end
@@ -6,76 +6,76 @@
6
6
 
7
7
  module MIDI
8
8
 
9
- 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
15
- end
9
+ 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
16
15
  end
16
+ end
17
17
 
18
- class ChannelEvent
19
- def ==(an_obj)
20
- return super(an_obj) && @channel == an_obj.channel
21
- end
18
+ class ChannelEvent
19
+ def ==(an_obj)
20
+ return super(an_obj) && @channel == an_obj.channel
22
21
  end
22
+ end
23
23
 
24
- class NoteEvent < ChannelEvent
25
- def ==(an_obj)
26
- return super(an_obj) &&
27
- @note == an_obj.note && @velocity == an_obj.velocity
28
- end
24
+ class NoteEvent < ChannelEvent
25
+ def ==(an_obj)
26
+ return super(an_obj) &&
27
+ @note == an_obj.note && @velocity == an_obj.velocity
29
28
  end
29
+ end
30
30
 
31
- class Controller < ChannelEvent
32
- def ==(an_obj)
33
- return super(an_obj) &&
34
- @controller == an_obj.controller && @value == an_obj.value
35
- end
31
+ class Controller < ChannelEvent
32
+ def ==(an_obj)
33
+ return super(an_obj) &&
34
+ @controller == an_obj.controller && @value == an_obj.value
36
35
  end
36
+ end
37
37
 
38
- class ProgramChange < ChannelEvent
39
- def ==(an_obj)
40
- return super(an_obj) && @program == an_obj.program
41
- end
38
+ class ProgramChange < ChannelEvent
39
+ def ==(an_obj)
40
+ return super(an_obj) && @program == an_obj.program
42
41
  end
42
+ end
43
43
 
44
- class ChannelPressure < ChannelEvent
45
- def ==(an_obj)
46
- return super(an_obj) && @pressure == an_obj.pressure
47
- end
44
+ class ChannelPressure < ChannelEvent
45
+ def ==(an_obj)
46
+ return super(an_obj) && @pressure == an_obj.pressure
48
47
  end
48
+ end
49
49
 
50
- class PitchBend < ChannelEvent
51
- def ==(an_obj)
52
- return super(an_obj) && @value == an_obj.value
53
- end
50
+ class PitchBend < ChannelEvent
51
+ def ==(an_obj)
52
+ return super(an_obj) && @value == an_obj.value
54
53
  end
54
+ end
55
55
 
56
- class SystemExclusive < SystemCommon
57
- def ==(an_obj)
58
- return super(an_obj) && @data == an_obj.data
59
- end
56
+ class SystemExclusive < SystemCommon
57
+ def ==(an_obj)
58
+ return super(an_obj) && @data == an_obj.data
60
59
  end
60
+ end
61
61
 
62
- class SongPointer < SystemCommon
63
- def ==(an_obj)
64
- return super(an_obj) && @pointer == an_obj.pointer
65
- end
62
+ class SongPointer < SystemCommon
63
+ def ==(an_obj)
64
+ return super(an_obj) && @pointer == an_obj.pointer
66
65
  end
66
+ end
67
67
 
68
- class SongSelect < SystemCommon
69
- def ==(an_obj)
70
- return super(an_obj) && @song == an_obj.song
71
- end
68
+ class SongSelect < SystemCommon
69
+ def ==(an_obj)
70
+ return super(an_obj) && @song == an_obj.song
72
71
  end
72
+ end
73
73
 
74
- class MetaEvent < Event
75
- def ==(an_obj)
76
- return super(an_obj) && @meta_type == an_obj.meta_type &&
77
- @data == an_obj.data
78
- end
74
+ class MetaEvent < Event
75
+ def ==(an_obj)
76
+ return super(an_obj) && @meta_type == an_obj.meta_type &&
77
+ @data == an_obj.data
79
78
  end
79
+ end
80
80
 
81
81
  end
@@ -8,130 +8,128 @@ require 'midilib'
8
8
 
9
9
  class EventTester < Test::Unit::TestCase
10
10
 
11
- def test_note_on
12
- e = MIDI::NoteOn.new
13
- assert_equal(MIDI::NOTE_ON, e.status)
14
- assert_equal(0, e.channel)
15
- assert_equal(64, e.note)
16
- assert_equal(64, e.velocity)
17
- assert_equal(0, e.delta_time)
18
- assert_equal(0, e.time_from_start)
11
+ def test_note_on
12
+ e = MIDI::NoteOn.new
13
+ assert_equal(MIDI::NOTE_ON, e.status)
14
+ assert_equal(0, e.channel)
15
+ assert_equal(64, e.note)
16
+ assert_equal(64, e.velocity)
17
+ assert_equal(0, e.delta_time)
18
+ assert_equal(0, e.time_from_start)
19
+ end
20
+
21
+ def test_to_s
22
+ e = MIDI::NoteOn.new
23
+ assert_equal("0: ch 00 on 40 40", e.to_s)
24
+ e.print_decimal_numbers = true
25
+ assert_equal("0: ch 0 on 64 64", e.to_s)
26
+ e.print_note_names = true
27
+ assert_equal("0: ch 0 on E4 64", e.to_s)
28
+ e.print_decimal_numbers = false
29
+ assert_equal("0: ch 00 on E4 40", e.to_s)
30
+ end
31
+
32
+ def test_pitch_bend
33
+ e = MIDI::PitchBend.new(0, 128)
34
+ b = e.data_as_bytes
35
+ assert_equal(0, b[1]) # lsb, 7 bits
36
+ assert_equal(1, b[2]) # msb, 7 bits
37
+
38
+ e.value = (3 << 7) + 42
39
+ b = e.data_as_bytes
40
+ assert_equal(42, b[1]) # lsb, 7 bits
41
+ assert_equal(3, b[2]) # msb, 7 bits
42
+ end
43
+
44
+ def test_quantize_1
45
+ e = MIDI::NoteOn.new
46
+ e.quantize_to(4)
47
+ assert_equal(0, e.time_from_start)
48
+
49
+ # Each value in this array is the expected quantized value of
50
+ # its index in the array.
51
+
52
+ # Test with quantize_to(4)
53
+ [0, 0, 4, 4, 4, 4, 8, 8, 8, 8, 12, 12, 12, 12, 16].each_with_index do |after, before|
54
+ e.time_from_start = before
55
+ e.quantize_to(4)
56
+ assert_equal(after, e.time_from_start)
19
57
  end
20
58
 
21
- def test_quantize
22
- e = MIDI::NoteOn.new
23
- e.quantize_to(4)
24
- assert_equal(0, e.time_from_start)
25
-
26
- # Each value in this array is the expected quantized value of
27
- # its index in the array.
28
-
29
- # Test with quantize_to(4)
30
- [0, 0, 4, 4, 4, 4, 8, 8, 8, 8, 12, 12, 12, 12, 16].each_with_index {
31
- | after, before |
32
- e.time_from_start = before
33
- e.quantize_to(4)
34
- assert_equal(after, e.time_from_start)
35
- }
36
-
37
- # Test with quantize_to(6)
38
- [0, 0, 0, 6, 6, 6, 6, 6, 6, 12, 12, 12, 12, 12, 12,
39
- 18, 18, 18, 18, 18, 18, 24].each_with_index {
40
- | after, before |
41
- e.time_from_start = before
42
- e.quantize_to(6)
43
- assert_equal(after, e.time_from_start)
44
- }
45
- end
46
-
47
- def test_to_s
48
- e = MIDI::NoteOn.new
49
- assert_equal("0: ch 00 on 40 40", e.to_s)
50
- e.print_decimal_numbers = true
51
- assert_equal("0: ch 0 on 64 64", e.to_s)
52
- e.print_note_names = true
53
- assert_equal("0: ch 0 on E4 64", e.to_s)
54
- e.print_decimal_numbers = false
55
- assert_equal("0: ch 00 on E4 40", e.to_s)
56
- end
57
-
58
- def test_pitch_bend
59
- e = MIDI::PitchBend.new(0, 128)
60
- b = e.data_as_bytes
61
- assert_equal(0, b[1]) # lsb, 7 bits
62
- assert_equal(1, b[2]) # msb, 7 bits
63
-
64
- e.value = (3 << 7) + 42
65
- b = e.data_as_bytes
66
- assert_equal(42, b[1]) # lsb, 7 bits
67
- assert_equal(3, b[2]) # msb, 7 bits
68
- end
69
-
70
- def test_quantize
71
- e = MIDI::NoteOn.new(0, 64, 64, 0)
72
- e.quantize_to(80)
73
- assert_equal(0, e.time_from_start)
74
-
75
- e.time_from_start = 1
76
- e.quantize_to(80)
77
- assert_equal(0, e.time_from_start)
78
-
79
- e.time_from_start = 70
80
- e.quantize_to(80)
81
- assert_equal(80, e.time_from_start)
82
-
83
- e.time_from_start = 100
84
- e.quantize_to(80)
85
- assert_equal(80, e.time_from_start)
86
-
87
- e.time_from_start = 398
88
- e.quantize_to(80)
89
- assert_equal(400, e.time_from_start)
90
-
91
- e.time_from_start = 405
92
- e.quantize_to(80)
93
- assert_equal(400, e.time_from_start)
94
-
95
- e.time_from_start = 439
96
- e.quantize_to(80)
97
- assert_equal(400, e.time_from_start)
98
-
99
- e.time_from_start = 440
100
- e.quantize_to(80)
101
- assert_equal(480, e.time_from_start)
102
-
103
- e.time_from_start = 441
104
- e.quantize_to(80)
105
- assert_equal(480, e.time_from_start)
106
- end
107
-
108
- def test_meta_strings
109
- e = MIDI::MetaEvent.new(MIDI::META_TEXT, [97, 98, 99])
110
- assert_equal([97, 98, 99], e.data)
111
- assert_equal('abc', e.data_as_str)
112
-
113
- assert_equal([MIDI::META_EVENT, MIDI::META_TEXT, 3, 97, 98, 99], e.data_as_bytes)
114
- end
115
-
116
- def test_meta_event_string_in_ctor
117
- e = MIDI::MetaEvent.new(MIDI::META_TEXT, 'abc')
118
- assert_equal([97, 98, 99], e.data)
119
- assert_equal('abc', e.data_as_str)
120
- assert_equal([MIDI::META_EVENT, MIDI::META_TEXT, 3, 97, 98, 99], e.data_as_bytes)
121
- end
122
-
123
- def test_meta_event_data_assignment
124
- foobar_as_array = [102, 111, 111, 98, 97, 114]
125
-
126
- e = MIDI::MetaEvent.new(MIDI::META_TEXT, [97, 98, 99])
127
- e.data = 'foobar'
128
- assert_equal('foobar', e.data_as_str)
129
- assert_equal(foobar_as_array, e.data)
130
-
131
- e.data = nil
132
- e.data = foobar_as_array
133
- assert_equal('foobar', e.data_as_str)
134
- assert_equal(foobar_as_array, e.data)
59
+ # Test with quantize_to(6)
60
+ [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|
62
+ e.time_from_start = before
63
+ e.quantize_to(6)
64
+ assert_equal(after, e.time_from_start)
135
65
  end
66
+ end
67
+
68
+ def test_quantize_2
69
+ e = MIDI::NoteOn.new(0, 64, 64, 0)
70
+ e.quantize_to(80)
71
+ assert_equal(0, e.time_from_start)
72
+
73
+ e.time_from_start = 1
74
+ e.quantize_to(80)
75
+ assert_equal(0, e.time_from_start)
76
+
77
+ e.time_from_start = 70
78
+ e.quantize_to(80)
79
+ assert_equal(80, e.time_from_start)
80
+
81
+ e.time_from_start = 100
82
+ e.quantize_to(80)
83
+ assert_equal(80, e.time_from_start)
84
+
85
+ e.time_from_start = 398
86
+ e.quantize_to(80)
87
+ assert_equal(400, e.time_from_start)
88
+
89
+ e.time_from_start = 405
90
+ e.quantize_to(80)
91
+ assert_equal(400, e.time_from_start)
92
+
93
+ e.time_from_start = 439
94
+ e.quantize_to(80)
95
+ assert_equal(400, e.time_from_start)
96
+
97
+ e.time_from_start = 440
98
+ e.quantize_to(80)
99
+ assert_equal(480, e.time_from_start)
100
+
101
+ e.time_from_start = 441
102
+ e.quantize_to(80)
103
+ assert_equal(480, e.time_from_start)
104
+ end
105
+
106
+ def test_meta_strings
107
+ e = MIDI::MetaEvent.new(MIDI::META_TEXT, [97, 98, 99])
108
+ assert_equal([97, 98, 99], e.data)
109
+ assert_equal('abc', e.data_as_str)
110
+
111
+ assert_equal([MIDI::META_EVENT, MIDI::META_TEXT, 3, 97, 98, 99], e.data_as_bytes)
112
+ end
113
+
114
+ def test_meta_event_string_in_ctor
115
+ e = MIDI::MetaEvent.new(MIDI::META_TEXT, 'abc')
116
+ assert_equal([97, 98, 99], e.data)
117
+ assert_equal('abc', e.data_as_str)
118
+ assert_equal([MIDI::META_EVENT, MIDI::META_TEXT, 3, 97, 98, 99], e.data_as_bytes)
119
+ end
120
+
121
+ def test_meta_event_data_assignment
122
+ foobar_as_array = [102, 111, 111, 98, 97, 114]
123
+
124
+ e = MIDI::MetaEvent.new(MIDI::META_TEXT, [97, 98, 99])
125
+ e.data = 'foobar'
126
+ assert_equal('foobar', e.data_as_str)
127
+ assert_equal(foobar_as_array, e.data)
128
+
129
+ e.data = nil
130
+ e.data = foobar_as_array
131
+ assert_equal('foobar', e.data_as_str)
132
+ assert_equal(foobar_as_array, e.data)
133
+ end
136
134
 
137
135
  end
@@ -11,53 +11,40 @@ require 'event_equality'
11
11
 
12
12
  class IOTester < Test::Unit::TestCase
13
13
 
14
- SEQ_TEST_FILE = File.join(File.dirname(__FILE__), 'test.mid')
15
- OUTPUT_FILE = 'testout.mid'
16
-
17
- def compare_tracks(t0, t1)
18
- assert_equal(t0.name, t1.name, 'track names differ')
19
- assert_equal(t0.events.length, t1.events.length,
20
- 'number of track events differ')
21
- t0.each_with_index { | ev0, i |
22
- assert_equal(ev0, t1.events[i], 'events differ')
23
- }
24
- assert_equal(t0.instrument, t1.instrument)
25
- end
26
-
27
- def compare_sequences(s0, s1)
28
- assert_equal(s0.name, s1.name, 'sequence names differ')
29
- assert_equal(s0.tracks.length, s1.tracks.length,
30
- 'number of tracks differ')
31
- s0.each_with_index { | track0, i |
32
- compare_tracks(track0, s1.tracks[i])
33
- }
34
- end
35
-
36
- def test_read_and_write
37
- seq0 = MIDI::Sequence.new()
38
-
39
- puts if $DEBUG
40
- puts ' reading file' if $DEBUG
41
- File.open(SEQ_TEST_FILE, 'rb') { | f | seq0.read(f) }
42
-
43
- puts ' writing file' if $DEBUG
44
- File.open(OUTPUT_FILE, 'wb') { | f | seq0.write(f) }
45
-
46
- puts ' reading file' if $DEBUG
47
- seq1 = MIDI::Sequence.new()
48
- File.open(OUTPUT_FILE, 'rb') { | f | seq1.read(f) }
49
-
50
- puts ' comparing sequences' if $DEBUG
51
- compare_sequences(seq0, seq1)
52
- ensure
53
- File.delete(OUTPUT_FILE) if File.exist?(OUTPUT_FILE)
54
- end
55
-
56
- def test_read_strings
57
- seq = MIDI::Sequence.new
58
- File.open(SEQ_TEST_FILE, 'rb') { |f| seq.read(f) }
59
- assert_equal('Sequence Name', seq.tracks[0].name)
60
- assert_equal(MIDI::GM_PATCH_NAMES[0], seq.tracks[1].instrument)
61
- end
14
+ SEQ_TEST_FILE = File.join(File.dirname(__FILE__), 'test.mid')
15
+ OUTPUT_FILE = 'testout.mid'
16
+
17
+ def compare_tracks(t0, t1)
18
+ assert_equal(t0.name, t1.name, 'track names differ')
19
+ assert_equal(t0.events.length, t1.events.length,
20
+ 'number of track events differ')
21
+ t0.each_with_index { |ev0, i| assert_equal(ev0, t1.events[i], 'events differ') }
22
+ assert_equal(t0.instrument, t1.instrument)
23
+ end
24
+
25
+ def compare_sequences(s0, s1)
26
+ assert_equal(s0.name, s1.name, 'sequence names differ')
27
+ assert_equal(s0.tracks.length, s1.tracks.length,
28
+ 'number of tracks differ')
29
+ s0.each_with_index { |track0, i| compare_tracks(track0, s1.tracks[i]) }
30
+ end
31
+
32
+ def test_read_and_write
33
+ seq0 = MIDI::Sequence.new()
34
+ File.open(SEQ_TEST_FILE, 'rb') { |f| seq0.read(f) }
35
+ File.open(OUTPUT_FILE, 'wb') { |f| seq0.write(f) }
36
+ seq1 = MIDI::Sequence.new()
37
+ File.open(OUTPUT_FILE, 'rb') { |f| seq1.read(f) }
38
+ compare_sequences(seq0, seq1)
39
+ ensure
40
+ File.delete(OUTPUT_FILE) if File.exist?(OUTPUT_FILE)
41
+ end
42
+
43
+ def test_read_strings
44
+ seq = MIDI::Sequence.new
45
+ File.open(SEQ_TEST_FILE, 'rb') { |f| seq.read(f) }
46
+ assert_equal('Sequence Name', seq.tracks[0].name)
47
+ assert_equal(MIDI::GM_PATCH_NAMES[0], seq.tracks[1].instrument)
48
+ end
62
49
 
63
50
  end