@@ -160,14 +160,14 @@ def __rshift__(self, *args, **kwargs):
160160 self .__rshift__ (* args , ** kwargs )
161161 return self
162162
163- def __getattr__ (self , name ):
163+ def __getattribute__ (self , name ):
164164 """ Tries to return the correct attr; if not init the Player and try again """
165165 try :
166- return self . __dict__ [ name ]
167- except KeyError :
166+ return object . __getattribute__ ( self , name )
167+ except AttributeError :
168168 self .__class__ = Player
169169 self .__init__ (self .name )
170- return self .__getattr__ (name )
170+ return self .__getattribute__ (name )
171171
172172
173173class Player (Repeatable ):
@@ -279,9 +279,8 @@ def __init__(self, name=None):
279279 self .sent_messages = []
280280
281281 self .case_modulation = {
282- "sus" : lambda val , i , * args , ** kwargs : val * float (self .metro .beat_dur ()) * float (self .get_key ("blur" , i , ** kwargs )),
283- "amp" : lambda val , i , * args , ** kwargs : val * float (self .get_key ("amplify" , i , ** kwargs )),
284- "delay" : lambda val , i , * args , ** kwargs : val + float (self .get_key ("_delay_offset" , i , ** kwargs ))
282+ "sus" : lambda val , i , * args , ** kwargs : val * float (self .metro .beat_dur ()) * float (self .get_key ("blur" , i , ** kwargs )), # this should be done in the SynthDef?
283+ "amp" : lambda val , i , * args , ** kwargs : val * float (self .get_key ("amplify" , i , ** kwargs ))
285284 }
286285
287286 # Visual feedback information
@@ -297,6 +296,7 @@ def __init__(self, name=None):
297296 self .event_n = 0
298297 self .notes_played = 0
299298 self .event = {}
299+ self .accessed_keys = []
300300
301301 # Used for checking clock updates
302302
@@ -439,10 +439,6 @@ def __setattr__(self, name, value):
439439
440440 name = self .alias .get (name , name )
441441
442- #if name == "dur":
443-
444- # value, self._delay_offset = CalculateDelaysFromDur(value) # can we avoid using this?
445-
446442 value = asStream (value )
447443
448444 # raise a ValueError if trying to reference itself -- doesn't handle indirect references to itself
@@ -483,12 +479,25 @@ def __setattr__(self, name, value):
483479 return
484480
485481 def __getattr__ (self , name ):
486- try :
487- return self .__dict__ [self .alias .get (name , name )]
482+ try :
483+ # This checks for aliases, not the actual keys
484+ name = self .alias .get (name , name )
485+ item = self .__dict__ [name ]
486+ # If returning a player key, keep track of which are being accessed
487+ if isinstance (item , PlayerKey ) and name not in self .accessed_keys :
488+ self .accessed_keys .append (name )
489+ return item
488490 except KeyError :
489491 err = "Player Object has no attribute '{}'" .format (name )
490492 raise AttributeError (err )
491493
494+ def __getattribute__ (self , name ):
495+ item = object .__getattribute__ (self , name )
496+ if isinstance (item , PlayerKey ):
497+ if name not in self .accessed_keys :
498+ self .accessed_keys .append (name )
499+ return item
500+
492501 def __getitem__ (self , name ):
493502 if self .__init :
494503 if name not in self .__vars :
@@ -551,9 +560,6 @@ def reset(self):
551560 # Duration of notes
552561 self .dur = 0.5 if self .synthdef == SamplePlayer else 1
553562
554- # Modifier for affecting delay
555- self ._delay_offset = 0
556-
557563 # Degree of scale / Characters of samples
558564 self .degree = " " if self .synthdef is SamplePlayer else 0
559565
@@ -1083,7 +1089,6 @@ def number_attr(self, attr):
10831089 def update_player_key (self , key , value , time ):
10841090 """ Forces object's dict uses PlayerKey instances
10851091 """
1086-
10871092 if key not in self .__dict__ :
10881093
10891094 self .__dict__ [key ] = PlayerKey (value , parent = self , attr = key )
@@ -1107,8 +1112,14 @@ def update_player_key(self, key, value, time):
11071112 return
11081113
11091114 def update_all_player_keys (self , ignore = [], event = None , ** kwargs ):
1110-
1111- # delay = float(group_modi(self.event.get('delay', 0), index))
1115+ """ Updates the internal values of player keys that have been accessed e.g. p1.pitch. If there is a delay,
1116+ then schedule a function to update the values in the future. """
1117+
1118+ # Don't bother if no keys are being accessed
1119+
1120+ if len (self .accessed_keys ) == 0 :
1121+
1122+ return
11121123
11131124 if event is None :
11141125
@@ -1129,14 +1140,12 @@ def update_all_player_keys(self, ignore=[], event=None, **kwargs):
11291140 if delay > 0 :
11301141
11311142 time = self .event_index + delay
1132-
1133- # TODO -- only update keys that have been accessed
11341143
11351144 def delay_update (event , i , t ):
11361145
11371146 for key in event :
11381147
1139- if key not in ignore :
1148+ if key in self . accessed_keys and key not in ignore :
11401149
11411150 self .update_player_key (key , group_modi (kwargs .get (key , event .get (key , 0 )), i ), float (t ))
11421151
@@ -1146,15 +1155,15 @@ def delay_update(event, i, t):
11461155
11471156 for key in event .keys ():
11481157
1149- if key not in ignore :
1158+ if key in self . accessed_keys and key not in ignore :
11501159
11511160 self .update_player_key (key , group_modi (kwargs .get (key , event .get (key , 0 )), index ), self .event_index )
11521161
11531162 else :
11541163
11551164 for key in event .keys ():
11561165
1157- if key not in ignore :
1166+ if key in self . accessed_keys and key not in ignore :
11581167
11591168 self .update_player_key (key , kwargs .get (key , event .get (key , 0 )), self .event_index )
11601169
@@ -1223,9 +1232,7 @@ def get_key(self, key, i, **kwargs):
12231232 # Private method
12241233
12251234 def __get_current_delay (self , i , kwargs ):
1226- delay = float (group_modi (kwargs .get ('delay' , self .event .get ('delay' , 0 )), i ))
1227- func = self .case_modulation ["delay" ]
1228- return func (delay , i )
1235+ return float (group_modi (kwargs .get ('delay' , self .event .get ('delay' , 0 )), i ))
12291236
12301237 def now (self , attr = "degree" , x = 0 , ** kwargs ):
12311238 """ Calculates the values for each attr to send to the server at the current clock time """
0 commit comments