annotate Syncopation models/music_objects.py @ 20:b959c2acb927

Refactored all models except for KTH, all past testing except for SG.
author csong <csong@eecs.qmul.ac.uk>
date Tue, 07 Apr 2015 19:05:07 +0100
parents 43fa04812800
children b6daddeefda9
rev   line source
csong@9 1
csong@13 2 from basic_functions import ceiling, string_to_sequence
csong@9 3
csong@13 4 import parameter_setter
csong@13 5 import rhythm_parser
csong@9 6
csong@9 7 class Note():
csong@9 8 def __init__(self, argstring):
csong@13 9 intlist = string_to_sequence(argstring)
csong@9 10 self.startTime = intlist[0]
csong@9 11 self.duration = intlist[1]
csong@9 12 self.velocity = intlist[2]
csong@9 13
csong@9 14 # toString()
csong@9 15
csong@9 16 # NoteSequence is a list of Note
csong@9 17 class NoteSequence(list):
csong@9 18 def __init__(self, noteSequenceString=None):
csong@9 19 if noteSequenceString!=None:
csong@9 20 self.string_to_note_sequence(noteSequenceString)
csong@9 21
csong@9 22 def string_to_note_sequence(self, noteSequenceString):
csong@13 23 noteSequenceString = rhythm_parser.discardSpaces(noteSequenceString)
csong@9 24 # try:
csong@9 25 # Turning "(1,2,3),(4,5,6),(7,8,9)" into ["1,2,3","4,5,6,","7,8,9"]
csong@9 26 listStrings = noteSequenceString[1:-1].split("),(")
csong@9 27 for localString in listStrings:
csong@9 28 self.append(Note(localString))
csong@9 29
csong@9 30 # toString()
csong@9 31
csong@9 32
csong@13 33 #print NoteSequence("(1,2,3),(4,5,6),(7,8,9)")
csong@13 34 class VelocitySequence(list):
csong@13 35 def __init__(self, noteSequenceString=None):
csong@13 36 if noteSequenceString!=None:
csong@13 37 self.string_to_note_sequence(noteSequenceString)
csong@9 38
csong@13 39 def string_to_note_sequence(self,inputString):
csong@13 40 self.extend(string_to_sequence(inputString))
csong@9 41
csong@9 42
csong@9 43 class BarList(list):
csong@9 44 def append(self,bar):
csong@9 45 if(len(self)>0):
csong@9 46 bar.set_previous_bar(self[-1])
csong@9 47 self[-1].set_next_bar(bar)
csong@9 48 super(BarList, self).append(bar)
csong@9 49
csong@9 50
csong@9 51
csong@13 52
csong@13 53
csong@9 54 class Bar:
csong@9 55
csong@9 56 def __init__(self, rhythmSequence, timeSignature, ticksPerQuarter=None, qpmTempo=None, nextBar=None, prevBar=None):
csong@9 57 if isinstance(rhythmSequence, NoteSequence):
csong@9 58 self.noteSequence = rhythmSequence
csong@9 59 self.velocitySequence = None
csong@9 60 elif isinstance(rhythmSequence, VelocitySequence):
csong@9 61 self.velocitySequence = rhythmSequence
csong@9 62 self.noteSequence = None
csong@9 63
csong@9 64 self.tpq = ticksPerQuarter
csong@9 65 self.qpm = qpmTempo
csong@18 66 self.timeSignature = TimeSignature(timeSignature)
csong@9 67 self.nextBar = nextBar
csong@9 68 self.prevBar = prevBar
csong@9 69
csong@9 70 def get_note_sequence(self):
csong@9 71 #if self.noteSequence==None:
csong@13 72 # self.noteSequence = velocity_sequence_to_notes(self.velocitySequence)
csong@9 73 return self.noteSequence
csong@9 74
csong@9 75 def get_velocity_sequence(self):
csong@9 76 if self.velocitySequence==None:
csong@13 77 self.velocitySequence = note_sequence_to_velocities(self.velocitySequence)
csong@9 78 return self.velocitySequence
csong@9 79
csong@9 80 def get_binary_sequence(self):
csong@9 81 return ceiling(self.get_velocity_sequence())
csong@9 82
csong@9 83 def get_next_bar(self):
csong@9 84 return self.nextBar
csong@9 85
csong@9 86 def get_previous_bar(self):
csong@9 87 return self.prevBar
csong@9 88
csong@9 89 def set_next_bar(self, bar):
csong@9 90 self.nextBar = bar
csong@9 91
csong@9 92 def set_previous_bar(self, bar):
csong@9 93 self.prevBar = bar
csong@9 94
csong@9 95 def get_subdivision_sequence(self):
csong@18 96 return self.timeSignature.get_subdivision_sequence()
csong@9 97
csong@9 98 def get_beat_level(self):
csong@20 99 return self.timeSignature.get_beat_level()
csong@9 100
csong@9 101 def get_time_signature(self):
csong@9 102 return self.timeSignature
csong@9 103
csong@9 104 def get_t_span(self):
csong@9 105 # return the length of a bar in time units
csong@9 106 return None # NEED TO IMPLEMENT
csong@9 107
csong@18 108 class TimeSignature():
csong@18 109 def __init__(self, inputString):
csong@20 110 if inputString in parameter_setter.read_time_signature():
csong@18 111 self.tsString = inputString
csong@18 112 else:
csong@18 113 print "Error: undefined time-signature ", inputString
csong@18 114 raise NullTimeSignatureError
csong@18 115
csong@18 116 def get_subdivision_sequence(self):
csong@20 117 return parameter_setter.timeSignatureBase[self.tsString][0]
csong@18 118
csong@18 119 def get_beat_level(self):
csong@20 120 return parameter_setter.timeSignatureBase[self.tsString][1]
csong@18 121
csong@18 122 def get_numerator(self):
csong@18 123 return int(self.tsString.split('/')[0])
csong@18 124
csong@18 125 def get_denominator(self):
csong@18 126 return int(self.tsString.split('/')[1])
csong@18 127
csong@18 128
csong@18 129