Browse Source

added copy paste, stopped pvoc nodes trying to mix inputs and a few other minor changes

Jonathan Higgins 7 months ago
parent
commit
b29bb9dcd2
29 changed files with 512 additions and 56 deletions
  1. 1 1
      .godot/editor/audioplayer.tscn-editstate-5c5be15cd7cbde82fbc3248f6958ab76.cfg
  2. 1 1
      .godot/editor/control.tscn-editstate-475cf43e2d21753002d8a2b4ccf5105f.cfg
  3. 1 1
      .godot/editor/control.tscn-folding-475cf43e2d21753002d8a2b4ccf5105f.cfg
  4. 2 2
      .godot/editor/create_recent.Node
  5. 6 5
      .godot/editor/editor_layout.cfg
  6. 16 16
      .godot/editor/filesystem_cache10
  7. 1 4
      .godot/editor/filesystem_update4
  8. 1 1
      .godot/editor/menu.tscn-editstate-523ba9f1be4474a87fc09942b9fbb098.cfg
  9. 1 1
      .godot/editor/menu.tscn-folding-523ba9f1be4474a87fc09942b9fbb098.cfg
  10. 3 3
      .godot/editor/nodes.tscn-editstate-d18a50cdbd65798e64eea9469be45949.cfg
  11. 0 0
      .godot/editor/nodes.tscn-folding-d18a50cdbd65798e64eea9469be45949.cfg
  12. 3 3
      .godot/editor/project_metadata.cfg
  13. 1 1
      .godot/editor/recent_dirs
  14. 3 0
      .godot/editor/scatter_value.gd-folding-61214d1b0e737c0215e0c8e86ace1045.cfg
  15. 28 10
      .godot/editor/script_editor_cache.cfg
  16. 1 1
      .godot/editor/valueslider.tscn-editstate-d535ab38e866eae88d73c3fd55232f95.cfg
  17. BIN
      .godot/imported/splash.png-929ed8a00b89ba36c51789452f874c77.ctex
  18. 3 0
      .godot/imported/splash.png-929ed8a00b89ba36c51789452f874c77.md5
  19. BIN
      .godot/uid_cache.bin
  20. 13 1
      project.godot
  21. 180 1
      scenes/Nodes/nodes.tscn
  22. 11 0
      scenes/Nodes/scatter_value.gd
  23. 1 0
      scenes/Nodes/scatter_value.gd.uid
  24. 145 2
      scenes/main/control.gd
  25. 31 0
      scenes/main/control.tscn
  26. 25 2
      scenes/menu/menu.tscn
  27. BIN
      splash.png
  28. 34 0
      splash.png.import
  29. BIN
      splash.xcf

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

@@ -192,4 +192,4 @@ Game={
 "hide_selection": false,
 "hide_selection": false,
 "select_mode": 0
 "select_mode": 0
 }
 }
-selected_nodes=Array[NodePath]([])
+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")])

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

@@ -192,4 +192,4 @@ Game={
 "hide_selection": false,
 "hide_selection": false,
 "select_mode": 0
 "select_mode": 0
 }
 }
-selected_nodes=Array[NodePath]([])
+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")])

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

@@ -2,4 +2,4 @@
 
 
 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")]
 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=[]
 resource_unfolds=[]
-nodes_folded=[]
+nodes_folded=[NodePath("NoLocationPopup"), NodePath("NoInputPopup"), NodePath("MultipleConnectionsPopup"), NodePath("Console")]

+ 2 - 2
.godot/editor/create_recent.Node

@@ -1,6 +1,7 @@
+Button
+CodeEdit
 Label
 Label
 CheckButton
 CheckButton
-Button
 HBoxContainer
 HBoxContainer
 Panel
 Panel
 Window
 Window
@@ -11,4 +12,3 @@ VBoxContainer
 ScrollContainer
 ScrollContainer
 Control
 Control
 GraphNode
 GraphNode
-AnimationPlayer

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

@@ -29,10 +29,10 @@ dock_5="Inspector,Node,History"
 [EditorNode]
 [EditorNode]
 
 
 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")
 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"
+current_scene="res://scenes/main/control.tscn"
 center_split_offset=0
 center_split_offset=0
 selected_default_debugger_tab_idx=0
 selected_default_debugger_tab_idx=0
-selected_main_editor_idx=0
+selected_main_editor_idx=2
 selected_bottom_panel_item=0
 selected_bottom_panel_item=0
 
 
 [EditorWindow]
 [EditorWindow]
@@ -40,15 +40,16 @@ selected_bottom_panel_item=0
 screen=0
 screen=0
 mode="maximized"
 mode="maximized"
 position=Vector2i(1920, 23)
 position=Vector2i(1920, 23)
+size=Vector2i(1152, 648)
 
 
 [ScriptEditor]
 [ScriptEditor]
 
 
-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_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/scatter_value.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_help=[]
 open_help=[]
 script_split_offset=200
 script_split_offset=200
 list_split_offset=0
 list_split_offset=0
-zoom_factor=1.0
+zoom_factor=0.857142
 
 
 [GameView]
 [GameView]
 
 

+ 16 - 16
.godot/editor/filesystem_cache10

@@ -1,12 +1,11 @@
 ea4bc82a6ad023ab7ee23ee620429895
 ea4bc82a6ad023ab7ee23ee620429895
-::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<><>::
+::res://::1746716919
 config_handler.gd::GDScript/GDScript::9123848664534566230::1746479238::0::1::::<>Node<><>0<>0<><>::
 config_handler.gd::GDScript/GDScript::9123848664534566230::1746479238::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<><>::
