Package echonest :: Package remix :: Package support :: Package midi :: Module MidiOutStream
[hide private]
[frames] | no frames]

Source Code for Module echonest.remix.support.midi.MidiOutStream

  1  # -*- coding: ISO-8859-1 -*-
 
  2  
 
3 -class MidiOutStream:
4 5 6 """ 7 8 MidiOutstream is Basically an eventhandler. It is the most central 9 class in the Midi library. You use it both for writing events to 10 an output stream, and as an event handler for an input stream. 11 12 This makes it extremely easy to take input from one stream and 13 send it to another. Ie. if you want to read a Midi file, do some 14 processing, and send it to a midiport. 15 16 All time values are in absolute values from the opening of a 17 stream. To calculate time values, please use the MidiTime and 18 MidiDeltaTime classes. 19 20 """ 21
22 - def __init__(self):
23 24 # the time is rather global, so it needs to be stored 25 # here. Otherwise there would be no really simple way to 26 # calculate it. The alternative would be to have each event 27 # handler do it. That sucks even worse! 28 self._absolute_time = 0 29 self._relative_time = 0 30 self._current_track = 0 31 self._running_status = None
32 33 # time handling event handlers. They should be overwritten with care 34
35 - def update_time(self, new_time=0, relative=1):
36 """ 37 Updates the time, if relative is true, new_time is relative, 38 else it's absolute. 39 """ 40 if relative: 41 self._relative_time = new_time 42 self._absolute_time += new_time 43 else: 44 self._relative_time = new_time - self._absolute_time 45 self._absolute_time = new_time
46
47 - def reset_time(self):
48 """ 49 reset time to 0 50 """ 51 self._relative_time = 0 52 self._absolute_time = 0
53
54 - def rel_time(self):
55 "Returns the relative time" 56 return self._relative_time
57
58 - def abs_time(self):
59 "Returns the absolute time" 60 return self._absolute_time
61 62 # running status methods 63
64 - def reset_run_stat(self):
65 "Invalidates the running status" 66 self._running_status = None
67
68 - def set_run_stat(self, new_status):
69 "Set the new running status" 70 self._running_status = new_status
71
72 - def get_run_stat(self):
73 "Set the new running status" 74 return self._running_status
75 76 # track handling event handlers 77
78 - def set_current_track(self, new_track):
79 "Sets the current track number" 80 self._current_track = new_track
81
82 - def get_current_track(self):
83 "Returns the current track number" 84 return self._current_track
85 86 87 ##################### 88 ## Midi events 89 90
91 - def channel_message(self, message_type, channel, data):
92 """The default event handler for channel messages""" 93 pass
94 95
96 - def note_on(self, channel=0, note=0x40, velocity=0x40):
97 98 """ 99 channel: 0-15 100 note, velocity: 0-127 101 """ 102 pass
103 104
105 - def note_off(self, channel=0, note=0x40, velocity=0x40):
106 107 """ 108 channel: 0-15 109 note, velocity: 0-127 110 """ 111 pass
112 113
114 - def aftertouch(self, channel=0, note=0x40, velocity=0x40):
115 116 """ 117 channel: 0-15 118 note, velocity: 0-127 119 """ 120 pass
121 122
123 - def continuous_controller(self, channel, controller, value):
124 125 """ 126 channel: 0-15 127 controller, value: 0-127 128 """ 129 pass
130 131
132 - def patch_change(self, channel, patch):
133 134 """ 135 channel: 0-15 136 patch: 0-127 137 """ 138 pass
139 140
141 - def channel_pressure(self, channel, pressure):
142 143 """ 144 channel: 0-15 145 pressure: 0-127 146 """ 147 pass
148 149
150 - def pitch_bend(self, channel, value):
151 152 """ 153 channel: 0-15 154 value: 0-16383 155 156 """ 157 pass
158 159 160 161 162 ##################### 163 ## System Exclusive 164
165 - def system_exclusive(self, data):
166 167 """ 168 data: list of values in range(128) 169 """ 170 pass
171 172 173 ##################### 174 ## Common events 175
176 - def song_position_pointer(self, value):
177 178 """ 179 value: 0-16383 180 """ 181 pass
182 183
184 - def song_select(self, songNumber):
185 186 """ 187 songNumber: 0-127 188 """ 189 pass
190 191
192 - def tuning_request(self):
193 194 """ 195 No values passed 196 """ 197 pass
198 199
200 - def midi_time_code(self, msg_type, values):
201 """ 202 msg_type: 0-7 203 values: 0-15 204 """ 205 pass
206 207 208 ######################### 209 # header does not really belong here. But anyhoo!!! 210
211 - def header(self, format=0, nTracks=1, division=96):
212 213 """ 214 format: type of midi file in [1,2] 215 nTracks: number of tracks 216 division: timing division 217 """ 218 pass
219 220
221 - def eof(self):
222 223 """ 224 End of file. No more events to be processed. 225 """ 226 pass
227 228 229 ##################### 230 ## meta events 231 232
233 - def meta_event(self, meta_type, data):
234 235 """ 236 Handles any undefined meta events 237 """ 238 pass
239 240
241 - def start_of_track(self, n_track=0):
242 243 """ 244 n_track: number of track 245 """ 246 pass
247 248
249 - def end_of_track(self):
250 251 """ 252 n_track: number of track 253 """ 254 pass
255 256
257 - def sequence_number(self, value):
258 259 """ 260 value: 0-16383 261 """ 262 pass
263 264
265 - def text(self, text):
266 267 """ 268 Text event 269 text: string 270 """ 271 pass
272 273
274 - def copyright(self, text):
275 276 """ 277 Copyright notice 278 text: string 279 """ 280 pass
281 282
283 - def sequence_name(self, text):
284 285 """ 286 Sequence/track name 287 text: string 288 """ 289 pass
290 291
292 - def instrument_name(self, text):
293 294 """ 295 text: string 296 """ 297 pass
298 299
300 - def lyric(self, text):
301 302 """ 303 text: string 304 """ 305 pass
306 307
308 - def marker(self, text):
309 310 """ 311 text: string 312 """ 313 pass
314 315
316 - def cuepoint(self, text):
317 318 """ 319 text: string 320 """ 321 pass
322 323
324 - def midi_ch_prefix(self, channel):
325 326 """ 327 channel: midi channel for subsequent data (deprecated in the spec) 328 """ 329 pass
330 331
332 - def midi_port(self, value):
333 334 """ 335 value: Midi port (deprecated in the spec) 336 """ 337 pass
338 339
340 - def tempo(self, value):
341 342 """ 343 value: 0-2097151 344 tempo in us/quarternote 345 (to calculate value from bpm: int(60,000,000.00 / BPM)) 346 """ 347 pass
348 349
350 - def smtp_offset(self, hour, minute, second, frame, framePart):
351 352 """ 353 hour, 354 minute, 355 second: 3 bytes specifying the hour (0-23), minutes (0-59) and 356 seconds (0-59), respectively. The hour should be 357 encoded with the SMPTE format, just as it is in MIDI 358 Time Code. 359 frame: A byte specifying the number of frames per second (one 360 of : 24, 25, 29, 30). 361 framePart: A byte specifying the number of fractional frames, 362 in 100ths of a frame (even in SMPTE-based tracks 363 using a different frame subdivision, defined in the 364 MThd chunk). 365 """ 366 pass
367 368 369
370 - def time_signature(self, nn, dd, cc, bb):
371 372 """ 373 nn: Numerator of the signature as notated on sheet music 374 dd: Denominator of the signature as notated on sheet music 375 The denominator is a negative power of 2: 2 = quarter 376 note, 3 = eighth, etc. 377 cc: The number of MIDI clocks in a metronome click 378 bb: The number of notated 32nd notes in a MIDI quarter note 379 (24 MIDI clocks) 380 """ 381 pass
382 383 384
385 - def key_signature(self, sf, mi):
386 387 """ 388 sf: is a byte specifying the number of flats (-ve) or sharps 389 (+ve) that identifies the key signature (-7 = 7 flats, -1 390 = 1 flat, 0 = key of C, 1 = 1 sharp, etc). 391 mi: is a byte specifying a major (0) or minor (1) key. 392 """ 393 pass
394 395 396
397 - def sequencer_specific(self, data):
398 399 """ 400 data: The data as byte values 401 """ 402 pass
403 404 405 406 407 ##################### 408 ## realtime events 409
410 - def timing_clock(self):
411 412 """ 413 No values passed 414 """ 415 pass
416 417 418
419 - def song_start(self):
420 421 """ 422 No values passed 423 """ 424 pass
425 426 427
428 - def song_stop(self):
429 430 """ 431 No values passed 432 """ 433 pass
434 435 436
437 - def song_continue(self):
438 439 """ 440 No values passed 441 """ 442 pass
443 444 445
446 - def active_sensing(self):
447 448 """ 449 No values passed 450 """ 451 pass
452 453 454
455 - def system_reset(self):
456 457 """ 458 No values passed 459 """ 460 pass
461 462 463 464 if __name__ == '__main__': 465 466 midiOut = MidiOutStream() 467 midiOut.update_time(0,0) 468 midiOut.note_on(0, 63, 127) 469 midiOut.note_off(0, 63, 127) 470