view Syncopation models/readmidi.py @ 23:df1e7c378ee0

fixed KTH, and WNBD
author csong <csong@eecs.qmul.ac.uk>
date Sun, 12 Apr 2015 13:06:17 +0100
parents a3ed7d2b57d8
children 08c298f47917
line wrap: on
line source
# -*- 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 music_objects import *





def read_midi_file(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 get_bars(midiFile, trackindex=1):
# 	""" returns a list of bar objects from a MidiFile object """

# 	# select a track to extract (default = 1, ignoring dummy track 0)
# 	track = midiFile.tracks[trackindex] 
# 	eventIndex = 0
# 	numNotes = 0

# 	noteonlist = []
# 	noteOnFound==True

# 	while noteOnFound==True:
# 		(noteOnIndex, noteOnDelta, noteOnFound) = self.find_event(track, eventIndex, lambda e: e.type == 'NOTE_ON')
# 		noteEvent = track.events[noteOnIndex]
# 		eventIndex = noteOnIndex + 1
            	





def find_event(track, eventStartIndex, 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
	'''

	eventIndex = eventStartIndex
	deltaTime = 0
	while eventIndex < len(track.events) and not lambdaExpr(track.events[eventIndex]):
	    if track.events[eventIndex].type == 'DeltaTime':
	        deltaTime += track.events[eventIndex].time
	    eventIndex += 1

	success = eventIndex < len(track.events)
	return (eventIndex, deltaTime, success)