+export_presets.cfg::TextFile/TextFile::-1::1746584894::0::1::::<><><>0<>0<><>::
+Global.gd::GDScript/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::
 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<><>::
 README.md::TextFile/TextFile::-1::1746495214::0::1::::<><><>0<>0<><>::
+splash.png::CompressedTexture2D/CompressedTexture2D::1486976329801462502::1746631442::1746631447::1::::<><><>0<>0<>3eb9acb3a672643bd6ed5acadd0dc708<>res://.godot/imported/splash.png-929ed8a00b89ba36c51789452f874c77.ctex::
 ::res://addons/::1746462377
 ::res://addons/::1746462377
 ::res://addons/audio_preview/::1746452824
 ::res://addons/audio_preview/::1746452824
 AudioStreamPreview.gd::GDScript/GDScript::2308550898442263711::1746444878::0::1::::<>TextureRect<><>0<>1<><>::
 AudioStreamPreview.gd::GDScript/GDScript::2308550898442263711::1746444878::0::1::::<>TextureRect<><>0<>1<><>::
@@ -14,17 +13,18 @@ AudioStreamPreview.tscn::PackedScene/PackedScene::3762817095482496943::174645250
 voice_preview_generator.gd::GDScript/GDScript::6244997812245505292::1746444274::0::1::::<>Node<><>0<>1<><>::
 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
 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/::1746186301
-::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/::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
+::res://scenes/main/::1746716900
+control.gd::GDScript::2620037524409541442::1746716900::0::1::::<>Control<><>0<>0<><>::
+control.tscn::PackedScene::2566019287410494992::1746716900::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::1746582824::0::1::::<>GraphEdit<><>0<>0<><>::
+::res://scenes/menu/::1746716852
+menu.tscn::PackedScene::4186758075496332121::1746716852::0::1::::<><><>0<>0<><>::
+::res://scenes/Nodes/::1746716852
+audioplayer.gd::GDScript/GDScript::5570864814132306429::1746710375::0::1::::<>Control<><>0<>0<><>::
+audioplayer.tscn::PackedScene::6037166449976350293::1746716852::0::1::::<><><>0<>0<><>::uid://clmtlg8via3qn::::res://scenes/Nodes/audioplayer.gd
 focus_accu_sliders.gd::GDScript/GDScript::8821949764991756997::1746492997::0::1::::<>GraphNode<><>0<>0<><>::
 focus_accu_sliders.gd::GDScript/GDScript::8821949764991756997::1746492997::0::1::::<>GraphNode<><>0<>0<><>::
-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
+nodes.tscn::PackedScene::8614413456730569426::1746716852::0::1::::<><><>0<>0<><>::uid://csapiqka522fh::::res://scenes/Nodes/audioplayer.tscn<>uid://dya5kxx132fgp::::res://scenes/Nodes/valueslider.tscn<>uid://dyf0qutxeqio3::::res://scenes/Nodes/scatter_value.gd<>uid://dxxohuvlw5e3n::::res://scenes/Nodes/focus_accu_sliders.gd
+scatter_value.gd::GDScript/GDScript::8855663765553304696::1746710375::0::1::::<>VBoxContainer<><>0<>0<><>::
 valueslider.gd::GDScript/GDScript::2557655848205010713::1746187131::0::1::::<>VBoxContainer<><>0<>0<><>::
 valueslider.gd::GDScript/GDScript::2557655848205010713::1746187131::0::1::::<>VBoxContainer<><>0<>0<><>::
-valueslider.tscn::PackedScene::8845634910901483783::1746549312::0::1::::<><><>0<>0<><>::uid://bco7hof3wqck4::::res://scenes/Nodes/valueslider.gd
+valueslider.tscn::PackedScene::8845634910901483783::1746716852::0::1::::<><><>0<>0<><>::uid://bco7hof3wqck4::::res://scenes/Nodes/valueslider.gd
 waveform_preview.gd::GDScript/GDScript::5688062150584079786::1746458041::0::1::::<>Control<><>0<>0<><>::
 waveform_preview.gd::GDScript/GDScript::5688062150584079786::1746458041::0::1::::<>Control<><>0<>0<><>::

+ 1 - 4
.godot/editor/filesystem_update4

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

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

@@ -192,4 +192,4 @@ Game={
 "hide_selection": false,
 "hide_selection": false,
 "select_mode": 0
 "select_mode": 0
 }
 }
-selected_nodes=Array[NodePath]([])
+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")])

+ 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")]
 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=[]
 resource_unfolds=[]
-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")]
+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"), NodePath("select_effect/Time Domain/Extend/MarginContainer2/ScrollContainer/VBoxContainer/HSplitContainer"), NodePath("select_effect/Time Domain/Granulate"), NodePath("select_effect/Time Domain/Misc"), NodePath("select_effect/Frequency Domain/Process/MarginContainer4/ScrollContainer/VBoxContainer/HSplitContainer8")]

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

