Changeset - 0e746743dd0f
[Not reviewed]
default
0 3 0
drewp@bigasterisk.com - 9 years ago 2016-06-16 06:09:43
drewp@bigasterisk.com
effects should also get noteTime for doing one-shot stuff
Ignore-this: 8cf4c8e978b486ab99e59199414d9ae2
3 files changed with 108 insertions and 11 deletions:
0 comments (0 inline, 0 general)
bin/keyboardcomposer
Show inline comments
 
@@ -453,15 +453,19 @@ class KeyboardComposer(tk.Frame, SubClie
 
    def get_output_settings(self):
 
        outputSettings = []
 
        for setting in graph.objects(self.session, L9['subSetting']):
 
            effect = graph.value(setting, L9['sub'])
 
            strength = graph.value(setting, L9['level'])
 
            if strength:
 
                now = time.time()
 
                outputSettings.extend(
 
                    self.effectEval[effect].outputFromEffect(
 
                        [(L9['strength'], strength)], songTime=time.time()))
 
                        [(L9['strength'], strength)],
 
                        songTime=now,
 
                        # should be counting from when you bumped up from 0
 
                        noteTime=now))
 

	
 
        return outputSettings
 

	
 
    def save_current_stage(self, subname):
 
        raise NotImplementedError
 
        log.info("saving current levels as %s", subname)
light9/effect/effecteval.py
Show inline comments
 
@@ -72,13 +72,13 @@ class EffectEval(object):
 
                settings.append((d, a, v if v is not None else sv, bool(sv)))
 

	
 
            if settings:
 
                self.effectOutputs[effect] = settings
 
            # also have to read eff :effectAttr [ :tint x; :tintStrength y ]
 
        
 
    def outputFromEffect(self, effectSettings, songTime):
 
    def outputFromEffect(self, effectSettings, songTime, noteTime):
 
        """
 
        From effect attr settings, like strength=0.75, to output device
 
        settings like light1/bright=0.72;light2/bright=0.78. This runs
 
        the effect code.
 
        """
 
        # both callers need to apply note overrides
 
@@ -97,13 +97,13 @@ class EffectEval(object):
 
            tail = 'effect_' + self.effect[len(L9['effect/']):]
 
            try:
 
                func = globals()[tail]
 
            except KeyError:
 
                pass
 
            else:
 
                out.update(func(effectSettings, strength, songTime))
 
                out.update(func(effectSettings, strength, songTime, noteTime))
 

	
 
        # todo: callers should prefer the dict form too
 
        outList = [(d, a, v) for (d, a), v in out.iteritems()]
 
        outList.sort()
 
        #import pprint; pprint.pprint(outList, width=170)
 
        return outList
 
@@ -119,20 +119,20 @@ class EffectEval(object):
 
        return out
 
        
 

	
 

	
 
    
 

	
 
def effect_Curtain(effectSettings, strength, songTime):
 
def effect_Curtain(effectSettings, strength, songTime, noteTime):
 
    return {
 
        (L9['device/lowPattern%s' % n], L9['color']):
 
        literalColor(strength, strength, strength)
 
        for n in range(301,308+1)
 
        }
 
    
 
def effect_animRainbow(effectSettings, strength, songTime):
 
def effect_animRainbow(effectSettings, strength, songTime, noteTime):
 
    out = {}
 
    tint = effectSettings.get(L9['tint'], '#ffffff')
 
    tintStrength = float(effectSettings.get(L9['tintStrength'], 0))
 
    print tint, tintStrength
 
    tr, tg, tb = hex_to_rgb(tint)
 
    for n in range(1, 5+1):
 
