Browse Source

Updated help files

Jonathan Higgins 1 month ago
parent
commit
022ec1f2ee

+ 108 - 55
examples/building_a_thread.thd

@@ -1,5 +1,11 @@
 {
 {
 	"connections": [
 	"connections": [
+		{
+			"from_node_id": 8,
+			"from_port": 0,
+			"to_node_id": 1,
+			"to_port": 0
+		},
 		{
 		{
 			"from_node_id": 1,
 			"from_node_id": 1,
 			"from_port": 0,
 			"from_port": 0,
@@ -19,66 +25,37 @@
 			"to_port": 0
 			"to_port": 0
 		},
 		},
 		{
 		{
-			"from_node_id": 4,
+			"from_node_id": 1,
 			"from_port": 0,
 			"from_port": 0,
 			"to_node_id": 5,
 			"to_node_id": 5,
 			"to_port": 0
 			"to_port": 0
 		},
 		},
 		{
 		{
-			"from_node_id": 2,
+			"from_node_id": 5,
 			"from_port": 0,
 			"from_port": 0,
-			"to_node_id": 6,
-			"to_port": 0
-		},
-		{
-			"from_node_id": 6,
-			"from_port": 0,
-			"to_node_id": 4,
+			"to_node_id": 3,
 			"to_port": 0
 			"to_port": 0
 		}
 		}
 	],
 	],
+	"fftoverlap": 2,
+	"fftsize": 9,
 	"nodes": [
 	"nodes": [
 		{
 		{
-			"checkbutton_states": {
+			"addremoveinlets": {
 
 
 			},
 			},
-			"command": "inputfile",
-			"id": 1,
-			"name": "inputfile",
-			"notes": {
-
-			},
-			"offset": {
-				"x": 20.0,
-				"y": 80.0
-			},
-			"optionbutton_values": {
-				"@OptionButton@3423": 1,
-				"@OptionButton@3464": 0
-			},
-			"slider_values": {
-				"AudioPlayer/FileDialog/@VBoxContainer@3411/@MarginContainer@3451/Tree/@Popup@3437/@VBoxContainer@3438/@HSlider@3446": {
-					"editable": true,
-					"meta": {
-
-					},
-					"value": 0.0
-				}
-			}
-		},
-		{
 			"checkbutton_states": {
 			"checkbutton_states": {
 
 
 			},
 			},
 			"command": "modify_brassage_5",
 			"command": "modify_brassage_5",
-			"id": 2,
+			"id": 1,
 			"name": "modify_brassage_5",
 			"name": "modify_brassage_5",
 			"notes": {
 			"notes": {
 
 
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 481.111206054688,
-				"y": 80.0000152587891
+				"x": 513.333435058594,
+				"y": 81.1111297607422
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
 
 
@@ -88,6 +65,9 @@
 					"editable": true,
 					"editable": true,
 					"meta": {
 					"meta": {
 						"brk": true,
 						"brk": true,
+						"default_value": 0.6,
+						"fftwindowcount": false,
+						"fftwindowsize": false,
 						"flag": "",
 						"flag": "",
 						"max": false,
 						"max": false,
 						"min": false,
 						"min": false,
@@ -98,18 +78,21 @@
 			}
 			}
 		},
 		},
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
 
 
 			},
 			},
 			"command": "distort_interpolate",
 			"command": "distort_interpolate",
-			"id": 3,
+			"id": 2,
 			"name": "distort_interpolate",
 			"name": "distort_interpolate",
 			"notes": {
 			"notes": {
 
 
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 818.889099121094,
-				"y": 80.0000152587891
+				"x": 851.111328125,
+				"y": 81.1111297607422
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
 
 
@@ -119,6 +102,9 @@
 					"editable": true,
 					"editable": true,
 					"meta": {
 					"meta": {
 						"brk": true,
 						"brk": true,
+						"default_value": 2.0,
+						"fftwindowcount": false,
+						"fftwindowsize": false,
 						"flag": "",
 						"flag": "",
 						"max": false,
 						"max": false,
 						"min": false,
 						"min": false,
@@ -129,18 +115,21 @@
 			}
 			}
 		},
 		},
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
 
 
 			},
 			},
 			"command": "filter_bank_5",
 			"command": "filter_bank_5",
-			"id": 4,
+			"id": 3,
 			"name": "filter_bank_5",
 			"name": "filter_bank_5",
 			"notes": {
 			"notes": {
 
 
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 1165.55578613281,
-				"y": 78.8889083862305
+				"x": 1197.77795410156,
+				"y": 80.0000228881836
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
 
 
@@ -150,6 +139,9 @@
 					"editable": true,
 					"editable": true,
 					"meta": {
 					"meta": {
 						"brk": false,
 						"brk": false,
+						"default_value": 12000.0,
+						"fftwindowcount": false,
+						"fftwindowsize": false,
 						"flag": "",
 						"flag": "",
 						"max": true,
 						"max": true,
 						"min": false,
 						"min": false,
@@ -161,6 +153,9 @@
 					"editable": true,
 					"editable": true,
 					"meta": {
 					"meta": {
 						"brk": false,
 						"brk": false,
+						"default_value": 55.0,
+						"fftwindowcount": false,
+						"fftwindowsize": false,
 						"flag": "",
 						"flag": "",
 						"max": false,
 						"max": false,
 						"min": true,
 						"min": true,
@@ -172,6 +167,9 @@
 					"editable": true,
 					"editable": true,
 					"meta": {
 					"meta": {
 						"brk": false,
 						"brk": false,
+						"default_value": 1.5,
+						"fftwindowcount": false,
+						"fftwindowsize": false,
 						"flag": "",
 						"flag": "",
 						"max": false,
 						"max": false,
 						"min": false,
 						"min": false,
@@ -183,6 +181,9 @@
 					"editable": true,
 					"editable": true,
 					"meta": {
 					"meta": {
 						"brk": false,
 						"brk": false,
+						"default_value": 8.0,
+						"fftwindowcount": false,
+						"fftwindowsize": false,
 						"flag": "",
 						"flag": "",
 						"max": false,
 						"max": false,
 						"min": false,
 						"min": false,
@@ -194,6 +195,9 @@
 					"editable": true,
 					"editable": true,
 					"meta": {
 					"meta": {
 						"brk": false,
 						"brk": false,
+						"default_value": 400.0,
+						"fftwindowcount": false,
+						"fftwindowsize": false,
 						"flag": "",
 						"flag": "",
 						"max": false,
 						"max": false,
 						"min": false,
 						"min": false,
@@ -205,6 +209,9 @@
 					"editable": true,
 					"editable": true,
 					"meta": {
 					"meta": {
 						"brk": false,
 						"brk": false,
+						"default_value": 0.0,
+						"fftwindowcount": false,
+						"fftwindowsize": false,
 						"flag": "-s",
 						"flag": "-s",
 						"max": false,
 						"max": false,
 						"min": false,
 						"min": false,
@@ -215,27 +222,30 @@
 			}
 			}
 		},
 		},
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
 				"Autoplay": true,
 				"Autoplay": true,
 				"DeleteIntermediateFilesToggle": true,
 				"DeleteIntermediateFilesToggle": true,
 				"ReuseFolderToggle": true
 				"ReuseFolderToggle": true
 			},
 			},
 			"command": "outputfile",
 			"command": "outputfile",
-			"id": 5,
+			"id": 4,
 			"name": "outputfile",
 			"name": "outputfile",
 			"notes": {
 			"notes": {
 
 
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 1524.44445800781,
-				"y": 78.8888931274414
+				"x": 1556.66674804688,
+				"y": 80.0
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
-				"@OptionButton@3592": 1,
-				"@OptionButton@3633": 0
+				"@OptionButton@4092": 1,
+				"@OptionButton@4133": 0
 			},
 			},
 			"slider_values": {
 			"slider_values": {
-				"AudioPlayer/FileDialog/@VBoxContainer@3580/@MarginContainer@3620/Tree/@Popup@3606/@VBoxContainer@3607/@HSlider@3615": {
+				"AudioPlayer/FileDialog/@VBoxContainer@4080/@MarginContainer@4120/Tree/@Popup@4106/@VBoxContainer@4107/@HSlider@4115": {
 					"editable": true,
 					"editable": true,
 					"meta": {
 					"meta": {
 
 
@@ -245,18 +255,21 @@
 			}
 			}
 		},
 		},
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
 
 
 			},
 			},
 			"command": "modify_speed_2",
 			"command": "modify_speed_2",
-			"id": 6,
+			"id": 5,
 			"name": "modify_speed_2",
 			"name": "modify_speed_2",
 			"notes": {
 			"notes": {
 
 
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 818.889099121094,
-				"y": 244.44450378418
+				"x": 851.111328125,
+				"y": 245.555618286133
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
 
 
@@ -266,6 +279,9 @@
 					"editable": true,
 					"editable": true,
 					"meta": {
 					"meta": {
 						"brk": true,
 						"brk": true,
+						"default_value": -12.0,
+						"fftwindowcount": false,
+						"fftwindowsize": false,
 						"flag": "",
 						"flag": "",
 						"max": false,
 						"max": false,
 						"min": false,
 						"min": false,
@@ -276,11 +292,14 @@
 			}
 			}
 		},
 		},
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
 
 
 			},
 			},
 			"command": "notes",
 			"command": "notes",
-			"id": 7,
+			"id": 6,
 			"name": "notes",
 			"name": "notes",
 			"notes": {
 			"notes": {
 				"CodeEdit": "Multiple nodes can be combined to create a thread.\n\nThey will be run in the order that they are connected in your thread.\n\nNote: all nodes must have a route to and from an input and \"Output File\" to run. Anything not connected will be ignored."
 				"CodeEdit": "Multiple nodes can be combined to create a thread.\n\nThey will be run in the order that they are connected in your thread.\n\nNote: all nodes must have a route to and from an input and \"Output File\" to run. Anything not connected will be ignored."
@@ -297,11 +316,14 @@
 			}
 			}
 		},
 		},
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
 
 
 			},
 			},
 			"command": "notes",
 			"command": "notes",
-			"id": 8,
+			"id": 7,
 			"name": "notes2",
 			"name": "notes2",
 			"notes": {
 			"notes": {
 				"CodeEdit": "The signal can be split out of nodes to run processes in parallel.\n\nYou can also connect multiple outputs from \"Time Domain\" nodes to the input of another to mix their outputs together.\n\nNote: \"Frequency Domain\" processes can be split but not mixed directly, see the Frequency Domain Demo for more. "
 				"CodeEdit": "The signal can be split out of nodes to run processes in parallel.\n\nYou can also connect multiple outputs from \"Time Domain\" nodes to the input of another to mix their outputs together.\n\nNote: \"Frequency Domain\" processes can be split but not mixed directly, see the Frequency Domain Demo for more. "
@@ -316,6 +338,37 @@
 			"slider_values": {
 			"slider_values": {
 
 
 			}
 			}
+		},
+		{
+			"addremoveinlets": {
+
+			},
+			"checkbutton_states": {
+
+			},
+			"command": "inputfile",
+			"id": 8,
+			"name": "inputfile",
+			"notes": {
+
+			},
+			"offset": {
+				"x": 52.222225189209,
+				"y": 81.1111145019531
+			},
+			"optionbutton_values": {
+				"@OptionButton@3921": 1,
+				"@OptionButton@3962": 0
+			},
+			"slider_values": {
+				"AudioPlayer/FileDialog/@VBoxContainer@3909/@MarginContainer@3949/Tree/@Popup@3935/@VBoxContainer@3936/@HSlider@3944": {
+					"editable": true,
+					"meta": {
+
+					},
+					"value": 0.0
+				}
+			}
 		}
 		}
 	]
 	]
 }
 }