@@ -8,7 +8,7 @@ Anim={
 "grid_snap_active": false,
 "grid_snap_active": false,
 "grid_step": Vector2(8, 8),
 "grid_step": Vector2(8, 8),
 "grid_visibility": 1,
 "grid_visibility": 1,
-"ofs": Vector2(-235.833, 1192.36),
+"ofs": Vector2(-363.513, 121.811),
 "primary_grid_step": Vector2i(8, 8),
 "primary_grid_step": Vector2i(8, 8),
 "show_group_gizmos": true,
 "show_group_gizmos": true,
 "show_guides": true,
 "show_guides": true,
@@ -34,7 +34,7 @@ Anim={
 "snap_rotation_step": 0.261799,
 "snap_rotation_step": 0.261799,
 "snap_scale": false,
 "snap_scale": false,
 "snap_scale_step": 0.1,
 "snap_scale_step": 0.1,
-"zoom": 0.751315
+"zoom": 0.620921
 }
 }
 3D={
 3D={
 "fov": 70.01,
 "fov": 70.01,
@@ -192,4 +192,4 @@ Game={
 "hide_selection": false,
 "hide_selection": false,
 "select_mode": 0
 "select_mode": 0
 }
 }
-selected_nodes=Array[NodePath]([])
+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")])

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


+ 3 - 3
.godot/editor/project_metadata.cfg

@@ -1,6 +1,6 @@
 [editor_metadata]
 [editor_metadata]
 
 
-executable_path="D:/Downloads/Godot_v4.4.1-stable_win64.exe/Godot_v4.4.1-stable_win64.exe"
+executable_path="D:/Program Files/Godot_v4.4.1-stable_win64.exe/Godot_v4.4.1-stable_win64.exe"
 use_advanced_connections=false
 use_advanced_connections=false
 
 
 [dialog_bounds]
 [dialog_bounds]
@@ -12,7 +12,7 @@ export=Rect2(2386, 375, 900, 500)
 [recent_files]
 [recent_files]
 
 
 scenes=["res://scenes/Nodes/audioplayer.tscn", "res://scenes/menu/menu.tscn", "res://scenes/Nodes/nodes.tscn", "res://scenes/Nodes/valueslider.tscn", "res://scenes/main/control.tscn", "res://node_2d.tscn", "res://menu.tscn", "res://testscroll.tscn", "res://distortions.tscn", "res://control.tscn"]
 scenes=["res://scenes/Nodes/audioplayer.tscn", "res://scenes/menu/menu.tscn", "res://scenes/Nodes/nodes.tscn", "res://scenes/Nodes/valueslider.tscn", "res://scenes/main/control.tscn", "res://node_2d.tscn", "res://menu.tscn", "res://testscroll.tscn", "res://distortions.tscn", "res://control.tscn"]
-scripts=["res://scenes/Nodes/focus_accu_sliders.gd", "res://config_handler.gd", "res://Global.gd", "res://addons/audio_preview/AudioStreamPreview.gd", "res://addons/GDScriptAudioImport-master/README.md", "res://addons/GDScriptAudioImport-master/GDScriptAudioImport.gd", "res://addons/audio_preview/voice_preview_generator.gd", "res://scenes/Nodes/waveform_preview.gd", "res://scenes/Nodes/audioplayer.gd", "res://scenes/Nodes/valueslider.gd"]
+scripts=["res://scenes/Nodes/scatter_value.gd", "res://scenes/Nodes/focus_accu_sliders.gd", "res://config_handler.gd", "res://Global.gd", "res://addons/audio_preview/AudioStreamPreview.gd", "res://addons/GDScriptAudioImport-master/README.md", "res://addons/GDScriptAudioImport-master/GDScriptAudioImport.gd", "res://addons/audio_preview/voice_preview_generator.gd", "res://scenes/Nodes/waveform_preview.gd", "res://scenes/Nodes/audioplayer.gd"]
 
 
 [script_setup]
 [script_setup]
 
 
@@ -25,7 +25,7 @@ embed_size_mode=2
 [color_picker]
 [color_picker]
 
 
 picker_shape=3
 picker_shape=3
-recent_presets=PackedColorArray(0.184314, 0.309804, 0.305882, 1, 1, 1, 1, 0.541176, 1, 0, 1, 1, 0.59819, 0.558522, 0.969966, 1, 0.457908, 0.359424, 0.913417, 1, 1, 1, 1, 1, 0, 0, 0, 1)
+recent_presets=PackedColorArray(0.184314, 0.309804, 0.305882, 1, 1, 1, 1, 0.541176, 1, 0, 1, 1, 0.59819, 0.558522, 0.969966, 1, 0.457908, 0.359424, 0.913417, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0.184314, 0.309804, 0.305882, 1)
 
 
 [quick_open_dialog]
 [quick_open_dialog]
 
 

+ 1 - 1
.godot/editor/recent_dirs

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

+ 3 - 0
.godot/editor/scatter_value.gd-folding-61214d1b0e737c0215e0c8e86ace1045.cfg

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

+ 28 - 10
.godot/editor/script_editor_cache.cfg

@@ -3,11 +3,11 @@
 state={
 state={
 "bookmarks": PackedInt32Array(),
 "bookmarks": PackedInt32Array(),
 "breakpoints": PackedInt32Array(),
 "breakpoints": PackedInt32Array(),
-"column": 22,
+"column": 36,
 "folded_lines": Array[int]([]),
 "folded_lines": Array[int]([]),
 "h_scroll_position": 0,
 "h_scroll_position": 0,
-"row": 12,
-"scroll_position": 2.0,
+"row": 215,
+"scroll_position": 193.0,
 "selection": false,
 "selection": false,
 "syntax_highlighter": "GDScript"
 "syntax_highlighter": "GDScript"
 }
 }
@@ -31,12 +31,16 @@ state={
 state={
 state={
 "bookmarks": PackedInt32Array(),
 "bookmarks": PackedInt32Array(),
 "breakpoints": PackedInt32Array(),
 "breakpoints": PackedInt32Array(),
-"column": 0,
+"column": 46,
 "folded_lines": Array[int]([]),
 "folded_lines": Array[int]([]),
 "h_scroll_position": 0,
 "h_scroll_position": 0,
-"row": 5,
+"row": 10,
 "scroll_position": 0.0,
 "scroll_position": 0.0,
-"selection": false,
+"selection": true,
+"selection_from_column": 1,
+"selection_from_line": 10,
+"selection_to_column": 46,
+"selection_to_line": 10,
 "syntax_highlighter": "GDScript"
 "syntax_highlighter": "GDScript"
 }
 }
 
 
@@ -45,11 +49,11 @@ state={
 state={
 state={
 "bookmarks": PackedInt32Array(),
 "bookmarks": PackedInt32Array(),
 "breakpoints": PackedInt32Array(),
 "breakpoints": PackedInt32Array(),
-"column": 26,
+"column": 0,
 "folded_lines": Array[int]([]),
 "folded_lines": Array[int]([]),
 "h_scroll_position": 0,
 "h_scroll_position": 0,
-"row": 83,
-"scroll_position": 69.0,
+"row": 111,
+"scroll_position": 0.0,
 "selection": false,
 "selection": false,
 "syntax_highlighter": "GDScript"
 "syntax_highlighter": "GDScript"
 }
 }
@@ -105,7 +109,7 @@ state={
 state={
 state={
 "bookmarks": PackedInt32Array(),
 "bookmarks": PackedInt32Array(),
 "breakpoints": PackedInt32Array(),
 "breakpoints": PackedInt32Array(),
-"column": 0,
+"column": 22,
 "folded_lines": Array[int]([]),
 "folded_lines": Array[int]([]),
 "h_scroll_position": 0,
 "h_scroll_position": 0,
 "row": 2,
 "row": 2,
@@ -145,3 +149,17 @@ state={
 "selection": false,
 "selection": false,
 "syntax_highlighter": "GDScript"
 "syntax_highlighter": "GDScript"
 }
 }
+
+[res://scenes/Nodes/scatter_value.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"
+}

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

@@ -192,4 +192,4 @@ Game={
 "hide_selection": false,
 "hide_selection": false,
 "select_mode": 0
 "select_mode": 0
 }
 }
-selected_nodes=Array[NodePath]([])
+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")])

BIN
.godot/imported/splash.png-929ed8a00b89ba36c51789452f874c77.ctex


+ 3 - 0
.godot/imported/splash.png-929ed8a00b89ba36c51789452f874c77.md5

@@ -0,0 +1,3 @@
+source_md5="a2a2556d185eb6dd5f834191567170e1"
+dest_md5="0257bb4485fe91c6055cf8275ead76e6"
+

BIN
.godot/uid_cache.bin


+ 13 - 1
project.godot

@@ -13,11 +13,13 @@ config_version=5
 config/name="SoundThread"
 config/name="SoundThread"
 run/main_scene="uid://bcs87y7ptx3ke"
 run/main_scene="uid://bcs87y7ptx3ke"
 config/features=PackedStringArray("4.4", "Forward Plus")
 config/features=PackedStringArray("4.4", "Forward Plus")
+boot_splash/bg_color=Color(0.184314, 0.309804, 0.305882, 1)
+boot_splash/image="uid://vgkjvbf7nf5o"
 config/icon="res://icon.svg"
 config/icon="res://icon.svg"
+boot_splash/minimum_display_time=500
 
 
 [autoload]
 [autoload]
 
 
-Distortions="*res://distortions.tscn"
 Nodes="*res://scenes/Nodes/nodes.tscn"
 Nodes="*res://scenes/Nodes/nodes.tscn"
 Global="*res://Global.gd"
 Global="*res://Global.gd"
 ConfigHandler="*res://config_handler.gd"
 ConfigHandler="*res://config_handler.gd"
@@ -36,6 +38,16 @@ open_menu={
 "events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":2,"canceled":false,"pressed":false,"double_click":false,"script":null)
 "events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":2,"canceled":false,"pressed":false,"double_click":false,"script":null)
 ]
 ]
 }
 }