@@ -151,13 +151,13 @@ def effect_animRainbow(effectSettings, s
 
        out.update({
 
        (dev, L9['rx']): lerp(.27, .7, (n-1)/4) + .2 * math.sin(ang+n),
 
        (dev, L9['ry']): lerp(.46, .52, (n-1)/4) + .5 * math.cos(ang+n),
 
            })
 
    return out
 

	
 
def effect_pulseRainbow(effectSettings, strength, songTime):
 
def effect_pulseRainbow(effectSettings, strength, songTime, noteTime):
 
    out = {}
 
    tint = effectSettings.get(L9['tint'], '#ffffff')
 
    tintStrength = float(effectSettings.get(L9['tintStrength'], 0))
 
    print tint, tintStrength
 
    tr, tg, tb = hex_to_rgb(tint)
 
    for n in range(1, 5+1):
 
@@ -175,40 +175,129 @@ def effect_pulseRainbow(effectSettings, 
 
        out.update({
 
        (dev, L9['rx']): lerp(.27, .7, (n-1)/4),
 
        (dev, L9['ry']): lerp(.46, .52, (n-1)/4),
 
            })
 
    return out
 

	
 
def effect_orangeSearch(effectSettings, strength, songTime):
 

	
 
def effect_aurawash(effectSettings, strength, songTime, noteTime):
 
    out = {}
 
    scl = strength
 
    period = float(effectSettings.get(L9['period'], 125/60/4))
 
    if period < .05:
 
        quantTime = songTime
 
    else:
 
        quantTime = int(songTime / period) * period
 
    noisePos = quantTime * 6.3456
 
    
 
    col = literalColorHsv(noise(noisePos), 1, scl)
 
    col = scale(col, effectSettings.get(L9['colorScale']) or '#ffffff')
 
                
 
    print songTime, quantTime, col
 

	
 
    for n in range(1, 5+1):
 
        dev = L9['device/aura%s' % n]
 
        out.update({
 
            (dev, L9['color']): col,
 
            (dev, L9['zoom']): .5,
 
            })
 
        out.update({
 
        (dev, L9['rx']): lerp(.27, .7, (n-1)/4),
 
        (dev, L9['ry']): lerp(.46, .52, (n-1)/4),
 
            })
 
    return out
 

	
 
def effect_qsweep(effectSettings, strength, songTime, noteTime):
 
    out = {}
 
    period = float(effectSettings.get(L9['period'], 2))
 

	
 
    col = effectSettings.get(L9['colorScale'], '#ffffff')
 
    col = scale(col, effectSettings.get(L9['strength'], 1))
 

	
 
    
 
    for n in range(1, 3+1):
 
        dev = L9['device/q%s' % n]
 
        out.update({
 
            (dev, L9['color']): col,
 
            (dev, L9['zoom']): effectSettings.get(L9['zoom'], .5),
 
            })
 
        out.update({
 
            (dev, L9['rx']):
 
            lerp(.3, .8, nsin(songTime / period + n / 4)),
 
        (dev, L9['ry']): effectSettings.get(L9['ry'], .2),
 
            })
 
    return out
 

	
 

	
 
def effect_chase1(effectSettings, strength, songTime, noteTime):
 
    members = [
 
        DEV['backlight1'],
 
        DEV['lip1'],
 
        DEV['backlight2'],
 
        DEV['down2'],
 
        DEV['lip2'],
 
        DEV['backlight3'],
 
        DEV['down3'],
 
        DEV['lip3'],
 
        DEV['backlight4'],
 
        DEV['down4'],
 
        DEV['lip4'],
 
        DEV['backlight5'],
 
        DEV['down5Edge'],
 
        DEV['lip5'],
 
        #DEV['upCenter'],
 
        ]
 

	
 
    members = members + members[-2:0:-1]
 
    
 
    out = {}
 
    period = float(effectSettings.get(L9['period'], 2 / len(members)))
 

	
 
    for i, dev in enumerate(members):
 
        cursor = (songTime / period) % float(len(members))
 
        dist = abs(i - cursor)
 
        radius = 3
 
        if dist < radius:
 
            col = effectSettings.get(L9['colorScale'], '#ffffff')
 
            col = scale(col, effectSettings.get(L9['strength'], 1))
 
            col = scale(col, (1 - dist / radius))
 
        
 
            out.update({
 
                (dev, L9['color']): col,
 
            })
 
    return out
 

	
 
    
 
def effect_orangeSearch(effectSettings, strength, songTime, noteTime):
 
    dev = L9['device/auraStage']
 
    return {(dev, L9['color']): '#c1905d',
 
            (dev, L9['rx']): lerp(.31, .68, nsquare(songTime / 2.0)),
 
            (dev, L9['ry']): lerp(.32, .4,  nsin(songTime / 5)),
 
            (dev, L9['zoom']): .88,
 
            }
 
    
 
def effect_Strobe(effectSettings, strength, songTime):
 
def effect_Strobe(effectSettings, strength, songTime, noteTime):
 
    rate = 2
 
    duty = .3
 
    offset = 0
 
    f = (((songTime + offset) * rate) % 1.0)
 
    c = (f < duty) * strength
 
    col = rgb_to_hex([c * 255, c * 255, c * 255])
 
    return {(L9['device/colorStrip'], L9['color']): Literal(col)}
 

	
 
def effect_lightning(effectSettings, strength, songTime):
 
def effect_lightning(effectSettings, strength, songTime, noteTime):
 
    devs = [L9['device/veryLow1'], L9['device/veryLow2'],
 
            L9['device/veryLow3'], L9['device/veryLow4'],
 
            L9['device/veryLow5'], L9['device/backlight1'],
 
            L9['device/backlight2'], L9['device/backlight3'],
 
            L9['device/backlight4'], L9['device/backlight5'],
 
            L9['device/down2'], L9['device/down3'],
 
            L9['device/down4'], L9['device/hexLow3'],
 
            L9['device/hexLow5'], L9['device/lip1 5'],
 
            L9['device/postL1'], L9['device/postR1']]
 
    out = {}
 
    col = rgb_to_hex([255 * strength] * 3)
 
    for i, dev in enumerate(devs):
 
        n = noise((songTime * 8 + i * 6.543) % 100.0)
 
        n = noise(songTime * 8 + i * 6.543)
 
        if n > .4:
 
            out[(dev, L9['color'])] = col
 
    return out
light9/effect/sequencer.py
Show inline comments
 
@@ -117,13 +117,17 @@ class Note(object):
 
    def outputSettings(self, t):
 
        """
 
        list of (device, attr, value)
 
        """
 
        effectSettings = self.baseEffectSettings.copy()
 
        effectSettings[L9['strength']] = self.evalCurve(t)
 
        return self.effectEval.outputFromEffect(effectSettings.items(), t)
 
        return self.effectEval.outputFromEffect(
 
            effectSettings.items(),
 
            songTime=t,
 
            # note: not using origin here since it's going away
 
            noteTime=t - self.points[0][0])
 

	
 

	
 
class CodeWatcher(object):
 
    def __init__(self, onChange):
 
        self.onChange = onChange
 

	
0 comments (0 inline, 0 general)