midilib 0.8.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (252) hide show
  1. data/ChangeLog +87 -0
  2. data/Credits +8 -0
  3. data/README +361 -0
  4. data/Rakefile +68 -0
  5. data/TODO +25 -0
  6. data/examples/NoFences.mid +0 -0
  7. data/examples/from_scratch.mid +0 -0
  8. data/examples/from_scratch.rb +56 -0
  9. data/examples/reader2text.rb +220 -0
  10. data/examples/seq2text.rb +41 -0
  11. data/examples/strings.rb +34 -0
  12. data/examples/transpose.rb +75 -0
  13. data/html/classes/MIDI.html +738 -0
  14. data/html/classes/MIDI/ActiveSense.html +156 -0
  15. data/html/classes/MIDI/ActiveSense.src/M000136.html +18 -0
  16. data/html/classes/MIDI/ActiveSense.src/M000137.html +18 -0
  17. data/html/classes/MIDI/ChannelEvent.html +179 -0
  18. data/html/classes/MIDI/ChannelEvent.src/M000124.html +20 -0
  19. data/html/classes/MIDI/ChannelEvent.src/M000125.html +18 -0
  20. data/html/classes/MIDI/ChannelPressure.html +184 -0
  21. data/html/classes/MIDI/ChannelPressure.src/M000088.html +19 -0
  22. data/html/classes/MIDI/ChannelPressure.src/M000089.html +21 -0
  23. data/html/classes/MIDI/ChannelPressure.src/M000090.html +18 -0
  24. data/html/classes/MIDI/Clock.html +156 -0
  25. data/html/classes/MIDI/Clock.src/M000134.html +18 -0
  26. data/html/classes/MIDI/Clock.src/M000135.html +18 -0
  27. data/html/classes/MIDI/Continue.html +156 -0
  28. data/html/classes/MIDI/Continue.src/M000132.html +18 -0
  29. data/html/classes/MIDI/Continue.src/M000133.html +18 -0
  30. data/html/classes/MIDI/Controller.html +189 -0
  31. data/html/classes/MIDI/Controller.src/M000129.html +21 -0
  32. data/html/classes/MIDI/Controller.src/M000130.html +22 -0
  33. data/html/classes/MIDI/Controller.src/M000131.html +18 -0
  34. data/html/classes/MIDI/Event.html +424 -0
  35. data/html/classes/MIDI/Event.src/M000145.html +27 -0
  36. data/html/classes/MIDI/Event.src/M000146.html +18 -0
  37. data/html/classes/MIDI/Event.src/M000147.html +18 -0
  38. data/html/classes/MIDI/Event.src/M000148.html +18 -0
  39. data/html/classes/MIDI/Event.src/M000149.html +18 -0
  40. data/html/classes/MIDI/Event.src/M000150.html +18 -0
  41. data/html/classes/MIDI/Event.src/M000151.html +18 -0
  42. data/html/classes/MIDI/Event.src/M000152.html +18 -0
  43. data/html/classes/MIDI/Event.src/M000153.html +18 -0
  44. data/html/classes/MIDI/Event.src/M000154.html +22 -0
  45. data/html/classes/MIDI/Event.src/M000155.html +18 -0
  46. data/html/classes/MIDI/Event.src/M000156.html +18 -0
  47. data/html/classes/MIDI/Event.src/M000157.html +18 -0
  48. data/html/classes/MIDI/IO.html +121 -0
  49. data/html/classes/MIDI/IO/MIDIFile.html +925 -0
  50. data/html/classes/MIDI/IO/MIDIFile.src/M000028.html +22 -0
  51. data/html/classes/MIDI/IO/MIDIFile.src/M000029.html +24 -0
  52. data/html/classes/MIDI/IO/MIDIFile.src/M000030.html +19 -0
  53. data/html/classes/MIDI/IO/MIDIFile.src/M000031.html +19 -0
  54. data/html/classes/MIDI/IO/MIDIFile.src/M000032.html +17 -0
  55. data/html/classes/MIDI/IO/MIDIFile.src/M000033.html +17 -0
  56. data/html/classes/MIDI/IO/MIDIFile.src/M000034.html +17 -0
  57. data/html/classes/MIDI/IO/MIDIFile.src/M000035.html +17 -0
  58. data/html/classes/MIDI/IO/MIDIFile.src/M000036.html +17 -0
  59. data/html/classes/MIDI/IO/MIDIFile.src/M000037.html +17 -0
  60. data/html/classes/MIDI/IO/MIDIFile.src/M000038.html +17 -0
  61. data/html/classes/MIDI/IO/MIDIFile.src/M000039.html +17 -0
  62. data/html/classes/MIDI/IO/MIDIFile.src/M000040.html +17 -0
  63. data/html/classes/MIDI/IO/MIDIFile.src/M000041.html +17 -0
  64. data/html/classes/MIDI/IO/MIDIFile.src/M000042.html +17 -0
  65. data/html/classes/MIDI/IO/MIDIFile.src/M000043.html +17 -0
  66. data/html/classes/MIDI/IO/MIDIFile.src/M000044.html +17 -0
  67. data/html/classes/MIDI/IO/MIDIFile.src/M000045.html +17 -0
  68. data/html/classes/MIDI/IO/MIDIFile.src/M000046.html +17 -0
  69. data/html/classes/MIDI/IO/MIDIFile.src/M000047.html +17 -0
  70. data/html/classes/MIDI/IO/MIDIFile.src/M000048.html +17 -0
  71. data/html/classes/MIDI/IO/MIDIFile.src/M000049.html +17 -0
  72. data/html/classes/MIDI/IO/MIDIFile.src/M000050.html +17 -0
  73. data/html/classes/MIDI/IO/MIDIFile.src/M000051.html +17 -0
  74. data/html/classes/MIDI/IO/MIDIFile.src/M000052.html +17 -0
  75. data/html/classes/MIDI/IO/MIDIFile.src/M000053.html +43 -0
  76. data/html/classes/MIDI/IO/MIDIFile.src/M000054.html +34 -0
  77. data/html/classes/MIDI/IO/MIDIFile.src/M000055.html +96 -0
  78. data/html/classes/MIDI/IO/MIDIFile.src/M000056.html +18 -0
  79. data/html/classes/MIDI/IO/MIDIFile.src/M000057.html +48 -0
  80. data/html/classes/MIDI/IO/MIDIFile.src/M000058.html +42 -0
  81. data/html/classes/MIDI/IO/MIDIFile.src/M000059.html +19 -0
  82. data/html/classes/MIDI/IO/MIDIFile.src/M000060.html +19 -0
  83. data/html/classes/MIDI/IO/MIDIFile.src/M000061.html +20 -0
  84. data/html/classes/MIDI/IO/MIDIFile.src/M000062.html +21 -0
  85. data/html/classes/MIDI/IO/MIDIFile.src/M000063.html +31 -0
  86. data/html/classes/MIDI/IO/MIDIFile.src/M000064.html +20 -0
  87. data/html/classes/MIDI/IO/MIDIFile.src/M000065.html +22 -0
  88. data/html/classes/MIDI/IO/MIDIFile.src/M000066.html +30 -0
  89. data/html/classes/MIDI/IO/MIDIFile.src/M000067.html +18 -0
  90. data/html/classes/MIDI/IO/MIDIFile.src/M000068.html +20 -0
  91. data/html/classes/MIDI/IO/MIDIFile.src/M000069.html +18 -0
  92. data/html/classes/MIDI/IO/MIDIFile.src/M000070.html +18 -0
  93. data/html/classes/MIDI/IO/SeqReader.html +460 -0
  94. data/html/classes/MIDI/IO/SeqReader.src/M000001.html +22 -0
  95. data/html/classes/MIDI/IO/SeqReader.src/M000002.html +22 -0
  96. data/html/classes/MIDI/IO/SeqReader.src/M000003.html +21 -0
  97. data/html/classes/MIDI/IO/SeqReader.src/M000004.html +34 -0
  98. data/html/classes/MIDI/IO/SeqReader.src/M000005.html +26 -0
  99. data/html/classes/MIDI/IO/SeqReader.src/M000006.html +28 -0
  100. data/html/classes/MIDI/IO/SeqReader.src/M000007.html +21 -0
  101. data/html/classes/MIDI/IO/SeqReader.src/M000008.html +19 -0
  102. data/html/classes/MIDI/IO/SeqReader.src/M000009.html +19 -0
  103. data/html/classes/MIDI/IO/SeqReader.src/M000010.html +19 -0
  104. data/html/classes/MIDI/IO/SeqReader.src/M000011.html +19 -0
  105. data/html/classes/MIDI/IO/SeqReader.src/M000012.html +19 -0
  106. data/html/classes/MIDI/IO/SeqReader.src/M000013.html +18 -0
  107. data/html/classes/MIDI/IO/SeqReader.src/M000014.html +18 -0
  108. data/html/classes/MIDI/IO/SeqReader.src/M000015.html +27 -0
  109. data/html/classes/MIDI/IO/SeqReader.src/M000016.html +18 -0
  110. data/html/classes/MIDI/IO/SeqReader.src/M000017.html +18 -0
  111. data/html/classes/MIDI/IO/SeqReader.src/M000018.html +18 -0
  112. data/html/classes/MIDI/IO/SeqWriter.html +267 -0
  113. data/html/classes/MIDI/IO/SeqWriter.src/M000019.html +19 -0
  114. data/html/classes/MIDI/IO/SeqWriter.src/M000020.html +25 -0
  115. data/html/classes/MIDI/IO/SeqWriter.src/M000021.html +22 -0
  116. data/html/classes/MIDI/IO/SeqWriter.src/M000022.html +54 -0
  117. data/html/classes/MIDI/IO/SeqWriter.src/M000023.html +49 -0
  118. data/html/classes/MIDI/IO/SeqWriter.src/M000024.html +21 -0
  119. data/html/classes/MIDI/IO/SeqWriter.src/M000025.html +19 -0
  120. data/html/classes/MIDI/IO/SeqWriter.src/M000026.html +24 -0
  121. data/html/classes/MIDI/IO/SeqWriter.src/M000027.html +26 -0
  122. data/html/classes/MIDI/Marker.html +139 -0
  123. data/html/classes/MIDI/Marker.src/M000107.html +18 -0
  124. data/html/classes/MIDI/MetaEvent.html +189 -0
  125. data/html/classes/MIDI/MetaEvent.src/M000167.html +21 -0
  126. data/html/classes/MIDI/MetaEvent.src/M000168.html +23 -0
  127. data/html/classes/MIDI/MetaEvent.src/M000169.html +53 -0
  128. data/html/classes/MIDI/NoteEvent.html +233 -0
  129. data/html/classes/MIDI/NoteEvent.src/M000091.html +21 -0
  130. data/html/classes/MIDI/NoteEvent.src/M000092.html +20 -0
  131. data/html/classes/MIDI/NoteEvent.src/M000093.html +18 -0
  132. data/html/classes/MIDI/NoteEvent.src/M000094.html +22 -0
  133. data/html/classes/MIDI/NoteOffEvent.html +169 -0
  134. data/html/classes/MIDI/NoteOffEvent.src/M000086.html +19 -0
  135. data/html/classes/MIDI/NoteOffEvent.src/M000087.html +19 -0
  136. data/html/classes/MIDI/NoteOnEvent.html +169 -0
  137. data/html/classes/MIDI/NoteOnEvent.src/M000102.html +19 -0
  138. data/html/classes/MIDI/NoteOnEvent.src/M000103.html +19 -0
  139. data/html/classes/MIDI/PitchBend.html +184 -0
  140. data/html/classes/MIDI/PitchBend.src/M000104.html +19 -0
  141. data/html/classes/MIDI/PitchBend.src/M000105.html +22 -0
  142. data/html/classes/MIDI/PitchBend.src/M000106.html +18 -0
  143. data/html/classes/MIDI/PolyPressure.html +186 -0
  144. data/html/classes/MIDI/PolyPressure.src/M000170.html +18 -0
  145. data/html/classes/MIDI/PolyPressure.src/M000171.html +18 -0
  146. data/html/classes/MIDI/PolyPressure.src/M000172.html +18 -0
  147. data/html/classes/MIDI/PolyPressure.src/M000173.html +19 -0
  148. data/html/classes/MIDI/ProgramChange.html +184 -0
  149. data/html/classes/MIDI/ProgramChange.src/M000099.html +19 -0
  150. data/html/classes/MIDI/ProgramChange.src/M000100.html +21 -0
  151. data/html/classes/MIDI/ProgramChange.src/M000101.html +18 -0
  152. data/html/classes/MIDI/Realtime.html +171 -0
  153. data/html/classes/MIDI/Realtime.src/M000083.html +19 -0
  154. data/html/classes/MIDI/Realtime.src/M000084.html +20 -0
  155. data/html/classes/MIDI/Realtime.src/M000085.html +18 -0
  156. data/html/classes/MIDI/Sequence.html +469 -0
  157. data/html/classes/MIDI/Sequence.src/M000108.html +28 -0
  158. data/html/classes/MIDI/Sequence.src/M000109.html +21 -0
  159. data/html/classes/MIDI/Sequence.src/M000110.html +22 -0
  160. data/html/classes/MIDI/Sequence.src/M000113.html +18 -0
  161. data/html/classes/MIDI/Sequence.src/M000114.html +27 -0
  162. data/html/classes/MIDI/Sequence.src/M000115.html +18 -0
  163. data/html/classes/MIDI/Sequence.src/M000116.html +19 -0
  164. data/html/classes/MIDI/Sequence.src/M000117.html +19 -0
  165. data/html/classes/MIDI/Sequence.src/M000118.html +20 -0
  166. data/html/classes/MIDI/Sequence.src/M000119.html +19 -0
  167. data/html/classes/MIDI/Sequence.src/M000120.html +18 -0
  168. data/html/classes/MIDI/SongPointer.html +184 -0
  169. data/html/classes/MIDI/SongPointer.src/M000138.html +19 -0
  170. data/html/classes/MIDI/SongPointer.src/M000139.html +22 -0
  171. data/html/classes/MIDI/SongPointer.src/M000140.html +18 -0
  172. data/html/classes/MIDI/SongSelect.html +184 -0
  173. data/html/classes/MIDI/SongSelect.src/M000126.html +19 -0
  174. data/html/classes/MIDI/SongSelect.src/M000127.html +21 -0
  175. data/html/classes/MIDI/SongSelect.src/M000128.html +18 -0
  176. data/html/classes/MIDI/Start.html +156 -0
  177. data/html/classes/MIDI/Start.src/M000097.html +18 -0
  178. data/html/classes/MIDI/Start.src/M000098.html +18 -0
  179. data/html/classes/MIDI/Stop.html +156 -0
  180. data/html/classes/MIDI/Stop.src/M000095.html +18 -0
  181. data/html/classes/MIDI/Stop.src/M000096.html +18 -0
  182. data/html/classes/MIDI/SystemCommon.html +139 -0
  183. data/html/classes/MIDI/SystemCommon.src/M000144.html +19 -0
  184. data/html/classes/MIDI/SystemExclusive.html +184 -0
  185. data/html/classes/MIDI/SystemExclusive.src/M000141.html +19 -0
  186. data/html/classes/MIDI/SystemExclusive.src/M000142.html +23 -0
  187. data/html/classes/MIDI/SystemExclusive.src/M000143.html +18 -0
  188. data/html/classes/MIDI/SystemReset.html +156 -0
  189. data/html/classes/MIDI/SystemReset.src/M000081.html +18 -0
  190. data/html/classes/MIDI/SystemReset.src/M000082.html +18 -0
  191. data/html/classes/MIDI/Tempo.html +250 -0
  192. data/html/classes/MIDI/Tempo.src/M000158.html +18 -0
  193. data/html/classes/MIDI/Tempo.src/M000159.html +18 -0
  194. data/html/classes/MIDI/Tempo.src/M000160.html +18 -0
  195. data/html/classes/MIDI/Tempo.src/M000161.html +18 -0
  196. data/html/classes/MIDI/Tempo.src/M000162.html +18 -0
  197. data/html/classes/MIDI/Tempo.src/M000163.html +25 -0
  198. data/html/classes/MIDI/Tempo.src/M000164.html +18 -0
  199. data/html/classes/MIDI/Track.html +380 -0
  200. data/html/classes/MIDI/Track.src/M000071.html +23 -0
  201. data/html/classes/MIDI/Track.src/M000072.html +21 -0
  202. data/html/classes/MIDI/Track.src/M000073.html +26 -0
  203. data/html/classes/MIDI/Track.src/M000074.html +18 -0
  204. data/html/classes/MIDI/Track.src/M000075.html +22 -0
  205. data/html/classes/MIDI/Track.src/M000076.html +20 -0
  206. data/html/classes/MIDI/Track.src/M000077.html +22 -0
  207. data/html/classes/MIDI/Track.src/M000078.html +22 -0
  208. data/html/classes/MIDI/Track.src/M000079.html +18 -0
  209. data/html/classes/MIDI/Track.src/M000080.html +19 -0
  210. data/html/classes/MIDI/TuneRequest.html +171 -0
  211. data/html/classes/MIDI/TuneRequest.src/M000121.html +18 -0
  212. data/html/classes/MIDI/TuneRequest.src/M000122.html +20 -0
  213. data/html/classes/MIDI/TuneRequest.src/M000123.html +18 -0
  214. data/html/classes/MIDI/Utils.html +190 -0
  215. data/html/classes/MIDI/Utils.src/M000165.html +20 -0
  216. data/html/classes/MIDI/Utils.src/M000166.html +25 -0
  217. data/html/created.rid +1 -0
  218. data/html/files/README.html +599 -0
  219. data/html/files/TODO.html +142 -0
  220. data/html/files/lib/midilib/consts_rb.html +107 -0
  221. data/html/files/lib/midilib/event_rb.html +109 -0
  222. data/html/files/lib/midilib/info_rb.html +101 -0
  223. data/html/files/lib/midilib/io/midifile_rb.html +108 -0
  224. data/html/files/lib/midilib/io/seqreader_rb.html +110 -0
  225. data/html/files/lib/midilib/io/seqwriter_rb.html +115 -0
  226. data/html/files/lib/midilib/sequence_rb.html +109 -0
  227. data/html/files/lib/midilib/track_rb.html +108 -0
  228. data/html/files/lib/midilib/utils_rb.html +101 -0
  229. data/html/files/lib/midilib_rb.html +124 -0
  230. data/html/fr_class_index.html +59 -0
  231. data/html/fr_file_index.html +38 -0
  232. data/html/fr_method_index.html +199 -0
  233. data/html/index.html +24 -0
  234. data/html/rdoc-style.css +208 -0
  235. data/install.rb +57 -0
  236. data/lib/midilib.rb +16 -0
  237. data/lib/midilib/consts.rb +422 -0
  238. data/lib/midilib/event.rb +559 -0
  239. data/lib/midilib/info.rb +9 -0
  240. data/lib/midilib/io/midifile.rb +446 -0
  241. data/lib/midilib/io/seqreader.rb +198 -0
  242. data/lib/midilib/io/seqwriter.rb +151 -0
  243. data/lib/midilib/sequence.rb +144 -0
  244. data/lib/midilib/track.rb +115 -0
  245. data/lib/midilib/utils.rb +36 -0
  246. data/test/event_equality.rb +81 -0
  247. data/test/test_event.rb +116 -0
  248. data/test/test_io.rb +55 -0
  249. data/test/test_sequence.rb +68 -0
  250. data/test/test_track.rb +111 -0
  251. data/test/test_varlen.rb +40 -0
  252. metadata +330 -0
