csong@9: csong@13: from basic_functions import ceiling, string_to_sequence csong@9: csong@13: import parameter_setter csong@13: import rhythm_parser csong@9: csong@9: class Note(): csong@9: def __init__(self, argstring): csong@13: intlist = string_to_sequence(argstring) csong@9: self.startTime = intlist[0] csong@9: self.duration = intlist[1] csong@9: self.velocity = intlist[2] csong@9: csong@9: # toString() csong@9: csong@9: # NoteSequence is a list of Note csong@9: class NoteSequence(list): csong@9: def __init__(self, noteSequenceString=None): csong@9: if noteSequenceString!=None: csong@9: self.string_to_note_sequence(noteSequenceString) csong@9: csong@9: def string_to_note_sequence(self, noteSequenceString): csong@13: noteSequenceString = rhythm_parser.discardSpaces(noteSequenceString) csong@9: # try: csong@9: # Turning "(1,2,3),(4,5,6),(7,8,9)" into ["1,2,3","4,5,6,","7,8,9"] csong@9: listStrings = noteSequenceString[1:-1].split("),(") csong@9: for localString in listStrings: csong@9: self.append(Note(localString)) csong@9: csong@9: # toString() csong@9: csong@9: csong@13: #print NoteSequence("(1,2,3),(4,5,6),(7,8,9)") csong@13: class VelocitySequence(list): csong@13: def __init__(self, noteSequenceString=None): csong@13: if noteSequenceString!=None: csong@13: self.string_to_note_sequence(noteSequenceString) csong@9: csong@13: def string_to_note_sequence(self,inputString): csong@13: self.extend(string_to_sequence(inputString)) csong@9: csong@9: csong@9: class BarList(list): csong@9: def append(self,bar): csong@9: if(len(self)>0): csong@9: bar.set_previous_bar(self[-1]) csong@9: self[-1].set_next_bar(bar) csong@9: super(BarList, self).append(bar) csong@9: csong@9: csong@9: csong@13: csong@13: csong@9: class Bar: csong@9: csong@9: def __init__(self, rhythmSequence, timeSignature, ticksPerQuarter=None, qpmTempo=None, nextBar=None, prevBar=None): csong@9: if isinstance(rhythmSequence, NoteSequence): csong@9: self.noteSequence = rhythmSequence csong@9: self.velocitySequence = None csong@9: elif isinstance(rhythmSequence, VelocitySequence): csong@9: self.velocitySequence = rhythmSequence csong@9: self.noteSequence = None csong@9: csong@9: self.tpq = ticksPerQuarter csong@9: self.qpm = qpmTempo csong@18: self.timeSignature = TimeSignature(timeSignature) csong@9: self.nextBar = nextBar csong@9: self.prevBar = prevBar csong@9: csong@9: def get_note_sequence(self): csong@9: #if self.noteSequence==None: csong@13: # self.noteSequence = velocity_sequence_to_notes(self.velocitySequence) csong@9: return self.noteSequence csong@9: csong@9: def get_velocity_sequence(self): csong@9: if self.velocitySequence==None: csong@13: self.velocitySequence = note_sequence_to_velocities(self.velocitySequence) csong@9: return self.velocitySequence csong@9: csong@9: def get_binary_sequence(self): csong@9: return ceiling(self.get_velocity_sequence()) csong@9: csong@9: def get_next_bar(self): csong@9: return self.nextBar csong@9: csong@9: def get_previous_bar(self): csong@9: return self.prevBar csong@9: csong@9: def set_next_bar(self, bar): csong@9: self.nextBar = bar csong@9: csong@9: def set_previous_bar(self, bar): csong@9: self.prevBar = bar csong@9: csong@9: def get_subdivision_sequence(self): csong@18: return self.timeSignature.get_subdivision_sequence() csong@9: csong@9: def get_beat_level(self): csong@9: return ParameterSetter.get_beat_level(self.timeSignature) csong@9: csong@9: def get_time_signature(self): csong@9: return self.timeSignature csong@9: csong@9: def get_t_span(self): csong@9: # return the length of a bar in time units csong@9: return None # NEED TO IMPLEMENT csong@9: csong@18: class TimeSignature(): csong@18: def __init__(self, inputString): csong@18: if inputString in parameter_setter.readTimesig(): csong@18: self.tsString = inputString csong@18: else: csong@18: print "Error: undefined time-signature ", inputString csong@18: raise NullTimeSignatureError csong@18: csong@18: def get_subdivision_sequence(self): csong@18: return parameter_setter.timesigBase[self.tsString][0] csong@18: csong@18: def get_beat_level(self): csong@18: return parameter_setter.timesigBase[self.tsString][1] csong@18: csong@18: def get_numerator(self): csong@18: return int(self.tsString.split('/')[0]) csong@18: csong@18: def get_denominator(self): csong@18: return int(self.tsString.split('/')[1]) csong@18: csong@18: csong@18: