diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Syncopation models/readmidi.py	Tue Mar 31 16:59:45 2015 +0100
@@ -0,0 +1,67 @@
+# -*- coding: utf-8 -*-
+"""
+Created on Sat Mar 21 22:19:52 2015
+
+@author: christopherh
+"""
+
+from midiparser import MidiFile, MidiTrack, DeltaTime, MidiEvent
+#from RhythmParser import Bar
+
+from MusicObjects import *
+
+
+
+
+
+def readMidiFile(filename):
+	""" open and read a MIDI file, return a MidiFile object """
+
+	#create a midifile object, open and read a midi file
+	midiFile = MidiFile()
+	midiFile.open(filename, 'rb')
+	midiFile.read()
+	midiFile.close()
+
+	return midiFile
+
+def getBars(midiFile, trackindex=1):
+
+	track = midiFile.tracks[trackindex] # ignore dummy track 0
+	eventIdx = 0
+	numNotes = 0
+
+	noteonlist = []
+	noteOnFound==True
+
+	while noteOnFound==True:
+		(noteOnIdx, noteOnDelta, noteOnFound) = self.findEvent(track, eventIdx, lambda e: e.type == 'NOTE_ON')
+		noteEvent = track.events[noteOnIdx]
+		eventIdx = noteOnIdx + 1
+            	
+
+
+
+
+
+def findEvent(track, eventStartIdx, lambdaExpr):
+	'''
+	From code by Csaba Sulyok:
+	Finds MIDI event based on lambda expression, starting from a given index.
+	Returns a tuple of the following 3 elements:
+	1. event index where the lambda expression is true
+	2. aggregate delta time from event start index until the found event
+	3. flag whether or not any value was found, or we've reached the end of the event queue
+	'''
+
+	eventIdx = eventStartIdx
+	deltaTime = 0
+	while eventIdx < len(track.events) and not lambdaExpr(track.events[eventIdx]):
+	    if track.events[eventIdx].type == 'DeltaTime':
+	        deltaTime += track.events[eventIdx].time
+	    eventIdx += 1
+
+	success = eventIdx < len(track.events)
+	return (eventIdx, deltaTime, success)
+
+