def midiEventsToKeySignature(eventList): '''Convert a single MIDI event into a music21 TimeSignature object. >>> from music21 import * >>> mt = midi.MidiTrack(1) >>> me1 = midi.MidiEvent(mt) >>> me1.type = "KEY_SIGNATURE" >>> me1.data = midi.putNumbersAsList([2, 0]) # d major >>> ks = midiEventsToKeySignature(me1) >>> ks <music21.key.KeySignature of 2 sharps> >>> me2 = midi.MidiEvent(mt) >>> me2.type = "KEY_SIGNATURE" >>> me2.data = midi.putNumbersAsList([-2, 0]) # b- major >>> me2.data '\\xfe\\x00' >>> midi.getNumbersAsList(me2.data) [254, 0] >>> ks = midiEventsToKeySignature(me2) >>> ks <music21.key.KeySignature of 2 flats> ''' # This meta event is used to specify the key (number of sharps or flats) and scale (major or minor) of a sequence. A positive value for the key specifies the number of sharps and a negative value specifies the number of flats. A value of 0 for the scale specifies a major key and a value of 1 specifies a minor key. from music21 import key if not common.isListLike(eventList): event = eventList else: # get the second event; first is delta time event = eventList[1] post = midiModule.getNumbersAsList(event.data) if post[0] > 12: # flip around 256 sharpCount = post[0] - 256 # need negative values else: sharpCount = post[0] environLocal.printDebug(['midiEventsToKeySignature', post, sharpCount]) # first value is number of sharp, or neg for number of flat ks = key.KeySignature(sharpCount) if post[1] == 0: ks.mode = 'major' if post[1] == 1: ks.mode = 'minor' return ks
def midiEventsToTimeSignature(eventList): '''Convert a single MIDI event into a music21 TimeSignature object. >>> from music21 import * >>> mt = midi.MidiTrack(1) >>> me1 = midi.MidiEvent(mt) >>> me1.type = "TIME_SIGNATURE" >>> me1.data = midi.putNumbersAsList([3, 1, 24, 8]) # 3/2 time >>> ts = midiEventsToTimeSignature(me1) >>> ts <music21.meter.TimeSignature 3/2> >>> me2 = midi.MidiEvent(mt) >>> me2.type = "TIME_SIGNATURE" >>> me2.data = midi.putNumbersAsList([3, 4]) # 3/16 time >>> ts = midiEventsToTimeSignature(me2) >>> ts <music21.meter.TimeSignature 3/16> ''' # http://www.sonicspot.com/guide/midifiles.html # The time signature defined with 4 bytes, a numerator, a denominator, a metronome pulse and number of 32nd notes per MIDI quarter-note. The numerator is specified as a literal value, but the denominator is specified as (get ready) the value to which the power of 2 must be raised to equal the number of subdivisions per whole note. For example, a value of 0 means a whole note because 2 to the power of 0 is 1 (whole note), a value of 1 means a half-note because 2 to the power of 1 is 2 (half-note), and so on. #The metronome pulse specifies how often the metronome should click in terms of the number of clock signals per click, which come at a rate of 24 per quarter-note. For example, a value of 24 would mean to click once every quarter-note (beat) and a value of 48 would mean to click once every half-note (2 beats). And finally, the fourth byte specifies the number of 32nd notes per 24 MIDI clock signals. This value is usually 8 because there are usually 8 32nd notes in a quarter-note. At least one Time Signature Event should appear in the first track chunk (or all track chunks in a Type 2 file) before any non-zero delta time events. If one is not specified 4/4, 24, 8 should be assumed. from music21 import meter if not common.isListLike(eventList): event = eventList else: # get the second event; first is delta time event = eventList[1] # time signature is 4 byte encoding post = midiModule.getNumbersAsList(event.data) n = post[0] d = pow(2, post[1]) ts = meter.TimeSignature('%s/%s' % (n, d)) return ts