From aa97900f7e6d5729defa5cc8fba6c03def2275ea Mon Sep 17 00:00:00 2001 From: peteromallet Date: Mon, 15 Apr 2024 19:41:39 +0200 Subject: [PATCH] Fix --- README.md | 4 +- SteerableMotion.py | 59 +- demo/creative_interpolation_example.json | 3804 ++++++++++++---------- 3 files changed, 2053 insertions(+), 1814 deletions(-) diff --git a/README.md b/README.md index b9bc4e8..08f2d85 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ # Steerable Motion, a ComfyUI custom node for steering videos with batches of images -Steerable Motion is a ComfyUI node for batch creative interpolation. Our goal is to feature the best quality and most precise and powerful methods for steering motion with images as video models evolve. This node is best used via [Dough](https://github.com/banodoco/dough) - a creative tool which simplifies the settings and provides a nice creative flow. +Steerable Motion is a ComfyUI node for batch creative interpolation. Our goal is to feature the best quality and most precise and powerful methods for steering motion with images as video models evolve. This node is best used via [Dough](https://github.com/banodoco/dough) - a creative tool which simplifies the settings and provides a nice creative flow - or in Discord - by joining this channel. ![Main example](https://github.com/banodoco/steerable-motion/blob/main/demo/main_example.gif) -## Installation +## Installation in Comfy 1. If you haven't already, install [ComfyUI](https://github.com/comfyanonymous/ComfyUI) and [Comfy Manager](https://github.com/ltdrdata/ComfyUI-Manager) - you can find instructions on their pages. 2. Download [this workflow](https://raw.githubusercontent.com/banodoco/steerable-motion/main/demo/creative_interpolation_example.json) and drop it into ComfyUI. diff --git a/SteerableMotion.py b/SteerableMotion.py index 698fd5c..1b07f8d 100644 --- a/SteerableMotion.py +++ b/SteerableMotion.py @@ -45,8 +45,8 @@ class BatchCreativeInterpolationNode: } } - RETURN_TYPES = ("IMAGE","CONDITIONING","CONDITIONING","MODEL","SPARSE_METHOD","INT") - RETURN_NAMES = ("GRAPH","POSITIVE","NEGATIVE","MODEL","KEYFRAME_POSITIONS","BATCH_SIZE") + RETURN_TYPES = ("IMAGE","CONDITIONING","CONDITIONING","MODEL","SPARSE_METHOD","INT", "INT") + RETURN_NAMES = ("GRAPH","POSITIVE","NEGATIVE","MODEL","KEYFRAME_POSITIONS","BATCH_SIZE", "BUFFER") FUNCTION = "combined_function" CATEGORY = "Steerable-Motion" @@ -62,13 +62,21 @@ class BatchCreativeInterpolationNode: if type_of_frame_distribution == "dynamic": # Check if the input is a string or a list if isinstance(dynamic_frame_distribution_values, str): - # Sort the keyframe positions in numerical order - return sorted([int(kf.strip()) for kf in dynamic_frame_distribution_values.split(',')]) + # Parse the keyframe positions, sort them, and then increase each by 1 except the first + keyframes = sorted([int(kf.strip()) for kf in dynamic_frame_distribution_values.split(',')]) elif isinstance(dynamic_frame_distribution_values, list): - return sorted(dynamic_frame_distribution_values) + # Sort the list and then increase each by 1 except the first + keyframes = sorted(dynamic_frame_distribution_values) else: # Calculate the number of keyframes based on the total duration and linear_frames_per_keyframe - return [i * linear_frame_distribution_value for i in range(len(images))] + # Increase each by 1 except the first + keyframes = [(i * linear_frame_distribution_value) for i in range(len(images))] + + # Increase all values by 1 except the first + if len(keyframes) > 1: + return [keyframes[0]] + [kf + 1 for kf in keyframes[1:]] + else: + return keyframes def create_mask_batch(last_key_frame_position, weights, frames): # Hardcoded dimensions @@ -280,7 +288,7 @@ class BatchCreativeInterpolationNode: keyframe_positions = [position + buffer - 1 for position in keyframe_positions] keyframe_positions.insert(0, 0) # add end buffer - last_position_with_buffer = keyframe_positions[-1] + buffer - 1 + last_position_with_buffer = keyframe_positions[-1] + buffer + 1 keyframe_positions.append(last_position_with_buffer) @@ -339,8 +347,11 @@ class BatchCreativeInterpolationNode: key_frame_influence_values = extract_influence_values(type_of_key_frame_influence, dynamic_key_frame_influence_values, keyframe_positions, linear_key_frame_influence_value) key_frame_influence_values = [literal_eval(val) if isinstance(val, str) else val for val in key_frame_influence_values] - # CALCULATE LAST KEYFRAME POSITION - last_key_frame_position = (keyframe_positions[-1] + 1) + # CALCULATE LAST KEYFRAME POSITION + if len(keyframe_positions) == 4: + last_key_frame_position = (keyframe_positions[-1]) - 1 + else: + last_key_frame_position = (keyframe_positions[-1]) # CREATE LISTS FOR WEIGHTS AND FRAME NUMBERS all_cn_frame_numbers = [] @@ -349,7 +360,7 @@ class BatchCreativeInterpolationNode: all_ipa_frame_numbers = [] for i in range(len(keyframe_positions)): - + keyframe_position = keyframe_positions[i] interpolation = "ease-in-out" # strength_from = strength_to = 1.0 @@ -370,8 +381,8 @@ class BatchCreativeInterpolationNode: key_frame_influence_from, key_frame_influence_to = key_frame_influence_values[i-1] start_strength, mid_strength, end_strength = strength_values[i-1] - keyframe_position = keyframe_positions[i] - next_key_frame_position = keyframe_positions[i+1] + keyframe_position = keyframe_positions[i] + 1 + next_key_frame_position = keyframe_positions[i+1] + 1 batch_index_from = keyframe_position batch_index_to_excl = calculate_influence_frame_number(keyframe_position, next_key_frame_position, key_frame_influence_to) @@ -384,23 +395,31 @@ class BatchCreativeInterpolationNode: image = images[i-1] key_frame_influence_from,key_frame_influence_to = key_frame_influence_values[i-1] start_strength, mid_strength, end_strength = strength_values[i-1] + if len(keyframe_positions) == 4: + keyframe_position = keyframe_positions[i] - 1 + else: + keyframe_position = keyframe_positions[i] - keyframe_position = keyframe_positions[i] previous_key_frame_position = keyframe_positions[i-1] batch_index_from = calculate_influence_frame_number(keyframe_position, previous_key_frame_position, key_frame_influence_from) - batch_index_to_excl = keyframe_position + batch_index_to_excl = keyframe_position + 1 weights, frame_numbers = calculate_weights(batch_index_from, batch_index_to_excl, start_strength, mid_strength, interpolation, False, last_key_frame_position, i, len(keyframe_positions), buffer) # interpolation = "ease-out" - elif i == len(keyframe_positions) - 1: + elif i == len(keyframe_positions) - 1: # buffer image = images[i-2] strength_from = strength_to = strength_values[i-2][1] - batch_index_from = keyframe_positions[i-1] - batch_index_to_excl = last_key_frame_position + if len(keyframe_positions) == 4: + batch_index_from = keyframe_positions[i-1] + batch_index_to_excl = last_key_frame_position - 1 + else: + batch_index_from = keyframe_positions[i-1] + 1 + batch_index_to_excl = last_key_frame_position + weights, frame_numbers = calculate_weights(batch_index_from, batch_index_to_excl, strength_from, strength_to, interpolation, False, last_key_frame_position, i, len(keyframe_positions), buffer) else: # middle images @@ -414,13 +433,13 @@ class BatchCreativeInterpolationNode: # CALCULATE WEIGHTS FOR FIRST HALF previous_key_frame_position = keyframe_positions[i-1] batch_index_from = calculate_influence_frame_number(keyframe_position, previous_key_frame_position, key_frame_influence_from) - batch_index_to_excl = keyframe_position + batch_index_to_excl = keyframe_position + 1 first_half_weights, first_half_frame_numbers = calculate_weights(batch_index_from, batch_index_to_excl, start_strength, mid_strength, interpolation, False, last_key_frame_position, i, len(keyframe_positions), buffer) # CALCULATE WEIGHTS FOR SECOND HALF next_key_frame_position = keyframe_positions[i+1] batch_index_from = keyframe_position - batch_index_to_excl = calculate_influence_frame_number(keyframe_position, next_key_frame_position, key_frame_influence_to) + batch_index_to_excl = calculate_influence_frame_number(keyframe_position, next_key_frame_position, key_frame_influence_to) + 2 second_half_weights, second_half_frame_numbers = calculate_weights(batch_index_from, batch_index_to_excl, mid_strength, end_strength, interpolation, False, last_key_frame_position, i, len(keyframe_positions), buffer) # COMBINE FIRST AND SECOND HALF @@ -467,7 +486,7 @@ class BatchCreativeInterpolationNode: comparison_diagram, = plot_weight_comparison(all_cn_frame_numbers, all_cn_weights, all_ipa_frame_numbers, all_ipa_weights, buffer) - return comparison_diagram, positive, negative, model, sparse_indexes, last_key_frame_position + return comparison_diagram, positive, negative, model, sparse_indexes, last_key_frame_position, buffer class IpaConfigurationNode: WEIGHT_TYPES = ["linear", "ease in", "ease out", 'ease in-out', 'reverse in-out', 'weak input', 'weak output', 'weak middle', 'strong middle'] diff --git a/demo/creative_interpolation_example.json b/demo/creative_interpolation_example.json index 930e15e..ee78a22 100644 --- a/demo/creative_interpolation_example.json +++ b/demo/creative_interpolation_example.json @@ -1,6 +1,6 @@ { - "last_node_id": 611, - "last_link_id": 1108, + "last_node_id": 628, + "last_link_id": 1145, "nodes": [ { "id": 570, @@ -177,7 +177,7 @@ { "name": "model", "type": "MODEL", - "link": 1043 + "link": 1134 }, { "name": "m_models", @@ -303,7 +303,7 @@ "name": "MODEL", "type": "MODEL", "links": [ - 1070 + 1130 ], "shape": 3, "slot_index": 0 @@ -539,7 +539,7 @@ "1": 364.0000305175781 }, "flags": {}, - "order": 45, + "order": 44, "mode": 0, "inputs": [ { @@ -553,7 +553,7 @@ "name": "POS", "type": "CONDITIONING", "links": [ - 1008 + 1132 ], "shape": 3, "slot_index": 0 @@ -643,7 +643,7 @@ 26 ], "flags": {}, - "order": 47, + "order": 46, "mode": 0, "inputs": [ { @@ -676,39 +676,6 @@ "color": "#223", "bgcolor": "#335" }, - { - "id": 370, - "type": "CLIPVisionLoader", - "pos": [ - -516.6813242084264, - -973.3578795330181 - ], - "size": { - "0": 210, - "1": 91.58576202392578 - }, - "flags": {}, - "order": 9, - "mode": 0, - "outputs": [ - { - "name": "CLIP_VISION", - "type": "CLIP_VISION", - "links": [ - 1013, - 1071 - ], - "shape": 3, - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "CLIPVisionLoader" - }, - "widgets_values": [ - "SD1.5/pytorch_model.bin" - ] - }, { "id": 401, "type": "VHS_LoadImagesPath", @@ -721,7 +688,7 @@ 194 ], "flags": {}, - "order": 10, + "order": 9, "mode": 0, "outputs": [ { @@ -790,7 +757,7 @@ "1": 414.3955993652344 }, "flags": {}, - "order": 11, + "order": 10, "mode": 0, "inputs": [], "outputs": [], @@ -805,194 +772,6 @@ "bgcolor": "#335", "shape": 1 }, - { - "id": 354, - "type": "VHS_SplitImages", - "pos": [ - 4457.920801290209, - -487.8616832295038 - ], - "size": { - "0": 231.97152709960938, - "1": 152.94261169433594 - }, - "flags": { - "collapsed": true - }, - "order": 66, - "mode": 0, - "inputs": [ - { - "name": "images", - "type": "IMAGE", - "link": 1098 - } - ], - "outputs": [ - { - "name": "IMAGE_A", - "type": "IMAGE", - "links": [], - "shape": 3, - "slot_index": 0 - }, - { - "name": "A_count", - "type": "INT", - "links": null, - "shape": 3 - }, - { - "name": "IMAGE_B", - "type": "IMAGE", - "links": [ - 1030 - ], - "shape": 3, - "slot_index": 2 - }, - { - "name": "B_count", - "type": "INT", - "links": null, - "shape": 3, - "slot_index": 3 - } - ], - "properties": { - "Node name for S&R": "VHS_SplitImages" - }, - "widgets_values": { - "split_index": 3 - } - }, - { - "id": 600, - "type": "Reroute", - "pos": [ - 4440.920801290209, - -757.8616832295039 - ], - "size": [ - 82, - 26 - ], - "flags": {}, - "order": 65, - "mode": 0, - "inputs": [ - { - "name": "", - "type": "*", - "link": 1099, - "slot_index": 0 - } - ], - "outputs": [ - { - "name": "IMAGE", - "type": "IMAGE", - "links": [ - 1098 - ], - "slot_index": 0 - } - ], - "properties": { - "showOutputText": true, - "horizontal": false, - "ttNbgOverride": { - "color": "#223", - "bgcolor": "#335", - "groupcolor": "#88A" - } - }, - "color": "#223", - "bgcolor": "#335" - }, - { - "id": 597, - "type": "ColorMatch", - "pos": [ - 4545.920801290209, - -674.8616832295039 - ], - "size": { - "0": 234.49517822265625, - "1": 78 - }, - "flags": { - "collapsed": true - }, - "order": 57, - "mode": 0, - "inputs": [ - { - "name": "image_ref", - "type": "IMAGE", - "link": 1094 - }, - { - "name": "image_target", - "type": "IMAGE", - "link": null - } - ], - "outputs": [ - { - "name": "image", - "type": "IMAGE", - "links": [], - "shape": 3, - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "ColorMatch" - }, - "widgets_values": [ - "mkl" - ] - }, - { - "id": 571, - "type": "LoadImage", - "pos": [ - -1780, - -1404 - ], - "size": { - "0": 315, - "1": 314.0000915527344 - }, - "flags": {}, - "order": 12, - "mode": 0, - "outputs": [ - { - "name": "IMAGE", - "type": "IMAGE", - "links": [ - 1050 - ], - "shape": 3, - "slot_index": 0 - }, - { - "name": "MASK", - "type": "MASK", - "links": null, - "shape": 3 - } - ], - "properties": { - "Node name for S&R": "LoadImage" - }, - "widgets_values": [ - "10.png", - "image" - ] - }, { "id": 536, "type": "ADE_AnimateDiffLoRALoader", @@ -1098,96 +877,6 @@ 1 ] }, - { - "id": 598, - "type": "ImageFromBatch", - "pos": [ - 4501.920801290209, - -575.8616832295039 - ], - "size": { - "0": 315, - "1": 82 - }, - "flags": { - "collapsed": true - }, - "order": 53, - "mode": 0, - "inputs": [ - { - "name": "image", - "type": "IMAGE", - "link": 1096 - } - ], - "outputs": [ - { - "name": "IMAGE", - "type": "IMAGE", - "links": [ - 1094 - ], - "shape": 3, - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "ImageFromBatch" - }, - "widgets_values": [ - 0, - 1 - ] - }, - { - "id": 562, - "type": "FILM VFI", - "pos": [ - 4503.920801290209, - -393.8616832295038 - ], - "size": { - "0": 443.4000244140625, - "1": 126 - }, - "flags": { - "collapsed": true - }, - "order": 67, - "mode": 0, - "inputs": [ - { - "name": "frames", - "type": "IMAGE", - "link": 1030 - }, - { - "name": "optional_interpolation_states", - "type": "INTERPOLATION_STATES", - "link": null - } - ], - "outputs": [ - { - "name": "IMAGE", - "type": "IMAGE", - "links": [ - 1031 - ], - "shape": 3, - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "FILM VFI" - }, - "widgets_values": [ - "film_net_fp32.pt", - 10, - 2 - ] - }, { "id": 472, "type": "Note Plus (mtb)", @@ -1208,7 +897,7 @@ "1": 347.8489685058594 }, "flags": {}, - "order": 13, + "order": 11, "mode": 0, "inputs": [], "outputs": [], @@ -1223,93 +912,6 @@ "bgcolor": "#335", "shape": 1 }, - { - "id": 585, - "type": "Integer", - "pos": [ - -1322, - -686 - ], - "size": { - "0": 210, - "1": 58 - }, - "flags": {}, - "order": 14, - "mode": 0, - "outputs": [ - { - "name": "INT", - "type": "INT", - "links": [ - 1076, - 1101 - ], - "shape": 3, - "slot_index": 0 - } - ], - "title": "Height", - "properties": { - "Node name for S&R": "Integer" - }, - "widgets_values": [ - 512 - ] - }, - { - "id": 548, - "type": "BatchValueScheduleLatentInput", - "pos": [ - 3684, - -901 - ], - "size": { - "0": 352.79998779296875, - "1": 140.00003051757812 - }, - "flags": {}, - "order": 58, - "mode": 0, - "inputs": [ - { - "name": "num_latents", - "type": "LATENT", - "link": 1006 - } - ], - "outputs": [ - { - "name": "FLOAT", - "type": "FLOAT", - "links": [ - 998 - ], - "shape": 3, - "slot_index": 0 - }, - { - "name": "INT", - "type": "INT", - "links": null, - "shape": 3, - "slot_index": 1 - }, - { - "name": "LATENT", - "type": "LATENT", - "links": null, - "shape": 3 - } - ], - "properties": { - "Node name for S&R": "BatchValueScheduleLatentInput" - }, - "widgets_values": [ - "0:(1.20)", - true - ] - }, { "id": 342, "type": "ADE_AnimateDiffUniformContextOptions", @@ -1322,7 +924,7 @@ "1": 365.04229736328125 }, "flags": {}, - "order": 15, + "order": 12, "mode": 0, "inputs": [ { @@ -1382,7 +984,7 @@ "1": 410.23016357421875 }, "flags": {}, - "order": 16, + "order": 13, "mode": 0, "inputs": [], "outputs": [], @@ -1397,138 +999,6 @@ "bgcolor": "#335", "shape": 1 }, - { - "id": 281, - "type": "VHS_VideoCombine", - "pos": [ - 4743, - -1069 - ], - "size": [ - 810, - 1094 - ], - "flags": {}, - "order": 68, - "mode": 0, - "inputs": [ - { - "name": "images", - "type": "IMAGE", - "link": 1031 - }, - { - "name": "audio", - "type": "VHS_AUDIO", - "link": null - }, - { - "name": "batch_manager", - "type": "VHS_BatchManager", - "link": null - } - ], - "outputs": [ - { - "name": "Filenames", - "type": "VHS_FILENAMES", - "links": null, - "shape": 3 - } - ], - "properties": { - "Node name for S&R": "VHS_VideoCombine" - }, - "widgets_values": { - "frame_rate": 12, - "loop_count": 0, - "filename_prefix": "steerable-motion/AD_", - "format": "video/h264-mp4", - "pix_fmt": "yuv420p", - "crf": 20, - "save_metadata": true, - "pingpong": false, - "save_output": true, - "videopreview": { - "hidden": false, - "paused": false, - "params": { - "filename": "AD__00978.mp4", - "subfolder": "steerable-motion", - "type": "output", - "format": "video/h264-mp4" - } - } - } - }, - { - "id": 464, - "type": "ADE_EmptyLatentImageLarge", - "pos": [ - -1350, - -480 - ], - "size": { - "0": 310.79998779296875, - "1": 74 - }, - "flags": { - "collapsed": true - }, - "order": 56, - "mode": 0, - "inputs": [ - { - "name": "width", - "type": "INT", - "link": 1075, - "widget": { - "name": "width" - }, - "slot_index": 0 - }, - { - "name": "height", - "type": "INT", - "link": 1076, - "widget": { - "name": "height" - } - }, - { - "name": "batch_size", - "type": "INT", - "link": 1019, - "widget": { - "name": "batch_size" - }, - "slot_index": 2 - } - ], - "outputs": [ - { - "name": "LATENT", - "type": "LATENT", - "links": [ - 876, - 1006, - 1022 - ], - "shape": 3, - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "ADE_EmptyLatentImageLarge" - }, - "widgets_values": [ - 512, - 512, - 52 - ], - "color": "#232", - "bgcolor": "#353" - }, { "id": 569, "type": "LoadImage", @@ -1541,7 +1011,7 @@ "1": 314.0000915527344 }, "flags": {}, - "order": 17, + "order": 14, "mode": 0, "outputs": [ { @@ -1568,40 +1038,6 @@ "image" ] }, - { - "id": 584, - "type": "Integer", - "pos": [ - -1327, - -812 - ], - "size": { - "0": 210, - "1": 58 - }, - "flags": {}, - "order": 18, - "mode": 0, - "outputs": [ - { - "name": "INT", - "type": "INT", - "links": [ - 1075, - 1100 - ], - "shape": 3, - "slot_index": 0 - } - ], - "title": "Height", - "properties": { - "Node name for S&R": "Width" - }, - "widgets_values": [ - 512 - ] - }, { "id": 551, "type": "Note Plus (mtb)", @@ -1622,7 +1058,7 @@ "1": 210.67857360839844 }, "flags": {}, - "order": 19, + "order": 15, "mode": 0, "inputs": [], "outputs": [], @@ -1637,40 +1073,6 @@ "bgcolor": "#335", "shape": 1 }, - { - "id": 369, - "type": "IPAdapterModelLoader", - "pos": [ - -281, - -979 - ], - "size": { - "0": 210, - "1": 94.37141418457031 - }, - "flags": { - "collapsed": false - }, - "order": 20, - "mode": 0, - "outputs": [ - { - "name": "IPADAPTER", - "type": "IPADAPTER", - "links": [ - 1012 - ], - "shape": 3, - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "IPAdapterModelLoader" - }, - "widgets_values": [ - "ip-adapter-plus_sd15.bin" - ] - }, { "id": 603, "type": "Note Plus (mtb)", @@ -1691,7 +1093,7 @@ "1": 347.8489685058594 }, "flags": {}, - "order": 21, + "order": 16, "mode": 0, "inputs": [], "outputs": [], @@ -1726,7 +1128,7 @@ "1": 390 }, "flags": {}, - "order": 22, + "order": 17, "mode": 0, "inputs": [], "outputs": [], @@ -1753,7 +1155,7 @@ "1": 99.132568359375 }, "flags": {}, - "order": 23, + "order": 18, "mode": 0, "outputs": [ { @@ -1872,10 +1274,10 @@ "name": "IMAGE", "type": "IMAGE", "links": [ - 1057, 1058, 1061, - 1096 + 1096, + 1131 ], "slot_index": 0 } @@ -1892,12 +1294,1607 @@ "color": "#223", "bgcolor": "#335" }, + { + "id": 567, + "type": "LoadImage", + "pos": [ + -2107, + -661 + ], + "size": { + "0": 315, + "1": 314.0000915527344 + }, + "flags": {}, + "order": 19, + "mode": 4, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 1053 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "11.png", + "image" + ] + }, + { + "id": 450, + "type": "Note Plus (mtb)", + "pos": { + "0": -988, + "1": -647, + "2": 0, + "3": 0, + "4": 0, + "5": 0, + "6": 0, + "7": 0, + "8": 0, + "9": 0 + }, + "size": { + "0": 482.6034240722656, + "1": 133.46688842773438 + }, + "flags": {}, + "order": 20, + "mode": 0, + "inputs": [], + "outputs": [], + "title": "Note+ (mtb)", + "properties": {}, + "widgets_values": [ + "### Setting frame position ⮕\n\n
\n\nSetting linear frame distribution makes the frames spaced out by the linear value - for example, if it's set to 16, the frames will be at positions 0, 16, 32, etc. If you set type to dynamic, you'll need to enter the values below.", + "markdown", + "" + ], + "color": "#223", + "bgcolor": "#335", + "shape": 1 + }, + { + "id": 451, + "type": "Note Plus (mtb)", + "pos": { + "0": -984, + "1": -479, + "2": 0, + "3": 0, + "4": 0, + "5": 0, + "6": 0, + "7": 0, + "8": 0, + "9": 0 + }, + "size": { + "0": 458.4281921386719, + "1": 104.89824676513672 + }, + "flags": {}, + "order": 21, + "mode": 0, + "inputs": [], + "outputs": [], + "title": "Note+ (mtb)", + "properties": {}, + "widgets_values": [ + "### Set duration of frame influence ⮕\n
\n1.0 equals around the distance between this and the next frames, 2.0 equals twice this. You can set these values for each frame individually in the field below. ", + "markdown", + "" + ], + "color": "#223", + "bgcolor": "#335", + "shape": 1 + }, + { + "id": 452, + "type": "Note Plus (mtb)", + "pos": { + "0": -970, + "1": -336, + "2": 0, + "3": 0, + "4": 0, + "5": 0, + "6": 0, + "7": 0, + "8": 0, + "9": 0 + }, + "size": { + "0": 441.84912109375, + "1": 100.49270629882812 + }, + "flags": {}, + "order": 22, + "mode": 0, + "inputs": [], + "outputs": [], + "title": "Note+ (mtb)", + "properties": {}, + "widgets_values": [ + "### Set low and high point of strength ⮕\n
\n\nThe number are the range the strength runs from and to.", + "markdown", + "" + ], + "color": "#223", + "bgcolor": "#335", + "shape": 1 + }, + { + "id": 596, + "type": "Note Plus (mtb)", + "pos": { + "0": -848, + "1": 463, + "2": 0, + "3": 0, + "4": 0, + "5": 0, + "6": 0, + "7": 0, + "8": 0, + "9": 0 + }, + "size": { + "0": 586.2946166992188, + "1": 67.32426452636719 + }, + "flags": {}, + "order": 23, + "mode": 0, + "inputs": [], + "outputs": [], + "title": "Note+ (mtb)", + "properties": {}, + "widgets_values": [ + "If you can't see these nodes, you need to update the Steerable Moton node in Comfy Manager!", + "markdown", + "" + ], + "color": "#223", + "bgcolor": "#335", + "shape": 1 + }, + { + "id": 601, + "type": "Note Plus (mtb)", + "pos": { + "0": 4435, + "1": -956, + "2": 0, + "3": 0, + "4": 0, + "5": 0, + "6": 0, + "7": 0, + "8": 0, + "9": 0 + }, + "size": { + "0": 229.360595703125, + "1": 103.94804382324219 + }, + "flags": {}, + "order": 24, + "mode": 0, + "inputs": [], + "outputs": [], + "title": "Note+ (mtb)", + "properties": {}, + "widgets_values": [ + "To color match to the original frame, plug the image into the color match node.", + "markdown", + "" + ], + "color": "#223", + "bgcolor": "#335", + "shape": 1 + }, + { + "id": 568, + "type": "ImpactMakeImageBatch", + "pos": [ + -1288, + -1155 + ], + "size": { + "0": 140, + "1": 266 + }, + "flags": {}, + "order": 47, + "mode": 0, + "inputs": [ + { + "name": "image1", + "type": "IMAGE", + "link": 1049 + }, + { + "name": "image2", + "type": "IMAGE", + "link": 1050 + }, + { + "name": "image3", + "type": "IMAGE", + "link": 1051 + }, + { + "name": "image4", + "type": "IMAGE", + "link": 1052 + }, + { + "name": "image5", + "type": "IMAGE", + "link": 1053, + "slot_index": 4 + }, + { + "name": "image6", + "type": "IMAGE", + "link": 1054 + }, + { + "name": "image7", + "type": "IMAGE", + "link": 1055, + "slot_index": 6 + }, + { + "name": "image8", + "type": "IMAGE", + "link": 1056, + "slot_index": 7 + }, + { + "name": "image9", + "type": "IMAGE", + "link": null, + "slot_index": 8 + }, + { + "name": "image10", + "type": "IMAGE", + "link": null, + "slot_index": 9 + }, + { + "name": "image11", + "type": "IMAGE", + "link": null, + "slot_index": 10 + }, + { + "name": "image12", + "type": "IMAGE", + "link": null, + "slot_index": 11 + }, + { + "name": "image13", + "type": "IMAGE", + "link": null + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 1103 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ImpactMakeImageBatch" + }, + "color": "#222", + "bgcolor": "#000" + }, + { + "id": 582, + "type": "Note Plus (mtb)", + "pos": { + "0": -973, + "1": -196, + "2": 0, + "3": 0, + "4": 0, + "5": 0, + "6": 0, + "7": 0, + "8": 0, + "9": 0 + }, + "size": { + "0": 454.5255432128906, + "1": 113.7284164428711 + }, + "flags": {}, + "order": 25, + "mode": 0, + "inputs": [], + "outputs": [], + "title": "Note+ (mtb)", + "properties": {}, + "widgets_values": [ + "### High detail mode ⮕\n
\n\nThis makes the frames significantly more detailed by using two IPAs - but results in each frame consumes twice as much RAM.", + "markdown", + "" + ], + "color": "#223", + "bgcolor": "#335", + "shape": 1 + }, + { + "id": 607, + "type": "Note Plus (mtb)", + "pos": { + "0": -482, + "1": -122, + "2": 0, + "3": 0, + "4": 0, + "5": 0, + "6": 0, + "7": 0, + "8": 0, + "9": 0 + }, + "size": { + "0": 454.9755554199219, + "1": 108.35885620117188 + }, + "flags": {}, + "order": 26, + "mode": 0, + "inputs": [], + "outputs": [], + "title": "Note+ (mtb)", + "properties": {}, + "widgets_values": [ + "### Strength of adherence\n
\n\nSet this higher to improve adherence to your inputs. Set it too high and it'll cause artifacts. The best motion tends to result from lower settings.", + "markdown", + "" + ], + "color": "#223", + "bgcolor": "#335", + "shape": 1 + }, + { + "id": 461, + "type": "CheckpointLoaderSimple", + "pos": [ + -1327, + -381 + ], + "size": { + "0": 210, + "1": 98 + }, + "flags": {}, + "order": 27, + "mode": 0, + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 1107 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 1106, + 1108 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "VAE", + "type": "VAE", + "links": [ + 1089 + ], + "shape": 3, + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "CheckpointLoaderSimple" + }, + "widgets_values": [ + "DreamShaper_6.31_BakedVae.safetensors" + ] + }, + { + "id": 543, + "type": "PromptSchedule", + "pos": [ + 1316, + -990 + ], + "size": { + "0": 367.4313659667969, + "1": 364.0000305175781 + }, + "flags": {}, + "order": 45, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 1108 + } + ], + "outputs": [ + { + "name": "POS", + "type": "CONDITIONING", + "links": [], + "shape": 3, + "slot_index": 0 + }, + { + "name": "NEG", + "type": "CONDITIONING", + "links": [ + 1133 + ], + "shape": 3, + "slot_index": 1 + } + ], + "title": "Negative Prompt", + "properties": { + "Node name for S&R": "PromptSchedule" + }, + "widgets_values": [ + "\"4\": \"\", \"36\": \"\", \"68\": \"\"", + 120, + 0, + false, + "", + "", + 0, + 0, + 0, + 0 + ] + }, + { + "id": 445, + "type": "Note Plus (mtb)", + "pos": { + "0": -2833, + "1": -1446, + "2": 0, + "3": 0, + "4": 0, + "5": 0, + "6": 0, + "7": 0, + "8": 0, + "9": 0 + }, + "size": { + "0": 644.6599731445312, + "1": 1043.39404296875 + }, + "flags": {}, + "order": 28, + "mode": 0, + "inputs": [], + "outputs": [], + "title": "Note+ (mtb)", + "properties": {}, + "widgets_values": [ + "# A brief guide\n\n
\n\n## Philosophy for getting the most from this:\n\n
\n\nThis isn’t a tool like text to video that will perform well out of the box - it’s more like a paint brush, an artistic tool that you need to figure out how to get the best from. \n\n
\n\nThrough trial and error, you'll need to build an understanding of how the motion and settings work, what its limitations are, which inputs work best with it, etc.\n\n
\n\nIf you can figure out how to wield it, this approach can provide enough control for you to make beautiful things that match your imagination precisely.\n\n
\n\n## How to use this:\n
\n1.Input the images that you want to use. The most important thing that will influence the quality and coherence of your creation is the input images.\n\n
\n\n2.Try the basic settings to start. Based on the resulting generation, try to understand what happened - you can learn about the settings and observe the graphs to the right.\n\n
\n\n3.Tweak the settings until you achieve your desired effect. \n\n
\n\n## What this will & won't be suitable for:\n
\nI believe that this will be good for a wide range of storytelling-driven and abstract motion.\n
\n
\nHowever, it probably won't be good for realistic motion - other approaches like vid2vid are far more suitable for this.\n
\n
\n## If you're having problems:\n\n\n
\n\nFirst, download the latest version of this workflow from [here](https://raw.githubusercontent.com/peteromallet/steerable-motion/main/demo/creative_interpolation_example.json) and get the latest version of the node from Comfy Manager.\n\n
\n\nIf that doesn't work, drop into [our Discord](https://discord.gg/V72vk8T67n) and share your problem and I'll try to help ASAP.\n\n
\n\n\n## Want to join a community of people who are pushing open source models to their technical and artistic limits?\n\n
\n\nYou're welcome to join [our Discord](https://discord.gg/UJf6aum7WZ).\n\n
\n\nPlease share anything you generate in the steerable-motion channel.", + "markdown", + "" + ], + "color": "#223", + "bgcolor": "#335", + "shape": 1 + }, + { + "id": 467, + "type": "ACN_SparseCtrlLoaderAdvanced", + "pos": [ + 1818, + -1021 + ], + "size": { + "0": 252, + "1": 150 + }, + "flags": {}, + "order": 56, + "mode": 0, + "inputs": [ + { + "name": "sparse_method", + "type": "SPARSE_METHOD", + "link": 1135, + "slot_index": 0 + }, + { + "name": "tk_optional", + "type": "TIMESTEP_KEYFRAME", + "link": null + } + ], + "outputs": [ + { + "name": "CONTROL_NET", + "type": "CONTROL_NET", + "links": [ + 879 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ACN_SparseCtrlLoaderAdvanced" + }, + "widgets_values": [ + "v3_sd15_sparsectrl_rgb.ckpt", + true, + 1.04, + 1 + ] + }, + { + "id": 469, + "type": "ACN_SparseCtrlRGBPreprocessor", + "pos": [ + 1837, + -755 + ], + "size": { + "0": 312.9380187988281, + "1": 66 + }, + "flags": {}, + "order": 59, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 1058 + }, + { + "name": "vae", + "type": "VAE", + "link": 1079 + }, + { + "name": "latent_size", + "type": "LATENT", + "link": 1022 + } + ], + "outputs": [ + { + "name": "proc_IMAGE", + "type": "IMAGE", + "links": [ + 1064 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ACN_SparseCtrlRGBPreprocessor" + } + }, + { + "id": 610, + "type": "Note Plus (mtb)", + "pos": { + "0": 2111, + "1": -1110, + "2": 0, + "3": 0, + "4": 0, + "5": 0, + "6": 0, + "7": 0, + "8": 0, + "9": 0 + }, + "size": { + "0": 273.747314453125, + "1": 263.64703369140625 + }, + "flags": {}, + "order": 29, + "mode": 0, + "inputs": [], + "outputs": [], + "title": "Note+ (mtb)", + "properties": {}, + "widgets_values": [ + "## Tweak Sparse Ctrl end_percent to improve adherence ⮕\n
\n Though the motion tends to be smoother on lower settings, increasing `end_steps` with improve adherence to the input images. Increasing it above 0.6 tends to cause issues.", + "markdown", + "" + ], + "color": "#223", + "bgcolor": "#335", + "shape": 1 + }, + { + "id": 594, + "type": "IpaConfiguration", + "pos": [ + -537, + 124 + ], + "size": { + "0": 265.1364440917969, + "1": 306.6571350097656 + }, + "flags": {}, + "order": 30, + "mode": 4, + "outputs": [ + { + "name": "configuration", + "type": "ADVANCED_IPA_SETTINGS", + "links": [ + 1126 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "IpaConfiguration" + }, + "widgets_values": [ + 0.3, + 0.75, + "linear", + 1, + "V only", + 0, + false, + "fade", + 0 + ] + }, + { + "id": 593, + "type": "IpaConfiguration", + "pos": [ + -836, + 135 + ], + "size": { + "0": 267.9491882324219, + "1": 295.9013977050781 + }, + "flags": { + "collapsed": false + }, + "order": 31, + "mode": 4, + "outputs": [ + { + "name": "configuration", + "type": "ADVANCED_IPA_SETTINGS", + "links": [ + 1127 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "IpaConfiguration" + }, + "widgets_values": [ + 0, + 0.3, + "ease in-out", + 1, + "V only", + 0, + false, + "fade", + 0 + ] + }, + { + "id": 370, + "type": "CLIPVisionLoader", + "pos": [ + -516.6813242084264, + -973.3578795330181 + ], + "size": { + "0": 210, + "1": 91.58576202392578 + }, + "flags": {}, + "order": 32, + "mode": 0, + "outputs": [ + { + "name": "CLIP_VISION", + "type": "CLIP_VISION", + "links": [ + 1071, + 1128 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPVisionLoader" + }, + "widgets_values": [ + "SD1.5/pytorch_model.bin" + ] + }, + { + "id": 369, + "type": "IPAdapterModelLoader", + "pos": [ + -281, + -979 + ], + "size": { + "0": 210, + "1": 94.37141418457031 + }, + "flags": { + "collapsed": false + }, + "order": 33, + "mode": 0, + "outputs": [ + { + "name": "IPADAPTER", + "type": "IPADAPTER", + "links": [ + 1129 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "IPAdapterModelLoader" + }, + "widgets_values": [ + "ip-adapter-plus_sd15.bin" + ] + }, + { + "id": 464, + "type": "ADE_EmptyLatentImageLarge", + "pos": [ + -1340, + -520 + ], + "size": { + "0": 310.79998779296875, + "1": 74 + }, + "flags": { + "collapsed": true + }, + "order": 57, + "mode": 0, + "inputs": [ + { + "name": "width", + "type": "INT", + "link": 1140, + "widget": { + "name": "width" + }, + "slot_index": 0 + }, + { + "name": "height", + "type": "INT", + "link": 1139, + "widget": { + "name": "height" + } + }, + { + "name": "batch_size", + "type": "INT", + "link": 1137, + "widget": { + "name": "batch_size" + }, + "slot_index": 2 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 876, + 1006, + 1022 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ADE_EmptyLatentImageLarge" + }, + "widgets_values": [ + 512, + 512, + 52 + ], + "color": "#232", + "bgcolor": "#353" + }, + { + "id": 589, + "type": "Note Plus (mtb)", + "pos": { + "0": 43, + "1": -101, + "2": 0, + "3": 0, + "4": 0, + "5": 0, + "6": 0, + "7": 0, + "8": 0, + "9": 0 + }, + "size": { + "0": 726.9605712890625, + "1": 72.47819519042969 + }, + "flags": {}, + "order": 34, + "mode": 0, + "inputs": [], + "outputs": [], + "title": "Note+ (mtb)", + "properties": {}, + "widgets_values": [ + "Find the settings confusing and hard to understand? This is part of why we made [Dough](https://github.com/banodoco/dough) - an open-source creative tool that provides simple controls on top of this + much more :)", + "markdown", + "" + ], + "color": "#223", + "bgcolor": "#335", + "shape": 1 + }, + { + "id": 588, + "type": "Note Plus (mtb)", + "pos": { + "0": 1770, + "1": -120, + "2": 0, + "3": 0, + "4": 0, + "5": 0, + "6": 0, + "7": 0, + "8": 0, + "9": 0 + }, + "size": { + "0": 225.10308837890625, + "1": 164.3865509033203 + }, + "flags": {}, + "order": 35, + "mode": 0, + "inputs": [], + "outputs": [], + "title": "Note+ (mtb)", + "properties": {}, + "widgets_values": [ + "What else could you add to this workflow or node to do weird or interesting stuff? 🤔\n
\n
\nCome join us in [our Discord](https://discord.gg/UJf6aum7WZ) if you have something interesting.", + "markdown", + "" + ], + "color": "#223", + "bgcolor": "#335", + "shape": 1 + }, + { + "id": 436, + "type": "PreviewImage", + "pos": [ + 0, + -640 + ], + "size": { + "0": 781.8199462890625, + "1": 516.6347045898438 + }, + "flags": {}, + "order": 55, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 1123 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 571, + "type": "LoadImage", + "pos": [ + -1780, + -1400 + ], + "size": { + "0": 315, + "1": 314.0000915527344 + }, + "flags": {}, + "order": 36, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 1050 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "10.png", + "image" + ] + }, + { + "id": 611, + "type": "Note Plus (mtb)", + "pos": { + "0": 4510, + "1": -290, + "2": 0, + "3": 0, + "4": 0, + "5": 0, + "6": 0, + "7": 0, + "8": 0, + "9": 0 + }, + "size": { + "0": 210, + "1": 109.562255859375 + }, + "flags": {}, + "order": 37, + "mode": 0, + "inputs": [], + "outputs": [], + "title": "Note+ (mtb)", + "properties": {}, + "widgets_values": [ + "Make something amazing? Share it in the #art_sharing channel of [our Discord](https://discord.gg/UJf6aum7WZ).", + "markdown", + "" + ], + "color": "#223", + "bgcolor": "#335", + "shape": 1 + }, + { + "id": 614, + "type": "VHS_GetImageCount", + "pos": [ + 4438, + -544 + ], + "size": { + "0": 210, + "1": 26 + }, + "flags": { + "collapsed": true + }, + "order": 67, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 1109 + } + ], + "outputs": [ + { + "name": "count", + "type": "INT", + "links": [ + 1116 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VHS_GetImageCount" + }, + "widgets_values": {} + }, + { + "id": 616, + "type": "SimpleMath+", + "pos": [ + 4506, + -414 + ], + "size": { + "0": 315, + "1": 78 + }, + "flags": { + "collapsed": true + }, + "order": 68, + "mode": 0, + "inputs": [ + { + "name": "a", + "type": "INT,FLOAT", + "link": 1116 + }, + { + "name": "b", + "type": "INT,FLOAT", + "link": 1141 + } + ], + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 1118 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "FLOAT", + "type": "FLOAT", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "SimpleMath+" + }, + "widgets_values": [ + "a-b" + ] + }, + { + "id": 562, + "type": "FILM VFI", + "pos": [ + 4519, + -475 + ], + "size": { + "0": 443.4000244140625, + "1": 126 + }, + "flags": { + "collapsed": true + }, + "order": 70, + "mode": 0, + "inputs": [ + { + "name": "frames", + "type": "IMAGE", + "link": 1115 + }, + { + "name": "optional_interpolation_states", + "type": "INTERPOLATION_STATES", + "link": null + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 1031 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "FILM VFI" + }, + "widgets_values": [ + "film_net_fp32.pt", + 10, + 2 + ] + }, + { + "id": 354, + "type": "VHS_SplitImages", + "pos": [ + 4447, + -612 + ], + "size": [ + 230, + 150 + ], + "flags": { + "collapsed": true + }, + "order": 66, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 1098 + }, + { + "name": "split_index", + "type": "INT", + "link": 1145, + "widget": { + "name": "split_index" + } + } + ], + "outputs": [ + { + "name": "IMAGE_A", + "type": "IMAGE", + "links": [], + "shape": 3, + "slot_index": 0 + }, + { + "name": "A_count", + "type": "INT", + "links": null, + "shape": 3 + }, + { + "name": "IMAGE_B", + "type": "IMAGE", + "links": [ + 1109, + 1112 + ], + "shape": 3, + "slot_index": 2 + }, + { + "name": "B_count", + "type": "INT", + "links": null, + "shape": 3, + "slot_index": 3 + } + ], + "properties": { + "Node name for S&R": "VHS_SplitImages" + }, + "widgets_values": { + "split_index": 3 + } + }, + { + "id": 573, + "type": "LoadImage", + "pos": [ + -1770, + -1030 + ], + "size": { + "0": 315, + "1": 314.0000915527344 + }, + "flags": {}, + "order": 38, + "mode": 4, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 1052 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "13.png", + "image" + ] + }, + { + "id": 389, + "type": "PreviewImage", + "pos": [ + -5, + -1004 + ], + "size": { + "0": 785.2230224609375, + "1": 246 + }, + "flags": {}, + "order": 51, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 1061 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 548, + "type": "BatchValueScheduleLatentInput", + "pos": [ + 3684, + -901 + ], + "size": { + "0": 352.79998779296875, + "1": 140.00003051757812 + }, + "flags": {}, + "order": 58, + "mode": 0, + "inputs": [ + { + "name": "num_latents", + "type": "LATENT", + "link": 1006 + } + ], + "outputs": [ + { + "name": "FLOAT", + "type": "FLOAT", + "links": [ + 998 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "INT", + "type": "INT", + "links": null, + "shape": 3, + "slot_index": 1 + }, + { + "name": "LATENT", + "type": "LATENT", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "BatchValueScheduleLatentInput" + }, + "widgets_values": [ + "0:(1.20)", + true + ] + }, + { + "id": 615, + "type": "VHS_SplitImages", + "pos": [ + 4460, + -352 + ], + "size": { + "0": 231.97152709960938, + "1": 152.94261169433594 + }, + "flags": { + "collapsed": true + }, + "order": 69, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 1112 + }, + { + "name": "split_index", + "type": "INT", + "link": 1118, + "widget": { + "name": "split_index" + } + } + ], + "outputs": [ + { + "name": "IMAGE_A", + "type": "IMAGE", + "links": [ + 1115 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "A_count", + "type": "INT", + "links": null, + "shape": 3 + }, + { + "name": "IMAGE_B", + "type": "IMAGE", + "links": [], + "shape": 3, + "slot_index": 2 + }, + { + "name": "B_count", + "type": "INT", + "links": null, + "shape": 3, + "slot_index": 3 + } + ], + "properties": { + "Node name for S&R": "VHS_SplitImages" + }, + "widgets_values": { + "split_index": 3 + } + }, + { + "id": 597, + "type": "ColorMatch", + "pos": [ + 4545, + -728 + ], + "size": { + "0": 234.49517822265625, + "1": 78 + }, + "flags": { + "collapsed": true + }, + "order": 54, + "mode": 0, + "inputs": [ + { + "name": "image_ref", + "type": "IMAGE", + "link": 1094 + }, + { + "name": "image_target", + "type": "IMAGE", + "link": null + } + ], + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ColorMatch" + }, + "widgets_values": [ + "mkl" + ] + }, + { + "id": 598, + "type": "ImageFromBatch", + "pos": [ + 4485, + -667 + ], + "size": { + "0": 315, + "1": 82 + }, + "flags": { + "collapsed": true + }, + "order": 52, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 1096 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 1094 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ImageFromBatch" + }, + "widgets_values": [ + 0, + 1 + ] + }, + { + "id": 584, + "type": "Integer", + "pos": [ + -1327, + -812 + ], + "size": { + "0": 210, + "1": 58 + }, + "flags": {}, + "order": 39, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 1100, + 1140 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "Height", + "properties": { + "Node name for S&R": "Width" + }, + "widgets_values": [ + 512 + ] + }, + { + "id": 585, + "type": "Integer", + "pos": [ + -1322, + -686 + ], + "size": { + "0": 210, + "1": 58 + }, + "flags": {}, + "order": 40, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 1101, + 1139 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "Height", + "properties": { + "Node name for S&R": "Integer" + }, + "widgets_values": [ + 512 + ] + }, { "id": 207, "type": "KSampler Adv. (Efficient)", "pos": [ - 3142, - -927 + 3140, + -930 ], "size": { "0": 496.3030090332031, @@ -2010,49 +3007,213 @@ "shape": 1 }, { - "id": 567, - "type": "LoadImage", + "id": 624, + "type": "BatchCreativeInterpolation", "pos": [ - -2107, - -661 + -470, + -760 + ], + "size": [ + 400, + 580 ], - "size": { - "0": 315, - "1": 314.0000915527344 - }, "flags": {}, - "order": 24, - "mode": 4, + "order": 53, + "mode": 0, + "inputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "link": 1132 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 1133 + }, + { + "name": "images", + "type": "IMAGE", + "link": 1131 + }, + { + "name": "model", + "type": "MODEL", + "link": 1130 + }, + { + "name": "ipadapter", + "type": "IPADAPTER", + "link": 1129 + }, + { + "name": "clip_vision", + "type": "CLIP_VISION", + "link": 1128 + }, + { + "name": "base_ipa_advanced_settings", + "type": "ADVANCED_IPA_SETTINGS", + "link": 1127 + }, + { + "name": "detail_ipa_advanced_settings", + "type": "ADVANCED_IPA_SETTINGS", + "link": 1126 + } + ], "outputs": [ { - "name": "IMAGE", + "name": "GRAPH", "type": "IMAGE", "links": [ - 1053 + 1123 ], "shape": 3, "slot_index": 0 }, { - "name": "MASK", - "type": "MASK", + "name": "POSITIVE", + "type": "CONDITIONING", + "links": [ + 1124 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "NEGATIVE", + "type": "CONDITIONING", + "links": [ + 1125 + ], + "shape": 3, + "slot_index": 2 + }, + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 1134 + ], + "shape": 3, + "slot_index": 3 + }, + { + "name": "KEYFRAME_POSITIONS", + "type": "SPARSE_METHOD", + "links": [ + 1135 + ], + "shape": 3, + "slot_index": 4 + }, + { + "name": "BATCH_SIZE", + "type": "INT", + "links": [ + 1137 + ], + "shape": 3, + "slot_index": 5 + }, + { + "name": "BUFFER", + "type": "INT", + "links": [ + 1141, + 1145 + ], + "shape": 3, + "slot_index": 6 + } + ], + "properties": { + "Node name for S&R": "BatchCreativeInterpolation" + }, + "widgets_values": [ + "linear", + 16, + "0,9", + "linear", + "1.0", + "(1.0,1.0),(1.0,1.5)(1.0,0.5)", + "linear", + "(0.0,0.9)", + "(0.0,1.0),(0.0,1.0),(0.0,1.0),(0.0,1.0)", + 3, + true + ] + }, + { + "id": 281, + "type": "VHS_VideoCombine", + "pos": [ + 4743, + -1069 + ], + "size": [ + 810, + 1094 + ], + "flags": {}, + "order": 71, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 1031 + }, + { + "name": "audio", + "type": "VHS_AUDIO", + "link": null + }, + { + "name": "batch_manager", + "type": "VHS_BatchManager", + "link": null + } + ], + "outputs": [ + { + "name": "Filenames", + "type": "VHS_FILENAMES", "links": null, "shape": 3 } ], "properties": { - "Node name for S&R": "LoadImage" + "Node name for S&R": "VHS_VideoCombine" }, - "widgets_values": [ - "11.png", - "image" - ] + "widgets_values": { + "frame_rate": 16, + "loop_count": 0, + "filename_prefix": "steerable-motion/AD_", + "format": "video/h264-mp4", + "pix_fmt": "yuv420p", + "crf": 20, + "save_metadata": true, + "pingpong": false, + "save_output": true, + "videopreview": { + "hidden": false, + "paused": false, + "params": { + "filename": "AD__01112.mp4", + "subfolder": "steerable-motion", + "type": "output", + "format": "video/h264-mp4" + } + } + } }, { - "id": 573, + "id": 572, "type": "LoadImage", "pos": [ - -1769, + -2100, -1030 ], "size": { @@ -2060,47 +3221,8 @@ "1": 314.0000915527344 }, "flags": {}, - "order": 25, - "mode": 4, - "outputs": [ - { - "name": "IMAGE", - "type": "IMAGE", - "links": [ - 1052 - ], - "shape": 3, - "slot_index": 0 - }, - { - "name": "MASK", - "type": "MASK", - "links": null, - "shape": 3 - } - ], - "properties": { - "Node name for S&R": "LoadImage" - }, - "widgets_values": [ - "13.png", - "image" - ] - }, - { - "id": 572, - "type": "LoadImage", - "pos": [ - -2103, - -1034 - ], - "size": { - "0": 315, - "1": 314.0000915527344 - }, - "flags": {}, - "order": 26, - "mode": 4, + "order": 41, + "mode": 0, "outputs": [ { "name": "IMAGE", @@ -2127,326 +3249,25 @@ ] }, { - "id": 450, - "type": "Note Plus (mtb)", - "pos": { - "0": -988, - "1": -647, - "2": 0, - "3": 0, - "4": 0, - "5": 0, - "6": 0, - "7": 0, - "8": 0, - "9": 0 - }, - "size": { - "0": 482.6034240722656, - "1": 133.46688842773438 - }, - "flags": {}, - "order": 27, - "mode": 0, - "inputs": [], - "outputs": [], - "title": "Note+ (mtb)", - "properties": {}, - "widgets_values": [ - "### Setting frame position ⮕\n\n
\n\nSetting linear frame distribution makes the frames spaced out by the linear value - for example, if it's set to 16, the frames will be at positions 0, 16, 32, etc. If you set type to dynamic, you'll need to enter the values below.", - "markdown", - "" - ], - "color": "#223", - "bgcolor": "#335", - "shape": 1 - }, - { - "id": 451, - "type": "Note Plus (mtb)", - "pos": { - "0": -984, - "1": -479, - "2": 0, - "3": 0, - "4": 0, - "5": 0, - "6": 0, - "7": 0, - "8": 0, - "9": 0 - }, - "size": { - "0": 458.4281921386719, - "1": 104.89824676513672 - }, - "flags": {}, - "order": 28, - "mode": 0, - "inputs": [], - "outputs": [], - "title": "Note+ (mtb)", - "properties": {}, - "widgets_values": [ - "### Set duration of frame influence ⮕\n
\n1.0 equals around the distance between this and the next frames, 2.0 equals twice this. You can set these values for each frame individually in the field below. ", - "markdown", - "" - ], - "color": "#223", - "bgcolor": "#335", - "shape": 1 - }, - { - "id": 452, - "type": "Note Plus (mtb)", - "pos": { - "0": -970, - "1": -336, - "2": 0, - "3": 0, - "4": 0, - "5": 0, - "6": 0, - "7": 0, - "8": 0, - "9": 0 - }, - "size": { - "0": 441.84912109375, - "1": 100.49270629882812 - }, - "flags": {}, - "order": 29, - "mode": 0, - "inputs": [], - "outputs": [], - "title": "Note+ (mtb)", - "properties": {}, - "widgets_values": [ - "### Set low and high point of strength ⮕\n
\n\nThe number are the range the strength runs from and to.", - "markdown", - "" - ], - "color": "#223", - "bgcolor": "#335", - "shape": 1 - }, - { - "id": 596, - "type": "Note Plus (mtb)", - "pos": { - "0": -848, - "1": 463, - "2": 0, - "3": 0, - "4": 0, - "5": 0, - "6": 0, - "7": 0, - "8": 0, - "9": 0 - }, - "size": { - "0": 586.2946166992188, - "1": 67.32426452636719 - }, - "flags": {}, - "order": 30, - "mode": 0, - "inputs": [], - "outputs": [], - "title": "Note+ (mtb)", - "properties": {}, - "widgets_values": [ - "If you can't see these nodes, you need to update the Steerable Moton node in Comfy Manager!", - "markdown", - "" - ], - "color": "#223", - "bgcolor": "#335", - "shape": 1 - }, - { - "id": 601, - "type": "Note Plus (mtb)", - "pos": { - "0": 4435, - "1": -956, - "2": 0, - "3": 0, - "4": 0, - "5": 0, - "6": 0, - "7": 0, - "8": 0, - "9": 0 - }, - "size": { - "0": 229.360595703125, - "1": 103.94804382324219 - }, - "flags": {}, - "order": 31, - "mode": 0, - "inputs": [], - "outputs": [], - "title": "Note+ (mtb)", - "properties": {}, - "widgets_values": [ - "To color match to the original frame, plug the image into the color match node.", - "markdown", - "" - ], - "color": "#223", - "bgcolor": "#335", - "shape": 1 - }, - { - "id": 589, - "type": "Note Plus (mtb)", - "pos": { - "0": 9, - "1": -97, - "2": 0, - "3": 0, - "4": 0, - "5": 0, - "6": 0, - "7": 0, - "8": 0, - "9": 0 - }, - "size": { - "0": 726.9605712890625, - "1": 72.47819519042969 - }, - "flags": {}, - "order": 32, - "mode": 0, - "inputs": [], - "outputs": [], - "title": "Note+ (mtb)", - "properties": {}, - "widgets_values": [ - "Find the settings confusing and hard to understand? This is part of why we made [Dough](https://github.com/banodoco/dough) - an open-source creative tool that provides simple controls on top of this + much more :)", - "markdown", - "" - ], - "color": "#223", - "bgcolor": "#335", - "shape": 1 - }, - { - "id": 389, - "type": "PreviewImage", + "id": 600, + "type": "Reroute", "pos": [ - -32, - -1011 + 4441, + -757 + ], + "size": [ + 82, + 26 ], - "size": { - "0": 785.2230224609375, - "1": 246 - }, "flags": {}, - "order": 52, + "order": 65, "mode": 0, "inputs": [ { - "name": "images", - "type": "IMAGE", - "link": 1061 - } - ], - "properties": { - "Node name for S&R": "PreviewImage" - } - }, - { - "id": 568, - "type": "ImpactMakeImageBatch", - "pos": [ - -1288, - -1155 - ], - "size": { - "0": 140, - "1": 266 - }, - "flags": {}, - "order": 44, - "mode": 0, - "inputs": [ - { - "name": "image1", - "type": "IMAGE", - "link": 1049 - }, - { - "name": "image2", - "type": "IMAGE", - "link": 1050 - }, - { - "name": "image3", - "type": "IMAGE", - "link": 1051 - }, - { - "name": "image4", - "type": "IMAGE", - "link": 1052 - }, - { - "name": "image5", - "type": "IMAGE", - "link": 1053, - "slot_index": 4 - }, - { - "name": "image6", - "type": "IMAGE", - "link": 1054 - }, - { - "name": "image7", - "type": "IMAGE", - "link": 1055, - "slot_index": 6 - }, - { - "name": "image8", - "type": "IMAGE", - "link": 1056, - "slot_index": 7 - }, - { - "name": "image9", - "type": "IMAGE", - "link": null, - "slot_index": 8 - }, - { - "name": "image10", - "type": "IMAGE", - "link": null, - "slot_index": 9 - }, - { - "name": "image11", - "type": "IMAGE", - "link": null, - "slot_index": 10 - }, - { - "name": "image12", - "type": "IMAGE", - "link": null, - "slot_index": 11 - }, - { - "name": "image13", - "type": "IMAGE", - "link": null + "name": "", + "type": "*", + "link": 1099, + "slot_index": 0 } ], "outputs": [ @@ -2454,119 +3275,29 @@ "name": "IMAGE", "type": "IMAGE", "links": [ - 1103 + 1098 ], - "shape": 3, "slot_index": 0 } ], "properties": { - "Node name for S&R": "ImpactMakeImageBatch" - }, - "color": "#222", - "bgcolor": "#000" - }, - { - "id": 436, - "type": "PreviewImage", - "pos": [ - -3, - -647 - ], - "size": { - "0": 781.8199462890625, - "1": 516.6347045898438 - }, - "flags": {}, - "order": 54, - "mode": 0, - "inputs": [ - { - "name": "images", - "type": "IMAGE", - "link": 1014 + "showOutputText": true, + "horizontal": false, + "ttNbgOverride": { + "color": "#223", + "bgcolor": "#335", + "groupcolor": "#88A" } - ], - "properties": { - "Node name for S&R": "PreviewImage" - } - }, - { - "id": 582, - "type": "Note Plus (mtb)", - "pos": { - "0": -973, - "1": -196, - "2": 0, - "3": 0, - "4": 0, - "5": 0, - "6": 0, - "7": 0, - "8": 0, - "9": 0 }, - "size": { - "0": 454.5255432128906, - "1": 113.7284164428711 - }, - "flags": {}, - "order": 33, - "mode": 0, - "inputs": [], - "outputs": [], - "title": "Note+ (mtb)", - "properties": {}, - "widgets_values": [ - "### High detail mode ⮕\n
\n\nThis makes the frames significantly more detailed by using two IPAs - but results in each frame consumes twice as much RAM.", - "markdown", - "" - ], "color": "#223", - "bgcolor": "#335", - "shape": 1 - }, - { - "id": 607, - "type": "Note Plus (mtb)", - "pos": { - "0": -482, - "1": -122, - "2": 0, - "3": 0, - "4": 0, - "5": 0, - "6": 0, - "7": 0, - "8": 0, - "9": 0 - }, - "size": { - "0": 454.9755554199219, - "1": 108.35885620117188 - }, - "flags": {}, - "order": 34, - "mode": 0, - "inputs": [], - "outputs": [], - "title": "Note+ (mtb)", - "properties": {}, - "widgets_values": [ - "### Strength of adherence\n
\n\nSet this higher to improve adherence to your inputs. Set it too high and it'll cause artifacts. The best motion tends to result from lower settings.", - "markdown", - "" - ], - "color": "#223", - "bgcolor": "#335", - "shape": 1 + "bgcolor": "#335" }, { "id": 468, "type": "ACN_AdvancedControlNetApply", "pos": [ - 2436, - -1110 + 2437, + -1070 ], "size": { "0": 285.6000061035156, @@ -2579,13 +3310,13 @@ { "name": "positive", "type": "CONDITIONING", - "link": 1015, + "link": 1124, "slot_index": 0 }, { "name": "negative", "type": "CONDITIONING", - "link": 1016, + "link": 1125, "slot_index": 1 }, { @@ -2658,565 +3389,6 @@ 0, 0.15 ] - }, - { - "id": 461, - "type": "CheckpointLoaderSimple", - "pos": [ - -1327, - -381 - ], - "size": { - "0": 210, - "1": 98 - }, - "flags": {}, - "order": 35, - "mode": 0, - "outputs": [ - { - "name": "MODEL", - "type": "MODEL", - "links": [ - 1107 - ], - "shape": 3, - "slot_index": 0 - }, - { - "name": "CLIP", - "type": "CLIP", - "links": [ - 1106, - 1108 - ], - "shape": 3, - "slot_index": 1 - }, - { - "name": "VAE", - "type": "VAE", - "links": [ - 1089 - ], - "shape": 3, - "slot_index": 2 - } - ], - "properties": { - "Node name for S&R": "CheckpointLoaderSimple" - }, - "widgets_values": [ - "DreamShaper_6.31_BakedVae.safetensors" - ] - }, - { - "id": 543, - "type": "PromptSchedule", - "pos": [ - 1316, - -990 - ], - "size": { - "0": 367.4313659667969, - "1": 364.0000305175781 - }, - "flags": {}, - "order": 46, - "mode": 0, - "inputs": [ - { - "name": "clip", - "type": "CLIP", - "link": 1108 - } - ], - "outputs": [ - { - "name": "POS", - "type": "CONDITIONING", - "links": [], - "shape": 3, - "slot_index": 0 - }, - { - "name": "NEG", - "type": "CONDITIONING", - "links": [ - 1010 - ], - "shape": 3, - "slot_index": 1 - } - ], - "title": "Negative Prompt", - "properties": { - "Node name for S&R": "PromptSchedule" - }, - "widgets_values": [ - "\"4\": \"\", \"36\": \"\", \"68\": \"\"", - 120, - 0, - false, - "", - "", - 0, - 0, - 0, - 0 - ] - }, - { - "id": 593, - "type": "IpaConfiguration", - "pos": [ - -836, - 135 - ], - "size": { - "0": 267.9491882324219, - "1": 295.9013977050781 - }, - "flags": { - "collapsed": false - }, - "order": 36, - "mode": 4, - "outputs": [ - { - "name": "configuration", - "type": "ADVANCED_IPA_SETTINGS", - "links": [ - 1087 - ], - "shape": 3, - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "IpaConfiguration" - }, - "widgets_values": [ - 0, - 0.3, - "ease in-out", - 1, - "V only", - 0, - false, - "fade", - 0 - ] - }, - { - "id": 594, - "type": "IpaConfiguration", - "pos": [ - -537, - 124 - ], - "size": { - "0": 265.1364440917969, - "1": 306.6571350097656 - }, - "flags": {}, - "order": 37, - "mode": 4, - "outputs": [ - { - "name": "configuration", - "type": "ADVANCED_IPA_SETTINGS", - "links": [ - 1085 - ], - "shape": 3, - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "IpaConfiguration" - }, - "widgets_values": [ - 0.3, - 0.75, - "linear", - 1, - "V only", - 0, - false, - "fade", - 0 - ] - }, - { - "id": 558, - "type": "BatchCreativeInterpolation", - "pos": [ - -480, - -811 - ], - "size": { - "0": 430.4866943359375, - "1": 678.8768920898438 - }, - "flags": {}, - "order": 51, - "mode": 0, - "inputs": [ - { - "name": "positive", - "type": "CONDITIONING", - "link": 1008 - }, - { - "name": "negative", - "type": "CONDITIONING", - "link": 1010 - }, - { - "name": "images", - "type": "IMAGE", - "link": 1057 - }, - { - "name": "model", - "type": "MODEL", - "link": 1070 - }, - { - "name": "ipadapter", - "type": "IPADAPTER", - "link": 1012 - }, - { - "name": "clip_vision", - "type": "CLIP_VISION", - "link": 1013 - }, - { - "name": "base_ipa_advanced_settings", - "type": "ADVANCED_IPA_SETTINGS", - "link": 1087 - }, - { - "name": "detail_ipa_advanced_settings", - "type": "ADVANCED_IPA_SETTINGS", - "link": 1085 - } - ], - "outputs": [ - { - "name": "GRAPH", - "type": "IMAGE", - "links": [ - 1014 - ], - "shape": 3, - "slot_index": 0 - }, - { - "name": "POSITIVE", - "type": "CONDITIONING", - "links": [ - 1015 - ], - "shape": 3, - "slot_index": 1 - }, - { - "name": "NEGATIVE", - "type": "CONDITIONING", - "links": [ - 1016 - ], - "shape": 3, - "slot_index": 2 - }, - { - "name": "MODEL", - "type": "MODEL", - "links": [ - 1043 - ], - "shape": 3, - "slot_index": 3 - }, - { - "name": "KEYFRAME_POSITIONS", - "type": "SPARSE_METHOD", - "links": [ - 1018 - ], - "shape": 3, - "slot_index": 4 - }, - { - "name": "BATCH_SIZE", - "type": "INT", - "links": [ - 1019 - ], - "shape": 3, - "slot_index": 5 - }, - { - "name": "SPARSECTRL_END_PERCENT", - "type": "FLOAT", - "links": [], - "shape": 3, - "slot_index": 6 - } - ], - "properties": { - "Node name for S&R": "BatchCreativeInterpolation" - }, - "widgets_values": [ - "linear", - 16, - "0,16,59", - "linear", - "0.9", - "1.0,1.0,1.0", - "linear", - "(0.0,0.9)", - "(0.3,0.4),(0.3,0.4)", - 4, - true - ] - }, - { - "id": 588, - "type": "Note Plus (mtb)", - "pos": { - "0": 1797, - "1": -126, - "2": 0, - "3": 0, - "4": 0, - "5": 0, - "6": 0, - "7": 0, - "8": 0, - "9": 0 - }, - "size": [ - 225.10308532719569, - 164.3865546328808 - ], - "flags": {}, - "order": 38, - "mode": 0, - "inputs": [], - "outputs": [], - "title": "Note+ (mtb)", - "properties": {}, - "widgets_values": [ - "What else could you add to this workflow or node to do weird or interesting stuff? 🤔\n
\n
\nCome join us in [our Discord](https://discord.gg/UJf6aum7WZ) if you have something interesting.", - "markdown", - "" - ], - "color": "#223", - "bgcolor": "#335", - "shape": 1 - }, - { - "id": 611, - "type": "Note Plus (mtb)", - "pos": { - "0": 4487, - "1": -310, - "2": 0, - "3": 0, - "4": 0, - "5": 0, - "6": 0, - "7": 0, - "8": 0, - "9": 0 - }, - "size": [ - 210, - 109.56225473628581 - ], - "flags": {}, - "order": 39, - "mode": 0, - "inputs": [], - "outputs": [], - "title": "Note+ (mtb)", - "properties": {}, - "widgets_values": [ - "Make something amazing? Share it in the #art_sharing channel of [our Discord](https://discord.gg/UJf6aum7WZ).", - "markdown", - "" - ], - "color": "#223", - "bgcolor": "#335", - "shape": 1 - }, - { - "id": 445, - "type": "Note Plus (mtb)", - "pos": { - "0": -2833, - "1": -1446, - "2": 0, - "3": 0, - "4": 0, - "5": 0, - "6": 0, - "7": 0, - "8": 0, - "9": 0 - }, - "size": [ - 644.6599833578948, - 1043.3939878941435 - ], - "flags": {}, - "order": 40, - "mode": 0, - "inputs": [], - "outputs": [], - "title": "Note+ (mtb)", - "properties": {}, - "widgets_values": [ - "# A brief guide\n\n
\n\n## Philosophy for getting the most from this:\n\n
\n\nThis isn’t a tool like text to video that will perform well out of the box - it’s more like a paint brush, an artistic tool that you need to figure out how to get the best from. \n\n
\n\nThrough trial and error, you'll need to build an understanding of how the motion and settings work, what its limitations are, which inputs work best with it, etc.\n\n
\n\nIf you can figure out how to wield it, this approach can provide enough control for you to make beautiful things that match your imagination precisely.\n\n
\n\n## How to use this:\n
\n1.Input the images that you want to use. The most important thing that will influence the quality and coherence of your creation is the input images.\n\n
\n\n2.Try the basic settings to start. Based on the resulting generation, try to understand what happened - you can learn about the settings and observe the graphs to the right.\n\n
\n\n3.Tweak the settings until you achieve your desired effect. \n\n
\n\n## What this will & won't be suitable for:\n
\nI believe that this will be good for a wide range of storytelling-driven and abstract motion.\n
\n
\nHowever, it probably won't be good for realistic motion - other approaches like vid2vid are far more suitable for this.\n
\n
\n## If you're having problems:\n\n\n
\n\nFirst, download the latest version of this workflow from [here](https://raw.githubusercontent.com/peteromallet/steerable-motion/main/demo/creative_interpolation_example.json) and get the latest version of the node from Comfy Manager.\n\n
\n\nIf that doesn't work, drop into [our Discord](https://discord.gg/V72vk8T67n) and share your problem and I'll try to help ASAP.\n\n
\n\n\n## Want to join a community of people who are pushing open source models to their technical and artistic limits?\n\n
\n\nYou're welcome to join [our Discord](https://discord.gg/UJf6aum7WZ).\n\n
\n\nPlease share anything you generate in the steerable-motion channel.", - "markdown", - "" - ], - "color": "#223", - "bgcolor": "#335", - "shape": 1 - }, - { - "id": 467, - "type": "ACN_SparseCtrlLoaderAdvanced", - "pos": [ - 1818, - -1021 - ], - "size": { - "0": 252, - "1": 150 - }, - "flags": {}, - "order": 55, - "mode": 0, - "inputs": [ - { - "name": "sparse_method", - "type": "SPARSE_METHOD", - "link": 1018, - "slot_index": 0 - }, - { - "name": "tk_optional", - "type": "TIMESTEP_KEYFRAME", - "link": null - } - ], - "outputs": [ - { - "name": "CONTROL_NET", - "type": "CONTROL_NET", - "links": [ - 879 - ], - "shape": 3, - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "ACN_SparseCtrlLoaderAdvanced" - }, - "widgets_values": [ - "v3_sd15_sparsectrl_rgb.ckpt", - true, - 1.04, - 1 - ] - }, - { - "id": 469, - "type": "ACN_SparseCtrlRGBPreprocessor", - "pos": [ - 1837, - -755 - ], - "size": { - "0": 312.9380187988281, - "1": 66 - }, - "flags": {}, - "order": 59, - "mode": 0, - "inputs": [ - { - "name": "image", - "type": "IMAGE", - "link": 1058 - }, - { - "name": "vae", - "type": "VAE", - "link": 1079 - }, - { - "name": "latent_size", - "type": "LATENT", - "link": 1022 - } - ], - "outputs": [ - { - "name": "proc_IMAGE", - "type": "IMAGE", - "links": [ - 1064 - ], - "shape": 3, - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "ACN_SparseCtrlRGBPreprocessor" - } - }, - { - "id": 610, - "type": "Note Plus (mtb)", - "pos": { - "0": 2111, - "1": -1110, - "2": 0, - "3": 0, - "4": 0, - "5": 0, - "6": 0, - "7": 0, - "8": 0, - "9": 0 - }, - "size": [ - 273.7473192106654, - 263.6470368414382 - ], - "flags": {}, - "order": 41, - "mode": 0, - "inputs": [], - "outputs": [], - "title": "Note+ (mtb)", - "properties": {}, - "widgets_values": [ - "## Tweak Sparse Ctrl end_percent to improve adherence ⮕\n
\n Though the motion tends to be smoother on lower settings, increasing `end_steps` with improve adherence to the input images. Increasing it above 0.6 tends to cause issues.", - "markdown", - "" - ], - "color": "#223", - "bgcolor": "#335", - "shape": 1 } ], "links": [ @@ -3308,78 +3480,6 @@ 0, "MOTION_LORA" ], - [ - 1008, - 541, - 0, - 558, - 0, - "CONDITIONING" - ], - [ - 1010, - 543, - 1, - 558, - 1, - "CONDITIONING" - ], - [ - 1012, - 369, - 0, - 558, - 4, - "IPADAPTER" - ], - [ - 1013, - 370, - 0, - 558, - 5, - "CLIP_VISION" - ], - [ - 1014, - 558, - 0, - 436, - 0, - "IMAGE" - ], - [ - 1015, - 558, - 1, - 468, - 0, - "CONDITIONING" - ], - [ - 1016, - 558, - 2, - 468, - 1, - "CONDITIONING" - ], - [ - 1018, - 558, - 4, - 467, - 0, - "SPARSE_METHOD" - ], - [ - 1019, - 558, - 5, - 464, - 2, - "INT" - ], [ 1022, 464, @@ -3396,14 +3496,6 @@ 0, "IMAGE" ], - [ - 1030, - 354, - 2, - 562, - 0, - "IMAGE" - ], [ 1031, 562, @@ -3412,14 +3504,6 @@ 0, "IMAGE" ], - [ - 1043, - 558, - 3, - 547, - 0, - "MODEL" - ], [ 1047, 468, @@ -3500,14 +3584,6 @@ 7, "IMAGE" ], - [ - 1057, - 576, - 0, - 558, - 2, - "IMAGE" - ], [ 1058, 576, @@ -3548,14 +3624,6 @@ 1, "IPADAPTER" ], - [ - 1070, - 581, - 0, - 558, - 3, - "MODEL" - ], [ 1071, 370, @@ -3572,22 +3640,6 @@ 5, "SCRIPT" ], - [ - 1075, - 584, - 0, - 464, - 0, - "INT" - ], - [ - 1076, - 585, - 0, - 464, - 1, - "INT" - ], [ 1079, 590, @@ -3604,22 +3656,6 @@ 4, "VAE" ], - [ - 1085, - 594, - 0, - 558, - 7, - "ADVANCED_IPA_SETTINGS" - ], - [ - 1087, - 593, - 0, - 558, - 6, - "ADVANCED_IPA_SETTINGS" - ], [ 1089, 461, @@ -3715,6 +3751,190 @@ 543, 0, "CLIP" + ], + [ + 1109, + 354, + 2, + 614, + 0, + "IMAGE" + ], + [ + 1112, + 354, + 2, + 615, + 0, + "IMAGE" + ], + [ + 1115, + 615, + 0, + 562, + 0, + "IMAGE" + ], + [ + 1116, + 614, + 0, + 616, + 0, + "INT,FLOAT" + ], + [ + 1118, + 616, + 0, + 615, + 1, + "INT" + ], + [ + 1123, + 624, + 0, + 436, + 0, + "IMAGE" + ], + [ + 1124, + 624, + 1, + 468, + 0, + "CONDITIONING" + ], + [ + 1125, + 624, + 2, + 468, + 1, + "CONDITIONING" + ], + [ + 1126, + 594, + 0, + 624, + 7, + "ADVANCED_IPA_SETTINGS" + ], + [ + 1127, + 593, + 0, + 624, + 6, + "ADVANCED_IPA_SETTINGS" + ], + [ + 1128, + 370, + 0, + 624, + 5, + "CLIP_VISION" + ], + [ + 1129, + 369, + 0, + 624, + 4, + "IPADAPTER" + ], + [ + 1130, + 581, + 0, + 624, + 3, + "MODEL" + ], + [ + 1131, + 576, + 0, + 624, + 2, + "IMAGE" + ], + [ + 1132, + 541, + 0, + 624, + 0, + "CONDITIONING" + ], + [ + 1133, + 543, + 1, + 624, + 1, + "CONDITIONING" + ], + [ + 1134, + 624, + 3, + 547, + 0, + "MODEL" + ], + [ + 1135, + 624, + 4, + 467, + 0, + "SPARSE_METHOD" + ], + [ + 1137, + 624, + 5, + 464, + 2, + "INT" + ], + [ + 1139, + 585, + 0, + 464, + 1, + "INT" + ], + [ + 1140, + 584, + 0, + 464, + 0, + "INT" + ], + [ + 1141, + 624, + 6, + 616, + 1, + "INT,FLOAT" + ], + [ + 1145, + 624, + 6, + 354, + 1, + "INT" ] ], "groups": [