+copy_node={
+"deadzone": 0.2,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":0,"physical_keycode":67,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+]
+}
+paste_node={
+"deadzone": 0.2,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":0,"physical_keycode":86,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+]
+}
 
 
 [rendering]
 [rendering]
 
 

+ 180 - 1
scenes/Nodes/nodes.tscn

@@ -1,7 +1,8 @@
-[gd_scene load_steps=4 format=3 uid="uid://duy5epq25pj8u"]
+[gd_scene load_steps=5 format=3 uid="uid://duy5epq25pj8u"]
 
 
 [ext_resource type="PackedScene" uid="uid://csapiqka522fh" path="res://scenes/Nodes/audioplayer.tscn" id="2_b6nw4"]
 [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="PackedScene" uid="uid://dya5kxx132fgp" path="res://scenes/Nodes/valueslider.tscn" id="3_b6nw4"]
+[ext_resource type="Script" uid="uid://dyf0qutxeqio3" path="res://scenes/Nodes/scatter_value.gd" id="3_uv17x"]
 [ext_resource type="Script" uid="uid://dxxohuvlw5e3n" path="res://scenes/Nodes/focus_accu_sliders.gd" id="4_uv17x"]
 [ext_resource type="Script" uid="uid://dxxohuvlw5e3n" path="res://scenes/Nodes/focus_accu_sliders.gd" id="4_uv17x"]
 
 
 [node name="Control" type="Control"]
 [node name="Control" type="Control"]
@@ -1089,6 +1090,155 @@ max_value = 1.0
 step = 0.01
 step = 0.01
 value = 0.05
 value = 0.05
 
 
