فهرست منبع

tidied up json and made help file window generative, sarted implementing audio settings

Jonathan Higgins 7 ماه پیش
والد
کامیت
ff2e9b841c

+ 2 - 2
export_presets.cfg

@@ -9,7 +9,7 @@ custom_features=""
 export_filter="all_resources"
 include_filter="*.thd, export_presets.cfg"
 exclude_filter=""
-export_path="../SoundThread_Exports/SoundThread.exe"
+export_path="../SoundThread_Exports/v0.1.3-alpha/SoundThread.exe"
 patches=PackedStringArray()
 encryption_include_filters=""
 encryption_exclude_filters=""
@@ -76,7 +76,7 @@ custom_features=""
 export_filter="all_resources"
 include_filter="*.thd, export_presets.cfg"
 exclude_filter=""
-export_path="../SoundThread_Exports/v0.1.2-alpha/SoundThread-v0.1.1-alpha_macos.zip"
+export_path="../SoundThread_Exports/v0.1.3-alpha/SoundThread-v0.1.3-alpha_macos.zip"
 patches=PackedStringArray()
 encryption_include_filters=""
 encryption_exclude_filters=""

+ 1 - 1
scenes/Nodes/nodes.tscn

@@ -3058,7 +3058,7 @@ layout_mode = 2
 tooltip_text = "Number of windows over which to average the spectrum"
 
 [node name="Label" parent="blur_blur/VBoxContainer" index="0"]
-text = "Bluring~"
+text = "Blurring~"
 
 [node name="HSlider" parent="blur_blur/VBoxContainer/HSplitContainer" index="0"]
 min_value = 1.0

+ 43 - 0
scenes/main/audio_settings.tscn