+ 126 - 73
examples/frequency_domain.thd

@@ -1,96 +1,73 @@
 {
 {
 	"connections": [
 	"connections": [
 		{
 		{
-			"from_node_id": 1,
+			"from_node_id": 12,
 			"from_port": 0,
 			"from_port": 0,
-			"to_node_id": 3,
+			"to_node_id": 2,
 			"to_port": 0
 			"to_port": 0
 		},
 		},
 		{
 		{
-			"from_node_id": 3,
+			"from_node_id": 2,
 			"from_port": 0,
 			"from_port": 0,
-			"to_node_id": 2,
+			"to_node_id": 1,
 			"to_port": 0
 			"to_port": 0
 		},
 		},
 		{
 		{
-			"from_node_id": 10,
+			"from_node_id": 9,
 			"from_port": 0,
 			"from_port": 0,
-			"to_node_id": 11,
+			"to_node_id": 10,
 			"to_port": 0
 			"to_port": 0
 		},
 		},
 		{
 		{
-			"from_node_id": 11,
+			"from_node_id": 10,
 			"from_port": 0,
 			"from_port": 0,
-			"to_node_id": 12,
+			"to_node_id": 11,
 			"to_port": 0
 			"to_port": 0
 		},
 		},
 		{
 		{
-			"from_node_id": 2,
+			"from_node_id": 1,
 			"from_port": 0,
 			"from_port": 0,
-			"to_node_id": 4,
+			"to_node_id": 3,
 			"to_port": 0
 			"to_port": 0
 		},
 		},
 		{
 		{
-			"from_node_id": 2,
+			"from_node_id": 1,
 			"from_port": 0,
 			"from_port": 0,
-			"to_node_id": 10,
+			"to_node_id": 9,
 			"to_port": 0
 			"to_port": 0
 		},
 		},
 		{
 		{
-			"from_node_id": 4,
+			"from_node_id": 3,
 			"from_port": 0,
 			"from_port": 0,
-			"to_node_id": 9,
+			"to_node_id": 8,
 			"to_port": 0
 			"to_port": 0
 		},
 		},
 		{
 		{
-			"from_node_id": 9,
+			"from_node_id": 8,
 			"from_port": 0,
 			"from_port": 0,
-			"to_node_id": 12,
+			"to_node_id": 11,
 			"to_port": 0
 			"to_port": 0
 		}
 		}
 	],
 	],
+	"fftoverlap": 2,
+	"fftsize": 9,
 	"nodes": [
 	"nodes": [
 		{
 		{
-			"checkbutton_states": {
+			"addremoveinlets": {
 
 
 			},
 			},
-			"command": "inputfile",
-			"id": 1,
-			"name": "inputfile",
-			"notes": {
-
-			},
-			"offset": {
-				"x": 20.0,
-				"y": 80.0
-			},
-			"optionbutton_values": {
-				"@OptionButton@4557": 1,
-				"@OptionButton@4598": 0
-			},
-			"slider_values": {
-				"AudioPlayer/FileDialog/@VBoxContainer@4545/@MarginContainer@4585/Tree/@Popup@4571/@VBoxContainer@4572/@HSlider@4580": {
-					"editable": true,
-					"meta": {
-
-					},
-					"value": 0.0
-				}
-			}
-		},
-		{
 			"checkbutton_states": {
 			"checkbutton_states": {
 
 
 			},
 			},
 			"command": "spectstr_stretch",
 			"command": "spectstr_stretch",
-			"id": 2,
+			"id": 1,
 			"name": "spectstr_stretch",
 			"name": "spectstr_stretch",
 			"notes": {
 			"notes": {
 
 
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 785.555725097656,
-				"y": 80.0000152587891
+				"x": 806.666809082031,
+				"y": 80.0000228881836
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
 
 
@@ -100,6 +77,9 @@
 					"editable": true,
 					"editable": true,
 					"meta": {
 					"meta": {
 						"brk": false,
 						"brk": false,
+						"default_value": 0.0,
+						"fftwindowcount": false,
+						"fftwindowsize": false,
 						"flag": "",
 						"flag": "",
 						"max": false,
 						"max": false,
 						"min": false,
 						"min": false,
@@ -111,6 +91,9 @@
 					"editable": true,
 					"editable": true,
 					"meta": {
 					"meta": {
 						"brk": false,
 						"brk": false,
+						"default_value": 0.0,
+						"fftwindowcount": false,
+						"fftwindowsize": false,
 						"flag": "",
 						"flag": "",
 						"max": false,
 						"max": false,
 						"min": false,
 						"min": false,
@@ -122,6 +105,9 @@
 					"editable": true,
 					"editable": true,
 					"meta": {
 					"meta": {
 						"brk": false,
 						"brk": false,
+						"default_value": 10.0,
+						"fftwindowcount": false,
+						"fftwindowsize": false,
 						"flag": "",
 						"flag": "",
 						"max": false,
 						"max": false,
 						"min": false,
 						"min": false,
@@ -132,18 +118,21 @@
 			}
 			}
 		},
 		},
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
 
 
 			},
 			},
 			"command": "pvoc_anal_1",
 			"command": "pvoc_anal_1",
-			"id": 3,
+			"id": 2,
 			"name": "pvoc_anal_1",
 			"name": "pvoc_anal_1",
 			"notes": {
 			"notes": {
 
 
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 466.666778564453,
-				"y": 80.0000152587891
+				"x": 487.777893066406,
+				"y": 80.0000228881836
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
 
 
@@ -153,17 +142,20 @@
 			}
 			}
 		},
 		},
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
 
 
 			},
 			},
 			"command": "blur_blur",
 			"command": "blur_blur",
-			"id": 4,
+			"id": 3,
 			"name": "blur_blur",
 			"name": "blur_blur",
 			"notes": {
 			"notes": {
 
 
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 1115.74475097656,
+				"x": 1136.85583496094,
 				"y": 223.444488525391
 				"y": 223.444488525391
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
@@ -174,27 +166,33 @@
 					"editable": true,
 					"editable": true,
 					"meta": {
 					"meta": {
 						"brk": true,
 						"brk": true,
+						"default_value": 20.0,
+						"fftwindowcount": true,
+						"fftwindowsize": false,
 						"flag": "",
 						"flag": "",
 						"max": false,
 						"max": false,
 						"min": false,
 						"min": false,
 						"time": false
 						"time": false
 					},
 					},
-					"value": 150.0
+					"value": 100.0
 				}
 				}
 			}
 			}
 		},
 		},
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
 
 
 			},
 			},
 			"command": "notes",
 			"command": "notes",
