Browse Source

branching nodes, proper output node, added extend processes

Jonathan Higgins 7 months ago
parent
commit
bf20d58aa0
51 changed files with 1292 additions and 768 deletions
  1. 1 1
      .godot/editor/audioplayer.tscn-editstate-5c5be15cd7cbde82fbc3248f6958ab76.cfg
  2. 1 1
      .godot/editor/audioplayer.tscn-folding-5c5be15cd7cbde82fbc3248f6958ab76.cfg
  3. 1 1
      .godot/editor/control.tscn-editstate-475cf43e2d21753002d8a2b4ccf5105f.cfg
  4. 1 1
      .godot/editor/control.tscn-folding-475cf43e2d21753002d8a2b4ccf5105f.cfg
  5. 5 6
      .godot/editor/create_recent.Node
  6. 1 1
      .godot/editor/distortions.tscn-editstate-d5effea7e031baba994357d39ba6e749.cfg
  7. 6 6
      .godot/editor/editor_layout.cfg
  8. 3 0
      .godot/editor/export-1dccdad18285d3f89ef82c97447f4a68-voice_preview_generator.scn-folding-95a76e328fd51ebbf58eb5c48780d04d.cfg
  9. 3 0
      .godot/editor/export-475cf43e2d21753002d8a2b4ccf5105f-control.scn-folding-59fef42c7b111a85721e3be4525c4a1c.cfg
  10. 3 0
      .godot/editor/export-523ba9f1be4474a87fc09942b9fbb098-menu.scn-folding-5d22c2a20dca2f8909581b3b3ecf0215.cfg
  11. 3 0
      .godot/editor/export-5c5be15cd7cbde82fbc3248f6958ab76-audioplayer.scn-folding-66f3858a71f6f8fd671cd316f4228bdc.cfg
  12. 3 0
      .godot/editor/export-63f5256798893c9e4458746e3356894b-AudioStreamPreview.scn-folding-382a35afb1996c0a605f473dc6f47a87.cfg
  13. 3 0
      .godot/editor/export-d18a50cdbd65798e64eea9469be45949-nodes.scn-folding-c8d7d319fe0e315b35195a12d52a9390.cfg
  14. 3 0
      .godot/editor/export-d535ab38e866eae88d73c3fd55232f95-valueslider.scn-folding-94d93661fbe6beabdb93d70f4a21de9e.cfg
  15. 3 0
      .godot/editor/export-d5effea7e031baba994357d39ba6e749-distortions.scn-folding-3781c2995cf2127ecdbc3e90d27c4c66.cfg
  16. 13 13
      .godot/editor/filesystem_cache10
  17. 2 2
      .godot/editor/filesystem_update4
  18. 3 0
      .godot/editor/graph_edit.gd-folding-688a4cfb57664e864fe49b893e154200.cfg
  19. 1 1
      .godot/editor/menu.tscn-editstate-523ba9f1be4474a87fc09942b9fbb098.cfg
  20. 1 1
      .godot/editor/menu.tscn-folding-523ba9f1be4474a87fc09942b9fbb098.cfg
  21. 2 2
      .godot/editor/nodes.tscn-editstate-d18a50cdbd65798e64eea9469be45949.cfg
  22. 0 0
      .godot/editor/nodes.tscn-folding-d18a50cdbd65798e64eea9469be45949.cfg
  23. 6 0
      .godot/editor/project_metadata.cfg
  24. 1 1
      .godot/editor/quick_open_dialog_cache.cfg
  25. 1 0
      .godot/editor/recent_dirs
  26. 15 47
      .godot/editor/script_editor_cache.cfg
  27. 1 1
      .godot/editor/valueslider.tscn-editstate-d535ab38e866eae88d73c3fd55232f95.cfg
  28. 9 0
      .godot/export_credentials.cfg
  29. BIN
      .godot/exported/133200997/export-1dccdad18285d3f89ef82c97447f4a68-voice_preview_generator.scn
  30. BIN
      .godot/exported/133200997/export-475cf43e2d21753002d8a2b4ccf5105f-control.scn
  31. BIN
      .godot/exported/133200997/export-523ba9f1be4474a87fc09942b9fbb098-menu.scn
  32. BIN
      .godot/exported/133200997/export-5c5be15cd7cbde82fbc3248f6958ab76-audioplayer.scn
  33. BIN
      .godot/exported/133200997/export-63f5256798893c9e4458746e3356894b-AudioStreamPreview.scn
  34. BIN
      .godot/exported/133200997/export-d18a50cdbd65798e64eea9469be45949-nodes.scn
  35. BIN
      .godot/exported/133200997/export-d535ab38e866eae88d73c3fd55232f95-valueslider.scn
  36. BIN
      .godot/exported/133200997/export-d5effea7e031baba994357d39ba6e749-distortions.scn
  37. 8 0
      .godot/exported/133200997/file_cache
  38. 0 10
      clip.gd
  39. 0 1
      clip.gd.uid
  40. 0 11
      clip_clip_2.gd
  41. 0 1
      clip_clip_2.gd.uid
  42. 0 364
      distortions.tscn
  43. 66 0
      export_presets.cfg
  44. 1 0
      project.godot
  45. 46 14
      scenes/Nodes/audioplayer.gd
  46. 13 2
      scenes/Nodes/audioplayer.tscn
  47. 682 44
      scenes/Nodes/nodes.tscn
  48. 327 200
      scenes/main/control.gd
  49. 49 32
      scenes/main/control.tscn
  50. 1 0
      scenes/main/graph_edit.gd
  51. 4 4
      scenes/menu/menu.tscn

+ 1 - 1
.godot/editor/audioplayer.tscn-editstate-5c5be15cd7cbde82fbc3248f6958ab76.cfg

@@ -192,4 +192,4 @@ Game={
 "hide_selection": false,
 "select_mode": 0
 }
-selected_nodes=Array[NodePath]([NodePath("/root/@EditorNode@21272/@Panel@14/@VBoxContainer@15/DockHSplitLeftL/DockHSplitLeftR/DockHSplitMain/@VBoxContainer@26/DockVSplitCenter/@VSplitContainer@54/@VBoxContainer@55/@EditorMainScreen@102/MainScreen/@CanvasItemEditor@11482/@VSplitContainer@11134/@HSplitContainer@11136/@HSplitContainer@11138/@Control@11139/@SubViewportContainer@11140/@SubViewport@11141/Control/Console")])
+selected_nodes=Array[NodePath]([])

+ 1 - 1
.godot/editor/audioplayer.tscn-folding-5c5be15cd7cbde82fbc3248f6958ab76.cfg

@@ -1,5 +1,5 @@
 [folding]
 
-node_unfolds=[NodePath("WavError"), PackedStringArray("Flags"), NodePath("WaveformPreview"), PackedStringArray("Layout", "Layout/Transform"), NodePath("Playhead"), PackedStringArray("Transform")]
+node_unfolds=[NodePath("."), PackedStringArray("metadata", "Layout"), NodePath("LoadButton"), PackedStringArray("metadata"), NodePath("PlayButton"), PackedStringArray("Layout", "Layout/Transform"), NodePath("WavError"), PackedStringArray("Flags"), NodePath("WaveformPreview"), PackedStringArray("Layout", "Layout/Transform"), NodePath("Playhead"), PackedStringArray("Transform")]
 resource_unfolds=[]
 nodes_folded=[NodePath("WavError")]

+ 1 - 1
.godot/editor/control.tscn-editstate-475cf43e2d21753002d8a2b4ccf5105f.cfg

@@ -192,4 +192,4 @@ Game={
 "hide_selection": false,
 "select_mode": 0
 }
-selected_nodes=Array[NodePath]([NodePath("/root/@EditorNode@21272/@Panel@14/@VBoxContainer@15/DockHSplitLeftL/DockHSplitLeftR/DockHSplitMain/@VBoxContainer@26/DockVSplitCenter/@VSplitContainer@54/@VBoxContainer@55/@EditorMainScreen@102/MainScreen/@CanvasItemEditor@11482/@VSplitContainer@11134/@HSplitContainer@11136/@HSplitContainer@11138/@Control@11139/@SubViewportContainer@11140/@SubViewport@11141/Control/Console")])
+selected_nodes=Array[NodePath]([])

+ 1 - 1
.godot/editor/control.tscn-folding-475cf43e2d21753002d8a2b4ccf5105f.cfg

@@ -1,5 +1,5 @@
 [folding]
 
-node_unfolds=[NodePath("."), PackedStringArray("Layout"), NodePath("Console"), PackedStringArray("Flags"), NodePath("Console/ConsoleOutput"), PackedStringArray("Layout", "Layout/Transform")]
+node_unfolds=[NodePath("."), PackedStringArray("Layout"), NodePath("GraphEdit"), PackedStringArray("Layout", "Layout/Transform"), NodePath("NoLocationPopup"), PackedStringArray("Flags"), NodePath("NoInputPopup"), PackedStringArray("Flags"), NodePath("Console"), PackedStringArray("Flags"), NodePath("Console/Panel"), PackedStringArray("Layout", "Layout/Transform"), NodePath("Console/ConsoleOutput"), PackedStringArray("Layout")]
 resource_unfolds=[]
 nodes_folded=[]

+ 5 - 6
.godot/editor/create_recent.Node

@@ -1,15 +1,14 @@
+Label
+CheckButton
+Button
+HBoxContainer
+Panel
 Window
 Popup
 RichTextLabel
-Label
-CheckButton
 FileDialog
 VBoxContainer
 ScrollContainer
-Panel
 Control
 GraphNode
 AnimationPlayer
-Line2D
-TextureRect
-Button

+ 1 - 1
.godot/editor/distortions.tscn-editstate-d5effea7e031baba994357d39ba6e749.cfg

@@ -192,4 +192,4 @@ Game={
 "hide_selection": false,
 "select_mode": 0
 }
-selected_nodes=Array[NodePath]([NodePath("/root/@EditorNode@21272/@Panel@14/@VBoxContainer@15/DockHSplitLeftL/DockHSplitLeftR/DockHSplitMain/@VBoxContainer@26/DockVSplitCenter/@VSplitContainer@54/@VBoxContainer@55/@EditorMainScreen@102/MainScreen/@CanvasItemEditor@11482/@VSplitContainer@11134/@HSplitContainer@11136/@HSplitContainer@11138/@Control@11139/@SubViewportContainer@11140/@SubViewport@11141/Control/Console")])
+selected_nodes=Array[NodePath]([NodePath("/root/@EditorNode@21272/@Panel@14/@VBoxContainer@15/DockHSplitLeftL/DockHSplitLeftR/DockHSplitMain/@VBoxContainer@26/DockVSplitCenter/@VSplitContainer@54/@VBoxContainer@55/@EditorMainScreen@102/MainScreen/@CanvasItemEditor@11482/@VSplitContainer@11134/@HSplitContainer@11136/@HSplitContainer@11138/@Control@11139/@SubViewportContainer@11140/@SubViewport@11141/Control/GraphEdit")])

+ 6 - 6
.godot/editor/editor_layout.cfg

@@ -9,7 +9,7 @@ dock_filesystem_v_split_offset=0
 dock_filesystem_display_mode=0
 dock_filesystem_file_sort=0
 dock_filesystem_file_list_display_mode=1
-dock_filesystem_selected_paths=PackedStringArray("res://Global.gd")
+dock_filesystem_selected_paths=PackedStringArray("res://README.md")
 dock_filesystem_uncollapsed_paths=PackedStringArray("Favorites", "res://", "res://scenes/", "res://scenes/Nodes/", "res://scenes/menu/", "res://scenes/main/", "res://addons/", "res://addons/audio_preview/")
 dock_node_current_tab=0
 dock_history_include_scene=true
@@ -28,11 +28,11 @@ dock_5="Inspector,Node,History"
 
 [EditorNode]
 
-open_scenes=PackedStringArray("res://scenes/main/control.tscn", "res://distortions.tscn", "res://scenes/Nodes/valueslider.tscn", "res://scenes/Nodes/nodes.tscn", "res://scenes/menu/menu.tscn", "res://scenes/Nodes/audioplayer.tscn")
-current_scene="res://scenes/main/control.tscn"
+open_scenes=PackedStringArray("res://scenes/main/control.tscn", "res://scenes/Nodes/valueslider.tscn", "res://scenes/Nodes/nodes.tscn", "res://scenes/menu/menu.tscn", "res://scenes/Nodes/audioplayer.tscn")
+current_scene="res://scenes/Nodes/nodes.tscn"
 center_split_offset=0
 selected_default_debugger_tab_idx=0
-selected_main_editor_idx=2
+selected_main_editor_idx=0
 selected_bottom_panel_item=0
 
 [EditorWindow]
@@ -43,8 +43,8 @@ position=Vector2i(1920, 23)
 
 [ScriptEditor]
 
-open_scripts=["res://scenes/Nodes/audioplayer.gd", "res://addons/audio_preview/AudioStreamPreview.gd", "res://clip.gd", "res://clip_clip_2.gd", "res://config_handler.gd", "res://scenes/main/control.gd", "res://scenes/Nodes/focus_accu_sliders.gd", "res://Global.gd", "res://scenes/main/graph_edit.gd", "res://scenes/Nodes/valueslider.gd", "res://addons/audio_preview/voice_preview_generator.gd", "res://scenes/Nodes/waveform_preview.gd"]
-selected_script="res://scenes/main/control.gd"
+open_scripts=["res://scenes/Nodes/audioplayer.gd", "res://addons/audio_preview/AudioStreamPreview.gd", "res://config_handler.gd", "res://scenes/main/control.gd", "res://scenes/Nodes/focus_accu_sliders.gd", "res://Global.gd", "res://scenes/main/graph_edit.gd", "res://scenes/Nodes/valueslider.gd", "res://addons/audio_preview/voice_preview_generator.gd", "res://scenes/Nodes/waveform_preview.gd"]
+selected_script="res://scenes/Nodes/valueslider.gd"
 open_help=[]
 script_split_offset=200
 list_split_offset=0

+ 3 - 0
.godot/editor/export-1dccdad18285d3f89ef82c97447f4a68-voice_preview_generator.scn-folding-95a76e328fd51ebbf58eb5c48780d04d.cfg

@@ -0,0 +1,3 @@
+[folding]
+
+sections_unfolded=PackedStringArray()

+ 3 - 0
.godot/editor/export-475cf43e2d21753002d8a2b4ccf5105f-control.scn-folding-59fef42c7b111a85721e3be4525c4a1c.cfg

@@ -0,0 +1,3 @@
+[folding]
+
+sections_unfolded=PackedStringArray()

+ 3 - 0
.godot/editor/export-523ba9f1be4474a87fc09942b9fbb098-menu.scn-folding-5d22c2a20dca2f8909581b3b3ecf0215.cfg

@@ -0,0 +1,3 @@
+[folding]
+
+sections_unfolded=PackedStringArray()

+ 3 - 0
.godot/editor/export-5c5be15cd7cbde82fbc3248f6958ab76-audioplayer.scn-folding-66f3858a71f6f8fd671cd316f4228bdc.cfg

@@ -0,0 +1,3 @@
+[folding]
+
+sections_unfolded=PackedStringArray()

+ 3 - 0
.godot/editor/export-63f5256798893c9e4458746e3356894b-AudioStreamPreview.scn-folding-382a35afb1996c0a605f473dc6f47a87.cfg

@@ -0,0 +1,3 @@
+[folding]
+
+sections_unfolded=PackedStringArray()

+ 3 - 0
.godot/editor/export-d18a50cdbd65798e64eea9469be45949-nodes.scn-folding-c8d7d319fe0e315b35195a12d52a9390.cfg

@@ -0,0 +1,3 @@
+[folding]
+
+sections_unfolded=PackedStringArray()

+ 3 - 0
.godot/editor/export-d535ab38e866eae88d73c3fd55232f95-valueslider.scn-folding-94d93661fbe6beabdb93d70f4a21de9e.cfg

@@ -0,0 +1,3 @@
+[folding]
+
+sections_unfolded=PackedStringArray()