+[node name="filter_bank_1" type="GraphNode" parent="."]
+layout_mode = 0
+offset_left = 855.0
+offset_top = 414.0
+offset_right = 1161.0
+offset_bottom = 729.0
+tooltip_text = "Bank of filters tuned to the harmonic series of the Low Frequency"
+title = "Filter Bank: Harmonic Series"
+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 = "filter_bank_1"
+
+[node name="Control" type="Control" parent="filter_bank_1"]
+layout_mode = 2
+
+[node name="VBoxContainer" parent="filter_bank_1" instance=ExtResource("3_b6nw4")]
+layout_mode = 2
+tooltip_text = "Filter Q factor - how narrow the filer is"
+
+[node name="Label" parent="filter_bank_1/VBoxContainer" index="0"]
+text = "Q"
+
+[node name="HSlider" parent="filter_bank_1/VBoxContainer/HSplitContainer" index="0"]
+min_value = 1.0
+max_value = 10000.0
+step = 0.01
+value = 400.0
+
+[node name="VBoxContainer2" parent="filter_bank_1" instance=ExtResource("3_b6nw4")]
+layout_mode = 2
+tooltip_text = "Makeup gain after filtering"
+
+[node name="Label" parent="filter_bank_1/VBoxContainer2" index="0"]
+text = "Makeup Gain"
+
+[node name="HSlider" parent="filter_bank_1/VBoxContainer2/HSplitContainer" index="0"]
+min_value = 0.02
+max_value = 60.0
+step = 0.01
+value = 1.5
+exp_edit = true
+
+[node name="VBoxContainer3" parent="filter_bank_1" instance=ExtResource("3_b6nw4")]
+layout_mode = 2
+tooltip_text = "Lowest frequency of filter, all filters will be tuned based on this frequency"
+
+[node name="Label" parent="filter_bank_1/VBoxContainer3" index="0"]
+text = "Lowest Band"
+
+[node name="HSlider" parent="filter_bank_1/VBoxContainer3/HSplitContainer" index="0"]
+min_value = 20.0
+max_value = 12000.0
+step = 0.01
+value = 55.0
+exp_edit = true
+
+[node name="VBoxContainer4" parent="filter_bank_1" instance=ExtResource("3_b6nw4")]
+layout_mode = 2
+tooltip_text = "The highest frequency filter, must be higer than low filer"
+
+[node name="Label" parent="filter_bank_1/VBoxContainer4" index="0"]
+text = "Highest Band"
+
+[node name="HSlider" parent="filter_bank_1/VBoxContainer4/HSplitContainer" index="0"]
+min_value = 20.0
+max_value = 12000.0
+step = 0.01
+value = 12000.0
+exp_edit = true
+
+[node name="VBoxContainer5" type="VBoxContainer" parent="filter_bank_1"]
+custom_minimum_size = Vector2(270, 0)
+layout_mode = 2
+tooltip_text = "Amound of random spread applied to filer frequencies"
+script = ExtResource("3_uv17x")
+
+[node name="Label" type="Label" parent="filter_bank_1/VBoxContainer5"]
+layout_mode = 2
+text = "Scatter"
+
+[node name="HSplitContainer" type="HSplitContainer" parent="filter_bank_1/VBoxContainer5"]
+layout_mode = 2
+split_offset = 210
+dragging_enabled = false
+
+[node name="-s" type="HSlider" parent="filter_bank_1/VBoxContainer5/HSplitContainer"]
+custom_minimum_size = Vector2(0, 23)
+layout_mode = 2
+max_value = 1.0
+step = 0.01
+
+[node name="ValueLabel" type="Label" parent="filter_bank_1/VBoxContainer5/HSplitContainer"]
+layout_mode = 2
+text = "0.00"
+horizontal_alignment = 2
+vertical_alignment = 1
+
 [node name="pvoc_anal_1" type="GraphNode" parent="."]
 [node name="pvoc_anal_1" type="GraphNode" parent="."]
 layout_mode = 0
 layout_mode = 0
 offset_left = 2213.0
 offset_left = 2213.0
@@ -1662,6 +1812,31 @@ step = 0.1
 value = 5.0
 value = 5.0
 exp_edit = true
 exp_edit = true
 
 
+[node name="notes" type="GraphNode" parent="."]
+layout_mode = 0
+offset_left = 1042.0
+offset_top = 32.0
+offset_right = 1348.0
+offset_bottom = 237.0
+tooltip_text = "Oscillate between harmonic and inharmonic state"
+title = "Notes"
+slot/0/left_enabled = false
+slot/0/left_type = 1
+slot/0/left_color = Color(0, 0, 0, 1)
+slot/0/left_icon = null
+slot/0/right_enabled = false
+slot/0/right_type = 1
+slot/0/right_color = Color(0, 0, 0, 1)
+slot/0/right_icon = null
+slot/0/draw_stylebox = true
+metadata/command = "strange_waver_1"
+
+[node name="CodeEdit" type="CodeEdit" parent="notes"]
+custom_minimum_size = Vector2(0, 150)
+layout_mode = 2
+wrap_mode = 1
+
+[connection signal="value_changed" from="filter_bank_1/VBoxContainer5/HSplitContainer/-s" to="filter_bank_1/VBoxContainer5" method="_on_s_value_changed"]
 [connection signal="value_changed" from="focus_accu/VBoxContainer3/HSplitContainer/-d" to="focus_accu" method="_on_d_value_changed"]
 [connection signal="value_changed" from="focus_accu/VBoxContainer3/HSplitContainer/-d" to="focus_accu" method="_on_d_value_changed"]
 [connection signal="value_changed" from="focus_accu/VBoxContainer4/HSplitContainer/-g" to="focus_accu" method="_on_g_value_changed"]
 [connection signal="value_changed" from="focus_accu/VBoxContainer4/HSplitContainer/-g" to="focus_accu" method="_on_g_value_changed"]
 
 
