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)