Files
2024-07-04 11:34:32 +08:00

4.8 KiB

Documentation

SaltFloatScheduler 节点用于创建和管理浮点数时间表,这些时间表是可用于随时间控制各种参数的浮点值序列。该节点允许精确调度浮点值,实现音视频项目中参数的动态调整和时间控制。

Input types

Required

  • repeat_sequence_times
    • 指定序列应重复的次数,以延长时间表的长度。
    • Comfy dtype: INT
    • Python dtype: int
  • curves_mode
    • 决定时间表的曲线应用模式,影响值的形状和进展。
    • Comfy dtype: COMBO[STRING]
    • Python dtype: str
  • use_perlin_tremors
    • 指示是否对时间表应用柏林噪声,以生成浮点值的自然、平滑变化。
    • Comfy dtype: BOOLEAN
    • Python dtype: bool
  • tremor_scale
    • 设置柏林震颤的比例,控制应用噪声的频率。
    • Comfy dtype: FLOAT
    • Python dtype: float
  • tremor_octaves
    • 指定柏林噪声的八度数,影响震颤的细节级别。
    • Comfy dtype: INT
    • Python dtype: int
  • tremor_persistence
    • 决定柏林噪声的持续性,影响每个八度的振幅。
    • Comfy dtype: FLOAT
    • Python dtype: float
  • tremor_lacunarity
    • 控制柏林噪声的空隙度,影响每个八度的频率增长。
    • Comfy dtype: FLOAT
    • Python dtype: float
  • sequence
    • 要调度并可能被节点操作修改的初始浮点值序列。
    • Comfy dtype: STRING
    • Python dtype: List[float]

Optional

  • max_sequence_length
    • 序列允许的最大长度,确保时间表保持在预定义的界限内。
    • Comfy dtype: INT
    • Python dtype: int

Output types

  • schedule_list
    • 调度操作后的结果浮点值列表,表示修改或生成的时间表。
    • Comfy dtype: LIST
    • Python dtype: List[float]
  • schedule_length
    • 生成或修改的时间表列表的长度,表示调度值的总数。
    • Comfy dtype: INT
    • Python dtype: int

Usage tips

  • Infra type: CPU
  • Common nodes: unknown

Source code

class SaltFloatScheduler:
    @classmethod
    def INPUT_TYPES(cls):
        easing_fns = list(easing_functions.keys())
        easing_fns.insert(0, "None")
        return {
            "required": {
                "repeat_sequence_times": ("INT", {"default": 0, "min": 0}),
                "curves_mode": (easing_fns, ),
                "use_perlin_tremors": ("BOOLEAN", {"default": True}),
                "tremor_scale": ("FLOAT", {"default": 64, "min": 0.01, "max": 1024.0, "step": 0.01}),
                "tremor_octaves": ("INT", {"default": 1, "min": 1, "max": 10}),
                "tremor_persistence": ("FLOAT", {"default": 0.5, "min": 0.01, "max": 1.0, "step": 0.01}),
                "tremor_lacunarity": ("FLOAT", {"default": 2.0, "min": 1.0, "max": 3.0, "step": 0.01}),
                "sequence": ("STRING", {"multiline": True, "placeholder": "[1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0]"}),
            },
            "optional": {
                "max_sequence_length": ("INT", {"default": 0, "min": 0, "max": 4096}),
            }
        }

    RETURN_TYPES = ("LIST", "INT")
    RETURN_NAMES = ("schedule_list", "schedule_length")
    FUNCTION = "generate_sequence"
    CATEGORY = "SALT/Scheduling"

    def apply_curve(self, sequence, mode):
        if mode in easing_functions.keys():
            sequence = [easing_functions[mode](t) for t in sequence]
        else:
            print(f"The easing mode `{mode}` does not exist in the valid easing functions: {', '.join(easing_functions.keys())}")
        return sequence

    def apply_perlin_noise(self, sequence, scale, octaves, persistence, lacunarity):
        perlin = PerlinNoise()
        noise_values = [perlin.sample(i, scale=scale, octaves=octaves, persistence=persistence, lacunarity=lacunarity) for i, _ in enumerate(sequence)]
        sequence = [val + noise for val, noise in zip(sequence, noise_values)]
        return sequence

    def generate_sequence(self, sequence, repeat_sequence_times, curves_mode, use_perlin_tremors, tremor_scale, tremor_octaves, tremor_persistence, tremor_lacunarity, max_sequence_length=0):
        sequence_list = [float(val.strip()) for val in sequence.replace("[", "").replace("]", "").split(',')]
        if use_perlin_tremors:
            sequence_list = self.apply_perlin_noise(sequence_list, tremor_scale, tremor_octaves, tremor_persistence, tremor_lacunarity)
        if curves_mode != "None":
            sequence_list = self.apply_curve(sequence_list, curves_mode)
        sequence_list = sequence_list * (repeat_sequence_times + 1)
        sequence_list = sequence_list[:max_sequence_length] if max_sequence_length != 0 else sequence_list
        return (sequence_list, len(sequence_list))