Mercurial > hg > syncopation-dataset
view Syncopation models/music_objects.py @ 21:b6daddeefda9
working on KTH
author | csong <csong@eecs.qmul.ac.uk> |
---|---|
date | Tue, 07 Apr 2015 23:16:13 +0100 |
parents | b959c2acb927 |
children | 2dbc09ca8013 |
line wrap: on
line source
from basic_functions import ceiling, string_to_sequence, calculate_time_span_ticks import parameter_setter import rhythm_parser class Note(): def __init__(self, argstring): intlist = string_to_sequence(argstring) self.startTime = intlist[0] self.duration = intlist[1] self.velocity = intlist[2] # toString() # NoteSequence is a list of Note class NoteSequence(list): def __init__(self, noteSequenceString=None): if noteSequenceString!=None: self.string_to_note_sequence(noteSequenceString) def string_to_note_sequence(self, noteSequenceString): noteSequenceString = rhythm_parser.discardSpaces(noteSequenceString) # try: # Turning "(1,2,3),(4,5,6),(7,8,9)" into ["1,2,3","4,5,6,","7,8,9"] listStrings = noteSequenceString[1:-1].split("),(") for localString in listStrings: self.append(Note(localString)) # toString() #print NoteSequence("(1,2,3),(4,5,6),(7,8,9)") class VelocitySequence(list): def __init__(self, noteSequenceString=None): if noteSequenceString!=None: self.string_to_note_sequence(noteSequenceString) def string_to_note_sequence(self,inputString): self.extend(string_to_sequence(inputString)) class BarList(list): def append(self,bar): if(len(self)>0): bar.set_previous_bar(self[-1]) self[-1].set_next_bar(bar) super(BarList, self).append(bar) class Bar: def __init__(self, rhythmSequence, timeSignature, ticksPerQuarter=None, qpmTempo=None, nextBar=None, prevBar=None): if isinstance(rhythmSequence, NoteSequence): self.noteSequence = rhythmSequence self.velocitySequence = None elif isinstance(rhythmSequence, VelocitySequence): self.velocitySequence = rhythmSequence self.noteSequence = None self.tpq = ticksPerQuarter self.qpm = qpmTempo self.timeSignature = TimeSignature(timeSignature) self.nextBar = nextBar self.prevBar = prevBar def get_note_sequence(self): if self.noteSequence==None: self.noteSequence = velocity_sequence_to_notes(self.velocitySequence) return self.noteSequence def get_velocity_sequence(self): if self.velocitySequence==None: self.velocitySequence = note_sequence_to_velocities(self.noteSequence) return self.velocitySequence def get_binary_sequence(self): return ceiling(self.get_velocity_sequence()) def get_next_bar(self): return self.nextBar def get_previous_bar(self): return self.prevBar def set_next_bar(self, bar): self.nextBar = bar def set_previous_bar(self, bar): self.prevBar = bar def get_subdivision_sequence(self): return self.timeSignature.get_subdivision_sequence() def get_beat_level(self): return self.timeSignature.get_beat_level() def get_time_signature(self): return self.timeSignature # return the length of a bar in time units (ticks) def get_time_span(self): return calculate_time_span_ticks(self.timeSignature.get_numerator(),self.timeSignature.get_denominator(), self.ticksPerQuarter) class TimeSignature(): def __init__(self, inputString): if inputString in parameter_setter.read_time_signature(): self.tsString = inputString else: print "Error: undefined time-signature ", inputString raise NullTimeSignatureError def get_subdivision_sequence(self): return parameter_setter.timeSignatureBase[self.tsString][0] def get_beat_level(self): return parameter_setter.timeSignatureBase[self.tsString][1] def get_numerator(self): return int(self.tsString.split('/')[0]) def get_denominator(self): return int(self.tsString.split('/')[1])