Skip to content

Commit bde9a9c

Browse files
committed
Only update player keys when accessed
1 parent d11e50b commit bde9a9c

File tree

1 file changed

+34
-27
lines changed

1 file changed

+34
-27
lines changed

FoxDot/lib/Players.py

Lines changed: 34 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -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

173173
class 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

Comments
 (0)