-			"id": 5,
+			"id": 4,
 			"name": "notes",
 			"name": "notes",
 			"notes": {
 			"notes": {
-				"CodeEdit": "The \"Frequency Domain\" (PVOC) processes allow you to perform unique transformations to a sound. Load a file into \"Input File\" to test it out.\n\nThese processes work by manipulating FFT analysis files of the audio and as such your audio must first be analysed using \"PVOC: Analyse\"."
+				"CodeEdit": "The \"Frequency Domain\" (PVOC) processes allow you to perform unique transformations that are difficult/impossible to do in the time domain. Load a file into \"Input File\" to test it out.\n\nThese processes work by manipulating FFT analysis files of the audio and as such your audio must first be analysed using \"PVOC: Analyse\"."
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 30.4112148284912,
+				"x": 51.5223274230957,
 				"y": 488.666778564453
 				"y": 488.666778564453
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
@@ -205,17 +203,20 @@
 			}
 			}
 		},
 		},
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
 
 
 			},
 			},
 			"command": "notes",
 			"command": "notes",
-			"id": 6,
+			"id": 5,
 			"name": "notes2",
 			"name": "notes2",
 			"notes": {
 			"notes": {
-				"CodeEdit": "This enables processing that is difficult/impossible to do in the time domain. \n\nE.g. PVOC: Stretch allows extreme time stretching without changing pitch."
+				"CodeEdit": "You can adjust how this analysis is done by changing the FFT Size and Overlap options at the top left of the thread.\n\nLarger FFT sizes will have better frequency resolution but worse time resolution, smaller the opposite.\n\nHigher overlap will have better overall resolution but will process slower."
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 481.411315917969,
+				"x": 502.522430419922,
 				"y": 493.5556640625
 				"y": 493.5556640625
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
@@ -226,17 +227,20 @@
 			}
 			}
 		},
 		},
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
 
 
 			},
 			},
 			"command": "notes",
 			"command": "notes",
-			"id": 7,
+			"id": 6,
 			"name": "notes4",
 			"name": "notes4",
 			"notes": {
 			"notes": {
 				"CodeEdit": "You can use both Time Domain and Frequency Domain processes in the same Thread. You just need to convert between the two using \"PVOC: Analyse\" and \"PVOC: Resynthesise\".\n\nTime domain inputs and outputs are white and Frequency Domain inputs and outputs are black."
 				"CodeEdit": "You can use both Time Domain and Frequency Domain processes in the same Thread. You just need to convert between the two using \"PVOC: Analyse\" and \"PVOC: Resynthesise\".\n\nTime domain inputs and outputs are white and Frequency Domain inputs and outputs are black."
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 1376.078125,
+				"x": 1397.18933105469,
 				"y": 492.333435058594
 				"y": 492.333435058594
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
@@ -247,17 +251,20 @@
 			}
 			}
 		},
 		},
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
 
 
 			},
 			},
 			"command": "notes",
 			"command": "notes",
-			"id": 8,
+			"id": 7,
 			"name": "notes3",
 			"name": "notes3",
 			"notes": {
 			"notes": {
-				"CodeEdit": "Frequency Domain PVOC signals can be split but they cannot be mixed directly, if you want to mix the signals you will need to convert them back using \"PVOC: Resynthesise\".\n\nThis process will take the analysis files that PVOC uses and turn it back into audio."
+				"CodeEdit": "Frequency Domain PVOC signals can be split but they cannot be mixed directly. \n\nIf you want to mix the signals you will need to either use one of the PVOC Combine processes or convert them back to the time domain using \"PVOC: Resynthesise\" and then mix them in the time domain."
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 931.189208984375,
+				"x": 952.30029296875,
 				"y": 491.111206054688
 				"y": 491.111206054688
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
@@ -268,17 +275,20 @@
 			}
 			}
 		},
 		},
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
 
 
 			},
 			},
 			"command": "pvoc_synth",
 			"command": "pvoc_synth",
-			"id": 9,
+			"id": 8,
 			"name": "pvoc_synth2",
 			"name": "pvoc_synth2",
 			"notes": {
 			"notes": {
 
 
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 1445.74475097656,
+				"x": 1466.85595703125,
 				"y": 223.555618286133
 				"y": 223.555618286133
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
@@ -289,17 +299,20 @@
 			}
 			}
 		},
 		},
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
 
 
 			},
 			},
 			"command": "hilite_trace_1",
 			"command": "hilite_trace_1",
-			"id": 10,
+			"id": 9,
 			"name": "hilite_trace_1",
 			"name": "hilite_trace_1",
 			"notes": {
 			"notes": {
 
 
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 1115.55590820313,
+				"x": 1136.6669921875,
 				"y": 79.8889007568359
 				"y": 79.8889007568359
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
@@ -310,6 +323,9 @@
 					"editable": true,
 					"editable": true,
 					"meta": {
 					"meta": {
 						"brk": true,
 						"brk": true,
+						"default_value": 15.0,
+						"fftwindowcount": false,
+						"fftwindowsize": true,
 						"flag": "",
 						"flag": "",
 						"max": false,
 						"max": false,
 						"min": false,
 						"min": false,
@@ -320,17 +336,20 @@
 			}
 			}
 		},
 		},
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
 
 
 			},
 			},
 			"command": "pvoc_synth",
 			"command": "pvoc_synth",
-			"id": 11,
+			"id": 10,
 			"name": "pvoc_synth",
 			"name": "pvoc_synth",
 			"notes": {
 			"notes": {
 
 
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 1448.18920898438,
+				"x": 1469.30029296875,
 				"y": 80.333366394043
 				"y": 80.333366394043
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
@@ -341,27 +360,61 @@
 			}
 			}
 		},
 		},
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
 				"Autoplay": true,
 				"Autoplay": true,
 				"DeleteIntermediateFilesToggle": true,
 				"DeleteIntermediateFilesToggle": true,
 				"ReuseFolderToggle": true
 				"ReuseFolderToggle": true
 			},
 			},
 			"command": "outputfile",
 			"command": "outputfile",
-			"id": 12,
+			"id": 11,
 			"name": "outputfile",
 			"name": "outputfile",
 			"notes": {
 			"notes": {
 
 
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 1795.5556640625,
+				"x": 1816.66674804688,
 				"y": 80.1111221313477
 				"y": 80.1111221313477
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
-				"@OptionButton@4693": 1,
-				"@OptionButton@4734": 0
+				"@OptionButton@4442": 1,
+				"@OptionButton@4483": 0
+			},
+			"slider_values": {
+				"AudioPlayer/FileDialog/@VBoxContainer@4430/@MarginContainer@4470/Tree/@Popup@4456/@VBoxContainer@4457/@HSlider@4465": {
+					"editable": true,
+					"meta": {
+
+					},
+					"value": 0.0
+				}
+			}
+		},
+		{
+			"addremoveinlets": {
+
+			},
+			"checkbutton_states": {
+
+			},
+			"command": "inputfile",
+			"id": 12,
+			"name": "inputfile",
+			"notes": {
+
+			},
+			"offset": {
+				"x": 41.1111106872559,
+				"y": 80.0
+			},
+			"optionbutton_values": {
+				"@OptionButton@4238": 1,
+				"@OptionButton@4279": 0
 			},
 			},
 			"slider_values": {
 			"slider_values": {
-				"AudioPlayer/FileDialog/@VBoxContainer@4681/@MarginContainer@4721/Tree/@Popup@4707/@VBoxContainer@4708/@HSlider@4716": {
+				"AudioPlayer/FileDialog/@VBoxContainer@4226/@MarginContainer@4266/Tree/@Popup@4252/@VBoxContainer@4253/@HSlider@4261": {
 					"editable": true,
 					"editable": true,
 					"meta": {
 					"meta": {
 
 

+ 93 - 67
examples/getting_started.thd

@@ -1,7 +1,12 @@
 {
 {
 	"connections": [],
 	"connections": [],
+	"fftoverlap": 2,
+	"fftsize": 9,
 	"nodes": [
 	"nodes": [
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
 
 
 			},
 			},
@@ -9,11 +14,11 @@
 			"id": 1,
 			"id": 1,
 			"name": "notes2",
 			"name": "notes2",
 			"notes": {
 			"notes": {
-				"CodeEdit": "The white squares on each side of the nodes are inputs (left) and outputs (right). \n\nConnect nodes together by clicking and dragging from outputs to inputs. You can detach a cable by clicking on the input.\n\nConnect \"Input File\" to \"Distort: Average\" and \"Distort: Average\" to the Output File."
+				"CodeEdit": "The white squares on each side of the nodes are inputs (left) and outputs (right). \n\nConnect nodes together by clicking and dragging from outputs to inputs. You can detach a cable by clicking on the input. Or by clicking on the cable and pressing backspace/delete.\n"
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 530.0,
-				"y": 595.555541992188
+				"x": 522.222229003906,
+				"y": 647.777770996094
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
 
 
@@ -23,76 +28,84 @@
 			}
 			}
 		},
 		},
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
 
 
 			},
 			},
-			"command": "notes",
+			"command": "inputfile",
 			"id": 2,
 			"id": 2,
-			"name": "notes3",
+			"name": "inputfile",
 			"notes": {
 			"notes": {
-				"CodeEdit": "Each node is a function from the Composers Desktop Project.\n\nClick the \"?\" on a node to open its full help file. Or, hover your mouse over nodes and controls to get some quick tips. "
+
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 992.22216796875,
-				"y": 596.666687011719
+				"x": 55.5555572509766,
+				"y": 67.7777786254883
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
-
+				"@OptionButton@3124": 1,
+				"@OptionButton@3165": 0
 			},
 			},
 			"slider_values": {
 			"slider_values": {
+				"AudioPlayer/FileDialog/@VBoxContainer@3112/@MarginContainer@3152/Tree/@Popup@3138/@VBoxContainer@3139/@HSlider@3147": {
+					"editable": true,
+					"meta": {
 
 
+					},
+					"value": 0.0
+				}
 			}
 			}
 		},
 		},
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
 
 
 			},
 			},