+ 3 - 0
.godot/editor/export-d5effea7e031baba994357d39ba6e749-distortions.scn-folding-3781c2995cf2127ecdbc3e90d27c4c66.cfg

@@ -0,0 +1,3 @@
+[folding]
+
+sections_unfolded=PackedStringArray()

+ 13 - 13
.godot/editor/filesystem_cache10

@@ -1,10 +1,10 @@
 ea4bc82a6ad023ab7ee23ee620429895
-::res://::1746530482
+::res://::1746554113
 clip.gd::GDScript/GDScript::4898173242493829381::1746186486::0::1::::<>GraphNode<><>0<>0<><>::
 clip_clip_2.gd::GDScript/GDScript::5112891685983776275::1746492997::0::1::::<>GraphNode<><>0<>0<><>::
 config_handler.gd::GDScript/GDScript::9123848664534566230::1746479238::0::1::::<>Node<><>0<>0<><>::
-distortions.tscn::PackedScene::2043500277826221405::1746500256::0::1::::<><><>0<>0<><>::uid://ce3ytxnt3y8dj::::res://clip_clip_2.gd<>uid://dya5kxx132fgp::::res://scenes/Nodes/valueslider.tscn
-Global.gd::GDScript/GDScript::7717406573998402474::1746482136::0::1::::<>Node<><>0<>0<><>::
+distortions.tscn::PackedScene::2043500277826221405::1746549312::0::1::::<><><>0<>0<><>::uid://ce3ytxnt3y8dj::::res://clip_clip_2.gd<>uid://dya5kxx132fgp::::res://scenes/Nodes/valueslider.tscn
+Global.gd::GDScript::7717406573998402474::1746534642::0::1::::<>Node<><>0<>0<><>::
 icon.svg::CompressedTexture2D/CompressedTexture2D::5168976688331411336::1745928495::1745928503::1::::<><><>0<>0<>5d9c9b5d6e3d90bedad9d000ed97534c<>res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex::
 README.md::TextFile/TextFile::-1::1746495214::0::1::::<><><>0<>0<><>::
 ::res://addons/::1746462377
@@ -14,17 +14,17 @@ AudioStreamPreview.tscn::PackedScene/PackedScene::3762817095482496943::174645250
 voice_preview_generator.gd::GDScript/GDScript::6244997812245505292::1746444274::0::1::::<>Node<><>0<>1<><>::
 voice_preview_generator.tscn::PackedScene/PackedScene::6679166981814140597::1746444565::0::1::::<><><>0<>0<><>::uid://cu8eg4agw08xs::::res://addons/audio_preview/voice_preview_generator.gd
 ::res://scenes/::1746186301
-::res://scenes/main/::1746500256
-control.gd::GDScript/GDScript::2620037524409541442::1746498159::0::1::::<>Control<><>0<>0<><>::
-control.tscn::PackedScene::2566019287410494992::1746500256::0::1::::<><><>0<>0<><>::uid://bdlfvuljckmu1::::res://scenes/main/control.gd<>uid://l2yejnjysupr::::res://scenes/main/graph_edit.gd<>uid://b0wdj8v6o0wq0::::res://scenes/menu/menu.tscn
+::res://scenes/main/::1746550528
+control.gd::GDScript::2620037524409541442::1746550527::0::1::::<>Control<><>0<>0<><>::
+control.tscn::PackedScene::2566019287410494992::1746550527::0::1::::<><><>0<>0<><>::uid://bdlfvuljckmu1::::res://scenes/main/control.gd<>uid://l2yejnjysupr::::res://scenes/main/graph_edit.gd<>uid://b0wdj8v6o0wq0::::res://scenes/menu/menu.tscn
 graph_edit.gd::GDScript/GDScript::829280323614315599::1746182218::0::1::::<>GraphEdit<><>0<>0<><>::
-::res://scenes/menu/::1746500256
-menu.tscn::PackedScene::4186758075496332121::1746500256::0::1::::<><><>0<>0<><>::
-::res://scenes/Nodes/::1746500257
-audioplayer.gd::GDScript/GDScript::5570864814132306429::1746476799::0::1::::<>Control<><>0<>0<><>::
-audioplayer.tscn::PackedScene::6037166449976350293::1746500257::0::1::::<><><>0<>0<><>::uid://clmtlg8via3qn::::res://scenes/Nodes/audioplayer.gd
+::res://scenes/menu/::1746549312
+menu.tscn::PackedScene::4186758075496332121::1746549312::0::1::::<><><>0<>0<><>::
+::res://scenes/Nodes/::1746549313
+audioplayer.gd::GDScript::5570864814132306429::1746535839::0::1::::<>Control<><>0<>0<><>::
+audioplayer.tscn::PackedScene::6037166449976350293::1746549313::0::1::::<><><>0<>0<><>::uid://clmtlg8via3qn::::res://scenes/Nodes/audioplayer.gd
 focus_accu_sliders.gd::GDScript/GDScript::8821949764991756997::1746492997::0::1::::<>GraphNode<><>0<>0<><>::
-nodes.tscn::PackedScene::8614413456730569426::1746500256::0::1::::<><><>0<>0<><>::uid://ce3ytxnt3y8dj::::res://clip_clip_2.gd<>uid://csapiqka522fh::::res://scenes/Nodes/audioplayer.tscn<>uid://dya5kxx132fgp::::res://scenes/Nodes/valueslider.tscn<>uid://dxxohuvlw5e3n::::res://scenes/Nodes/focus_accu_sliders.gd
+nodes.tscn::PackedScene::8614413456730569426::1746549312::0::1::::<><><>0<>0<><>::uid://ce3ytxnt3y8dj::::res://clip_clip_2.gd<>uid://csapiqka522fh::::res://scenes/Nodes/audioplayer.tscn<>uid://dya5kxx132fgp::::res://scenes/Nodes/valueslider.tscn<>uid://dxxohuvlw5e3n::::res://scenes/Nodes/focus_accu_sliders.gd
 valueslider.gd::GDScript/GDScript::2557655848205010713::1746187131::0::1::::<>VBoxContainer<><>0<>0<><>::
-valueslider.tscn::PackedScene::8845634910901483783::1746500256::0::1::::<><><>0<>0<><>::uid://bco7hof3wqck4::::res://scenes/Nodes/valueslider.gd
+valueslider.tscn::PackedScene::8845634910901483783::1746549312::0::1::::<><><>0<>0<><>::uid://bco7hof3wqck4::::res://scenes/Nodes/valueslider.gd
 waveform_preview.gd::GDScript/GDScript::5688062150584079786::1746458041::0::1::::<>Control<><>0<>0<><>::

+ 2 - 2
.godot/editor/filesystem_update4

@@ -1,9 +1,9 @@
 res://scenes/main/control.tscn
+res://scenes/main/control.gd
 res://distortions.tscn
 res://scenes/Nodes/valueslider.tscn
 res://scenes/Nodes/nodes.tscn
 res://scenes/menu/menu.tscn
 res://scenes/Nodes/audioplayer.tscn
-res://scenes/main/control.gd
 res://scenes/Nodes/audioplayer.gd
-res://Global.gd
+res://scenes/main/graph_edit.gd

+ 3 - 0
.godot/editor/graph_edit.gd-folding-688a4cfb57664e864fe49b893e154200.cfg

@@ -0,0 +1,3 @@
+[folding]
+
+sections_unfolded=PackedStringArray()

+ 1 - 1
.godot/editor/menu.tscn-editstate-523ba9f1be4474a87fc09942b9fbb098.cfg

@@ -192,4 +192,4 @@ Game={
 "hide_selection": false,
 "select_mode": 0
 }
-selected_nodes=Array[NodePath]([NodePath("/root/@EditorNode@21272/@Panel@14/@VBoxContainer@15/DockHSplitLeftL/DockHSplitLeftR/DockHSplitMain/@VBoxContainer@26/DockVSplitCenter/@VSplitContainer@54/@VBoxContainer@55/@EditorMainScreen@102/MainScreen/@CanvasItemEditor@11482/@VSplitContainer@11134/@HSplitContainer@11136/@HSplitContainer@11138/@Control@11139/@SubViewportContainer@11140/@SubViewport@11141/Control/Console")])
+selected_nodes=Array[NodePath]([])

+ 1 - 1
.godot/editor/menu.tscn-folding-523ba9f1be4474a87fc09942b9fbb098.cfg

@@ -2,4 +2,4 @@
 
 node_unfolds=[NodePath("select_effect"), PackedStringArray("Layout", "Layout/Transform"), NodePath("select_effect/Time Domain"), PackedStringArray("Theme Overrides", "Theme Overrides/constants"), NodePath("select_effect/Time Domain/Distort"), PackedStringArray("Layout"), NodePath("select_effect/Time Domain/Distort/MarginContainer"), PackedStringArray("Theme Overrides", "Theme Overrides/constants"), NodePath("select_effect/Time Domain/Distort/MarginContainer/ScrollContainer"), PackedStringArray("Layout"), NodePath("select_effect/Time Domain/Distort/MarginContainer/ScrollContainer/VBoxContainer"), PackedStringArray("Layout"), NodePath("select_effect/Time Domain/Distort/MarginContainer/ScrollContainer/VBoxContainer/HSplitContainer"), PackedStringArray("Layout", "Layout/Container Sizing", "Drag Area", "Theme Overrides", "Theme Overrides/constants"), NodePath("select_effect/Time Domain/Distort/MarginContainer/ScrollContainer/VBoxContainer/HSplitContainer/distort_average"), PackedStringArray("button_group"), NodePath("select_effect/Time Domain/Distort/MarginContainer/ScrollContainer/VBoxContainer/MarginContainer"), PackedStringArray("Theme Overrides", "Theme Overrides/constants"), NodePath("select_effect/Frequency Domain/Convert/MarginContainer3/ScrollContainer"), PackedStringArray("Layout"), NodePath("select_effect/Frequency Domain/Convert/MarginContainer3/ScrollContainer/VBoxContainer/Label"), PackedStringArray("Layout")]
 resource_unfolds=[]
-nodes_folded=[NodePath("select_effect/Time Domain/Distort/MarginContainer/ScrollContainer/VBoxContainer/HSplitContainer"), NodePath("select_effect/Time Domain/Distort/MarginContainer/ScrollContainer/VBoxContainer/HSplitContainer2"), NodePath("select_effect/Time Domain/Distort/MarginContainer/ScrollContainer/VBoxContainer/HSplitContainer9"), NodePath("select_effect/Time Domain/Distort/MarginContainer/ScrollContainer/VBoxContainer/HSplitContainer3"), NodePath("select_effect/Time Domain/Distort/MarginContainer/ScrollContainer/VBoxContainer/HSplitContainer4"), NodePath("select_effect/Time Domain/Distort/MarginContainer/ScrollContainer/VBoxContainer/HSplitContainer5"), NodePath("select_effect/Time Domain/Distort/MarginContainer/ScrollContainer/VBoxContainer/HSplitContainer6"), NodePath("select_effect/Time Domain/Distort/MarginContainer/ScrollContainer/VBoxContainer/HSplitContainer7"), NodePath("select_effect/Time Domain/Distort/MarginContainer/ScrollContainer/VBoxContainer/HSplitContainer8"), NodePath("select_effect/Time Domain/Extend"), NodePath("select_effect/Time Domain/Extend/MarginContainer2"), NodePath("select_effect/Time Domain/Extend/MarginContainer2/ScrollContainer/VBoxContainer"), NodePath("select_effect/Time Domain/Extend/MarginContainer2/ScrollContainer/VBoxContainer/HSplitContainer"), NodePath("select_effect/Time Domain/Extend/MarginContainer2/ScrollContainer/VBoxContainer/HSplitContainer2"), NodePath("select_effect/Time Domain/Extend/MarginContainer2/ScrollContainer/VBoxContainer/HSplitContainer9"), NodePath("select_effect/Time Domain/Extend/MarginContainer2/ScrollContainer/VBoxContainer/HSplitContainer3"), NodePath("select_effect/Time Domain/Extend/MarginContainer2/ScrollContainer/VBoxContainer/HSplitContainer4"), NodePath("select_effect/Time Domain/Granulate"), NodePath("select_effect/Frequency Domain/Process/MarginContainer4/ScrollContainer/VBoxContainer/HSplitContainer8")]
+nodes_folded=[NodePath("select_effect/Time Domain/Distort"), NodePath("select_effect/Time Domain/Distort/MarginContainer/ScrollContainer/VBoxContainer/HSplitContainer"), NodePath("select_effect/Time Domain/Distort/MarginContainer/ScrollContainer/VBoxContainer/HSplitContainer2"), NodePath("select_effect/Time Domain/Distort/MarginContainer/ScrollContainer/VBoxContainer/HSplitContainer9"), NodePath("select_effect/Time Domain/Distort/MarginContainer/ScrollContainer/VBoxContainer/HSplitContainer3"), NodePath("select_effect/Time Domain/Distort/MarginContainer/ScrollContainer/VBoxContainer/HSplitContainer4"), NodePath("select_effect/Time Domain/Distort/MarginContainer/ScrollContainer/VBoxContainer/HSplitContainer5"), NodePath("select_effect/Time Domain/Distort/MarginContainer/ScrollContainer/VBoxContainer/HSplitContainer6"), NodePath("select_effect/Time Domain/Distort/MarginContainer/ScrollContainer/VBoxContainer/HSplitContainer7"), NodePath("select_effect/Time Domain/Distort/MarginContainer/ScrollContainer/VBoxContainer/HSplitContainer8"), NodePath("select_effect/Time Domain/Extend/MarginContainer2/ScrollContainer/VBoxContainer/HSplitContainer"), NodePath("select_effect/Time Domain/Granulate"), NodePath("select_effect/Frequency Domain/Process/MarginContainer4/ScrollContainer/VBoxContainer/HSplitContainer8")]

+ 2 - 2
.godot/editor/nodes.tscn-editstate-d18a50cdbd65798e64eea9469be45949.cfg

