4.8 KiB
4.8 KiB
Documentation
- Class name: SaltFloatScheduler
- Category: SALT/Scheduling
- Output node: False
- Repo Ref: https://github.com/comfyanonymous/ComfyUI
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))