-			"command": "notes",
+			"command": "distort_average",
 			"id": 3,
 			"id": 3,
-			"name": "notes",
+			"name": "distort_average",
 			"notes": {
 			"notes": {
-				"CodeEdit": "Welcome to SoundThread!\n\nTo get started, load a sound file into \"Input File\"\n\nIt supports a mono or stereo .wav files."
+
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 70.0,
-				"y": 596.666687011719
+				"x": 778.888916015625,
+				"y": 66.6666641235352
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
 
 
 			},
 			},
 			"slider_values": {
 			"slider_values": {
-
+				"CycleCount/HSplitContainer/HSlider": {
+					"editable": true,
+					"meta": {
+						"brk": true,
+						"default_value": 5.0,
+						"fftwindowcount": false,
+						"fftwindowsize": false,
+						"flag": "",
+						"max": false,
+						"min": false,
+						"time": false
+					},
+					"value": 5.0
+				}
 			}
 			}
 		},
 		},
 		{
 		{
-			"checkbutton_states": {
-
-			},
-			"command": "notes",
-			"id": 4,
-			"name": "notes4",
-			"notes": {
-				"CodeEdit": "Click \"Run Thread\" and it will prompt you for a location to save the audio files that CDP Generates and then it will run the process.\n\nIf it runs successfully you can close the console and press play on \"Output File\"."
-			},
-			"offset": {
-				"x": 1461.0654296875,
-				"y": 593.270690917969
-			},
-			"optionbutton_values": {
+			"addremoveinlets": {
 
 
 			},
 			},
-			"slider_values": {
-
-			}
-		},
-		{
 			"checkbutton_states": {
 			"checkbutton_states": {
 				"Autoplay": true,
 				"Autoplay": true,
 				"DeleteIntermediateFilesToggle": true,
 				"DeleteIntermediateFilesToggle": true,
 				"ReuseFolderToggle": true
 				"ReuseFolderToggle": true
 			},
 			},
 			"command": "outputfile",
 			"command": "outputfile",
-			"id": 5,
+			"id": 4,
 			"name": "outputfile",
 			"name": "outputfile",
 			"notes": {
 			"notes": {
 
 
@@ -102,11 +115,11 @@
 				"y": 72.2222290039063
 				"y": 72.2222290039063
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
-				"@OptionButton@2925": 1,
-				"@OptionButton@2966": 0
+				"@OptionButton@3243": 1,
+				"@OptionButton@3284": 0
 			},
 			},
 			"slider_values": {
 			"slider_values": {
-				"AudioPlayer/FileDialog/@VBoxContainer@2913/@MarginContainer@2953/Tree/@Popup@2939/@VBoxContainer@2940/@HSlider@2948": {
+				"AudioPlayer/FileDialog/@VBoxContainer@3231/@MarginContainer@3271/Tree/@Popup@3257/@VBoxContainer@3258/@HSlider@3266": {
 					"editable": true,
 					"editable": true,
 					"meta": {
 					"meta": {
 
 
@@ -116,62 +129,75 @@
 			}
 			}
 		},
 		},
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
 
 
 			},
 			},
-			"command": "inputfile",
-			"id": 6,
-			"name": "inputfile",
+			"command": "notes",
+			"id": 5,
+			"name": "notes",
 			"notes": {
 			"notes": {
+				"CodeEdit": "Welcome to SoundThread!\n\nTo get started, load a sound file into \"Input File\"\n\nIt supports a mono or stereo .wav files."
+			},
+			"offset": {
+				"x": 62.222225189209,
+				"y": 648.888916015625
+			},
+			"optionbutton_values": {
 
 
+			},
+			"slider_values": {
+
+			}
+		},
+		{
+			"addremoveinlets": {
+
+			},
+			"checkbutton_states": {
+
+			},
+			"command": "notes",
+			"id": 6,
+			"name": "notes4",
+			"notes": {
+				"CodeEdit": "Click \"Run Thread\" (ctrl/cmd + R). You will be prompted for a folder to save files. Then it will run the thread. The selected folder cannot contain special characters (open Output File's help for more info).\n\nSoundThread can generate a lot of files, if Delete Intermediate Files is toggled SoundThread will only keep the final output file."
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 55.5555572509766,
-				"y": 67.7777786254883
+				"x": 1467.73205566406,
+				"y": 649.937377929688
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
-				"@OptionButton@3034": 1,
-				"@OptionButton@3075": 0
+
 			},
 			},
 			"slider_values": {
 			"slider_values": {
-				"AudioPlayer/FileDialog/@VBoxContainer@3022/@MarginContainer@3062/Tree/@Popup@3048/@VBoxContainer@3049/@HSlider@3057": {
-					"editable": true,
-					"meta": {
 
 
-					},
-					"value": 0.0
-				}
 			}
 			}
 		},
 		},
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
 
 
 			},
 			},
-			"command": "distort_average",
+			"command": "notes",
 			"id": 7,
 			"id": 7,
-			"name": "distort_average",
+			"name": "notes3",
 			"notes": {
 			"notes": {
-
+				"CodeEdit": "Connect \"Input File\" to \"Distort: Average\" and \"Distort: Average\" to the Output File.\n\nEach node is a function from the Composers Desktop Project.\n\nClick the \"?\" on a node to open its full help file. Or, hover your mouse over nodes and controls to get some quick tips. "
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 778.888916015625,
-				"y": 66.6666641235352
+				"x": 994.444396972656,
+				"y": 648.888916015625
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
 
 
 			},
 			},
 			"slider_values": {
 			"slider_values": {
-				"CycleCount/HSplitContainer/HSlider": {
-					"editable": true,
-					"meta": {
-						"brk": true,
-						"flag": "",
-						"max": false,
-						"min": false,
-						"time": false
-					},
-					"value": 5.0
-				}
+
 			}
 			}
 		}
 		}
 	]
 	]

+ 105 - 93
examples/multiple_inputs.thd

@@ -1,81 +1,50 @@
 {
 {
 	"connections": [
 	"connections": [
 		{
 		{
-			"from_node_id": 5,
+			"from_node_id": 6,
 			"from_port": 0,
 			"from_port": 0,
-			"to_node_id": 3,
+			"to_node_id": 5,
 			"to_port": 0
 			"to_port": 0
 		},
 		},
 		{
 		{
-			"from_node_id": 3,
+			"from_node_id": 1,
 			"from_port": 0,
 			"from_port": 0,
-			"to_node_id": 1,
-			"to_port": 0
-		},
-		{
-			"from_node_id": 2,
-			"from_port": 0,
-			"to_node_id": 4,
-			"to_port": 0
+			"to_node_id": 6,
+			"to_port": 1
 		},
 		},
 		{
 		{
 			"from_node_id": 4,
 			"from_node_id": 4,
 			"from_port": 0,
 			"from_port": 0,
-			"to_node_id": 1,
+			"to_node_id": 6,
 			"to_port": 0
 			"to_port": 0
 		}
 		}
 	],
 	],
+	"fftoverlap": 2,
+	"fftsize": 9,
 	"nodes": [
 	"nodes": [
 		{
 		{
-			"checkbutton_states": {
-				"Autoplay": true,
-				"DeleteIntermediateFilesToggle": true,
-				"ReuseFolderToggle": true
-			},
-			"command": "outputfile",
-			"id": 1,
-			"name": "outputfile",
-			"notes": {
+			"addremoveinlets": {
 
 
 			},
 			},
-			"offset": {
-				"x": 1608.88891601563,
-				"y": 114.444450378418
-			},
-			"optionbutton_values": {
-				"@OptionButton@7546": 1,
-				"@OptionButton@7587": 0
-			},
-			"slider_values": {
-				"AudioPlayer/FileDialog/@VBoxContainer@7534/@MarginContainer@7574/Tree/@Popup@7560/@VBoxContainer@7561/@HSlider@7569": {
-					"editable": true,
-					"meta": {
-
-					},
-					"value": 0.0
-				}
-			}
-		},
-		{
 			"checkbutton_states": {
 			"checkbutton_states": {
 
 
 			},
 			},
 			"command": "inputfile",
 			"command": "inputfile",
-			"id": 2,
+			"id": 1,
 			"name": "inputfile",
 			"name": "inputfile",
 			"notes": {
 			"notes": {
 
 
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 506.666687011719,
-				"y": 575.555541992188
+				"x": 477.777801513672,
+				"y": 570.0
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
-				"@OptionButton@9155": 1,
-				"@OptionButton@9196": 0
+				"@OptionButton@5190": 1,
+				"@OptionButton@5231": 0
 			},
 			},
 			"slider_values": {
 			"slider_values": {
-				"AudioPlayer/FileDialog/@VBoxContainer@9143/@MarginContainer@9183/Tree/@Popup@9169/@VBoxContainer@9170/@HSlider@9178": {
+				"AudioPlayer/FileDialog/@VBoxContainer@5178/@MarginContainer@5218/Tree/@Popup@5204/@VBoxContainer@5205/@HSlider@5213": {
 					"editable": true,
 					"editable": true,
 					"meta": {
 					"meta": {
 
 
@@ -85,89 +54,81 @@
 			}
 			}
 		},
 		},
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
 
 
 			},
 			},
-			"command": "modify_loudness_1",
-			"id": 3,
-			"name": "modify_loudness_1",
+			"command": "notes",
+			"id": 2,
+			"name": "notes2",
 			"notes": {
 			"notes": {
-
+				"CodeEdit": "You can make additional Input File nodes by searching for \"Input\" in the search menu or by opening the explore menu (ctrl/cmd + E) and going to Utilities."
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 1017.77783203125,
-				"y": 116.66667175293
+				"x": 42.222225189209,
+				"y": 567.777770996094
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
 
 
 			},
 			},
 			"slider_values": {
 			"slider_values": {
-				"Gain/HSplitContainer/HSlider": {
-					"editable": true,
-					"meta": {
-						"brk": true,
-						"flag": "",
-						"max": false,
-						"min": false,
-						"time": false
-					},
-					"value": 0.12
-				}
+
 			}
 			}
 		},
 		},
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
 
 
 			},
 			},
-			"command": "modify_brassage_5",
-			"id": 4,
-			"name": "modify_brassage_5",
+			"command": "notes",
+			"id": 3,
+			"name": "notes",
 			"notes": {
 			"notes": {
-
+				"CodeEdit": "You can have multiple input nodes in one thread including both synthesis and Input File nodes.\n\nInput File nodes require a process in between them and the Output File. Synthesis nodes can be connected to the Output File directly."
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 1016.66668701172,
-				"y": 575.555541992188
+				"x": 37.7777824401855,
+				"y": 108.888893127441
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
 
 
 			},
 			},
 			"slider_values": {
 			"slider_values": {
-				"Density/HSplitContainer/HSlider": {
-					"editable": true,
-					"meta": {
-						"brk": true,
-						"flag": "",
-						"max": false,
-						"min": false,
-						"time": false
-					},
-					"value": 0.6
-				}
+
 			}
 			}
 		},
 		},
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
 
 
 			},
 			},
 			"command": "synspline_synspline",
 			"command": "synspline_synspline",
