Ilysa by Example: FX - Gradient

Ilysa has a fx package that collects common lighting patterns.

package main
import (
    "github.com/shasderias/ilysa"
    "github.com/shasderias/ilysa/beatsaber"
    "github.com/shasderias/ilysa/colorful"
    "github.com/shasderias/ilysa/colorful/gradient"
    "github.com/shasderias/ilysa/context"
    "github.com/shasderias/ilysa/ease"
    "github.com/shasderias/ilysa/evt"
    "github.com/shasderias/ilysa/fx"
    "github.com/shasderias/ilysa/light"
    "github.com/shasderias/ilysa/timer"
    "github.com/shasderias/ilysa/transform"
)
var (
    Red     = colorful.MustParseHex("#FF0000")
    Green   = colorful.MustParseHex("#00FF00")
    Blue    = colorful.MustParseHex("#0000FF")
    RGBGrad = gradient.New(Red, Blue, Green)
)
func main() {
    m, _ := beatsaber.NewMockMap(beatsaber.EnvironmentOrigins, 120, "[]")
    p := ilysa.New(m)
    l := transform.Light(light.NewBasic(p, evt.BackLasers),
        transform.DivideSingle(),
    )

fx.Gradient() displays a gradient over a light.

    p.Sequence(timer.Beat(1), func(ctx context.Context) {
        ctx.Light(l, func(ctx context.LightContext) {
            fx.Gradient(ctx, RGBGrad)
        })
    })

fx.ColorSweep() animates a gradient over a light. The second parameter (0.2) determines how quickly the gradient moves.

    p.Range(timer.Rng(2, 3, 10, ease.Linear), func(ctx context.Context) {
        ctx.Light(l, func(ctx context.LightContext) {
            fx.ColorSweep(ctx, 0.2, RGBGrad)
        })
    })
    p.Dump()
}
$ go run fx-gradient.go
[
    {"_customData":{"_color":[0.13,0.076,0.54,1],"_lightID":2},"_time":1,"_type":0,"_value":5},
    {"_customData":{"_color":[0,0.247,0.682,1],"_lightID":3},"_time":1,"_type":0,"_value":5},
    {"_customData":{"_color":[0,1,0,1],"_lightID":4},"_time":1,"_type":0,"_value":5},
    {"_customData":{"_color":[1,0,0,1],"_lightID":1},"_time":1,"_type":0,"_value":5},
    
    {"_customData":{"_color":[0,0.956,0.034,1],"_lightID":2},"_time":2,"_type":0,"_value":5},
    {"_customData":{"_color":[0,0.196,0.741,1],"_lightID":1},"_time":2,"_type":0,"_value":5},
    {"_customData":{"_color":[0,0.611,0.321,1],"_lightID":3},"_time":2,"_type":0,"_value":5},
    {"_customData":{"_color":[0.093,0.067,0.614,1],"_lightID":4},"_time":2,"_type":0,"_value":5},
    {"_customData":{"_color":[0,0.213,0.721,1],"_lightID":1},"_time":2.11111,"_type":0,"_value":5},
    {"_customData":{"_color":[0,0.964,0.028,1],"_lightID":2},"_time":2.11111,"_type":0,"_value":5},
    {"_customData":{"_color":[0,0.593,0.338,1],"_lightID":3},"_time":2.11111,"_type":0,"_value":5},
    {"_customData":{"_color":[0.105,0.07,0.588,1],"_lightID":4},"_time":2.11111,"_type":0,"_value":5},
    {"_customData":{"_color":[0,0.231,0.7,1],"_lightID":1},"_time":2.22222,"_type":0,"_value":5},
    {"_customData":{"_color":[0,0.97,0.023,1],"_lightID":2},"_time":2.22222,"_type":0,"_value":5},
    {"_customData":{"_color":[0,0.574,0.354,1],"_lightID":3},"_time":2.22222,"_type":0,"_value":5},
    {"_customData":{"_color":[0.118,0.073,0.563,1],"_lightID":4},"_time":2.22222,"_type":0,"_value":5},
    {"_customData":{"_color":[0,0.249,0.68,1],"_lightID":1},"_time":2.33333,"_type":0,"_value":5},
    {"_customData":{"_color":[0,0.977,0.018,1],"_lightID":2},"_time":2.33333,"_type":0,"_value":5},
    {"_customData":{"_color":[0,0.555,0.371,1],"_lightID":3},"_time":2.33333,"_type":0,"_value":5},
    {"_customData":{"_color":[0.131,0.076,0.538,1],"_lightID":4},"_time":2.33333,"_type":0,"_value":5},
    {"_customData":{"_color":[0,0.267,0.66,1],"_lightID":1},"_time":2.44444,"_type":0,"_value":5},
    {"_customData":{"_color":[0,0.982,0.014,1],"_lightID":2},"_time":2.44444,"_type":0,"_value":5},
    {"_customData":{"_color":[0.146,0.078,0.514,1],"_lightID":4},"_time":2.44444,"_type":0,"_value":5},
    {"_customData":{"_color":[0,0.537,0.389,1],"_lightID":3},"_time":2.44444,"_type":0,"_value":5},
    {"_customData":{"_color":[0,0.987,0.01,1],"_lightID":2},"_time":2.55556,"_type":0,"_value":5},
    {"_customData":{"_color":[0,0.518,0.406,1],"_lightID":3},"_time":2.55556,"_type":0,"_value":5},
    {"_customData":{"_color":[0.16,0.08,0.491,1],"_lightID":4},"_time":2.55556,"_type":0,"_value":5},
    {"_customData":{"_color":[0,0.285,0.64,1],"_lightID":1},"_time":2.55556,"_type":0,"_value":5},
    {"_customData":{"_color":[0,0.499,0.424,1],"_lightID":3},"_time":2.66667,"_type":0,"_value":5},
    {"_customData":{"_color":[0,0.991,0.007,1],"_lightID":2},"_time":2.66667,"_type":0,"_value":5},
    {"_customData":{"_color":[0.175,0.082,0.469,1],"_lightID":4},"_time":2.66667,"_type":0,"_value":5},
    {"_customData":{"_color":[0,0.303,0.62,1],"_lightID":1},"_time":2.66667,"_type":0,"_value":5},
    {"_customData":{"_color":[0.191,0.083,0.447,1],"_lightID":4},"_time":2.77778,"_type":0,"_value":5},
    {"_customData":{"_color":[0,0.322,0.6,1],"_lightID":1},"_time":2.77778,"_type":0,"_value":5},
    {"_customData":{"_color":[0,0.994,0.005,1],"_lightID":2},"_time":2.77778,"_type":0,"_value":5},
    {"_customData":{"_color":[0,0.48,0.442,1],"_lightID":3},"_time":2.77778,"_type":0,"_value":5},
    {"_customData":{"_color":[0,0.34,0.581,1],"_lightID":1},"_time":2.88889,"_type":0,"_value":5},
    {"_customData":{"_color":[0,0.996,0.003,1],"_lightID":2},"_time":2.88889,"_type":0,"_value":5},
    {"_customData":{"_color":[0.208,0.085,0.426,1],"_lightID":4},"_time":2.88889,"_type":0,"_value":5},
    {"_customData":{"_color":[0,0.461,0.46,1],"_lightID":3},"_time":2.88889,"_type":0,"_value":5},
    {"_customData":{"_color":[0.225,0.086,0.405,1],"_lightID":4},"_time":3,"_type":0,"_value":5},
    {"_customData":{"_color":[0,0.359,0.561,1],"_lightID":1},"_time":3,"_type":0,"_value":5},
    {"_customData":{"_color":[0,0.998,0.001,1],"_lightID":2},"_time":3,"_type":0,"_value":5},
    {"_customData":{"_color":[0,0.442,0.478,1],"_lightID":3},"_time":3,"_type":0,"_value":5}
]

Next example: FX - Alpha.