@@ -1693,6 +1868,10 @@ exp_edit = true
 [editable path="extend_zigzag_1/VBoxContainer2"]
 [editable path="extend_zigzag_1/VBoxContainer2"]
 [editable path="extend_zigzag_1/VBoxContainer3"]
 [editable path="extend_zigzag_1/VBoxContainer3"]
 [editable path="extend_zigzag_1/VBoxContainer4"]
 [editable path="extend_zigzag_1/VBoxContainer4"]
+[editable path="filter_bank_1/VBoxContainer"]
+[editable path="filter_bank_1/VBoxContainer2"]
+[editable path="filter_bank_1/VBoxContainer3"]
+[editable path="filter_bank_1/VBoxContainer4"]
 [editable path="blur_blur/VBoxContainer"]
 [editable path="blur_blur/VBoxContainer"]
 [editable path="blur_chorus_5/VBoxContainer"]
 [editable path="blur_chorus_5/VBoxContainer"]
 [editable path="blur_chorus_5/VBoxContainer2"]
 [editable path="blur_chorus_5/VBoxContainer2"]

+ 11 - 0
scenes/Nodes/scatter_value.gd

@@ -0,0 +1,11 @@
+extends VBoxContainer
+
+
+# Called when the node enters the scene tree for the first time.
+func _ready() -> void:
+	$HSplitContainer/ValueLabel.text = str($"HSplitContainer/-s".value) # initial value
+	pass
+
+
+func _on_s_value_changed(value: float) -> void:
+	$HSplitContainer/ValueLabel.text = str(value)

+ 1 - 0
scenes/Nodes/scatter_value.gd.uid

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

+ 145 - 2
scenes/main/control.gd

@@ -8,6 +8,8 @@ var cdpprogs_location
 var delete_intermediate_outputs
 var delete_intermediate_outputs
 @onready var console_output: RichTextLabel = $Console/ConsoleOutput
 @onready var console_output: RichTextLabel = $Console/ConsoleOutput
 var final_output_dir
 var final_output_dir
+var copied_nodes_data = []
+var copied_connections = []
 
 
 # Called when the node enters the scene tree for the first time.
 # Called when the node enters the scene tree for the first time.
 func _ready() -> void:
 func _ready() -> void:
@@ -16,6 +18,7 @@ func _ready() -> void:
 	$NoLocationPopup.hide()
 	$NoLocationPopup.hide()
 	$Console.hide()
 	$Console.hide()
 	$NoInputPopup.hide()
 	$NoInputPopup.hide()
+	$MultipleConnectionsPopup.hide()
 	
 	
 	#Goes through all nodes in scene and checks for buttons in the make_node_buttons group
 	#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
 	#Associates all buttons with the _on_button_pressed fuction and passes the button as an argument
@@ -83,7 +86,7 @@ func showmenu():
 			$mainmenu.hide()
 			$mainmenu.hide()
 			mainmenu_visible = false
 			mainmenu_visible = false
 
 
-
+# creates nodes from menu
 func _on_button_pressed(button: Button):
 func _on_button_pressed(button: Button):
 	#close menu
 	#close menu
 	$mainmenu.hide()
 	$mainmenu.hide()
@@ -96,10 +99,146 @@ func _on_button_pressed(button: Button):
 	effect.position_offset = effect_position
 	effect.position_offset = effect_position
 
 
 
 
