comparison Syncopation models/readmidi.py @ 6:ac882f5e6a11

adding new bits for midi and music objects
author christopherh <christopher.harte@eecs.qmul.ac.uk>
date Tue, 31 Mar 2015 16:59:45 +0100
parents
children a3ed7d2b57d8
comparison
equal deleted inserted replaced
5:062d4b628454 6:ac882f5e6a11
1 # -*- coding: utf-8 -*-
2 """
3 Created on Sat Mar 21 22:19:52 2015
4
5 @author: christopherh
6 """
7
8 from midiparser import MidiFile, MidiTrack, DeltaTime, MidiEvent
9 #from RhythmParser import Bar
10
11 from MusicObjects import *
12
13
14
15
16
17 def readMidiFile(filename):
18 """ open and read a MIDI file, return a MidiFile object """
19
20 #create a midifile object, open and read a midi file
21 midiFile = MidiFile()
22 midiFile.open(filename, 'rb')
23 midiFile.read()
24 midiFile.close()
25
26 return midiFile
27
28 def getBars(midiFile, trackindex=1):
29
30 track = midiFile.tracks[trackindex] # ignore dummy track 0
31 eventIdx = 0
32 numNotes = 0
33
34 noteonlist = []
35 noteOnFound==True
36
37 while noteOnFound==True:
38 (noteOnIdx, noteOnDelta, noteOnFound) = self.findEvent(track, eventIdx, lambda e: e.type == 'NOTE_ON')
39 noteEvent = track.events[noteOnIdx]
40 eventIdx = noteOnIdx + 1
41
42
43
44
45
46
47 def findEvent(track, eventStartIdx, lambdaExpr):
48 '''
49 From code by Csaba Sulyok:
50 Finds MIDI event based on lambda expression, starting from a given index.
51 Returns a tuple of the following 3 elements:
52 1. event index where the lambda expression is true
53 2. aggregate delta time from event start index until the found event
54 3. flag whether or not any value was found, or we've reached the end of the event queue
55 '''
56
57 eventIdx = eventStartIdx
58 deltaTime = 0
59 while eventIdx < len(track.events) and not lambdaExpr(track.events[eventIdx]):
60 if track.events[eventIdx].type == 'DeltaTime':
61 deltaTime += track.events[eventIdx].time
62 eventIdx += 1
63
64 success = eventIdx < len(track.events)
65 return (eventIdx, deltaTime, success)
66
67