def chase(t,
ontime=0.5,
offset=0.2,
onval=1.0,
offval=0.0,
names=None,
combiner=max):
names = names or []
# maybe this is better:
# period = ontime + ((offset + ontime) * (len(names) - 1))
period = (offset + ontime) * len(names)
outputs = {}
for index, name in enumerate(names):
# normalize our time
local_offset = (offset + ontime) * index
local_t = t - local_offset
local_t %= period
# see if we're still in the on part
if local_t <= ontime:
value = onval
else:
value = offval
# it could be in there twice (in a bounce like (1, 2, 3, 2)
if name in outputs:
outputs[name] = combiner(value, outputs[name])
else:
outputs[name] = value
return outputs
if __name__ == "__main__":
# a little testing
for x in range(80):
x /= 20.0
output = chase(x,
onval='x',
offval=' ',
ontime=0.1,
offset=0.2,
names=('a', 'b', 'c', 'd'))
output = sorted(list(output.items()))
print("%.2f\t%s" % (x, ' '.join([str(x) for x in output])))