@@ -8,7 +8,7 @@ Anim={
 "grid_snap_active": false,
 "grid_step": Vector2(8, 8),
 "grid_visibility": 1,
-"ofs": Vector2(-157.163, 946.342),
+"ofs": Vector2(-235.833, 1192.36),
 "primary_grid_step": Vector2i(8, 8),
 "show_group_gizmos": true,
 "show_guides": true,
@@ -192,4 +192,4 @@ Game={
 "hide_selection": false,
 "select_mode": 0
 }
-selected_nodes=Array[NodePath]([NodePath("/root/@EditorNode@21272/@Panel@14/@VBoxContainer@15/DockHSplitLeftL/DockHSplitLeftR/DockHSplitMain/@VBoxContainer@26/DockVSplitCenter/@VSplitContainer@54/@VBoxContainer@55/@EditorMainScreen@102/MainScreen/@CanvasItemEditor@11482/@VSplitContainer@11134/@HSplitContainer@11136/@HSplitContainer@11138/@Control@11139/@SubViewportContainer@11140/@SubViewport@11141/Control/Console")])
+selected_nodes=Array[NodePath]([])

File diff suppressed because it is too large
+ 0 - 0
.godot/editor/nodes.tscn-folding-d18a50cdbd65798e64eea9469be45949.cfg


+ 6 - 0
.godot/editor/project_metadata.cfg

@@ -7,6 +7,7 @@ use_advanced_connections=false
 
 create_new_node=Rect2(510, 190, 900, 700)
 project_settings=Rect2(2409, 223, 1200, 700)
+export=Rect2(2386, 375, 900, 500)
 
 [recent_files]
 
@@ -29,3 +30,8 @@ recent_presets=PackedColorArray(0.184314, 0.309804, 0.305882, 1, 1, 1, 1, 0.5411
 [quick_open_dialog]
 
 last_mode=1
+
+[export_options]
+
+default_filename="SoundThread"
+export_debug=false

+ 1 - 1
.godot/editor/quick_open_dialog_cache.cfg

@@ -1,3 +1,3 @@
 [selected_history]
 
-PackedScene=PackedStringArray("uid://dya5kxx132fgp", "uid://csapiqka522fh", "uid://b0wdj8v6o0wq0")
+PackedScene=PackedStringArray("uid://csapiqka522fh", "uid://dya5kxx132fgp", "uid://b0wdj8v6o0wq0")

+ 1 - 0
.godot/editor/recent_dirs

@@ -1,2 +1,3 @@
+D:/Desktop/test_soundthread
 res://
 res://scenes/Nodes

+ 15 - 47
.godot/editor/script_editor_cache.cfg

@@ -1,31 +1,13 @@
-[res://clip.gd]
-
-state={
-"bookmarks": PackedInt32Array(),
-"breakpoints": PackedInt32Array(),
-"column": 0,
-"folded_lines": Array[int]([]),
-"h_scroll_position": 0,
-"row": 10,
-"scroll_position": 0.0,
-"selection": true,
-"selection_from_column": 0,
-"selection_from_line": 3,
-"selection_to_column": 0,
-"selection_to_line": 10,
-"syntax_highlighter": "GDScript"
-}
-
 [res://scenes/main/control.gd]
 
 state={
 "bookmarks": PackedInt32Array(),
 "breakpoints": PackedInt32Array(),
-"column": 0,
+"column": 22,
 "folded_lines": Array[int]([]),
 "h_scroll_position": 0,
-"row": 175,
-"scroll_position": 159.0,
+"row": 12,
+"scroll_position": 2.0,
 "selection": false,
 "syntax_highlighter": "GDScript"
 }
@@ -35,7 +17,7 @@ state={
 state={
 "bookmarks": PackedInt32Array(),
 "breakpoints": PackedInt32Array(),
-"column": 0,
+"column": 12,
 "folded_lines": Array[int]([]),
 "h_scroll_position": 0,
 "row": 6,
@@ -44,20 +26,6 @@ state={
 "syntax_highlighter": "GDScript"
 }
 
-[res://clip_clip_2.gd]
-
-state={
-"bookmarks": PackedInt32Array(),
-"breakpoints": PackedInt32Array(),
-"column": 0,
-"folded_lines": Array[int]([]),
-"h_scroll_position": 0,
-"row": 11,
-"scroll_position": 0.0,
-"selection": false,
-"syntax_highlighter": "GDScript"
-}
-
 [res://scenes/Nodes/valueslider.gd]
 
 state={
@@ -66,13 +34,9 @@ state={
 "column": 0,
 "folded_lines": Array[int]([]),
 "h_scroll_position": 0,
-"row": 11,
+"row": 5,
 "scroll_position": 0.0,
-"selection": true,
-"selection_from_column": 0,
-"selection_from_line": 0,
-"selection_to_column": 0,
-"selection_to_line": 11,
+"selection": false,
 "syntax_highlighter": "GDScript"
 }
 
@@ -81,11 +45,11 @@ state={
 state={
 "bookmarks": PackedInt32Array(),
 "breakpoints": PackedInt32Array(),
-"column": 20,
+"column": 26,
 "folded_lines": Array[int]([]),
 "h_scroll_position": 0,
-"row": 49,
-"scroll_position": 0.0,
+"row": 83,
+"scroll_position": 69.0,
 "selection": false,
 "syntax_highlighter": "GDScript"
 }
@@ -144,9 +108,13 @@ state={
 "column": 0,
 "folded_lines": Array[int]([]),
 "h_scroll_position": 0,
-"row": 5,
+"row": 2,
 "scroll_position": 0.0,
-"selection": false,
+"selection": true,
+"selection_from_column": 0,
+"selection_from_line": 2,
+"selection_to_column": 22,
+"selection_to_line": 2,
 "syntax_highlighter": "GDScript"
 }
 

+ 1 - 1
.godot/editor/valueslider.tscn-editstate-d535ab38e866eae88d73c3fd55232f95.cfg

@@ -192,4 +192,4 @@ Game={
 "hide_selection": false,
 "select_mode": 0
 }
-selected_nodes=Array[NodePath]([NodePath("/root/@EditorNode@21272/@Panel@14/@VBoxContainer@15/DockHSplitLeftL/DockHSplitLeftR/DockHSplitMain/@VBoxContainer@26/DockVSplitCenter/@VSplitContainer@54/@VBoxContainer@55/@EditorMainScreen@102/MainScreen/@CanvasItemEditor@11482/@VSplitContainer@11134/@HSplitContainer@11136/@HSplitContainer@11138/@Control@11139/@SubViewportContainer@11140/@SubViewport@11141/Control/Console")])
+selected_nodes=Array[NodePath]([])

+ 9 - 0
.godot/export_credentials.cfg

@@ -0,0 +1,9 @@
+[preset.0]
+
+script_encryption_key=""
+
+[preset.0.options]
+
+codesign/identity_type=0
+codesign/identity=""
+codesign/password=""

BIN
.godot/exported/133200997/export-1dccdad18285d3f89ef82c97447f4a68-voice_preview_generator.scn


BIN
.godot/exported/133200997/export-475cf43e2d21753002d8a2b4ccf5105f-control.scn


BIN
.godot/exported/133200997/export-523ba9f1be4474a87fc09942b9fbb098-menu.scn


BIN
.godot/exported/133200997/export-5c5be15cd7cbde82fbc3248f6958ab76-audioplayer.scn


BIN
.godot/exported/133200997/export-63f5256798893c9e4458746e3356894b-AudioStreamPreview.scn


BIN
.godot/exported/133200997/export-d18a50cdbd65798e64eea9469be45949-nodes.scn


BIN
.godot/exported/133200997/export-d535ab38e866eae88d73c3fd55232f95-valueslider.scn


BIN
.godot/exported/133200997/export-d5effea7e031baba994357d39ba6e749-distortions.scn


+ 8 - 0
.godot/exported/133200997/file_cache

@@ -0,0 +1,8 @@
+res://addons/audio_preview/AudioStreamPreview.tscn::d56e3d6d483ba1124db309b5be35470d::1746452502::res://.godot/exported/133200997/export-63f5256798893c9e4458746e3356894b-AudioStreamPreview.scn
+res://addons/audio_preview/voice_preview_generator.tscn::358c3855f5c47263e68747e908446c07::1746444565::res://.godot/exported/133200997/export-1dccdad18285d3f89ef82c97447f4a68-voice_preview_generator.scn
+res://scenes/main/control.tscn::5d1f1c381fb97c00b928234c2b6c42bc::1746583317::res://.godot/exported/133200997/export-475cf43e2d21753002d8a2b4ccf5105f-control.scn
+res://scenes/menu/menu.tscn::1f17d4bed13520e8023e9364ed9bca0a::1746583318::res://.godot/exported/133200997/export-523ba9f1be4474a87fc09942b9fbb098-menu.scn
+res://scenes/Nodes/audioplayer.tscn::24a65fc6b453958818bf56684f9fc098::1746583318::res://.godot/exported/133200997/export-5c5be15cd7cbde82fbc3248f6958ab76-audioplayer.scn
+res://scenes/Nodes/nodes.tscn::eafe912ca3a0d8a47afbeb2d7184c2f9::1746583318::res://.godot/exported/133200997/export-d18a50cdbd65798e64eea9469be45949-nodes.scn
+res://scenes/Nodes/valueslider.tscn::3f58bd6e74d27066dec919d29fa114c7::1746583317::res://.godot/exported/133200997/export-d535ab38e866eae88d73c3fd55232f95-valueslider.scn
+res://distortions.tscn::d6f9fa94a7756223917c1796274556e1::1746583317::res://.godot/exported/133200997/export-d5effea7e031baba994357d39ba6e749-distortions.scn

+ 0 - 10
clip.gd

@@ -1,10 +0,0 @@
-extends GraphNode
-
-
-# Called when the node enters the scene tree for the first time.
-func _ready() -> void:
-	$Label.text = "0.00" # initial value
-
-
-func _on_h_slider_2_value_changed(value: float) -> void:
-	$Label.text = str(value)

+ 0 - 1
clip.gd.uid

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

+ 0 - 11
clip_clip_2.gd

@@ -1,11 +0,0 @@
-extends GraphNode
-
-
-# Called when the node enters the scene tree for the first time.
-func _ready() -> void:
-	pass # Replace with function body.
-
-
-# Called every frame. 'delta' is the elapsed time since the previous frame.
-func _process(delta: float) -> void:
-	pass

+ 0 - 1
clip_clip_2.gd.uid

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

+ 0 - 364
distortions.tscn

@@ -1,364 +0,0 @@
-[gd_scene load_steps=4 format=3 uid="uid://4d5fettap7nl"]
-
-[ext_resource type="Script" uid="uid://ce3ytxnt3y8dj" path="res://clip_clip_2.gd" id="1_68an2"]
-[ext_resource type="PackedScene" uid="uid://dya5kxx132fgp" path="res://scenes/Nodes/valueslider.tscn" id="2_jl6jh"]
-
-[sub_resource type="GDScript" id="GDScript_wcwmc"]
-script/source = "extends Label
-
-
-# Called when the node enters the scene tree for the first time.
-func _ready() -> void:
-	pass # Replace with function body.
-
-
-# Called every frame. 'delta' is the elapsed time since the previous frame.
-func _process(delta: float) -> void:
-	pass
-"
-
-[node name="Control" type="Control"]
-layout_mode = 3
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-
-[node name="clip_clip_2" type="GraphNode" parent="."]
-layout_mode = 0
-offset_left = 21.0
-offset_top = 6.0
-offset_right = 295.0
-offset_bottom = 228.0
-title = "Clip"
-slot/0/left_enabled = true
-slot/0/left_type = 0
-slot/0/left_color = Color(1, 1, 1, 1)
-slot/0/left_icon = null
-slot/0/right_enabled = true
-slot/0/right_type = 0
-slot/0/right_color = Color(1, 1, 1, 1)
-slot/0/right_icon = null
-slot/0/draw_stylebox = true
-slot/1/left_enabled = false
-slot/1/left_type = 0
-slot/1/left_color = Color(1, 1, 1, 1)
-slot/1/left_icon = null
-slot/1/right_enabled = false
-slot/1/right_type = 0
-slot/1/right_color = Color(1, 1, 1, 1)
-slot/1/right_icon = null
-slot/1/draw_stylebox = true
-slot/2/left_enabled = false
-slot/2/left_type = 0
-slot/2/left_color = Color(1, 1, 1, 1)
-slot/2/left_icon = null
-slot/2/right_enabled = false
-slot/2/right_type = 0
-slot/2/right_color = Color(1, 1, 1, 1)
-slot/2/right_icon = null
-slot/2/draw_stylebox = true
-slot/3/left_enabled = false
-slot/3/left_type = 0
-slot/3/left_color = Color(1, 1, 1, 1)
-slot/3/left_icon = null
-slot/3/right_enabled = false
-slot/3/right_type = 0
-slot/3/right_color = Color(1, 1, 1, 1)
-slot/3/right_icon = null
-slot/3/draw_stylebox = true
-slot/4/left_enabled = false
-slot/4/left_type = 0
-slot/4/left_color = Color(1, 1, 1, 1)
-slot/4/left_icon = null
-slot/4/right_enabled = false
-slot/4/right_type = 0
-slot/4/right_color = Color(1, 1, 1, 1)
-slot/4/right_icon = null
-slot/4/draw_stylebox = true
-script = ExtResource("1_68an2")
-
-[node name="Level" type="Label" parent="clip_clip_2"]
-layout_mode = 2
-text = "Maximum"
-
-[node name="LevelSlider" type="HSlider" parent="clip_clip_2"]
-layout_mode = 2
-max_value = 1.0
-step = 0.01
-
-[node name="Label" type="Label" parent="clip_clip_2"]
-layout_mode = 2
-text = "0.00"
-horizontal_alignment = 2
-script = SubResource("GDScript_wcwmc")
-
-[node name="Control" type="Control" parent="clip_clip_2"]
-layout_mode = 2
-
-[node name="VBoxContainer" parent="clip_clip_2" instance=ExtResource("2_jl6jh")]
-layout_mode = 2
-
-[node name="Fractal" type="GraphNode" parent="."]
-layout_mode = 0
-offset_left = 26.0
-offset_top = 698.0
-offset_right = 300.0
-offset_bottom = 920.0
-title = "Fractal"
-slot/0/left_enabled = true
-slot/0/left_type = 0
-slot/0/left_color = Color(1, 1, 1, 1)
-slot/0/left_icon = null
-slot/0/right_enabled = true
-slot/0/right_type = 0
-slot/0/right_color = Color(1, 1, 1, 1)
-slot/0/right_icon = null
-slot/0/draw_stylebox = true
-slot/1/left_enabled = false
-slot/1/left_type = 0
-slot/1/left_color = Color(1, 1, 1, 1)
-slot/1/left_icon = null
-slot/1/right_enabled = false
-slot/1/right_type = 0
-slot/1/right_color = Color(1, 1, 1, 1)
-slot/1/right_icon = null
-slot/1/draw_stylebox = true
-slot/2/left_enabled = false
-slot/2/left_type = 0
-slot/2/left_color = Color(1, 1, 1, 1)
-slot/2/left_icon = null
-slot/2/right_enabled = false
-slot/2/right_type = 0
-slot/2/right_color = Color(1, 1, 1, 1)
-slot/2/right_icon = null
-slot/2/draw_stylebox = true
-slot/3/left_enabled = false
-slot/3/left_type = 0
-slot/3/left_color = Color(1, 1, 1, 1)
-slot/3/left_icon = null
-slot/3/right_enabled = false
-slot/3/right_type = 0
-slot/3/right_color = Color(1, 1, 1, 1)
-slot/3/right_icon = null
-slot/3/draw_stylebox = true
-slot/4/left_enabled = false
-slot/4/left_type = 0
-slot/4/left_color = Color(1, 1, 1, 1)
-slot/4/left_icon = null
-slot/4/right_enabled = false
-slot/4/right_type = 0
-slot/4/right_color = Color(1, 1, 1, 1)
-slot/4/right_icon = null
-slot/4/draw_stylebox = true
-slot/5/left_enabled = false
-slot/5/left_type = 0
-slot/5/left_color = Color(1, 1, 1, 1)
-slot/5/left_icon = null
-slot/5/right_enabled = false
-slot/5/right_type = 0
-slot/5/right_color = Color(1, 1, 1, 1)
-slot/5/right_icon = null
-slot/5/draw_stylebox = true
-slot/6/left_enabled = false
-slot/6/left_type = 0
-slot/6/left_color = Color(1, 1, 1, 1)
-slot/6/left_icon = null
-slot/6/right_enabled = false
-slot/6/right_type = 0
-slot/6/right_color = Color(1, 1, 1, 1)
-slot/6/right_icon = null
-slot/6/draw_stylebox = true
-
-[node name="Label" type="Label" parent="Fractal"]
-layout_mode = 2
-text = "Multiplier"
-
-[node name="HSlider" type="HSlider" parent="Fractal"]
-layout_mode = 2
-
-[node name="Label2" type="Label" parent="Fractal"]
-layout_mode = 2
-text = "Threshold"
-
-[node name="HSlider2" type="HSlider" parent="Fractal"]
-layout_mode = 2
-
-[node name="Label3" type="Label" parent="Fractal"]
-layout_mode = 2
-text = "Gain"
-
-[node name="HSlider3" type="HSlider" parent="Fractal"]
-layout_mode = 2
-
-[node name="Control" type="Control" parent="Fractal"]
-layout_mode = 2
-
-[node name="distort_average" type="GraphNode" parent="."]
-layout_mode = 0
-offset_left = 24.0
-offset_top = 469.0
-offset_right = 298.0
-offset_bottom = 691.0
-title = "Interpolate"
-slot/0/left_enabled = true
-slot/0/left_type = 0
-slot/0/left_color = Color(1, 1, 1, 1)
-slot/0/left_icon = null
-slot/0/right_enabled = true
-slot/0/right_type = 0
-slot/0/right_color = Color(1, 1, 1, 1)
-slot/0/right_icon = null
-slot/0/draw_stylebox = true
-slot/1/left_enabled = false
-slot/1/left_type = 0
-slot/1/left_color = Color(1, 1, 1, 1)
-slot/1/left_icon = null
-slot/1/right_enabled = false
-slot/1/right_type = 0
-slot/1/right_color = Color(1, 1, 1, 1)
-slot/1/right_icon = null
-slot/1/draw_stylebox = true
-slot/2/left_enabled = false
-slot/2/left_type = 0
-slot/2/left_color = Color(1, 1, 1, 1)
-slot/2/left_icon = null
-slot/2/right_enabled = false
-slot/2/right_type = 0
-slot/2/right_color = Color(1, 1, 1, 1)
-slot/2/right_icon = null
-slot/2/draw_stylebox = true
-slot/3/left_enabled = false
-slot/3/left_type = 0
-slot/3/left_color = Color(1, 1, 1, 1)
-slot/3/left_icon = null
-slot/3/right_enabled = false
-slot/3/right_type = 0
-slot/3/right_color = Color(1, 1, 1, 1)
-slot/3/right_icon = null
-slot/3/draw_stylebox = true
-slot/4/left_enabled = false
-slot/4/left_type = 0
-slot/4/left_color = Color(1, 1, 1, 1)
-slot/4/left_icon = null
-slot/4/right_enabled = false
-slot/4/right_type = 0
-slot/4/right_color = Color(1, 1, 1, 1)
-slot/4/right_icon = null
-slot/4/draw_stylebox = true
-slot/5/left_enabled = false
-slot/5/left_type = 0
-slot/5/left_color = Color(1, 1, 1, 1)
-slot/5/left_icon = null
-slot/5/right_enabled = false
-slot/5/right_type = 0
-slot/5/right_color = Color(1, 1, 1, 1)
-slot/5/right_icon = null
-slot/5/draw_stylebox = true
-slot/6/left_enabled = false
-slot/6/left_type = 0
-slot/6/left_color = Color(1, 1, 1, 1)
-slot/6/left_icon = null
-slot/6/right_enabled = false
-slot/6/right_type = 0
-slot/6/right_color = Color(1, 1, 1, 1)
-slot/6/right_icon = null
-slot/6/draw_stylebox = true
-
-[node name="Label" type="Label" parent="distort_average"]
-layout_mode = 2
-text = "Mulitplier"
-
-[node name="HSlider" type="HSlider" parent="distort_average"]
-layout_mode = 2
-
-[node name="Label2" type="Label" parent="distort_average"]
-layout_mode = 2
-text = "Maximum"
-
-[node name="HSlider2" type="HSlider" parent="distort_average"]
-layout_mode = 2
-
-[node name="Label3" type="Label" parent="distort_average"]
-layout_mode = 2
-text = "Minimum"
-
-[node name="HSlider3" type="HSlider" parent="distort_average"]
-layout_mode = 2
-
-[node name="Control" type="Control" parent="distort_average"]
-layout_mode = 2
-
-[node name="Repeat" type="GraphNode" parent="."]
-layout_mode = 0
-offset_left = 22.0
-offset_top = 235.0
-offset_right = 296.0
-offset_bottom = 457.0
-title = "Repeat"
-slot/0/left_enabled = true
-slot/0/left_type = 0
-slot/0/left_color = Color(1, 1, 1, 1)
-slot/0/left_icon = null
-slot/0/right_enabled = true
-slot/0/right_type = 0
-slot/0/right_color = Color(1, 1, 1, 1)
-slot/0/right_icon = null
-slot/0/draw_stylebox = true
-slot/1/left_enabled = false
-slot/1/left_type = 0
-slot/1/left_color = Color(1, 1, 1, 1)
-slot/1/left_icon = null
-slot/1/right_enabled = false
-slot/1/right_type = 0
-slot/1/right_color = Color(1, 1, 1, 1)
-slot/1/right_icon = null
-slot/1/draw_stylebox = true
-slot/2/left_enabled = false
-slot/2/left_type = 0
-slot/2/left_color = Color(1, 1, 1, 1)
-slot/2/left_icon = null
-slot/2/right_enabled = false
-slot/2/right_type = 0
-slot/2/right_color = Color(1, 1, 1, 1)
-slot/2/right_icon = null
-slot/2/draw_stylebox = true
-slot/3/left_enabled = false
-slot/3/left_type = 0
-slot/3/left_color = Color(1, 1, 1, 1)
-slot/3/left_icon = null
-slot/3/right_enabled = false
-slot/3/right_type = 0
-slot/3/right_color = Color(1, 1, 1, 1)
-slot/3/right_icon = null
-slot/3/draw_stylebox = true
-slot/4/left_enabled = false
-slot/4/left_type = 0
-slot/4/left_color = Color(1, 1, 1, 1)
-slot/4/left_icon = null
-slot/4/right_enabled = false
-slot/4/right_type = 0
-slot/4/right_color = Color(1, 1, 1, 1)
-slot/4/right_icon = null
-slot/4/draw_stylebox = true
-
-[node name="Label" type="Label" parent="Repeat"]
-layout_mode = 2
-text = "Cycle Count"
-
-[node name="CycleCount" type="HSlider" parent="Repeat"]
-layout_mode = 2
-
-[node name="Label2" type="Label" parent="Repeat"]
-layout_mode = 2
-text = "Gain"
-
-[node name="Gain" type="HSlider" parent="Repeat"]
-layout_mode = 2
-
-[node name="Label3" type="Label" parent="Repeat"]
-layout_mode = 2
-text = "Minimum"
-
-[connection signal="value_changed" from="clip_clip_2/LevelSlider" to="clip_clip_2" method="_on_h_slider_2_value_changed"]

+ 66 - 0
export_presets.cfg

@@ -0,0 +1,66 @@
+[preset.0]
+
+name="Windows Desktop"
+platform="Windows Desktop"
+runnable=true
+advanced_options=false
+dedicated_server=false
+custom_features=""
+export_filter="all_resources"
+include_filter=""
+exclude_filter=""
+export_path="../../../Desktop/test_soundthread/SoundThread.exe"
+patches=PackedStringArray()
+encryption_include_filters=""
+encryption_exclude_filters=""
+seed=0
+encrypt_pck=false
+encrypt_directory=false
+script_export_mode=2
+
+[preset.0.options]
+
+custom_template/debug=""
+custom_template/release=""
+debug/export_console_wrapper=0
+binary_format/embed_pck=true
+texture_format/s3tc_bptc=true
+texture_format/etc2_astc=false
+binary_format/architecture="x86_64"
+codesign/enable=false
+codesign/timestamp=true
+codesign/timestamp_server_url=""
+codesign/digest_algorithm=1
+codesign/description=""
+codesign/custom_options=PackedStringArray()
+application/modify_resources=true
+application/icon=""
+application/console_wrapper_icon=""
+application/icon_interpolation=4
+application/file_version=""
+application/product_version=""
+application/company_name=""
+application/product_name="SoundThread"
+application/file_description=""
+application/copyright=""
+application/trademarks=""
+application/export_angle=0
+application/export_d3d12=0
+application/d3d12_agility_sdk_multiarch=true
+ssh_remote_deploy/enabled=false
+ssh_remote_deploy/host="user@host_ip"
+ssh_remote_deploy/port="22"
+ssh_remote_deploy/extra_args_ssh=""
+ssh_remote_deploy/extra_args_scp=""
+ssh_remote_deploy/run_script="Expand-Archive -LiteralPath '{temp_dir}\\{archive_name}' -DestinationPath '{temp_dir}'
+$action = New-ScheduledTaskAction -Execute '{temp_dir}\\{exe_name}' -Argument '{cmd_args}'
+$trigger = New-ScheduledTaskTrigger -Once -At 00:00
+$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries
+$task = New-ScheduledTask -Action $action -Trigger $trigger -Settings $settings
+Register-ScheduledTask godot_remote_debug -InputObject $task -Force:$true
+Start-ScheduledTask -TaskName godot_remote_debug
+while (Get-ScheduledTask -TaskName godot_remote_debug | ? State -eq running) { Start-Sleep -Milliseconds 100 }
+Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue"
+ssh_remote_deploy/cleanup_script="Stop-ScheduledTask -TaskName godot_remote_debug -ErrorAction:SilentlyContinue
+Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue
+Remove-Item -Recurse -Force '{temp_dir}'"

+ 1 - 0
project.godot

@@ -24,6 +24,7 @@ ConfigHandler="*res://config_handler.gd"
 
 [display]
 
+window/size/mode=2
 window/subwindows/embed_subwindows=false
 window/stretch/mode="canvas_items"
 window/stretch/aspect="expand"

+ 46 - 14
scenes/Nodes/audioplayer.gd

@@ -3,6 +3,8 @@ extends Control
 @onready var audio_player = $AudioStreamPlayer
 @onready var file_dialog = $FileDialog
 @onready var waveform_display = $WaveformPreview
+var outfile_path = "not_loaded"
+signal recycle_outfile_trigger
 
 #Used for waveform preview
 var voice_preview_generator : Node = null
@@ -10,12 +12,19 @@ var stream : AudioStreamWAV = null
 
 func _ready():
 	#Setup file dialogue to access system files and only accept wav files
-	get_window().files_dropped.connect(_on_files_dropped)
+	#get_window().files_dropped.connect(_on_files_dropped)
 	file_dialog.access = FileDialog.ACCESS_FILESYSTEM
 	file_dialog.file_mode = FileDialog.FILE_MODE_OPEN_FILE
 	file_dialog.filters = ["*.wav ; WAV audio files"]
 	file_dialog.connect("file_selected", Callable(self, "_on_file_selected"))
 	
+	if get_meta("loadenable") == true:
+		$RecycleButton.hide()
+		$LoadButton.show()
+	else:
+		$LoadButton.hide()
+		$RecycleButton.show()
+	
 	$WavError.hide()
 	
 	# Load the voice preview generator for waveform visualization
@@ -23,18 +32,18 @@ func _ready():
 	add_child(voice_preview_generator)
 	voice_preview_generator.texture_ready.connect(_on_texture_ready)
 
-func _on_files_dropped(files):
-	if files[0].get_extension() == "wav" or files[0].get_extension() == "WAV":
-		audio_player.stream = AudioStreamWAV.load_from_file(files[0])
-		if audio_player.stream.stereo == true: #checks if stream is stereo, not sure what this will do with a surround sound file
-			audio_player.stream = null #empties audio stream so stereo audio cant be played back
-			$WavError.show()
-		else:
-			voice_preview_generator.generate_preview(audio_player.stream) #this generates the waveform graphic
-			Global.infile = files[0] #this sets the global infile variable to the audio file path
-			print(Global.infile)
-	else:
-		$WavError.show()
+#func _on_files_dropped(files):
+	#if files[0].get_extension() == "wav" or files[0].get_extension() == "WAV":
+		#audio_player.stream = AudioStreamWAV.load_from_file(files[0])
+		#if audio_player.stream.stereo == true: #checks if stream is stereo, not sure what this will do with a surround sound file
+			#audio_player.stream = null #empties audio stream so stereo audio cant be played back
+			#$WavError.show()
+		#else:
+			#voice_preview_generator.generate_preview(audio_player.stream) #this generates the waveform graphic
+			#Global.infile = files[0] #this sets the global infile variable to the audio file path
+			#print(Global.infile)
+	#else:
+		#$WavError.show()
 
 func _on_close_button_button_down() -> void:
 	$WavError.hide()
@@ -50,11 +59,29 @@ func _on_file_selected(path: String):
 		##$WavError.show()
 	voice_preview_generator.generate_preview(audio_player.stream)
 	Global.infile = path
-	print(Global.infile)
+	print("Infile set: " + Global.infile)
+	
+func play_outfile(path: String):
+	outfile_path = path
+	audio_player.stream = AudioStreamWAV.load_from_file(path)
+	voice_preview_generator.generate_preview(audio_player.stream)
+
+	
+func recycle_outfile(path: String):
+	audio_player.stream = AudioStreamWAV.load_from_file(path)
+	Global.infile_stereo = audio_player.stream.stereo
+	#if audio_player.stream.stereo == true:
+		##audio_player.stream = null
+		##$WavError.show()
+	voice_preview_generator.generate_preview(audio_player.stream)
+	Global.infile = path
+	print("Infile set: " + Global.infile)
+
 
 func _on_play_button_button_down() -> void:
 	if audio_player.stream:
 		audio_player.play()
+		$Playhead.position.x = 0
 	
 func _on_stop_button_button_down() -> void:
 	if audio_player.playing:
@@ -77,3 +104,8 @@ func _process(delta: float) -> void:
 			$Playhead.position.x = 0
 		
 		
+
+func _on_recycle_button_button_down() -> void:
+	if outfile_path != "not_loaded":
+		recycle_outfile_trigger.emit(outfile_path)
+	

+ 13 - 2
scenes/Nodes/audioplayer.tscn

@@ -12,6 +12,7 @@ offset_bottom = -496.0
 grow_horizontal = 2
 grow_vertical = 2
 script = ExtResource("1_yprak")
+metadata/loadenable = false
 
 [node name="Panel" type="Panel" parent="."]
 layout_mode = 0
@@ -19,6 +20,7 @@ offset_right = 400.0
 offset_bottom = 96.0
 
 [node name="Label" type="Label" parent="."]
+visible = false
 layout_mode = 0
 offset_left = 8.0
 offset_top = 5.0
@@ -27,6 +29,7 @@ offset_bottom = 28.0
 text = "Drop files here or load below"
 
 [node name="FileDialog" type="FileDialog" parent="."]
+title = "Select input file"
 use_native_dialog = true
 
 [node name="LoadButton" type="Button" parent="."]
@@ -36,6 +39,13 @@ offset_right = 128.0
 offset_bottom = 147.0
 text = "Load File"
 
+[node name="RecycleButton" type="Button" parent="."]
+layout_mode = 0
+offset_top = 104.0
+offset_right = 128.0
+offset_bottom = 147.0
+text = "Recycle File"
+
 [node name="PlayButton" type="Button" parent="."]
 layout_mode = 0
 offset_left = 136.0
@@ -58,7 +68,7 @@ text = "Stop"
 title = "Wrong File Type"
 initial_position = 2
 size = Vector2i(350, 100)
-transient = true
+visible = false
 exclusive = true
 unresizable = true
 borderless = true
@@ -69,7 +79,7 @@ popup_window = true
 offset_right = 349.0
 offset_bottom = 58.0
 text = "Wrong file type
-Only mono WAV files are supported"
+Only WAV files are supported"
 horizontal_alignment = 1
 vertical_alignment = 1
 autowrap_mode = 2
@@ -93,6 +103,7 @@ width = 2.0
 default_color = Color(1, 1, 1, 0.541176)
 
 [connection signal="button_down" from="LoadButton" to="." method="_on_load_button_button_down"]
+[connection signal="button_down" from="RecycleButton" to="." method="_on_recycle_button_button_down"]
 [connection signal="button_down" from="PlayButton" to="." method="_on_play_button_button_down"]
 [connection signal="button_down" from="StopButton" to="." method="_on_stop_button_button_down"]
 [connection signal="button_down" from="WavError/CloseButton" to="." method="_on_close_button_button_down"]

+ 682 - 44
scenes/Nodes/nodes.tscn

@@ -1,6 +1,5 @@
-[gd_scene load_steps=5 format=3 uid="uid://duy5epq25pj8u"]
+[gd_scene load_steps=4 format=3 uid="uid://duy5epq25pj8u"]
 
-[ext_resource type="Script" uid="uid://ce3ytxnt3y8dj" path="res://clip_clip_2.gd" id="1_evio6"]
 [ext_resource type="PackedScene" uid="uid://csapiqka522fh" path="res://scenes/Nodes/audioplayer.tscn" id="2_b6nw4"]
 [ext_resource type="PackedScene" uid="uid://dya5kxx132fgp" path="res://scenes/Nodes/valueslider.tscn" id="3_b6nw4"]
 [ext_resource type="Script" uid="uid://dxxohuvlw5e3n" path="res://scenes/Nodes/focus_accu_sliders.gd" id="4_uv17x"]
@@ -38,12 +37,86 @@ slot/1/right_type = 0
 slot/1/right_color = Color(1, 1, 1, 1)
 slot/1/right_icon = null
 slot/1/draw_stylebox = true
-script = ExtResource("1_evio6")
 
 [node name="Control" type="Control" parent="inputfile"]
 layout_mode = 2
 
-[node name="Control2" parent="inputfile" instance=ExtResource("2_b6nw4")]
+[node name="AudioPlayer" parent="inputfile" instance=ExtResource("2_b6nw4")]
+layout_mode = 2
+metadata/loadenable = true
+
+[node name="outputfile" type="GraphNode" parent="."]
+layout_mode = 0
+offset_left = 523.0
+offset_top = 6.0
+offset_right = 959.0
+offset_bottom = 336.0
+title = "Output File"
+slot/0/left_enabled = true
+slot/0/left_type = 0
+slot/0/left_color = Color(1, 1, 1, 1)
+slot/0/left_icon = null
+slot/0/right_enabled = false
+slot/0/right_type = 0
+slot/0/right_color = Color(1, 1, 1, 1)
+slot/0/right_icon = null
+slot/0/draw_stylebox = true
+slot/1/left_enabled = false
+slot/1/left_type = 0
+slot/1/left_color = Color(1, 1, 1, 1)
+slot/1/left_icon = null
+slot/1/right_enabled = false
+slot/1/right_type = 0
+slot/1/right_color = Color(1, 1, 1, 1)
+slot/1/right_icon = null
+slot/1/draw_stylebox = true
+slot/2/left_enabled = false
+slot/2/left_type = 0
+slot/2/left_color = Color(1, 1, 1, 1)
+slot/2/left_icon = null
+slot/2/right_enabled = false
+slot/2/right_type = 0
+slot/2/right_color = Color(1, 1, 1, 1)
+slot/2/right_icon = null
+slot/2/draw_stylebox = true
+slot/3/left_enabled = false
+slot/3/left_type = 0
+slot/3/left_color = Color(1, 1, 1, 1)
+slot/3/left_icon = null
+slot/3/right_enabled = false
+slot/3/right_type = 0
+slot/3/right_color = Color(1, 1, 1, 1)
+slot/3/right_icon = null
+slot/3/draw_stylebox = true
+slot/4/left_enabled = false
+slot/4/left_type = 0
+slot/4/left_color = Color(1, 1, 1, 1)
+slot/4/left_icon = null
+slot/4/right_enabled = false
+slot/4/right_type = 0
+slot/4/right_color = Color(1, 1, 1, 1)
+slot/4/right_icon = null
+slot/4/draw_stylebox = true
+
+[node name="Control" type="Control" parent="outputfile"]
+layout_mode = 2
+
+[node name="RunProcess" type="Button" parent="outputfile"]
+custom_minimum_size = Vector2(0, 43)
+layout_mode = 2
+text = "Run Process"
+
+[node name="DeleteIntermediateFilesToggle" type="CheckButton" parent="outputfile"]
+custom_minimum_size = Vector2(0, 43)
+layout_mode = 2
+text = "Delete Intermediate files"
+expand_icon = true
+
+[node name="Label" type="Label" parent="outputfile"]
+layout_mode = 2
+text = "Rendered Output File:"
+
+[node name="AudioPlayer" parent="outputfile" instance=ExtResource("2_b6nw4")]
 layout_mode = 2
 
 [node name="distort_average" type="GraphNode" parent="."]
@@ -471,12 +544,557 @@ min_value = 2.0
 max_value = 64.0
 value = 2.0
 
+[node name="extend_drunk_1" type="GraphNode" parent="."]
+layout_mode = 0
+offset_left = 469.0
+offset_top = 412.0
+offset_right = 775.0
+offset_bottom = 532.0
+tooltip_text = "Splice segments of source file end-to-end; the start times of the segments in the source file are chosen by a 'drunken-walk'"
+title = "Extend: Drunk"
+slot/0/left_enabled = true
+slot/0/left_type = 0
+slot/0/left_color = Color(1, 1, 1, 1)
+slot/0/left_icon = null
+slot/0/right_enabled = true
+slot/0/right_type = 0
+slot/0/right_color = Color(1, 1, 1, 1)
+slot/0/right_icon = null
+slot/0/draw_stylebox = true
+slot/1/left_enabled = false
+slot/1/left_type = 0
+slot/1/left_color = Color(1, 1, 1, 1)
+slot/1/left_icon = null
+slot/1/right_enabled = false
+slot/1/right_type = 0
+slot/1/right_color = Color(1, 1, 1, 1)
+slot/1/right_icon = null
+slot/1/draw_stylebox = true
+slot/2/left_enabled = false
+slot/2/left_type = 0
+slot/2/left_color = Color(1, 1, 1, 1)
+slot/2/left_icon = null
+slot/2/right_enabled = false
+slot/2/right_type = 0
+slot/2/right_color = Color(1, 1, 1, 1)
+slot/2/right_icon = null
+slot/2/draw_stylebox = true
+slot/3/left_enabled = false
+slot/3/left_type = 0
+slot/3/left_color = Color(1, 1, 1, 1)
+slot/3/left_icon = null
+slot/3/right_enabled = false
+slot/3/right_type = 0
+slot/3/right_color = Color(1, 1, 1, 1)
+slot/3/right_icon = null
+slot/3/draw_stylebox = true
+slot/4/left_enabled = false
+slot/4/left_type = 0
+slot/4/left_color = Color(1, 1, 1, 1)
+slot/4/left_icon = null
+slot/4/right_enabled = false
+slot/4/right_type = 0
+slot/4/right_color = Color(1, 1, 1, 1)
+slot/4/right_icon = null
+slot/4/draw_stylebox = true
+slot/5/left_enabled = false
+slot/5/left_type = 0
+slot/5/left_color = Color(1, 1, 1, 1)
+slot/5/left_icon = null
+slot/5/right_enabled = false
+slot/5/right_type = 0
+slot/5/right_color = Color(1, 1, 1, 1)
+slot/5/right_icon = null
+slot/5/draw_stylebox = true
+metadata/command = "extend_drunk_1"
+
+[node name="Control" type="Control" parent="extend_drunk_1"]
+layout_mode = 2
+
+[node name="VBoxContainer" parent="extend_drunk_1" instance=ExtResource("3_b6nw4")]
+layout_mode = 2
+tooltip_text = "Total minimum duration of output soundfile (seconds)"
+
+[node name="Label" parent="extend_drunk_1/VBoxContainer" index="0"]
+text = "Minimum Output Duration (s)"
+
+[node name="HSlider" parent="extend_drunk_1/VBoxContainer/HSplitContainer" index="0"]
+min_value = 1.0
+max_value = 1000.0
+value = 30.0
+exp_edit = true
+
+[node name="VBoxContainer2" parent="extend_drunk_1" instance=ExtResource("3_b6nw4")]
+layout_mode = 2
+tooltip_text = "Time in infile at which the drunken walk occurs"
+
+[node name="Label" parent="extend_drunk_1/VBoxContainer2" index="0"]
+text = "Location"
+
+[node name="HSlider" parent="extend_drunk_1/VBoxContainer2/HSplitContainer" index="0"]
+max_value = 6.0
+step = 0.01
+value = 0.0
+
+[node name="VBoxContainer3" parent="extend_drunk_1" instance=ExtResource("3_b6nw4")]
+layout_mode = 2
+tooltip_text = "Half-width of the region from within which the sound segments are read"
+
+[node name="Label" parent="extend_drunk_1/VBoxContainer3" index="0"]
+text = "Ambitus"
+
+[node name="HSlider" parent="extend_drunk_1/VBoxContainer3/HSplitContainer" index="0"]
+max_value = 6.0
+step = 0.01
+value = 1.0
+
+[node name="VBoxContainer4" parent="extend_drunk_1" instance=ExtResource("3_b6nw4")]
+layout_mode = 2
+tooltip_text = "Maximum length of (random) step between segment reads"
+
+[node name="Label" parent="extend_drunk_1/VBoxContainer4" index="0"]
+text = "Maximum Step"
+
+[node name="HSlider" parent="extend_drunk_1/VBoxContainer4/HSplitContainer" index="0"]
+max_value = 6.0
+step = 0.01
+value = 0.02
+
+[node name="VBoxContainer5" parent="extend_drunk_1" instance=ExtResource("3_b6nw4")]
+layout_mode = 2
+tooltip_text = "Time between segment reads"
+
+[node name="Label" parent="extend_drunk_1/VBoxContainer5" index="0"]
+text = "Clock"
+
+[node name="HSlider" parent="extend_drunk_1/VBoxContainer5/HSplitContainer" index="0"]
+min_value = 0.05
+max_value = 6.0
+step = 0.1
+value = 0.05
+
+[node name="extend_loop_1" type="GraphNode" parent="."]
+layout_mode = 0
+offset_left = 471.0
+offset_top = 758.0
+offset_right = 777.0
+offset_bottom = 972.0
+tooltip_text = "Loop (repeat [advancing] segments) inside soundfile"
+title = "Extend: Loop"
+slot/0/left_enabled = true
+slot/0/left_type = 0
+slot/0/left_color = Color(1, 1, 1, 1)
+slot/0/left_icon = null
+slot/0/right_enabled = true
+slot/0/right_type = 0
+slot/0/right_color = Color(1, 1, 1, 1)
+slot/0/right_icon = null
+slot/0/draw_stylebox = true
+slot/1/left_enabled = false
+slot/1/left_type = 0
+slot/1/left_color = Color(1, 1, 1, 1)
+slot/1/left_icon = null
+slot/1/right_enabled = false
+slot/1/right_type = 0
+slot/1/right_color = Color(1, 1, 1, 1)
+slot/1/right_icon = null
+slot/1/draw_stylebox = true
+slot/2/left_enabled = false
+slot/2/left_type = 0
+slot/2/left_color = Color(1, 1, 1, 1)
+slot/2/left_icon = null
+slot/2/right_enabled = false
+slot/2/right_type = 0
+slot/2/right_color = Color(1, 1, 1, 1)
+slot/2/right_icon = null
+slot/2/draw_stylebox = true
+slot/3/left_enabled = false
+slot/3/left_type = 0
+slot/3/left_color = Color(1, 1, 1, 1)
+slot/3/left_icon = null
+slot/3/right_enabled = false
+slot/3/right_type = 0
+slot/3/right_color = Color(1, 1, 1, 1)
+slot/3/right_icon = null
+slot/3/draw_stylebox = true
+metadata/command = "extend_loop_1"
+
+[node name="Control" type="Control" parent="extend_loop_1"]
+layout_mode = 2
+
+[node name="VBoxContainer" parent="extend_loop_1" instance=ExtResource("3_b6nw4")]
+layout_mode = 2
+tooltip_text = "Start time (in seconds) in file for looping to begin"
+
+[node name="Label" parent="extend_loop_1/VBoxContainer" index="0"]
+text = "Start"
+
+[node name="HSlider" parent="extend_loop_1/VBoxContainer/HSplitContainer" index="0"]
+max_value = 30.0
+step = 0.01
+value = 0.0
+
+[node name="VBoxContainer2" parent="extend_loop_1" instance=ExtResource("3_b6nw4")]
+layout_mode = 2
+tooltip_text = "Length of looped segment (in milliseconds)"
+
+[node name="Label" parent="extend_loop_1/VBoxContainer2" index="0"]
+text = "Loop Length"
+
+[node name="HSlider" parent="extend_loop_1/VBoxContainer2/HSplitContainer" index="0"]
+min_value = 1.0
+max_value = 30000.0
+value = 200.0
+exp_edit = true
+
+[node name="VBoxContainer3" parent="extend_loop_1" instance=ExtResource("3_b6nw4")]
+layout_mode = 2
+tooltip_text = "Advance in infile from the start of one loop to the next (in milliseconds)"
+
+[node name="Label" parent="extend_loop_1/VBoxContainer3" index="0"]
+text = "Step"
+
+[node name="HSlider" parent="extend_loop_1/VBoxContainer3/HSplitContainer" index="0"]
+min_value = 1.0
+max_value = 6000.0
+value = 100.0
+
+[node name="extend_scramble_1" type="GraphNode" parent="."]
+layout_mode = 0
+offset_left = 473.0
+offset_top = 998.0
+offset_right = 779.0
+offset_bottom = 1212.0
+tooltip_text = "Scramble soundfile and write to any given length"
+title = "Extend: Scramble"
+slot/0/left_enabled = true
+slot/0/left_type = 0
+slot/0/left_color = Color(1, 1, 1, 1)
+slot/0/left_icon = null
+slot/0/right_enabled = true
+slot/0/right_type = 0
+slot/0/right_color = Color(1, 1, 1, 1)
+slot/0/right_icon = null
+slot/0/draw_stylebox = true
+slot/1/left_enabled = false
+slot/1/left_type = 0
+slot/1/left_color = Color(1, 1, 1, 1)
+slot/1/left_icon = null
+slot/1/right_enabled = false
+slot/1/right_type = 0
+slot/1/right_color = Color(1, 1, 1, 1)
+slot/1/right_icon = null
+slot/1/draw_stylebox = true
+slot/2/left_enabled = false
+slot/2/left_type = 0
+slot/2/left_color = Color(1, 1, 1, 1)
+slot/2/left_icon = null
+slot/2/right_enabled = false
+slot/2/right_type = 0
+slot/2/right_color = Color(1, 1, 1, 1)
+slot/2/right_icon = null
+slot/2/draw_stylebox = true
+slot/3/left_enabled = false
+slot/3/left_type = 0
+slot/3/left_color = Color(1, 1, 1, 1)
+slot/3/left_icon = null
+slot/3/right_enabled = false
+slot/3/right_type = 0
+slot/3/right_color = Color(1, 1, 1, 1)
+slot/3/right_icon = null
+slot/3/draw_stylebox = true
+metadata/command = "extend_scramble_1"
+
+[node name="Control" type="Control" parent="extend_scramble_1"]
+layout_mode = 2
+
+[node name="VBoxContainer" parent="extend_scramble_1" instance=ExtResource("3_b6nw4")]
+layout_mode = 2
+tooltip_text = "Minimum chunksize to cut"
+
+[node name="Label" parent="extend_scramble_1/VBoxContainer" index="0"]
+text = "Minimum Chunk Length"
+
+[node name="HSlider" parent="extend_scramble_1/VBoxContainer/HSplitContainer" index="0"]
+min_value = 0.05
+max_value = 30.0
+step = 0.01
+value = 0.05
+
+[node name="VBoxContainer2" parent="extend_scramble_1" instance=ExtResource("3_b6nw4")]
+layout_mode = 2
+tooltip_text = "Maximum chunksize to cut must be greater than minimum"
+
+[node name="Label" parent="extend_scramble_1/VBoxContainer2" index="0"]
+text = "Maximum Chunk Length"
+
+[node name="HSlider" parent="extend_scramble_1/VBoxContainer2/HSplitContainer" index="0"]
+min_value = 0.06
+max_value = 30.0
+step = 0.01
+value = 1.5
+exp_edit = true
+
+[node name="VBoxContainer3" parent="extend_scramble_1" instance=ExtResource("3_b6nw4")]
+layout_mode = 2
+tooltip_text = "Duration of outfile required must be greater than minimum chunk size"
+
+[node name="Label" parent="extend_scramble_1/VBoxContainer3" index="0"]
+text = "Output Duration"
+
+[node name="HSlider" parent="extend_scramble_1/VBoxContainer3/HSplitContainer" index="0"]
+min_value = 1.0
+max_value = 1000.0
+value = 60.0
+exp_edit = true
+
+[node name="shrink_shrink_1" type="GraphNode" parent="."]
+layout_mode = 0
+offset_left = 475.0
+offset_top = 1236.0
+offset_right = 781.0
+offset_bottom = 1551.0
+tooltip_text = "Repeat a sound, shortening it on each repetition"
+title = "Extend: Shrink"
+slot/0/left_enabled = true
+slot/0/left_type = 0
+slot/0/left_color = Color(1, 1, 1, 1)
+slot/0/left_icon = null
+slot/0/right_enabled = true
+slot/0/right_type = 0
+slot/0/right_color = Color(1, 1, 1, 1)
+slot/0/right_icon = null
+slot/0/draw_stylebox = true
+slot/1/left_enabled = false
+slot/1/left_type = 0
+slot/1/left_color = Color(1, 1, 1, 1)
+slot/1/left_icon = null
+slot/1/right_enabled = false
+slot/1/right_type = 0
+slot/1/right_color = Color(1, 1, 1, 1)
+slot/1/right_icon = null
+slot/1/draw_stylebox = true
+slot/2/left_enabled = false
+slot/2/left_type = 0
+slot/2/left_color = Color(1, 1, 1, 1)
+slot/2/left_icon = null
+slot/2/right_enabled = false
+slot/2/right_type = 0
+slot/2/right_color = Color(1, 1, 1, 1)
+slot/2/right_icon = null
+slot/2/draw_stylebox = true
+slot/3/left_enabled = false
+slot/3/left_type = 0
+slot/3/left_color = Color(1, 1, 1, 1)
+slot/3/left_icon = null
+slot/3/right_enabled = false
+slot/3/right_type = 0
+slot/3/right_color = Color(1, 1, 1, 1)
+slot/3/right_icon = null
+slot/3/draw_stylebox = true
+slot/4/left_enabled = false
+slot/4/left_type = 0
+slot/4/left_color = Color(1, 1, 1, 1)
+slot/4/left_icon = null
+slot/4/right_enabled = false
+slot/4/right_type = 0
+slot/4/right_color = Color(1, 1, 1, 1)
+slot/4/right_icon = null
+slot/4/draw_stylebox = true
+slot/5/left_enabled = false
+slot/5/left_type = 0
+slot/5/left_color = Color(1, 1, 1, 1)
+slot/5/left_icon = null
+slot/5/right_enabled = false
+slot/5/right_type = 0
+slot/5/right_color = Color(1, 1, 1, 1)
+slot/5/right_icon = null
+slot/5/draw_stylebox = true
+metadata/command = "shrink_shrink_1"
+
+[node name="Control" type="Control" parent="shrink_shrink_1"]
+layout_mode = 2
+
+[node name="VBoxContainer" parent="shrink_shrink_1" instance=ExtResource("3_b6nw4")]
+layout_mode = 2
+tooltip_text = "Shortening factor of sound from one repeat to the next. Shrinkage stops once events become too short for splices."
+
+[node name="Label" parent="shrink_shrink_1/VBoxContainer" index="0"]
+text = "Shrinkage"
+
+[node name="HSlider" parent="shrink_shrink_1/VBoxContainer/HSplitContainer" index="0"]
+min_value = 0.01
+max_value = 1.0
+step = 0.01
+value = 0.25
+
+[node name="VBoxContainer2" parent="shrink_shrink_1" instance=ExtResource("3_b6nw4")]
+layout_mode = 2
+tooltip_text = "Initial timestep in seconds between output events"
+
+[node name="Label" parent="shrink_shrink_1/VBoxContainer2" index="0"]
+text = "Gap"
+
+[node name="HSlider" parent="shrink_shrink_1/VBoxContainer2/HSplitContainer" index="0"]
+min_value = 12.0
+max_value = 60.0
+step = 0.01
+value = 12.0
+
+[node name="VBoxContainer3" parent="shrink_shrink_1" instance=ExtResource("3_b6nw4")]
+layout_mode = 2
+tooltip_text = "Shortening of gaps between output events"
+
+[node name="Label" parent="shrink_shrink_1/VBoxContainer3" index="0"]
+text = "Contract"
+
+[node name="HSlider" parent="shrink_shrink_1/VBoxContainer3/HSplitContainer" index="0"]
+min_value = 0.1
+max_value = 1.0
+step = 0.01
+value = 0.8
+
+[node name="VBoxContainer4" parent="shrink_shrink_1" instance=ExtResource("3_b6nw4")]
+layout_mode = 2
+tooltip_text = "The (minimum) duration of the output"
+
+[node name="Label" parent="shrink_shrink_1/VBoxContainer4" index="0"]
+text = "Output Duration"
+
+[node name="HSlider" parent="shrink_shrink_1/VBoxContainer4/HSplitContainer" index="0"]
+min_value = 1.0
+max_value = 1000.0
+value = 30.0
+exp_edit = true
+
+[node name="VBoxContainer5" parent="shrink_shrink_1" instance=ExtResource("3_b6nw4")]
+layout_mode = 2
+tooltip_text = "Splice length in milliseconds"
+
+[node name="Label" parent="shrink_shrink_1/VBoxContainer5" index="0"]
+text = "Splice Length"
+
+[node name="HSlider" parent="shrink_shrink_1/VBoxContainer5/HSplitContainer" index="0"]
+min_value = 0.05
+max_value = 1000.0
+step = 0.1
+value = 14.95
+exp_edit = true
+
+[node name="extend_zigzag_1" type="GraphNode" parent="."]
+layout_mode = 0
+offset_left = 479.0
+offset_top = 1575.0
+offset_right = 785.0
+offset_bottom = 1789.0
+tooltip_text = "Read soundfile backwards and forwards"
+title = "Extend: Zigzag"
+slot/0/left_enabled = true
+slot/0/left_type = 0
+slot/0/left_color = Color(1, 1, 1, 1)
+slot/0/left_icon = null
+slot/0/right_enabled = true
+slot/0/right_type = 0
+slot/0/right_color = Color(1, 1, 1, 1)
+slot/0/right_icon = null
+slot/0/draw_stylebox = true
+slot/1/left_enabled = false
+slot/1/left_type = 0
+slot/1/left_color = Color(1, 1, 1, 1)
+slot/1/left_icon = null
+slot/1/right_enabled = false
+slot/1/right_type = 0
+slot/1/right_color = Color(1, 1, 1, 1)
+slot/1/right_icon = null
+slot/1/draw_stylebox = true
+slot/2/left_enabled = false
+slot/2/left_type = 0
+slot/2/left_color = Color(1, 1, 1, 1)
+slot/2/left_icon = null
+slot/2/right_enabled = false
+slot/2/right_type = 0
+slot/2/right_color = Color(1, 1, 1, 1)
+slot/2/right_icon = null
+slot/2/draw_stylebox = true
+slot/3/left_enabled = false
+slot/3/left_type = 0
+slot/3/left_color = Color(1, 1, 1, 1)
+slot/3/left_icon = null
+slot/3/right_enabled = false
+slot/3/right_type = 0
+slot/3/right_color = Color(1, 1, 1, 1)
+slot/3/right_icon = null
+slot/3/draw_stylebox = true
+slot/4/left_enabled = false
+slot/4/left_type = 0
+slot/4/left_color = Color(1, 1, 1, 1)
+slot/4/left_icon = null
+slot/4/right_enabled = false
+slot/4/right_type = 0
+slot/4/right_color = Color(1, 1, 1, 1)
+slot/4/right_icon = null
+slot/4/draw_stylebox = true
+metadata/command = "extend_zigzag_1"
+
+[node name="Control" type="Control" parent="extend_zigzag_1"]
+layout_mode = 2
+
+[node name="VBoxContainer" parent="extend_zigzag_1" instance=ExtResource("3_b6nw4")]
+layout_mode = 2
+tooltip_text = "Point where zigzag begins"
+
+[node name="Label" parent="extend_zigzag_1/VBoxContainer" index="0"]
+text = "Start Point"
+
+[node name="HSlider" parent="extend_zigzag_1/VBoxContainer/HSplitContainer" index="0"]
+max_value = 1000.0
+step = 0.01
+value = 0.0
+
+[node name="VBoxContainer2" parent="extend_zigzag_1" instance=ExtResource("3_b6nw4")]
+layout_mode = 2
+tooltip_text = "Point where zigzag ends"
+
+[node name="Label" parent="extend_zigzag_1/VBoxContainer2" index="0"]
+text = "End Point"
+
+[node name="HSlider" parent="extend_zigzag_1/VBoxContainer2/HSplitContainer" index="0"]
+min_value = 1.0
+max_value = 1000.0
+step = 0.01
+
+[node name="VBoxContainer3" parent="extend_zigzag_1" instance=ExtResource("3_b6nw4")]
+layout_mode = 2
+tooltip_text = "Duration of soundfile output"
+
+[node name="Label" parent="extend_zigzag_1/VBoxContainer3" index="0"]
+text = "Output Duration"
+
+[node name="HSlider" parent="extend_zigzag_1/VBoxContainer3/HSplitContainer" index="0"]
+min_value = 1.0
+max_value = 1000.0
+value = 60.0
+exp_edit = true
+
+[node name="VBoxContainer4" parent="extend_zigzag_1" instance=ExtResource("3_b6nw4")]
+layout_mode = 2
+tooltip_text = "Minimum time between zigzags"
+
+[node name="Label" parent="extend_zigzag_1/VBoxContainer4" index="0"]
+text = "Minimum Zigzag Time"
+
+[node name="HSlider" parent="extend_zigzag_1/VBoxContainer4/HSplitContainer" index="0"]
+min_value = 0.05
+max_value = 1.0
+step = 0.01
+value = 0.05
+
 [node name="pvoc_anal_1" type="GraphNode" parent="."]
 layout_mode = 0
-offset_left = 1334.0
-offset_top = 46.0
-offset_right = 1640.0
-offset_bottom = 166.0
+offset_left = 2213.0
+offset_top = 33.0
+offset_right = 2519.0
+offset_bottom = 153.0
 tooltip_text = "Converts audio to the frequency domain"
 title = "PVOC: Analyse"
 slot/0/left_enabled = true
@@ -508,10 +1126,10 @@ text = "No adjustable parameters"
 
 [node name="pvoc_synth" type="GraphNode" parent="."]
 layout_mode = 0
-offset_left = 1338.0
-offset_top = 191.0
-offset_right = 1644.0
-offset_bottom = 311.0
+offset_left = 2217.0
+offset_top = 178.0
+offset_right = 2523.0
+offset_bottom = 298.0
 tooltip_text = "Resynthesises frequency domain analysis back into audio"
 title = "PVOC: Resynthesise"
 slot/0/left_enabled = true
@@ -543,10 +1161,10 @@ text = "No adjustable parameters"
 
 [node name="focus_accu" type="GraphNode" parent="."]
 layout_mode = 0
-offset_left = 1340.0
-offset_top = 351.0
-offset_right = 1646.0
-offset_bottom = 510.0
+offset_left = 2219.0
+offset_top = 338.0
+offset_right = 2525.0
+offset_bottom = 497.0
 tooltip_text = "Sustain (accumulate) each spectral band, until louder data appears in that band"
 title = "PVOC: Accumulate"
 slot/0/left_enabled = true
@@ -640,10 +1258,10 @@ vertical_alignment = 1
 
 [node name="blur_blur" type="GraphNode" parent="."]
 layout_mode = 0
-offset_left = 1345.0
-offset_top = 540.0
-offset_right = 1651.0
-offset_bottom = 660.0
+offset_left = 2224.0
+offset_top = 527.0
+offset_right = 2530.0
+offset_bottom = 647.0
 tooltip_text = "Time-averages the spectrum bluring detail in the time dimension"
 title = "PVOC: Blur"
 slot/0/left_enabled = true
@@ -683,10 +1301,10 @@ value = 64.0
 
 [node name="blur_chorus_5" type="GraphNode" parent="."]
 layout_mode = 0
-offset_left = 1345.0
-offset_top = 683.0
-offset_right = 1651.0
-offset_bottom = 842.0
+offset_left = 2224.0
+offset_top = 670.0
+offset_right = 2530.0
+offset_bottom = 829.0
 tooltip_text = "Chorusing effect created by randomising the amplitude and frequency values of the partials"
 title = "PVOC: Chorus"
 slot/0/left_enabled = true
@@ -749,10 +1367,10 @@ value = 2.0
 
 [node name="strange_invert_1" type="GraphNode" parent="."]
 layout_mode = 0
-offset_left = 1351.0
-offset_top = 870.0
-offset_right = 1657.0
-offset_bottom = 990.0
+offset_left = 2230.0
+offset_top = 857.0
+offset_right = 2536.0
+offset_bottom = 977.0
 tooltip_text = "Transfers the energy from the highest frequency bands to the lowest ones and vice versa"
 title = "PVOC: Invert"
 slot/0/left_enabled = true
@@ -784,10 +1402,10 @@ text = "No adjustable parameters"
 
 [node name="spectstr_stretch" type="GraphNode" parent="."]
 layout_mode = 0
-offset_left = 1352.0
-offset_top = 1009.0
-offset_right = 1658.0
-offset_bottom = 1129.0
+offset_left = 2231.0
+offset_top = 996.0
+offset_right = 2537.0
+offset_bottom = 1207.0
 tooltip_text = "Stretches or shrinks the sound over time, without changing frequency"
 title = "PVOC: Stretch"
 slot/0/left_enabled = true
@@ -869,10 +1487,10 @@ value = 0.0
 
 [node name="hilite_trace_1" type="GraphNode" parent="."]
 layout_mode = 0
-offset_left = 1352.0
-offset_top = 1240.0
-offset_right = 1658.0
-offset_bottom = 1347.0
+offset_left = 2231.0
+offset_top = 1227.0
+offset_right = 2537.0
+offset_bottom = 1334.0
 tooltip_text = "Looks for the loudest frequencies and keeps only those"
 title = "PVOC: Trace"
 slot/0/left_enabled = true
@@ -913,10 +1531,10 @@ exp_edit = true
 
 [node name="blur_scatter" type="GraphNode" parent="."]
 layout_mode = 0
-offset_left = 1356.0
-offset_top = 1372.0
-offset_right = 1662.0
-offset_bottom = 1479.0
+offset_left = 2235.0
+offset_top = 1359.0
+offset_right = 2541.0
+offset_bottom = 1466.0
 tooltip_text = "Discards a random selection of frequency bands"
 title = "PVOC: Thin Randomly"
 slot/0/left_enabled = true
@@ -957,10 +1575,10 @@ exp_edit = true
 
 [node name="strange_waver_1" type="GraphNode" parent="."]
 layout_mode = 0
-offset_left = 1356.0
-offset_top = 1505.0
-offset_right = 1662.0
-offset_bottom = 1716.0
+offset_left = 2235.0
+offset_top = 1492.0
+offset_right = 2541.0
+offset_bottom = 1703.0
 tooltip_text = "Oscillate between harmonic and inharmonic state"
 title = "PVOC: Waver"
 slot/0/left_enabled = true
@@ -1055,6 +1673,26 @@ exp_edit = true
 [editable path="distort_multiply/VBoxContainer"]
 [editable path="distort_interpolate/VBoxContainer"]
 [editable path="distort_replace/VBoxContainer"]
+[editable path="extend_drunk_1/VBoxContainer"]
+[editable path="extend_drunk_1/VBoxContainer2"]
+[editable path="extend_drunk_1/VBoxContainer3"]
+[editable path="extend_drunk_1/VBoxContainer4"]
+[editable path="extend_drunk_1/VBoxContainer5"]
+[editable path="extend_loop_1/VBoxContainer"]
+[editable path="extend_loop_1/VBoxContainer2"]
+[editable path="extend_loop_1/VBoxContainer3"]
+[editable path="extend_scramble_1/VBoxContainer"]
+[editable path="extend_scramble_1/VBoxContainer2"]
+[editable path="extend_scramble_1/VBoxContainer3"]
+[editable path="shrink_shrink_1/VBoxContainer"]
+[editable path="shrink_shrink_1/VBoxContainer2"]
+[editable path="shrink_shrink_1/VBoxContainer3"]
+[editable path="shrink_shrink_1/VBoxContainer4"]
+[editable path="shrink_shrink_1/VBoxContainer5"]
+[editable path="extend_zigzag_1/VBoxContainer"]
+[editable path="extend_zigzag_1/VBoxContainer2"]
+[editable path="extend_zigzag_1/VBoxContainer3"]
+[editable path="extend_zigzag_1/VBoxContainer4"]
 [editable path="blur_blur/VBoxContainer"]
 [editable path="blur_chorus_5/VBoxContainer"]
 [editable path="blur_chorus_5/VBoxContainer2"]

+ 327 - 200
scenes/main/control.gd

@@ -7,15 +7,15 @@ var selected_nodes = {} #used to track which nodes in the GraphEdit are selected
 var cdpprogs_location
 var delete_intermediate_outputs
 @onready var console_output: RichTextLabel = $Console/ConsoleOutput
+var final_output_dir
 
 # Called when the node enters the scene tree for the first time.
 func _ready() -> void:
-	Distortions.hide()
 	Nodes.hide()
 	$mainmenu.hide()
 	$NoLocationPopup.hide()
-	$DeleteIntermediateFilesToggle.button_pressed = true
 	$Console.hide()
+	$NoInputPopup.hide()
 	
 	#Goes through all nodes in scene and checks for buttons in the make_node_buttons group
 	#Associates all buttons with the _on_button_pressed fuction and passes the button as an argument
@@ -23,11 +23,27 @@ func _ready() -> void:
 		if child is Button:
 			child.pressed.connect(_on_button_pressed.bind(child))
 	
+	#Generate input and output nodes
 	var effect: GraphNode = Nodes.get_node(NodePath("inputfile")).duplicate()
 	get_node("GraphEdit").add_child(effect, true)
+	effect.position_offset = Vector2(-500,-150)
+	
+	effect = Nodes.get_node(NodePath("outputfile")).duplicate()
+	get_node("GraphEdit").add_child(effect, true)
+	effect.position_offset = Vector2(1000,-150)
 	
 	check_cdp_location_set()
 	
+	#link output file to input file to enable audio output file loopback
+	$GraphEdit/outputfile/AudioPlayer.recycle_outfile_trigger.connect($GraphEdit/inputfile/AudioPlayer.recycle_outfile)
+	
+	#link run process button to the batch generation script
+	$GraphEdit/outputfile/RunProcess.button_down.connect(_run_process)
+	
+	#link and set delete intermediat files toggle from outputfile
+	$GraphEdit/outputfile/DeleteIntermediateFilesToggle.toggled.connect(_toggle_delete)
+	$GraphEdit/outputfile/DeleteIntermediateFilesToggle.button_pressed = true
+	
 func check_cdp_location_set():
 	#checks if the location has been set and prompts user to set it
 	var cdpprogs_settings = ConfigHandler.load_cdpprogs_settings()
@@ -96,9 +112,14 @@ func _on_graph_edit_node_deselected(node: Node) -> void:
 
 func _on_graph_edit_delete_nodes_request(nodes: Array[StringName]) -> void:
 	for node in selected_nodes.keys():
-		if selected_nodes[node] and node.name != "inputfile":
-			remove_connections_to_node(node)
-			node.queue_free()
+		if selected_nodes[node]:
+			if  node.name == "inputfile":
+				print("can't delete input")
+			elif  node.name == "outputfile":
+				print("can't delete output")
+			else:
+				remove_connections_to_node(node)
+				node.queue_free()
 	selected_nodes = {}
 
 func remove_connections_to_node(node):
@@ -109,13 +130,18 @@ func remove_connections_to_node(node):
 
 #Here be dragons
 #Scans through all nodes and generates a batch file based on their order
-func _on_generate_batch_file_button_down() -> void:
-	$FileDialog.show()
+
+func _run_process() -> void:
+	if Global.infile == "no_file":
+		$NoInputPopup.show()
+	else:
+		$FileDialog.show()
 
 func _on_file_dialog_dir_selected(dir: String) -> void:
+	console_output.clear()
 	$Console.show()
-	console_output.append_text("Generating processing queue\n")
-	await get_tree().process_frame
+	log_console("Generating processing queue", true)
+
 	#get the current time in hh-mm-ss format as default : causes file name issues
 	var time_dict = Time.get_time_dict_from_system()
 	# Pad with zeros to ensure two digits for hour, minute, second
@@ -124,42 +150,42 @@ func _on_file_dialog_dir_selected(dir: String) -> void:
 	var second = str(time_dict.second).pad_zeros(2)
 	var time_str = hour + "-" + minute + "-" + second
 	Global.outfile = dir + "/outfile_" + Time.get_date_string_from_system() + "_" + time_str
-	console_output.append_text("Output directory and file name(s):" + Global.outfile + "\n")
-	await get_tree().process_frame
+	log_console("Output directory and file name(s):" + Global.outfile, true)
 	
-	generate_batch_file_ordered_with_multiple_sliders()
-
-func generate_batch_file_ordered_with_multiple_sliders():
+	generate_batch_file_with_branches()
+	
+func generate_batch_file_with_branches():
 	var connections = graph_edit.get_connection_list()
-	var graph := {}
-	var indegree := {}
-	var nodes := []
+	var graph = {}
+	var reverse_graph = {}
+	var indegree = {}
+	var all_nodes = {}
 
-	# Step 1: Collect relevant nodes
+	# Step 1: Collect nodes
 	for child in graph_edit.get_children():
 		if child is GraphNode:
 			var name = str(child.name)
-			if name == "inputfile" or name == "outputfile":
-				continue
-			graph[name] = []
-			indegree[name] = 0
-			nodes.append(name)
+			all_nodes[name] = child
+			if name != "inputfile" and name != "outputfile":
+				graph[name] = []
+				reverse_graph[name] = []
+				indegree[name] = 0
 
-	# Step 2: Build graph
+	# Step 2: Build the graph
 	for conn in connections:
 		var from = str(conn["from_node"])
 		var to = str(conn["to_node"])
 		if graph.has(from) and graph.has(to):
 			graph[from].append(to)
+			reverse_graph[to].append(from)
 			indegree[to] += 1
 
 	# Step 3: Topological sort
-	var sorted := []
-	var queue := []
-	for node in nodes:
+	var sorted = []
+	var queue = []
+	for node in graph.keys():
 		if indegree[node] == 0:
 			queue.append(node)
-
 	while not queue.is_empty():
 		var current = queue.pop_front()
 		sorted.append(current)
@@ -167,168 +193,183 @@ func generate_batch_file_ordered_with_multiple_sliders():
 			indegree[neighbor] -= 1
 			if indegree[neighbor] == 0:
 				queue.append(neighbor)
-
-	if sorted.size() != nodes.size():
-		console_output.append_text("Cycle detected in graph or disconnected nodes\n")
-		await get_tree().process_frame
-		push_error("Cycle detected in graph or disconnected nodes.")
+	if sorted.size() != graph.size():
+		log_console("Cycle detected or disconnected nodes", true)
 		return
 
-	# Step 4: Generate batch lines
-	console_output.append_text("Generating process queue from " + str(sorted.size()) + " nodes\n" )
-	await get_tree().process_frame
-	var batch_lines: Array[String] = []
-	var intermediate_files: Array[String] = []
+	# Step 4: Batch file generation
+	var batch_lines = []
+	var intermediate_files = []
+	var stereo_outputs = {}
 
-	var process_count = 0
-	
 	if Global.infile_stereo:
-		# Stereo processing
-		var stereo_base := Global.infile.get_basename()
-		var infile_c1 := stereo_base + "_c1.wav"
-		var infile_c2 := stereo_base + "_c2.wav"
-		var outfile_c1 := ""
-		var outfile_c2 := ""
-
-		console_output.append_text("Input file is stereo, adding split to dual mono to process queue, this may cause stereo decorrolation with some processess\n")
-		await get_tree().process_frame
-		# Add stereo split processing command
-		batch_lines.append(cdpprogs_location + "/housekeep chans 2 \"" + Global.infile + "\"")
-
-		# Process both channels (c1 and c2)
-		for channel in ["c1", "c2"]:
-			var current_infile := stereo_base + "_%s.wav" % channel
-			for i in sorted.size():
-				var node_name = sorted[i]
-				var node = graph_edit.get_node(NodePath(node_name))
-				var slider_data = _get_slider_values_ordered(node)
+		# Step 4.1: Split stereo to c1/c2
+		batch_lines.append("%s/housekeep chans 2 \"%s\"" % [cdpprogs_location, Global.infile])
 
-				# Get output type and file extension
-				var output_slot_type: int = node.get_slot_type_right(0)
-				var extension := ".wav"
-				if output_slot_type == 1:
-					extension = ".ana"
+		# Process for each channel
+		for channel in ["c1", "c2"]:
+			var current_infile = Global.infile.get_basename() + "_%s.wav" % channel
+			var output_files = {}
+			var process_count = 0
+
+			for node_name in sorted:
+				var node = all_nodes[node_name]
+				var inputs = reverse_graph[node_name]
+				var input_files = []
+				for input_node in inputs:
+					if output_files.has(input_node):
+						input_files.append(output_files[input_node])
+
+				if input_files.size() > 1:
+					var merge_output = "%s_%s_merge_%d.wav" % [Global.outfile.get_basename(), channel, process_count]
+					var quoted_inputs = []
+					for f in input_files:
+						quoted_inputs.append("\"%s\"" % f)
+					var merge_cmd = cdpprogs_location + "/submix mergemany " + " ".join(quoted_inputs) + " \"%s\"" % merge_output
+					batch_lines.append(merge_cmd)
+					intermediate_files.append(merge_output)
+					current_infile = merge_output
+				elif input_files.size() == 1:
+					current_infile = input_files[0]
+				else:
+					current_infile = Global.infile.get_basename() + "_%s.wav" % channel
 
-				# Generate command
-				var command_name: String = str(node.get_meta("command")) if node.has_meta("command") else node_name
+				var slider_data = _get_slider_values_ordered(node)
+				var extension = ".wav" if node.get_slot_type_right(0) == 0 else ".ana"
+				var output_file = "%s_%s_%d%s" % [Global.outfile.get_basename(), channel, process_count, extension]
+				var command_name = str(node.get_meta("command")) if node.has_meta("command") else node_name
 				command_name = command_name.replace("_", " ")
-
-				var outfile_numbered := Global.outfile.get_basename() + "_%s_%d%s" % [channel, i, extension]
-				var line: String = cdpprogs_location + "/" + command_name + " \"" + current_infile + "\" \"" + outfile_numbered + "\" "
-
-				# Add slider values to the command
+				var line = "%s/%s \"%s\" \"%s\" " % [cdpprogs_location, command_name, current_infile, output_file]
 				for entry in slider_data:
-					var slider_name = entry[0]
-					var value = entry[1]
-					if slider_name.begins_with("-"):
-						line += "%s%.2f " % [slider_name, float(value)]
-					else:
-						line += "%.2f " % float(value)
-
+					line += ("%s%.2f " % [entry[0], entry[1]]) if entry[0].begins_with("-") else ("%.2f " % entry[1])
 				batch_lines.append(line.strip_edges())
-				console_output.append_text("Added process to queue:" + line.strip_edges() + "\n")
-				
-				
-				# Add output file to delete list
-				if process_count < sorted.size() - 1 and delete_intermediate_outputs:
-					intermediate_files.append(outfile_numbered)
+				output_files[node_name] = output_file
+				if delete_intermediate_outputs:
+					intermediate_files.append(output_file)
 				process_count += 1
-				current_infile = outfile_numbered
-			
-			#reset count for right channel
-			process_count = 0
+
+			# Handle output node
+			var output_inputs = []
+			for conn in connections:
+				if conn["to_node"] == "outputfile":
+					output_inputs.append(str(conn["from_node"]))
+			var final_output = ""
+			if output_inputs.size() > 1:
+				var quoted_inputs = []
+				for fnode in output_inputs:
+					if output_files.has(fnode):
+						quoted_inputs.append("\"%s\"" % output_files[fnode])
+						#intermediate_files.append(output_files[fnode])
+				final_output = "%s_%s_final.wav" % [Global.outfile.get_basename(), channel]
+				batch_lines.append("%s/submix mergemany %s \"%s\"" % [cdpprogs_location, " ".join(quoted_inputs), final_output])
+			elif output_inputs.size() == 1:
+				final_output = output_files[output_inputs[0]]
+				intermediate_files.erase(final_output)
+			stereo_outputs[channel] = final_output
+
+		# Interleave final
+		if stereo_outputs.has("c1") and stereo_outputs.has("c2"):
+			if stereo_outputs["c1"].ends_with(".wav") and stereo_outputs["c2"].ends_with(".wav"):
+				var final_stereo = Global.outfile.get_basename() + "_stereo.wav"
+				batch_lines.append("%s/submix interleave \"%s\" \"%s\" \"%s\"" % [cdpprogs_location, stereo_outputs["c1"], stereo_outputs["c2"], final_stereo])
+				final_output_dir = final_stereo
+				if delete_intermediate_outputs:
+					intermediate_files.append(stereo_outputs["c1"])
+					intermediate_files.append(stereo_outputs["c2"])
+				
+		#add del command for not needed files
+		#always delete mono split as they are in a weird location
+		intermediate_files.append(Global.infile.get_basename() + "_c1.wav")
+		intermediate_files.append(Global.infile.get_basename() + "_c2.wav")
+		
+		for file_path in intermediate_files:
+			batch_lines.append("del \"%s\"" % file_path.replace("/", "\\"))
 			
-			# Keep track of the last output for each channel
-			if channel == "c1":
-				outfile_c1 = current_infile
+	else:
+		# Use mono logic as before
+			# Step 4: Process chain
+		var output_files = {}  # node -> output file
+		var process_count = 0
+		var current_infile = Global.infile
+
+		for node_name in sorted:
+			var node = all_nodes[node_name]
+			var inputs = reverse_graph[node_name]
+			var input_files = []
+			for input_node in inputs:
+				input_files.append(output_files[input_node])
+
+			# If multiple inputs, merge with submix mergemany
+			if input_files.size() > 1:
+				var merge_output = "%s_merge_%d.wav" % [Global.outfile.get_basename(), process_count]
+				var quoted_inputs := []
+				for f in input_files:
+					quoted_inputs.append("\"%s\"" % f)
+				var merge_cmd = cdpprogs_location + "/submix mergemany " + " ".join(quoted_inputs) + " \"%s\"" % merge_output
+				batch_lines.append(merge_cmd)
+				intermediate_files.append(merge_output)
+				current_infile = merge_output
+			elif input_files.size() == 1:
+				current_infile = input_files[0]
 			else:
-				outfile_c2 = current_infile
-				
-		await get_tree().process_frame
-		# Final interleave if both branches ended in .wav
-		if outfile_c1.ends_with(".wav") and outfile_c2.ends_with(".wav"):
-			batch_lines.append(cdpprogs_location + "/submix interleave \"" + outfile_c1 + "\" \"" + outfile_c2 + "\" \"" + Global.outfile + "_stereo.wav\"")
-			# Conditionally add output files from stereo processing
-			if delete_intermediate_outputs:
-				intermediate_files.append(outfile_c1)
-				intermediate_files.append(outfile_c2)
-			console_output.append_text("Added process to queue to recombine dual mono output to stereo. Stereo output file is:" + Global.outfile +"_stereo.wav\n")
-			await get_tree().process_frame
-		# Always add stereo split files (_c1 and _c2) for cleanup
-		intermediate_files.append(infile_c1)
-		intermediate_files.append(infile_c2)
+				current_infile = Global.infile
 
-	else:
-		# Mono processing
-		var current_infile: String = Global.infile
-		console_output.append_text("Input file is mono\n")
-		await get_tree().process_frame
-		
-		for i in sorted.size():
-			var node_name = sorted[i]
-			var node = graph_edit.get_node(NodePath(node_name))
+			# Build node command
 			var slider_data = _get_slider_values_ordered(node)
-
-			# Get output type and file extension
-			var output_slot_type: int = node.get_slot_type_right(0)
-			var extension := ".wav"
-			if output_slot_type == 1:
-				extension = ".ana"
-
-			# Generate command
-			var command_name: String = str(node.get_meta("command")) if node.has_meta("command") else node_name
+			var extension = ".wav" if node.get_slot_type_right(0) == 0 else ".ana"
+			var output_file = "%s_%d%s" % [Global.outfile.get_basename(), process_count, extension]
+			var command_name = str(node.get_meta("command")) if node.has_meta("command") else node_name
 			command_name = command_name.replace("_", " ")
-			var outfile_numbered: String = Global.outfile.get_basename() + "_%d%s" % [i, extension]
-
-			var line: String = cdpprogs_location + "/" + command_name + " \"" + current_infile + "\" \"" + outfile_numbered + "\" "
-			
-			
-			# Add slider values to the command
+			var line = "%s/%s \"%s\" \"%s\" " % [cdpprogs_location, command_name, current_infile, output_file]
 			for entry in slider_data:
-				var slider_name = entry[0]
-				var value = entry[1]
-				if slider_name.begins_with("-"):
-					line += "%s%.2f " % [slider_name, float(value)]
-				else:
-					line += "%.2f " % float(value)
-
+				line += ("%s%.2f " % [entry[0], entry[1]]) if entry[0].begins_with("-") else ("%.2f " % entry[1])
 			batch_lines.append(line.strip_edges())
-			console_output.append_text("Added process to queue:" + line.strip_edges() + "\n")
-			
-			# Add output file to delete list if needed
-			if process_count < sorted.size() - 1 and delete_intermediate_outputs:
-				intermediate_files.append(outfile_numbered)
+			output_files[node_name] = output_file
+			if delete_intermediate_outputs:
+				intermediate_files.append(output_file)
 			process_count += 1
-			current_infile = outfile_numbered
-	
-	await get_tree().process_frame
-	
-	# Step 5: Clean up intermediate files (skip the last one)
-	if intermediate_files.size() >= 1:
-		console_output.append_text("Adding processes to clean up intermediate files leaving only the final output file\n")
-		await get_tree().process_frame
-		var last_drive_letter := ""
-		for i in intermediate_files.size(): 
-			var file_path := intermediate_files[i].replace("/", "\\")
-			var drive_letter := file_path.substr(0, 2)
-			if drive_letter != last_drive_letter:
-				batch_lines.append(drive_letter)
-				last_drive_letter = drive_letter
-			batch_lines.append("del \"%s\"" % file_path)
-	
-	
-	# Step 6: Write file
+
+		# Step 4.5: Handle nodes connected to outputfile
+		var output_inputs := []
+		for conn in connections:
+			if conn["to_node"] == "outputfile":
+				output_inputs.append(str(conn["from_node"]))
+
+		var final_outputs := []
+		for node_name in output_inputs:
+			if output_files.has(node_name):
+				final_outputs.append(output_files[node_name])
+
+		if final_outputs.size() > 1:
+			var quoted_inputs := []
+			for f in final_outputs:
+				quoted_inputs.append("\"%s\"" % f)
+				intermediate_files.append(f)
+			var merge_cmd = cdpprogs_location + "/submix mergemany " + " ".join(quoted_inputs) + " \"%s\"" % Global.outfile + ".wav"
+			final_output_dir = Global.outfile + ".wav"
+			batch_lines.append(merge_cmd)
+			for f in final_outputs:
+				intermediate_files.erase(f)
+		elif final_outputs.size() == 1:
+			var single_output = final_outputs[0]
+			final_output_dir = single_output
+			intermediate_files.erase(single_output)
+
+		# Step 5: Cleanup commands
+		log_console("Adding cleanup commands for intermediate files", true)
+		for file_path in intermediate_files:
+			batch_lines.append("del \"%s\"" % file_path.replace("/", "\\"))
+
+	# Step 6: Write batch file
 	var file = FileAccess.open("user://ordered_script.bat", FileAccess.WRITE)
 	for line in batch_lines:
 		file.store_line(line)
 	file.close()
 
-	print("Batch file written to user://ordered_script.bat")
-	console_output.append_text("[color=green]Building process queue is complete[/color]\n")
-	console_output.append_text("Running process, please wait...\n")
-	await get_tree().process_frame
+	log_console("Batch script with merging written.", true)
 	run_batch_file()
 
+
 # Ordered slider collection
 func _get_slider_values_ordered(node: Node) -> Array:
 	var results := []
@@ -339,6 +380,99 @@ func _get_slider_values_ordered(node: Node) -> Array:
 			var nested := _get_slider_values_ordered(child)
 			results.append_array(nested)
 	return results
+
+func build_graph_from_connections(graph_edit: GraphEdit) -> Dictionary:
+	var connections = graph_edit.get_connection_list()
+	var graph := {}
+	var reverse_graph := {}
+	var all_nodes := {}
+
+	# Collect all GraphNode names
+	for child in graph_edit.get_children():
+		if child is GraphNode:
+			var name = str(child.name)
+			all_nodes[name] = true
+			graph[name] = []
+			reverse_graph[name] = []
+
+	# Build forward and reverse graphs
+	for conn in connections:
+		var from = str(conn["from_node"])
+		var to = str(conn["to_node"])
+		if graph.has(from) and graph.has(to):
+			graph[from].append(to)
+			reverse_graph[to].append(from)
+
+	# Perform BFS from "inputfile"
+	var reachable := {}
+	var queue := ["inputfile"]
+	while not queue.is_empty():
+		var current = queue.pop_front()
+		if reachable.has(current):
+			continue
+		reachable[current] = true
+		for neighbor in graph.get(current, []):
+			queue.append(neighbor)
+
+	# Reverse BFS from "outputfile"
+	var required := {}
+	queue = ["outputfile"]
+	while not queue.is_empty():
+		var current = queue.pop_front()
+		if required.has(current):
+			continue
+		required[current] = true
+		for parent in reverse_graph.get(current, []):
+			queue.append(parent)
+
+	# Keep only nodes that are reachable both ways
+	var used_nodes := []
+	for node in reachable.keys():
+		if required.has(node):
+			used_nodes.append(node)
+
+	var pruned_graph := {}
+	for node in used_nodes:
+		var filtered_neighbors := []
+		for neighbor in graph.get(node, []):
+			if used_nodes.has(neighbor):
+				filtered_neighbors.append(neighbor)
+		pruned_graph[node] = filtered_neighbors
+
+	return {
+		"graph": pruned_graph,
+		"nodes": used_nodes
+	}
+
+func topological_sort(graph: Dictionary, nodes: Array) -> Array:
+	var indegree := {}
+	for node in nodes:
+		indegree[node] = 0
+	for node in nodes:
+		for neighbor in graph[node]:
+			indegree[neighbor] += 1
+
+	var queue := []
+	for node in nodes:
+		if indegree[node] == 0:
+			queue.append(node)
+
+	var sorted := []
+	while not queue.is_empty():
+		var current = queue.pop_front()
+		sorted.append(current)
+		for neighbor in graph[current]:
+			indegree[neighbor] -= 1
+			if indegree[neighbor] == 0:
+				queue.append(neighbor)
+
+	if sorted.size() != nodes.size():
+		push_error("Cycle detected or disconnected graph.")
+		return []
+	
+	return sorted
+
+
 	
 func run_batch_file():
 	var bat_path = ProjectSettings.globalize_path("user://ordered_script.bat")
@@ -356,43 +490,36 @@ func run_batch_file():
 		error_str += item + "\n"
 
 	if exit_code == 0:
-		console_output.append_text("[color=green]Processes ran successfully[/color]\n")
-		console_output.append_text("[b]Output:[/b]\n" + output_str)
+		console_output.append_text("[color=green]Processes ran successfully[/color]\n \n")
+		console_output.append_text("[b]Output:[/b]\n")
+		console_output.scroll_to_line(console_output.get_line_count() - 1)
+		console_output.append_text(output_str + "/n")
+		if final_output_dir.ends_with(".wav"):
+			$GraphEdit/outputfile/AudioPlayer.play_outfile(final_output_dir)
 	else:
-		console_output.append_text("[color=red][b]Processes failed with exit code: %d[/b][/color]\n" % exit_code)
-		console_output.append_text("[b]Error:[/b]\n" + error_str)
-#func run_batch_file():
-	#var bat_path = ProjectSettings.globalize_path("user://ordered_script.bat")
-#
-	## Create empty arrays to capture the output and error
-	#var output : Array = []
-	#var error : Array = []
-#
-	## Execute the batch file and capture output and error
-	#var exit_code = OS.execute("cmd.exe", ["/c", bat_path], output, true, true)
-#
-	## Manually join the array elements into a single string
-	#var output_str = ""
-	#for item in output:
-		#output_str += item + "\n"  # Append each element with a newline
-#
-	#var error_str = ""
-	#for item in error:
-		#error_str += item + "\n"  # Append each element with a newline
-#
-	## Output handling based on exit code
-	#if exit_code == 0:
-		#print("Processes ran successfully.")
-		#print("Output: ", output_str)
-	#else:
-		#print("Processes failed with exit code:", exit_code)
-		#print("Error: ", error_str)
-
-
-
-func _on_delete_intermediate_files_toggle_toggled(toggled_on: bool) -> void:
-	delete_intermediate_outputs = toggled_on
+		console_output.append_text("[color=red][b]Processes failed with exit code: %d[/b][/color]\n" % exit_code + "\n \n")
+		console_output.append_text("[b]Error:[/b]\n" )
+		console_output.scroll_to_line(console_output.get_line_count() - 1)
+		console_output.append_text(error_str + "/n")
+
 
+func _toggle_delete(toggled_on: bool):
+	delete_intermediate_outputs = toggled_on
 
 func _on_console_close_requested() -> void:
 	$Console.hide()
+
+func log_console(text: String, update: bool) -> void:
+	console_output.append_text(text + "\n \n")
+	console_output.scroll_to_line(console_output.get_line_count() - 1)
+	if update == true:
+		await get_tree().process_frame  # Optional: ensure UI updates
+
+
+func _on_console_open_folder_button_down() -> void:
+	$Console.hide()
+	OS.shell_open(Global.outfile.get_base_dir())
+
+
+func _on_ok_button_2_button_down() -> void:
+	$NoInputPopup.hide()

+ 49 - 32
scenes/main/control.tscn

@@ -21,18 +21,6 @@ anchor_bottom = 1.0
 right_disconnects = true
 script = ExtResource("2_3ioqo")
 
-[node name="GenerateBatchFile" type="Button" parent="."]
-layout_mode = 1
-anchors_preset = 2
-anchor_top = 1.0
-anchor_bottom = 1.0
-offset_left = 12.0
-offset_top = -45.0
-offset_right = 172.0
-offset_bottom = -14.0
-grow_vertical = 0
-text = "Generate Batch File"
-
 [node name="FileDialog" type="FileDialog" parent="."]
 title = "Open a Directory"
 ok_button_text = "Select Current Folder"
@@ -49,7 +37,6 @@ title = "Wrong File Type"
 initial_position = 2
 size = Vector2i(350, 200)
 visible = false
-transient = true
 exclusive = true
 unresizable = true
 borderless = true
@@ -77,6 +64,36 @@ offset_right = 206.0
 offset_bottom = 185.0
 text = "Ok"
 
+[node name="NoInputPopup" type="Window" parent="."]
+auto_translate_mode = 1
+title = "No Input Selected"
+initial_position = 2
+size = Vector2i(350, 150)
+visible = false
+exclusive = true
+unresizable = true
+borderless = true
+always_on_top = true
+popup_window = true
+
+[node name="Label" type="Label" parent="NoInputPopup"]
+offset_top = 5.0
+offset_right = 349.0
+offset_bottom = 98.0
+text = "No input file selected
+Please load a sound file into Input File node
+Supported file type: .wav, mono or stereo"
+horizontal_alignment = 1
+vertical_alignment = 1
+autowrap_mode = 2
+
+[node name="OkButton2" type="Button" parent="NoInputPopup"]
+offset_left = 142.0
+offset_top = 103.0
+offset_right = 206.0
+offset_bottom = 134.0
+text = "Ok"
+
 [node name="CdpLocationDialog" type="FileDialog" parent="."]
 title = "Open a Directory"
 ok_button_text = "Select Current Folder"
@@ -84,43 +101,43 @@ file_mode = 2
 access = 2
 use_native_dialog = true
 
-[node name="Label" type="Label" parent="."]
-layout_mode = 0
-offset_left = 231.0
-offset_top = 604.0
-offset_right = 423.0
-offset_bottom = 627.0
-text = "Delete intermediate files"
-
-[node name="DeleteIntermediateFilesToggle" type="CheckButton" parent="."]
-layout_mode = 0
-offset_left = 184.0
-offset_top = 606.0
-offset_right = 228.0
-offset_bottom = 630.0
-
 [node name="Console" type="Window" parent="."]
+title = "Generating Output"
 initial_position = 5
 size = Vector2i(600, 400)
 visible = false
+unresizable = true
 always_on_top = true
 
+[node name="Panel" type="Panel" parent="Console"]
+offset_left = 10.0
+offset_top = 12.0
+offset_right = 590.0
+offset_bottom = 340.0
+
 [node name="ConsoleOutput" type="RichTextLabel" parent="Console"]
 offset_left = 10.0
-offset_top = 10.0
+offset_top = 12.0
 offset_right = 590.0
-offset_bottom = 390.0
+offset_bottom = 340.0
 bbcode_enabled = true
 
+[node name="ConsoleOpenFolder" type="Button" parent="Console"]
+offset_left = 172.0
+offset_top = 350.0
+offset_right = 428.0
+offset_bottom = 389.0
+text = "Open Output Folder"
+
 [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"]
 [connection signal="disconnection_request" from="GraphEdit" to="." method="_on_graph_edit_disconnection_request"]
 [connection signal="node_deselected" from="GraphEdit" to="." method="_on_graph_edit_node_deselected"]
 [connection signal="node_selected" from="GraphEdit" to="." method="_on_graph_edit_node_selected"]
-[connection signal="button_down" from="GenerateBatchFile" to="." method="_on_generate_batch_file_button_down"]
 [connection signal="dir_selected" from="FileDialog" to="." method="_on_file_dialog_dir_selected"]
 [connection signal="button_down" from="NoLocationPopup/OkButton" to="." method="_on_ok_button_button_down"]
+[connection signal="button_down" from="NoInputPopup/OkButton2" to="." method="_on_ok_button_2_button_down"]
 [connection signal="canceled" from="CdpLocationDialog" to="." method="_on_cdp_location_dialog_canceled"]
 [connection signal="dir_selected" from="CdpLocationDialog" to="." method="_on_cdp_location_dialog_dir_selected"]
-[connection signal="toggled" from="DeleteIntermediateFilesToggle" to="." method="_on_delete_intermediate_files_toggle_toggled"]
 [connection signal="close_requested" from="Console" to="." method="_on_console_close_requested"]
+[connection signal="button_down" from="Console/ConsoleOpenFolder" to="." method="_on_console_open_folder_button_down"]

+ 1 - 0
scenes/main/graph_edit.gd

@@ -4,3 +4,4 @@ extends GraphEdit
 func _ready() -> void:
 	snapping_enabled = false
 	show_grid = false
+	zoom = 0.55

+ 4 - 4
scenes/menu/menu.tscn

@@ -21,15 +21,15 @@ offset_right = 300.0
 offset_bottom = 226.0
 grow_horizontal = 2
 grow_vertical = 2
-current_tab = 1
+current_tab = 0
 
 [node name="Time Domain" type="TabContainer" parent="select_effect"]
-visible = false
 layout_mode = 2
-current_tab = 0
+current_tab = 1
 metadata/_tab_index = 0
 
 [node name="Distort" type="VBoxContainer" parent="select_effect/Time Domain"]
+visible = false
 layout_mode = 2
 metadata/_tab_index = 0
 
@@ -264,7 +264,6 @@ layout_mode = 2
 text = "+"
 
 [node name="Extend" type="VBoxContainer" parent="select_effect/Time Domain"]
-visible = false
 layout_mode = 2
 metadata/_tab_index = 1
 
@@ -702,6 +701,7 @@ layout_mode = 2
 theme_override_constants/margin_bottom = 3
 
 [node name="Frequency Domain" type="TabContainer" parent="select_effect"]
+visible = false
 layout_mode = 2
 current_tab = 1
 metadata/_tab_index = 1

Some files were not shown because too many files changed in this diff