-			"id": 5,
+			"id": 4,
 			"name": "synspline_synspline",
 			"name": "synspline_synspline",
 			"notes": {
 			"notes": {
 
 
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 503.333343505859,
-				"y": 116.66667175293
+				"x": 474.444458007813,
+				"y": 111.111114501953
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
-				"SampleRate": 0
+				"samplerate": 0
 			},
 			},
 			"slider_values": {
 			"slider_values": {
 				"Frequency/HSplitContainer/HSlider": {
 				"Frequency/HSplitContainer/HSlider": {
 					"editable": true,
 					"editable": true,
 					"meta": {
 					"meta": {
 						"brk": true,
 						"brk": true,
+						"default_value": 220.0,
+						"fftwindowcount": false,
+						"fftwindowsize": false,
 						"flag": "",
 						"flag": "",
 						"max": false,
 						"max": false,
 						"min": false,
 						"min": false,
@@ -179,6 +140,9 @@
 					"editable": true,
 					"editable": true,
 					"meta": {
 					"meta": {
 						"brk": true,
 						"brk": true,
+						"default_value": 24.0,
+						"fftwindowcount": false,
+						"fftwindowsize": false,
 						"flag": "",
 						"flag": "",
 						"max": false,
 						"max": false,
 						"min": false,
 						"min": false,
@@ -190,6 +154,9 @@
 					"editable": true,
 					"editable": true,
 					"meta": {
 					"meta": {
 						"brk": false,
 						"brk": false,
+						"default_value": 30.0,
+						"fftwindowcount": false,
+						"fftwindowsize": false,
 						"flag": "",
 						"flag": "",
 						"max": false,
 						"max": false,
 						"min": false,
 						"min": false,
@@ -201,6 +168,9 @@
 					"editable": true,
 					"editable": true,
 					"meta": {
 					"meta": {
 						"brk": false,
 						"brk": false,
+						"default_value": 0.0,
+						"fftwindowcount": false,
+						"fftwindowsize": false,
 						"flag": "",
 						"flag": "",
 						"max": false,
 						"max": false,
 						"min": false,
 						"min": false,
@@ -212,6 +182,9 @@
 					"editable": true,
 					"editable": true,
 					"meta": {
 					"meta": {
 						"brk": true,
 						"brk": true,
+						"default_value": 4.0,
+						"fftwindowcount": false,
+						"fftwindowsize": false,
 						"flag": "",
 						"flag": "",
 						"max": false,
 						"max": false,
 						"min": false,
 						"min": false,
@@ -222,18 +195,54 @@
 			}
 			}
 		},
 		},
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
+				"Autoplay": true,
+				"DeleteIntermediateFilesToggle": true,
+				"ReuseFolderToggle": true
+			},
+			"command": "outputfile",
+			"id": 5,
+			"name": "outputfile",
+			"notes": {
 
 
 			},
 			},
-			"command": "notes",
+			"offset": {
+				"x": 1478.88891601563,
+				"y": 112.222229003906
+			},
+			"optionbutton_values": {
+				"@OptionButton@5082": 1,
+				"@OptionButton@5123": 0
+			},
+			"slider_values": {
+				"AudioPlayer/FileDialog/@VBoxContainer@5070/@MarginContainer@5110/Tree/@Popup@5096/@VBoxContainer@5097/@HSlider@5105": {
+					"editable": true,
+					"meta": {
+
+					},
+					"value": 0.0
+				}
+			}
+		},
+		{
+			"addremoveinlets": {
+
+			},
+			"checkbutton_states": {
+
+			},
+			"command": "distort_interact_2",
 			"id": 6,
 			"id": 6,
-			"name": "notes",
+			"name": "distort_interact_2",
 			"notes": {
 			"notes": {
-				"CodeEdit": "You can have multiple input nodes in one thread including both synthesis and Input File nodes.\n\nInput File nodes require a process in between them and the Output File. Synthesis nodes can be connected to the Output File directly."
+
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 68.8888931274414,
-				"y": 110.0
+				"x": 1045.68908691406,
+				"y": 111.533271789551
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
 
 
@@ -243,18 +252,21 @@
 			}
 			}
 		},
 		},
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
 
 
 			},
 			},
 			"command": "notes",
 			"command": "notes",
 			"id": 7,
 			"id": 7,
-			"name": "notes2",
+			"name": "notes3",
 			"notes": {
 			"notes": {
-				"CodeEdit": "You can make additional Input File nodes by searching for \"Input\" in the search menu or by opening the explore menu (ctrl/cmd + E) and going to Utilities."
+				"CodeEdit": "Several processes in SoundThread allow for multiple inputs. All inputs on the node must be connected for the thread to run. Note: the same input can be connected to multiple inlets.\n\nThe majority of these processes are frequency domain processes and can be found in Frequency Domain > Combine tab in the explore menu (ctrl/cmd and E)."
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 74.4444427490234,
-				"y": 574.444458007813
+				"x": 1004.57794189453,
+				"y": 565.977661132813
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
 
 

+ 54 - 44
examples/navigating.thd

@@ -1,40 +1,57 @@
 {
 {
 	"connections": [],
 	"connections": [],
+	"fftoverlap": 2,
+	"fftsize": 9,
 	"nodes": [
 	"nodes": [
 		{
 		{
-			"checkbutton_states": {
+			"addremoveinlets": {
 
 
 			},
 			},
-			"command": "notes",
+			"checkbutton_states": {
+				"Autoplay": true,
+				"DeleteIntermediateFilesToggle": true,
+				"ReuseFolderToggle": true
+			},
+			"command": "outputfile",
 			"id": 1,
 			"id": 1,
-			"name": "notes",
+			"name": "outputfile",
 			"notes": {
 			"notes": {
-				"CodeEdit": "The buttons in the top left let you change the view of the main window or, you can use your mouse to navigate.\n\nScroll to zoom.\nClick middle mouse and drag to move.\n\nYou can also use the map in the bottom right to move around the main window."
+
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 104.444465637207,
-				"y": 165.555587768555
+				"x": 1854.44445800781,
+				"y": 141.111190795898
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
-
+				"@OptionButton@10135": 1,
+				"@OptionButton@10176": 0
 			},
 			},
 			"slider_values": {
 			"slider_values": {
+				"AudioPlayer/FileDialog/@VBoxContainer@10123/@MarginContainer@10163/Tree/@Popup@10149/@VBoxContainer@10150/@HSlider@10158": {
+					"editable": true,
+					"meta": {
 
 
+					},
+					"value": 0.0
+				}
 			}
 			}
 		},
 		},
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
 
 
 			},
 			},
 			"command": "notes",
 			"command": "notes",
 			"id": 2,
 			"id": 2,
-			"name": "notes3",
+			"name": "notes4",
 			"notes": {
 			"notes": {
-				"CodeEdit": "Click and drag on the background to select multiple nodes at once.\n\nPressing Backspace/Delete will remove selected nodes. Note: \"Output File\" can't be deleted.\n\nSoundThread allows you to undo most major changes with ctrl/cmd and Z. \nNote: this not yet fully implemented."
+				"CodeEdit": "SoundThread contains many other keyboard/mouse shortcuts to help speed up building Threads. You can view a list of all currently available shortcuts by going to Help>Keyboard/Mouse Shortcuts.\n\nThis help window opens as a popup so you can keep it open as a reference when building a thread."
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 964.444641113281,
-				"y": 165.555587768555
+				"x": 1401.24462890625,
+				"y": 142.64436340332
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
 
 
@@ -44,18 +61,21 @@
 			}
 			}
 		},
 		},
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
 
 
 			},
 			},
 			"command": "notes",
 			"command": "notes",
 			"id": 3,
 			"id": 3,
-			"name": "notes2",
+			"name": "notes3",
 			"notes": {
 			"notes": {
-				"CodeEdit": "Press ctrl/cmd and E to browse all processes in SoundThread. Right click anywhere in empty space or press ctrl/cmd and F to search and add nodes. You can navigate the search menu with tab and press enter or click to add a node.\n\nNodes can be dragged around to rearrange and you can copy and paste nodes with ctrl/cmd+c and ctrl/cmd+v."
+				"CodeEdit": "Click and drag on the background to select multiple nodes at once.\n\nPressing Backspace/Delete will remove selected nodes. Note: \"Output File\" can't be deleted.\n\nSoundThread allows you to undo most major changes with ctrl/cmd and Z and redo with ctrl/cmd and Y."
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 531.111267089844,
-				"y": 166.666702270508
+				"x": 946.666870117188,
+				"y": 138.888916015625
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
 
 
@@ -65,61 +85,51 @@
 			}
 			}
 		},
 		},
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
-				"Autoplay": true,
-				"DeleteIntermediateFilesToggle": true,
-				"ReuseFolderToggle": true
+
 			},
 			},
