Mercurial > code > home > repos > light9
view light9/effect/effect_functions.py @ 2298:63aad60fb070
big effect rewrite: the effect functions & library
author | drewp@bigasterisk.com |
---|---|
date | Tue, 30 May 2023 23:48:42 -0700 |
parents | |
children | 972a54f99b2c |
line wrap: on
line source
import logging import random from PIL import Image from webcolors import rgb_to_hex from light9.effect.scale import scale from light9.effect.settings import DeviceSettings from light9.namespaces import L9 random.seed(0) log = logging.getLogger('effectfunc') def sample8(img, x, y, repeat=False): if not (0 <= y < img.height): return (0, 0, 0) if 0 <= x < img.width: return img.getpixel((x, y)) elif not repeat: return (0, 0, 0) else: return img.getpixel((x % img.width, y)) def effect_scale(strength: float, devs: DeviceSettings) -> DeviceSettings: out = [] if strength != 0: for d, da, v in devs.asList(): out.append((d, da, scale(v, strength))) return DeviceSettings(devs.graph, out) def effect_strobe( songTime: float, # strength: float, period: float, onTime: float, devs: DeviceSettings) -> DeviceSettings: if period == 0: scl=0 else: scl = strength if (songTime % period) < onTime else 0 return effect_scale(scl, devs) def effect_image( songTime: float, # strength: float, period: float, image: Image.Image, devs: DeviceSettings, ) -> DeviceSettings: x = int((songTime / period) * image.width) out = [] for y, (d, da, v) in enumerate(devs.asOrderedList()): if da != L9['color']: continue color8 = sample8(image, x, y, repeat=True) color = rgb_to_hex(tuple(color8)) out.append((d, da, scale(color, strength * v))) return DeviceSettings(devs.graph, out)