+#Handles copying and pasting nodes
+func _input(event):
+	if event.is_action_pressed("copy_node"):
+		copy_selected_nodes()
+		get_viewport().set_input_as_handled()
+
+	elif event.is_action_pressed("paste_node"):
+		paste_copied_nodes()
+		get_viewport().set_input_as_handled()
+		
+func copy_selected_nodes():
+	copied_nodes_data.clear()
+	copied_connections.clear()
+
+	var graph_edit = get_node("GraphEdit")
+
+	# Store selected nodes and their slider values
+	for node in graph_edit.get_children():
+		# Check if the node is selected and not an 'inputfile' or 'outputfile'
+		if node is GraphNode and selected_nodes.get(node, false):
+			if node.name == "inputfile" or node.name == "outputfile":
+				continue  # Skip these nodes
+
+			var node_data = {
+				"name": node.name,
+				"type": node.get_class(),
+				"offset": node.position_offset,
+				"slider_values": {}
+			}
+
+			for child in node.get_children():
+				if child is HSlider or child is VSlider:
+					node_data["slider_values"][child.name] = child.value
+
+			copied_nodes_data.append(node_data)
+
+	# Store connections between selected nodes
+	for conn in graph_edit.get_connection_list():
+		# Assuming 'from_node' and 'to_node' are StringName values
+		var from_ref = graph_edit.get_node_or_null(NodePath(conn["from_node"]))
+		var to_ref = graph_edit.get_node_or_null(NodePath(conn["to_node"]))
+
+		var is_from_selected = from_ref != null and selected_nodes.get(from_ref, false)
+		var is_to_selected = to_ref != null and selected_nodes.get(to_ref, false)
+
+		# Skip if any of the connected nodes are 'inputfile' or 'outputfile'
+		if (from_ref != null and (from_ref.name == "inputfile" or from_ref.name == "outputfile")) or (to_ref != null and (to_ref.name == "inputfile" or to_ref.name == "outputfile")):
+			continue
+
+		if is_from_selected and is_to_selected:
+			# Store connection as dictionary
+			var conn_data = {
+				"from_node": conn["from_node"],
+				"from_port": conn["from_port"],
+				"to_node": conn["to_node"],
+				"to_port": conn["to_port"]
+			}
+			copied_connections.append(conn_data)
+
+func paste_copied_nodes():
+	if copied_nodes_data.is_empty():
+		return
+
+	var graph_edit = get_node("GraphEdit")
+	var name_map = {}
+	var pasted_nodes = []
+
+	# Step 1: Find topmost and bottommost Y of copied nodes
+	var min_y = INF
+	var max_y = -INF
+	for node_data in copied_nodes_data:
+		var y = node_data["offset"].y
+		min_y = min(min_y, y)
+		max_y = max(max_y, y)
+
+	# Step 2: Decide where to paste the group
+	var base_y_offset = max_y + 350  # Pasting below the lowest node
+
+	# Step 3: Paste nodes, preserving vertical layout
+	for node_data in copied_nodes_data:
+		var original_node = graph_edit.get_node_or_null(NodePath(node_data["name"]))
+		if not original_node:
+			continue
+
+		var new_node = original_node.duplicate()
+		new_node.name = node_data["name"] + "_copy_" + str(randi() % 10000)
+
+		var relative_y = node_data["offset"].y - min_y
+		new_node.position_offset = Vector2(
+			node_data["offset"].x,
+			base_y_offset + relative_y
+		)
+
+		# Restore sliders
+		for child in new_node.get_children():
+			if child.name in node_data["slider_values"]:
+				child.value = node_data["slider_values"][child.name]
+
+		graph_edit.add_child(new_node, true)
+		name_map[node_data["name"]] = new_node.name
+		pasted_nodes.append(new_node)
+
+
+	# Step 4: Reconnect new nodes
+	for conn_data in copied_connections:
+		var new_from = name_map.get(conn_data["from_node"], null)
+		var new_to = name_map.get(conn_data["to_node"], null)
+
+		if new_from and new_to:
+			graph_edit.connect_node(new_from, conn_data["from_port"], new_to, conn_data["to_port"])
+
+	# Step 5: Select pasted nodes
+	for pasted_node in pasted_nodes:
+		graph_edit.set_selected(pasted_node)
+		selected_nodes[pasted_node] = true
+
 #logic for connecting, disconnecting and deleteing nodes and connections in GraphEdit
 #logic for connecting, disconnecting and deleteing nodes and connections in GraphEdit
 #mostly taken from https://gdscript.com/solutions/godot-graphnode-and-graphedit-tutorial/
 #mostly taken from https://gdscript.com/solutions/godot-graphnode-and-graphedit-tutorial/
 func _on_graph_edit_connection_request(from_node: StringName, from_port: int, to_node: StringName, to_port: int) -> void:
 func _on_graph_edit_connection_request(from_node: StringName, from_port: int, to_node: StringName, to_port: int) -> void:
-	get_node("GraphEdit").connect_node(from_node, from_port, to_node, to_port)
+	#get_node("GraphEdit").connect_node(from_node, from_port, to_node, to_port)
+	var graph_edit = get_node("GraphEdit")
+	var to_graph_node = graph_edit.get_node(NodePath(to_node))
+
+	# Get the type of the input port using GraphNode's built-in method
+	var port_type = to_graph_node.get_input_port_type(to_port)
+
+	# If port type is 1 and already has a connection, reject the request
+	if port_type == 1:
+		var connections = graph_edit.get_connection_list()
+		var existing_connections = 0
+
+		for conn in connections:
+			if conn.to_node == to_node and conn.to_port == to_port:
+				existing_connections += 1
+				if existing_connections >= 1:
+					$MultipleConnectionsPopup.show()
+					return
+
+	# If no conflict, allow the connection
+	graph_edit.connect_node(from_node, from_port, to_node, to_port)
 
 
 func _on_graph_edit_disconnection_request(from_node: StringName, from_port: int, to_node: StringName, to_port: int) -> void:
 func _on_graph_edit_disconnection_request(from_node: StringName, from_port: int, to_node: StringName, to_port: int) -> void:
 	get_node("GraphEdit").disconnect_node(from_node, from_port, to_node, to_port)
 	get_node("GraphEdit").disconnect_node(from_node, from_port, to_node, to_port)
@@ -523,3 +662,7 @@ func _on_console_open_folder_button_down() -> void:
 
 
 func _on_ok_button_2_button_down() -> void:
 func _on_ok_button_2_button_down() -> void:
 	$NoInputPopup.hide()
 	$NoInputPopup.hide()
+
+
+func _on_ok_button_3_button_down() -> void:
+	$MultipleConnectionsPopup.hide()

+ 31 - 0
scenes/main/control.tscn

@@ -94,6 +94,36 @@ offset_right = 206.0
 offset_bottom = 134.0
 offset_bottom = 134.0
 text = "Ok"
 text = "Ok"
 
 
+[node name="MultipleConnectionsPopup" type="Window" parent="."]
+auto_translate_mode = 1
+title = "No Input Selected"
+initial_position = 2
+size = Vector2i(350, 170)
+visible = false
+exclusive = true
+unresizable = true
+borderless = true
+always_on_top = true
+popup_window = true
+
+[node name="Label" type="Label" parent="MultipleConnectionsPopup"]
+offset_left = -1.0
+offset_top = 13.0
+offset_right = 348.0
+offset_bottom = 114.0
+text = "PVOC Nodes can only have one input.
+To mix sounds created in the frequency domain convert them to the time domain using PVOC: Resynthesise first."
+horizontal_alignment = 1
+vertical_alignment = 1
+autowrap_mode = 2
+
+[node name="OkButton3" type="Button" parent="MultipleConnectionsPopup"]
+offset_left = 140.0
+offset_top = 130.0
+offset_right = 204.0
+offset_bottom = 161.0
+text = "Ok"
+
 [node name="CdpLocationDialog" type="FileDialog" parent="."]
 [node name="CdpLocationDialog" type="FileDialog" parent="."]
 title = "Open a Directory"
 title = "Open a Directory"
 ok_button_text = "Select Current Folder"
 ok_button_text = "Select Current Folder"
