with Glib; use Glib; with Glib.Object; use Glib.Object; with Glib.Values; use Glib.Values; with Gtk.Handlers; use Gtk.Handlers; pragma Elaborate_All (Gtk.Handlers); with Gtk.Widget; use Gtk.Widget; with Gtk.Enums; use Gtk.Enums; with Gtk.Frame; use Gtk.Frame; with Gtk.Tree_Model; use Gtk.Tree_Model; with Gtk.Scrolled_Window; use Gtk.Scrolled_Window; with Gtk.Tree_View_Column; use Gtk.Tree_View_Column; with Gtk.Cell_Renderer_Text; use Gtk.Cell_Renderer_Text; with Gtk.Cell_Renderer_Toggle; use Gtk.Cell_Renderer_Toggle; with Gtk.Tree_Selection; use Gtk.Tree_Selection; with Gmface.Gm_Virtual.Gmface.Ctrl_change; use Gmface.Gm_Virtual.Gmface.Ctrl_Change; with Gmface.Gm_MIDI.Messages; use Gmface.Gm_MIDI.Messages; with Text_Io; use Text_Io; package body Gmface.Gm_Application.Gtk_Ctrl_Change is -------------------- -- step sequencer -- -------------------- package Plugin_Object_CB is new Gtk.Handlers.User_Callback (Gobject_Record, Abstract_Plugin_Access); procedure Muted_Edited (Model : access GObject_Record'Class; Params : Glib.Values.GValues; Plugin : Abstract_Plugin_Access) is M : constant Gtk_Tree_Store := Gtk_Tree_Store (Model); Path_String : constant String := Get_String (Nth (Params, 1)); Iter : constant Gtk_Tree_Iter := Get_Iter_From_String (M, Path_String); Old_Value : Boolean := False; Id : Natural := 0; begin Old_Value := Get_Boolean (M, Iter, Muttable_Column); Id := Integer'Value ( (Get_String (M, Get_Iter_From_String (M, Get_String (Nth (Params, 1))), Text_Column))); Ctrl_Change_Plugin_Record(Plugin.all).Sequencer(Id).played := Old_Value; Set (M, Iter, Muttable_Column, not Old_Value); end Muted_Edited; procedure Loop_Edited (Model : access GObject_Record'Class; Params : Glib.Values.GValues; Plugin : Abstract_Plugin_Access) is M : constant Gtk_Tree_Store := Gtk_Tree_Store (Model); Path_String : constant String := Get_String (Nth (Params, 1)); Iter : constant Gtk_Tree_Iter := Get_Iter_From_String (M, Path_String); Old_Value : Boolean; Id : Natural := 0; begin Old_Value := Get_Boolean (M, Iter, Loop_Column-3); Id := Integer'Value ( (Get_String (M, Get_Iter_From_String (M, Get_String (Nth (Params, 1))), Text_Column))); Ctrl_Change_Plugin_Record(Plugin.all).Sequencer(Id).In_Loop := not Old_Value; Set (M, Iter, Loop_Column-3, not Old_Value); end Loop_Edited; procedure Name_Edited (Model : access GObject_Record'Class; Params : Glib.Values.GValues; Plugin : Abstract_Plugin_Access) is M : constant Gtk_Tree_Store := Gtk_Tree_Store (Model); Path_String : constant String := Get_String (Nth (Params, 1)); Text_Value : constant Gvalue := Nth (Params, 2); Iter : constant Gtk_Tree_Iter := Get_Iter_From_String (M, Path_String); Id : Natural := 0; begin Id := Integer'Value ( (Get_String (M, Get_Iter_From_String (M, Get_String (Nth (Params, 1))), Text_Column))); begin Ctrl_Change_Plugin_Record(Plugin.all).Sequencer(Id).Ctrl_name := new String ' (Get_String(Text_Value)); Set (M, Iter, Cname_Column, (Get_String(Text_Value))); exception when Constraint_Error => null; end; end name_Edited; procedure CC_Edited (Model : access GObject_Record'Class; Params : Glib.Values.GValues; Plugin : Abstract_Plugin_Access) is M : constant Gtk_Tree_Store := Gtk_Tree_Store (Model); Path_String : constant String := Get_String (Nth (Params, 1)); Text_Value : constant GValue := Nth (Params, 2); Iter : constant Gtk_Tree_Iter := Get_Iter_From_String (M, Path_String); Id : Natural := 0; Value : Integer := 0; begin Id := Integer'Value ( (Get_String (M, Get_Iter_From_String (M, Get_String (Nth (Params, 1))), Text_Column))); begin Value := Integer'Value(Get_String(Text_Value)); if C.Long(Value) in Value_Type then Ctrl_Change_Plugin_Record(Plugin.all).Sequencer(Id).Ctrl_Num := value_Type(Value); end if; Set (M, Iter, CC_Column, Integer'Image(Value)); exception when Constraint_Error => null; end; end CC_Edited; procedure CV_Edited (Model : access GObject_Record'Class; Params : Glib.Values.GValues; Plugin : Abstract_Plugin_Access) is M : constant Gtk_Tree_Store := Gtk_Tree_Store (Model); Path_String : constant String := Get_String (Nth (Params, 1)); Text_Value : constant GValue := Nth (Params, 2); Iter : constant Gtk_Tree_Iter := Get_Iter_From_String (M, Path_String); Id : Natural := 0; Value : Integer := 0; begin Id := Integer'Value ( (Get_String (M, Get_Iter_From_String (M, Get_String (Nth (Params, 1))), Text_Column))); begin Value := Integer'Value(Get_String(Text_Value)); if C.Long(Value) in Value_Type then Ctrl_Change_Plugin_Record(Plugin.all).Sequencer(Id).Ctrl_val := value_Type(Value); end if; Set (M, Iter, CV_Column, Integer'Image(Value)); exception when Constraint_Error => null; end; end CV_Edited; procedure Bar_Edited (Model : access GObject_Record'Class; Params : Glib.Values.GValues; Plugin : Abstract_Plugin_Access) is M : constant Gtk_Tree_Store := Gtk_Tree_Store (Model); Path_String : constant String := Get_String (Nth (Params, 1)); Text_Value : constant GValue := Nth (Params, 2); Iter : constant Gtk_Tree_Iter := Get_Iter_From_String (M, Path_String); Id : Natural := 0; Value : Integer := 0; begin Id := Integer'Value ( (Get_String (M, Get_Iter_From_String (M, Get_String (Nth (Params, 1))), Text_Column))); begin Value := Integer'Value(Get_String(Text_Value)); Ctrl_Change_Plugin_Record(Plugin.all).Sequencer(Id).Bar := Value; Set (M, Iter, Bar_Column, Integer'Image(Value)); exception when Constraint_Error => null; end; end Bar_Edited; procedure Number_Edited (Model : access GObject_Record'Class; Params : Glib.Values.GValues; Plugin : Abstract_Plugin_Access) is M : constant Gtk_Tree_Store := Gtk_Tree_Store (Model); Path_String : constant String := Get_String (Nth (Params, 1)); Text_Value : constant GValue := Nth (Params, 2); Iter : constant Gtk_Tree_Iter := Get_Iter_From_String (M, Path_String); Id : Natural := 0; Value : Integer := 0; begin Id := Integer'Value ( (Get_String (M, Get_Iter_From_String (M, Get_String (Nth (Params, 1))), Text_Column))); begin Value := Integer'Value(Get_String(Text_Value)); Ctrl_Change_Plugin_Record(Plugin.all).Sequencer(Id).Number := Value; Set (M, Iter, Number_Column-3, Integer'Image(Value)); exception when Constraint_Error => null; end; end Number_Edited; procedure Step_Edited (Model : access GObject_Record'Class; Params : Glib.Values.GValues; Plugin : Abstract_Plugin_Access) is M : constant Gtk_Tree_Store := Gtk_Tree_Store (Model); Path_String : constant String := Get_String (Nth (Params, 1)); Text_Value : constant GValue := Nth (Params, 2); Iter : constant Gtk_Tree_Iter := Get_Iter_From_String (M, Path_String); Id : Natural := 0; Value : Integer := 0; begin Id := Integer'Value ( (Get_String (M, Get_Iter_From_String (M, Get_String (Nth (Params, 1))), Text_Column))); begin Value := Integer'Value(Get_String(Text_Value)); Ctrl_Change_Plugin_Record(Plugin.all).Sequencer(Id).Step := Value; Set (M, Iter, Step_Column-3, Integer'Image(Value)); exception when Constraint_Error => null; end; end Step_Edited; -- procedure Note_Edited (Model : access GObject_Record'Class; -- Params : Glib.Values.GValues; -- Plugin : Abstract_Plugin_Access) is -- M : constant Gtk_Tree_Store := Gtk_Tree_Store (Model); -- Path_String : constant String := Get_String (Nth (Params, 1)); -- Text_Value : constant GValue := Nth (Params, 2); -- Iter : constant Gtk_Tree_Iter := -- Get_Iter_From_String (M, Path_String); -- Id : Natural := 0; -- begin -- Id := Integer'Value -- ( -- (Get_String (M, Get_Iter_From_String  -- (M, Get_String (Nth (Params, 1))), Text_Column)));  -- Free(Ctrl_Change_Plugin_Record(Plugin.all).Sequencer(Id).Note); -- Ctrl_Change_Plugin_Record(Plugin.all).Sequencer(Id).Note := new String ' (Get_String (Text_Value)); -- Set_value (M, Iter, Type_Column+2, Text_value); -- end Note_Edited; ------------------ -- Add_Key_Line -- ------------------ function Add_Key_Line (Model : access Gtk_Tree_Store_Record'Class; Id : Integer; Cname : String; CC : Integer := 64; CV : Integer := 8; Bar : Integer := 1; Number : Integer := 1; Step : Integer := 1; Played : Boolean := True; Muttable : Boolean := False; In_Loop : Boolean := False; Parent : Gtk_Tree_Iter := Null_Iter) return Gtk_Tree_Iter is Iter : Gtk_Tree_Iter; begin --Put_Line("Add key 1.0"); Append (Model, Iter, Parent); --Put_Line("Add key 1.1"); Set (Model, Iter, Text_Column, Integer'Image(Id)); Set (Model, Iter, Cname_Column, Cname); Set (Model, Iter, CC_Column, Integer'Image(CC)); Set (Model, Iter, CV_Column, Integer'Image(CV)); Set (Model, Iter, Bar_Column, Integer'Image(Bar)); Set (Model, Iter, Number_Column-3, Integer'Image(Number)); Set (Model, Iter, Step_Column-3, Integer'Image(Step)); --Set (Model, Iter, Type_Column+2, Note);  Set (Model, Iter, Muttable_Column, Muttable); Set (Model, Iter, Loop_Column-3, In_Loop); Set (Model, Iter, Editable_Column+8, True); return Iter; end Add_Key_Line; procedure Bars_Max_Callback (Widget : access Gtk_Widget_Record'Class; Plugin : Abstract_Plugin_Access) is begin Ctrl_Change_Plugin_Record(Plugin.all).Bars_Max := Integer(Gtk.Spin_Button.Get_Value(Gtk_Spin_Button(Widget))); exception when others => null; end Bars_Max_Callback; package Plugin_Cb is new Gtk.Handlers.User_Callback (Gtk.Widget.Gtk_Widget_Record, Abstract_Plugin_Access); procedure Initialize (Spec : in out Ctrl_Change_Specifications; Plugin : in Abstract_Plugin_Access) is Scrolled : Gtk_Scrolled_Window; -- Comon Tree  Col : Gtk_Tree_View_Column; Num : Gint; Text_Render : Gtk_Cell_Renderer_Text; Toggle_Render : Gtk_Cell_Renderer_Toggle; Parent, Iter : Gtk_Tree_Iter; pragma Unreferenced (Num); pragma Warnings (Off, Iter); Vbox : Gtk_Vbox; begin Gtk_New (Spec.Sequencer_Model, (Text_column => GType_String, Cname_Column => GType_String, CC_Column => GType_String, CV_Column => GType_String, Bar_Column => GType_String, Number_Column-3 => GType_String, Step_Column-3 => GType_String, Muttable_Column => GType_Boolean, Loop_Column-3 => GType_Boolean, Editable_Column+8 => GType_Boolean) ); --Put_Line("Load seq 0.1"); Gtk_New (Spec.Sequencer_Tree, Spec.Sequencer_Model); --Put_Line("Load seq 0.1.1"); Set_Grid_Lines (Spec.Sequencer_Tree, Grid_Lines_Vertical); --Put_Line("Load seq 0.1.2"); Set_Enable_Tree_Lines (Spec.Sequencer_Tree, True); --Put_Line("Load seq 0.1.3"); Set_Rubber_Banding (Spec.Sequencer_Tree, True); --Put_Line("Load seq 0.1.4"); Set_Mode (Get_Selection (Spec.Sequencer_Tree), Selection_Multiple); --Put_Line("Load seq 0.1.5"); Gtk_New (Scrolled); --Put_Line("Load seq 0.1.6"); Set_Policy (Scrolled, Policy_Always, Policy_Always); --Put_Line("Load seq 0.1.7"); Add (Scrolled, Spec.Sequencer_Tree); --Put_Line("Load seq 0.1.8"); Gtk_New(Spec.Specifications_Frame, "Ctrl change sequencer : "); --Put_Line("Load seq 0.1.8.1"); Gtk_New(Spec.Bars_Max, 1.0, 257.0, 1.0); if Plugin /= null then Set_Value(Spec.Bars_Max, Gdouble(Ctrl_Change_Plugin_Record(Plugin.all).Bars_Max)); end if; --Put_Line("Load seq 0.1.8.2"); Plugin_Cb.Connect (Spec.Bars_Max, "value_changed", Plugin_Cb.To_Marshaller(Bars_Max_Callback'Access), User_Data => Plugin); --Put_Line("Load seq 0.1.8.3"); Gtk_New_Vbox(Vbox, Homogeneous => false); Gtk_New_Hbox(Spec.Hbox, Homogeneous => False); Gtk_New(Spec.Label, "Bars max : "); Pack_Start(Spec.Hbox, Spec.Label, False, False, 2); Pack_Start(Spec.Hbox, Spec.Bars_Max, False, False, 2); Pack_Start(Vbox, Spec.hbox, False, False, 2); Pack_End(Vbox, scrolled); Add (Spec.Specifications_Frame, Vbox); --Put_Line("Load seq 0.2"); Gtk_New (Text_Render); Gtk_New (Col); Num := Append_Column (Spec.Sequencer_Tree, Col); Set_Sort_Column_Id (Col, cname_Column); Set_Title (Col, "Id"); Pack_Start (Col, Text_Render, True); Set_Sizing (Col, Tree_View_Column_Autosize); Add_Attribute (Col, Text_Render, "text", Text_Column); --Put_Line("Load seq 0.3"); Gtk_New (Text_Render); Gtk_New (Col); Num := Append_Column (Spec.Sequencer_Tree, Col); Set_Sort_Column_Id (Col, cname_Column); Set_Title (Col, "Ctrl name"); Pack_Start (Col, Text_Render, True); Set_Sizing (Col, Tree_View_Column_Autosize); Add_Attribute (Col, Text_Render, "text", Cname_Column); Add_Attribute (Col, Text_Render, "editable", Editable_Column+8); Plugin_Object_CB.Object_Connect (Text_Render, "edited", name_Edited'Access, Slot_Object => Spec.Sequencer_Model, User_Data => Plugin); --Put_Line("Load seq 0.4"); Gtk_New (Text_Render); Gtk_New (Col); Num := Append_Column (Spec.Sequencer_Tree, Col); Set_Title (Col, "CC"); Pack_Start (Col, Text_Render, True); Set_Sizing (Col, Tree_View_Column_Autosize); Add_Attribute (Col, Text_Render, "text", CC_Column); Add_Attribute (Col, Text_Render, "editable", Editable_Column+8); Plugin_Object_CB.Object_Connect (Text_Render, "edited", CC_Edited'Access, Slot_Object => Spec.Sequencer_Model, User_Data => Plugin); --Put_Line("Load seq 0.5"); Gtk_New (Text_Render); Gtk_New (Col); Num := Append_Column (Spec.Sequencer_Tree, Col); Set_Title (Col, "CV"); Pack_Start (Col, Text_Render, True); Set_Sizing (Col, Tree_View_Column_Autosize); Add_Attribute (Col, Text_Render, "text", CV_Column); Add_Attribute (Col, Text_Render, "editable", Editable_Column+8); Plugin_Object_CB.Object_Connect (Text_Render, "edited", CV_Edited'Access, Slot_Object => Spec.Sequencer_Model, User_Data => Plugin); --Put_Line("Load seq 0.6"); Gtk_New (Text_Render); Gtk_New (Col); Set_Sort_Column_Id (Col, -1); -- unsortable Num := Append_Column (Spec.Sequencer_Tree, Col); Set_Title (Col, "Bar"); Pack_Start (Col, Text_Render, False); Add_Attribute (Col, Text_Render, "text", Bar_Column); Add_Attribute (Col, Text_Render, "editable", Editable_Column+8); Plugin_Object_CB.Object_Connect (Text_Render, "edited", Bar_Edited'Access, Slot_Object => Spec.Sequencer_Model, User_Data => Plugin); --Put_Line("Load seq 0.7"); Gtk_New (Text_Render); Gtk_New (Col); Set_Sort_Column_Id (Col, -1); -- unsortable Num := Append_Column (Spec.Sequencer_Tree, Col); Set_Title (Col, "Number"); Pack_Start (Col, Text_Render, False); Add_Attribute (Col, Text_Render, "text", Number_Column-3); Add_Attribute (Col, Text_Render, "editable", Editable_Column+8); Plugin_Object_CB.Object_Connect (Text_Render, "edited", Number_Edited'Access, Slot_Object => Spec.Sequencer_Model, User_Data => Plugin); --Put_Line("Load seq 0.8"); Gtk_New (Text_Render); --Put_Line("Load seq 0.8.1"); Gtk_New (Col); --Put_Line("Load seq 0.8.2"); Set_Sort_Column_Id (Col, -1); -- unsortable --Put_Line("Load seq 0.8.3"); Num := Append_Column (Spec.Sequencer_Tree, Col); --Put_Line("Load seq 0.8.4"); Set_Title (Col, "Step"); Pack_Start (Col, Text_Render, False); --Put_Line("Load seq 0.8.5"); Add_Attribute (Col, Text_Render, "text", Step_Column-3); --Put_Line("Load seq 0.8.6"); Add_Attribute (Col, Text_Render, "editable", Editable_Column+8); --Put_Line("Load seq 0.8.7"); Plugin_Object_CB.Object_Connect (Text_Render, "edited", Step_Edited'Access, Slot_Object => Spec.Sequencer_Model, User_Data => Plugin); -- --Put_Line("Load seq 0.9"); -- Gtk_New (Text_Render); -- Gtk_New (Col); -- Set_Sort_Column_Id (Col, -1); -- unsortable -- Num := Append_Column (Spec.Sequencer_Tree, Col); -- Set_Title (Col, "Note"); -- Pack_Start (Col, Text_Render, False); -- Add_Attribute (Col, Text_Render, "text", Editable_Column+9); -- Add_Attribute (Col, Text_Render, "editable", Editable_Column+9); -- Plugin_Object_CB.Object_Connect -- (Text_Render, "edited", Note_Edited'Access, -- Slot_Object => Spec.Sequencer_Model, -- User_Data => Plugin); --Put_Line("Load seq 0.10"); Gtk_New (Toggle_Render); Gtk_New (Col); Set_Sort_Column_Id (Col, -1); -- unsortable Num := Append_Column (Spec.Sequencer_Tree, Col); Set_Title (Col, "Mute"); Pack_Start (Col, Toggle_Render, False); Add_Attribute (Col, Toggle_Render, "active", Muttable_Column); Plugin_Object_CB.Object_Connect (Toggle_Render, "toggled", Muted_Edited'Access, Slot_Object => Spec.Sequencer_Model, User_Data => Plugin); --Put_Line("Load seq 0.11"); Gtk_New (Toggle_Render); Gtk_New (Col); Set_Sort_Column_Id (Col, -1); -- unsortable Num := Append_Column (Spec.Sequencer_Tree, Col); Set_Title (Col, "In loop"); Pack_Start (Col, Toggle_Render, False); Add_Attribute (Col, Toggle_Render, "active", Loop_Column-3); Plugin_Object_CB.Object_Connect (Toggle_Render, "toggled", loop_Edited'Access, Slot_Object => Spec.Sequencer_Model, User_Data => Plugin); --Put_Line("Load seq 0.12"); --Put_Line("Load seq 0.13"); Parent := Null_Iter; --Put_Line("Load seq 0.14"); for Count in Ctrl_Change_Plugin_Record(Plugin.all).Sequencer'range loop declare Voice : constant Ctrl_Change_Type := Ctrl_Change_Plugin_Record(Plugin.all).Sequencer(Count); begin --Put_Line("Load seq 0.15"); Iter := Add_Key_Line (Spec.Sequencer_Model, Id => count, Cname => Voice.Ctrl_Name.all, CC => Integer(Voice.Ctrl_num), CV => Integer(Voice.Ctrl_val), Bar => Integer(Voice.Bar), Number => Integer(Voice.Number), Step => Integer(Voice.Step), Played => Voice.Played, Muttable => not Voice.Played, In_Loop => Voice.In_Loop, Parent => Parent); --Put_Line("Load seq 0.16"); end; end loop; -- End Sequencer View --Put_Line("Load seq 1.0"); end Initialize; end Gmface.Gm_Application.Gtk_Ctrl_Change;