-			"command": "outputfile",
+			"command": "notes",
 			"id": 4,
 			"id": 4,
-			"name": "outputfile",
+			"name": "notes2",
 			"notes": {
 			"notes": {
-
+				"CodeEdit": "Press ctrl/cmd and E to browse all processes in SoundThread. Right click anywhere in empty space or press ctrl/cmd and F to search and add nodes. You can navigate the search menu with tab and press enter or click to add a node.\n\nNodes can be dragged around to rearrange and you can copy and paste nodes with ctrl/cmd+c and ctrl/cmd+v."
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 1401.11120605469,
-				"y": 410.000122070313
+				"x": 504.444580078125,
+				"y": 137.777801513672
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
-				"@OptionButton@3296": 1,
-				"@OptionButton@3337": 0
+
 			},
 			},
 			"slider_values": {
 			"slider_values": {
-				"AudioPlayer/FileDialog/@VBoxContainer@3284/@MarginContainer@3324/Tree/@Popup@3310/@VBoxContainer@3311/@HSlider@3319": {
-					"editable": true,
-					"meta": {
 
 
-					},
-					"value": 0.0
-				}
 			}
 			}
 		},
 		},
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
 
 
 			},
 			},
-			"command": "inputfile",
+			"command": "notes",
 			"id": 5,
 			"id": 5,
-			"name": "inputfile",
+			"name": "notes",
 			"notes": {
 			"notes": {
-
+				"CodeEdit": "The buttons in the top left let you change the view of the main window or, you can use your mouse to navigate.\n\nScroll to zoom. Click middle mouse and drag to move or use ctrl/cmd and scroll. This can be swapped in settings.\n\nYou can also use the map in the bottom right to move around the main window."
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 1401.11145019531,
-				"y": 164.444473266602
+				"x": 62.2222328186035,
+				"y": 136.666687011719
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
-				"@OptionButton@3187": 1,
-				"@OptionButton@3228": 0
+
 			},
 			},
 			"slider_values": {
 			"slider_values": {
-				"AudioPlayer/FileDialog/@VBoxContainer@3175/@MarginContainer@3215/Tree/@Popup@3201/@VBoxContainer@3202/@HSlider@3210": {
-					"editable": true,
-					"meta": {
 
 
-					},
-					"value": 0.0
-				}
 			}
 			}
 		}
 		}
 	]
 	]

+ 92 - 60
examples/preview_nodes.thd

@@ -1,78 +1,55 @@
 {
 {
 	"connections": [
 	"connections": [
 		{
 		{
-			"from_node_id": 1,
+			"from_node_id": 6,
 			"from_port": 0,
 			"from_port": 0,
-			"to_node_id": 2,
+			"to_node_id": 1,
 			"to_port": 0
 			"to_port": 0
 		},
 		},
 		{
 		{
-			"from_node_id": 4,
+			"from_node_id": 3,
 			"from_port": 0,
 			"from_port": 0,
-			"to_node_id": 5,
+			"to_node_id": 4,
 			"to_port": 0
 			"to_port": 0
 		},
 		},
 		{
 		{
-			"from_node_id": 2,
+			"from_node_id": 1,
 			"from_port": 0,
 			"from_port": 0,
-			"to_node_id": 6,
+			"to_node_id": 7,
 			"to_port": 0
 			"to_port": 0
 		},
 		},
 		{
 		{
-			"from_node_id": 2,
+			"from_node_id": 1,
 			"from_port": 0,
 			"from_port": 0,
-			"to_node_id": 3,
+			"to_node_id": 2,
 			"to_port": 0
 			"to_port": 0
 		},
 		},
 		{
 		{
-			"from_node_id": 3,
+			"from_node_id": 2,
 			"from_port": 0,
 			"from_port": 0,
-			"to_node_id": 4,
+			"to_node_id": 3,
 			"to_port": 0
 			"to_port": 0
 		}
 		}
 	],
 	],
+	"fftoverlap": 2,
+	"fftsize": 9,
 	"nodes": [
 	"nodes": [
 		{
 		{
-			"checkbutton_states": {
-
-			},
-			"command": "inputfile",
-			"id": 1,
-			"name": "inputfile",
-			"notes": {
+			"addremoveinlets": {
 
 
 			},
 			},
-			"offset": {
-				"x": 20.0,
-				"y": 80.0
-			},
-			"optionbutton_values": {
-				"@OptionButton@11575": 1,
-				"@OptionButton@11616": 0
-			},
-			"slider_values": {
-				"AudioPlayer/FileDialog/@VBoxContainer@11563/@MarginContainer@11603/Tree/@Popup@11589/@VBoxContainer@11590/@HSlider@11598": {
-					"editable": true,
-					"meta": {
-
-					},
-					"value": 0.0
-				}
-			}
-		},
-		{
 			"checkbutton_states": {
 			"checkbutton_states": {
 
 
 			},
 			},
 			"command": "modify_brassage_2",
 			"command": "modify_brassage_2",
-			"id": 2,
+			"id": 1,
 			"name": "modify_brassage_2",
 			"name": "modify_brassage_2",
 			"notes": {
 			"notes": {
 
 
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 507.222259521484,
-				"y": 79.444450378418
+				"x": 528.333374023438,
+				"y": 79.4444427490234
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
 
 
@@ -82,6 +59,9 @@
 					"editable": true,
 					"editable": true,
 					"meta": {
 					"meta": {
 						"brk": true,
 						"brk": true,
+						"default_value": 0.25,
+						"fftwindowcount": false,
+						"fftwindowsize": false,
 						"flag": "",
 						"flag": "",
 						"max": false,
 						"max": false,
 						"min": false,
 						"min": false,
@@ -92,17 +72,20 @@
 			}
 			}
 		},
 		},
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
 
 
 			},
 			},
 			"command": "modify_brassage_1",
 			"command": "modify_brassage_1",
-			"id": 3,
+			"id": 2,
 			"name": "modify_brassage_1",
 			"name": "modify_brassage_1",
 			"notes": {
 			"notes": {
 
 
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 877.555541992188,
+				"x": 898.666687011719,
 				"y": 78.2222366333008
 				"y": 78.2222366333008
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
@@ -113,6 +96,9 @@
 					"editable": true,
 					"editable": true,
 					"meta": {
 					"meta": {
 						"brk": true,
 						"brk": true,
+						"default_value": -12.0,
+						"fftwindowcount": false,
+						"fftwindowsize": false,
 						"flag": "",
 						"flag": "",
 						"max": false,
 						"max": false,
 						"min": false,
 						"min": false,
@@ -123,17 +109,20 @@
 			}
 			}
 		},
 		},
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
 
 
 			},
 			},
 			"command": "distort_delete_2",
 			"command": "distort_delete_2",
-			"id": 4,
+			"id": 3,
 			"name": "distort_delete_2",
 			"name": "distort_delete_2",
 			"notes": {
 			"notes": {
 
 
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 1245.44458007813,
+				"x": 1266.55578613281,
 				"y": 78.2222290039063
 				"y": 78.2222290039063
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
@@ -144,6 +133,9 @@
 					"editable": true,
 					"editable": true,
 					"meta": {
 					"meta": {
 						"brk": true,
 						"brk": true,
+						"default_value": 2.0,
+						"fftwindowcount": false,
+						"fftwindowsize": false,
 						"flag": "",
 						"flag": "",
 						"max": false,
 						"max": false,
 						"min": false,
 						"min": false,
@@ -154,27 +146,30 @@
 			}
 			}
 		},
 		},
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
 				"Autoplay": true,
 				"Autoplay": true,
 				"DeleteIntermediateFilesToggle": true,
 				"DeleteIntermediateFilesToggle": true,
 				"ReuseFolderToggle": true
 				"ReuseFolderToggle": true
 			},
 			},
 			"command": "outputfile",
 			"command": "outputfile",