@@ -137,6 +167,7 @@ text = "Open Output Folder"
 [connection signal="dir_selected" from="FileDialog" to="." method="_on_file_dialog_dir_selected"]
 [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="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="button_down" from="NoInputPopup/OkButton2" to="." method="_on_ok_button_2_button_down"]
+[connection signal="button_down" from="MultipleConnectionsPopup/OkButton3" to="." method="_on_ok_button_3_button_down"]
 [connection signal="canceled" from="CdpLocationDialog" to="." method="_on_cdp_location_dialog_canceled"]
 [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="dir_selected" from="CdpLocationDialog" to="." method="_on_cdp_location_dialog_dir_selected"]
 [connection signal="close_requested" from="Console" to="." method="_on_console_close_requested"]
 [connection signal="close_requested" from="Console" to="." method="_on_console_close_requested"]

+ 25 - 2
scenes/menu/menu.tscn

@@ -25,7 +25,7 @@ current_tab = 0
 
 
 [node name="Time Domain" type="TabContainer" parent="select_effect"]
 [node name="Time Domain" type="TabContainer" parent="select_effect"]
 layout_mode = 2
 layout_mode = 2
-current_tab = 1
+current_tab = 2
 metadata/_tab_index = 0
 metadata/_tab_index = 0
 
 
 [node name="Distort" type="VBoxContainer" parent="select_effect/Time Domain"]
 [node name="Distort" type="VBoxContainer" parent="select_effect/Time Domain"]
@@ -264,6 +264,7 @@ layout_mode = 2
 text = "+"
 text = "+"
 
 
 [node name="Extend" type="VBoxContainer" parent="select_effect/Time Domain"]
 [node name="Extend" type="VBoxContainer" parent="select_effect/Time Domain"]
+visible = false
 layout_mode = 2
 layout_mode = 2
 metadata/_tab_index = 1
 metadata/_tab_index = 1
 
 
@@ -388,7 +389,6 @@ layout_mode = 2
 text = "+"
 text = "+"
 
 
 [node name="Filter" type="VBoxContainer" parent="select_effect/Time Domain"]
 [node name="Filter" type="VBoxContainer" parent="select_effect/Time Domain"]
-visible = false
 layout_mode = 2
 layout_mode = 2
 metadata/_tab_index = 2
 metadata/_tab_index = 2
 
 
@@ -495,6 +495,7 @@ layout_mode = 2
 theme_override_constants/margin_bottom = 3
 theme_override_constants/margin_bottom = 3
 
 
 [node name="HSplitContainer4" type="HSplitContainer" parent="select_effect/Time Domain/Filter/MarginContainer2/ScrollContainer/VBoxContainer"]
 [node name="HSplitContainer4" type="HSplitContainer" parent="select_effect/Time Domain/Filter/MarginContainer2/ScrollContainer/VBoxContainer"]
+visible = false
 custom_minimum_size = Vector2(565, 0)
 custom_minimum_size = Vector2(565, 0)
 layout_mode = 2
 layout_mode = 2
 split_offset = 505
 split_offset = 505
@@ -657,6 +658,28 @@ text = "+"
 layout_mode = 2
 layout_mode = 2
 theme_override_constants/margin_bottom = 3
 theme_override_constants/margin_bottom = 3
 
 
+[node name="HSplitContainer4" type="HSplitContainer" parent="select_effect/Time Domain/Misc/MarginContainer2/ScrollContainer/VBoxContainer"]
+custom_minimum_size = Vector2(565, 0)
+layout_mode = 2
+split_offset = 505
+dragging_enabled = false
+
+[node name="RichTextLabel" type="RichTextLabel" parent="select_effect/Time Domain/Misc/MarginContainer2/ScrollContainer/VBoxContainer/HSplitContainer4"]
+layout_mode = 2
+bbcode_enabled = true
+text = "[b]Notes[/b]
+An empty node for taking notes about your patch in"
+fit_content = true
+scroll_active = false
+
+[node name="notes" type="Button" parent="select_effect/Time Domain/Misc/MarginContainer2/ScrollContainer/VBoxContainer/HSplitContainer4" groups=["make_node_buttons"]]
+layout_mode = 2
+text = "+"
+
+[node name="MarginContainer4" type="MarginContainer" parent="select_effect/Time Domain/Misc/MarginContainer2/ScrollContainer/VBoxContainer"]
+layout_mode = 2
+theme_override_constants/margin_bottom = 3
+
 [node name="HSplitContainer" type="HSplitContainer" parent="select_effect/Time Domain/Misc/MarginContainer2/ScrollContainer/VBoxContainer"]
 [node name="HSplitContainer" type="HSplitContainer" parent="select_effect/Time Domain/Misc/MarginContainer2/ScrollContainer/VBoxContainer"]
 layout_mode = 2
 layout_mode = 2
 split_offset = 505
 split_offset = 505

BIN
splash.png


+ 34 - 0
splash.png.import

@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://vgkjvbf7nf5o"
+path="res://.godot/imported/splash.png-929ed8a00b89ba36c51789452f874c77.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://splash.png"
+dest_files=["res://.godot/imported/splash.png-929ed8a00b89ba36c51789452f874c77.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1

BIN
splash.xcf


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