@@ -0,0 +1,559 @@
1
+ require 'midilib/consts'
2
+ require 'midilib/utils'
3
+
4
+ module MIDI
5
+
6
+ # The abstract superclass of all MIDI events.
7
+ class Event
8
+ # Modifying delta_time does not affect time_from_start. You need to call
9
+ # the event's track's +recalc_time+ method.
10
+ attr_accessor :delta_time
11
+ # The start time of this event from the beginning of the track. This value
12
+ # is held here but is maintained by the track.
13
+ attr_accessor :time_from_start
14
+ # The MIDI status byte. Never includes the channel, which is held
15
+ # separately by MIDI::ChannelEvent.
16
+ attr_reader :status
17
+
18
+ # Determines if to_s outputs hex note numbers (false, the default) or
19
+ # decimal note names (true).
20
+ attr_accessor :print_note_names
21
+
22
+ # Determines if to_s outputs numbers as hex (false, the default) or
23
+ # decimal # (true). Delta times are always printed as decimal.
24
+ attr_accessor :print_decimal_numbers
25
+
26
+ def initialize(status = 0, delta_time = 0)
27
+ @status = status
28
+ @delta_time = delta_time
29
+ @is_channel = false # the majority of events are channel events
30
+ @is_note = false # note on, note off, and poly press return true
31
+ @is_note_on = false
32
+ @is_note_off = false
33
+ @is_meta = false
34
+ @is_system = false
35
+ @is_realtime = false
36
+ @time_from_start = 0 # maintained by tracks
37
+ end
38
+ protected :initialize
39
+
40
+ # Returns the raw bytes that are written to a MIDI file or output to a
41
+ # MIDI stream. In MIDI::EVENT this raises a "subclass responsibility"
42
+ # exception.
43
+ def data_as_bytes
44
+ raise "subclass responsibility"
45
+ end
46
+
47
+ # Returns +true+ if this is a channel event.
48
+ def channel?
49
+ return @is_channel
50
+ end
51
+
52
+ # Returns +true+ if this is a note on, note off, or polyphonic pressure
53
+ # event.
54
+ def note?
55
+ return @is_note
56
+ end
57
+
58
+ # Returns +true+ if this is a note on event.
59
+ def note_on?
60
+ @is_note_on
61
+ end
62
+
63
+ # Returns +true+ if this is a note off event.
64
+ def note_off?
65
+ @is_note_off
66
+ end
67
+
68
+ # Returns +true+ if this is a meta event.
69
+ def meta?
70
+ return @is_meta
71
+ end
72
+
73
+ # Returns +true+ if this is a system message event.
74
+ def system?
75
+ return @is_system
76
+ end
77
+
78
+ # Returns +true+ if this is a realtime status byte.
79
+
80
+ def realtime?
81
+ return @is_realtime
82
+ end
83
+
84
+ # Quantize this event's time_from_start by moving it to the nearest
85
+ # multiple of +boundary+. See MIDI::Track#quantize. *Note*: does not
86
+ # modify the event's delta_time, though MIDI::Track#quantize calls
87
+ # recalc_delta_from_times after it asks each event to quantize itself.
88
+ def quantize_to(boundary)
89
+ diff = @time_from_start % boundary
90
+ @time_from_start -= diff
91
+ if diff >= boundary / 2
92
+ @time_from_start += boundary
93
+ end
94
+ end
95
+
96
+ # For sorting. Uses @time_from_start, which is maintained by this event's
97
+ # track. I'm not sure this is necessary, since each track has to
98
+ # maintain its events' time-from-start values anyway.
99
+ def <=>(an_event)
100
+ return @time_from_start <=> an_event.time_from_start
101
+ end
102
+
103
+ # Returns +val+ as a decimal or hex string, depending upon the value of
104
+ # @print_decimal_numbers.
105
+ def number_to_s(val)
106
+ return @print_decimal_numbers ? val.to_s : ('%02x' % val)
107
+ end
108
+
109
+ def to_s
110
+ "#{@delta_time}: "
111
+ end
112
+ end
113
+
114
+ # The abstract superclass of all channel events (events that have a MIDI
115
+ # channel, like notes and program changes).
116
+ class ChannelEvent < Event
117
+ # MIDI channel, 0-15.
118
+ attr_accessor :channel
119
+
120
+ def initialize(status, channel, delta_time)
121
+ super(status, delta_time)
122
+ @channel = channel
123
+ @is_channel = true
124
+ end
125
+ protected :initialize
126
+
127
+ def to_s
128
+ return super << "ch #{number_to_s(@channel)} "
129
+ end
130
+
131
+ end
132
+
133
+ # The abstract superclass of all note on, and note off, and polyphonic
134
+ # pressure events.
135
+ class NoteEvent < ChannelEvent
136
+ attr_accessor :note, :velocity
137
+ def initialize(status, channel, note, velocity, delta_time)
138
+ super(status, channel, delta_time)
139
+ @note = note
140
+ @velocity = velocity
141
+ @is_note = true
142
+ end
143
+ protected :initialize
144
+
145
+ PITCHES = %w(C C# D D# E F F# G G# A A# B)
146
+
147
+ # Returns note name as a pitch/octave string like "C4" or "F#6".
148
+ def pch_oct(val=@note)
149
+ pch = val % 12
150
+ oct = (val / 12) - 1
151
+ "#{PITCHES[pch]}#{oct}"
152
+ end
153
+
154
+ # If @print_note_names is true, returns pch_oct(val) else returns value
155
+ # as a number using number_to_s.
156
+ def note_to_s
157
+ return @print_note_names ? pch_oct(@note) : number_to_s(@note)
158
+ end
159
+
160
+ def data_as_bytes
161
+ data = ''
162
+ data << (@status + @channel)
163
+ data << @note
164
+ data << @velocity
165
+ return data
166
+ end
167
+ end
168
+
169
+ class NoteOnEvent < NoteEvent
170
+ attr_accessor :off
171
+ def initialize(channel = 0, note = 64, velocity = 64, delta_time = 0)
172
+ super(NOTE_ON, channel, note, velocity, delta_time)
173
+ @is_note_on = true
174
+ end
175
+ def to_s
176
+ return super <<
177
+ "on #{note_to_s} #{number_to_s(@velocity)}"
178
+ end
179
+ end
180
+
181
+ class NoteOffEvent < NoteEvent
182
+ attr_accessor :on
183
+ def initialize(channel = 0, note = 64, velocity = 64, delta_time = 0)
184
+ super(NOTE_OFF, channel, note, velocity, delta_time)
185
+ @is_note_off = true
186
+ end
187
+ def to_s
188
+ return super <<
189
+ "off #{note_to_s} #{number_to_s(@velocity)}"
190
+ end
191
+ end
192
+
193
+ class PolyPressure < NoteEvent
194
+ def initialize(channel = 0, note = 64, value = 0, delta_time = 0)
195
+ super(POLY_PRESSSURE, channel, note, value, delta_time)
196
+ end
197
+
198
+ def pressure
199
+ return @velocity
200
+ end
201
+ def pressure=(val)
202
+ @velocity = val
203
+ end
204
+ def to_s
205
+ return super <<
206
+ "poly press #{number_to_s(@channel)} #{note_to_s} #{number_to_s(@velocity)}"
207
+ end
208
+ end
209
+
210
+ class Controller < ChannelEvent
211
+ attr_accessor :controller, :value
212
+
213
+ def initialize(channel = 0, controller = 0, value = 0, delta_time = 0)
214
+ super(CONTROLLER, channel, delta_time)
215
+ @controller = controller
216
+ @value = value
217
+ @is_controller = true
218
+ end
219
+
220
+ def data_as_bytes
221
+ data = ''
222
+ data << (@status + @channel)
223
+ data << @controller
224
+ data << @value
225
+ return data
226
+ end
227
+
228
+ def to_s
229
+ return super << "cntl #{number_to_s(@controller)} #{number_to_s(@value)}"
230
+ end
231
+ end
232
+
233
+ class ProgramChange < ChannelEvent
234
+ attr_accessor :program
235
+
236
+ def initialize(channel = 0, program = 0, delta_time = 0)
237
+ super(PROGRAM_CHANGE, channel, delta_time)
238
+ @program = program
239
+ end
240
+
241
+ def data_as_bytes
242
+ data = ''
243
+ data << (@status + @channel)
244
+ data << @program
245
+ return data
246
+ end
247
+
248
+ def to_s
249
+ return super << "prog #{number_to_s(@program)}"
250
+ end
251
+ end
252
+
253
+ class ChannelPressure < ChannelEvent
254
+ attr_accessor :pressure
255
+
256
+ def initialize(channel = 0, pressure = 0, delta_time = 0)
257
+ super(CHANNEL_PRESSURE, channel, delta_time)
258
+ @pressure = pressure
259
+ end
260
+
261
+ def data_as_bytes
262
+ data = ''
263
+ data << (@status + @channel)
264
+ data << @pressure
265
+ return data
266
+ end
267
+
268
+ def to_s
269
+ return super << "chan press #{number_to_s(@pressure)}"
270
+ end
271
+ end
272
+
273
+ class PitchBend < ChannelEvent
274
+ attr_accessor :value
275
+
276
+ def initialize(channel = 0, value = 0, delta_time = 0)
277
+ super(PITCH_BEND, channel, delta_time)
278
+ @value = value
279
+ end
280
+
281
+ def data_as_bytes
282
+ data = ''
283
+ data << (@status + @channel)
284
+ data << ((@value >> 8) & 0xff) # msb
285
+ data << (@value & 0xff) # lsb
286
+ return data
287
+ end
288
+
289
+ def to_s
290
+ return super << "pb #{number_to_s(@value)}"
291
+ end
292
+ end
293
+
294
+ class SystemCommon < Event
295
+ def initialize(status, delta_time)
296
+ super(status, delta_time)
297
+ @is_system = true
298
+ end
299
+ end
300
+
301
+ class SystemExclusive < SystemCommon
302
+ attr_accessor :data
303
+
304
+ def initialize(data, delta_time = 0)
305
+ super(SYSEX, delta_time)
306
+ @data = data
307
+ end
308
+
309
+ def data_as_bytes
310
+ data = ''
311
+ data << @status
312
+ data << Utils.as_var_len(@data.length)
313
+ data << @data
314
+ data << EOX
315
+ return data
316
+ end
317
+
318
+ def to_s
319
+ return super << "sys ex"
320
+ end
321
+ end
322
+
323
+ class SongPointer < SystemCommon
324
+ attr_accessor :pointer
325
+
326
+ def initialize(pointer = 0, delta_time = 0)
327
+ super(SONG_POINTER, delta_time)
328
+ @pointer = pointer
329
+ end
330
+
331
+ def data_as_bytes
332
+ data = ''
333
+ data << @status
334
+ data << ((@pointer >> 8) & 0xff)
335
+ data << (@pointer & 0xff)
336
+ return data
337
+ end
338
+
339
+ def to_s
340
+ return super << "song ptr #{number_to_s(@pointer)}"
341
+ end
342
+ end
343
+
344
+ class SongSelect < SystemCommon
345
+ attr_accessor :song
346
+
347
+ def initialize(song = 0, delta_time = 0)
348
+ super(SONG_SELECT, delta_time)
349
+ @song = song
350
+ end
351
+
352
+ def data_as_bytes
353
+ data = ''
354
+ data << @status
355
+ data << @song
356
+ return data
357
+ end
358
+
359
+ def to_s
360
+ return super << "song sel #{number_to_s(@song)}"
361
+ end
362
+ end
363
+
364
+ class TuneRequest < SystemCommon
365
+ def initialize(delta_time = 0)
366
+ super(TUNE_REQUEST, delta_time)
367
+ end
368
+
369
+ def data_as_bytes
370
+ data = ''
371
+ data << @status
372
+ return data
373
+ end
374
+
375
+ def to_s
376
+ return super << "tune req"
377
+ end
378
+ end
379
+
380
+ class Realtime < Event
381
+ def initialize(status, delta_time)
382
+ super(status, delta_time)
383
+ @is_realtime = true
384
+ end
385
+
386
+ def data_as_bytes
387
+ data = ''
388
+ data << @status
389
+ return data
390
+ end
391
+
392
+ def to_s
393
+ return super << "realtime #{number_to_s(@status)}"
394
+ end
395
+ end
396
+
397
+ class Clock < Realtime
398
+ def initialize(delta_time = 0)
399
+ super(CLOCK, delta_time)
400
+ end
401
+
402
+ def to_s
403
+ return super << "clock"
404
+ end
405
+ end
406
+
407
+ class Start < Realtime
408
+ def initialize(delta_time = 0)
409
+ super(START, delta_time)
410
+ end
411
+ def to_s
412
+ return super << "start"
413
+ end
414
+ end
415
+
416
+ class Continue < Realtime
417
+ def initialize(delta_time = 0)
418
+ super(CONTINUE, delta_time)
419
+ end
420
+ def to_s
421
+ return super << "continue"
422
+ end
423
+ end
424
+
425
+ class Stop < Realtime
426
+ def initialize(delta_time = 0)
427
+ super(STOP, delta_time)
428
+ end
429
+ def to_s
430
+ return super << "stop"
431
+ end
432
+ end
433
+
434
+ class ActiveSense < Realtime
435
+ def initialize(delta_time = 0)
436
+ super(ACTIVE_SENSE, delta_time)
437
+ end
438
+ def to_s
439
+ return super << "act sens"
440
+ end
441
+ end
442
+
443
+ class SystemReset < Realtime
444
+ def initialize(delta_time = 0)
445
+ super(SYSTEM_RESET, delta_time)
446
+ end
447
+ def to_s
448
+ return super << "sys reset"
449
+ end
450
+ end
451
+
452
+ class MetaEvent < Event
453
+ attr_reader :meta_type
454
+ attr_accessor :data
455
+
456
+ def initialize(meta_type, data = nil, delta_time = 0)
457
+ super(META_EVENT, delta_time)
458
+ @meta_type = meta_type
459
+ @data = data
460
+ @is_meta = true
461
+ end
462
+
463
+ def data_as_bytes
464
+ data = ''
465
+ data << @status
466
+ data << @meta_type
467
+ data << (@data ? Utils.as_var_len(@data.length) : 0)
468
+ data << @data if @data
469
+ return data
470
+ end
471
+
472
+ def to_s
473
+ str = super()
474
+ str << "meta #{number_to_s(@meta_type)} "
475
+ # I know, I know...this isn't OO.
476
+ case @meta_type
477
+ when META_SEQ_NUM
478
+ str << "sequence number"
479
+ when META_TEXT
480
+ str << "text: #{@data}"
481
+ when META_COPYRIGHT
482
+ str << "copyright: #{@data}"
483
+ when META_SEQ_NAME
484
+ str << "sequence or track name: #{@data}"
485
+ when META_INSTRUMENT
486
+ str << "instrument name: #{@data}"
487
+ when META_LYRIC
488
+ str << "lyric: #{@data}"
489
+ when META_MARKER
490
+ str << "marker: #{@data}"
491
+ when META_CUE
492
+ str << "cue point: #{@data}"
493
+ when META_TRACK_END
494
+ str << "track end"
495
+ # when META_SET_TEMPO
496
+ # str << "set tempo: #{@data}"
497
+ when META_SMPTE
498
+ str << "smpte"
499
+ when META_TIME_SIG
500
+ str << "time signature"
501
+ when META_KEY_SIG
502
+ str << "key signature"
503
+ when META_SEQ_SPECIF
504
+ str << "sequence specific"
505
+ else
506
+ str << "(other)"
507
+ end
508
+ return str
509
+ end
510
+ end
511
+
512
+ class Marker < MetaEvent
513
+ def initialize(msg, delta_time = 0)
514
+ super(META_MARKER, msg, delta_time)
515
+ end
516
+ end
517
+
518
+ class Tempo < MetaEvent
519
+
520
+ MICROSECS_PER_MINUTE = 1_000_000 * 60
521
+
522
+ # Translates beats per minute to microseconds per quarter note (beat).
523
+ def Tempo.bpm_to_mpq(bpm)
524
+ return MICROSECS_PER_MINUTE / bpm
525
+ end
526
+
527
+ # Translates microseconds per quarter note (beat) to beats per minute.
528
+ def Tempo.mpq_to_bpm(mpq)
529
+ return MICROSECS_PER_MINUTE / mpq
530
+ end
531
+
532
+ def initialize(msecs_per_qnote, delta_time = 0)
533
+ super(META_SET_TEMPO, msecs_per_qnote, delta_time)
534
+ end
535
+
536
+ def tempo
537
+ return @data
538
+ end
539
+
540
+ def tempo=(val)
541
+ @data = val
542
+ end
543
+
544
+ def data_as_bytes
545
+ data = ''
546
+ data << @status
547
+ data << @meta_type
548
+ data << 3
549
+ data << ((@data >> 16) & 0xff)
550
+ data << ((@data >> 8) & 0xff)
551
+ data << (@data & 0xff)
552
+ return data
553
+ end
554
+
555
+ def to_s
556
+ "tempo #{@data} msecs per qnote (#{Tempo.mpq_to_bpm(@data)} bpm)"
557
+ end
558
+ end
559
+ end