@@ -0,0 +1,43 @@
+[gd_scene load_steps=2 format=3 uid="uid://dta7rfalv4uvd"]
+
+[ext_resource type="Script" uid="uid://c7krcoq5poxdn" path="res://scenes/main/audiosettings.gd" id="2_7qbns"]
+
+[node name="AudioSettingsControl" type="Control"]
+layout_mode = 3
+anchors_preset = 0
+offset_left = 12.0
+offset_top = 58.0
+offset_right = 588.0
+offset_bottom = 58.0
+script = ExtResource("2_7qbns")
+
+[node name="VBoxContainer" type="VBoxContainer" parent="."]
+layout_mode = 0
+offset_top = -52.0
+offset_right = 576.0
+offset_bottom = 47.0
+
+[node name="WindowTitle" type="Label" parent="VBoxContainer"]
+layout_mode = 2
+theme_override_font_sizes/font_size = 25
+text = "Audio Settings"
+
+[node name="Label" type="Label" parent="VBoxContainer"]
+layout_mode = 2
+text = "Available audio devices:"
+
+[node name="ItemList" type="ItemList" parent="VBoxContainer"]
+custom_minimum_size = Vector2(0, 100)
+layout_mode = 2
+
+[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer"]
+custom_minimum_size = Vector2(0, 1)
+layout_mode = 2
+
+[node name="DeviceInfo" type="Label" parent="VBoxContainer"]
+layout_mode = 2
+text = "Current device:"
+
+[node name="DevicePollTimer" type="Timer" parent="."]
+
+[connection signal="item_selected" from="VBoxContainer/ItemList" to="." method="_on_item_list_item_selected"]

+ 37 - 0
scenes/main/audiosettings.gd

@@ -0,0 +1,37 @@
+extends Control
+
+@onready var item_list = $VBoxContainer/ItemList
+@onready var device_timer = $DevicePollTimer
+
+func _ready():
+	for item in AudioServer.get_output_device_list():
+		item_list.add_item(item)
+
+	var device = AudioServer.get_output_device()
+	for i in range(item_list.get_item_count()):
+		if device == item_list.get_item_text(i):
+			item_list.select(i)
+			break
+	
+	$VBoxContainer/DeviceInfo.text = "Current Device: " + AudioServer.get_output_device()
+
+
+func _process(_delta):
+	#var speaker_mode_text = "Stereo"
+	#var speaker_mode = AudioServer.get_speaker_mode()
+#
+	#if speaker_mode == AudioServer.SPEAKER_SURROUND_31:
+		#speaker_mode_text = "Surround 3.1"
+	#elif speaker_mode == AudioServer.SPEAKER_SURROUND_51:
+		#speaker_mode_text = "Surround 5.1"
+	#elif speaker_mode == AudioServer.SPEAKER_SURROUND_71:
+		#speaker_mode_text = "Surround 7.1"
+	#$VBoxContainer/DeviceInfo.text += "Speaker Mode: " + speaker_mode_text
+	#$VBoxContainer/DeviceInfo.text = "Current Device: " + AudioServer.get_output_device()
+	pass
+
+
+func _on_item_list_item_selected(index: int) -> void:
+	var device = item_list.get_item_text(index)
+	AudioServer.set_output_device(device)
+	$VBoxContainer/DeviceInfo.text = "Current Device: " + device

+ 1 - 0
scenes/main/audiosettings.gd.uid

@@ -0,0 +1 @@
+uid://c7krcoq5poxdn

+ 61 - 15
scenes/main/control.gd

@@ -23,6 +23,7 @@ var foldertoggle #links to the reuse folder button
 var lastoutputfolder = "none" #tracks last output folder, this can in future be used to replace global.outfile but i cba right now
 var process_successful #tracks if the last run process was successful
 var help_data := {} #stores help data for each node to display in help popup
+var HelpWindowScene = preload("res://scenes/main/help_window.tscn")
 
 # Called when the node enters the scene tree for the first time.
 func _ready() -> void:
@@ -35,7 +36,6 @@ func _ready() -> void:
 	$Console.hide()
 	$NoInputPopup.hide()
 	$MultipleConnectionsPopup.hide()
-	$HelpWindow.hide()
 	
 	$SaveDialog.access = FileDialog.ACCESS_FILESYSTEM
 	$SaveDialog.file_mode = FileDialog.FILE_MODE_SAVE_FILE
@@ -217,19 +217,66 @@ func deselect_all_nodes():
 			selected_nodes[node] = false
 
 func show_help_for_node(node_name: String, node_title: String):
+	#check if there is already a help window open for this node and pop it up instead of making a new one
+	for child in get_tree().current_scene.get_children():
+		if child is Window and child.title == "Help - " + node_title:
+			# Found existing window, bring it to front
+			if child.is_visible():
+				child.hide()
+				child.popup()
+			else:
+				child.popup()
+			return
+	
 	if help_data.has(node_name):
+		#looks up the help data from the json and stores it in info
 		var info = help_data[node_name]
-		$HelpWindow.title = "Help - " + node_title
-		$HelpWindow/HelpTitle.text = node_title
-		$HelpWindow/HelpText.text = ""
-		$HelpWindow/HelpText.text += info.get("description", "No help available.")
-		$HelpWindow.show()
+		#makes an instance of the help_window scene
+		var help_window = HelpWindowScene.instantiate()
+		help_window.title = "Help - " + node_title
+		help_window.get_node("HelpTitle").text = node_title
+		
+		var output = ""
+		output += info.get("short_description", "") + "\n\n"
+		
+		var parameters = info.get("parameters", {})
+		#checks if there are parameters and if there are places them in a table
+		if parameters.size() > 0:
+			output += "[table=3]\n"
+			output += "[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]\n"
+			for key in parameters.keys(): #scans through all parameters
+				var param = parameters[key]
+				var name = param.get("paramname", "")
+				var desc = param.get("paramdescription", "")
+				var automatable = param.get("automatable", false)
+				var autom_text = "[center]✓[/center]" if automatable else "[center]𐄂[/center]" #replaces true and false with ticks and crosses
+				output += "[cell]%s[/cell][cell]%s[/cell][cell]%s[/cell]\n" % [name, desc, autom_text] #places each param detail into cells of the table
+			output += "[/table]\n\n" #ends the table
+		
+		output += "[b]Functionality[/b]\n"
+		var description_text = info.get("description", "")
+		output += description_text.strip_edges()
+		#check if this is a cdp process or a utility and display the cdp process if it is one
+		var category = info.get("category", "")
+		if category != "utility":
+			output += "\n\n[b]CDP Process[/b]\nThis node runs the CDP Process: " + node_name.replace("_", " ")
+		
+		help_window.get_node("HelpText").bbcode_text = output
+		help_window.get_node("HelpText").scroll_to_line(0) #scrolls to the first line of the help file just incase
+		
+		# Add to the current scene tree to show it
+		get_tree().current_scene.add_child(help_window)
+		
+		help_window.popup() 
+		
 	else:
-		$HelpWindow.title = "Help - " + node_title
-		$HelpWindow/HelpTitle.text = node_title
-		$HelpWindow/HelpText.text = ""
-		$HelpWindow/HelpText.text += "No help found."
-		$HelpWindow.show()
+		# If no help available, even though there always should be, show a window saying no help found
+		var help_window = HelpWindowScene.instance()
+		help_window.title = "Help - " + node_title
+		help_window.get_node("HelpTitle").text = node_title
+		help_window.get_node("HelpText").bbcode_text = "No help found."
+		get_tree().current_scene.add_child(help_window)
+		help_window.popup()
 
 
 func simulate_mouse_click():
@@ -1267,6 +1314,9 @@ func _on_settings_button_index_pressed(index: int) -> void:
 				ConfigHandler.save_interface_settings("auto_close_console", false)
 		3:
 			$Console.show()
+		4:
+			#$AudioSettings.size = Vector2(600, $AudioSettings/Control/VBoxContainer.size.y + ($AudioSettings/Control/VBoxContainer/ItemList.item_count * 25) + 10)
+			$AudioSettings.popup()
 
 func _on_file_button_index_pressed(index: int) -> void:
 	match index:
@@ -1616,7 +1666,3 @@ func _on_graph_edit_popup_request(at_position: Vector2) -> void:
 	else:
 		$mainmenu.hide()
 		mainmenu_visible = false
-
-
-func _on_help_window_close_requested() -> void:
-	$HelpWindow.hide()

+ 7 - 32
scenes/main/control.tscn

@@ -1,9 +1,10 @@
-[gd_scene load_steps=5 format=3 uid="uid://bcs87y7ptx3ke"]
+[gd_scene load_steps=6 format=3 uid="uid://bcs87y7ptx3ke"]
 
 [ext_resource type="Script" uid="uid://bdlfvuljckmu1" path="res://scenes/main/control.gd" id="1_2f0aq"]
 [ext_resource type="Script" uid="uid://l2yejnjysupr" path="res://scenes/main/graph_edit.gd" id="2_3ioqo"]
 [ext_resource type="PackedScene" uid="uid://b0wdj8v6o0wq0" path="res://scenes/menu/menu.tscn" id="3_dtf4o"]
 [ext_resource type="Texture2D" uid="uid://cdwux1smquvpi" path="res://theme/images/logo.png" id="4_3ioqo"]
+[ext_resource type="PackedScene" uid="uid://dta7rfalv4uvd" path="res://scenes/main/audio_settings.tscn" id="5_dtf4o"]
 
 [node name="Control" type="Control"]
 layout_mode = 3
@@ -222,7 +223,7 @@ item_3/id = 1
 
 [node name="SettingsButton" type="PopupMenu" parent="MenuBar"]
 title = "Settings"
-item_count = 4
+item_count = 5
 item_0/text = "Change CDP Folder Location"
 item_0/id = 0
 item_1/text = "Disable PVOC Multi Input Warning"
@@ -233,6 +234,8 @@ item_2/checkable = 1
 item_2/id = 2
 item_3/text = "Open the Console"
 item_3/id = 3
+item_4/text = "Audio Settings"
+item_4/id = 4
 
 [node name="HelpButton" type="PopupMenu" parent="MenuBar"]
 auto_translate_mode = 1
@@ -314,36 +317,8 @@ offset_right = 351.0
 offset_bottom = 101.0
 text = "Don't Save"
 
-[node name="HelpWindow" type="Window" parent="."]
-initial_position = 2
-size = Vector2i(600, 400)
+[node name="AudioSettings" parent="." instance=ExtResource("5_dtf4o")]
 visible = false
-unresizable = true
-always_on_top = true
-
-[node name="ColorRect" type="ColorRect" parent="HelpWindow"]
-offset_right = 604.0
-offset_bottom = 400.0
-color = Color(0.101961, 0.101961, 0.101961, 0.6)
-
-[node name="HelpTitle" type="Label" parent="HelpWindow"]
-offset_left = 12.0
-offset_top = 8.0
-offset_right = 588.0
-offset_bottom = 27.0
-theme_override_font_sizes/font_size = 25
-text = "Node Name goes here"
-
-[node name="HelpText" type="RichTextLabel" parent="HelpWindow"]
-offset_left = 12.0
-offset_top = 48.0
-offset_right = 588.0
-offset_bottom = 392.0
-theme_override_colors/table_odd_row_bg = Color(0.101961, 0.101961, 0.101961, 0.262745)
-theme_override_constants/table_v_separation = 8
-theme_override_constants/table_h_separation = 10
-bbcode_enabled = true
-text = "Help Text goes in here"
 
 [connection signal="connection_request" from="GraphEdit" to="." method="_on_graph_edit_connection_request"]
 [connection signal="delete_nodes_request" from="GraphEdit" to="." method="_on_graph_edit_delete_nodes_request"]
@@ -367,4 +342,4 @@ text = "Help Text goes in here"
 [connection signal="file_selected" from="LoadDialog" to="." method="_on_load_dialog_file_selected"]
 [connection signal="button_down" from="SaveChangesPopup/SaveChanges" to="." method="_on_save_changes_button_down"]
 [connection signal="button_down" from="SaveChangesPopup/DontSaveChanges" to="." method="_on_dont_save_changes_button_down"]
-[connection signal="close_requested" from="HelpWindow" to="." method="_on_help_window_close_requested"]
+[connection signal="close_requested" from="AudioSettings" to="." method="_on_audio_settings_close_requested"]

+ 9 - 0
scenes/main/help_window.gd

@@ -0,0 +1,9 @@
+extends Window
+
+
+func _ready():
+	pass
+
+
+func _on_close_requested() -> void:
+	queue_free()

+ 1 - 0
scenes/main/help_window.gd.uid

@@ -0,0 +1 @@
+uid://bkte84glywsny

+ 37 - 0
scenes/main/help_window.tscn

@@ -0,0 +1,37 @@
+[gd_scene load_steps=2 format=3 uid="uid://cp5uwxjskqgr7"]
+
+[ext_resource type="Script" uid="uid://bkte84glywsny" path="res://scenes/main/help_window.gd" id="1_ro77y"]
+
+[node name="HelpWindow" type="Window"]
+auto_translate_mode = 1
+initial_position = 2
+size = Vector2i(600, 500)
+visible = false
+unresizable = true
+script = ExtResource("1_ro77y")
+
+[node name="ColorRect" type="ColorRect" parent="."]
+offset_right = 604.0
+offset_bottom = 506.0
+color = Color(0.101961, 0.101961, 0.101961, 0.6)
+
+[node name="HelpTitle" type="Label" parent="."]
+offset_left = 12.0
+offset_top = 14.0
+offset_right = 588.0
+offset_bottom = 45.0
+theme_override_font_sizes/font_size = 25
+text = "Node Name goes here"
+
+[node name="HelpText" type="RichTextLabel" parent="."]
+offset_left = 12.0
+offset_top = 58.0
+offset_right = 588.0
+offset_bottom = 482.0
+theme_override_colors/table_odd_row_bg = Color(0.101961, 0.101961, 0.101961, 0.262745)
+theme_override_constants/table_v_separation = 8
+theme_override_constants/table_h_separation = 10
+bbcode_enabled = true
+text = "Help Text goes in here"
+
+[connection signal="close_requested" from="." to="." method="_on_close_requested"]

+ 1804 - 618
scenes/main/process_help.json

@@ -1,646 +1,1832 @@
 {
   "inputfile": {
-	"description": 
-"Loads a file for processing - supports mono and stereo .wav files
-
-[b]Parameters[/b]
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Load File[/cell][cell]Opens a file browser to select a sound file[/cell][cell][center]𐄂[/center][/cell]
-[cell]Play/Stop[/cell][cell]Plays the input sound file[/cell][cell][center]𐄂[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-SoundThread only supports mono and stereo .wav files.
-
-Clicking and dragging on the soundfile viewer will let you select a section of audio to play.
-
-If audio is selected in Input File when you run the thread, SoundThread will automatically cut out that section and process only that.
-
-Clicking on the soundfile viewer while audio is playing will allow you to jump around the file to listen to different sections.
-",
+	"category": "utility",
+	"subcategory": "",
+	"stereo": true,
+	"title": "Input File",
+	"parameters": {
+	  "param1": {
+		"paramname": "Load File",
+		"paramdescription": "Opens a file browser to select a sound file",
+		"automatable": false,
+		"uitype": "button"
+	  },
+	  "param2": {
+		"paramname": "Play/Stop",
+		"paramdescription": "Plays the input sound file",
+		"automatable": false,
+		"uitype": "button"
+	  }
+	},
+	"short_description": "Loads a file for processing - supports mono and stereo .wav files",
+	"description": "SoundThread only supports mono and stereo .wav files.\n\nClicking and dragging on the sound file viewer will let you select a section of audio to play.\n\nIf audio is selected in Input File when you run the thread, SoundThread will automatically cut out that section and process only that.\n\nClicking on the sound file viewer while audio is playing will allow you to jump around the file to listen to different sections.\n"
   },
   "outputfile": {
-	"description": 
-"Manages output for running threads
-
-[b]Parameters[/b]
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]File Name[/cell][cell]The name for your output file[/cell][cell][center]𐄂[/center][/cell]
-[cell]Run Thread[/cell][cell]Runs the current thread, opens a file dialog to choose the folder for the output files[/cell][cell][center]𐄂[/center][/cell]
-[cell]Delete Intermediate Files[/cell][cell]If switched on, deletes all files except the final output file[/cell][cell][center]𐄂[/center][/cell]
-[cell]Reuse Last Output Folder[/cell][cell]If switched on, the last folder selected on Run Thread will be used for output files[/cell][cell][center]𐄂[/center][/cell]
-[cell]Open Folder[/cell][cell]Opens the last used output folder[/cell][cell][center]𐄂[/center][/cell]
-[cell]Recycle File[/cell][cell]Loops the output file back to the Input File node for reprocessing[/cell][cell][center]𐄂[/center][/cell]
-[cell]Play/Stop[/cell][cell]Plays the last output file[/cell][cell][center]𐄂[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-The name inputted in File Name will be appended with the current date and time so that you don't need to input a new file name each time.
-
-SoundThread can create a lot of files as each node in the thread can create multiple files. Turning on Delete Intermediate Files will delete everything but the main output file. 
-
-Clicking and dragging on the soundfile viewer will let you select a section of audio to play. Clicking on the soundfile viewer while audio is playing will allow you to jump around the file to listen to different sections.
-",
+	"category": "utility",
+	"subcategory": "",
+	"stereo": true,
+	"title": "Output File",
+	"parameters": {
+	  "param1": {
+		"paramname": "File Name",
+		"paramdescription": "The name for your output file",
+		"automatable": false,
+		"uitype": "lineedit"
+	  },
+	  "param2": {
+		"paramname": "Run Thread",
+		"paramdescription": "Runs the current thread, opens a file dialog to choose the folder for the output files",
+		"automatable": false,
+		"uitype": "button"
+	  },
+	  "param3": {
+		"paramname": "Delete Intermediate Files",
+		"paramdescription": "If switched on, deletes all files except the final output file",
+		"automatable": false,
+		"uitype": "toggle"
+	  },
+	  "param4": {
+		"paramname": "Reuse Last Output Folder",
+		"paramdescription": "If switched on, the last folder selected on Run Thread will be used for output files",
+		"automatable": false,
+		"uitype": "toggle"
+	  },
+	  "param5": {
+		"paramname": "Open Folder",
+		"paramdescription": "Opens the last used output folder",
+		"automatable": false,
+		"uitype": "button"
+	  },
+	  "param6": {
+		"paramname": "Recycle File",
+		"paramdescription": "Loops the output file back to the Input File node for reprocessing",
+		"automatable": false,
+		"uitype": "button"
+	  },
+	  "param7": {
+		"paramname": "Play/Stop",
+		"paramdescription": "Plays the last output file",
+		"uitype": "button"
+	  }
+	},
+	"short_description": "Manages output for running threads",
+	"description": "The name inputted in File Name will be appended with the current date and time so that you don't need to input a new file name each time.\n\nSoundThread can create a lot of files as each node in the thread can create multiple files. Turning on Delete Intermediate Files will delete everything but the main output file. \n\nClicking and dragging on the sound file viewer will let you select a section of audio to play. Clicking on the sound file viewer while audio is playing will allow you to jump around the file to listen to different sections.\n"
   },
   "notes": {
-	"description": 
-"A box for taking notes
-
-[b]Functionality[/b]
-Doesn't do anything other than giving you a space to take notes. You can right click in the text box to copy and paste and use special characters like emojis 😊.
-",
+	"category": "utility",
+	"subcategory": "",
+	"stereo": false,
+	"title": "Notes",
+	"parameters": {},
+	"short_description": "A box for taking notes",
+	"description": "Doesn't do anything other than giving you a space to take notes. You can right click in the text box to copy and paste and use special characters like emojis 😊.\n"
   },
   "distort_average": {
-	"description": 
-"Average the waveshape over a number of wavecycles
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Cycle Count[/cell][cell]Number of cycles over which to average[/cell][cell][center]✓[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-Performs a mathematical averaging of the set number of cycle counts. The effect is more akin to a loss of resolution than the blurring which might be expected. Values below 10 retain some semblance of the original, while values of 100 create a kind of 'sample hold' effect.
-
-",
+	"category": "time",
+	"subcategory": "distort",
+	"stereo": false,
+	"title": "Average",
+	"parameters": {
+	  "param1": {
+		"paramname": "Cycle Count",
+		"paramdescription": "Number of cycles over which to average",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": 2,
+		"maxrange": 100,
+		"step": 1,
+		"value": 5,
+		"exponential": false,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "Average the waveshape over a number of wavecycles",
+	"description": "Performs a mathematical averaging of the set number of cycle counts. The effect is more akin to a loss of resolution than the blurring which might be expected. Values below 10 retain some semblance of the original, while values of 100 create a kind of 'sample hold' effect.\n\n"
   },
   "clip_clip_2": {
-	"description": 
-"Clip a fraction of half wavecycles
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Fraction[/cell][cell]Fraction of each half wavecycle to clip, 1 = no change[/cell][cell][center]𐄂[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-Cuts the top and bottom off of a wavecycle. Unlike conventional clipping that only cuts off parts of the signal that exceeds a set threshold, Clip Fraction looks at each cycle of the sound and cuts off a set fraction of that wavecycle. This produces a clipping effect that is uniform across the entire signal and maintains the dynamic range of the original. The lower you set the value, the more distorted the sound will be.
-",
+	"category": "time",
+	"subcategory": "distort",
+	"stereo": false,
+	"title": "Clip Fraction",
+	"parameters": {
+	  "param1": {
+		"paramname": "Fraction",
+		"paramdescription": "Fraction of each half wavecycle to clip, 1 = no change",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": 0,
+		"maxrange": 1,
+		"step": 0.01,
+		"value": 0.7,
+		"exponential": false,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "Clip a fraction of half wavecycles",
+	"description": "Cuts the top and bottom off of a wavecycle. Unlike conventional clipping that only cuts off parts of the signal that exceeds a set threshold, Clip Fraction looks at each cycle of the sound and cuts off a set fraction of that wavecycle. This produces a clipping effect that is uniform across the entire signal and maintains the dynamic range of the original. The lower you set the value, the more distorted the sound will be.\n"
   },
   "distort_divide": {
-	"description": 
-"Distortion by dividing wavecycle frequency
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Divider[/cell][cell] [/cell][cell][center]✓[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-Takes a wavecycle and divides its frequency, pitch shifting it down and making it slower. This longer wavecycle replaces the next few wavecycles keeping the length of the file the same. This produces a rough pitch shift effect with added distortion artifacts. Works best with division values less than 4, at high division values the sound file may be too low to hear.
-
-This process is the opposite of Distort: Multiply.
-",
+	"category": "time",
+	"subcategory": "distort",
+	"stereo": false,
+	"title": "Divide",
+	"parameters": {
+	  "param1": {
+		"paramname": "Divider",
+		"paramdescription": "",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": 2,
+		"maxrange": 16,
+		"step": 1,
+		"value": 2,
+		"exponential": false,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "Distortion by dividing wavecycle frequency",
+	"description": "Takes a wavecycle and divides its frequency, pitch shifting it down and making it slower. This longer wavecycle replaces the next few wavecycles keeping the length of the file the same. This produces a rough pitch shift effect with added distortion artifacts. Works best with division values less than 4, at high division values the sound file may be too low to hear.\n\nThis process is the opposite of Distort: Multiply.\n"
   },
   "distort_fractal": {
-	"description": 
-"Superimpose miniature copies of a wavecycles onto itself
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Scaling[/cell][cell]The division of scale of the wavecycle[/cell][cell][center]✓[/center][/cell]
-[cell]Loudness[/cell][cell]Loudness of fractal component compared to original wavecycle, 1 = same level.[/cell][cell][center]✓[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-Takes a wavecycle and divides its length and makes shorter and higher copies that equal the divided length. It then takes these copies and superimposes them over the original wavecycle. The higher the scaling the shorter each copy will be and the more copies will be layered over the original. The loudness control works like a mix between the original and the copies of the wavecycle. Produces a sheen of distortion over the original sound.
-",
+	"category": "time",
+	"subcategory": "distort",
+	"stereo": false,
+	"title": "Fractal",
+	"parameters": {
+	  "param1": {
+		"paramname": "Scaling",
+		"paramdescription": "The division of scale of the wavecycle",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": 2,
+		"maxrange": 20000,
+		"step": 1,
+		"value": 2,
+		"exponential": true,
+		"uitype": "hslider"
+	  },
+	  "param2": {
+		"paramname": "Loudness",
+		"paramdescription": "Loudness of fractal component compared to original wavecycle, 1 = same level.",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": 0.01,
+		"maxrange": 1,
+		"step": 0.01,
+		"value": 1,
+		"exponential": false,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "Superimpose miniature copies of a wavecycles onto itself",
+	"description": "Takes a wavecycle and divides its length and makes shorter and higher copies that equal the divided length. It then takes these copies and superimposes them over the original wavecycle. The higher the scaling the shorter each copy will be and the more copies will be layered over the original. The loudness control works like a mix between the original and the copies of the wavecycle. Produces a sheen of distortion over the original sound.\n"
   },
   "distort_interpolate": {
-	"description": 
-"Time-stretch by repeating wavecycles and interpolating between them
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Multiplier[/cell][cell]The number of times each wavecycle repeats[/cell][cell][center]✓[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-Takes a wavecycle and repeats it based on the multiplier. On each repetition the wavecycle is morphed slightly in shape so that it morphs into the shape of the next wavecycle in the file. This adds a modulatory quality to the output, successive wavecycles gliss and bend as they flow into one another.
-",
+	"category": "time",
+	"subcategory": "distort",
+	"stereo": false,
+	"title": "Interpolate",
+	"parameters": {
+	  "param1": {
+		"paramname": "Multiplier",
+		"paramdescription": "The number of times each wavecycle repeats",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": 2,
+		"maxrange": 64,
+		"step": 1,
+		"value": 2,
+		"exponential": false,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "Time-stretch by repeating wavecycles and interpolating between them",
+	"description": "Takes a wavecycle and repeats it based on the multiplier. On each repetition the wavecycle is morphed slightly in shape so that it morphs into the shape of the next wavecycle in the file. This adds a modulatory quality to the output, successive wavecycles glissando and bend as they flow into one another.\n"
   },
   "distort_multiply": {
-	"description": 
-"Distortion by multiplying wavecycle frequency
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Multiplier[/cell][cell]The amount each wavecycle is multiplied by[/cell][cell][center]✓[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-Takes each wavecycle and multiplies its frequency making it higher and shorter. It then repeats this wavecycle to fill the length of the original keeping the output file the same length. This produces a distorted pitching up of the sound. 
-
-This process is the opposite of Distort: Divide.
-",
+	"category": "time",
+	"subcategory": "distort",
+	"stereo": false,
+	"title": "Multiply",
+	"parameters": {
+	  "param1": {
+		"paramname": "Multiplier",
+		"paramdescription": "The amount each wavecycle is multiplied by",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": 2,
+		"maxrange": 16,
+		"step": 1,
+		"value": 2,
+		"exponential": false,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "Distortion by multiplying wavecycle frequency",
+	"description": "Takes each wavecycle and multiplies its frequency making it higher and shorter. It then repeats this wavecycle to fill the length of the original keeping the output file the same length. This produces a distorted pitching up of the sound. \n\nThis process is the opposite of Distort: Divide.\n"
   },
   "distort_reform_2": {
-	"description": 
-"Replaces wavecycles with square shaped wavecycles
-
-[b]Functionality[/b]
-This process reads each wavecycle and replaces it with a square waveform of the same length and amplitude. This produces a similar but considerably harsher effect to Distort: Clip Fraction.
-",
+	"category": "time",
+	"subcategory": "distort",
+	"stereo": false,
+	"title": "Square",
+	"parameters": {},
+	"short_description": "Replaces wavecycles with square shaped wavecycles",
+	"description": "This process reads each wavecycle and replaces it with a square waveform of the same length and amplitude. This produces a similar but considerably harsher effect to Distort: Clip Fraction.\n"
   },
   "distort_reform_4": {
-	"description": 
-"Replaces wavecycles with triangle shaped wavecycles
-
-[b]Functionality[/b]
-This process reads each wavecycle and replaces it with a triangle waveform of the same length and amplitude. This effect of this process is quite dependent on the input material. If applied to noisy and distorted sounds this will producing a smoothing or filtering like effect. On sounds with few harmonics - e.g. sine waves - it will add additional harmonics producing a gentle distortion.
-",
+	"category": "time",
+	"subcategory": "distort",
+	"stereo": false,
+	"title": "Triangle",
+	"parameters": {},
+	"short_description": "Replaces wavecycles with triangle shaped wavecycles",
+	"description": "This process reads each wavecycle and replaces it with a triangle waveform of the same length and amplitude. This effect of this process is quite dependent on the input material. If applied to noisy and distorted sounds this will producing a smoothing or filtering like effect. On sounds with few harmonics - e.g. sine waves - it will add additional harmonics producing a gentle distortion.\n"
   },
   "distort_reform_6": {
-	"description": 
-"Replaces wavecycles with short pulses
-
-
-[b]Functionality[/b]
-This process reads each wavecycle and replaces it with a short square pulse of a random length of the same amplitude. This produces a rough, rattle like timbre.
-",
+	"category": "time",
+	"subcategory": "distort",
+	"stereo": false,
+	"title": "Click",
+	"parameters": {},
+	"short_description": "Replaces wavecycles with short pulses",
+	"description": "This process reads each wavecycle and replaces it with a short square pulse of a random length of the same amplitude. This produces a rough, rattle like timbre.\n"
   },
   "distort_replace": {
-	"description": 
-"The strongest wavecycle in a group replaces the others
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Cycle Count[/cell][cell]The size of the group[/cell][cell][center]✓[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-Looks at a set number of wavecycles and finds the loudest one and repeats it to replace all other wavecycles. The repeated wavecycle is repeated at its original frequency and amplitude. This produces a sample and hold like effect.
-",
-  },
- 	"quirk_quirk_1": {
-	"description": 
-"Distortion by raising sample values of half wavecycles to a power
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Power Factor[/cell][cell]The power to raise each sample to[/cell][cell][center]𐄂[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-Introduces distortion into a signal by raising sample values to a power. Values less than 1 tend to flatten the tops of the waveform, while values greater than 1 narrow the waveform shape, creating a thinner, raspier sound.
-",
-  },
- 	"extend_drunk_1": {
-	"description": 
-"Wanders through a soundfile jumping forwards and backwards while repeating small segments
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Minimum Output Duration[/cell][cell]The minimum length of the output in seconds[/cell][cell][center]𐄂[/center][/cell]
-[cell]Location[/cell][cell]The position in percent of the input file where the drunken walk occurs[/cell][cell][center]𐄂[/center][/cell]
-[cell]Ambitus[/cell][cell]The percentage of the input file the walk can move either side of the location by over the whole process[/cell][cell][center]𐄂[/center][/cell]
-[cell]Maximum Step[/cell][cell]The maximum percentage of the input file the walk can move by on each step[/cell][cell][center]𐄂[/center][/cell]
-[cell]Clock[/cell][cell]The time between each step in seconds[/cell][cell][center]𐄂[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-Starting at the Location in the input file this process takes a segment and repeats it. When the next clock tick occurs the process will step to another segment and start repeating that. The distance in the file that each step can be is set by the Maximum Step and the amount of the file that it is possible for the process to explore either side of the original Location is set by the Ambitus. 
-",
-  },
- 	"extend_loop_1": {
-	"description": 
-"Repeats advancing segments of a sound
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Start[/cell][cell]The position in percent of the input file where the process will begin[/cell][cell][center]𐄂[/center][/cell]
-[cell]Loop Length[/cell][cell]The length of each looping segment in milliseconds[/cell][cell][center]𐄂[/center][/cell]
-[cell]Step[/cell][cell]The percentage of the input file it moves forwards by on each loop[/cell][cell][center]𐄂[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-Joins together, end-to-end, a series of segments taken from the file. This process will continue until the end of the file is reached. Note, with very long loop lengths and very short steps this may make [b]very[/b] long files.
-",
-  },
- 	"extend_scramble_1": {
-	"description": 
-"Scrambles a soundfile for a set duration
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Minimum Chunk Length[/cell][cell]Minimum percentage of the input to cut[/cell][cell][center]𐄂[/center][/cell]
-[cell]Maximum Chunk Length[/cell][cell]Maximum percentage of the input to cut[/cell][cell][center]𐄂[/center][/cell]
-[cell]Output Duration[/cell][cell]Length of the output file in seconds[/cell][cell][center]𐄂[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-Cuts out segments at random from the full duration of the file and splices them end to end. Randomises the length of each chunk to be between the minimum and maximum. With small maximum chunks this will produce a granular synthesis like effect, with large chunks it will create new phrases in the material.
-",
-  },
- 	"extend_zigzag_1": {
-	"description": 
-"Moves through a sound sliding backwards and forwards as it goes
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Start Point[/cell][cell]The point in percent of the input where the process begins[/cell][cell][center]𐄂[/center][/cell]
-[cell]End Point[/cell][cell]The point in percent of the input where the process ends[/cell][cell][center]𐄂[/center][/cell]
-[cell]Output Duration[/cell][cell]The total duration of the output file[/cell][cell][center]𐄂[/center][/cell]
-[cell]Minimum Zigzag Time[/cell][cell]Minimum acceptable time between successive zigzag timepoints[/cell][cell][center]𐄂[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-Unlike the other extend processes this process also plays segments of the sound file backwards. This results in a smoother transition between jumps creating an output that slips and slides through its length.
-",
-  },
- 	"filter_bank_1": {
-	"description": 
-"Bank of filters tuned to the harmonic series
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Q[/cell][cell]How narrow each filter band is[/cell][cell][center]✓[/center][/cell]
-[cell]Makeup Gain[/cell][cell]How much gain to apply after filtering[/cell][cell][center]𐄂[/center][/cell]
-[cell]Lowest Band[/cell][cell]The lowest band in the bank[/cell][cell][center]𐄂[/center][/cell]
-[cell]Highest Band[/cell][cell]The highest band in the bank[/cell][cell][center]𐄂[/center][/cell]
-[cell]Scatter[/cell][cell]Amount of deviation from the harmonic series[/cell][cell][center]𐄂[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-This process takes the frequency of the lowest band and create filters up to the value of the highest band tuned to the harmonic series. Scatter applies some randomisation of these values moving the sound from something very harmonic to something more bell like in tone. The makeup gain provides a way of adding a boost to the filtered signal, you may need to adjust this if clipping occurs. Note, Q can be automated although doing this does sometimes produce temperamental results.
-",
-  },
- 	"filter_bank_2": {
-	"description": 
-"Bank of filters tuned to odd harmonics from the harmonic series
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Q[/cell][cell]How narrow each filter band is[/cell][cell][center]✓[/center][/cell]
-[cell]Makeup Gain[/cell][cell]How much gain to apply after filtering[/cell][cell][center]𐄂[/center][/cell]
-[cell]Lowest Band[/cell][cell]The lowest band in the bank[/cell][cell][center]𐄂[/center][/cell]
-[cell]Highest Band[/cell][cell]The highest band in the bank[/cell][cell][center]𐄂[/center][/cell]
-[cell]Scatter[/cell][cell]Amount of deviation from the harmonic series[/cell][cell][center]𐄂[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-This process takes the frequency of the lowest band and create filters up to the value of the highest band tuned to odd harmonics of the harmonic series. Scatter applies some randomisation of these values moving the sound from something very harmonic to something more bell like in tone. The makeup gain provides a way of adding a boost to the filtered signal, you may need to adjust this if clipping occurs. Note, Q can be automated although doing this does sometimes produce temperamental results.
-",
-  },
- 	"filter_bank_5": {
-	"description": 
-"Bank of filters with a fixed number of bands spaced linearly between two frequencies
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Q[/cell][cell]How narrow each filter band is[/cell][cell][center]✓[/center][/cell]
-[cell]Makeup Gain[/cell][cell]How much gain to apply after filtering[/cell][cell][center]𐄂[/center][/cell]
-[cell]Lowest Band[/cell][cell]The lowest band in the bank[/cell][cell][center]𐄂[/center][/cell]
-[cell]Highest Band[/cell][cell]The highest band in the bank[/cell][cell][center]𐄂[/center][/cell]
-[cell]Number of Filters[/cell][cell]The number of bands in the bank[/cell][cell][center]𐄂[/center][/cell]
-[cell]Scatter[/cell][cell]Amount of deviation from the harmonic series[/cell][cell][center]𐄂[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-This process takes the number of filters and spaces them equally in Hz between the lowest and highest bands. Scatter applies some randomisation of these values. The makeup gain provides a way of adding a boost to the filtered signal, you may need to adjust this if clipping occurs. Note, Q can be automated although doing this does sometimes produce temperamental results. Unlike Filter Bank: Pitched Intervals this will produce a more discordant sound as the frequencies will not align to uniform harmonic intervals.
-",
-  },
- 	"filter_bank_6": {
-	"description": 
-"Bank of filters with a fixed number of bands spaced musically between two frequencies
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Q[/cell][cell]How narrow each filter band is[/cell][cell][center]✓[/center][/cell]
-[cell]Makeup Gain[/cell][cell]How much gain to apply after filtering[/cell][cell][center]𐄂[/center][/cell]
-[cell]Lowest Band[/cell][cell]The lowest band in the bank[/cell][cell][center]𐄂[/center][/cell]
-[cell]Highest Band[/cell][cell]The highest band in the bank[/cell][cell][center]𐄂[/center][/cell]
-[cell]Number of Filters[/cell][cell]The number of bands in the bank[/cell][cell][center]𐄂[/center][/cell]
-[cell]Scatter[/cell][cell]Amount of deviation from the harmonic series[/cell][cell][center]𐄂[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-This process takes the number of filters and spaces them equally in semitones between the lowest and highest bands. Scatter applies some randomisation of these values moving the sound from something very harmonic to something more bell like in tone. The makeup gain provides a way of adding a boost to the filtered signal, you may need to adjust this if clipping occurs. Note, Q can be automated although doing this does sometimes produce temperamental results. Unlike Filter Bank: Linear this will produce a more consonant sound as the frequencies will align to uniform harmonic intervals.
-",
-  },
- 	"filter_lohi_1": {
-	"description": 
-"Fixed low-pass or high-pass filter
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Rolloff[/cell][cell]Gain reduction of the filter, in dB[/cell][cell][center]𐄂[/center][/cell]
-[cell]Pass-band[/cell][cell]Last pitch to be passed by the filter in Hz[/cell][cell][center]𐄂[/center][/cell]
-[cell]Stop-band[/cell][cell]first pitch to be stopped by the filter in Hz[/cell][cell][center]𐄂[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-The low-pass filter lets through all of the sound below pass-band and attenuates the frequencies higher than pass-band, ending at stop-band.
-
-The high-pass filter lets through all of the sound above pass-band and attenuates the frequencies lower than pass-band, ending at stop-band.
-
-Setting the Pass-band lower than the stop-band creates a low-pass filter. Setting the Pass-band higher than the stop-band creates a high-pass filter.
-",
-  },
- 	"modify_brassage_1": {
-	"description": 
-"Granular pitch shift keeping the same speed
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Pitch Shift[/cell][cell]Amount in semitones to shift the pitch by[/cell][cell][center]✓[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-Cuts the sound file into grains and speeds them up or slows them down to change their pitch. By repeating/omitting grains it retains the original speed. At high increases in pitch this will create a metalic sound, with high decreases in pitch the sound will lose detail.
-",
-  },
- 	"modify_brassage_2": {
-	"description": 
-"Granular time stretch keeping the same pitch
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Speed[/cell][cell]Multiplier to increase/decrease the speed by, 1 = original speed, 2 = double speed, 0.5 = half speed[/cell][cell][center]✓[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-Cuts the sound file into grains and repeats omits grains to adjust the speed of the sound. At high decreases in speed this will create a metalic sound, with high increases in speed the sound will lose detail.
-",
-  },
- 	"modify_brassage_4": {
-	"description": 
-"Random reordering of grains
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Grainsize[/cell][cell]Size of the grains in milliseconds[/cell][cell][center]✓[/center][/cell]
-[cell]Range[/cell][cell]Distance to move while looking for next grain[/cell][cell][center]✓[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-Moves through the file from start to end and reorders the grains within the set timeframe of range. Small range values will retain some of the original shape of the sound, large range values will result in a very jumbled sound.
-",
-  },
- 	"modify_brassage_5": {
-	"description": 
-"Puts a grainy surface on a source
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Density[/cell][cell]Amount of grain overlap[/cell][cell][center]✓[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-Moves through the sound from start to end and cuts it into grains. The density control sets how many of these grains are played back. A density of 1 will sound close to the original file, less than 1 will introduce gaps between grains, and values greater than one will smooth out the sound and introduce doubling.
-",
-  },
- 	"modify_brassage_6": {
-	"description": 
-"Powerful granular segmentation/fragmentation procedures
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Scan Speed[/cell][cell]How fast to move through the file, 1 = original speed, 2 = double speed, 0.5 = half speed[/cell][cell][center]✓[/center][/cell]
-[cell]Density[/cell][cell]Amount of grain overlap, values less than 1 create gaps[/cell][cell][center]✓[/center][/cell]
-[cell]Grain Size[/cell][cell]Length of grains in ms[/cell][cell][center]✓[/center][/cell]
-[cell]Pitch Shift[/cell][cell]Amount to shift pitch of grain in semitones[/cell][cell][center]✓[/center][/cell]
-[cell]Amplitude[/cell][cell]Overal amplitude of the output[/cell][cell][center]✓[/center][/cell]
-[cell]Panning[/cell][cell]Panning of grains from left to right[/cell][cell][center]✓[/center][/cell]
-[cell]Attack[/cell][cell]Amount of time in ms each grain takes to fade in[/cell][cell][center]✓[/center][/cell]
-[cell]Decay[/cell][cell]Amount of time in ms each grain takes to fade out[/cell][cell][center]✓[/center][/cell]
-[cell]Search Range[/cell][cell]Distance to move while looking for next grain[/cell][cell][center]✓[/center][/cell]
-[cell]Jitter[/cell][cell]Amount of randomisation of grain position[/cell][cell][center]✓[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-This process moves through the file from start to end at the speed set by scan speed. How linearly it moves through the file is set by the Search Range and Jitter. 
-
-As it moves through the file it cuts out small chunks - called grains - of the file and plays those back. The length of those grains and how they fade in and out is set by the Grain Size, Attack and Decay. The pitch of the grains is set by Pitch Shift. 
-
-How many grains play back is set by the Density, desities less than 1 will create gaps between grains, densities higher than 1 will cause grains to overlap and merge. 
-
-Finally the sound can be panned from left to right with Panning and the overall level of the sound can be adjusted with Amplitude. 
-
-This process works particularly well when automation is applied to many parameters to make it shift and change over time. 
-",
-  },
- 	"modify_loudness_1": {
-	"description": 
-"Adjust gain
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Gain[/cell][cell]The amount to scale the signal by[/cell][cell][center]✓[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-Adjusts the gain of a sound making it louder and quieter. Less than 1 is quieter, more than 1 is louder. Useful for adjusting the level of a sound before a process to avoid clipping and for blending parallel processing in your thread (see Help > Tips > Wet/Dry Mix for more). 
-",
-  },
- 	"modify_radical_1": {
-	"description": 
-"Reverses a sound
-
-[b]Functionality[/b]
-Makes the sound play backwards. Particularly useful before processes like Stack to create interesting attack and decays.
-",
-  },
- 	"modify_speed_2": {
-	"description": 
-"Speeds up or slows down a sound changing pitch
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Semitones[/cell][cell]The amount to adjust the speed/pitch by in semitones[/cell][cell][center]✓[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-Plays the sound faster or slower to adjust its speed and pitch. -12 semitones is half speed, +12 semitones is double speed. 
-",
-  }, 
- 	"modify_speed_5": {
-	"description": 
-"Speed up or slow down a sound over time
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Transposition Ratio[/cell][cell]The amount to adjust the speed by as a multiplier[/cell][cell][center]𐄂[/center][/cell]
-[cell]Goal Time[/cell][cell]The point in the input sound in percent to have reached the transposition ratio by[/cell][cell][center]𐄂[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-Creates a glissando effect by gradually speeding up or slowing down the file. Once the target time in the sound is reached it will continue sliding up or down to the end of the sound. 0.5 = half speed and 1 octave lower, 2 = double speed and 1 octave higher. Note: for more control over speed over time you can automate the Speed process instead. 
-",
-  },
- 	"modify_stack": {
-	"description": 
-"Stacks transposed versions of a sound on top of one another
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Transposition[/cell][cell]The amount in semitones each layer is transposed by[/cell][cell][center]𐄂[/center][/cell]
-[cell]Layers[/cell][cell]The number of layers[/cell][cell][center]𐄂[/center][/cell]
-[cell]Lean[/cell][cell]The loudness of the highest layer relative to the others[/cell][cell][center]𐄂[/center][/cell]
-[cell]Attack Offset[/cell][cell]The point in the file in percent where the attack of the sound begins[/cell][cell][center]𐄂[/center][/cell]
-[cell]Output Gain[/cell][cell]Adjusts the output gain to avoid clipping[/cell][cell][center]𐄂[/center][/cell]
-[cell]Output Duration[/cell][cell]The amount of the sound to render, 1 is the full sound[/cell][cell][center]𐄂[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-This process takes the sound and makes numerous copies of it, set by the number of layers. Each copy is sped up or slowed down by the transposition amount mulitplied by its layer number - -12 semitones = half speec, +12 semitones = double speed. These layers are then stacks on top of each other to create a denser sound. The attack offset is used to line up the layers so that their attacks all line up, adjust this to the point in the input where you want all the sounds to line up. The output duration allows you to trim off the end of the sound as with negative transposition and many layers the output can get very long. 
-",
-  },
- 	"blur_blur": {
-	"description": 
-"Time-average the spectrum
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Bluring[/cell][cell]The number of windows over which to average the spectrum[/cell][cell][center]✓[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-This process 'blurs' detail in the time dimension by interpolating between the spectral envelope values of the start and end windows blurring windows. Note that it is not interpolating continuously over all the windows inbetween, just between the data in the start and end windows. The overall result is somewhat affected by just how different the data is in these two windows. The interpolation process produces a 'straight line' (linear) scale of values between the start and end points.
-",
-  },
- 	"blur_chorus_5": {
-	"description": 
-"Chorusing by randomising amplitudes and frequencies of partials
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Amplitude Randomise[/cell][cell]Maximum random scatter of partial amplitudes[/cell][cell][center]✓[/center][/cell]
-[cell]Frequency Randomise[/cell][cell]Maximum random scatter of partial frequencies[/cell][cell][center]✓[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-This process attempts to achieve a chorusing effect by randomising the amplitude and frequency values of the partials. If very large amplitude aspread values are used, the sound will turn to noise. The chorusing effect itself is achieved by values just a little above 1. Values of 2 or 3 begin to create a granular effect, and values of 10, 100 and 1000 create more and more noise.
-",
-  },
- 	"blur_scatter": {
-	"description": 
-"Randomly thin the spectrum
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Amount Kept[/cell][cell]Number of randomly chosen blocks to keep in each spectral window[/cell][cell][center]✓[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-This function throws away a specified proportion of the analysis data in each window at random. This produces a result similar to the Trace process however, unlike Trace the material kept by Thin Randomly may or may not include prominent parts of the sound.
-",
-  },
- 	"focus_accu": {
-	"description": 
-"Sustain each spectral band until louder data appears in that band
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Decay[/cell][cell]Ammount for each sustained band to decay each second[/cell][cell][center]✓[/center][/cell]
-[cell]Glissandos[/cell][cell]Amount each sustained band glissandos in octaves per second[/cell][cell][center]✓[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-Frequencies are sustained into subsequent windows. The overall effect is one of sustaining, but one which also makes the spectrum more complex.
-
-The Glissandos parameter produces glissandos within the spectrum of the sound. Very effective slow glissandos are produced when gliss is near 0, e.g., -0.9 or 0.1. At 0.5, there are several glissandos, at 1, they are fairly fast, and at 10 it becomes a wash.
-",
-  },
- 	"hilite_trace_1": {
-	"description": 
-"Highlight the loudest partials
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Amount Kept[/cell][cell]The number of partials to keep[/cell][cell][center]✓[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-Looks for and retains only the N loudest partials in the analysis data on a window-by-window basis. This reduces the data in the spectral dimension and produces an aural 'trace' of the original sound.
-
-With non-'noisy' sources it is necessary to reduce the number of channels quite considerably to make any appreciable aural change to the source sound. Even the 10 loudest channels will retain a surprising amount of the original sound. The flip-side of this is that HILITE TRACE can be used to 'clean' a sound, if a certain amount of data loss is not a problem. 
-
-This works well with Blur after it to create a smeared simplified version of the sound.
-",
-  },
- 	"pvoc_anal_1": {
-	"description": 
-"Convert a sound from the time domain to the frequency domain
-
-[b]Functionality[/b]
-This is process is used to analyse and a sound and convert it from the time domain to the frequency domain. This allows for processes in the PVOC processes menu to be used to manipulate the sound. Once you are done processing in the frequency domain you can convert it back to audio again using Resynthesise. See Help > Tutorials > PVOC for more.
-",
-  },
- 	"pvoc_synth": {
-	"description": 
-"Convert a sound from the frequency domain to the time domain
-
-[b]Functionality[/b]
-This is process is used to take the analysis of a sound file and resynthesise it back into the time domain. This should be used after you are done processing in the frequency domain to convert back to audio. See Help > Tutorials > PVOC for more. 
-",
-  },
- 	"spec_gain": {
-	"description": 
-"Adjusts the gain in the frequency domain
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Gain[/cell][cell]The amount to scale the gain by[/cell][cell][center]✓[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-This process is very similar to the time domain Gain process, it adjusts how loud the signal is, however this process operates on signals that are in the frequency domain. This is useful for adjusting signals that may clip when converted back to the time domain.
-",
-  },
- 	"spectstr_stretch": {
-	"description": 
-"Time-stretch a sound without changing pitch
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Stretch Multiplier[/cell][cell]The amount to stretch the sound by[/cell][cell][center]𐄂[/center][/cell]
-[cell]D-Ratio[/cell][cell]Proportion of channels to discohere[/cell][cell][center]𐄂[/center][/cell]
-[cell]D-Random[/cell][cell]Frequency randomisation of discohered channels[/cell][cell][center]𐄂[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-Stretches or shrinks the sound over time, without changing frequency. It creates extra time-windows to expand the overall time-base of the sound, without a change of frequency. When using large stretch values you will make very long sound files and this process may take some time to run.
-
-D-Ratio and D-Random allow you to randomise some of the channels in the sound to create internal variation and different timbres. Small amounts of this will blur the sound slightly and on long stretches help the sound feel less static. With large amounts of randomisation the texture of the sound starts to feel granular.
-",
-  },
- 	"strange_invert_1": {
-	"description": 
-"Invert the spectral envelope
-
-[b]Functionality[/b]
-Inverts the spectral envelope, relative to the overall spectral envelope. This means that the energy asociated with the highest frequency bands is transferred to the lowest ones and vice versa. As the lowest partials in many sounds have the greatest amplitude and the highest ones the least, the result is typically a much brighter timbre.
-",
-  },
- 	"strange_waver_1": {
-	"description": 
-"Oscillate between harmonic and inharmonic state
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell]Vibrato Frequency[/cell][cell]Speed of oscillations in Hz[/cell][cell][center]✓[/center][/cell]
-[cell]Stretch[/cell][cell]The maximum spectral stretch in the inharmonic state[/cell][cell][center]✓[/center][/cell]
-[cell]Base Frequency[/cell][cell]The frequency above which spectral stretching happens[/cell][cell][center]𐄂[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-Introduces an oscillation towards and away from inharmonicness in the spectrum of a sound. The program moves towards inharmonicness by means of the stretch factor. 
-",
-  },
- 	"processname": {
-	"description": 
-"Short Description
-
-[table=3]
-[cell][b]Parameter Name[/b][/cell][cell][b]Description[/b][/cell][cell][b]Automatable[/b][/cell]
-[cell] [/cell][cell] [/cell][cell][center]✓𐄂[/center][/cell]
-[/table]
-
-[b]Functionality[/b]
-
-",
+	"category": "time",
+	"subcategory": "distort",
+	"stereo": false,
+	"title": "Replace",
+	"parameters": {
+	  "param1": {
+		"paramname": "Cycle Count",
+		"paramdescription": "The size of the group",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": 2,
+		"maxrange": 64,
+		"step": 1,
+		"value": 2,
+		"exponential": false,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "The strongest wavecycle in a group replaces the others",
+	"description": "Looks at a set number of wavecycles and finds the loudest one and repeats it to replace all other wavecycles. The repeated wavecycle is repeated at its original frequency and amplitude. This produces a sample and hold like effect.\n"
   },
+  "quirk_quirk_1": {
+	"category": "time",
+	"subcategory": "distort",
+	"stereo": false,
+	"title": "Power Factor",
+	"parameters": {
+	  "param1": {
+		"paramname": "Power Factor",
+		"paramdescription": "The power to raise each sample to",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": 0.01,
+		"maxrange": 100,
+		"step": 0.01,
+		"value": 0.7,
+		"exponential": true,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "Distortion by raising sample values of half wavecycles to a power",
+	"description": "Introduces distortion into a signal by raising sample values to a power. Values less than 1 tend to flatten the tops of the waveform, while values greater than 1 narrow the waveform shape, creating a thinner, raspier sound.\n"
+  },
+  "extend_drunk_1": {
+	"category": "time",
+	"subcategory": "extend",
+	"stereo": true,
+	"title": "Drunk",
+	"parameters": {
+	  "param1": {
+		"paramname": "Minimum Output Duration",
+		"paramdescription": "The minimum length of the output in seconds",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": 1,
+		"maxrange": 1000,
+		"step": 1,
+		"value": 30,
+		"exponential": true,
+		"uitype": "hslider"
+	  },
+	  "param2": {
+		"paramname": "Location",
+		"paramdescription": "The position in percent of the input file where the drunken walk occurs",
+		"automatable": false,
+		"time": true,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": 0,
+		"maxrange": 100,
+		"step": 0.01,
+		"value": 0,
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param3": {
+		"paramname": "Ambitus",
+		"paramdescription": "The percentage of the input file the walk can move either side of the location by over the whole process",
+		"automatable": false,
+		"time": true,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": 0.1,
+		"maxrange": 100,
+		"step": 0.01,
+		"value": 2,
+		"exponential": true,
+		"uitype": "hslider"
+	  },
+	  "param4": {
+		"paramname": "Maximum Step",
+		"paramdescription": "The maximum percentage of the input file the walk can move by on each step",
+		"automatable": false,
+		"time": true,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": 0.1,
+		"maxrange": 100,
+		"step": 0.01,
+		"value": 0.5,
+		"exponential": true,
+		"uitype": "hslider"
+	  },
+	  "param5": {
+		"paramname": "Clock",
+		"paramdescription": "The time between each step in seconds",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": 0.05,
+		"maxrange": 6,
+		"step": 0.1,
+		"value": 0.05,
+		"exponential": false,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "Wanders through a sound file jumping forwards and backwards while repeating small segments",
+	"description": "Starting at the Location in the input file this process takes a segment and repeats it. When the next clock tick occurs, the process will step to another segment and start repeating that. The distance in the file that each step can be is set by the Maximum Step and the amount of the file that it is possible for the process to explore either side of the original Location is set by the Ambitus. \n"
+  },
+  "extend_loop_1": {
+	"category": "time",
+	"subcategory": "extend",
+	"stereo": true,
+	"title": "Loop",
+	"parameters": {
+	  "param1": {
+		"paramname": "Start",
+		"paramdescription": "The position in percent of the input file where the process will begin",
+		"automatable": false,
+		"time": true,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param2": {
+		"paramname": "Loop Length",
+		"paramdescription": "The length of each looping segment in milliseconds",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param3": {
+		"paramname": "Step",
+		"paramdescription": "The percentage of the input file it moves forwards by on each loop",
+		"automatable": false,
+		"time": true,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "Repeats advancing segments of a sound",
+	"description": "Joins together, end-to-end, a series of segments taken from the file. This process will continue until the end of the file is reached. Note, with very long loop lengths and very short steps this may make [b]very[/b] long files.\n"
+  },
+  "extend_scramble_1": {
+	"category": "time",
+	"subcategory": "extend",
+	"stereo": true,
+	"title": "Scramble",
+	"parameters": {
+	  "param1": {
+		"paramname": "Minimum Chunk Length",
+		"paramdescription": "Minimum percentage of the input to cut",
+		"automatable": false,
+		"time": true,
+		"min": true,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param2": {
+		"paramname": "Maximum Chunk Length",
+		"paramdescription": "Maximum percentage of the input to cut",
+		"automatable": false,
+		"time": true,
+		"min": true,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param3": {
+		"paramname": "Output Duration",
+		"paramdescription": "Length of the output file in seconds",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "Scrambles a sound file for a set duration",
+	"description": "Cuts out segments at random from the full duration of the file and splices them end to end. Randomises the length of each chunk to be between the minimum and maximum. With small maximum chunks this will produce a granular synthesis like effect, with large chunks it will create new phrases in the material.\n"
+  },
+  "extend_zigzag_1": {
+	"category": "time",
+	"subcategory": "extend",
+	"stereo": true,
+	"title": "Zigzag",
+	"parameters": {
+	  "param1": {
+		"paramname": "Start Point",
+		"paramdescription": "The point in percent of the input where the process begins",
+		"automatable": false,
+		"time": true,
+		"min": false,
+		"max": true,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param2": {
+		"paramname": "End Point",
+		"paramdescription": "The point in percent of the input where the process ends",
+		"automatable": false,
+		"time": true,
+		"min": false,
+		"max": true,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param3": {
+		"paramname": "Output Duration",
+		"paramdescription": "The total duration of the output file",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param4": {
+		"paramname": "Minimum Zigzag Time",
+		"paramdescription": "Minimum acceptable time between successive zigzag timepoints",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "Moves through a sound sliding backwards and forwards as it goes",
+	"description": "Unlike the other extend processes this process also plays segments of the sound file backwards. This results in a smoother transition between jumps creating an output that slips and slides through its length.\n"
+  },
+  "filter_bank_1": {
+	"category": "time",
+	"subcategory": "filter",
+	"stereo": true,
+	"title": "Harmonic Series",
+	"parameters": {
+	  "param1": {
+		"paramname": "Q",
+		"paramdescription": "How narrow each filter band is",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param2": {
+		"paramname": "Makeup Gain",
+		"paramdescription": "How much gain to apply after filtering",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param3": {
+		"paramname": "Lowest Band",
+		"paramdescription": "The lowest band in the bank",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param4": {
+		"paramname": "Highest Band",
+		"paramdescription": "The highest band in the bank",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param5": {
+		"paramname": "Scatter",
+		"paramdescription": "Amount of deviation from the harmonic series",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "Bank of filters tuned to the harmonic series",
+	"description": "This process takes the frequency of the lowest band and create filters up to the value of the highest band tuned to the harmonic series. Scatter applies some randomisation of these values moving the sound from something very harmonic to something more bell like in tone. The makeup gain provides a way of adding a boost to the filtered signal, you may need to adjust this if clipping occurs. Note, Q can be automated although doing this does sometimes produce temperamental results.\n"
+  },
+  "filter_bank_2": {
+	"category": "time",
+	"subcategory": "filter",
+	"stereo": true,
+	"title": "Odd Harmonics",
+	"parameters": {
+	  "param1": {
+		"paramname": "Q",
+		"paramdescription": "How narrow each filter band is",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param2": {
+		"paramname": "Makeup Gain",
+		"paramdescription": "How much gain to apply after filtering",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param3": {
+		"paramname": "Lowest Band",
+		"paramdescription": "The lowest band in the bank",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param4": {
+		"paramname": "Highest Band",
+		"paramdescription": "The highest band in the bank",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param5": {
+		"paramname": "Scatter",
+		"paramdescription": "Amount of deviation from the harmonic series",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "Bank of filters tuned to odd harmonics from the harmonic series",
+	"description": "This process takes the frequency of the lowest band and create filters up to the value of the highest band tuned to odd harmonics of the harmonic series. Scatter applies some randomisation of these values moving the sound from something very harmonic to something more bell like in tone. The makeup gain provides a way of adding a boost to the filtered signal, you may need to adjust this if clipping occurs. Note, Q can be automated although doing this does sometimes produce temperamental results.\n"
+  },
+  "filter_bank_5": {
+	"category": "time",
+	"subcategory": "filter",
+	"stereo": true,
+	"title": "Linear",
+	"parameters": {
+	  "param1": {
+		"paramname": "Q",
+		"paramdescription": "How narrow each filter band is",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param2": {
+		"paramname": "Makeup Gain",
+		"paramdescription": "How much gain to apply after filtering",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param3": {
+		"paramname": "Lowest Band",
+		"paramdescription": "The lowest band in the bank",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param4": {
+		"paramname": "Highest Band",
+		"paramdescription": "The highest band in the bank",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param5": {
+		"paramname": "Number of Filters",
+		"paramdescription": "The number of bands in the bank",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param6": {
+		"paramname": "Scatter",
+		"paramdescription": "Amount of deviation from the harmonic series",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "Bank of filters with a fixed number of bands spaced linearly between two frequencies",
+	"description": "This process takes the number of filters and spaces them equally in Hz between the lowest and highest bands. Scatter applies some randomisation of these values. The makeup gain provides a way of adding a boost to the filtered signal, you may need to adjust this if clipping occurs. Note, Q can be automated although doing this does sometimes produce temperamental results. Unlike Filter Bank: Pitched Intervals this will produce a more discordant sound as the frequencies will not align to uniform harmonic intervals.\n"
+  },
+  "filter_bank_6": {
+	"category": "time",
+	"subcategory": "filter",
+	"stereo": true,
+	"title": "Pitched Intervals",
+	"parameters": {
+	  "param1": {
+		"paramname": "Q",
+		"paramdescription": "How narrow each filter band is",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param2": {
+		"paramname": "Makeup Gain",
+		"paramdescription": "How much gain to apply after filtering",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param3": {
+		"paramname": "Lowest Band",
+		"paramdescription": "The lowest band in the bank",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param4": {
+		"paramname": "Highest Band",
+		"paramdescription": "The highest band in the bank",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param5": {
+		"paramname": "Number of Filters",
+		"paramdescription": "The number of bands in the bank",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param6": {
+		"paramname": "Scatter",
+		"paramdescription": "Amount of deviation from the harmonic series",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "Bank of filters with a fixed number of bands spaced musically between two frequencies",
+	"description": "This process takes the number of filters and spaces them equally in semitones between the lowest and highest bands. Scatter applies some randomisation of these values moving the sound from something very harmonic to something more bell like in tone. The makeup gain provides a way of adding a boost to the filtered signal, you may need to adjust this if clipping occurs. Note, Q can be automated although doing this does sometimes produce temperamental results. Unlike Filter Bank: Linear this will produce a more consonant sound as the frequencies will align to uniform harmonic intervals.\n"
+  },
+  "filter_lohi_1": {
+	"category": "time",
+	"subcategory": "filter",
+	"stereo": true,
+	"title": "Low/High Pass",
+	"parameters": {
+	  "param1": {
+		"paramname": "Rolloff",
+		"paramdescription": "Gain reduction of the filter, in dB",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param2": {
+		"paramname": "Pass-band",
+		"paramdescription": "Last pitch to be passed by the filter in Hz",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param3": {
+		"paramname": "Stop-band",
+		"paramdescription": "first pitch to be stopped by the filter in Hz",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "Fixed low-pass or high-pass filter",
+	"description": "The low-pass filter lets through all of the sound below pass-band and attenuates the frequencies higher than pass-band, ending at stop-band.\n\nThe high-pass filter lets through all of the sound above pass-band and attenuates the frequencies lower than pass-band, ending at stop-band.\n\nSetting the Pass-band lower than the stop-band creates a low-pass filter. Setting the Pass-band higher than the stop-band creates a high-pass filter.\n"
+  },
+  "modify_brassage_1": {
+	"category": "time",
+	"subcategory": "granulate",
+	"stereo": true,
+	"title": "Pitch Shift",
+	"parameters": {
+	  "param1": {
+		"paramname": "Pitch Shift",
+		"paramdescription": "Amount in semitones to shift the pitch by",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "Granular pitch shift keeping the same speed",
+	"description": "Cuts the sound file into grains and speeds them up or slows them down to change their pitch. By repeating/omitting grains it retains the original speed. At high increases in pitch this will create a metallic sound, with high decreases in pitch the sound will lose detail.\n"
+  },
+  "modify_brassage_2": {
+	"category": "time",
+	"subcategory": "granulate",
+	"stereo": true,
+	"title": "Time Stretch",
+	"parameters": {
+	  "param1": {
+		"paramname": "Speed",
+		"paramdescription": "Multiplier to increase/decrease the speed by, 1 = original speed, 2 = double speed, 0.5 = half speed",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "Granular time stretch keeping the same pitch",
+	"description": "Cuts the sound file into grains and repeats omits grains to adjust the speed of the sound. At high decreases in speed this will create a metallic sound, with high increases in speed the sound will lose detail.\n"
+  },
+  "modify_brassage_4": {
+	"category": "time",
+	"subcategory": "granulate",
+	"stereo": true,
+	"title": "Scramble",
+	"parameters": {
+	  "param1": {
+		"paramname": "Grainsize",
+		"paramdescription": "Size of the grains in milliseconds",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param2": {
+		"paramname": "Range",
+		"paramdescription": "Distance to move while looking for next grain",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "Random reordering of grains",
+	"description": "Moves through the file from start to end and reorders the grains within the set timeframe of range. Small range values will retain some of the original shape of the sound, large range values will result in a very jumbled sound.\n"
+  },
+  "modify_brassage_5": {
+	"category": "time",
+	"subcategory": "granulate",
+	"stereo": true,
+	"title": "Granulate",
+	"parameters": {
+	  "param1": {
+		"paramname": "Density",
+		"paramdescription": "Amount of grain overlap",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "Puts a grainy surface on a source",
+	"description": "Moves through the sound from start to end and cuts it into grains. The density control sets how many of these grains are played back. A density of 1 will sound close to the original file, less than 1 will introduce gaps between grains, and values greater than one will smooth out the sound and introduce doubling.\n"
+  },
+  "modify_brassage_6": {
+	"category": "time",
+	"subcategory": "granulate",
+	"stereo": true,
+	"title": "Brassage",
+	"parameters": {
+	  "param1": {
+		"paramname": "Scan Speed",
+		"paramdescription": "How fast to move through the file, 1 = original speed, 2 = double speed, 0.5 = half speed",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param2": {
+		"paramname": "Density",
+		"paramdescription": "Amount of grain overlap, values less than 1 create gaps",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param3": {
+		"paramname": "Grain Size",
+		"paramdescription": "Length of grains in ms",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param4": {
+		"paramname": "Pitch Shift",
+		"paramdescription": "Amount to shift pitch of grain in semitones",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param5": {
+		"paramname": "Amplitude",
+		"paramdescription": "Overall amplitude of the output",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param6": {
+		"paramname": "Panning",
+		"paramdescription": "Panning of grains from left to right",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param7": {
+		"paramname": "Attack",
+		"paramdescription": "Amount of time in ms each grain takes to fade in",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param8": {
+		"paramname": "Decay",
+		"paramdescription": "Amount of time in ms each grain takes to fade out",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param9": {
+		"paramname": "Search Range",
+		"paramdescription": "Distance to move while looking for next grain",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param10": {
+		"paramname": "Jitter",
+		"paramdescription": "Amount of randomisation of grain position",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "Powerful granular segmentation/fragmentation procedures",
+	"description": "This process moves through the file from start to end at the speed set by scan speed. How linearly it moves through the file is set by the Search Range and Jitter. \n\nAs it moves through the file it cuts out small chunks - called grains - of the file and plays those back. The length of those grains and how they fade in and out is set by the Grain Size, Attack and Decay. The pitch of the grains is set by Pitch Shift. \n\nHow many grains play back is set by the Density, densities less than 1 will create gaps between grains, densities higher than 1 will cause grains to overlap and merge. \n\nFinally the sound can be panned from left to right with Panning and the Overalll level of the sound can be adjusted with Amplitude. \n\nThis process works particularly well when automation is applied to many parameters to make it shift and change over time. \n"
+  },
+  "modify_loudness_1": {
+	"category": "time",
+	"subcategory": "misc",
+	"stereo": true,
+	"title": "Gain",
+	"parameters": {
+	  "param1": {
+		"paramname": "Gain",
+		"paramdescription": "The amount to scale the signal by",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "Adjust gain",
+	"description": "Adjusts the gain of a sound making it louder and quieter. Less than 1 is quieter, more than 1 is louder. Useful for adjusting the level of a sound before a process to avoid clipping and for blending parallel processing in your thread (see Help > Tips > Wet/Dry Mix for more). \n"
+  },
+  "modify_radical_1": {
+	"category": "time",
+	"subcategory": "misc",
+	"stereo": true,
+	"title": "Reverse",
+	"parameters": {},
+	"short_description": "Reverses a sound",
+	"description": "Makes the sound play backwards. Particularly useful before processes like Stack to create interesting attack and decays.\n"
+  },
+  "modify_speed_2": {
+	"category": "time",
+	"subcategory": "misc",
+	"stereo": true,
+	"title": "Speed in Semitones",
+	"parameters": {
+	  "param1": {
+		"paramname": "Semitones",
+		"paramdescription": "The amount to adjust the speed/pitch by in semitones",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "Speeds up or slows down a sound changing pitch",
+	"description": "Plays the sound faster or slower to adjust its speed and pitch. -12 semitones is half speed; +12 semitones is double speed. \n"
+  },
+  "modify_speed_5": {
+	"category": "time",
+	"subcategory": "misc",
+	"stereo": true,
+	"title": "Accelerate/Decelerate",
+	"parameters": {
+	  "param1": {
+		"paramname": "Transposition Ratio",
+		"paramdescription": "The amount to adjust the speed by as a multiplier",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param2": {
+		"paramname": "Goal Time",
+		"paramdescription": "The point in the input sound in percent to have reached the transposition ratio by",
+		"automatable": false,
+		"time": true,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "Speed up or slow down a sound over time",
+	"description": "Creates a glissando effect by gradually speeding up or slowing down the file. Once the target time in the sound is reached it will continue sliding up or down to the end of the sound. 0.5 = half speed and 1 octave lower, 2 = double speed and 1 octave higher. Note: for more control over speed over time you can automate the Speed process instead. \n"
+  },
+  "modify_stack": {
+	"category": "time",
+	"subcategory": "misc",
+	"stereo": true,
+	"title": "Stack",
+	"parameters": {
+	  "param1": {
+		"paramname": "Transposition",
+		"paramdescription": "The amount in semitones each layer is transposed by",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param2": {
+		"paramname": "Layers",
+		"paramdescription": "The number of layers",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param3": {
+		"paramname": "Lean",
+		"paramdescription": "The loudness of the highest layer relative to the others",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param4": {
+		"paramname": "Attack Offset",
+		"paramdescription": "The point in the file in percent where the attack of the sound begins",
+		"automatable": false,
+		"time": true,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param5": {
+		"paramname": "Output Gain",
+		"paramdescription": "Adjusts the output gain to avoid clipping",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param6": {
+		"paramname": "Output Duration",
+		"paramdescription": "The amount of the sound to render, 1 is the full sound",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "Stacks transposed versions of a sound on top of one another",
+	"description": "This process takes the sound and makes numerous copies of it, set by the number of layers. Each copy is sped up or slowed down by the transposition amount multiplied  by its layer number - -12 semitones = half speed, +12 semitones = double speed. These layers are then stacks on top of each other to create a denser sound. The attack offset is used to line up the layers so that their attacks all line up, adjust this to the point in the input where you want all the sounds to line up. The output duration allows you to trim off the end of the sound as with negative transposition and many layers the output can get very long. \n"
+  },
+  "blur_blur": {
+	"category": "pvoc",
+	"subcategory": "process",
+	"stereo": false,
+	"title": "Blur",
+	"parameters": {
+	  "param1": {
+		"paramname": "Blurring",
+		"paramdescription": "The number of windows over which to average the spectrum",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "Time-average the spectrum",
+	"description": "This process 'blurs' detail in the time dimension by interpolating between the spectral envelope values of the start and end windows blurring windows. Note that it is not interpolating continuously over all the windows in between, just between the data in the start and end windows. The Overalll result is somewhat affected by just how different the data is in these two windows. The interpolation process produces a 'straight line' (linear) scale of values between the start and end points.\n"
+  },
+  "blur_chorus_5": {
+	"category": "pvoc",
+	"subcategory": "process",
+	"stereo": false,
+	"title": "Chorus",
+	"parameters": {
+	  "param1": {
+		"paramname": "Amplitude Randomise",
+		"paramdescription": "Maximum random scatter of partial amplitudes",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param2": {
+		"paramname": "Frequency Randomise",
+		"paramdescription": "Maximum random scatter of partial frequencies",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "Chorusing by randomising amplitudes and frequencies of partials",
+	"description": "This process attempts to achieve a chorusing effect by randomising the amplitude and frequency values of the partials. If very large amplitude values are used, the sound will turn to noise. The chorusing effect itself is achieved by values just a little above 1. Values of 2 or 3 begin to create a granular effect, and values of 10, 100 and 1000 create more and more noise.\n"
+  },
+  "blur_scatter": {
+	"category": "pvoc",
+	"subcategory": "process",
+	"stereo": false,
+	"title": "Thin Randomly",
+	"parameters": {
+	  "param1": {
+		"paramname": "Amount Kept",
+		"paramdescription": "Number of randomly chosen blocks to keep in each spectral window",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "Randomly thin the spectrum",
+	"description": "This function throws away a specified proportion of the analysis data in each window at random. This produces a result similar to the Trace process however, unlike Trace the material kept by Thin Randomly may or may not include prominent parts of the sound.\n"
+  },
+  "focus_accu": {
+	"category": "pvoc",
+	"subcategory": "process",
+	"stereo": false,
+	"title": "Accumulate",
+	"parameters": {
+	  "param1": {
+		"paramname": "Decay",
+		"paramdescription": "Amount for each sustained band to decay each second",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param2": {
+		"paramname": "Glissandos",
+		"paramdescription": "Amount each sustained band glissandos in octaves per second",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "Sustain each spectral band until louder data appears in that band",
+	"description": "Frequencies are sustained into subsequent windows. The Overalll effect is one of sustaining, but one which also makes the spectrum more complex.\n\nThe Glissandos parameter produces glissandos within the spectrum of the sound. Very effective slow glissandos are produced when Glissandos is near 0, e.g., -0.9 or 0.1. At 0.5, there are several glissandos, at 1, they are fairly fast, and at 10 it becomes a wash.\n"
+  },
+  "hilite_trace_1": {
+	"category": "pvoc",
+	"subcategory": "process",
+	"stereo": false,
+	"title": "Trace",
+	"parameters": {
+	  "param1": {
+		"paramname": "Amount Kept",
+		"paramdescription": "The number of partials to keep",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "Highlight the loudest partials",
+	"description": "Looks for and retains only the N loudest partials in the analysis data on a window-by-window basis. This reduces the data in the spectral dimension and produces an aural 'trace' of the original sound.\n\nWith non-'noisy' sources it is necessary to reduce the number of channels quite considerably to make any appreciable aural change to the source sound. Even the 10 loudest channels will retain a surprising amount of the original sound. The flip side of this is that Trace can be used to 'clean' a sound, if a certain amount of data loss is not a problem. \n\nThis works well with Blur after it to create a smeared simplified version of the sound.\n"
+  },
+  "pvoc_anal_1": {
+	"category": "pvoc",
+	"subcategory": "convert",
+	"stereo": false,
+	"title": "Analyse",
+	"parameters": {},
+	"short_description": "Convert a sound from the time domain to the frequency domain",
+	"description": "This is process is used to analyse a sound and convert it from the time domain to the frequency domain. This allows for processes in the PVOC processes menu to be used to manipulate the sound. Once you are done processing in the frequency domain you can convert it back to audio again using Resynthesise. See Help > Tutorials > PVOC for more.\n"
+  },
+  "pvoc_synth": {
+	"category": "pvoc",
+	"subcategory": "convert",
+	"stereo": false,
+	"title": "Resynthesise",
+	"parameters": {},
+	"short_description": "Convert a sound from the frequency domain to the time domain",
+	"description": "This is process is used to take the analysis of a sound file and resynthesise it back into the time domain. This should be used after you are done processing in the frequency domain to convert back to audio. See Help > Tutorials > PVOC for more. \n"
+  },
+  "spec_gain": {
+	"category": "pvoc",
+	"subcategory": "process",
+	"stereo": false,
+	"title": "Gain",
+	"parameters": {
+	  "param1": {
+		"paramname": "Gain",
+		"paramdescription": "The amount to scale the gain by",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "Adjusts the gain in the frequency domain",
+	"description": "This process is very similar to the time domain Gain process, it adjusts how loud the signal is, however this process operates on signals that are in the frequency domain. This is useful for adjusting signals that may clip when converted back to the time domain.\n"
+  },
+  "spectstr_stretch": {
+	"category": "pvoc",
+	"subcategory": "process",
+	"stereo": false,
+	"title": "Stretch",
+	"parameters": {
+	  "param1": {
+		"paramname": "Stretch Multiplier",
+		"paramdescription": "The amount to stretch the sound by",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param2": {
+		"paramname": "D-Ratio",
+		"paramdescription": "Proportion of channels to discohere",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param3": {
+		"paramname": "D-Random",
+		"paramdescription": "Frequency randomisation of discohered channels",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "Time-stretch a sound without changing pitch",
+	"description": "Stretches or shrinks the sound over time, without changing frequency. It creates extra time-windows to expand the Overalll time-base of the sound, without a change of frequency. When using large stretch values you will make very long sound files, and this process may take some time to run.\n\nD-Ratio and D-Random allow you to randomise some of the channels in the sound to create internal variation and different timbres. Small amounts of this will blur the sound slightly and on long stretches help the sound feel less static. With large amounts of randomisation, the texture of the sound starts to feel granular.\n"
+  },
+  "strange_invert_1": {
+	"category": "pvoc",
+	"subcategory": "process",
+	"stereo": false,
+	"title": "Invert",
+	"parameters": {},
+	"short_description": "Invert the spectral envelope",
+	"description": "Inverts the spectral envelope, relative to the Overalll spectral envelope. This means that the energy associated with the highest frequency bands is transferred to the lowest ones and vice versa. As the lowest partials in many sounds have the greatest amplitude and the highest ones the least, the result is typically a much brighter timbre.\n"
+  },
+  "strange_waver_1": {
+	"category": "pvoc",
+	"subcategory": "process",
+	"stereo": false,
+	"title": "Waver",
+	"parameters": {
+	  "param1": {
+		"paramname": "Vibrato Frequency",
+		"paramdescription": "Speed of oscillations in Hz",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param2": {
+		"paramname": "Stretch",
+		"paramdescription": "The maximum spectral stretch in the inharmonic state",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  },
+	  "param3": {
+		"paramname": "Base Frequency",
+		"paramdescription": "The frequency above which spectral stretching happens",
+		"automatable": false,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "Oscillate between harmonic and inharmonic state",
+	"description": "Introduces an oscillation towards and away from inharmonicness in the spectrum of a sound. The program moves towards inharmonicness by means of the stretch factor. \n"
+  },
+  "processname": {
+	"category": "time",
+	"subcategory": "",
+	"stereo": false,
+	"title": "",
+	"parameters": {
+	  "param1": {
+		"paramname": "",
+		"paramdescription": "",
+		"automatable": true,
+		"time": false,
+		"min": false,
+		"max": false,
+		"flag": "",
+		"minrange": "",
+		"maxrange": "",
+		"step": "",
+		"value": "",
+		"exponential": false,
+		"uitype": "hslider"
+	  }
+	},
+	"short_description": "Short Description",
+	"description": "\n"
+  }
 }

+ 105 - 1
theme/main_theme.tres

@@ -1,4 +1,4 @@
-[gd_resource type="Theme" load_steps=55 format=3 uid="uid://cefwkdcoxihro"]
+[gd_resource type="Theme" load_steps=64 format=3 uid="uid://cefwkdcoxihro"]
 
 [ext_resource type="Texture2D" uid="uid://b4o8vm5o4uptk" path="res://theme/images/toggle_checked.png" id="1_cibxr"]
 [ext_resource type="Texture2D" uid="uid://d0dubcywvqtkw" path="res://theme/images/toggle_unchecked.png" id="2_adhqp"]
@@ -266,6 +266,101 @@ bg_color = Color(0.1, 0.1, 0.1, 0.6)
 corner_radius_bottom_left = 4
 corner_detail = 6
 
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_4xa5k"]
+content_margin_left = 4.0
+content_margin_top = 4.0
+content_margin_right = 4.0
+content_margin_bottom = 4.0
+bg_color = Color(1, 1, 1, 0)
+draw_center = false
+border_width_left = 2
+border_width_top = 2
+border_width_right = 2
+border_width_bottom = 2
+corner_detail = 5
+expand_margin_left = 2.0
+expand_margin_top = 2.0
+expand_margin_right = 2.0
+expand_margin_bottom = 2.0
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_fqy7u"]
+content_margin_left = 4.0
+content_margin_top = 4.0
+content_margin_right = 4.0
+content_margin_bottom = 4.0
+bg_color = Color(1, 1, 1, 0)
+draw_center = false
+border_width_left = 2
+border_width_top = 2
+border_width_right = 2
+border_width_bottom = 2
+corner_detail = 5
+expand_margin_left = 2.0
+expand_margin_top = 2.0
+expand_margin_right = 2.0
+expand_margin_bottom = 2.0
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_1g5yx"]
+content_margin_left = 4.0
+content_margin_top = 4.0
+content_margin_right = 4.0
+content_margin_bottom = 4.0
+bg_color = Color(1, 1, 1, 0)
+draw_center = false
+corner_detail = 5
+expand_margin_left = 2.0
+expand_margin_top = 2.0
+expand_margin_right = 2.0
+expand_margin_bottom = 2.0
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_dkcgw"]
+content_margin_left = 4.0
+content_margin_top = 4.0
+content_margin_right = 4.0
+content_margin_bottom = 4.0
+bg_color = Color(1, 1, 1, 0.07)
+corner_detail = 5
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_egqfp"]
+content_margin_left = 4.0
+content_margin_top = 4.0
+content_margin_right = 4.0
+content_margin_bottom = 4.0
+bg_color = Color(1, 1, 1, 0.4)
+corner_detail = 5
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_0nqb6"]
+content_margin_left = 4.0
+content_margin_top = 4.0
+content_margin_right = 4.0
+content_margin_bottom = 4.0
+bg_color = Color(1, 1, 1, 0.4)
+corner_detail = 5
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_opadq"]
+content_margin_left = 4.0
+content_margin_top = 4.0
+content_margin_right = 4.0
+content_margin_bottom = 4.0
+bg_color = Color(0.1, 0.1, 0.1, 0.6)
+corner_detail = 5
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_xnh8w"]
+content_margin_left = 4.0
+content_margin_top = 4.0
+content_margin_right = 4.0
+content_margin_bottom = 4.0
+bg_color = Color(1, 1, 1, 0.3)
+corner_detail = 5
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_2b3ki"]
+content_margin_left = 4.0
+content_margin_top = 4.0
+content_margin_right = 4.0
+content_margin_bottom = 4.0
+bg_color = Color(1, 1, 1, 0.3)
+corner_detail = 5
+
 [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_7hjjl"]
 content_margin_left = 4.0
 content_margin_top = 4.0
@@ -466,6 +561,15 @@ HSlider/icons/grabber_highlight = ExtResource("5_a7tdx")
 HSlider/styles/grabber_area = SubResource("StyleBoxFlat_2u8nx")
 HSlider/styles/grabber_area_highlight = SubResource("StyleBoxFlat_nxip8")
 HSlider/styles/slider = SubResource("StyleBoxFlat_qu8em")
+ItemList/styles/cursor = SubResource("StyleBoxFlat_4xa5k")
+ItemList/styles/cursor_unfocused = SubResource("StyleBoxFlat_fqy7u")
+ItemList/styles/focus = SubResource("StyleBoxFlat_1g5yx")
+ItemList/styles/hovered = SubResource("StyleBoxFlat_dkcgw")
+ItemList/styles/hovered_selected = SubResource("StyleBoxFlat_egqfp")
+ItemList/styles/hovered_selected_focus = SubResource("StyleBoxFlat_0nqb6")
+ItemList/styles/panel = SubResource("StyleBoxFlat_opadq")
+ItemList/styles/selected = SubResource("StyleBoxFlat_xnh8w")
+ItemList/styles/selected_focus = SubResource("StyleBoxFlat_2b3ki")
 LineEdit/styles/focus = SubResource("StyleBoxFlat_7hjjl")
 LineEdit/styles/normal = SubResource("StyleBoxFlat_wnmfn")
 PopupMenu/constants/item_end_padding = 20