Mercurial > hg > syncopation-dataset
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 |