-			"id": 5,
+			"id": 4,
 			"name": "outputfile",
 			"name": "outputfile",
 			"notes": {
 			"notes": {
 
 
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 1612.33337402344,
+				"x": 1633.44445800781,
 				"y": 77.5555572509766
 				"y": 77.5555572509766
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
-				"@OptionButton@11684": 1,
-				"@OptionButton@11725": 0
+				"@OptionButton@7481": 1,
+				"@OptionButton@7522": 0
 			},
 			},
 			"slider_values": {
 			"slider_values": {
-				"AudioPlayer/FileDialog/@VBoxContainer@11672/@MarginContainer@11712/Tree/@Popup@11698/@VBoxContainer@11699/@HSlider@11707": {
+				"AudioPlayer/FileDialog/@VBoxContainer@7469/@MarginContainer@7509/Tree/@Popup@7495/@VBoxContainer@7496/@HSlider@7504": {
 					"editable": true,
 					"editable": true,
 					"meta": {
 					"meta": {
 
 
@@ -184,25 +179,52 @@
 			}
 			}
 		},
 		},
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
 
 
 			},
 			},
-			"command": "preview",
+			"command": "notes",
+			"id": 5,
+			"name": "notes",
+			"notes": {
+				"CodeEdit": "Preview nodes can be connected anywhere in a thread. When the thread is run it will allow you to hear the audio at that point in the thread.\n\nFiles loaded into a Preview node will be excluded from \"Delete Intermediate Files\".\n\nNote: including many of these in a thread may introduce some lag."
+			},
+			"offset": {
+				"x": 510.0,
+				"y": 347.111145019531
+			},
+			"optionbutton_values": {
+
+			},
+			"slider_values": {
+
+			}
+		},
+		{
+			"addremoveinlets": {
+
+			},
+			"checkbutton_states": {
+
+			},
+			"command": "inputfile",
 			"id": 6,
 			"id": 6,
-			"name": "preview",
+			"name": "inputfile",
 			"notes": {
 			"notes": {
 
 
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 1002.22229003906,
-				"y": 347.111145019531
+				"x": 41.1111106872559,
+				"y": 80.0
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
-				"@OptionButton@12106": 1,
-				"@OptionButton@12147": 0
+				"@OptionButton@7340": 1,
+				"@OptionButton@7381": 0
 			},
 			},
 			"slider_values": {
 			"slider_values": {
-				"AudioPlayer/FileDialog/@VBoxContainer@12094/@MarginContainer@12134/Tree/@Popup@12120/@VBoxContainer@12121/@HSlider@12129": {
+				"AudioPlayer/FileDialog/@VBoxContainer@7328/@MarginContainer@7368/Tree/@Popup@7354/@VBoxContainer@7355/@HSlider@7363": {
 					"editable": true,
 					"editable": true,
 					"meta": {
 					"meta": {
 
 
@@ -212,24 +234,34 @@
 			}
 			}
 		},
 		},
 		{
 		{
+			"addremoveinlets": {
+
+			},
 			"checkbutton_states": {
 			"checkbutton_states": {
 
 
 			},
 			},
-			"command": "notes",
+			"command": "preview",
 			"id": 7,
 			"id": 7,
-			"name": "notes",
+			"name": "preview",
 			"notes": {
 			"notes": {
-				"CodeEdit": "Preview nodes can be connected anywhere in a thread. When the thread is run it will allow you to hear the audio at that point in the thread.\n\nFiles loaded into a Preview node will be excluded from \"Delete Intermediate Files\".\n\nNote: including many of these in a thread may introduce some lag."
+
 			},
 			},
 			"offset": {
 			"offset": {
-				"x": 488.888885498047,
+				"x": 980.000122070313,
 				"y": 347.111145019531
 				"y": 347.111145019531
 			},
 			},
 			"optionbutton_values": {
 			"optionbutton_values": {
-
+				"@OptionButton@7589": 1,
+				"@OptionButton@7630": 0
 			},
 			},
 			"slider_values": {
 			"slider_values": {
+				"AudioPlayer/FileDialog/@VBoxContainer@7577/@MarginContainer@7617/Tree/@Popup@7603/@VBoxContainer@7604/@HSlider@7612": {
+					"editable": true,
+					"meta": {
 
 
+					},
+					"value": 0.0
+				}
 			}
 			}
 		}
 		}
 	]
 	]

+ 271 - 0
examples/randomising_values.thd

@@ -0,0 +1,271 @@
+{
+	"connections": [
+		{
+			"from_node_id": 3,
+			"from_port": 0,
+			"to_node_id": 2,
+			"to_port": 0
+		},
+		{
+			"from_node_id": 2,
+			"from_port": 0,
+			"to_node_id": 1,
+			"to_port": 0
+		}
+	],
+	"fftoverlap": 2,
+	"fftsize": 9,
+	"nodes": [
+		{
+			"addremoveinlets": {
+
+			},
+			"checkbutton_states": {
+				"Autoplay": true,
+				"DeleteIntermediateFilesToggle": true,
+				"ReuseFolderToggle": true
+			},
+			"command": "outputfile",
+			"id": 1,
+			"name": "outputfile",
+			"notes": {
+
+			},
+			"offset": {
+				"x": 1241.11108398438,
+				"y": 71.1111068725586
+			},
+			"optionbutton_values": {
+				"@OptionButton@8393": 1,
+				"@OptionButton@8434": 0
+			},
+			"slider_values": {
+				"AudioPlayer/FileDialog/@VBoxContainer@8381/@MarginContainer@8421/Tree/@Popup@8407/@VBoxContainer@8408/@HSlider@8416": {
+					"editable": true,
+					"meta": {
+
+					},
+					"value": 0.0
+				}
+			}
+		},
+		{
+			"addremoveinlets": {
+
+			},
+			"checkbutton_states": {
+
+			},
+			"command": "modify_brassage_6",
+			"id": 2,
+			"name": "modify_brassage_6",
+			"notes": {
+
+			},
+			"offset": {
+				"x": 901.111145019531,
+				"y": 71.1111068725586
+			},
+			"optionbutton_values": {
+
+			},
+			"slider_values": {
+				"Amplitude/HSplitContainer/HSlider": {
+					"editable": true,
+					"meta": {
+						"brk": true,
+						"default_value": 1.0,
+						"fftwindowcount": false,
+						"fftwindowsize": false,
+						"flag": "",
+						"max": false,
+						"min": false,
+						"time": false
+					},
+					"value": 1.0
+				},
+				"Attack/HSplitContainer/HSlider": {
+					"editable": true,
+					"meta": {
+						"brk": true,
+						"default_value": 5.0,
+						"fftwindowcount": false,
+						"fftwindowsize": false,
+						"flag": "",
+						"max": false,
+						"min": false,
+						"time": false
+					},
+					"value": 5.0
+				},
+				"Decay/HSplitContainer/HSlider": {
+					"editable": true,
+					"meta": {
+						"brk": true,
+						"default_value": 5.0,
+						"fftwindowcount": false,
+						"fftwindowsize": false,
+						"flag": "",
+						"max": false,
+						"min": false,
+						"time": false
+					},
+					"value": 5.0
+				},
+				"Density/HSplitContainer/HSlider": {
+					"editable": true,
+					"meta": {
+						"brk": true,
+						"default_value": 2.0,
+						"fftwindowcount": false,
+						"fftwindowsize": false,
+						"flag": "",
+						"max": false,
+						"min": false,
+						"time": false
+					},
+					"value": 2.0
+				},
+				"GrainSize/HSplitContainer/HSlider": {
+					"editable": true,
+					"meta": {
+						"brk": true,
+						"default_value": 50.0,
+						"fftwindowcount": false,
+						"fftwindowsize": false,
+						"flag": "",
+						"max": false,
+						"min": false,
+						"time": false
+					},
+					"value": 50.0
+				},
+				"Jitter/HSplitContainer/HSlider": {
+					"editable": true,
+					"meta": {
+						"brk": true,
+						"default_value": 0.5,
+						"fftwindowcount": false,
+						"fftwindowsize": false,
+						"flag": "-j",
+						"max": false,
+						"min": false,
+						"time": false
+					},
+					"value": 0.5
+				},
+				"Panning/HSplitContainer/HSlider": {
+					"editable": true,
+					"meta": {
+						"brk": true,
+						"default_value": 0.5,
+						"fftwindowcount": false,
+						"fftwindowsize": false,
+						"flag": "",
+						"max": false,
+						"min": false,
+						"time": false
+					},
+					"value": 0.5
+				},
+				"PitchShift/HSplitContainer/HSlider": {
+					"editable": true,
+					"meta": {
+						"brk": true,
+						"default_value": 0.0,
+						"fftwindowcount": false,
+						"fftwindowsize": false,
+						"flag": "",
+						"max": false,
+						"min": false,
+						"time": false
+					},
+					"value": 0.0
+				},
+				"ScanSpeed/HSplitContainer/HSlider": {
+					"editable": true,
+					"meta": {
+						"brk": true,
+						"default_value": 1.0,
+						"fftwindowcount": false,
+						"fftwindowsize": false,
+						"flag": "",
+						"max": false,
+						"min": false,
+						"time": false
+					},
+					"value": 1.0
+				},
+				"SearchRange/HSplitContainer/HSlider": {
+					"editable": true,
+					"meta": {
+						"brk": true,
+						"default_value": 1.0,
+						"fftwindowcount": false,
+						"fftwindowsize": false,
+						"flag": "-r",
+						"max": false,
+						"min": false,
+						"time": false
+					},
+					"value": 1.0
+				}
+			}
+		},
+		{
+			"addremoveinlets": {
+
+			},
+			"checkbutton_states": {
+
+			},
+			"command": "inputfile",
+			"id": 3,
+			"name": "inputfile",
+			"notes": {
+
+			},
+			"offset": {
+				"x": 442.222259521484,
+				"y": 71.1111068725586
+			},
+			"optionbutton_values": {
+				"@OptionButton@8285": 1,
+				"@OptionButton@8326": 0
+			},
+			"slider_values": {
+				"AudioPlayer/FileDialog/@VBoxContainer@8273/@MarginContainer@8313/Tree/@Popup@8299/@VBoxContainer@8300/@HSlider@8308": {
+					"editable": true,
+					"meta": {
+
+					},
+					"value": 0.0
+				}
+			}
+		},
+		{
+			"addremoveinlets": {
+
+			},
+			"checkbutton_states": {
+
+			},
+			"command": "notes",
+			"id": 4,
+			"name": "notes",
+			"notes": {
+				"CodeEdit": "The exclamation mark button (!) at the top of nodes with sliders will allow you to randomise all sliders in that node.\n\nNote: randomising values in CDP can produce extreme results, use with caution and check values before running!\n\nYou can reset a slider to its default by double clicking it."
+			},
+			"offset": {
+				"x": 13.3333349227905,
+				"y": 68.8888854980469
+			},
+			"optionbutton_values": {
+
+			},
+			"slider_values": {
+
+			}
+		}
+	]
+}

+ 19 - 17
scenes/main/control.tscn

@@ -375,7 +375,7 @@ item_2/id = 2
 [node name="HelpButton" type="PopupMenu" parent="MenuBar"]
 [node name="HelpButton" type="PopupMenu" parent="MenuBar"]
 auto_translate_mode = 1
 auto_translate_mode = 1
 title = "Help"
 title = "Help"
-item_count = 16
+item_count = 17
 item_0/text = "Tutorials"
 item_0/text = "Tutorials"
 item_0/id = 0
 item_0/id = 0
 item_0/separator = true
 item_0/separator = true
@@ -395,22 +395,24 @@ item_7/text = "Multiple Inputs"
 item_7/id = 13
 item_7/id = 13
 item_8/text = "Preview Nodes"
 item_8/text = "Preview Nodes"
 item_8/id = 14
 item_8/id = 14
-item_9/text = "Tips"
-item_9/id = 7
-item_9/separator = true
-item_10/text = "Wet/Dry Mix"
-item_10/id = 8
-item_11/text = "Resonant Filters"
-item_11/id = 12
-item_12/text = "Other Help"
-item_12/id = 9
-item_12/separator = true
-item_13/text = "Keyboard/Mouse Shortcuts"
-item_13/id = 15
-item_14/text = "CDP Documentation"
-item_14/id = 10
-item_15/text = "Report a Bug"
-item_15/id = 11
+item_9/text = "Randomising Parameters"
+item_9/id = 16
+item_10/text = "Tips"
+item_10/id = 7
+item_10/separator = true
+item_11/text = "Wet/Dry Mix"
+item_11/id = 8
+item_12/text = "Resonant Filters"
+item_12/id = 12
+item_13/text = "Other Help"
+item_13/id = 9
+item_13/separator = true
+item_14/text = "Keyboard/Mouse Shortcuts"
+item_14/id = 15
+item_15/text = "CDP Documentation"
+item_15/id = 10
+item_16/text = "Report a Bug"
+item_16/id = 11
 
 
 [node name="About" type="PopupMenu" parent="MenuBar"]
 [node name="About" type="PopupMenu" parent="MenuBar"]
 item_count = 1
 item_count = 1

+ 25 - 78
scenes/main/scripts/control.gd

@@ -524,100 +524,47 @@ func _on_help_button_index_pressed(index: int) -> void:
 		0:
 		0:
 			pass
 			pass
 		1:
 		1:
-			if changesmade == true:
-				savestate = "helpfile"
-				helpfile = "res://examples/getting_started.thd"
-				$SaveChangesPopup.popup_centered()
-			else:
-				currentfile = "none" #reset current file to none for save tracking so user cant save over help file
-				save_load.load_graph_edit("res://examples/getting_started.thd")
+			open_a_helpfile("res://examples/getting_started.thd")
+
 		2:
 		2:
-			if changesmade == true:
-				savestate = "helpfile"
-				helpfile = "res://examples/navigating.thd"
-				$SaveChangesPopup.popup_centered()
-			else:
-				currentfile = "none" #reset current file to none for save tracking so user cant save over help file
-				save_load.load_graph_edit("res://examples/navigating.thd")
+			open_a_helpfile("res://examples/navigating.thd")
 		3:
 		3:
-			if changesmade == true:
-				savestate = "helpfile"
-				helpfile = "res://examples/building_a_thread.thd"
-				$SaveChangesPopup.popup_centered()
-			else:
-				currentfile = "none" #reset current file to none for save tracking so user cant save over help file
-				save_load.load_graph_edit("res://examples/building_a_thread.thd")
+			open_a_helpfile("res://examples/building_a_thread.thd")
 		4:
 		4:
-			if changesmade == true:
-				savestate = "helpfile"
-				helpfile = "res://examples/frequency_domain.thd"
-				$SaveChangesPopup.popup_centered()
-			else:
-				currentfile = "none" #reset current file to none for save tracking so user cant save over help file
-				save_load.load_graph_edit("res://examples/frequency_domain.thd")
+			open_a_helpfile("res://examples/frequency_domain.thd")
 		5:
 		5:
-			if changesmade == true:
-				savestate = "helpfile"
-				helpfile = "res://examples/automation.thd"
-				$SaveChangesPopup.popup_centered()
-			else:
-				currentfile = "none" #reset current file to none for save tracking so user cant save over help file
-				save_load.load_graph_edit("res://examples/automation.thd")
+			open_a_helpfile("res://examples/automation.thd")
 		6:
 		6:
-			if changesmade == true:
-				savestate = "helpfile"
-				helpfile = "res://examples/trimming.thd"
-				$SaveChangesPopup.popup_centered()
-			else:
-				currentfile = "none" #reset current file to none for save tracking so user cant save over help file
-				save_load.load_graph_edit("res://examples/trimming.thd")
+			open_a_helpfile("res://examples/trimming.thd")
 		7:
 		7:
-			if changesmade == true:
-				savestate = "helpfile"
-				helpfile = "res://examples/multiple_inputs.thd"
-				$SaveChangesPopup.popup_centered()
-			else:
-				currentfile = "none" #reset current file to none for save tracking so user cant save over help file
-				save_load.load_graph_edit("res://examples/multiple_inputs.thd")
+			open_a_helpfile("res://examples/multiple_inputs.thd")
 		8:
 		8:
-			if changesmade == true:
-				savestate = "helpfile"
-				helpfile = "res://examples/preview_nodes.thd"
-				$SaveChangesPopup.popup_centered()
-			else:
-				currentfile = "none" #reset current file to none for save tracking so user cant save over help file
-				save_load.load_graph_edit("res://examples/preview_nodes.thd")
+			open_a_helpfile("res://examples/preview_nodes.thd")
 		9:
 		9:
-			pass
+			open_a_helpfile("res://examples/randomising_values.thd")
 		10:
 		10:
-			if changesmade == true:
-				savestate = "helpfile"
-				helpfile = "res://examples/wetdry.thd"
-				$SaveChangesPopup.popup_centered()
-			else:
-				currentfile = "none" #reset current file to none for save tracking so user cant save over help file
-				save_load.load_graph_edit("res://examples/wetdry.thd")
+			pass
 		11:
 		11:
-			if changesmade == true:
-				savestate = "helpfile"
-				helpfile = "res://examples/resonant_filters.thd"
-				$SaveChangesPopup.popup_centered()
-			else:
-				currentfile = "none" #reset current file to none for save tracking so user cant save over help file
-				save_load.load_graph_edit("res://examples/resonant_filters.thd")
+			open_a_helpfile("res://examples/wetdry.thd")
 		12:
 		12:
-			pass
+			open_a_helpfile("res://examples/resonant_filters.thd")
 		13:
 		13:
-			open_help.open_keyboard_shortcuts_help()
+			pass
 		14:
 		14:
-			OS.shell_open("https://www.composersdesktop.com/docs/html/ccdpndex.htm")
+			open_help.open_keyboard_shortcuts_help()
 		15:
 		15:
+			OS.shell_open("https://www.composersdesktop.com/docs/html/ccdpndex.htm")
+		16:
 			OS.shell_open("https://github.com/j-p-higgins/SoundThread/issues")
 			OS.shell_open("https://github.com/j-p-higgins/SoundThread/issues")
 
 
-#func _recycle_outfile():
-	#if outfile != "no file":
-		#input_audio_player.recycle_outfile(outfile)
-
+func open_a_helpfile(help_file: String) -> void:
+	if changesmade == true:
+		savestate = "helpfile"
+		helpfile = help_file
+		$SaveChangesPopup.popup_centered()
+	else:
+		currentfile = "none" #reset current file to none for save tracking so user cant save over help file
+		save_load.load_graph_edit(help_file)
 
 
 
 
 func _on_save_changes_button_down() -> void:
 func _on_save_changes_button_down() -> void: