Codebase list guitarix / 8a077e8
Imported Upstream version 0.17.0 Ross Gammon 8 years ago
101 changed file(s) with 22207 addition(s) and 18535 deletion(s). Raw diff Collapse all Expand all
0 guitarfx 0.001
1 Copyright (C) brummer
0 guitarix
1 Copyright (C) Hermann Meyer, James Warden, Andreas Degert, Pete Shorthose
22 ---------------------------------------------------------------------
33 This program is free software; you can redistribute it and/or modify
44 it under the terms of the GNU General Public License as published by
1212
1313 You should have received a copy of the GNU General Public License
1414 along with this program; if not, write to the Free Software
15 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15 Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1616
1717 ----------------------------------------------------------------------------
1818
+0
-0
build-stamp less more
(Empty file)
0 guitarix2 (0.16.0) unstable; urgency=low
1 * fix install desktop file
2
3 -- brummer <brummer-@web.de> Tue, 09 Jun 2011 07:47:15 +0200
0 guitarix2 (0.17.0) unstable; urgency=low
1 * fix jack session support
2 * add 2 new amp models
3 * fix some speeling errors (patch by merlinthegreen)
4 * sorce code formating and cleanup (Google C++ Style Guide)
5
6 -- brummer <brummer-@web.de> Mon, 14 Jun 2011 05:37:35 +0200
7
8 guitarix2 (0.16.0svn) unstable; urgency=low
9 * SVN head
10
11 -- brummer <brummer-@web.de> Thu, 08 Jun 2011 15:47:15 +0200
412
513 guitarix2 (0.15.0svn) unstable; urgency=low
614 * SVN head
+0
-0
configure-stamp less more
(Empty file)
2424
2525 You should have received a copy of the GNU General Public License
2626 along with this package; if not, write to the Free Software
27 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
2828
2929 On Debian systems, the complete text of the GNU General
3030 Public License can be found in `/usr/share/common-licenses/GPL'.
+0
-1
debian/files less more
0 guitarix2_0.16.0_i386.deb sound extra
4848 dh_installdirs
4949
5050 # Add here commands to install the package into debian/guitarfx.
51 ./waf install --destdir=$(CURDIR)/debian/guitarix2
51 ./waf install --destdir=$(CURDIR)/debian/guitarix2
5252
5353
5454 # Build architecture-independent files here.
7373 gtk_widget_class_install_style_property_parser(
7474 GTK_WIDGET_CLASS(klass),
7575 g_param_spec_boxed("skin-gradient",
76 P_("Skin color"),
77 P_("Color gradient defined as part of skin"),
78 GX_TYPE_GRADIENT,
79 GParamFlags(GTK_PARAM_READABLE)),
80 gx_parse_gradient);
81 gtk_widget_class_install_style_property_parser(
82 GTK_WIDGET_CLASS(klass),
83 g_param_spec_boxed("box-gradient",
7684 P_("Skin color"),
7785 P_("Color gradient defined as part of skin"),
7886 GX_TYPE_GRADIENT,
341349 {
342350 GxGradient *grad;
343351 gtk_widget_style_get(wi, "skin-gradient", &grad, NULL);
352 if (!grad) {
353 GdkColor *p1 = &wi->style->bg[GTK_STATE_NORMAL];
354 cairo_pattern_add_color_stop_rgba(
355 pat, 0, cairo_clr(p1->red), cairo_clr(p1->green),
356 cairo_clr(p1->blue), 0.8);
357 GdkColor *p2 = &wi->style->fg[GTK_STATE_NORMAL];
358 cairo_pattern_add_color_stop_rgba(
359 pat, 1, (cairo_clr(p1->red)+cairo_clr(p2->red))/2,
360 (cairo_clr(p1->green)+cairo_clr(p2->green))/2,
361 (cairo_clr(p1->blue)+cairo_clr(p2->blue))/2, 0.8);
362 return;
363 }
364 GSList *p;
365 for (p = grad->colors; p; p = g_slist_next(p)) {
366 GxGradientElement *el = (GxGradientElement*)p->data;
367 cairo_pattern_add_color_stop_rgba(pat, el->offset, el->red, el->green, el->blue, el->alpha);
368 }
369 gx_gradient_free(grad);
370 }
371
372 // set cairo color related to the used skin
373 static void set_box_color(GtkWidget *wi, cairo_pattern_t *pat)
374 {
375 GxGradient *grad;
376 gtk_widget_style_get(wi, "box-gradient", &grad, NULL);
344377 if (!grad) {
345378 GdkColor *p1 = &wi->style->bg[GTK_STATE_NORMAL];
346379 cairo_pattern_add_color_stop_rgba(
956989 cairo_rectangle (cr, x0+4,y0+4,rect_width-8,rect_height-8);
957990 cairo_pattern_t*pat = cairo_pattern_create_linear (0, y0, 0, y0+rect_height);
958991 //set_rack_color(title, pat);
959 cairo_pattern_add_color_stop_rgba (pat, 1, 0, 0, 0.2, 0.8);
960 cairo_pattern_add_color_stop_rgba (pat, 0.8, 0, 0, 0, 0.8);
961 //cairo_pattern_add_color_stop_rgba (pat, 0, 0, 0, 0, 0);
962 cairo_pattern_add_color_stop_rgba (pat, 0.2, 0, 0, 0.2, 0.2);
992 set_box_color(wi, pat);
993 //cairo_pattern_add_color_stop_rgba (pat, 1, 0, 0, 0.2, 0.8);
994 //cairo_pattern_add_color_stop_rgba (pat, 0.8, 0, 0, 0, 0.8);
995
996 //cairo_pattern_add_color_stop_rgba (pat, 0.2, 0, 0, 0.2, 0.2);
963997 cairo_set_source (cr, pat);
964998 cairo_fill(cr);
965999
3535 msgstr "Tone"
3636
3737 #: ../src/gx_head/gx_interface_builder.cpp:187
38 msgid "Bass"
38 msgid "bass"
3939 msgstr "Bass"
4040
4141 #: ../src/gx_head/gx_interface_builder.cpp:190
42 msgid "Middle"
42 msgid "middle"
4343 msgstr "Mitten"
4444
4545 #: ../src/gx_head/gx_interface_builder.cpp:193
46 msgid "Treble"
46 msgid "treble"
4747 msgstr "Hòˆhen"
4848
4949 #: ../src/gx_head/gx_interface_builder.cpp:202
666666
667667 #. -- Create toolbar check menu item under Options submenu --
668668 #: ../src/gx_head/gx_main_interface.cpp:2898
669 msgid "show Plugin Bar"
669 msgid "Show Plugin Bar"
670670 msgstr "Zeige Plugin Bar"
671671
672672 #. -- Create mono rack check menu item under Options submenu --
673673 #: ../src/gx_head/gx_main_interface.cpp:2908
674 msgid "show Mono_Rack"
674 msgid "Show Mono _Rack"
675675 msgstr "Zeige Mono_Rack"
676676
677677 #. -- Create mono plugin menu soket item under Options submenu --
681681
682682 #. -- Create stereo rack check menu item under Options submenu --
683683 #: ../src/gx_head/gx_main_interface.cpp:2948
684 msgid "show _StereoRack"
684 msgid "Show _Stereo Rack"
685685 msgstr "Zeige _StereoRack"
686686
687687 #. -- Create stereo plugin menu soket item under Options submenu --
705705 msgstr "_Tuner"
706706
707707 #: ../src/gx_head/gx_main_interface.cpp:3022
708 msgid "set _Knobs linear"
708 msgid "Set _Knobs Linear"
709709 msgstr "Drehregler linear"
710710
711711 #. -- Create logbox check menu item under Options submenu --
3636 msgstr "tone"
3737
3838 #: ../src/gx_head/gx_interface_builder.cpp:193
39 msgid "Bass"
39 msgid "bass"
4040 msgstr "Bass"
4141
4242 #: ../src/gx_head/gx_interface_builder.cpp:196
43 msgid "Middle"
44 msgstr "Middle"
43 msgid "middle"
44 msgstr "middle"
4545
4646 #: ../src/gx_head/gx_interface_builder.cpp:199
47 msgid "Treble"
47 msgid "treble"
4848 msgstr "Treble"
4949
5050 #: ../src/gx_head/gx_interface_builder.cpp:208
584584 msgstr "tuner"
585585
586586 #: ../src/gx_head/gx_main_interface.cpp:2451
587 msgid "show tuner"
587 msgid "Show tuner"
588588 msgstr "mostrar afinador"
589589
590590 #: ../src/gx_head/gx_main_interface.cpp:2459
600600 msgstr "stereo rack"
601601
602602 #: ../src/gx_head/gx_main_interface.cpp:2472
603 msgid "show mono rack"
603 msgid "Show mono rack"
604604 msgstr "mostrar rack mono"
605605
606606 #: ../src/gx_head/gx_main_interface.cpp:2473
607 msgid "show stereo rack"
607 msgid "Show stereo rack"
608608 msgstr "mostrar rack stereo"
609609
610610 #: ../src/gx_head/gx_main_interface.cpp:2486
777777
778778 #. -- Create mono rack check menu item under Options submenu --
779779 #: ../src/gx_head/gx_main_interface.cpp:3139
780 msgid "show Mono_Rack"
780 msgid "Show Mono _Rack"
781781 msgstr "Mostrar Rack Mono"
782782
783783 #. -- Create mono plugin menu soket item under Options submenu --
787787
788788 #. -- Create stereo rack check menu item under Options submenu --
789789 #: ../src/gx_head/gx_main_interface.cpp:3179
790 msgid "show _StereoRack"
790 msgid "Show _Stereo Rack"
791791 msgstr "Mostrar Rack Estéreo"
792792
793793 #. -- Create stereo plugin menu soket item under Options submenu --
811811 msgstr "Afinador"
812812
813813 #: ../src/gx_head/gx_main_interface.cpp:3259
814 msgid "set _Knobs linear"
815 msgstr "set _Knobs linear"
814 msgid "Set _Knobs Linear"
815 msgstr "Set _Knobs Linear"
816816
817817 #. -- Create logbox check menu item under Options submenu --
818818 #: ../src/gx_head/gx_main_interface.cpp:3269
819 msgid "show _Logging Box"
819 msgid "Show _Logging Box"
820820 msgstr "Mostrar mensajes"
821821
822822 #. -- Create menu item to control tooltip display --
3030 msgstr "Timbre"
3131
3232 #: ../src/gx_head/gx_interface_builder.cpp:187
33 msgid "Bass"
33 msgid "bass"
3434 msgstr "Grave"
3535
3636 #: ../src/gx_head/gx_interface_builder.cpp:190
37 msgid "Middle"
37 msgid "middle"
3838 msgstr "MĂ©dium"
3939
4040 #: ../src/gx_head/gx_interface_builder.cpp:193
41 msgid "Treble"
41 msgid "treble"
4242 msgstr "Aigu"
4343
4444 #: ../src/gx_head/gx_interface_builder.cpp:202
661661
662662 #. -- Create toolbar check menu item under Options submenu --
663663 #: ../src/gx_head/gx_main_interface.cpp:2898
664 msgid "show Plugin Bar"
664 msgid "Show Plugin Bar"
665665 msgstr "Affiche barre de greffons"
666666
667667 #. -- Create mono rack check menu item under Options submenu --
668668 #: ../src/gx_head/gx_main_interface.cpp:2908
669 msgid "show Mono_Rack"
669 msgid "Show Mono _Rack"
670670 msgstr "Afficher le rack mono"
671671
672672 #. -- Create mono plugin menu soket item under Options submenu --
676676
677677 #. -- Create stereo rack check menu item under Options submenu --
678678 #: ../src/gx_head/gx_main_interface.cpp:2948
679 msgid "show _StereoRack"
679 msgid "Show _Stereo Rack"
680680 msgstr "Afficher le rack stéréo"
681681
682682 #. -- Create stereo plugin menu soket item under Options submenu --
700700 msgstr "_Tuner"
701701
702702 #: ../src/gx_head/gx_main_interface.cpp:3022
703 msgid "set _Knobs linear"
703 msgid "Set _Knobs Linear"
704704 msgstr "contrôle linéaire des boutons"
705705
706706 #. -- Create logbox check menu item under Options submenu --
3838 msgstr "tone"
3939
4040 #: ../src/gx_head/gx_interface_builder.cpp:193
41 msgid "Bass"
41 msgid "bass"
4242 msgstr "Bass"
4343
4444 #: ../src/gx_head/gx_interface_builder.cpp:196
45 msgid "Middle"
45 msgid "middle"
4646 msgstr "Middle"
4747
4848 #: ../src/gx_head/gx_interface_builder.cpp:199
49 msgid "Treble"
49 msgid "treble"
5050 msgstr "Treble"
5151
5252 #: ../src/gx_head/gx_interface_builder.cpp:208
592592 msgstr "accordatore"
593593
594594 #: ../src/gx_head/gx_main_interface.cpp:2456
595 msgid "show tuner"
595 msgid "Show tuner"
596596 msgstr "mostra accordatore"
597597
598598 #: ../src/gx_head/gx_main_interface.cpp:2464
608608 msgstr "rack stereo"
609609
610610 #: ../src/gx_head/gx_main_interface.cpp:2477
611 msgid "show mono rack"
611 msgid "Show mono rack"
612612 msgstr "mostra rack mono"
613613
614614 #: ../src/gx_head/gx_main_interface.cpp:2478
615 msgid "show stereo rack"
615 msgid "Show stereo rack"
616616 msgstr "mostra rack stereo"
617617
618618 #: ../src/gx_head/gx_main_interface.cpp:2491
785785
786786 #. -- Create mono rack check menu item under Options submenu --
787787 #: ../src/gx_head/gx_main_interface.cpp:3144
788 msgid "show Mono_Rack"
788 msgid "Show Mono _Rack"
789789 msgstr "mostra il Rack Mono"
790790
791791 #. -- Create mono plugin menu soket item under Options submenu --
795795
796796 #. -- Create stereo rack check menu item under Options submenu --
797797 #: ../src/gx_head/gx_main_interface.cpp:3184
798 msgid "show _StereoRack"
798 msgid "Show _Stereo Rack"
799799 msgstr "mostra il Rack Stereo"
800800
801801 #. -- Create stereo plugin menu soket item under Options submenu --
819819 msgstr "_Accordatore"
820820
821821 #: ../src/gx_head/gx_main_interface.cpp:3264
822 msgid "set _Knobs linear"
822 msgid "Set _Knobs Linear"
823823 msgstr "_Manopole Lineari"
824824
825825 #. -- Create logbox check menu item under Options submenu --
826826 #: ../src/gx_head/gx_main_interface.cpp:3274
827 msgid "show _Logging Box"
827 msgid "Show _Logging Box"
828828 msgstr "mostra i Messaggi"
829829
830830 #. -- Create menu item to control tooltip display --
3737 msgstr ""
3838
3939 #: ../src/gx_head/gx_interface_builder.cpp:193
40 msgid "Bass"
40 msgid "bass"
4141 msgstr ""
4242
4343 #: ../src/gx_head/gx_interface_builder.cpp:196
44 msgid "Middle"
44 msgid "middle"
4545 msgstr ""
4646
4747 #: ../src/gx_head/gx_interface_builder.cpp:199
48 msgid "Treble"
48 msgid "treble"
4949 msgstr ""
5050
5151 #: ../src/gx_head/gx_interface_builder.cpp:208
506506 msgstr ""
507507
508508 #: ../src/gx_head/gx_srack_builder.cc:349
509 msgid "reamp"
509 msgid "postamp"
510510 msgstr ""
511511
512512 #: ../src/gx_head/gx_srack_builder.cc:368
603603 msgstr ""
604604
605605 #: ../src/gx_head/gx_main_interface.cpp:2500
606 msgid "show tuner"
606 msgid "Show tuner"
607607 msgstr ""
608608
609609 #: ../src/gx_head/gx_main_interface.cpp:2508
619619 msgstr ""
620620
621621 #: ../src/gx_head/gx_main_interface.cpp:2521
622 msgid "show mono rack"
622 msgid "Show mono rack"
623623 msgstr ""
624624
625625 #: ../src/gx_head/gx_main_interface.cpp:2522
626 msgid "show stereo rack"
626 msgid "Show stereo rack"
627627 msgstr ""
628628
629629 #: ../src/gx_head/gx_main_interface.cpp:2535
804804
805805 #. -- Create mono rack check menu item under Options submenu --
806806 #: ../src/gx_head/gx_main_interface.cpp:3257
807 msgid "show Mono_Rack"
807 msgid "Show Mono _Rack"
808808 msgstr ""
809809
810810 #. -- Create mono plugin menu soket item under Options submenu --
814814
815815 #. -- Create stereo rack check menu item under Options submenu --
816816 #: ../src/gx_head/gx_main_interface.cpp:3297
817 msgid "show _StereoRack"
817 msgid "Show _Stereo Rack"
818818 msgstr ""
819819
820820 #. -- Create stereo plugin menu soket item under Options submenu --
838838 msgstr ""
839839
840840 #: ../src/gx_head/gx_main_interface.cpp:3377
841 msgid "set _Knobs linear"
841 msgid "Set _Knobs Linear"
842842 msgstr ""
843843
844844 #. -- Create logbox check menu item under Options submenu --
845845 #: ../src/gx_head/gx_main_interface.cpp:3387
846 msgid "show _Logging Box"
846 msgid "Show _Logging Box"
847847 msgstr ""
848848
849849 #. -- Create menu item to control tooltip display --
Binary diff not shown
Binary diff not shown
4545 { 0, 19661, 19661, 19661, 65536 }, # 0, 0.3, 0.3, 0.3 ,1
4646 { 32768, 9830, 9830, 9830, 65536 }, # 0.5, 0.15, 0.15, 0.15, 1
4747 { 65536, 6554, 6554, 6554, 65536 }} # 1, 0.1, 0.1, 0.1, 1
48 stock["gxhead"] = {{"gxhead.png"}}
48
49 GxPaintBox::box-gradient = {
50 { 65536, 0, 0, 13107, 52428 }, # 1, 0, 0, 0.2, 0.8
51 { 52428, 0, 0, 0, 52428 }, # 0.8, 0, 0, 0, 0.8
52 { 13107, 0, 0, 13107, 13107 }} # 0.2, 0, 0, 0.2, 0.2
53
54 GxPaintBox::width =600
55 GxPaintBox::height =180
56 stock["main_image"] = {{"gx18.png"}}
57 stock["gxhead"] = {{"gxhead.png"}}
4958 GxPaintBox::icon-set =1
5059 }
5160
283292 widget "*.value_label" style:highest "gx_head-l_black"
284293 widget "*.beffekt_label" style:highest "gx_head-b_black"
285294 widget "*.rack_label" style:highest "gx_head-rack"
295 widget "*.rack_effect_label" style:highest "gx_head-rack"
286296 widget "*.rack_slider" style:highest "gx_rack-slider"
287297 widget "*.rack_regler" style:highest "gx_rack-slider"
288298
4545 { 0, 9830, 19661, 9830, 65536 }, # 0, 0.3, 0.3, 0.3 ,1
4646 { 32768, 6554, 9830, 6554, 65536 }, # 0.5, 0.15, 0.15, 0.15, 1
4747 { 65536, 6554, 6554, 6554, 65536 }} # 1, 0.1, 0.1, 0.1, 1
48
49 GxPaintBox::box-gradient = {
50 { 65536, 0, 0, 13107, 52428 }, # 1, 0, 0, 0.2, 0.8
51 { 52428, 0, 0, 0, 52428 }, # 0.8, 0, 0, 0, 0.8
52 { 13107, 0, 0, 13107, 13107 }} # 0.2, 0, 0, 0.2, 0.2
53
4854 GxPaintBox::icon-set =5
4955 GxPaintBox::width =600
5056 GxPaintBox::height =180
289295 widget "*.value_label" style:highest "gx2_head-l_black"
290296 widget "*.beffekt_label" style:highest "gx2_head-b_black"
291297 widget "*.rack_label" style:highest "gx2_head-rack"
298 widget "*.rack_effect_label" style:highest "gx2_head-rack"
292299 widget "*.rack_slider" style:highest "gx2_rack-slider"
293300 widget "*.rack_regler" style:highest "gx2_rack-slider"
294301
5353 { 0, 19661, 19661, 19661, 65536 }, # 0, 0.3, 0.3, 0.3, 1
5454 { 32768, 9830, 9830, 9830, 65536 }, # 0.5, 0.15, 0.15, 1
5555 { 65536, 6554, 6554, 6554, 65536 }} # 1, 0.1, 0.1, 0.1, 1
56 stock["gxhead"] = {{"gxhead.png"}}
56
57 GxPaintBox::box-gradient = {
58 { 0, 19661, 19661, 19661, 65536 }, # 0, 0.3, 0.3, 0.3, 1
59 { 32768, 9830, 9830, 9830, 65536 }, # 0.5, 0.15, 0.15, 1
60 { 65536, 6554, 6554, 6554, 65536 }} # 1, 0.1, 0.1, 0.1, 1
61
62 GxPaintBox::width =600
63 GxPaintBox::height =180
64 stock["main_image"] = {{"gx-dezert_18.png"}}
65 stock["gxhead"] = {{"gxhead.png"}}
5766 }
5867 class "GxPaintBox" style "gx_dezert-paintbox"
5968
312321 widget "*.value_label" style:highest "gx_dezert-l_black"
313322 widget "*.beffekt_label" style:highest "gx_dezert-b_black"
314323 widget "*.rack_label" style:highest "gx_dezert-rack"
324 widget "*.rack_effect_label" style:highest "gx_dezert-rack"
315325 widget "*.rack_slider" style:highest "gx_dezert_rack-slider"
316326 widget "*.rack_regler" style:highest "gx_dezert_rack-slider"
317327
3838 { 0, 983, 983, 983, 65536 }, # 0, 0.3, 0.3, 0.3 ,1
3939 { 32768, 6554, 6554, 6554, 65536 }, # 0.5, 0.15, 0.15, 0.15, 1
4040 { 65536, 6554, 6554, 6554, 65536 }} # 1, 0.1, 0.1, 0.1, 1
41
42 GxPaintBox::box-gradient = {
43 { 65536, 0, 0, 0, 52428 }, # 1, 0, 0, 0., 0.8
44 { 52428, 0, 0, 0, 52428 }, # 0.8, 0, 0, 0, 0.8
45 { 13107, 0, 0, 0, 13107 }} # 0.2, 0, 0, 0., 0.2
46
47 GxPaintBox::width =600
48 GxPaintBox::height =180
49 stock["main_image"] = {{"gx_black18.png"}}
4150 stock["gxhead"] = {{"gx_black18.png"}}
4251 GxPaintBox::icon-set =4
4352 }
280289 widget "*.value_label" style:highest "gx4_head-l_black"
281290 widget "*.beffekt_label" style:highest "gx4_head-b_black"
282291 widget "*.rack_label" style:highest "gx4_head-rack"
292 widget "*.rack_effect_label" style:highest "gx4_head-rack"
283293 widget "*.rack_slider" style:highest "gx4_rack-slider"
284294 widget "*.rack_regler" style:highest "gx4_rack-slider"
285295 widget "*.barbutton" style:highest "gx4_barbutton_style"
0 #
1 # This is the GTK rc style file for gx5_head
2 #
3
4 include "common.rc"
5
6 style "gx5_head_skin_icons"
7 {
8 stock["bigknob"] = {{"tactile_knob_large_151f.png"}}
9 stock["smallknob"] = {{"tactile_knob_small_99f.png"}}
10 stock["smallknobr"] = {{"tactile_knob_medium_151f.png"}}
11 }
12
13 class "GxKnob" style "gx5_head_skin_icons"
14
15 style "gx5_head_skin_switch_icons"
16 {
17 stock["switchit_on"] = {{"tactile_backlit_switchit_on.png"}}
18 stock["switchit_off"] = {{"tactile_backlit_switchit_off.png"}}
19 }
20
21 class "GxToggleImage" style "gx5_head_skin_switch_icons"
22
23
24 style "gx5_head_skin_knob_animation"
25 {
26
27 GxKnob::framecount = 0 # use 0 for auto (assumes square frames),
28 # 1 for static bg and >1 for non squareframe
29 # animations
30 }
31
32 class "GxKnob" style "gx2_head_skin_knob_animation"
33
34
35 style "gx5_head-paintbox"
36 {
37 GxPaintBox::skin-gradient = {
38 { 65536, 983, 983, 983, 65536 }, # 0, 0.3, 0.3, 0.3 ,1
39 { 32768, 62768, 62768, 62768, 65536 }, # 0.5, 0.15, 0.15, 0.15, 1
40 { 0, 22760, 22760, 22760, 65536 }} # 1, 0.1, 0.1, 0.1, 1
41
42 GxPaintBox::box-gradient = {
43 { 65536, 0, 0, 0, 65536 }, # 1, 0, 0, 0., 1.0
44 { 0, 0, 0, 0, 52428 }, # 0.8, 0, 0, 0, 0.8
45 { 13107, 13107, 13107, 13107, 39321 }} # 0.2, 0.2, 0.2, 0.2, 0.6
46
47 GxPaintBox::width =600
48 GxPaintBox::height =180
49 stock["main_image"] = {{"gx_gree18.png"}}
50 stock["gxhead"] = {{"gx_gree18.png"}}
51 GxPaintBox::icon-set =5
52 }
53
54 class "GxPaintBox" style "gx5_head-paintbox"
55
56 style "gx5_head"
57 {
58
59
60 GtkButton::default_border = { 0, 0, 0, 0 }
61 GtkButton::default_outside_border = { 0, 0, 0, 0 }
62 GtkButton::button_relief = GTK_RELIEF_NONE
63
64 #strings in modules
65 fg[NORMAL] = { 0.3, 0.35, 0.35 }
66 fg[ACTIVE] = { 1.0, 1.0, 1.0 }
67 fg[PRELIGHT] = { 0.90, 0.90, 0.90 }
68 fg[INSENSITIVE] = { 0.80, 0.80, 0.80 }
69 fg[SELECTED] = { 0.70, 0.70, 0.70 }
70 #background in modules
71 bg[NORMAL] = { 0.020, 0.020, 0.010 }
72 bg[PRELIGHT] = "#303084"
73 bg[ACTIVE] = { 0.0, 0.0, 0.0 }
74 bg[INSENSITIVE] = "#c4c0c0"
75 bg[SELECTED] = "#000094"
76
77 #gridlines in modules
78 text[NORMAL] = { 0.00, 0.10, 0.10 }
79 text[ACTIVE] = { 0.00, 0.80, 0.80 }
80 text[PRELIGHT] = { 0.80, 0.80, 0.80 }
81 text[INSENSITIVE] = { 0.80, 0.80, 0.80}
82 text[SELECTED] = { 1.0, 1.0, 1.0 }
83
84 base[ACTIVE] = "#272a2f"
85 base[NORMAL] = { 0.00, 0.70, 0.70 }
86 base[PRELIGHT] = { 0.20, 0.20, 0.20 }
87 base[INSENSITIVE] = "#4c5159"
88 base[SELECTED] = { 0.25, 0.25, 0.25 }
89 font_name = "sans 10"
90
91 }
92
93
94 class "GtkWidget" style:highest "gx5_head"
95 class "GtkLabel" style:highest "gx5_head"
96 class "GtkHScale" style:highest "gx5_head"
97 class "GtkVScale" style:highest "gx5_head"
98 class "GtkCheckButton" style:highest "gx5_head"
99 class "GtkButton" style:highest "gx5_head"
100 class "GtkFrame" style:highest "gx5_head"
101 class "GtkExpander" style:highest "gx5_head"
102 #class "GtkEventBox" style:highest "gx5_head"
103
104 style "gx5_head-event"
105 {
106 bg_pixmap[NORMAL] = "gx_gree18.png"
107 }
108 widget "*.osc_box" style:highest "gx5_head-event"
109 widget "*.main_window" style:highest "gx5_head-event"
110
111 style "gx5_head-dialog"
112 {
113 bg_pixmap[NORMAL] = "cairo1.jpg"
114 }
115
116 style "gx5_gree_box"
117 {
118 bg[NORMAL] = { 0, 0, 0}
119 }
120 widget "*.gree_box" style:highest "gx5_gree_box"
121
122 style "gx5_gree_box"
123 {
124 bg[NORMAL] = { 0.02, 0.015, 0.02}
125 }
126 widget "*.gree_box" style:highest "gx5_gree_box"
127
128 style "gx5_dark_box"
129 {
130 bg[NORMAL] = { 0.25, 0.15, 0.15}
131 }
132 widget "*.dark_box" style:highest "gx5_dark_box"
133
134 style "gx5_darker_box"
135 {
136 bg[NORMAL] = { 0.1, 0.05, 0.05}
137 }
138 widget "*.darker_box" style:highest "gx5_darker_box"
139
140 #widget_class "GtkDialog*" style:highest "gx5_head-dialog"
141
142 style "gx5_head-menu"
143 {
144 #text in menues
145 fg[NORMAL] = { 0.80, 0.80, 0.80 }
146 fg[PRELIGHT] = { 0.6, 0.6, 0.6 }
147 #buttons-borders in menues
148 bg[NORMAL] = { 0.30, 0.30, 0.30 }
149 bg[PRELIGHT] = { 0.0, 0.0, 0.0 }
150 bg[SELECTED] = { 0.10, 0.10, 0.10 }
151 #arrows in menues
152 text[NORMAL] = { 0.20, 0.0, 0.50 }
153 text[ACTIVE] = { 0.80, 0.80, 0.80 }
154 text[PRELIGHT] = { 0.0, 0.0, 0.0 }
155
156 base[ACTIVE] = { 0.020, 0.020, 0.020 }
157 #buttons-background in menues
158 base[NORMAL] = { 0.60, 0.80, 0.80 }
159 base[PRELIGHT] = { 0.20, 0.20, 0.20 }
160 base[INSENSITIVE] = "#4c5159"
161 base[SELECTED] = { 0.25, 0.25, 0.25 }
162 font_name = "sans 9"
163 }
164
165 widget_class "*GtkMenu*" style:highest "gx5_head-menu"
166 widget_class "*GtkMenuBar*" style:highest "gx5_head-menu"
167
168 style "gx5_b_style"
169 {
170 engine "pixmap"
171 {
172 image
173 {
174 function = BOX
175 recolorable = TRUE
176 state = NORMAL
177 shadow = OUT
178 file = "cairo2.jpg"
179 border = { 0, 0, 0, 0 }
180 stretch = TRUE
181 }
182 image
183 {
184 function = BOX
185 recolorable = TRUE
186 state = PRELIGHT
187 shadow = OUT
188 file = "cairo1.jpg"
189 border = { 0, 0, 0, 0 }
190 stretch = TRUE
191 }
192 image
193 {
194 function = BOX
195 recolorable = TRUE
196 state = ACTIVE
197 shadow = OUT
198 file = "cairo2.jpg"
199 border = { 0, 0, 0, 0 }
200 stretch = TRUE
201 }
202 }
203 bg[ACTIVE] = "#43434f"
204 }
205
206 style "gx5_barbutton_style"
207 {
208
209 bg[ACTIVE] = "#43434f"
210
211 bg[PRELIGHT] = "#63636f"
212
213 fg[NORMAL] = { 0.6, 0.6, 0.6 }
214 fg[ACTIVE] = "#090915"
215 fg[PRELIGHT] = { 0.9, 0.9, 0.9 }
216
217 }
218
219 style "gx5_c_style"
220 {
221 engine "pixmap"
222 {
223 image
224 {
225 function = BOX
226 recolorable = TRUE
227 state = NORMAL
228 shadow = OUT
229 file = "cairo1.jpg"
230 border = { 0, 0, 0, 0 }
231 stretch = TRUE
232 }
233
234 }
235 }
236
237 style "gx5_head-l_gree"
238 {
239 fg[NORMAL] = { 0.1, 0.1, 0.1 }
240 fg[ACTIVE] = { 0.8, 0.8, 0.8 }
241 fg[PRELIGHT] = { 1.0, 1.0, 1.0 }
242 fg[INSENSITIVE] = { 0.8, 0.8, 0.8 }
243 fg[SELECTED] = { 0.8, 0.8, 0.8 }
244 font_name = "Zapf Chancery Medium Italic 12, URW Chancery L Medium Italic 12"
245
246 }
247
248 style "gx5_head-v_gree"
249 {
250 fg[NORMAL] = { 0., 0., 0. }
251 fg[ACTIVE] = { 0.8, 0.8, 0.8 }
252 fg[PRELIGHT] = { 1.0, 1.0, 1.0 }
253 fg[INSENSITIVE] = { 0.8, 0.8, 0.8 }
254 fg[SELECTED] = { 0.8, 0.8, 0.8 }
255 font_name = "Zapf Chancery Medium Italic 12, URW Chancery L Medium Italic 12"
256
257 }
258
259 style "gx5_head-b_gree"
260 {
261 fg[NORMAL] = { 0.6, 0.6, 0.6 }
262 fg[ACTIVE] = { 0.2, 0.2, 0.2 }
263 fg[PRELIGHT] = { 1.0, 1.0, 1.0 }
264 fg[INSENSITIVE] = { 0.1, 0.0, 0.0 }
265 fg[SELECTED] = { 0.8, 0.8, 0.8 }
266 font_name = "sans 9"
267 }
268
269 style "gx5_head-rack"
270 {
271 #text for fx-parameter-captions
272 fg[NORMAL] = { 0.8, 0.8, 0.8 }
273 fg[ACTIVE] = { 0.2, 0.2, 0.2 }
274 fg[PRELIGHT] = { 1.0, 1.0, 1.0 }
275 fg[INSENSITIVE] = { 0.0, 0.0, 0.0 }
276 fg[SELECTED] = { 0.8, 0.8, 0.8 }
277 font_name = "Zapf Chancery Medium Italic 12, URW Chancery L Medium Italic 12"
278 }
279
280 style "gx5_effect-rack"
281 {
282 #text for fx-parameter-captions
283 fg[NORMAL] = { 0.05, 0.05, 0.15 }
284 fg[ACTIVE] = { 0.2, 0.2, 0.2 }
285 fg[PRELIGHT] = { 1.0, 1.0, 1.0 }
286 fg[INSENSITIVE] = { 0.0, 0.0, 0.0 }
287 fg[SELECTED] = { 0.8, 0.8, 0.8 }
288 font_name = "Zapf Chancery Medium Italic 12, URW Chancery L Medium Italic 12"
289
290 }
291
292 style "gx5_rack-slider"
293 {
294 fg[NORMAL] = { 0.7, 0.7, 0.7 }
295 fg[ACTIVE] = { 0.2, 0.2, 0.2 }
296 fg[PRELIGHT] = { 1.0, 1.0, 1.0 }
297 fg[INSENSITIVE] = { 0.0, 0.0, 0.0 }
298 fg[SELECTED] = { 0.8, 0.8, 0.8 }
299 font_name = "sans 6"
300 }
301
302 widget "*.effekt_label" style:highest "gx5_head-v_gree"
303 widget "*.value_label" style:highest "gx5_head-l_gree"
304 widget "*.beffekt_label" style:highest "gx5_head-b_gree"
305 widget "*.rack_label" style:highest "gx5_head-rack"
306 widget "*.rack_effect_label" style:highest "gx5_effect-rack"
307 widget "*.rack_slider" style:highest "gx5_rack-slider"
308 widget "*.rack_regler" style:highest "gx5_rack-slider"
309 widget "*.barbutton" style:highest "gx5_barbutton_style"
310 widget "*.barbuttonlabel" style:highest "gx5_barbutton_style"
311
312
313 style "gx5_h_style"
314 {
315 engine "pixmap"
316 {
317 image
318 {
319 function = BOX
320 recolorable = TRUE
321 state = NORMAL
322 shadow = OUT
323 file = "cairo1.jpg"
324 border = { 0, 0, 0, 0 }
325 stretch = TRUE
326 }
327 }
328 #text midi-controller-module
329 fg[NORMAL] = { 0.60, 0.70, 0.60 }
330 #border midi-controller-module
331 bg[NORMAL] = { 0.09, 0.09, 0.07 }
332 #text midi-controller-module list
333 text[NORMAL] = { 0.6, 0.7, 0.4 }
334 text[ACTIVE] = { 0.70, 0.70, 0.70 }
335 text[PRELIGHT] = { 0.90, 0.90, 0.90 }
336 text[INSENSITIVE] = { 0.80, 0.80, 0.80}
337 text[SELECTED] = { 1.0, 1.0, 1.0 }
338 #background midi-controller-module
339 base[ACTIVE] = { 0.090, 0.010, 0.010 }
340 base[NORMAL] = { 0.20, 0.30, 0.20 }
341 #background midi-controller-module checkbox
342 base[PRELIGHT] = { 0.70, 0.20, 0.20 }
343 base[INSENSITIVE] = "#4c5159"
344 base[SELECTED] = { 0.25, 0.25, 0.25 }
345 }
346
347 class "GtkHandleBox" style:highest "gx5_h_style"
348 #class "GtkScrolledWindow" style:highest "gx5_h_style"
349 widget_class "GtkDialog*" style:highest "gx5_h_style"
350 widget_class "*GtkToggleButton*" style:highest "gx5_b_style"
351 class "GtkButton" style:highest "gx5_b_style"
352 class "GtkSpinButton" style:highest "gx5_c_style"
353
354 style "tagx5_b_style"
355 {
356 #file-chooser background
357 bg[NORMAL] = { 0.20, 0.20, 0.20 }
358 bg[ACTIVE] = { 0.03, 0.04, 0.04 }
359 bg[PRELIGHT] = { 0.05, 0.06, 0.06 }
360 bg[SELECTED] = { 0.0, 0.0, 0.0 }
361
362 }
363
364
365 widget "*.tab_rack" style:highest "tagx5_b_style"
366
367 style "gx5_head_p_style"
368 {
369 engine "pixmap"
370 {
371 image
372 {
373 function = BOX
374 recolorable = TRUE
375 state = NORMAL
376 shadow = OUT
377 file = "cairo2.jpg"
378 border = { 0, 0, 0, 0 }
379 stretch = TRUE
380 }
381 image
382 {
383 function = BOX
384 recolorable = TRUE
385 state = PRELIGHT
386 shadow = OUT
387 file = "cairo1.jpg"
388 border = { 0, 0, 0, 0 }
389 stretch = TRUE
390 }
391 }
392 fg[NORMAL] = { 0.9, 0.9, 0.9 }
393 fg[ACTIVE] = { 0.7, 0.7, 0.7 }
394 fg[PRELIGHT] = { 0.0, 1.0, 1.0 }
395 fg[INSENSITIVE] = { 0.3, 0.3, 0.3 }
396 fg[SELECTED] = { 0.8, 0.8, 0.8 }
397 font_name = "sans 7"
398 }
399
400 style "gx5_head_pa_style"
401 {
402 engine "pixmap"
403 {
404 image
405 {
406 function = BOX
407 recolorable = TRUE
408 state = NORMAL
409 shadow = OUT
410 file = "cairo2.jpg"
411 border = { 0, 0, 0, 0 }
412 stretch = TRUE
413 }
414 image
415 {
416 function = BOX
417 recolorable = TRUE
418 state = PRELIGHT
419 shadow = OUT
420 file = "cairo1.jpg"
421 border = { 0, 0, 0, 0 }
422 stretch = TRUE
423 }
424 image
425 {
426 function = BOX
427 recolorable = TRUE
428 state = INSENSITIVE
429 shadow = OUT
430 file = "cairo2.jpg"
431 border = { 0, 0, 0, 0 }
432 stretch = TRUE
433 }
434 }
435 bg[NORMAL] = { 0.05, 0.05, 0.05 }
436
437 }
438
439 style "gx5_head_pair_style"
440 {
441 engine "pixmap"
442 {
443 image
444 {
445 function = BOX
446 recolorable = TRUE
447 state = NORMAL
448 shadow = OUT
449 file = "cairo2.jpg"
450 border = { 0, 0, 0, 0 }
451 stretch = TRUE
452 }
453 image
454 {
455 function = BOX
456 recolorable = TRUE
457 state = PRELIGHT
458 shadow = OUT
459 file = "cairo1.jpg"
460 border = { 0, 0, 0, 0 }
461 stretch = TRUE
462 }
463 image
464 {
465 function = BOX
466 recolorable = TRUE
467 state = INSENSITIVE
468 shadow = OUT
469 file = "cairo2.jpg"
470 border = { 0, 0, 0, 0 }
471 stretch = TRUE
472 }
473 }
474 bg[NORMAL] = { 0.9, 0.0, 0.0 }
475
476 text[NORMAL] = { 0.90, 0.90, 0.90 }
477 text[ACTIVE] = { 0.80, 0.80, 0.80 }
478 text[PRELIGHT] = { 0.80, 0.80, 0.80 }
479 text[INSENSITIVE] = { 0.30, 0.30, 0.30}
480 text[SELECTED] = { 1.0, 1.0, 1.0 }
481 }
482
483 widget "*.effect_reset" style:highest "gx5_head_p_style"
484 widget "*.label_reset" style:highest "gx5_head_p_style"
485 widget_class "*GtkScrolledWindow*" style:highest "gx5_head_pa_style"
486 widget "*.rack_button" style:highest "gx5_head_pa_style"
487 widget_class "*GtkComboBox*" style:highest "gx5_head_pair_style"
99 'gxhead.png',
1010 'gx_green18.png',
1111 'gx_black18.png',
12 'gx_gree18.png',
1213 'gx_green1.jpg',
1314 'gx_green2.jpg',
1415 'gx_head_gx1-alloy.rc',
1516 'gx_head_gx2-emerald.rc',
1617 'gx_head_gx3-dezert.rc',
1718 'gx_head_gx4-black.rc',
19 'gx_head_gx5-gree.rc',
1820 'gx-dezert_18.png',
1921 'gx_dezert_12b.png',
2022 'gx_dezert_14b.png',
0 declare name "amp2";
1
2 import("music.lib");
3 import("filter.lib");
4 import("effect.lib");
5 import("guitarix.lib");
6
7 /****************************************************************
8 ** Tube Preamp Emulation stage 1 - 2
9 */
10
11 val(x) = valve.vt(dist, q(x), x)
12 with {
13 dist = 40.1;
14 q(x) = lp1tm1(x) * 1 - lp2tm1(x) * 1.02 - 1.0 : clip(-1,-0.01);
15 lp(a) = *(1 - a) : + ~ *(a);
16 lp1tm1 = abs <: lp(0.9999), _ : max;
17 avgs = lp1tm1 : avg;
18 avg_size = SR/9;
19 avg(x) = x - delay1s(avg_size,x) : + ~ _ : /(avg_size);
20 lp2tm1 = avgs : lp(0.999);
21 };
22
23
24 tubestage(tb,fck,Rk) = tube : hpf with {
25 lpfk = lowpass1(fck);
26 Ftube = ffunction(float Ftube3(int,float), "valve.h", "");
27 vplus = 130.0;
28 divider = 10;
29 Rp = 100.0e3;
30 tube = (+ : Ftube(tb)) ~ (-(vplus) : *(Rk/Rp) : lpfk) : /(divider);
31 hpf = highpass1(31.0);
32 };
33
34 tubeax(preamp,gain1) = hgroup("stage1", stage1) :
35 hgroup("stage2", stage2)
36 with {
37
38 stage1 = tubestage(0,86.0,2700.0) : - ~ tubestage(1,132.0,1500.0) : *(preamp):
39 lowpass1(6531.0) : tubestage(1,132.0,1500.0): + ~ tubestage(1,194.0,820.0) ;
40 stage2 = lowpass1(6531.0) : tubestage(1,194.0,820.0) : *(gain1);
41
42 } ;
43
44
45 process = val : component("gxdistortion.dsp").dist1(vslider(".gxdistortion.drive[alias]",0.35, 0, 1, 0.01),vslider(".gxdistortion.wet_dry[alias]", 100, 0, 100, 1) : /(100)) : tubeax(preamp,gain1) with {
46 preamp = (vslider(".amp2.stage1.Pregain[alias]",0,-20,20,0.1):db2linear : smoothi(0.999));
47 gain1 = vslider(".amp2.stage2.gain1[alias]", 6, -20.0, 20.0, 0.1) : db2linear : smoothi(0.999);
48 } ;
49
0 declare name "amp2";
1
2 import("music.lib");
3 import("filter.lib");
4 import("effect.lib");
5 import("guitarix.lib");
6
7 /****************************************************************
8 ** Tube Preamp Emulation stage 1 - 2
9 */
10
11 val(x) = valve.vt(dist, q(x), x)
12 with {
13 dist = 40.1;
14 q(x) = lp1tm1(x) * 1 - lp2tm1(x) * 1.02 - 1.0 : clip(-1,-0.01);
15 lp(a) = *(1 - a) : + ~ *(a);
16 lp1tm1 = abs <: lp(0.9999), _ : max;
17 avgs = lp1tm1 : avg;
18 avg_size = SR/9;
19 avg(x) = x - delay1s(avg_size,x) : + ~ _ : /(avg_size);
20 lp2tm1 = avgs : lp(0.999);
21 };
22
23
24 tubestage(tb,fck,Rk) = tube : hpf with {
25 lpfk = lowpass1(fck);
26 Ftube = ffunction(float Ftube4(int,float), "valve.h", "");
27 vplus = 130.0;
28 divider = 20;
29 Rp = 100.0e3;
30 tube = (+ : Ftube(tb)) ~ (-(vplus) : *(Rk/Rp) : lpfk) : /(divider);
31 hpf = highpass1(31.0);
32 };
33
34 tubeax(preamp,gain1) = hgroup("stage1", stage1) :
35 hgroup("stage2", stage2)
36 with {
37
38 stage1 = tubestage(0,86.0,2700.0) : - ~ tubestage(1,132.0,1500.0) : *(preamp):
39 lowpass1(6531.0) : tubestage(1,132.0,1500.0): + ~ tubestage(1,194.0,820.0) ;
40 stage2 = lowpass1(6531.0) : tubestage(1,194.0,820.0) : *(gain1);
41
42 } ;
43
44
45 process = val : component("gxdistortion.dsp").dist1(vslider(".gxdistortion.drive[alias]",0.35, 0, 1, 0.01),vslider(".gxdistortion.wet_dry[alias]", 100, 0, 100, 1) : /(100)) : tubeax(preamp,gain1) with {
46 preamp = (vslider(".amp2.stage1.Pregain[alias]",0,-20,20,0.1):db2linear : smoothi(0.999));
47 gain1 = vslider(".amp2.stage2.gain1[alias]", 6, -20.0, 20.0, 0.1) : db2linear : smoothi(0.999);
48 } ;
49
0 declare name "amp";
1
2 import("music.lib");
3 import("filter.lib");
4 import("effect.lib");
5 import("guitarix.lib");
6 import("maxmsp.lib");
7
8 /****************************************************************
9 ** Tube Preamp Emulation stage 1 - 2
10 */
11
12
13 notch1(x) = notch(x,9645.,-12.,14.1);
14 notch2(x) = notch(x,7890.,-17.,7.1);
15 notch3(x) = notch(x,5046.,-12.,19.1);
16
17 tubestage(tb,fck,Rk) = tube : hpf with {
18 lpfk = lowpass1(fck);
19 Ftube = ffunction(float Ftube4(int,float), "valve.h", "");
20 vplus = 130.0;
21 divider = 20;
22 Rp = 100.0e3;
23 tube = (+ : Ftube(tb)) ~ (-(vplus) : *(Rk/Rp) : lpfk) : /(divider);
24 hpf = highpass1(31.0);
25 };
26
27 tubestage2(tb,fck,Rk) = tube : hpf with {
28 lpfk = lowpass1(fck);
29 Ftube = ffunction(float Ftube2(int,float), "valve.h", "");
30 vplus = 250.0;
31 divider = 40;
32 Rp = 100.0e3;
33 tube = (+ : Ftube(tb)) ~ (-(vplus) : *(Rk/Rp) : lpfk) : /(divider);
34 hpf = highpass1(31.0);
35 };
36
37 gx_drive(drive) = _ <: _ + nonlin(4,4,0.125) * drive * 10 ;
38
39 process = hgroup("amp2", hgroup("stage1", stage1) :
40 component("gxdistortion.dsp").dist2(vslider(".gxdistortion.drive[alias]",0.35, 0, 1, 0.01),vslider(".gxdistortion.wet_dry[alias]", 100, 0, 100, 1) : /(100)) :
41 hgroup("stage2", stage2)
42 ) with {
43
44 preamp = (vslider(".amp2.stage1.Pregain[alias]",0,-20,20,0.1):db2linear : smoothi(0.999));
45 stage1 = speakerbp(310.0, 12000.0) :
46 *(preamp): (tubestage(0,86.0,2700.0) : + ~ tubestage(1,132.0,1500.0)):
47 lowpass1(6531.0) : (tubestage(1,132.0,1500.0) : + ~ tubestage(1,194.0,820.0)) : tubestage(1,194.0,820.0) ;
48 stage2 = lowpass1(6531.0) : *(gain1) <: ((min(0.7,tubestage2(1,6531.0,410.0))),(max(-0.75,tubestage2(0,6531.0,410.0)))) :>
49 notch1 : notch2 : notch3
50 with {
51 gain1 = vslider(".amp2.stage2.gain1[alias]", 6, -20.0, 20.0, 0.1) : db2linear : smoothi(0.999);
52 } ;
53 };
54
0 declare name "amp";
1
2 import("music.lib");
3 import("filter.lib");
4 import("effect.lib");
5 import("guitarix.lib");
6 import("maxmsp.lib");
7
8 /****************************************************************
9 ** Tube Preamp Emulation stage 1 - 2
10 */
11
12
13 notch1(x) = notch(x,9645.,-12.,14.1);
14 notch2(x) = notch(x,7890.,-17.,7.1);
15 notch3(x) = notch(x,5046.,-12.,19.1);
16
17 tubestage(tb,fck,Rk) = tube : hpf with {
18 lpfk = lowpass1(fck);
19 Ftube = ffunction(float Ftube(int,float), "valve.h", "");
20 vplus = 250.0;
21 divider = 40;
22 Rp = 100.0e3;
23 tube = (+ : Ftube(tb)) ~ (-(vplus) : *(Rk/Rp) : lpfk) : /(divider);
24 hpf = highpass1(31.0);
25 };
26
27 tubestage2(tb,fck,Rk) = tube : hpf with {
28 lpfk = lowpass1(fck);
29 Ftube = ffunction(float Ftube2(int,float), "valve.h", "");
30 vplus = 250.0;
31 divider = 40;
32 Rp = 100.0e3;
33 tube = (+ : Ftube(tb)) ~ (-(vplus) : *(Rk/Rp) : lpfk) : /(divider);
34 hpf = highpass1(31.0);
35 };
36
37 gx_drive(drive) = _ <: _ + nonlin(4,4,0.125) * drive * 10 ;
38
39 process = hgroup("amp2", hgroup("stage1", stage1) :
40 component("gxdistortion.dsp").dist2(vslider(".gxdistortion.drive[alias]",0.35, 0, 1, 0.01),vslider(".gxdistortion.wet_dry[alias]", 100, 0, 100, 1) : /(100)) :
41 hgroup("stage2", stage2)
42 ) with {
43
44 preamp = (vslider(".amp2.stage1.Pregain[alias]",0,-20,20,0.1):db2linear : smoothi(0.999));
45 stage1 = speakerbp(310.0, 12000.0) :
46 *(preamp): (tubestage(0,86.0,2700.0) : + ~ tubestage(1,132.0,1500.0)):
47 lowpass1(6531.0) : (tubestage(1,132.0,1500.0) : + ~ tubestage(1,194.0,820.0)) : tubestage(1,194.0,820.0) ;
48 stage2 = lowpass1(6531.0) : *(gain1) <: ((min(0.7,tubestage2(1,6531.0,410.0))),(max(-0.75,tubestage2(0,6531.0,410.0)))) :>
49 notch1 : notch2 : notch3
50 with {
51 gain1 = vslider(".amp2.stage2.gain1[alias]", 6, -20.0, 20.0, 0.1) : db2linear : smoothi(0.999);
52 } ;
53 };
54
0 declare name "amp";
1
2 import("music.lib");
3 import("filter.lib");
4 import("effect.lib");
5 import("guitarix.lib");
6 import("maxmsp.lib");
7
8 /****************************************************************
9 ** Tube Preamp Emulation stage 1 - 2
10 */
11
12
13 notch1(x) = notch(x,9645.,-12.,14.1);
14 notch2(x) = notch(x,7890.,-17.,7.1);
15 notch3(x) = notch(x,5046.,-12.,19.1);
16
17 tubestage(tb,fck,Rk) = tube : hpf with {
18 lpfk = lowpass1(fck);
19 Ftube = ffunction(float Ftube3(int,float), "valve.h", "");
20 vplus = 250.0;
21 divider = 40;
22 Rp = 100.0e3;
23 tube = (+ : Ftube(tb)) ~ (-(vplus) : *(Rk/Rp) : lpfk) : /(divider);
24 hpf = highpass1(31.0);
25 };
26
27 tubestage2(tb,fck,Rk) = tube : hpf with {
28 lpfk = lowpass1(fck);
29 Ftube = ffunction(float Ftube2(int,float), "valve.h", "");
30 vplus = 250.0;
31 divider = 40;
32 Rp = 100.0e3;
33 tube = (+ : Ftube(tb)) ~ (-(vplus) : *(Rk/Rp) : lpfk) : /(divider);
34 hpf = highpass1(31.0);
35 };
36
37 gx_drive(drive) = _ <: _ + nonlin(4,4,0.125) * drive * 10 ;
38
39 process = hgroup("amp2", hgroup("stage1", stage1) :
40 component("gxdistortion.dsp").dist2(vslider(".gxdistortion.drive[alias]",0.35, 0, 1, 0.01),vslider(".gxdistortion.wet_dry[alias]", 100, 0, 100, 1) : /(100)) :
41 hgroup("stage2", stage2)
42 ) with {
43
44 preamp = (vslider(".amp2.stage1.Pregain[alias]",0,-20,20,0.1):db2linear : smoothi(0.999));
45 stage1 = speakerbp(310.0, 12000.0) :
46 *(preamp):*(2.0): (tubestage(0,86.0,2700.0) : + ~ tubestage(1,132.0,1500.0)):
47 lowpass1(6531.0) : (tubestage(1,132.0,1500.0) : + ~ tubestage(1,194.0,820.0)) : tubestage(1,194.0,820.0) ;
48 stage2 = lowpass1(6531.0) : *(gain1) <: ((min(0.7,tubestage2(1,6531.0,410.0))),(max(-0.75,tubestage2(0,6531.0,410.0)))) :>
49 notch1 : notch2 : notch3
50 with {
51 gain1 = vslider(".amp2.stage2.gain1[alias]", 6, -20.0, 20.0, 0.1) : db2linear : smoothi(0.999);
52 } ;
53 };
54
0 declare name "amp2";
1
2 import("music.lib");
3 import("filter.lib");
4 import("effect.lib");
5 import("guitarix.lib");
6
7 /****************************************************************
8 ** Tube Preamp Emulation stage 1 - 2
9 */
10
11 val(x) = valve.vt(dist, q(x), x)
12 with {
13 dist = 40.1;
14 q(x) = lp1tm1(x) * 1 - lp2tm1(x) * 1.02 - 1.0 : clip(-1,-0.01);
15 lp(a) = *(1 - a) : + ~ *(a);
16 lp1tm1 = abs <: lp(0.9999), _ : max;
17 avgs = lp1tm1 : avg;
18 avg_size = SR/9;
19 avg(x) = x - delay1s(avg_size,x) : + ~ _ : /(avg_size);
20 lp2tm1 = avgs : lp(0.999);
21 };
22
23
24 tubestage(tb,fck,Rk) = tube : hpf with {
25 lpfk = lowpass1(fck);
26 Ftube = ffunction(float Ftube(int,float), "valve.h", "");
27 vplus = 250.0;
28 divider = 40;
29 Rp = 100.0e3;
30 tube = (+ : Ftube(tb)) ~ (-(vplus) : *(Rk/Rp) : lpfk) : /(divider);
31 hpf = highpass1(31.0);
32 };
33
34 tubeax(preamp,gain1) = hgroup("stage1", stage1) :
35 hgroup("stage2", stage2)
36 with {
37
38 stage1 = tubestage(0,86.0,2700.0) : - ~ tubestage(1,132.0,1500.0) : *(preamp):
39 lowpass1(6531.0) : tubestage(1,132.0,1500.0): + ~ tubestage(1,194.0,820.0) ;
40 stage2 = lowpass1(6531.0) : tubestage(1,194.0,820.0) : *(gain1);
41
42 } ;
43
44
45 process = val : component("gxdistortion.dsp").dist1(vslider(".gxdistortion.drive[alias]",0.35, 0, 1, 0.01),vslider(".gxdistortion.wet_dry[alias]", 100, 0, 100, 1) : /(100)) : tubeax(preamp,gain1) with {
46 preamp = (vslider(".amp2.stage1.Pregain[alias]",0,-20,20,0.1):db2linear : smoothi(0.999));
47 gain1 = vslider(".amp2.stage2.gain1[alias]", 6, -20.0, 20.0, 0.1) : db2linear : smoothi(0.999);
48 } ;
49
107107
108108 //----------distortion---------
109109
110 val(x) = valve.vt(dist, q(x), x)
111 with {
112 dist = 40.1;
113 q(x) = lp1tm1(x) * 1 - lp2tm1(x) * 1.02 - 1.0 : clip(-1,-0.01);
114 lp(a) = *(1 - a) : + ~ *(a);
115 lp1tm1 = abs <: lp(0.9999), _ : max;
116 avgs = lp1tm1 : avg;
117 avg_size = SR/9;
118 avg(x) = x - delay1s(avg_size,x) : + ~ _ : /(avg_size);
119 lp2tm1 = avgs : lp(0.999);
120 };
121
110122 //-distortion
111123
112124 distdrive(drive) = wet_dry_mix(wet_dry, _: distortion) with {
127139 wet_dry = (drive - 0.5) * 2;
128140 };
129141
142 clipit = min(0.7) : max(-0.7) ;
143
130144 gx_drive(drive) = _ <: _ + nonlin(4,4,0.125) * drive * 10 ;
131145
132146 wetdry = vslider("wet_dry[name:wet/dry]", 100, 0, 100, 1) : /(100);
139153
140154 };
141155
156 dist1(drive,wetdry) =_<:(*(dry): gx_drive(drive)),(*(wetdry) <: (clipit: cubicnl(drive,0.0) : * (0.5)),distdrive(drive) :>_):>_
157 with{
158
159 dry = 1 - wetdry;
160
161 };
162
163 dist2(drive,wetdry) =_<:(*(dry: smoothi(0.999)): gx_drive(drive)),(*(wetdry: smoothi(0.999)):val :distdrive(drive)):>_
164 with{
165
166 dry = 1 - wetdry;
167
168 };
142169
143170 process = distdrive;
144144 'gxamp3.dsp',
145145 'gxamp4.dsp',
146146 'gxamp5.dsp',
147 'gxamp6.dsp',
148 'gxamp7.dsp',
149 'gxamp8.dsp',
150 'gxamp9.dsp',
147151 'gxamp10.dsp',
152 'gxamp11.dsp',
148153 'gxamp12.dsp',
154 'gxamp13.dsp',
149155 'gx_ampmodul.dsp',
150156 'gxfeed.dsp',
151157 'gx_feedback.dsp',
170176 'chorus_mono.dsp',
171177 'stereodelay.dsp',
172178 'stereoecho.dsp',
179
173180 ]
174181
175182
252252 fRec16[0] = ((fSlow3 * fTemp2) - (fConst32 * ((fConst30 * fRec16[2]) + (fConst28 * fRec16[1]))));
253253 double fTemp3 = (fRec16[2] + (fRec16[0] + (2 * fRec16[1])));
254254 fVec0[0] = fTemp3;
255 fRec15[0] = ((fConst34 * ((fConst33 * fVec0[1]) + (fConst0 * fVec0[0]))) + (fConst2 * fRec15[1]));
255 fRec15[0] = ((fConst34 * ((fConst0 * fVec0[0]) + (fConst33 * fVec0[1]))) + (fConst2 * fRec15[1]));
256256 fRec14[0] = ((fConst36 * ((fConst35 * fRec15[1]) + (fConst21 * fRec15[0]))) + (fConst26 * fRec14[1]));
257257 fRec13[0] = (fRec14[0] - (fConst24 * ((fConst22 * fRec13[2]) + (fConst20 * fRec13[1]))));
258258 fRec12[0] = ((fConst24 * (((fConst19 * fRec13[0]) + (fConst37 * fRec13[1])) + (fConst19 * fRec13[2]))) - (fConst17 * ((fConst16 * fRec12[2]) + fTemp1)));
0 namespace gxamp11 {
1 // generated from file '../src/faust/gxamp11.dsp'
2
3 FAUSTFLOAT& fslider0 = get_alias("amp2.stage2.gain1");
4 double fRec0[2];
5 double fConst0;
6 double fConst1;
7 double fConst2;
8 double fConst3;
9 double fConst4;
10 double fConst5;
11 FAUSTFLOAT& fslider1 = get_alias("amp2.stage1.Pregain");
12 double fRec8[2];
13 double fConst6;
14 double fConst7;
15 double fConst8;
16 double fConst9;
17 double fConst10;
18 double fConst11;
19 double fConst12;
20 double fConst13;
21 double fConst14;
22 double fConst15;
23 double fConst16;
24 double fConst17;
25 double fConst18;
26 double fConst19;
27 double fConst20;
28 double fConst21;
29 double fConst22;
30 double fConst23;
31 double fConst24;
32 double fConst25;
33 double fConst26;
34 double fConst27;
35 double fConst28;
36 double fConst29;
37 double fConst30;
38 double fConst31;
39 double fConst32;
40 double fRec21[2];
41 int IOTA;
42 double fVec0[65536];
43 int iConst33;
44 double fRec20[2];
45 double fConst34;
46 double fRec19[2];
47 FAUSTFLOAT& fslider2 = get_alias("gxdistortion.wet_dry");
48 double fRec18[3];
49 double fVec1[2];
50 double fConst35;
51 double fConst36;
52 double fRec17[2];
53 double fConst37;
54 double fConst38;
55 double fRec16[2];
56 double fRec15[3];
57 double fConst39;
58 double fRec14[3];
59 double fRec13[3];
60 FAUSTFLOAT& fslider3 = get_alias("gxdistortion.drive");
61 double fConst40;
62 double fConst41;
63 double fConst42;
64 double fConst43;
65 double fConst44;
66 double fConst45;
67 double fConst46;
68 double fConst47;
69 double fConst48;
70 double fRec27[2];
71 double fRec26[3];
72 double fVec2[2];
73 double fConst49;
74 double fRec25[2];
75 double fRec24[3];
76 double fVec3[2];
77 double fConst50;
78 double fConst51;
79 double fRec23[2];
80 double fRec22[3];
81 double fConst52;
82 double fRec29[2];
83 double fRec28[3];
84 double fConst53;
85 double fRec32[2];
86 double fRec31[3];
87 double fConst54;
88 double fRec30[3];
89 double fVec4[2];
90 double fConst55;
91 double fRec12[2];
92 double fConst56;
93 double fConst57;
94 double fConst58;
95 double fVec5[2];
96 double fConst59;
97 double fRec33[2];
98 double fRec11[2];
99 double fConst60;
100 double fRec10[2];
101 double fConst61;
102 double fConst62;
103 double fConst63;
104 double fVec6[2];
105 double fConst64;
106 double fRec36[2];
107 double fRec35[2];
108 double fRec34[2];
109 double fRec9[2];
110 double fVec7[2];
111 double fConst65;
112 double fRec7[2];
113 double fVec8[2];
114 double fRec37[2];
115 double fRec6[2];
116 double fRec5[2];
117 double fConst66;
118 double fConst67;
119 double fConst68;
120 double fVec9[2];
121 double fConst69;
122 double fRec40[2];
123 double fRec39[2];
124 double fRec38[2];
125 double fRec4[2];
126 double fRec3[2];
127 double fVec10[2];
128 double fRec41[2];
129 double fRec2[2];
130 double fRec1[2];
131 int fSamplingFreq;
132
133 void init(int samplingFreq)
134 {
135 fSamplingFreq = samplingFreq;
136 for (int i=0; i<2; i++) fRec0[i] = 0;
137 fConst0 = (1.0 / tan((97.38937226128358 / fSamplingFreq)));
138 fConst1 = (1 + fConst0);
139 fConst2 = (0 - ((1 - fConst0) / fConst1));
140 fConst3 = (1.0 / tan((20517.741620594938 / fSamplingFreq)));
141 fConst4 = (1 + fConst3);
142 fConst5 = (0 - ((1 - fConst3) / fConst4));
143 for (int i=0; i<2; i++) fRec8[i] = 0;
144 fConst6 = tan((942.4777960769379 / fSamplingFreq));
145 fConst7 = (1.0 / faustpower<2>(fConst6));
146 fConst8 = (2 * (1 - fConst7));
147 fConst9 = (1.0 / fConst6);
148 fConst10 = (1 + ((fConst9 - 1.0) / fConst6));
149 fConst11 = (1.0 / (1 + ((1.0 + fConst9) / fConst6)));
150 fConst12 = tan((3769.9111843077517 / fSamplingFreq));
151 fConst13 = (1.0 / faustpower<2>(fConst12));
152 fConst14 = (2 * (1 - fConst13));
153 fConst15 = (1.0 / fConst12);
154 fConst16 = (1 + ((fConst15 - 1.0) / fConst12));
155 fConst17 = (1.0 / (1 + ((1.0 + fConst15) / fConst12)));
156 fConst18 = tan((10053.096491487338 / fSamplingFreq));
157 fConst19 = (1.0 / faustpower<2>(fConst18));
158 fConst20 = (2 * (1 - fConst19));
159 fConst21 = (1.0 / fConst18);
160 fConst22 = (1 + ((fConst21 - 1.0000000000000004) / fConst18));
161 fConst23 = (1 + ((1.0000000000000004 + fConst21) / fConst18));
162 fConst24 = (1.0 / fConst23);
163 fConst25 = (1 + fConst21);
164 fConst26 = (0 - ((1 - fConst21) / fConst25));
165 fConst27 = tan((47123.8898038469 / fSamplingFreq));
166 fConst28 = (2 * (1 - (1.0 / faustpower<2>(fConst27))));
167 fConst29 = (1.0 / fConst27);
168 fConst30 = (1 + ((fConst29 - 1.414213562373095) / fConst27));
169 fConst31 = (1 + ((1.414213562373095 + fConst29) / fConst27));
170 fConst32 = (1.0 / fConst31);
171 for (int i=0; i<2; i++) fRec21[i] = 0;
172 IOTA = 0;
173 for (int i=0; i<65536; i++) fVec0[i] = 0;
174 iConst33 = int((int((0.1111111111111111 * fSamplingFreq)) & 65535));
175 for (int i=0; i<2; i++) fRec20[i] = 0;
176 fConst34 = (0.009000000000000008 / fSamplingFreq);
177 for (int i=0; i<2; i++) fRec19[i] = 0;
178 for (int i=0; i<3; i++) fRec18[i] = 0;
179 for (int i=0; i<2; i++) fVec1[i] = 0;
180 fConst35 = (0 - fConst0);
181 fConst36 = (1.0 / (fConst1 * fConst31));
182 for (int i=0; i<2; i++) fRec17[i] = 0;
183 fConst37 = (0 - fConst21);
184 fConst38 = (1.0 / fConst25);
185 for (int i=0; i<2; i++) fRec16[i] = 0;
186 for (int i=0; i<3; i++) fRec15[i] = 0;
187 fConst39 = (2 * (0 - fConst19));
188 for (int i=0; i<3; i++) fRec14[i] = 0;
189 for (int i=0; i<3; i++) fRec13[i] = 0;
190 fConst40 = (1 + ((fConst9 - 1.0000000000000004) / fConst6));
191 fConst41 = (1.0 / (1 + ((fConst9 + 1.0000000000000004) / fConst6)));
192 fConst42 = (1 + fConst9);
193 fConst43 = (0 - ((1 - fConst9) / fConst42));
194 fConst44 = (1 + ((fConst15 - 1.0000000000000004) / fConst12));
195 fConst45 = (1 + ((fConst15 + 1.0000000000000004) / fConst12));
196 fConst46 = (1.0 / fConst45);
197 fConst47 = (1 + fConst15);
198 fConst48 = (0 - ((1 - fConst15) / fConst47));
199 for (int i=0; i<2; i++) fRec27[i] = 0;
200 for (int i=0; i<3; i++) fRec26[i] = 0;
201 for (int i=0; i<2; i++) fVec2[i] = 0;
202 fConst49 = (1.0 / (fConst47 * fConst23));
203 for (int i=0; i<2; i++) fRec25[i] = 0;
204 for (int i=0; i<3; i++) fRec24[i] = 0;
205 for (int i=0; i<2; i++) fVec3[i] = 0;
206 fConst50 = (0 - fConst9);
207 fConst51 = (1.0 / (fConst42 * fConst45));
208 for (int i=0; i<2; i++) fRec23[i] = 0;
209 for (int i=0; i<3; i++) fRec22[i] = 0;
210 fConst52 = (2 * (0 - fConst7));
211 for (int i=0; i<2; i++) fRec29[i] = 0;
212 for (int i=0; i<3; i++) fRec28[i] = 0;
213 fConst53 = (0 - fConst15);
214 for (int i=0; i<2; i++) fRec32[i] = 0;
215 for (int i=0; i<3; i++) fRec31[i] = 0;
216 fConst54 = (2 * (0 - fConst13));
217 for (int i=0; i<3; i++) fRec30[i] = 0;
218 for (int i=0; i<2; i++) fVec4[i] = 0;
219 fConst55 = (1.5848931924611136 / fConst4);
220 for (int i=0; i<2; i++) fRec12[i] = 0;
221 fConst56 = (1.0 / tan((270.1769682087222 / fSamplingFreq)));
222 fConst57 = (1 + fConst56);
223 fConst58 = (0 - ((1 - fConst56) / fConst57));
224 for (int i=0; i<2; i++) fVec5[i] = 0;
225 fConst59 = (0.027 / fConst57);
226 for (int i=0; i<2; i++) fRec33[i] = 0;
227 for (int i=0; i<2; i++) fRec11[i] = 0;
228 fConst60 = (0.1 / fConst1);
229 for (int i=0; i<2; i++) fRec10[i] = 0;
230 fConst61 = (1.0 / tan((414.6902302738527 / fSamplingFreq)));
231 fConst62 = (1 + fConst61);
232 fConst63 = (0 - ((1 - fConst61) / fConst62));
233 for (int i=0; i<2; i++) fVec6[i] = 0;
234 fConst64 = (0.015 / fConst62);
235 for (int i=0; i<2; i++) fRec36[i] = 0;
236 for (int i=0; i<2; i++) fRec35[i] = 0;
237 for (int i=0; i<2; i++) fRec34[i] = 0;
238 for (int i=0; i<2; i++) fRec9[i] = 0;
239 for (int i=0; i<2; i++) fVec7[i] = 0;
240 fConst65 = (1.0 / fConst4);
241 for (int i=0; i<2; i++) fRec7[i] = 0;
242 for (int i=0; i<2; i++) fVec8[i] = 0;
243 for (int i=0; i<2; i++) fRec37[i] = 0;
244 for (int i=0; i<2; i++) fRec6[i] = 0;
245 for (int i=0; i<2; i++) fRec5[i] = 0;
246 fConst66 = (1.0 / tan((609.4689747964198 / fSamplingFreq)));
247 fConst67 = (1 + fConst66);
248 fConst68 = (0 - ((1 - fConst66) / fConst67));
249 for (int i=0; i<2; i++) fVec9[i] = 0;
250 fConst69 = (0.0082 / fConst67);
251 for (int i=0; i<2; i++) fRec40[i] = 0;
252 for (int i=0; i<2; i++) fRec39[i] = 0;
253 for (int i=0; i<2; i++) fRec38[i] = 0;
254 for (int i=0; i<2; i++) fRec4[i] = 0;
255 for (int i=0; i<2; i++) fRec3[i] = 0;
256 for (int i=0; i<2; i++) fVec10[i] = 0;
257 for (int i=0; i<2; i++) fRec41[i] = 0;
258 for (int i=0; i<2; i++) fRec2[i] = 0;
259 for (int i=0; i<2; i++) fRec1[i] = 0;
260 }
261
262 void compute(int count, float *input0, float *output0)
263 {
264 double fSlow0 = (0.0010000000000000009 * pow(10,(0.05 * fslider0)));
265 double fSlow1 = (0.0010000000000000009 * pow(10,(0.05 * fslider1)));
266 double fSlow2 = fslider2;
267 double fSlow3 = (0.00024937655860349125 * fSlow2);
268 double fSlow4 = fslider3;
269 double fSlow5 = pow(1e+01,(0.8 * fSlow4));
270 double fSlow6 = pow(1e+01,(2 * fSlow4));
271 double fSlow7 = (fConst41 * fSlow6);
272 double fSlow8 = (fConst41 * pow(1e+01,(0.9 * fSlow4)));
273 double fSlow9 = pow(1e+01,(1.2 * fSlow4));
274 double fSlow10 = (2 * (fSlow4 - 0.5));
275 double fSlow11 = (1 - max(0, (0 - fSlow10)));
276 double fSlow12 = (1 - (0.01 * fSlow2));
277 double fSlow13 = (0.024937655860349125 * fSlow12);
278 double fSlow14 = (1.25 * fSlow4);
279 double fSlow15 = (0.00024937655860349125 * (fSlow2 * (1 - max(0, fSlow10))));
280 for (int i=0; i<count; i++) {
281 fRec0[0] = (fSlow0 + (0.999 * fRec0[1]));
282 fRec8[0] = (fSlow1 + (0.999 * fRec8[1]));
283 double fTemp0 = (fConst8 * fRec13[1]);
284 double fTemp1 = (fConst14 * fRec14[1]);
285 double fTemp2 = (double)input0[i];
286 double fTemp3 = fabs(fTemp2);
287 fRec21[0] = ((9.999999999998899e-05 * fTemp3) + (0.9999 * fRec21[1]));
288 double fTemp4 = max(fRec21[0], fTemp3);
289 fVec0[IOTA&65535] = fTemp4;
290 fRec20[0] = ((fVec0[IOTA&65535] + fRec20[1]) - fVec0[(IOTA-iConst33)&65535]);
291 fRec19[0] = ((fConst34 * fRec20[0]) + (0.999 * fRec19[1]));
292 double fTemp5 = max(-1, min(-0.01, (fVec0[IOTA&65535] - (1.0 + (1.02 * fRec19[0])))));
293 double fTemp6 = (0 - fTemp5);
294 double fTemp7 = (40.1 * fTemp6);
295 double fTemp8 = max(-600, fTemp7);
296 double fTemp9 = (0 - fTemp8);
297 double fTemp10 = (fTemp2 - fTemp5);
298 double fTemp11 = (40.1 * fTemp10);
299 double fTemp12 = max(-600, fTemp11);
300 double fTemp13 = (0 - fTemp12);
301 double fTemp14 = (((int((fabs(fTemp11) > 0.0001)))?((int((fTemp12 < -50)))?(exp(fTemp12) * fTemp13):(fTemp12 / (1 - exp(fTemp13)))):(1 + (fTemp10 * (20.05 + (134.00083333333336 * fTemp10))))) - ((int((fabs(fTemp7) > 0.0001)))?((int((fTemp8 < -50)))?(exp(fTemp8) * fTemp9):(fTemp8 / (1 - exp(fTemp9)))):(1 + (fTemp6 * (20.05 + (134.00083333333336 * fTemp6))))));
302 double fTemp15 = (fSlow3 * fTemp14);
303 fRec18[0] = (fTemp15 - (fConst32 * ((fConst30 * fRec18[2]) + (fConst28 * fRec18[1]))));
304 double fTemp16 = (fRec18[2] + (fRec18[0] + (2 * fRec18[1])));
305 fVec1[0] = fTemp16;
306 fRec17[0] = ((fConst36 * ((fConst35 * fVec1[1]) + (fConst0 * fVec1[0]))) + (fConst2 * fRec17[1]));
307 fRec16[0] = ((fConst38 * ((fConst37 * fRec17[1]) + (fConst21 * fRec17[0]))) + (fConst26 * fRec16[1]));
308 fRec15[0] = (fRec16[0] - (fConst24 * ((fConst22 * fRec15[2]) + (fConst20 * fRec15[1]))));
309 fRec14[0] = ((fConst24 * (((fConst19 * fRec15[0]) + (fConst39 * fRec15[1])) + (fConst19 * fRec15[2]))) - (fConst17 * ((fConst16 * fRec14[2]) + fTemp1)));
310 fRec13[0] = ((fRec14[2] + (fConst17 * (fTemp1 + (fConst16 * fRec14[0])))) - (fConst11 * ((fConst10 * fRec13[2]) + fTemp0)));
311 double fTemp17 = max(-1, min(1, (fSlow5 * (fRec13[2] + (fConst11 * (fTemp0 + (fConst10 * fRec13[0])))))));
312 fRec27[0] = ((fConst38 * (fRec17[0] + fRec17[1])) + (fConst26 * fRec27[1]));
313 fRec26[0] = (fRec27[0] - (fConst24 * ((fConst22 * fRec26[2]) + (fConst20 * fRec26[1]))));
314 double fTemp18 = (fRec26[2] + (fRec26[0] + (2 * fRec26[1])));
315 fVec2[0] = fTemp18;
316 fRec25[0] = ((fConst49 * (fVec2[0] + fVec2[1])) + (fConst48 * fRec25[1]));
317 fRec24[0] = (fRec25[0] - (fConst46 * ((fConst44 * fRec24[2]) + (fConst14 * fRec24[1]))));
318 double fTemp19 = (fRec24[2] + (fRec24[0] + (2 * fRec24[1])));
319 fVec3[0] = fTemp19;
320 fRec23[0] = ((fConst51 * ((fConst50 * fVec3[1]) + (fConst9 * fVec3[0]))) + (fConst43 * fRec23[1]));
321 fRec22[0] = (fRec23[0] - (fConst41 * ((fConst40 * fRec22[2]) + (fConst8 * fRec22[1]))));
322 double fTemp20 = max(-1, min(1, (fSlow7 * (((fConst7 * fRec22[0]) + (fConst52 * fRec22[1])) + (fConst7 * fRec22[2])))));
323 fRec29[0] = ((fConst51 * (fVec3[0] + fVec3[1])) + (fConst43 * fRec29[1]));
324 fRec28[0] = (fRec29[0] - (fConst41 * ((fConst40 * fRec28[2]) + (fConst8 * fRec28[1]))));
325 double fTemp21 = max(-1, min(1, (fSlow8 * (fRec28[2] + (fRec28[0] + (2 * fRec28[1]))))));
326 double fTemp22 = (fConst8 * fRec30[1]);
327 fRec32[0] = ((fConst49 * ((fConst53 * fVec2[1]) + (fConst15 * fVec2[0]))) + (fConst48 * fRec32[1]));
328 fRec31[0] = (fRec32[0] - (fConst46 * ((fConst44 * fRec31[2]) + (fConst14 * fRec31[1]))));
329 fRec30[0] = ((fConst46 * (((fConst13 * fRec31[0]) + (fConst54 * fRec31[1])) + (fConst13 * fRec31[2]))) - (fConst11 * ((fConst10 * fRec30[2]) + fTemp22)));
330 double fTemp23 = max(-1, min(1, (fSlow9 * (fRec30[2] + (fConst11 * (fTemp22 + (fConst10 * fRec30[0])))))));
331 double fTemp24 = (((fTemp23 * (1 - (0.3333333333333333 * faustpower<2>(fTemp23)))) + ((fTemp21 * (1 - (0.3333333333333333 * faustpower<2>(fTemp21)))) + (0.841395141645195 * (fTemp20 * (1 - (0.3333333333333333 * faustpower<2>(fTemp20))))))) + (0.7943282347242815 * (fTemp17 * (1 - (0.3333333333333333 * faustpower<2>(fTemp17))))));
332 fVec4[0] = fTemp24;
333 fRec12[0] = ((fConst55 * (fVec4[0] + fVec4[1])) + (fConst5 * fRec12[1]));
334 double fTemp25 = (fRec11[1] - 1.3e+02);
335 fVec5[0] = fTemp25;
336 fRec33[0] = ((fConst59 * (fVec5[0] + fVec5[1])) + (fConst58 * fRec33[1]));
337 double fTemp26 = max(-1, min(1, (fSlow6 * max(-0.7, min(0.7, fTemp15)))));
338 fRec11[0] = Ftube3(0, ((fTemp14 * (fSlow15 + (fSlow12 * (0.024937655860349125 + (fSlow14 * ((0.0997506234413965 - (0.0997506234413965 * fabs((fSlow13 * fTemp14)))) - 0.024937655860349125)))))) + ((0.5 * (fTemp26 * (1 - (0.3333333333333333 * faustpower<2>(fTemp26))))) + (fRec33[0] + (fSlow11 * fRec12[0])))));
339 fRec10[0] = ((fConst60 * ((fConst35 * fRec11[1]) + (fConst0 * fRec11[0]))) + (fConst2 * fRec10[1]));
340 double fTemp27 = (fRec35[1] - 1.3e+02);
341 fVec6[0] = fTemp27;
342 fRec36[0] = ((fConst64 * (fVec6[0] + fVec6[1])) + (fConst63 * fRec36[1]));
343 fRec35[0] = Ftube3(1, (fRec36[0] + fRec9[1]));
344 fRec34[0] = ((fConst60 * ((fConst35 * fRec35[1]) + (fConst0 * fRec35[0]))) + (fConst2 * fRec34[1]));
345 fRec9[0] = (fRec34[0] - fRec10[0]);
346 double fTemp28 = (fRec9[0] * fRec8[0]);
347 fVec7[0] = fTemp28;
348 fRec7[0] = ((fConst65 * (fVec7[0] + fVec7[1])) + (fConst5 * fRec7[1]));
349 double fTemp29 = (fRec6[1] - 1.3e+02);
350 fVec8[0] = fTemp29;
351 fRec37[0] = ((fConst64 * (fVec8[0] + fVec8[1])) + (fConst63 * fRec37[1]));
352 fRec6[0] = Ftube3(1, (fRec37[0] + fRec7[0]));
353 fRec5[0] = ((fConst60 * ((fConst35 * fRec6[1]) + (fConst0 * fRec6[0]))) + (fConst2 * fRec5[1]));
354 double fTemp30 = (fRec39[1] - 1.3e+02);
355 fVec9[0] = fTemp30;
356 fRec40[0] = ((fConst69 * (fVec9[0] + fVec9[1])) + (fConst68 * fRec40[1]));
357 fRec39[0] = Ftube3(1, (fRec40[0] + fRec4[1]));
358 fRec38[0] = ((fConst60 * ((fConst35 * fRec39[1]) + (fConst0 * fRec39[0]))) + (fConst2 * fRec38[1]));
359 fRec4[0] = (fRec38[0] + fRec5[0]);
360 fRec3[0] = ((fConst65 * (fRec4[0] + fRec4[1])) + (fConst5 * fRec3[1]));
361 double fTemp31 = (fRec2[1] - 1.3e+02);
362 fVec10[0] = fTemp31;
363 fRec41[0] = ((fConst69 * (fVec10[0] + fVec10[1])) + (fConst68 * fRec41[1]));
364 fRec2[0] = Ftube3(1, (fRec41[0] + fRec3[0]));
365 fRec1[0] = ((fConst60 * ((fConst35 * fRec2[1]) + (fConst0 * fRec2[0]))) + (fConst2 * fRec1[1]));
366 output0[i] = (FAUSTFLOAT)(fRec1[0] * fRec0[0]);
367 // post processing
368 fRec1[1] = fRec1[0];
369 fRec2[1] = fRec2[0];
370 fRec41[1] = fRec41[0];
371 fVec10[1] = fVec10[0];
372 fRec3[1] = fRec3[0];
373 fRec4[1] = fRec4[0];
374 fRec38[1] = fRec38[0];
375 fRec39[1] = fRec39[0];
376 fRec40[1] = fRec40[0];
377 fVec9[1] = fVec9[0];
378 fRec5[1] = fRec5[0];
379 fRec6[1] = fRec6[0];
380 fRec37[1] = fRec37[0];
381 fVec8[1] = fVec8[0];
382 fRec7[1] = fRec7[0];
383 fVec7[1] = fVec7[0];
384 fRec9[1] = fRec9[0];
385 fRec34[1] = fRec34[0];
386 fRec35[1] = fRec35[0];
387 fRec36[1] = fRec36[0];
388 fVec6[1] = fVec6[0];
389 fRec10[1] = fRec10[0];
390 fRec11[1] = fRec11[0];
391 fRec33[1] = fRec33[0];
392 fVec5[1] = fVec5[0];
393 fRec12[1] = fRec12[0];
394 fVec4[1] = fVec4[0];
395 fRec30[2] = fRec30[1]; fRec30[1] = fRec30[0];
396 fRec31[2] = fRec31[1]; fRec31[1] = fRec31[0];
397 fRec32[1] = fRec32[0];
398 fRec28[2] = fRec28[1]; fRec28[1] = fRec28[0];
399 fRec29[1] = fRec29[0];
400 fRec22[2] = fRec22[1]; fRec22[1] = fRec22[0];
401 fRec23[1] = fRec23[0];
402 fVec3[1] = fVec3[0];
403 fRec24[2] = fRec24[1]; fRec24[1] = fRec24[0];
404 fRec25[1] = fRec25[0];
405 fVec2[1] = fVec2[0];
406 fRec26[2] = fRec26[1]; fRec26[1] = fRec26[0];
407 fRec27[1] = fRec27[0];
408 fRec13[2] = fRec13[1]; fRec13[1] = fRec13[0];
409 fRec14[2] = fRec14[1]; fRec14[1] = fRec14[0];
410 fRec15[2] = fRec15[1]; fRec15[1] = fRec15[0];
411 fRec16[1] = fRec16[0];
412 fRec17[1] = fRec17[0];
413 fVec1[1] = fVec1[0];
414 fRec18[2] = fRec18[1]; fRec18[1] = fRec18[0];
415 fRec19[1] = fRec19[0];
416 fRec20[1] = fRec20[0];
417 IOTA = IOTA+1;
418 fRec21[1] = fRec21[0];
419 fRec8[1] = fRec8[0];
420 fRec0[1] = fRec0[0];
421 }
422 }
423
424 static struct RegisterParams { RegisterParams(); } RegisterParams;
425 RegisterParams::RegisterParams()
426 {
427 registerInit("amp2", init);
428 }
429
430 } // end namespace gxamp11
0 namespace gxamp13 {
1 // generated from file '../src/faust/gxamp13.dsp'
2
3 FAUSTFLOAT& fslider0 = get_alias("amp2.stage2.gain1");
4 double fRec0[2];
5 double fConst0;
6 double fConst1;
7 double fConst2;
8 double fConst3;
9 double fConst4;
10 double fConst5;
11 FAUSTFLOAT& fslider1 = get_alias("amp2.stage1.Pregain");
12 double fRec8[2];
13 double fConst6;
14 double fConst7;
15 double fConst8;
16 double fConst9;
17 double fConst10;
18 double fConst11;
19 double fConst12;
20 double fConst13;
21 double fConst14;
22 double fConst15;
23 double fConst16;
24 double fConst17;
25 double fConst18;
26 double fConst19;
27 double fConst20;
28 double fConst21;
29 double fConst22;
30 double fConst23;
31 double fConst24;
32 double fConst25;
33 double fConst26;
34 double fConst27;
35 double fConst28;
36 double fConst29;
37 double fConst30;
38 double fConst31;
39 double fConst32;
40 double fRec21[2];
41 int IOTA;
42 double fVec0[65536];
43 int iConst33;
44 double fRec20[2];
45 double fConst34;
46 double fRec19[2];
47 FAUSTFLOAT& fslider2 = get_alias("gxdistortion.wet_dry");
48 double fRec18[3];
49 double fVec1[2];
50 double fConst35;
51 double fConst36;
52 double fRec17[2];
53 double fConst37;
54 double fConst38;
55 double fRec16[2];
56 double fRec15[3];
57 double fConst39;
58 double fRec14[3];
59 double fRec13[3];
60 FAUSTFLOAT& fslider3 = get_alias("gxdistortion.drive");
61 double fConst40;
62 double fConst41;
63 double fConst42;
64 double fConst43;
65 double fConst44;
66 double fConst45;
67 double fConst46;
68 double fConst47;
69 double fConst48;
70 double fRec27[2];
71 double fRec26[3];
72 double fVec2[2];
73 double fConst49;
74 double fRec25[2];
75 double fRec24[3];
76 double fVec3[2];
77 double fConst50;
78 double fConst51;
79 double fRec23[2];
80 double fRec22[3];
81 double fConst52;
82 double fRec29[2];
83 double fRec28[3];
84 double fConst53;
85 double fRec32[2];
86 double fRec31[3];
87 double fConst54;
88 double fRec30[3];
89 double fVec4[2];
90 double fConst55;
91 double fRec12[2];
92 double fConst56;
93 double fConst57;
94 double fConst58;
95 double fVec5[2];
96 double fConst59;
97 double fRec33[2];
98 double fRec11[2];
99 double fConst60;
100 double fRec10[2];
101 double fConst61;
102 double fConst62;
103 double fConst63;
104 double fVec6[2];
105 double fConst64;
106 double fRec36[2];
107 double fRec35[2];
108 double fRec34[2];
109 double fRec9[2];
110 double fVec7[2];
111 double fConst65;
112 double fRec7[2];
113 double fVec8[2];
114 double fRec37[2];
115 double fRec6[2];
116 double fRec5[2];
117 double fConst66;
118 double fConst67;
119 double fConst68;
120 double fVec9[2];
121 double fConst69;
122 double fRec40[2];
123 double fRec39[2];
124 double fRec38[2];
125 double fRec4[2];
126 double fRec3[2];
127 double fVec10[2];
128 double fRec41[2];
129 double fRec2[2];
130 double fRec1[2];
131 int fSamplingFreq;
132
133 void init(int samplingFreq)
134 {
135 fSamplingFreq = samplingFreq;
136 for (int i=0; i<2; i++) fRec0[i] = 0;
137 fConst0 = (1.0 / tan((97.38937226128358 / fSamplingFreq)));
138 fConst1 = (1 + fConst0);
139 fConst2 = (0 - ((1 - fConst0) / fConst1));
140 fConst3 = (1.0 / tan((20517.741620594938 / fSamplingFreq)));
141 fConst4 = (1 + fConst3);
142 fConst5 = (0 - ((1 - fConst3) / fConst4));
143 for (int i=0; i<2; i++) fRec8[i] = 0;
144 fConst6 = tan((942.4777960769379 / fSamplingFreq));
145 fConst7 = (1.0 / faustpower<2>(fConst6));
146 fConst8 = (2 * (1 - fConst7));
147 fConst9 = (1.0 / fConst6);
148 fConst10 = (1 + ((fConst9 - 1.0) / fConst6));
149 fConst11 = (1.0 / (1 + ((1.0 + fConst9) / fConst6)));
150 fConst12 = tan((3769.9111843077517 / fSamplingFreq));
151 fConst13 = (1.0 / faustpower<2>(fConst12));
152 fConst14 = (2 * (1 - fConst13));
153 fConst15 = (1.0 / fConst12);
154 fConst16 = (1 + ((fConst15 - 1.0) / fConst12));
155 fConst17 = (1.0 / (1 + ((1.0 + fConst15) / fConst12)));
156 fConst18 = tan((10053.096491487338 / fSamplingFreq));
157 fConst19 = (1.0 / faustpower<2>(fConst18));
158 fConst20 = (2 * (1 - fConst19));
159 fConst21 = (1.0 / fConst18);
160 fConst22 = (1 + ((fConst21 - 1.0000000000000004) / fConst18));
161 fConst23 = (1 + ((1.0000000000000004 + fConst21) / fConst18));
162 fConst24 = (1.0 / fConst23);
163 fConst25 = (1 + fConst21);
164 fConst26 = (0 - ((1 - fConst21) / fConst25));
165 fConst27 = tan((47123.8898038469 / fSamplingFreq));
166 fConst28 = (2 * (1 - (1.0 / faustpower<2>(fConst27))));
167 fConst29 = (1.0 / fConst27);
168 fConst30 = (1 + ((fConst29 - 1.414213562373095) / fConst27));
169 fConst31 = (1 + ((1.414213562373095 + fConst29) / fConst27));
170 fConst32 = (1.0 / fConst31);
171 for (int i=0; i<2; i++) fRec21[i] = 0;
172 IOTA = 0;
173 for (int i=0; i<65536; i++) fVec0[i] = 0;
174 iConst33 = int((int((0.1111111111111111 * fSamplingFreq)) & 65535));
175 for (int i=0; i<2; i++) fRec20[i] = 0;
176 fConst34 = (0.009000000000000008 / fSamplingFreq);
177 for (int i=0; i<2; i++) fRec19[i] = 0;
178 for (int i=0; i<3; i++) fRec18[i] = 0;
179 for (int i=0; i<2; i++) fVec1[i] = 0;
180 fConst35 = (0 - fConst0);
181 fConst36 = (1.0 / (fConst1 * fConst31));
182 for (int i=0; i<2; i++) fRec17[i] = 0;
183 fConst37 = (0 - fConst21);
184 fConst38 = (1.0 / fConst25);
185 for (int i=0; i<2; i++) fRec16[i] = 0;
186 for (int i=0; i<3; i++) fRec15[i] = 0;
187 fConst39 = (2 * (0 - fConst19));
188 for (int i=0; i<3; i++) fRec14[i] = 0;
189 for (int i=0; i<3; i++) fRec13[i] = 0;
190 fConst40 = (1 + ((fConst9 - 1.0000000000000004) / fConst6));
191 fConst41 = (1.0 / (1 + ((fConst9 + 1.0000000000000004) / fConst6)));
192 fConst42 = (1 + fConst9);
193 fConst43 = (0 - ((1 - fConst9) / fConst42));
194 fConst44 = (1 + ((fConst15 - 1.0000000000000004) / fConst12));
195 fConst45 = (1 + ((fConst15 + 1.0000000000000004) / fConst12));
196 fConst46 = (1.0 / fConst45);
197 fConst47 = (1 + fConst15);
198 fConst48 = (0 - ((1 - fConst15) / fConst47));
199 for (int i=0; i<2; i++) fRec27[i] = 0;
200 for (int i=0; i<3; i++) fRec26[i] = 0;
201 for (int i=0; i<2; i++) fVec2[i] = 0;
202 fConst49 = (1.0 / (fConst47 * fConst23));
203 for (int i=0; i<2; i++) fRec25[i] = 0;
204 for (int i=0; i<3; i++) fRec24[i] = 0;
205 for (int i=0; i<2; i++) fVec3[i] = 0;
206 fConst50 = (0 - fConst9);
207 fConst51 = (1.0 / (fConst42 * fConst45));
208 for (int i=0; i<2; i++) fRec23[i] = 0;
209 for (int i=0; i<3; i++) fRec22[i] = 0;
210 fConst52 = (2 * (0 - fConst7));
211 for (int i=0; i<2; i++) fRec29[i] = 0;
212 for (int i=0; i<3; i++) fRec28[i] = 0;
213 fConst53 = (0 - fConst15);
214 for (int i=0; i<2; i++) fRec32[i] = 0;
215 for (int i=0; i<3; i++) fRec31[i] = 0;
216 fConst54 = (2 * (0 - fConst13));
217 for (int i=0; i<3; i++) fRec30[i] = 0;
218 for (int i=0; i<2; i++) fVec4[i] = 0;
219 fConst55 = (1.5848931924611136 / fConst4);
220 for (int i=0; i<2; i++) fRec12[i] = 0;
221 fConst56 = (1.0 / tan((270.1769682087222 / fSamplingFreq)));
222 fConst57 = (1 + fConst56);
223 fConst58 = (0 - ((1 - fConst56) / fConst57));
224 for (int i=0; i<2; i++) fVec5[i] = 0;
225 fConst59 = (0.027 / fConst57);
226 for (int i=0; i<2; i++) fRec33[i] = 0;
227 for (int i=0; i<2; i++) fRec11[i] = 0;
228 fConst60 = (0.05 / fConst1);
229 for (int i=0; i<2; i++) fRec10[i] = 0;
230 fConst61 = (1.0 / tan((414.6902302738527 / fSamplingFreq)));
231 fConst62 = (1 + fConst61);
232 fConst63 = (0 - ((1 - fConst61) / fConst62));
233 for (int i=0; i<2; i++) fVec6[i] = 0;
234 fConst64 = (0.015 / fConst62);
235 for (int i=0; i<2; i++) fRec36[i] = 0;
236 for (int i=0; i<2; i++) fRec35[i] = 0;
237 for (int i=0; i<2; i++) fRec34[i] = 0;
238 for (int i=0; i<2; i++) fRec9[i] = 0;
239 for (int i=0; i<2; i++) fVec7[i] = 0;
240 fConst65 = (1.0 / fConst4);
241 for (int i=0; i<2; i++) fRec7[i] = 0;
242 for (int i=0; i<2; i++) fVec8[i] = 0;
243 for (int i=0; i<2; i++) fRec37[i] = 0;
244 for (int i=0; i<2; i++) fRec6[i] = 0;
245 for (int i=0; i<2; i++) fRec5[i] = 0;
246 fConst66 = (1.0 / tan((609.4689747964198 / fSamplingFreq)));
247 fConst67 = (1 + fConst66);
248 fConst68 = (0 - ((1 - fConst66) / fConst67));
249 for (int i=0; i<2; i++) fVec9[i] = 0;
250 fConst69 = (0.0082 / fConst67);
251 for (int i=0; i<2; i++) fRec40[i] = 0;
252 for (int i=0; i<2; i++) fRec39[i] = 0;
253 for (int i=0; i<2; i++) fRec38[i] = 0;
254 for (int i=0; i<2; i++) fRec4[i] = 0;
255 for (int i=0; i<2; i++) fRec3[i] = 0;
256 for (int i=0; i<2; i++) fVec10[i] = 0;
257 for (int i=0; i<2; i++) fRec41[i] = 0;
258 for (int i=0; i<2; i++) fRec2[i] = 0;
259 for (int i=0; i<2; i++) fRec1[i] = 0;
260 }
261
262 void compute(int count, float *input0, float *output0)
263 {
264 double fSlow0 = (0.0010000000000000009 * pow(10,(0.05 * fslider0)));
265 double fSlow1 = (0.0010000000000000009 * pow(10,(0.05 * fslider1)));
266 double fSlow2 = fslider2;
267 double fSlow3 = (0.00024937655860349125 * fSlow2);
268 double fSlow4 = fslider3;
269 double fSlow5 = pow(1e+01,(0.8 * fSlow4));
270 double fSlow6 = pow(1e+01,(2 * fSlow4));
271 double fSlow7 = (fConst41 * fSlow6);
272 double fSlow8 = (fConst41 * pow(1e+01,(0.9 * fSlow4)));
273 double fSlow9 = pow(1e+01,(1.2 * fSlow4));
274 double fSlow10 = (2 * (fSlow4 - 0.5));
275 double fSlow11 = (1 - max(0, (0 - fSlow10)));
276 double fSlow12 = (1 - (0.01 * fSlow2));
277 double fSlow13 = (0.024937655860349125 * fSlow12);
278 double fSlow14 = (1.25 * fSlow4);
279 double fSlow15 = (0.00024937655860349125 * (fSlow2 * (1 - max(0, fSlow10))));
280 for (int i=0; i<count; i++) {
281 fRec0[0] = (fSlow0 + (0.999 * fRec0[1]));
282 fRec8[0] = (fSlow1 + (0.999 * fRec8[1]));
283 double fTemp0 = (fConst8 * fRec13[1]);
284 double fTemp1 = (fConst14 * fRec14[1]);
285 double fTemp2 = (double)input0[i];
286 double fTemp3 = fabs(fTemp2);
287 fRec21[0] = ((9.999999999998899e-05 * fTemp3) + (0.9999 * fRec21[1]));
288 double fTemp4 = max(fRec21[0], fTemp3);
289 fVec0[IOTA&65535] = fTemp4;
290 fRec20[0] = ((fVec0[IOTA&65535] + fRec20[1]) - fVec0[(IOTA-iConst33)&65535]);
291 fRec19[0] = ((fConst34 * fRec20[0]) + (0.999 * fRec19[1]));
292 double fTemp5 = max(-1, min(-0.01, (fVec0[IOTA&65535] - (1.0 + (1.02 * fRec19[0])))));
293 double fTemp6 = (0 - fTemp5);
294 double fTemp7 = (40.1 * fTemp6);
295 double fTemp8 = max(-600, fTemp7);
296 double fTemp9 = (0 - fTemp8);
297 double fTemp10 = (fTemp2 - fTemp5);
298 double fTemp11 = (40.1 * fTemp10);
299 double fTemp12 = max(-600, fTemp11);
300 double fTemp13 = (0 - fTemp12);
301 double fTemp14 = (((int((fabs(fTemp11) > 0.0001)))?((int((fTemp12 < -50)))?(exp(fTemp12) * fTemp13):(fTemp12 / (1 - exp(fTemp13)))):(1 + (fTemp10 * (20.05 + (134.00083333333336 * fTemp10))))) - ((int((fabs(fTemp7) > 0.0001)))?((int((fTemp8 < -50)))?(exp(fTemp8) * fTemp9):(fTemp8 / (1 - exp(fTemp9)))):(1 + (fTemp6 * (20.05 + (134.00083333333336 * fTemp6))))));
302 double fTemp15 = (fSlow3 * fTemp14);
303 fRec18[0] = (fTemp15 - (fConst32 * ((fConst30 * fRec18[2]) + (fConst28 * fRec18[1]))));
304 double fTemp16 = (fRec18[2] + (fRec18[0] + (2 * fRec18[1])));
305 fVec1[0] = fTemp16;
306 fRec17[0] = ((fConst36 * ((fConst35 * fVec1[1]) + (fConst0 * fVec1[0]))) + (fConst2 * fRec17[1]));
307 fRec16[0] = ((fConst38 * ((fConst37 * fRec17[1]) + (fConst21 * fRec17[0]))) + (fConst26 * fRec16[1]));
308 fRec15[0] = (fRec16[0] - (fConst24 * ((fConst22 * fRec15[2]) + (fConst20 * fRec15[1]))));
309 fRec14[0] = ((fConst24 * (((fConst19 * fRec15[0]) + (fConst39 * fRec15[1])) + (fConst19 * fRec15[2]))) - (fConst17 * ((fConst16 * fRec14[2]) + fTemp1)));
310 fRec13[0] = ((fRec14[2] + (fConst17 * (fTemp1 + (fConst16 * fRec14[0])))) - (fConst11 * ((fConst10 * fRec13[2]) + fTemp0)));
311 double fTemp17 = max(-1, min(1, (fSlow5 * (fRec13[2] + (fConst11 * (fTemp0 + (fConst10 * fRec13[0])))))));
312 fRec27[0] = ((fConst38 * (fRec17[0] + fRec17[1])) + (fConst26 * fRec27[1]));
313 fRec26[0] = (fRec27[0] - (fConst24 * ((fConst22 * fRec26[2]) + (fConst20 * fRec26[1]))));
314 double fTemp18 = (fRec26[2] + (fRec26[0] + (2 * fRec26[1])));
315 fVec2[0] = fTemp18;
316 fRec25[0] = ((fConst49 * (fVec2[0] + fVec2[1])) + (fConst48 * fRec25[1]));
317 fRec24[0] = (fRec25[0] - (fConst46 * ((fConst44 * fRec24[2]) + (fConst14 * fRec24[1]))));
318 double fTemp19 = (fRec24[2] + (fRec24[0] + (2 * fRec24[1])));
319 fVec3[0] = fTemp19;
320 fRec23[0] = ((fConst51 * ((fConst50 * fVec3[1]) + (fConst9 * fVec3[0]))) + (fConst43 * fRec23[1]));
321 fRec22[0] = (fRec23[0] - (fConst41 * ((fConst40 * fRec22[2]) + (fConst8 * fRec22[1]))));
322 double fTemp20 = max(-1, min(1, (fSlow7 * (((fConst7 * fRec22[0]) + (fConst52 * fRec22[1])) + (fConst7 * fRec22[2])))));
323 fRec29[0] = ((fConst51 * (fVec3[0] + fVec3[1])) + (fConst43 * fRec29[1]));
324 fRec28[0] = (fRec29[0] - (fConst41 * ((fConst40 * fRec28[2]) + (fConst8 * fRec28[1]))));
325 double fTemp21 = max(-1, min(1, (fSlow8 * (fRec28[2] + (fRec28[0] + (2 * fRec28[1]))))));
326 double fTemp22 = (fConst8 * fRec30[1]);
327 fRec32[0] = ((fConst49 * ((fConst53 * fVec2[1]) + (fConst15 * fVec2[0]))) + (fConst48 * fRec32[1]));
328 fRec31[0] = (fRec32[0] - (fConst46 * ((fConst44 * fRec31[2]) + (fConst14 * fRec31[1]))));
329 fRec30[0] = ((fConst46 * (((fConst13 * fRec31[0]) + (fConst54 * fRec31[1])) + (fConst13 * fRec31[2]))) - (fConst11 * ((fConst10 * fRec30[2]) + fTemp22)));
330 double fTemp23 = max(-1, min(1, (fSlow9 * (fRec30[2] + (fConst11 * (fTemp22 + (fConst10 * fRec30[0])))))));
331 double fTemp24 = (((fTemp23 * (1 - (0.3333333333333333 * faustpower<2>(fTemp23)))) + ((fTemp21 * (1 - (0.3333333333333333 * faustpower<2>(fTemp21)))) + (0.841395141645195 * (fTemp20 * (1 - (0.3333333333333333 * faustpower<2>(fTemp20))))))) + (0.7943282347242815 * (fTemp17 * (1 - (0.3333333333333333 * faustpower<2>(fTemp17))))));
332 fVec4[0] = fTemp24;
333 fRec12[0] = ((fConst55 * (fVec4[0] + fVec4[1])) + (fConst5 * fRec12[1]));
334 double fTemp25 = (fRec11[1] - 1.3e+02);
335 fVec5[0] = fTemp25;
336 fRec33[0] = ((fConst59 * (fVec5[0] + fVec5[1])) + (fConst58 * fRec33[1]));
337 double fTemp26 = max(-1, min(1, (fSlow6 * max(-0.7, min(0.7, fTemp15)))));
338 fRec11[0] = Ftube4(0, ((fTemp14 * (fSlow15 + (fSlow12 * (0.024937655860349125 + (fSlow14 * ((0.0997506234413965 - (0.0997506234413965 * fabs((fSlow13 * fTemp14)))) - 0.024937655860349125)))))) + ((0.5 * (fTemp26 * (1 - (0.3333333333333333 * faustpower<2>(fTemp26))))) + (fRec33[0] + (fSlow11 * fRec12[0])))));
339 fRec10[0] = ((fConst60 * ((fConst35 * fRec11[1]) + (fConst0 * fRec11[0]))) + (fConst2 * fRec10[1]));
340 double fTemp27 = (fRec35[1] - 1.3e+02);
341 fVec6[0] = fTemp27;
342 fRec36[0] = ((fConst64 * (fVec6[0] + fVec6[1])) + (fConst63 * fRec36[1]));
343 fRec35[0] = Ftube4(1, (fRec36[0] + fRec9[1]));
344 fRec34[0] = ((fConst60 * ((fConst35 * fRec35[1]) + (fConst0 * fRec35[0]))) + (fConst2 * fRec34[1]));
345 fRec9[0] = (fRec34[0] - fRec10[0]);
346 double fTemp28 = (fRec9[0] * fRec8[0]);
347 fVec7[0] = fTemp28;
348 fRec7[0] = ((fConst65 * (fVec7[0] + fVec7[1])) + (fConst5 * fRec7[1]));
349 double fTemp29 = (fRec6[1] - 1.3e+02);
350 fVec8[0] = fTemp29;
351 fRec37[0] = ((fConst64 * (fVec8[0] + fVec8[1])) + (fConst63 * fRec37[1]));
352 fRec6[0] = Ftube4(1, (fRec37[0] + fRec7[0]));
353 fRec5[0] = ((fConst60 * ((fConst35 * fRec6[1]) + (fConst0 * fRec6[0]))) + (fConst2 * fRec5[1]));
354 double fTemp30 = (fRec39[1] - 1.3e+02);
355 fVec9[0] = fTemp30;
356 fRec40[0] = ((fConst69 * (fVec9[0] + fVec9[1])) + (fConst68 * fRec40[1]));
357 fRec39[0] = Ftube4(1, (fRec40[0] + fRec4[1]));
358 fRec38[0] = ((fConst60 * ((fConst35 * fRec39[1]) + (fConst0 * fRec39[0]))) + (fConst2 * fRec38[1]));
359 fRec4[0] = (fRec38[0] + fRec5[0]);
360 fRec3[0] = ((fConst65 * (fRec4[0] + fRec4[1])) + (fConst5 * fRec3[1]));
361 double fTemp31 = (fRec2[1] - 1.3e+02);
362 fVec10[0] = fTemp31;
363 fRec41[0] = ((fConst69 * (fVec10[0] + fVec10[1])) + (fConst68 * fRec41[1]));
364 fRec2[0] = Ftube4(1, (fRec41[0] + fRec3[0]));
365 fRec1[0] = ((fConst60 * ((fConst35 * fRec2[1]) + (fConst0 * fRec2[0]))) + (fConst2 * fRec1[1]));
366 output0[i] = (FAUSTFLOAT)(fRec1[0] * fRec0[0]);
367 // post processing
368 fRec1[1] = fRec1[0];
369 fRec2[1] = fRec2[0];
370 fRec41[1] = fRec41[0];
371 fVec10[1] = fVec10[0];
372 fRec3[1] = fRec3[0];
373 fRec4[1] = fRec4[0];
374 fRec38[1] = fRec38[0];
375 fRec39[1] = fRec39[0];
376 fRec40[1] = fRec40[0];
377 fVec9[1] = fVec9[0];
378 fRec5[1] = fRec5[0];
379 fRec6[1] = fRec6[0];
380 fRec37[1] = fRec37[0];
381 fVec8[1] = fVec8[0];
382 fRec7[1] = fRec7[0];
383 fVec7[1] = fVec7[0];
384 fRec9[1] = fRec9[0];
385 fRec34[1] = fRec34[0];
386 fRec35[1] = fRec35[0];
387 fRec36[1] = fRec36[0];
388 fVec6[1] = fVec6[0];
389 fRec10[1] = fRec10[0];
390 fRec11[1] = fRec11[0];
391 fRec33[1] = fRec33[0];
392 fVec5[1] = fVec5[0];
393 fRec12[1] = fRec12[0];
394 fVec4[1] = fVec4[0];
395 fRec30[2] = fRec30[1]; fRec30[1] = fRec30[0];
396 fRec31[2] = fRec31[1]; fRec31[1] = fRec31[0];
397 fRec32[1] = fRec32[0];
398 fRec28[2] = fRec28[1]; fRec28[1] = fRec28[0];
399 fRec29[1] = fRec29[0];
400 fRec22[2] = fRec22[1]; fRec22[1] = fRec22[0];
401 fRec23[1] = fRec23[0];
402 fVec3[1] = fVec3[0];
403 fRec24[2] = fRec24[1]; fRec24[1] = fRec24[0];
404 fRec25[1] = fRec25[0];
405 fVec2[1] = fVec2[0];
406 fRec26[2] = fRec26[1]; fRec26[1] = fRec26[0];
407 fRec27[1] = fRec27[0];
408 fRec13[2] = fRec13[1]; fRec13[1] = fRec13[0];
409 fRec14[2] = fRec14[1]; fRec14[1] = fRec14[0];
410 fRec15[2] = fRec15[1]; fRec15[1] = fRec15[0];
411 fRec16[1] = fRec16[0];
412 fRec17[1] = fRec17[0];
413 fVec1[1] = fVec1[0];
414 fRec18[2] = fRec18[1]; fRec18[1] = fRec18[0];
415 fRec19[1] = fRec19[0];
416 fRec20[1] = fRec20[0];
417 IOTA = IOTA+1;
418 fRec21[1] = fRec21[0];
419 fRec8[1] = fRec8[0];
420 fRec0[1] = fRec0[0];
421 }
422 }
423
424 static struct RegisterParams { RegisterParams(); } RegisterParams;
425 RegisterParams::RegisterParams()
426 {
427 registerInit("amp2", init);
428 }
429
430 } // end namespace gxamp13
126126 fConst5 = (0 - ((1 - fConst3) / fConst4));
127127 for (int i=0; i<2; i++) fRec7[i] = 0;
128128 fConst6 = tan((942.4777960769379 / fSamplingFreq));
129 fConst7 = (1.0 / fConst6);
130 fConst8 = (1 + ((fConst7 - 1.0) / fConst6));
131 fConst9 = (1.0 / faustpower<2>(fConst6));
132 fConst10 = (2 * (1 - fConst9));
133 fConst11 = (1.0 / (1 + ((1.0 + fConst7) / fConst6)));
129 fConst7 = (1.0 / faustpower<2>(fConst6));
130 fConst8 = (2 * (1 - fConst7));
131 fConst9 = (1.0 / fConst6);
132 fConst10 = (1 + ((fConst9 - 1.0) / fConst6));
133 fConst11 = (1.0 / (1 + ((1.0 + fConst9) / fConst6)));
134134 fConst12 = tan((3769.9111843077517 / fSamplingFreq));
135135 fConst13 = (1.0 / faustpower<2>(fConst12));
136136 fConst14 = (2 * (1 - fConst13));
164164 fConst37 = (2 * (0 - fConst19));
165165 for (int i=0; i<3; i++) fRec12[i] = 0;
166166 for (int i=0; i<3; i++) fRec11[i] = 0;
167 fConst38 = (1 + ((fConst7 - 1.0000000000000004) / fConst6));
168 fConst39 = (1.0 / (1 + ((fConst7 + 1.0000000000000004) / fConst6)));
169 fConst40 = (1 + fConst7);
170 fConst41 = (0 - ((1 - fConst7) / fConst40));
167 fConst38 = (1 + ((fConst9 - 1.0000000000000004) / fConst6));
168 fConst39 = (1.0 / (1 + ((fConst9 + 1.0000000000000004) / fConst6)));
169 fConst40 = (1 + fConst9);
170 fConst41 = (0 - ((1 - fConst9) / fConst40));
171171 fConst42 = (1 + ((fConst15 - 1.0000000000000004) / fConst12));
172172 fConst43 = (1 + ((fConst15 + 1.0000000000000004) / fConst12));
173173 fConst44 = (1.0 / fConst43);
180180 for (int i=0; i<2; i++) fRec20[i] = 0;
181181 for (int i=0; i<3; i++) fRec19[i] = 0;
182182 for (int i=0; i<2; i++) fVec2[i] = 0;
183 fConst48 = (0 - fConst7);
183 fConst48 = (0 - fConst9);
184184 fConst49 = (1.0 / (fConst40 * fConst43));
185185 for (int i=0; i<2; i++) fRec18[i] = 0;
186186 for (int i=0; i<3; i++) fRec17[i] = 0;
187 fConst50 = (2 * (0 - fConst9));
187 fConst50 = (2 * (0 - fConst7));
188188 for (int i=0; i<2; i++) fRec24[i] = 0;
189189 for (int i=0; i<3; i++) fRec23[i] = 0;
190190 fConst51 = (0 - fConst15);
246246 for (int i=0; i<count; i++) {
247247 fRec0[0] = (fSlow0 + (0.999 * fRec0[1]));
248248 fRec7[0] = (fSlow1 + (0.999 * fRec7[1]));
249 double fTemp0 = (fConst10 * fRec11[1]);
249 double fTemp0 = (fConst8 * fRec11[1]);
250250 double fTemp1 = (fConst14 * fRec12[1]);
251251 double fTemp2 = (double)input0[i];
252252 fRec16[0] = ((fSlow3 * fTemp2) - (fConst32 * ((fConst30 * fRec16[2]) + (fConst28 * fRec16[1]))));
256256 fRec14[0] = ((fConst36 * ((fConst35 * fRec15[1]) + (fConst21 * fRec15[0]))) + (fConst26 * fRec14[1]));
257257 fRec13[0] = (fRec14[0] - (fConst24 * ((fConst22 * fRec13[2]) + (fConst20 * fRec13[1]))));
258258 fRec12[0] = ((fConst24 * (((fConst19 * fRec13[0]) + (fConst37 * fRec13[1])) + (fConst19 * fRec13[2]))) - (fConst17 * ((fConst16 * fRec12[2]) + fTemp1)));
259 fRec11[0] = ((fRec12[2] + (fConst17 * (fTemp1 + (fConst16 * fRec12[0])))) - (fConst11 * (fTemp0 + (fConst8 * fRec11[2]))));
260 double fTemp4 = max(-1, min(1, (fSlow5 * (fRec11[2] + (fConst11 * (fTemp0 + (fConst8 * fRec11[0])))))));
259 fRec11[0] = ((fRec12[2] + (fConst17 * (fTemp1 + (fConst16 * fRec12[0])))) - (fConst11 * ((fConst10 * fRec11[2]) + fTemp0)));
260 double fTemp4 = max(-1, min(1, (fSlow5 * (fRec11[2] + (fConst11 * (fTemp0 + (fConst10 * fRec11[0])))))));
261261 fRec22[0] = ((fConst36 * (fRec15[0] + fRec15[1])) + (fConst26 * fRec22[1]));
262262 fRec21[0] = (fRec22[0] - (fConst24 * ((fConst22 * fRec21[2]) + (fConst20 * fRec21[1]))));
263263 double fTemp5 = (fRec21[2] + (fRec21[0] + (2 * fRec21[1])));
266266 fRec19[0] = (fRec20[0] - (fConst44 * ((fConst42 * fRec19[2]) + (fConst14 * fRec19[1]))));
267267 double fTemp6 = (fRec19[2] + (fRec19[0] + (2 * fRec19[1])));
268268 fVec2[0] = fTemp6;
269 fRec18[0] = ((fConst49 * ((fConst48 * fVec2[1]) + (fConst7 * fVec2[0]))) + (fConst41 * fRec18[1]));
270 fRec17[0] = (fRec18[0] - (fConst39 * ((fConst38 * fRec17[2]) + (fConst10 * fRec17[1]))));
271 double fTemp7 = max(-1, min(1, (fSlow6 * (((fConst9 * fRec17[0]) + (fConst50 * fRec17[1])) + (fConst9 * fRec17[2])))));
269 fRec18[0] = ((fConst49 * ((fConst48 * fVec2[1]) + (fConst9 * fVec2[0]))) + (fConst41 * fRec18[1]));
270 fRec17[0] = (fRec18[0] - (fConst39 * ((fConst38 * fRec17[2]) + (fConst8 * fRec17[1]))));
271 double fTemp7 = max(-1, min(1, (fSlow6 * (((fConst7 * fRec17[0]) + (fConst50 * fRec17[1])) + (fConst7 * fRec17[2])))));
272272 fRec24[0] = ((fConst49 * (fVec2[0] + fVec2[1])) + (fConst41 * fRec24[1]));
273 fRec23[0] = (fRec24[0] - (fConst39 * ((fConst38 * fRec23[2]) + (fConst10 * fRec23[1]))));
273 fRec23[0] = (fRec24[0] - (fConst39 * ((fConst38 * fRec23[2]) + (fConst8 * fRec23[1]))));
274274 double fTemp8 = max(-1, min(1, (fSlow7 * (fRec23[2] + (fRec23[0] + (2 * fRec23[1]))))));
275 double fTemp9 = (fConst10 * fRec25[1]);
275 double fTemp9 = (fConst8 * fRec25[1]);
276276 fRec27[0] = ((fConst47 * ((fConst51 * fVec1[1]) + (fConst15 * fVec1[0]))) + (fConst46 * fRec27[1]));
277277 fRec26[0] = (fRec27[0] - (fConst44 * ((fConst42 * fRec26[2]) + (fConst14 * fRec26[1]))));
278 fRec25[0] = ((fConst44 * (((fConst13 * fRec26[0]) + (fConst52 * fRec26[1])) + (fConst13 * fRec26[2]))) - (fConst11 * ((fConst8 * fRec25[2]) + fTemp9)));
279 double fTemp10 = max(-1, min(1, (fSlow8 * (fRec25[2] + (fConst11 * (fTemp9 + (fConst8 * fRec25[0])))))));
278 fRec25[0] = ((fConst44 * (((fConst13 * fRec26[0]) + (fConst52 * fRec26[1])) + (fConst13 * fRec26[2]))) - (fConst11 * ((fConst10 * fRec25[2]) + fTemp9)));
279 double fTemp10 = max(-1, min(1, (fSlow8 * (fRec25[2] + (fConst11 * (fTemp9 + (fConst10 * fRec25[0])))))));
280280 double fTemp11 = (((fTemp10 * (1 - (0.3333333333333333 * faustpower<2>(fTemp10)))) + ((fTemp8 * (1 - (0.3333333333333333 * faustpower<2>(fTemp8)))) + (0.841395141645195 * (fTemp7 * (1 - (0.3333333333333333 * faustpower<2>(fTemp7))))))) + (0.7943282347242815 * (fTemp4 * (1 - (0.3333333333333333 * faustpower<2>(fTemp4))))));
281281 fVec3[0] = fTemp11;
282282 fRec10[0] = ((fConst53 * (fVec3[0] + fVec3[1])) + (fConst5 * fRec10[1]));
0 namespace gxamp6 {
1 // generated from file '../src/faust/gxamp6.dsp'
2
3 double fConst0;
4 double fConst1;
5 double fConst2;
6 double fConst3;
7 double fConst4;
8 double fConst5;
9 double fConst6;
10 double fConst7;
11 double fConst8;
12 double fConst9;
13 double fConst10;
14 double fConst11;
15 double fConst12;
16 double fConst13;
17 double fConst14;
18 double fConst15;
19 double fConst16;
20 double fConst17;
21 double fVec0[2];
22 double fConst18;
23 double fRec5[2];
24 FAUSTFLOAT& fslider0 = get_alias("amp2.stage2.gain1");
25 double fRec6[2];
26 FAUSTFLOAT& fslider1 = get_alias("gxdistortion.wet_dry");
27 double fRec8[2];
28 double fConst19;
29 double fConst20;
30 double fConst21;
31 double fConst22;
32 double fConst23;
33 double fConst24;
34 double fConst25;
35 double fConst26;
36 double fConst27;
37 double fVec1[2];
38 double fConst28;
39 double fRec21[2];
40 double fRec20[2];
41 double fRec19[3];
42 double fRec18[3];
43 FAUSTFLOAT& fslider2 = get_alias("amp2.stage1.Pregain");
44 double fRec22[2];
45 double fConst29;
46 double fConst30;
47 double fConst31;
48 double fVec2[2];
49 double fConst32;
50 double fRec23[2];
51 double fRec17[2];
52 double fConst33;
53 double fConst34;
54 double fRec16[2];
55 double fConst35;
56 double fConst36;
57 double fConst37;
58 double fVec3[2];
59 double fConst38;
60 double fRec26[2];
61 double fRec25[2];
62 double fRec24[2];
63 double fRec15[2];
64 double fConst39;
65 double fRec14[2];
66 double fVec4[2];
67 double fRec27[2];
68 double fRec13[2];
69 double fRec12[2];
70 double fConst40;
71 double fConst41;
72 double fConst42;
73 double fVec5[2];
74 double fConst43;
75 double fRec30[2];
76 double fRec29[2];
77 double fRec28[2];
78 double fRec11[2];
79 double fVec6[2];
80 double fRec31[2];
81 double fRec10[2];
82 double fRec9[2];
83 FAUSTFLOAT& fslider3 = get_alias("gxdistortion.drive");
84 double fRec35[2];
85 double fRec34[2];
86 int IOTA;
87 double fVec7[65536];
88 int iConst44;
89 double fRec33[2];
90 double fConst45;
91 double fRec32[2];
92 double fConst46;
93 double fConst47;
94 double fConst48;
95 double fConst49;
96 double fConst50;
97 double fConst51;
98 double fConst52;
99 double fConst53;
100 double fConst54;
101 double fConst55;
102 double fConst56;
103 double fConst57;
104 double fConst58;
105 double fConst59;
106 double fConst60;
107 double fConst61;
108 double fConst62;
109 double fConst63;
110 double fConst64;
111 double fConst65;
112 double fConst66;
113 double fConst67;
114 double fConst68;
115 double fConst69;
116 double fConst70;
117 double fConst71;
118 double fConst72;
119 double fRec42[3];
120 double fVec8[2];
121 double fConst73;
122 double fRec41[2];
123 double fConst74;
124 double fConst75;
125 double fRec40[2];
126 double fRec39[3];
127 double fConst76;
128 double fRec38[3];
129 double fRec37[3];
130 double fConst77;
131 double fConst78;
132 double fConst79;
133 double fConst80;
134 double fConst81;
135 double fConst82;
136 double fConst83;
137 double fConst84;
138 double fConst85;
139 double fRec48[2];
140 double fRec47[3];
141 double fVec9[2];
142 double fConst86;
143 double fRec46[2];
144 double fRec45[3];
145 double fVec10[2];
146 double fConst87;
147 double fConst88;
148 double fRec44[2];
149 double fRec43[3];
150 double fConst89;
151 double fRec50[2];
152 double fRec49[3];
153 double fConst90;
154 double fRec53[2];
155 double fRec52[3];
156 double fConst91;
157 double fRec51[3];
158 double fVec11[2];
159 double fConst92;
160 double fRec36[2];
161 double fVec12[2];
162 double fRec7[2];
163 double fRec4[2];
164 double fConst93;
165 double fRec3[2];
166 double fVec13[2];
167 double fRec56[2];
168 double fRec55[2];
169 double fRec54[2];
170 double fVec14[3];
171 double fConst94;
172 double fConst95;
173 double fRec2[3];
174 double fConst96;
175 double fConst97;
176 double fRec1[3];
177 double fConst98;
178 double fConst99;
179 double fRec0[3];
180 int fSamplingFreq;
181
182 void init(int samplingFreq)
183 {
184 fSamplingFreq = samplingFreq;
185 fConst0 = (31704.95306002819 / fSamplingFreq);
186 fConst1 = (2 * cos(fConst0));
187 fConst2 = (0.026178010471204185 * sin(fConst0));
188 fConst3 = (fConst2 - 1);
189 fConst4 = (49574.33207364693 / fSamplingFreq);
190 fConst5 = (2 * cos(fConst4));
191 fConst6 = (0.07042253521126761 * sin(fConst4));
192 fConst7 = (fConst6 - 1);
193 fConst8 = (60601.32228774711 / fSamplingFreq);
194 fConst9 = (2 * cos(fConst8));
195 fConst10 = (0.03546099290780142 * sin(fConst8));
196 fConst11 = (fConst10 - 1);
197 fConst12 = (1.0 / tan((97.38937226128358 / fSamplingFreq)));
198 fConst13 = (1 + fConst12);
199 fConst14 = (0 - ((1 - fConst12) / fConst13));
200 fConst15 = (1.0 / tan((20517.741620594938 / fSamplingFreq)));
201 fConst16 = (1 + fConst15);
202 fConst17 = (0 - ((1 - fConst15) / fConst16));
203 for (int i=0; i<2; i++) fVec0[i] = 0;
204 fConst18 = (0.0041 / fConst16);
205 for (int i=0; i<2; i++) fRec5[i] = 0;
206 for (int i=0; i<2; i++) fRec6[i] = 0;
207 for (int i=0; i<2; i++) fRec8[i] = 0;
208 fConst19 = tan((37699.11184307752 / fSamplingFreq));
209 fConst20 = (2 * (1 - (1.0 / faustpower<2>(fConst19))));
210 fConst21 = (1.0 / fConst19);
211 fConst22 = (1 + ((fConst21 - 0.7653668647301795) / fConst19));
212 fConst23 = (1.0 / (1 + ((0.7653668647301795 + fConst21) / fConst19)));
213 fConst24 = (1 + ((fConst21 - 1.8477590650225735) / fConst19));
214 fConst25 = (1.0 / (1 + ((fConst21 + 1.8477590650225735) / fConst19)));
215 fConst26 = (973.8937226128359 / fSamplingFreq);
216 fConst27 = (1 - fConst26);
217 for (int i=0; i<2; i++) fVec1[i] = 0;
218 fConst28 = (1.0 / (1 + fConst26));
219 for (int i=0; i<2; i++) fRec21[i] = 0;
220 for (int i=0; i<2; i++) fRec20[i] = 0;
221 for (int i=0; i<3; i++) fRec19[i] = 0;
222 for (int i=0; i<3; i++) fRec18[i] = 0;
223 for (int i=0; i<2; i++) fRec22[i] = 0;
224 fConst29 = (1.0 / tan((270.1769682087222 / fSamplingFreq)));
225 fConst30 = (1 + fConst29);
226 fConst31 = (0 - ((1 - fConst29) / fConst30));
227 for (int i=0; i<2; i++) fVec2[i] = 0;
228 fConst32 = (0.027 / fConst30);
229 for (int i=0; i<2; i++) fRec23[i] = 0;
230 for (int i=0; i<2; i++) fRec17[i] = 0;
231 fConst33 = (0 - fConst12);
232 fConst34 = (0.05 / fConst13);
233 for (int i=0; i<2; i++) fRec16[i] = 0;
234 fConst35 = (1.0 / tan((414.6902302738527 / fSamplingFreq)));
235 fConst36 = (1 + fConst35);
236 fConst37 = (0 - ((1 - fConst35) / fConst36));
237 for (int i=0; i<2; i++) fVec3[i] = 0;
238 fConst38 = (0.015 / fConst36);
239 for (int i=0; i<2; i++) fRec26[i] = 0;
240 for (int i=0; i<2; i++) fRec25[i] = 0;
241 for (int i=0; i<2; i++) fRec24[i] = 0;
242 for (int i=0; i<2; i++) fRec15[i] = 0;
243 fConst39 = (1.0 / fConst16);
244 for (int i=0; i<2; i++) fRec14[i] = 0;
245 for (int i=0; i<2; i++) fVec4[i] = 0;
246 for (int i=0; i<2; i++) fRec27[i] = 0;
247 for (int i=0; i<2; i++) fRec13[i] = 0;
248 for (int i=0; i<2; i++) fRec12[i] = 0;
249 fConst40 = (1.0 / tan((609.4689747964198 / fSamplingFreq)));
250 fConst41 = (1 + fConst40);
251 fConst42 = (0 - ((1 - fConst40) / fConst41));
252 for (int i=0; i<2; i++) fVec5[i] = 0;
253 fConst43 = (0.0082 / fConst41);
254 for (int i=0; i<2; i++) fRec30[i] = 0;
255 for (int i=0; i<2; i++) fRec29[i] = 0;
256 for (int i=0; i<2; i++) fRec28[i] = 0;
257 for (int i=0; i<2; i++) fRec11[i] = 0;
258 for (int i=0; i<2; i++) fVec6[i] = 0;
259 for (int i=0; i<2; i++) fRec31[i] = 0;
260 for (int i=0; i<2; i++) fRec10[i] = 0;
261 for (int i=0; i<2; i++) fRec9[i] = 0;
262 for (int i=0; i<2; i++) fRec35[i] = 0;
263 for (int i=0; i<2; i++) fRec34[i] = 0;
264 IOTA = 0;
265 for (int i=0; i<65536; i++) fVec7[i] = 0;
266 iConst44 = int((int((0.1111111111111111 * fSamplingFreq)) & 65535));
267 for (int i=0; i<2; i++) fRec33[i] = 0;
268 fConst45 = (0.009000000000000008 / fSamplingFreq);
269 for (int i=0; i<2; i++) fRec32[i] = 0;
270 fConst46 = tan((942.4777960769379 / fSamplingFreq));
271 fConst47 = (1.0 / faustpower<2>(fConst46));
272 fConst48 = (2 * (1 - fConst47));
273 fConst49 = (1.0 / fConst46);
274 fConst50 = (1 + ((fConst49 - 1.0) / fConst46));
275 fConst51 = (1.0 / (1 + ((1.0 + fConst49) / fConst46)));
276 fConst52 = tan((3769.9111843077517 / fSamplingFreq));
277 fConst53 = (1.0 / faustpower<2>(fConst52));
278 fConst54 = (2 * (1 - fConst53));
279 fConst55 = (1.0 / fConst52);
280 fConst56 = (1 + ((fConst55 - 1.0) / fConst52));
281 fConst57 = (1.0 / (1 + ((1.0 + fConst55) / fConst52)));
282 fConst58 = tan((10053.096491487338 / fSamplingFreq));
283 fConst59 = (1.0 / faustpower<2>(fConst58));
284 fConst60 = (2 * (1 - fConst59));
285 fConst61 = (1.0 / fConst58);
286 fConst62 = (1 + ((fConst61 - 1.0000000000000004) / fConst58));
287 fConst63 = (1 + ((1.0000000000000004 + fConst61) / fConst58));
288 fConst64 = (1.0 / fConst63);
289 fConst65 = (1 + fConst61);
290 fConst66 = (0 - ((1 - fConst61) / fConst65));
291 fConst67 = tan((47123.8898038469 / fSamplingFreq));
292 fConst68 = (2 * (1 - (1.0 / faustpower<2>(fConst67))));
293 fConst69 = (1.0 / fConst67);
294 fConst70 = (1 + ((fConst69 - 1.414213562373095) / fConst67));
295 fConst71 = (1 + ((1.414213562373095 + fConst69) / fConst67));
296 fConst72 = (1.0 / fConst71);
297 for (int i=0; i<3; i++) fRec42[i] = 0;
298 for (int i=0; i<2; i++) fVec8[i] = 0;
299 fConst73 = (1.0 / (fConst13 * fConst71));
300 for (int i=0; i<2; i++) fRec41[i] = 0;
301 fConst74 = (0 - fConst61);
302 fConst75 = (1.0 / fConst65);
303 for (int i=0; i<2; i++) fRec40[i] = 0;
304 for (int i=0; i<3; i++) fRec39[i] = 0;
305 fConst76 = (2 * (0 - fConst59));
306 for (int i=0; i<3; i++) fRec38[i] = 0;
307 for (int i=0; i<3; i++) fRec37[i] = 0;
308 fConst77 = (1 + ((fConst49 - 1.0000000000000004) / fConst46));
309 fConst78 = (1.0 / (1 + ((fConst49 + 1.0000000000000004) / fConst46)));
310 fConst79 = (1 + fConst49);
311 fConst80 = (0 - ((1 - fConst49) / fConst79));
312 fConst81 = (1 + ((fConst55 - 1.0000000000000004) / fConst52));
313 fConst82 = (1 + ((fConst55 + 1.0000000000000004) / fConst52));
314 fConst83 = (1.0 / fConst82);
315 fConst84 = (1 + fConst55);
316 fConst85 = (0 - ((1 - fConst55) / fConst84));
317 for (int i=0; i<2; i++) fRec48[i] = 0;
318 for (int i=0; i<3; i++) fRec47[i] = 0;
319 for (int i=0; i<2; i++) fVec9[i] = 0;
320 fConst86 = (1.0 / (fConst84 * fConst63));
321 for (int i=0; i<2; i++) fRec46[i] = 0;
322 for (int i=0; i<3; i++) fRec45[i] = 0;
323 for (int i=0; i<2; i++) fVec10[i] = 0;
324 fConst87 = (0 - fConst49);
325 fConst88 = (1.0 / (fConst79 * fConst82));
326 for (int i=0; i<2; i++) fRec44[i] = 0;
327 for (int i=0; i<3; i++) fRec43[i] = 0;
328 fConst89 = (2 * (0 - fConst47));
329 for (int i=0; i<2; i++) fRec50[i] = 0;
330 for (int i=0; i<3; i++) fRec49[i] = 0;
331 fConst90 = (0 - fConst55);
332 for (int i=0; i<2; i++) fRec53[i] = 0;
333 for (int i=0; i<3; i++) fRec52[i] = 0;
334 fConst91 = (2 * (0 - fConst53));
335 for (int i=0; i<3; i++) fRec51[i] = 0;
336 for (int i=0; i<2; i++) fVec11[i] = 0;
337 fConst92 = (1.5848931924611136 / fConst16);
338 for (int i=0; i<2; i++) fRec36[i] = 0;
339 for (int i=0; i<2; i++) fVec12[i] = 0;
340 for (int i=0; i<2; i++) fRec7[i] = 0;
341 for (int i=0; i<2; i++) fRec4[i] = 0;
342 fConst93 = (0.025 / fConst13);
343 for (int i=0; i<2; i++) fRec3[i] = 0;
344 for (int i=0; i<2; i++) fVec13[i] = 0;
345 for (int i=0; i<2; i++) fRec56[i] = 0;
346 for (int i=0; i<2; i++) fRec55[i] = 0;
347 for (int i=0; i<2; i++) fRec54[i] = 0;
348 for (int i=0; i<3; i++) fVec14[i] = 0;
349 fConst94 = (0 - fConst9);
350 fConst95 = (1.0 / (1 + fConst10));
351 for (int i=0; i<3; i++) fRec2[i] = 0;
352 fConst96 = (0 - fConst5);
353 fConst97 = (1.0 / (1 + fConst6));
354 for (int i=0; i<3; i++) fRec1[i] = 0;
355 fConst98 = (0 - fConst1);
356 fConst99 = (1.0 / (1 + fConst2));
357 for (int i=0; i<3; i++) fRec0[i] = 0;
358 }
359
360 void compute(int count, float *input0, float *output0)
361 {
362 double fSlow0 = (0.0010000000000000009 * pow(10,(0.05 * fslider0)));
363 double fSlow1 = fslider1;
364 double fSlow2 = (0.0010000000000000009 * (1 - (0.01 * fSlow1)));
365 double fSlow3 = (0.0010000000000000009 * pow(10,(0.05 * fslider2)));
366 double fSlow4 = fslider3;
367 double fSlow5 = (1.25 * fSlow4);
368 double fSlow6 = (1.000000000000001e-05 * fSlow1);
369 double fSlow7 = (2 * (fSlow4 - 0.5));
370 double fSlow8 = (0.024937655860349125 * (1 - max(0, fSlow7)));
371 double fSlow9 = pow(1e+01,(0.8 * fSlow4));
372 double fSlow10 = (fConst78 * pow(1e+01,(2 * fSlow4)));
373 double fSlow11 = (fConst78 * pow(1e+01,(0.9 * fSlow4)));
374 double fSlow12 = pow(1e+01,(1.2 * fSlow4));
375 double fSlow13 = (1 - max(0, (0 - fSlow7)));
376 for (int i=0; i<count; i++) {
377 double fTemp0 = (fRec4[1] - 2.5e+02);
378 fVec0[0] = fTemp0;
379 fRec5[0] = ((fConst18 * (fVec0[0] + fVec0[1])) + (fConst17 * fRec5[1]));
380 fRec6[0] = (fSlow0 + (0.999 * fRec6[1]));
381 fRec8[0] = (fSlow2 + (0.999 * fRec8[1]));
382 double fTemp1 = (double)input0[i];
383 fVec1[0] = fTemp1;
384 fRec21[0] = (fConst28 * ((fVec1[0] - fVec1[1]) + (fConst27 * fRec21[1])));
385 fRec20[0] = (fConst28 * ((fRec21[0] - fRec21[1]) + (fConst27 * fRec20[1])));
386 fRec19[0] = (fRec20[0] - (fConst25 * ((fConst24 * fRec19[2]) + (fConst20 * fRec19[1]))));
387 fRec18[0] = ((fConst25 * (fRec19[2] + (fRec19[0] + (2 * fRec19[1])))) - (fConst23 * ((fConst22 * fRec18[2]) + (fConst20 * fRec18[1]))));
388 fRec22[0] = (fSlow3 + (0.999 * fRec22[1]));
389 double fTemp2 = (fRec17[1] - 1.3e+02);
390 fVec2[0] = fTemp2;
391 fRec23[0] = ((fConst32 * (fVec2[0] + fVec2[1])) + (fConst31 * fRec23[1]));
392 fRec17[0] = Ftube4(0, (fRec23[0] + (fConst23 * (fRec22[0] * (fRec18[2] + (fRec18[0] + (2 * fRec18[1])))))));
393 fRec16[0] = ((fConst34 * ((fConst33 * fRec17[1]) + (fConst12 * fRec17[0]))) + (fConst14 * fRec16[1]));
394 double fTemp3 = (fRec25[1] - 1.3e+02);
395 fVec3[0] = fTemp3;
396 fRec26[0] = ((fConst38 * (fVec3[0] + fVec3[1])) + (fConst37 * fRec26[1]));
397 fRec25[0] = Ftube4(1, (fRec26[0] + fRec15[1]));
398 fRec24[0] = ((fConst34 * ((fConst33 * fRec25[1]) + (fConst12 * fRec25[0]))) + (fConst14 * fRec24[1]));
399 fRec15[0] = (fRec24[0] + fRec16[0]);
400 fRec14[0] = ((fConst39 * (fRec15[0] + fRec15[1])) + (fConst17 * fRec14[1]));
401 double fTemp4 = (fRec13[1] - 1.3e+02);
402 fVec4[0] = fTemp4;
403 fRec27[0] = ((fConst38 * (fVec4[0] + fVec4[1])) + (fConst37 * fRec27[1]));
404 fRec13[0] = Ftube4(1, (fRec27[0] + fRec14[0]));
405 fRec12[0] = ((fConst34 * ((fConst33 * fRec13[1]) + (fConst12 * fRec13[0]))) + (fConst14 * fRec12[1]));
406 double fTemp5 = (fRec29[1] - 1.3e+02);
407 fVec5[0] = fTemp5;
408 fRec30[0] = ((fConst43 * (fVec5[0] + fVec5[1])) + (fConst42 * fRec30[1]));
409 fRec29[0] = Ftube4(1, (fRec30[0] + fRec11[1]));
410 fRec28[0] = ((fConst34 * ((fConst33 * fRec29[1]) + (fConst12 * fRec29[0]))) + (fConst14 * fRec28[1]));
411 fRec11[0] = (fRec28[0] + fRec12[0]);
412 double fTemp6 = (fRec10[1] - 1.3e+02);
413 fVec6[0] = fTemp6;
414 fRec31[0] = ((fConst43 * (fVec6[0] + fVec6[1])) + (fConst42 * fRec31[1]));
415 fRec10[0] = Ftube4(1, (fRec31[0] + fRec11[0]));
416 fRec9[0] = ((fConst34 * ((fConst33 * fRec10[1]) + (fConst12 * fRec10[0]))) + (fConst14 * fRec9[1]));
417 double fTemp7 = (fRec9[0] * fRec8[0]);
418 fRec35[0] = (fSlow6 + (0.999 * fRec35[1]));
419 double fTemp8 = (fRec9[0] * fRec35[0]);
420 double fTemp9 = fabs(fTemp8);
421 fRec34[0] = ((9.999999999998899e-05 * fTemp9) + (0.9999 * fRec34[1]));
422 double fTemp10 = max(fRec34[0], fTemp9);
423 fVec7[IOTA&65535] = fTemp10;
424 fRec33[0] = ((fVec7[IOTA&65535] + fRec33[1]) - fVec7[(IOTA-iConst44)&65535]);
425 fRec32[0] = ((fConst45 * fRec33[0]) + (0.999 * fRec32[1]));
426 double fTemp11 = max(-1, min(-0.01, (fVec7[IOTA&65535] - (1.0 + (1.02 * fRec32[0])))));
427 double fTemp12 = (0 - fTemp11);
428 double fTemp13 = (40.1 * fTemp12);
429 double fTemp14 = max(-600, fTemp13);
430 double fTemp15 = (0 - fTemp14);
431 double fTemp16 = (fTemp8 - fTemp11);
432 double fTemp17 = (40.1 * fTemp16);
433 double fTemp18 = max(-600, fTemp17);
434 double fTemp19 = (0 - fTemp18);
435 double fTemp20 = (((int((fabs(fTemp17) > 0.0001)))?((int((fTemp18 < -50)))?(exp(fTemp18) * fTemp19):(fTemp18 / (1 - exp(fTemp19)))):(1 + (fTemp16 * (20.05 + (134.00083333333336 * fTemp16))))) - ((int((fabs(fTemp13) > 0.0001)))?((int((fTemp14 < -50)))?(exp(fTemp14) * fTemp15):(fTemp14 / (1 - exp(fTemp15)))):(1 + (fTemp12 * (20.05 + (134.00083333333336 * fTemp12))))));
436 double fTemp21 = (fConst48 * fRec37[1]);
437 double fTemp22 = (fConst54 * fRec38[1]);
438 fRec42[0] = ((0.024937655860349125 * fTemp20) - (fConst72 * ((fConst70 * fRec42[2]) + (fConst68 * fRec42[1]))));
439 double fTemp23 = (fRec42[2] + (fRec42[0] + (2 * fRec42[1])));
440 fVec8[0] = fTemp23;
441 fRec41[0] = ((fConst73 * ((fConst33 * fVec8[1]) + (fConst12 * fVec8[0]))) + (fConst14 * fRec41[1]));
442 fRec40[0] = ((fConst75 * ((fConst74 * fRec41[1]) + (fConst61 * fRec41[0]))) + (fConst66 * fRec40[1]));
443 fRec39[0] = (fRec40[0] - (fConst64 * ((fConst62 * fRec39[2]) + (fConst60 * fRec39[1]))));
444 fRec38[0] = ((fConst64 * (((fConst59 * fRec39[0]) + (fConst76 * fRec39[1])) + (fConst59 * fRec39[2]))) - (fConst57 * ((fConst56 * fRec38[2]) + fTemp22)));
445 fRec37[0] = ((fRec38[2] + (fConst57 * (fTemp22 + (fConst56 * fRec38[0])))) - (fConst51 * ((fConst50 * fRec37[2]) + fTemp21)));
446 double fTemp24 = max(-1, min(1, (fSlow9 * (fRec37[2] + (fConst51 * (fTemp21 + (fConst50 * fRec37[0])))))));
447 fRec48[0] = ((fConst75 * (fRec41[0] + fRec41[1])) + (fConst66 * fRec48[1]));
448 fRec47[0] = (fRec48[0] - (fConst64 * ((fConst62 * fRec47[2]) + (fConst60 * fRec47[1]))));
449 double fTemp25 = (fRec47[2] + (fRec47[0] + (2 * fRec47[1])));
450 fVec9[0] = fTemp25;
451 fRec46[0] = ((fConst86 * (fVec9[0] + fVec9[1])) + (fConst85 * fRec46[1]));
452 fRec45[0] = (fRec46[0] - (fConst83 * ((fConst81 * fRec45[2]) + (fConst54 * fRec45[1]))));
453 double fTemp26 = (fRec45[2] + (fRec45[0] + (2 * fRec45[1])));
454 fVec10[0] = fTemp26;
455 fRec44[0] = ((fConst88 * ((fConst87 * fVec10[1]) + (fConst49 * fVec10[0]))) + (fConst80 * fRec44[1]));
456 fRec43[0] = (fRec44[0] - (fConst78 * ((fConst77 * fRec43[2]) + (fConst48 * fRec43[1]))));
457 double fTemp27 = max(-1, min(1, (fSlow10 * (((fConst47 * fRec43[0]) + (fConst89 * fRec43[1])) + (fConst47 * fRec43[2])))));
458 fRec50[0] = ((fConst88 * (fVec10[0] + fVec10[1])) + (fConst80 * fRec50[1]));
459 fRec49[0] = (fRec50[0] - (fConst78 * ((fConst77 * fRec49[2]) + (fConst48 * fRec49[1]))));
460 double fTemp28 = max(-1, min(1, (fSlow11 * (fRec49[2] + (fRec49[0] + (2 * fRec49[1]))))));
461 double fTemp29 = (fConst48 * fRec51[1]);
462 fRec53[0] = ((fConst86 * ((fConst90 * fVec9[1]) + (fConst55 * fVec9[0]))) + (fConst85 * fRec53[1]));
463 fRec52[0] = (fRec53[0] - (fConst83 * ((fConst81 * fRec52[2]) + (fConst54 * fRec52[1]))));
464 fRec51[0] = ((fConst83 * (((fConst53 * fRec52[0]) + (fConst91 * fRec52[1])) + (fConst53 * fRec52[2]))) - (fConst51 * ((fConst50 * fRec51[2]) + fTemp29)));
465 double fTemp30 = max(-1, min(1, (fSlow12 * (fRec51[2] + (fConst51 * (fTemp29 + (fConst50 * fRec51[0])))))));
466 double fTemp31 = (((fTemp30 * (1 - (0.3333333333333333 * faustpower<2>(fTemp30)))) + ((fTemp28 * (1 - (0.3333333333333333 * faustpower<2>(fTemp28)))) + (0.841395141645195 * (fTemp27 * (1 - (0.3333333333333333 * faustpower<2>(fTemp27))))))) + (0.7943282347242815 * (fTemp24 * (1 - (0.3333333333333333 * faustpower<2>(fTemp24))))));
467 fVec11[0] = fTemp31;
468 fRec36[0] = ((fConst92 * (fVec11[0] + fVec11[1])) + (fConst17 * fRec36[1]));
469 double fTemp32 = (((fSlow13 * fRec36[0]) + (fSlow8 * fTemp20)) + (fTemp7 * (1 + (fSlow5 * ((4 - (4 * fabs(fTemp7))) - 1)))));
470 fVec12[0] = fTemp32;
471 fRec7[0] = ((fConst39 * (fVec12[0] + fVec12[1])) + (fConst17 * fRec7[1]));
472 double fTemp33 = (fRec7[0] * fRec6[0]);
473 fRec4[0] = Ftube2(0, (fTemp33 + fRec5[0]));
474 fRec3[0] = ((fConst93 * ((fConst33 * fRec4[1]) + (fConst12 * fRec4[0]))) + (fConst14 * fRec3[1]));
475 double fTemp34 = (fRec55[1] - 2.5e+02);
476 fVec13[0] = fTemp34;
477 fRec56[0] = ((fConst18 * (fVec13[0] + fVec13[1])) + (fConst17 * fRec56[1]));
478 fRec55[0] = Ftube2(1, (fRec56[0] + fTemp33));
479 fRec54[0] = ((fConst93 * ((fConst33 * fRec55[1]) + (fConst12 * fRec55[0]))) + (fConst14 * fRec54[1]));
480 double fTemp35 = (min(0.7, fRec54[0]) + max(-0.75, fRec3[0]));
481 fVec14[0] = fTemp35;
482 fRec2[0] = (fConst95 * ((fVec14[2] + (fVec14[0] + (fConst94 * fVec14[1]))) + ((fConst11 * fRec2[2]) + (fConst9 * fRec2[1]))));
483 fRec1[0] = (fConst97 * ((fRec2[2] + (fRec2[0] + (fConst96 * fRec2[1]))) + ((fConst7 * fRec1[2]) + (fConst5 * fRec1[1]))));
484 fRec0[0] = (fConst99 * ((fRec1[2] + (fRec1[0] + (fConst98 * fRec1[1]))) + ((fConst3 * fRec0[2]) + (fConst1 * fRec0[1]))));
485 output0[i] = (FAUSTFLOAT)fRec0[0];
486 // post processing
487 fRec0[2] = fRec0[1]; fRec0[1] = fRec0[0];
488 fRec1[2] = fRec1[1]; fRec1[1] = fRec1[0];
489 fRec2[2] = fRec2[1]; fRec2[1] = fRec2[0];
490 fVec14[2] = fVec14[1]; fVec14[1] = fVec14[0];
491 fRec54[1] = fRec54[0];
492 fRec55[1] = fRec55[0];
493 fRec56[1] = fRec56[0];
494 fVec13[1] = fVec13[0];
495 fRec3[1] = fRec3[0];
496 fRec4[1] = fRec4[0];
497 fRec7[1] = fRec7[0];
498 fVec12[1] = fVec12[0];
499 fRec36[1] = fRec36[0];
500 fVec11[1] = fVec11[0];
501 fRec51[2] = fRec51[1]; fRec51[1] = fRec51[0];
502 fRec52[2] = fRec52[1]; fRec52[1] = fRec52[0];
503 fRec53[1] = fRec53[0];
504 fRec49[2] = fRec49[1]; fRec49[1] = fRec49[0];
505 fRec50[1] = fRec50[0];
506 fRec43[2] = fRec43[1]; fRec43[1] = fRec43[0];
507 fRec44[1] = fRec44[0];
508 fVec10[1] = fVec10[0];
509 fRec45[2] = fRec45[1]; fRec45[1] = fRec45[0];
510 fRec46[1] = fRec46[0];
511 fVec9[1] = fVec9[0];
512 fRec47[2] = fRec47[1]; fRec47[1] = fRec47[0];
513 fRec48[1] = fRec48[0];
514 fRec37[2] = fRec37[1]; fRec37[1] = fRec37[0];
515 fRec38[2] = fRec38[1]; fRec38[1] = fRec38[0];
516 fRec39[2] = fRec39[1]; fRec39[1] = fRec39[0];
517 fRec40[1] = fRec40[0];
518 fRec41[1] = fRec41[0];
519 fVec8[1] = fVec8[0];
520 fRec42[2] = fRec42[1]; fRec42[1] = fRec42[0];
521 fRec32[1] = fRec32[0];
522 fRec33[1] = fRec33[0];
523 IOTA = IOTA+1;
524 fRec34[1] = fRec34[0];
525 fRec35[1] = fRec35[0];
526 fRec9[1] = fRec9[0];
527 fRec10[1] = fRec10[0];
528 fRec31[1] = fRec31[0];
529 fVec6[1] = fVec6[0];
530 fRec11[1] = fRec11[0];
531 fRec28[1] = fRec28[0];
532 fRec29[1] = fRec29[0];
533 fRec30[1] = fRec30[0];
534 fVec5[1] = fVec5[0];
535 fRec12[1] = fRec12[0];
536 fRec13[1] = fRec13[0];
537 fRec27[1] = fRec27[0];
538 fVec4[1] = fVec4[0];
539 fRec14[1] = fRec14[0];
540 fRec15[1] = fRec15[0];
541 fRec24[1] = fRec24[0];
542 fRec25[1] = fRec25[0];
543 fRec26[1] = fRec26[0];
544 fVec3[1] = fVec3[0];
545 fRec16[1] = fRec16[0];
546 fRec17[1] = fRec17[0];
547 fRec23[1] = fRec23[0];
548 fVec2[1] = fVec2[0];
549 fRec22[1] = fRec22[0];
550 fRec18[2] = fRec18[1]; fRec18[1] = fRec18[0];
551 fRec19[2] = fRec19[1]; fRec19[1] = fRec19[0];
552 fRec20[1] = fRec20[0];
553 fRec21[1] = fRec21[0];
554 fVec1[1] = fVec1[0];
555 fRec8[1] = fRec8[0];
556 fRec6[1] = fRec6[0];
557 fRec5[1] = fRec5[0];
558 fVec0[1] = fVec0[0];
559 }
560 }
561
562 static struct RegisterParams { RegisterParams(); } RegisterParams;
563 RegisterParams::RegisterParams()
564 {
565 registerInit("amp2", init);
566 }
567
568 } // end namespace gxamp6
0 namespace gxamp7 {
1 // generated from file '../src/faust/gxamp7.dsp'
2
3 double fConst0;
4 double fConst1;
5 double fConst2;
6 double fConst3;
7 double fConst4;
8 double fConst5;
9 double fConst6;
10 double fConst7;
11 double fConst8;
12 double fConst9;
13 double fConst10;
14 double fConst11;
15 double fConst12;
16 double fConst13;
17 double fConst14;
18 double fConst15;
19 double fConst16;
20 double fConst17;
21 double fVec0[2];
22 double fConst18;
23 double fRec5[2];
24 FAUSTFLOAT& fslider0 = get_alias("amp2.stage2.gain1");
25 double fRec6[2];
26 FAUSTFLOAT& fslider1 = get_alias("gxdistortion.wet_dry");
27 double fRec8[2];
28 double fConst19;
29 double fConst20;
30 double fConst21;
31 double fConst22;
32 double fConst23;
33 double fConst24;
34 double fConst25;
35 double fConst26;
36 double fConst27;
37 double fVec1[2];
38 double fConst28;
39 double fRec21[2];
40 double fRec20[2];
41 double fRec19[3];
42 double fRec18[3];
43 FAUSTFLOAT& fslider2 = get_alias("amp2.stage1.Pregain");
44 double fRec22[2];
45 double fConst29;
46 double fConst30;
47 double fConst31;
48 double fVec2[2];
49 double fConst32;
50 double fRec23[2];
51 double fRec17[2];
52 double fConst33;
53 double fConst34;
54 double fRec16[2];
55 double fConst35;
56 double fConst36;
57 double fConst37;
58 double fVec3[2];
59 double fConst38;
60 double fRec26[2];
61 double fRec25[2];
62 double fRec24[2];
63 double fRec15[2];
64 double fConst39;
65 double fRec14[2];
66 double fVec4[2];
67 double fRec27[2];
68 double fRec13[2];
69 double fRec12[2];
70 double fConst40;
71 double fConst41;
72 double fConst42;
73 double fVec5[2];
74 double fConst43;
75 double fRec30[2];
76 double fRec29[2];
77 double fRec28[2];
78 double fRec11[2];
79 double fVec6[2];
80 double fRec31[2];
81 double fRec10[2];
82 double fRec9[2];
83 FAUSTFLOAT& fslider3 = get_alias("gxdistortion.drive");
84 double fRec35[2];
85 double fRec34[2];
86 int IOTA;
87 double fVec7[65536];
88 int iConst44;
89 double fRec33[2];
90 double fConst45;
91 double fRec32[2];
92 double fConst46;
93 double fConst47;
94 double fConst48;
95 double fConst49;
96 double fConst50;
97 double fConst51;
98 double fConst52;
99 double fConst53;
100 double fConst54;
101 double fConst55;
102 double fConst56;
103 double fConst57;
104 double fConst58;
105 double fConst59;
106 double fConst60;
107 double fConst61;
108 double fConst62;
109 double fConst63;
110 double fConst64;
111 double fConst65;
112 double fConst66;
113 double fConst67;
114 double fConst68;
115 double fConst69;
116 double fConst70;
117 double fConst71;
118 double fConst72;
119 double fRec42[3];
120 double fVec8[2];
121 double fConst73;
122 double fRec41[2];
123 double fConst74;
124 double fConst75;
125 double fRec40[2];
126 double fRec39[3];
127 double fConst76;
128 double fRec38[3];
129 double fRec37[3];
130 double fConst77;
131 double fConst78;
132 double fConst79;
133 double fConst80;
134 double fConst81;
135 double fConst82;
136 double fConst83;
137 double fConst84;
138 double fConst85;
139 double fRec48[2];
140 double fRec47[3];
141 double fVec9[2];
142 double fConst86;
143 double fRec46[2];
144 double fRec45[3];
145 double fVec10[2];
146 double fConst87;
147 double fConst88;
148 double fRec44[2];
149 double fRec43[3];
150 double fConst89;
151 double fRec50[2];
152 double fRec49[3];
153 double fConst90;
154 double fRec53[2];
155 double fRec52[3];
156 double fConst91;
157 double fRec51[3];
158 double fVec11[2];
159 double fConst92;
160 double fRec36[2];
161 double fVec12[2];
162 double fRec7[2];
163 double fRec4[2];
164 double fRec3[2];
165 double fVec13[2];
166 double fRec56[2];
167 double fRec55[2];
168 double fRec54[2];
169 double fVec14[3];
170 double fConst93;
171 double fConst94;
172 double fRec2[3];
173 double fConst95;
174 double fConst96;
175 double fRec1[3];
176 double fConst97;
177 double fConst98;
178 double fRec0[3];
179 int fSamplingFreq;
180
181 void init(int samplingFreq)
182 {
183 fSamplingFreq = samplingFreq;
184 fConst0 = (31704.95306002819 / fSamplingFreq);
185 fConst1 = (2 * cos(fConst0));
186 fConst2 = (0.026178010471204185 * sin(fConst0));
187 fConst3 = (fConst2 - 1);
188 fConst4 = (49574.33207364693 / fSamplingFreq);
189 fConst5 = (2 * cos(fConst4));
190 fConst6 = (0.07042253521126761 * sin(fConst4));
191 fConst7 = (fConst6 - 1);
192 fConst8 = (60601.32228774711 / fSamplingFreq);
193 fConst9 = (2 * cos(fConst8));
194 fConst10 = (0.03546099290780142 * sin(fConst8));
195 fConst11 = (fConst10 - 1);
196 fConst12 = (1.0 / tan((97.38937226128358 / fSamplingFreq)));
197 fConst13 = (1 + fConst12);
198 fConst14 = (0 - ((1 - fConst12) / fConst13));
199 fConst15 = (1.0 / tan((20517.741620594938 / fSamplingFreq)));
200 fConst16 = (1 + fConst15);
201 fConst17 = (0 - ((1 - fConst15) / fConst16));
202 for (int i=0; i<2; i++) fVec0[i] = 0;
203 fConst18 = (0.0041 / fConst16);
204 for (int i=0; i<2; i++) fRec5[i] = 0;
205 for (int i=0; i<2; i++) fRec6[i] = 0;
206 for (int i=0; i<2; i++) fRec8[i] = 0;
207 fConst19 = tan((37699.11184307752 / fSamplingFreq));
208 fConst20 = (2 * (1 - (1.0 / faustpower<2>(fConst19))));
209 fConst21 = (1.0 / fConst19);
210 fConst22 = (1 + ((fConst21 - 0.7653668647301795) / fConst19));
211 fConst23 = (1.0 / (1 + ((0.7653668647301795 + fConst21) / fConst19)));
212 fConst24 = (1 + ((fConst21 - 1.8477590650225735) / fConst19));
213 fConst25 = (1.0 / (1 + ((fConst21 + 1.8477590650225735) / fConst19)));
214 fConst26 = (973.8937226128359 / fSamplingFreq);
215 fConst27 = (1 - fConst26);
216 for (int i=0; i<2; i++) fVec1[i] = 0;
217 fConst28 = (1.0 / (1 + fConst26));
218 for (int i=0; i<2; i++) fRec21[i] = 0;
219 for (int i=0; i<2; i++) fRec20[i] = 0;
220 for (int i=0; i<3; i++) fRec19[i] = 0;
221 for (int i=0; i<3; i++) fRec18[i] = 0;
222 for (int i=0; i<2; i++) fRec22[i] = 0;
223 fConst29 = (1.0 / tan((270.1769682087222 / fSamplingFreq)));
224 fConst30 = (1 + fConst29);
225 fConst31 = (0 - ((1 - fConst29) / fConst30));
226 for (int i=0; i<2; i++) fVec2[i] = 0;
227 fConst32 = (0.027 / fConst30);
228 for (int i=0; i<2; i++) fRec23[i] = 0;
229 for (int i=0; i<2; i++) fRec17[i] = 0;
230 fConst33 = (0 - fConst12);
231 fConst34 = (0.025 / fConst13);
232 for (int i=0; i<2; i++) fRec16[i] = 0;
233 fConst35 = (1.0 / tan((414.6902302738527 / fSamplingFreq)));
234 fConst36 = (1 + fConst35);
235 fConst37 = (0 - ((1 - fConst35) / fConst36));
236 for (int i=0; i<2; i++) fVec3[i] = 0;
237 fConst38 = (0.015 / fConst36);
238 for (int i=0; i<2; i++) fRec26[i] = 0;
239 for (int i=0; i<2; i++) fRec25[i] = 0;
240 for (int i=0; i<2; i++) fRec24[i] = 0;
241 for (int i=0; i<2; i++) fRec15[i] = 0;
242 fConst39 = (1.0 / fConst16);
243 for (int i=0; i<2; i++) fRec14[i] = 0;
244 for (int i=0; i<2; i++) fVec4[i] = 0;
245 for (int i=0; i<2; i++) fRec27[i] = 0;
246 for (int i=0; i<2; i++) fRec13[i] = 0;
247 for (int i=0; i<2; i++) fRec12[i] = 0;
248 fConst40 = (1.0 / tan((609.4689747964198 / fSamplingFreq)));
249 fConst41 = (1 + fConst40);
250 fConst42 = (0 - ((1 - fConst40) / fConst41));
251 for (int i=0; i<2; i++) fVec5[i] = 0;
252 fConst43 = (0.0082 / fConst41);
253 for (int i=0; i<2; i++) fRec30[i] = 0;
254 for (int i=0; i<2; i++) fRec29[i] = 0;
255 for (int i=0; i<2; i++) fRec28[i] = 0;
256 for (int i=0; i<2; i++) fRec11[i] = 0;
257 for (int i=0; i<2; i++) fVec6[i] = 0;
258 for (int i=0; i<2; i++) fRec31[i] = 0;
259 for (int i=0; i<2; i++) fRec10[i] = 0;
260 for (int i=0; i<2; i++) fRec9[i] = 0;
261 for (int i=0; i<2; i++) fRec35[i] = 0;
262 for (int i=0; i<2; i++) fRec34[i] = 0;
263 IOTA = 0;
264 for (int i=0; i<65536; i++) fVec7[i] = 0;
265 iConst44 = int((int((0.1111111111111111 * fSamplingFreq)) & 65535));
266 for (int i=0; i<2; i++) fRec33[i] = 0;
267 fConst45 = (0.009000000000000008 / fSamplingFreq);
268 for (int i=0; i<2; i++) fRec32[i] = 0;
269 fConst46 = tan((942.4777960769379 / fSamplingFreq));
270 fConst47 = (1.0 / faustpower<2>(fConst46));
271 fConst48 = (2 * (1 - fConst47));
272 fConst49 = (1.0 / fConst46);
273 fConst50 = (1 + ((fConst49 - 1.0) / fConst46));
274 fConst51 = (1.0 / (1 + ((1.0 + fConst49) / fConst46)));
275 fConst52 = tan((3769.9111843077517 / fSamplingFreq));
276 fConst53 = (1.0 / faustpower<2>(fConst52));
277 fConst54 = (2 * (1 - fConst53));
278 fConst55 = (1.0 / fConst52);
279 fConst56 = (1 + ((fConst55 - 1.0) / fConst52));
280 fConst57 = (1.0 / (1 + ((1.0 + fConst55) / fConst52)));
281 fConst58 = tan((10053.096491487338 / fSamplingFreq));
282 fConst59 = (1.0 / faustpower<2>(fConst58));
283 fConst60 = (2 * (1 - fConst59));
284 fConst61 = (1.0 / fConst58);
285 fConst62 = (1 + ((fConst61 - 1.0000000000000004) / fConst58));
286 fConst63 = (1 + ((1.0000000000000004 + fConst61) / fConst58));
287 fConst64 = (1.0 / fConst63);
288 fConst65 = (1 + fConst61);
289 fConst66 = (0 - ((1 - fConst61) / fConst65));
290 fConst67 = tan((47123.8898038469 / fSamplingFreq));
291 fConst68 = (2 * (1 - (1.0 / faustpower<2>(fConst67))));
292 fConst69 = (1.0 / fConst67);
293 fConst70 = (1 + ((fConst69 - 1.414213562373095) / fConst67));
294 fConst71 = (1 + ((1.414213562373095 + fConst69) / fConst67));
295 fConst72 = (1.0 / fConst71);
296 for (int i=0; i<3; i++) fRec42[i] = 0;
297 for (int i=0; i<2; i++) fVec8[i] = 0;
298 fConst73 = (1.0 / (fConst13 * fConst71));
299 for (int i=0; i<2; i++) fRec41[i] = 0;
300 fConst74 = (0 - fConst61);
301 fConst75 = (1.0 / fConst65);
302 for (int i=0; i<2; i++) fRec40[i] = 0;
303 for (int i=0; i<3; i++) fRec39[i] = 0;
304 fConst76 = (2 * (0 - fConst59));
305 for (int i=0; i<3; i++) fRec38[i] = 0;
306 for (int i=0; i<3; i++) fRec37[i] = 0;
307 fConst77 = (1 + ((fConst49 - 1.0000000000000004) / fConst46));
308 fConst78 = (1.0 / (1 + ((fConst49 + 1.0000000000000004) / fConst46)));
309 fConst79 = (1 + fConst49);
310 fConst80 = (0 - ((1 - fConst49) / fConst79));
311 fConst81 = (1 + ((fConst55 - 1.0000000000000004) / fConst52));
312 fConst82 = (1 + ((fConst55 + 1.0000000000000004) / fConst52));
313 fConst83 = (1.0 / fConst82);
314 fConst84 = (1 + fConst55);
315 fConst85 = (0 - ((1 - fConst55) / fConst84));
316 for (int i=0; i<2; i++) fRec48[i] = 0;
317 for (int i=0; i<3; i++) fRec47[i] = 0;
318 for (int i=0; i<2; i++) fVec9[i] = 0;
319 fConst86 = (1.0 / (fConst84 * fConst63));
320 for (int i=0; i<2; i++) fRec46[i] = 0;
321 for (int i=0; i<3; i++) fRec45[i] = 0;
322 for (int i=0; i<2; i++) fVec10[i] = 0;
323 fConst87 = (0 - fConst49);
324 fConst88 = (1.0 / (fConst79 * fConst82));
325 for (int i=0; i<2; i++) fRec44[i] = 0;
326 for (int i=0; i<3; i++) fRec43[i] = 0;
327 fConst89 = (2 * (0 - fConst47));
328 for (int i=0; i<2; i++) fRec50[i] = 0;
329 for (int i=0; i<3; i++) fRec49[i] = 0;
330 fConst90 = (0 - fConst55);
331 for (int i=0; i<2; i++) fRec53[i] = 0;
332 for (int i=0; i<3; i++) fRec52[i] = 0;
333 fConst91 = (2 * (0 - fConst53));
334 for (int i=0; i<3; i++) fRec51[i] = 0;
335 for (int i=0; i<2; i++) fVec11[i] = 0;
336 fConst92 = (1.5848931924611136 / fConst16);
337 for (int i=0; i<2; i++) fRec36[i] = 0;
338 for (int i=0; i<2; i++) fVec12[i] = 0;
339 for (int i=0; i<2; i++) fRec7[i] = 0;
340 for (int i=0; i<2; i++) fRec4[i] = 0;
341 for (int i=0; i<2; i++) fRec3[i] = 0;
342 for (int i=0; i<2; i++) fVec13[i] = 0;
343 for (int i=0; i<2; i++) fRec56[i] = 0;
344 for (int i=0; i<2; i++) fRec55[i] = 0;
345 for (int i=0; i<2; i++) fRec54[i] = 0;
346 for (int i=0; i<3; i++) fVec14[i] = 0;
347 fConst93 = (0 - fConst9);
348 fConst94 = (1.0 / (1 + fConst10));
349 for (int i=0; i<3; i++) fRec2[i] = 0;
350 fConst95 = (0 - fConst5);
351 fConst96 = (1.0 / (1 + fConst6));
352 for (int i=0; i<3; i++) fRec1[i] = 0;
353 fConst97 = (0 - fConst1);
354 fConst98 = (1.0 / (1 + fConst2));
355 for (int i=0; i<3; i++) fRec0[i] = 0;
356 }
357
358 void compute(int count, float *input0, float *output0)
359 {
360 double fSlow0 = (0.0010000000000000009 * pow(10,(0.05 * fslider0)));
361 double fSlow1 = fslider1;
362 double fSlow2 = (0.0010000000000000009 * (1 - (0.01 * fSlow1)));
363 double fSlow3 = (0.0010000000000000009 * pow(10,(0.05 * fslider2)));
364 double fSlow4 = fslider3;
365 double fSlow5 = (1.25 * fSlow4);
366 double fSlow6 = (1.000000000000001e-05 * fSlow1);
367 double fSlow7 = (2 * (fSlow4 - 0.5));
368 double fSlow8 = (0.024937655860349125 * (1 - max(0, fSlow7)));
369 double fSlow9 = pow(1e+01,(0.8 * fSlow4));
370 double fSlow10 = (fConst78 * pow(1e+01,(2 * fSlow4)));
371 double fSlow11 = (fConst78 * pow(1e+01,(0.9 * fSlow4)));
372 double fSlow12 = pow(1e+01,(1.2 * fSlow4));
373 double fSlow13 = (1 - max(0, (0 - fSlow7)));
374 for (int i=0; i<count; i++) {
375 double fTemp0 = (fRec4[1] - 2.5e+02);
376 fVec0[0] = fTemp0;
377 fRec5[0] = ((fConst18 * (fVec0[0] + fVec0[1])) + (fConst17 * fRec5[1]));
378 fRec6[0] = (fSlow0 + (0.999 * fRec6[1]));
379 fRec8[0] = (fSlow2 + (0.999 * fRec8[1]));
380 double fTemp1 = (double)input0[i];
381 fVec1[0] = fTemp1;
382 fRec21[0] = (fConst28 * ((fVec1[0] - fVec1[1]) + (fConst27 * fRec21[1])));
383 fRec20[0] = (fConst28 * ((fRec21[0] - fRec21[1]) + (fConst27 * fRec20[1])));
384 fRec19[0] = (fRec20[0] - (fConst25 * ((fConst24 * fRec19[2]) + (fConst20 * fRec19[1]))));
385 fRec18[0] = ((fConst25 * (fRec19[2] + (fRec19[0] + (2 * fRec19[1])))) - (fConst23 * ((fConst22 * fRec18[2]) + (fConst20 * fRec18[1]))));
386 fRec22[0] = (fSlow3 + (0.999 * fRec22[1]));
387 double fTemp2 = (fRec17[1] - 2.5e+02);
388 fVec2[0] = fTemp2;
389 fRec23[0] = ((fConst32 * (fVec2[0] + fVec2[1])) + (fConst31 * fRec23[1]));
390 fRec17[0] = Ftube(0, (fRec23[0] + (fConst23 * (fRec22[0] * (fRec18[2] + (fRec18[0] + (2 * fRec18[1])))))));
391 fRec16[0] = ((fConst34 * ((fConst33 * fRec17[1]) + (fConst12 * fRec17[0]))) + (fConst14 * fRec16[1]));
392 double fTemp3 = (fRec25[1] - 2.5e+02);
393 fVec3[0] = fTemp3;
394 fRec26[0] = ((fConst38 * (fVec3[0] + fVec3[1])) + (fConst37 * fRec26[1]));
395 fRec25[0] = Ftube(1, (fRec26[0] + fRec15[1]));
396 fRec24[0] = ((fConst34 * ((fConst33 * fRec25[1]) + (fConst12 * fRec25[0]))) + (fConst14 * fRec24[1]));
397 fRec15[0] = (fRec24[0] + fRec16[0]);
398 fRec14[0] = ((fConst39 * (fRec15[0] + fRec15[1])) + (fConst17 * fRec14[1]));
399 double fTemp4 = (fRec13[1] - 2.5e+02);
400 fVec4[0] = fTemp4;
401 fRec27[0] = ((fConst38 * (fVec4[0] + fVec4[1])) + (fConst37 * fRec27[1]));
402 fRec13[0] = Ftube(1, (fRec27[0] + fRec14[0]));
403 fRec12[0] = ((fConst34 * ((fConst33 * fRec13[1]) + (fConst12 * fRec13[0]))) + (fConst14 * fRec12[1]));
404 double fTemp5 = (fRec29[1] - 2.5e+02);
405 fVec5[0] = fTemp5;
406 fRec30[0] = ((fConst43 * (fVec5[0] + fVec5[1])) + (fConst42 * fRec30[1]));
407 fRec29[0] = Ftube(1, (fRec30[0] + fRec11[1]));
408 fRec28[0] = ((fConst34 * ((fConst33 * fRec29[1]) + (fConst12 * fRec29[0]))) + (fConst14 * fRec28[1]));
409 fRec11[0] = (fRec28[0] + fRec12[0]);
410 double fTemp6 = (fRec10[1] - 2.5e+02);
411 fVec6[0] = fTemp6;
412 fRec31[0] = ((fConst43 * (fVec6[0] + fVec6[1])) + (fConst42 * fRec31[1]));
413 fRec10[0] = Ftube(1, (fRec31[0] + fRec11[0]));
414 fRec9[0] = ((fConst34 * ((fConst33 * fRec10[1]) + (fConst12 * fRec10[0]))) + (fConst14 * fRec9[1]));
415 double fTemp7 = (fRec9[0] * fRec8[0]);
416 fRec35[0] = (fSlow6 + (0.999 * fRec35[1]));
417 double fTemp8 = (fRec9[0] * fRec35[0]);
418 double fTemp9 = fabs(fTemp8);
419 fRec34[0] = ((9.999999999998899e-05 * fTemp9) + (0.9999 * fRec34[1]));
420 double fTemp10 = max(fRec34[0], fTemp9);
421 fVec7[IOTA&65535] = fTemp10;
422 fRec33[0] = ((fVec7[IOTA&65535] + fRec33[1]) - fVec7[(IOTA-iConst44)&65535]);
423 fRec32[0] = ((fConst45 * fRec33[0]) + (0.999 * fRec32[1]));
424 double fTemp11 = max(-1, min(-0.01, (fVec7[IOTA&65535] - (1.0 + (1.02 * fRec32[0])))));
425 double fTemp12 = (0 - fTemp11);
426 double fTemp13 = (40.1 * fTemp12);
427 double fTemp14 = max(-600, fTemp13);
428 double fTemp15 = (0 - fTemp14);
429 double fTemp16 = (fTemp8 - fTemp11);
430 double fTemp17 = (40.1 * fTemp16);
431 double fTemp18 = max(-600, fTemp17);
432 double fTemp19 = (0 - fTemp18);
433 double fTemp20 = (((int((fabs(fTemp17) > 0.0001)))?((int((fTemp18 < -50)))?(exp(fTemp18) * fTemp19):(fTemp18 / (1 - exp(fTemp19)))):(1 + (fTemp16 * (20.05 + (134.00083333333336 * fTemp16))))) - ((int((fabs(fTemp13) > 0.0001)))?((int((fTemp14 < -50)))?(exp(fTemp14) * fTemp15):(fTemp14 / (1 - exp(fTemp15)))):(1 + (fTemp12 * (20.05 + (134.00083333333336 * fTemp12))))));
434 double fTemp21 = (fConst48 * fRec37[1]);
435 double fTemp22 = (fConst54 * fRec38[1]);
436 fRec42[0] = ((0.024937655860349125 * fTemp20) - (fConst72 * ((fConst70 * fRec42[2]) + (fConst68 * fRec42[1]))));
437 double fTemp23 = (fRec42[2] + (fRec42[0] + (2 * fRec42[1])));
438 fVec8[0] = fTemp23;
439 fRec41[0] = ((fConst73 * ((fConst33 * fVec8[1]) + (fConst12 * fVec8[0]))) + (fConst14 * fRec41[1]));
440 fRec40[0] = ((fConst75 * ((fConst74 * fRec41[1]) + (fConst61 * fRec41[0]))) + (fConst66 * fRec40[1]));
441 fRec39[0] = (fRec40[0] - (fConst64 * ((fConst62 * fRec39[2]) + (fConst60 * fRec39[1]))));
442 fRec38[0] = ((fConst64 * (((fConst59 * fRec39[0]) + (fConst76 * fRec39[1])) + (fConst59 * fRec39[2]))) - (fConst57 * ((fConst56 * fRec38[2]) + fTemp22)));
443 fRec37[0] = ((fRec38[2] + (fConst57 * (fTemp22 + (fConst56 * fRec38[0])))) - (fConst51 * ((fConst50 * fRec37[2]) + fTemp21)));
444 double fTemp24 = max(-1, min(1, (fSlow9 * (fRec37[2] + (fConst51 * (fTemp21 + (fConst50 * fRec37[0])))))));
445 fRec48[0] = ((fConst75 * (fRec41[0] + fRec41[1])) + (fConst66 * fRec48[1]));
446 fRec47[0] = (fRec48[0] - (fConst64 * ((fConst62 * fRec47[2]) + (fConst60 * fRec47[1]))));
447 double fTemp25 = (fRec47[2] + (fRec47[0] + (2 * fRec47[1])));
448 fVec9[0] = fTemp25;
449 fRec46[0] = ((fConst86 * (fVec9[0] + fVec9[1])) + (fConst85 * fRec46[1]));
450 fRec45[0] = (fRec46[0] - (fConst83 * ((fConst81 * fRec45[2]) + (fConst54 * fRec45[1]))));
451 double fTemp26 = (fRec45[2] + (fRec45[0] + (2 * fRec45[1])));
452 fVec10[0] = fTemp26;
453 fRec44[0] = ((fConst88 * ((fConst87 * fVec10[1]) + (fConst49 * fVec10[0]))) + (fConst80 * fRec44[1]));
454 fRec43[0] = (fRec44[0] - (fConst78 * ((fConst77 * fRec43[2]) + (fConst48 * fRec43[1]))));
455 double fTemp27 = max(-1, min(1, (fSlow10 * (((fConst47 * fRec43[0]) + (fConst89 * fRec43[1])) + (fConst47 * fRec43[2])))));
456 fRec50[0] = ((fConst88 * (fVec10[0] + fVec10[1])) + (fConst80 * fRec50[1]));
457 fRec49[0] = (fRec50[0] - (fConst78 * ((fConst77 * fRec49[2]) + (fConst48 * fRec49[1]))));
458 double fTemp28 = max(-1, min(1, (fSlow11 * (fRec49[2] + (fRec49[0] + (2 * fRec49[1]))))));
459 double fTemp29 = (fConst48 * fRec51[1]);
460 fRec53[0] = ((fConst86 * ((fConst90 * fVec9[1]) + (fConst55 * fVec9[0]))) + (fConst85 * fRec53[1]));
461 fRec52[0] = (fRec53[0] - (fConst83 * ((fConst81 * fRec52[2]) + (fConst54 * fRec52[1]))));
462 fRec51[0] = ((fConst83 * (((fConst53 * fRec52[0]) + (fConst91 * fRec52[1])) + (fConst53 * fRec52[2]))) - (fConst51 * ((fConst50 * fRec51[2]) + fTemp29)));
463 double fTemp30 = max(-1, min(1, (fSlow12 * (fRec51[2] + (fConst51 * (fTemp29 + (fConst50 * fRec51[0])))))));
464 double fTemp31 = (((fTemp30 * (1 - (0.3333333333333333 * faustpower<2>(fTemp30)))) + ((fTemp28 * (1 - (0.3333333333333333 * faustpower<2>(fTemp28)))) + (0.841395141645195 * (fTemp27 * (1 - (0.3333333333333333 * faustpower<2>(fTemp27))))))) + (0.7943282347242815 * (fTemp24 * (1 - (0.3333333333333333 * faustpower<2>(fTemp24))))));
465 fVec11[0] = fTemp31;
466 fRec36[0] = ((fConst92 * (fVec11[0] + fVec11[1])) + (fConst17 * fRec36[1]));
467 double fTemp32 = (((fSlow13 * fRec36[0]) + (fSlow8 * fTemp20)) + (fTemp7 * (1 + (fSlow5 * ((4 - (4 * fabs(fTemp7))) - 1)))));
468 fVec12[0] = fTemp32;
469 fRec7[0] = ((fConst39 * (fVec12[0] + fVec12[1])) + (fConst17 * fRec7[1]));
470 double fTemp33 = (fRec7[0] * fRec6[0]);
471 fRec4[0] = Ftube2(0, (fTemp33 + fRec5[0]));
472 fRec3[0] = ((fConst34 * ((fConst33 * fRec4[1]) + (fConst12 * fRec4[0]))) + (fConst14 * fRec3[1]));
473 double fTemp34 = (fRec55[1] - 2.5e+02);
474 fVec13[0] = fTemp34;
475 fRec56[0] = ((fConst18 * (fVec13[0] + fVec13[1])) + (fConst17 * fRec56[1]));
476 fRec55[0] = Ftube2(1, (fRec56[0] + fTemp33));
477 fRec54[0] = ((fConst34 * ((fConst33 * fRec55[1]) + (fConst12 * fRec55[0]))) + (fConst14 * fRec54[1]));
478 double fTemp35 = (min(0.7, fRec54[0]) + max(-0.75, fRec3[0]));
479 fVec14[0] = fTemp35;
480 fRec2[0] = (fConst94 * ((fVec14[2] + (fVec14[0] + (fConst93 * fVec14[1]))) + ((fConst11 * fRec2[2]) + (fConst9 * fRec2[1]))));
481 fRec1[0] = (fConst96 * ((fRec2[2] + (fRec2[0] + (fConst95 * fRec2[1]))) + ((fConst7 * fRec1[2]) + (fConst5 * fRec1[1]))));
482 fRec0[0] = (fConst98 * ((fRec1[2] + (fRec1[0] + (fConst97 * fRec1[1]))) + ((fConst3 * fRec0[2]) + (fConst1 * fRec0[1]))));
483 output0[i] = (FAUSTFLOAT)fRec0[0];
484 // post processing
485 fRec0[2] = fRec0[1]; fRec0[1] = fRec0[0];
486 fRec1[2] = fRec1[1]; fRec1[1] = fRec1[0];
487 fRec2[2] = fRec2[1]; fRec2[1] = fRec2[0];
488 fVec14[2] = fVec14[1]; fVec14[1] = fVec14[0];
489 fRec54[1] = fRec54[0];
490 fRec55[1] = fRec55[0];
491 fRec56[1] = fRec56[0];
492 fVec13[1] = fVec13[0];
493 fRec3[1] = fRec3[0];
494 fRec4[1] = fRec4[0];
495 fRec7[1] = fRec7[0];
496 fVec12[1] = fVec12[0];
497 fRec36[1] = fRec36[0];
498 fVec11[1] = fVec11[0];
499 fRec51[2] = fRec51[1]; fRec51[1] = fRec51[0];
500 fRec52[2] = fRec52[1]; fRec52[1] = fRec52[0];
501 fRec53[1] = fRec53[0];
502 fRec49[2] = fRec49[1]; fRec49[1] = fRec49[0];
503 fRec50[1] = fRec50[0];
504 fRec43[2] = fRec43[1]; fRec43[1] = fRec43[0];
505 fRec44[1] = fRec44[0];
506 fVec10[1] = fVec10[0];
507 fRec45[2] = fRec45[1]; fRec45[1] = fRec45[0];
508 fRec46[1] = fRec46[0];
509 fVec9[1] = fVec9[0];
510 fRec47[2] = fRec47[1]; fRec47[1] = fRec47[0];
511 fRec48[1] = fRec48[0];
512 fRec37[2] = fRec37[1]; fRec37[1] = fRec37[0];
513 fRec38[2] = fRec38[1]; fRec38[1] = fRec38[0];
514 fRec39[2] = fRec39[1]; fRec39[1] = fRec39[0];
515 fRec40[1] = fRec40[0];
516 fRec41[1] = fRec41[0];
517 fVec8[1] = fVec8[0];
518 fRec42[2] = fRec42[1]; fRec42[1] = fRec42[0];
519 fRec32[1] = fRec32[0];
520 fRec33[1] = fRec33[0];
521 IOTA = IOTA+1;
522 fRec34[1] = fRec34[0];
523 fRec35[1] = fRec35[0];
524 fRec9[1] = fRec9[0];
525 fRec10[1] = fRec10[0];
526 fRec31[1] = fRec31[0];
527 fVec6[1] = fVec6[0];
528 fRec11[1] = fRec11[0];
529 fRec28[1] = fRec28[0];
530 fRec29[1] = fRec29[0];
531 fRec30[1] = fRec30[0];
532 fVec5[1] = fVec5[0];
533 fRec12[1] = fRec12[0];
534 fRec13[1] = fRec13[0];
535 fRec27[1] = fRec27[0];
536 fVec4[1] = fVec4[0];
537 fRec14[1] = fRec14[0];
538 fRec15[1] = fRec15[0];
539 fRec24[1] = fRec24[0];
540 fRec25[1] = fRec25[0];
541 fRec26[1] = fRec26[0];
542 fVec3[1] = fVec3[0];
543 fRec16[1] = fRec16[0];
544 fRec17[1] = fRec17[0];
545 fRec23[1] = fRec23[0];
546 fVec2[1] = fVec2[0];
547 fRec22[1] = fRec22[0];
548 fRec18[2] = fRec18[1]; fRec18[1] = fRec18[0];
549 fRec19[2] = fRec19[1]; fRec19[1] = fRec19[0];
550 fRec20[1] = fRec20[0];
551 fRec21[1] = fRec21[0];
552 fVec1[1] = fVec1[0];
553 fRec8[1] = fRec8[0];
554 fRec6[1] = fRec6[0];
555 fRec5[1] = fRec5[0];
556 fVec0[1] = fVec0[0];
557 }
558 }
559
560 static struct RegisterParams { RegisterParams(); } RegisterParams;
561 RegisterParams::RegisterParams()
562 {
563 registerInit("amp2", init);
564 }
565
566 } // end namespace gxamp7
0 namespace gxamp8 {
1 // generated from file '../src/faust/gxamp8.dsp'
2
3 double fConst0;
4 double fConst1;
5 double fConst2;
6 double fConst3;
7 double fConst4;
8 double fConst5;
9 double fConst6;
10 double fConst7;
11 double fConst8;
12 double fConst9;
13 double fConst10;
14 double fConst11;
15 double fConst12;
16 double fConst13;
17 double fConst14;
18 double fConst15;
19 double fConst16;
20 double fConst17;
21 double fVec0[2];
22 double fConst18;
23 double fRec5[2];
24 FAUSTFLOAT& fslider0 = get_alias("amp2.stage2.gain1");
25 double fRec6[2];
26 FAUSTFLOAT& fslider1 = get_alias("gxdistortion.wet_dry");
27 double fRec8[2];
28 double fConst19;
29 double fConst20;
30 double fConst21;
31 double fConst22;
32 double fConst23;
33 double fConst24;
34 double fConst25;
35 double fConst26;
36 double fConst27;
37 double fConst28;
38 double fVec1[2];
39 double fConst29;
40 double fRec21[2];
41 double fRec20[2];
42 double fRec19[3];
43 double fRec18[3];
44 FAUSTFLOAT& fslider2 = get_alias("amp2.stage1.Pregain");
45 double fRec22[2];
46 double fConst30;
47 double fConst31;
48 double fConst32;
49 double fConst33;
50 double fVec2[2];
51 double fConst34;
52 double fRec23[2];
53 double fRec17[2];
54 double fConst35;
55 double fConst36;
56 double fRec16[2];
57 double fConst37;
58 double fConst38;
59 double fConst39;
60 double fVec3[2];
61 double fConst40;
62 double fRec26[2];
63 double fRec25[2];
64 double fRec24[2];
65 double fRec15[2];
66 double fConst41;
67 double fRec14[2];
68 double fVec4[2];
69 double fRec27[2];
70 double fRec13[2];
71 double fRec12[2];
72 double fConst42;
73 double fConst43;
74 double fConst44;
75 double fVec5[2];
76 double fConst45;
77 double fRec30[2];
78 double fRec29[2];
79 double fRec28[2];
80 double fRec11[2];
81 double fVec6[2];
82 double fRec31[2];
83 double fRec10[2];
84 double fRec9[2];
85 FAUSTFLOAT& fslider3 = get_alias("gxdistortion.drive");
86 double fRec35[2];
87 double fRec34[2];
88 int IOTA;
89 double fVec7[65536];
90 int iConst46;
91 double fRec33[2];
92 double fConst47;
93 double fRec32[2];
94 double fConst48;
95 double fConst49;
96 double fConst50;
97 double fConst51;
98 double fConst52;
99 double fConst53;
100 double fConst54;
101 double fConst55;
102 double fConst56;
103 double fConst57;
104 double fConst58;
105 double fConst59;
106 double fConst60;
107 double fConst61;
108 double fConst62;
109 double fConst63;
110 double fConst64;
111 double fConst65;
112 double fConst66;
113 double fConst67;
114 double fConst68;
115 double fConst69;
116 double fConst70;
117 double fConst71;
118 double fConst72;
119 double fConst73;
120 double fConst74;
121 double fRec42[3];
122 double fVec8[2];
123 double fConst75;
124 double fRec41[2];
125 double fConst76;
126 double fConst77;
127 double fRec40[2];
128 double fRec39[3];
129 double fConst78;
130 double fRec38[3];
131 double fRec37[3];
132 double fConst79;
133 double fConst80;
134 double fConst81;
135 double fConst82;
136 double fConst83;
137 double fConst84;
138 double fConst85;
139 double fConst86;
140 double fConst87;
141 double fRec48[2];
142 double fRec47[3];
143 double fVec9[2];
144 double fConst88;
145 double fRec46[2];
146 double fRec45[3];
147 double fVec10[2];
148 double fConst89;
149 double fConst90;
150 double fRec44[2];
151 double fRec43[3];
152 double fConst91;
153 double fRec50[2];
154 double fRec49[3];
155 double fConst92;
156 double fRec53[2];
157 double fRec52[3];
158 double fConst93;
159 double fRec51[3];
160 double fVec11[2];
161 double fConst94;
162 double fRec36[2];
163 double fVec12[2];
164 double fRec7[2];
165 double fRec4[2];
166 double fRec3[2];
167 double fVec13[2];
168 double fRec56[2];
169 double fRec55[2];
170 double fRec54[2];
171 double fVec14[3];
172 double fConst95;
173 double fConst96;
174 double fRec2[3];
175 double fConst97;
176 double fConst98;
177 double fRec1[3];
178 double fConst99;
179 double fConst100;
180 double fRec0[3];
181 int fSamplingFreq;
182
183 void init(int samplingFreq)
184 {
185 fSamplingFreq = samplingFreq;
186 fConst0 = (31704.95306002819 / fSamplingFreq);
187 fConst1 = (2 * cos(fConst0));
188 fConst2 = (0.026178010471204185 * sin(fConst0));
189 fConst3 = (fConst2 - 1);
190 fConst4 = (49574.33207364693 / fSamplingFreq);
191 fConst5 = (2 * cos(fConst4));
192 fConst6 = (0.07042253521126761 * sin(fConst4));
193 fConst7 = (fConst6 - 1);
194 fConst8 = (60601.32228774711 / fSamplingFreq);
195 fConst9 = (2 * cos(fConst8));
196 fConst10 = (0.03546099290780142 * sin(fConst8));
197 fConst11 = (fConst10 - 1);
198 fConst12 = (1.0 / tan((97.38937226128358 / fSamplingFreq)));
199 fConst13 = (1 + fConst12);
200 fConst14 = (0 - ((1 - fConst12) / fConst13));
201 fConst15 = (1.0 / tan((20517.741620594938 / fSamplingFreq)));
202 fConst16 = (1 + fConst15);
203 fConst17 = (0 - ((1 - fConst15) / fConst16));
204 for (int i=0; i<2; i++) fVec0[i] = 0;
205 fConst18 = (0.0041 / fConst16);
206 for (int i=0; i<2; i++) fRec5[i] = 0;
207 for (int i=0; i<2; i++) fRec6[i] = 0;
208 for (int i=0; i<2; i++) fRec8[i] = 0;
209 fConst19 = tan((37699.11184307752 / fSamplingFreq));
210 fConst20 = (2 * (1 - (1.0 / faustpower<2>(fConst19))));
211 fConst21 = (1.0 / fConst19);
212 fConst22 = (1 + ((fConst21 - 0.7653668647301795) / fConst19));
213 fConst23 = (1 + ((0.7653668647301795 + fConst21) / fConst19));
214 fConst24 = (1.0 / fConst23);
215 fConst25 = (1 + ((fConst21 - 1.8477590650225735) / fConst19));
216 fConst26 = (1.0 / (1 + ((fConst21 + 1.8477590650225735) / fConst19)));
217 fConst27 = (973.8937226128359 / fSamplingFreq);
218 fConst28 = (1 - fConst27);
219 for (int i=0; i<2; i++) fVec1[i] = 0;
220 fConst29 = (1.0 / (1 + fConst27));
221 for (int i=0; i<2; i++) fRec21[i] = 0;
222 for (int i=0; i<2; i++) fRec20[i] = 0;
223 for (int i=0; i<3; i++) fRec19[i] = 0;
224 for (int i=0; i<3; i++) fRec18[i] = 0;
225 for (int i=0; i<2; i++) fRec22[i] = 0;
226 fConst30 = (2.0 / fConst23);
227 fConst31 = (1.0 / tan((270.1769682087222 / fSamplingFreq)));
228 fConst32 = (1 + fConst31);
229 fConst33 = (0 - ((1 - fConst31) / fConst32));
230 for (int i=0; i<2; i++) fVec2[i] = 0;
231 fConst34 = (0.027 / fConst32);
232 for (int i=0; i<2; i++) fRec23[i] = 0;
233 for (int i=0; i<2; i++) fRec17[i] = 0;
234 fConst35 = (0 - fConst12);
235 fConst36 = (0.025 / fConst13);
236 for (int i=0; i<2; i++) fRec16[i] = 0;
237 fConst37 = (1.0 / tan((414.6902302738527 / fSamplingFreq)));
238 fConst38 = (1 + fConst37);
239 fConst39 = (0 - ((1 - fConst37) / fConst38));
240 for (int i=0; i<2; i++) fVec3[i] = 0;
241 fConst40 = (0.015 / fConst38);
242 for (int i=0; i<2; i++) fRec26[i] = 0;
243 for (int i=0; i<2; i++) fRec25[i] = 0;
244 for (int i=0; i<2; i++) fRec24[i] = 0;
245 for (int i=0; i<2; i++) fRec15[i] = 0;
246 fConst41 = (1.0 / fConst16);
247 for (int i=0; i<2; i++) fRec14[i] = 0;
248 for (int i=0; i<2; i++) fVec4[i] = 0;
249 for (int i=0; i<2; i++) fRec27[i] = 0;
250 for (int i=0; i<2; i++) fRec13[i] = 0;
251 for (int i=0; i<2; i++) fRec12[i] = 0;
252 fConst42 = (1.0 / tan((609.4689747964198 / fSamplingFreq)));
253 fConst43 = (1 + fConst42);
254 fConst44 = (0 - ((1 - fConst42) / fConst43));
255 for (int i=0; i<2; i++) fVec5[i] = 0;
256 fConst45 = (0.0082 / fConst43);
257 for (int i=0; i<2; i++) fRec30[i] = 0;
258 for (int i=0; i<2; i++) fRec29[i] = 0;
259 for (int i=0; i<2; i++) fRec28[i] = 0;
260 for (int i=0; i<2; i++) fRec11[i] = 0;
261 for (int i=0; i<2; i++) fVec6[i] = 0;
262 for (int i=0; i<2; i++) fRec31[i] = 0;
263 for (int i=0; i<2; i++) fRec10[i] = 0;
264 for (int i=0; i<2; i++) fRec9[i] = 0;
265 for (int i=0; i<2; i++) fRec35[i] = 0;
266 for (int i=0; i<2; i++) fRec34[i] = 0;
267 IOTA = 0;
268 for (int i=0; i<65536; i++) fVec7[i] = 0;
269 iConst46 = int((int((0.1111111111111111 * fSamplingFreq)) & 65535));
270 for (int i=0; i<2; i++) fRec33[i] = 0;
271 fConst47 = (0.009000000000000008 / fSamplingFreq);
272 for (int i=0; i<2; i++) fRec32[i] = 0;
273 fConst48 = tan((942.4777960769379 / fSamplingFreq));
274 fConst49 = (1.0 / faustpower<2>(fConst48));
275 fConst50 = (2 * (1 - fConst49));
276 fConst51 = (1.0 / fConst48);
277 fConst52 = (1 + ((fConst51 - 1.0) / fConst48));
278 fConst53 = (1.0 / (1 + ((1.0 + fConst51) / fConst48)));
279 fConst54 = tan((3769.9111843077517 / fSamplingFreq));
280 fConst55 = (1.0 / faustpower<2>(fConst54));
281 fConst56 = (2 * (1 - fConst55));
282 fConst57 = (1.0 / fConst54);
283 fConst58 = (1 + ((fConst57 - 1.0) / fConst54));
284 fConst59 = (1.0 / (1 + ((1.0 + fConst57) / fConst54)));
285 fConst60 = tan((10053.096491487338 / fSamplingFreq));
286 fConst61 = (1.0 / faustpower<2>(fConst60));
287 fConst62 = (2 * (1 - fConst61));
288 fConst63 = (1.0 / fConst60);
289 fConst64 = (1 + ((fConst63 - 1.0000000000000004) / fConst60));
290 fConst65 = (1 + ((1.0000000000000004 + fConst63) / fConst60));
291 fConst66 = (1.0 / fConst65);
292 fConst67 = (1 + fConst63);
293 fConst68 = (0 - ((1 - fConst63) / fConst67));
294 fConst69 = tan((47123.8898038469 / fSamplingFreq));
295 fConst70 = (2 * (1 - (1.0 / faustpower<2>(fConst69))));
296 fConst71 = (1.0 / fConst69);
297 fConst72 = (1 + ((fConst71 - 1.414213562373095) / fConst69));
298 fConst73 = (1 + ((1.414213562373095 + fConst71) / fConst69));
299 fConst74 = (1.0 / fConst73);
300 for (int i=0; i<3; i++) fRec42[i] = 0;
301 for (int i=0; i<2; i++) fVec8[i] = 0;
302 fConst75 = (1.0 / (fConst13 * fConst73));
303 for (int i=0; i<2; i++) fRec41[i] = 0;
304 fConst76 = (0 - fConst63);
305 fConst77 = (1.0 / fConst67);
306 for (int i=0; i<2; i++) fRec40[i] = 0;
307 for (int i=0; i<3; i++) fRec39[i] = 0;
308 fConst78 = (2 * (0 - fConst61));
309 for (int i=0; i<3; i++) fRec38[i] = 0;
310 for (int i=0; i<3; i++) fRec37[i] = 0;
311 fConst79 = (1 + ((fConst51 - 1.0000000000000004) / fConst48));
312 fConst80 = (1.0 / (1 + ((fConst51 + 1.0000000000000004) / fConst48)));
313 fConst81 = (1 + fConst51);
314 fConst82 = (0 - ((1 - fConst51) / fConst81));
315 fConst83 = (1 + ((fConst57 - 1.0000000000000004) / fConst54));
316 fConst84 = (1 + ((fConst57 + 1.0000000000000004) / fConst54));
317 fConst85 = (1.0 / fConst84);
318 fConst86 = (1 + fConst57);
319 fConst87 = (0 - ((1 - fConst57) / fConst86));
320 for (int i=0; i<2; i++) fRec48[i] = 0;
321 for (int i=0; i<3; i++) fRec47[i] = 0;
322 for (int i=0; i<2; i++) fVec9[i] = 0;
323 fConst88 = (1.0 / (fConst86 * fConst65));
324 for (int i=0; i<2; i++) fRec46[i] = 0;
325 for (int i=0; i<3; i++) fRec45[i] = 0;
326 for (int i=0; i<2; i++) fVec10[i] = 0;
327 fConst89 = (0 - fConst51);
328 fConst90 = (1.0 / (fConst81 * fConst84));
329 for (int i=0; i<2; i++) fRec44[i] = 0;
330 for (int i=0; i<3; i++) fRec43[i] = 0;
331 fConst91 = (2 * (0 - fConst49));
332 for (int i=0; i<2; i++) fRec50[i] = 0;
333 for (int i=0; i<3; i++) fRec49[i] = 0;
334 fConst92 = (0 - fConst57);
335 for (int i=0; i<2; i++) fRec53[i] = 0;
336 for (int i=0; i<3; i++) fRec52[i] = 0;
337 fConst93 = (2 * (0 - fConst55));
338 for (int i=0; i<3; i++) fRec51[i] = 0;
339 for (int i=0; i<2; i++) fVec11[i] = 0;
340 fConst94 = (1.5848931924611136 / fConst16);
341 for (int i=0; i<2; i++) fRec36[i] = 0;
342 for (int i=0; i<2; i++) fVec12[i] = 0;
343 for (int i=0; i<2; i++) fRec7[i] = 0;
344 for (int i=0; i<2; i++) fRec4[i] = 0;
345 for (int i=0; i<2; i++) fRec3[i] = 0;
346 for (int i=0; i<2; i++) fVec13[i] = 0;
347 for (int i=0; i<2; i++) fRec56[i] = 0;
348 for (int i=0; i<2; i++) fRec55[i] = 0;
349 for (int i=0; i<2; i++) fRec54[i] = 0;
350 for (int i=0; i<3; i++) fVec14[i] = 0;
351 fConst95 = (0 - fConst9);
352 fConst96 = (1.0 / (1 + fConst10));
353 for (int i=0; i<3; i++) fRec2[i] = 0;
354 fConst97 = (0 - fConst5);
355 fConst98 = (1.0 / (1 + fConst6));
356 for (int i=0; i<3; i++) fRec1[i] = 0;
357 fConst99 = (0 - fConst1);
358 fConst100 = (1.0 / (1 + fConst2));
359 for (int i=0; i<3; i++) fRec0[i] = 0;
360 }
361
362 void compute(int count, float *input0, float *output0)
363 {
364 double fSlow0 = (0.0010000000000000009 * pow(10,(0.05 * fslider0)));
365 double fSlow1 = fslider1;
366 double fSlow2 = (0.0010000000000000009 * (1 - (0.01 * fSlow1)));
367 double fSlow3 = (0.0010000000000000009 * pow(10,(0.05 * fslider2)));
368 double fSlow4 = fslider3;
369 double fSlow5 = (1.25 * fSlow4);
370 double fSlow6 = (1.000000000000001e-05 * fSlow1);
371 double fSlow7 = (2 * (fSlow4 - 0.5));
372 double fSlow8 = (0.024937655860349125 * (1 - max(0, fSlow7)));
373 double fSlow9 = pow(1e+01,(0.8 * fSlow4));
374 double fSlow10 = (fConst80 * pow(1e+01,(2 * fSlow4)));
375 double fSlow11 = (fConst80 * pow(1e+01,(0.9 * fSlow4)));
376 double fSlow12 = pow(1e+01,(1.2 * fSlow4));
377 double fSlow13 = (1 - max(0, (0 - fSlow7)));
378 for (int i=0; i<count; i++) {
379 double fTemp0 = (fRec4[1] - 2.5e+02);
380 fVec0[0] = fTemp0;
381 fRec5[0] = ((fConst18 * (fVec0[0] + fVec0[1])) + (fConst17 * fRec5[1]));
382 fRec6[0] = (fSlow0 + (0.999 * fRec6[1]));
383 fRec8[0] = (fSlow2 + (0.999 * fRec8[1]));
384 double fTemp1 = (double)input0[i];
385 fVec1[0] = fTemp1;
386 fRec21[0] = (fConst29 * ((fVec1[0] - fVec1[1]) + (fConst28 * fRec21[1])));
387 fRec20[0] = (fConst29 * ((fRec21[0] - fRec21[1]) + (fConst28 * fRec20[1])));
388 fRec19[0] = (fRec20[0] - (fConst26 * ((fConst25 * fRec19[2]) + (fConst20 * fRec19[1]))));
389 fRec18[0] = ((fConst26 * (fRec19[2] + (fRec19[0] + (2 * fRec19[1])))) - (fConst24 * ((fConst22 * fRec18[2]) + (fConst20 * fRec18[1]))));
390 fRec22[0] = (fSlow3 + (0.999 * fRec22[1]));
391 double fTemp2 = (fRec17[1] - 2.5e+02);
392 fVec2[0] = fTemp2;
393 fRec23[0] = ((fConst34 * (fVec2[0] + fVec2[1])) + (fConst33 * fRec23[1]));
394 fRec17[0] = Ftube3(0, (fRec23[0] + (fConst30 * (fRec22[0] * (fRec18[2] + (fRec18[0] + (2 * fRec18[1])))))));
395 fRec16[0] = ((fConst36 * ((fConst35 * fRec17[1]) + (fConst12 * fRec17[0]))) + (fConst14 * fRec16[1]));
396 double fTemp3 = (fRec25[1] - 2.5e+02);
397 fVec3[0] = fTemp3;
398 fRec26[0] = ((fConst40 * (fVec3[0] + fVec3[1])) + (fConst39 * fRec26[1]));
399 fRec25[0] = Ftube3(1, (fRec26[0] + fRec15[1]));
400 fRec24[0] = ((fConst36 * ((fConst35 * fRec25[1]) + (fConst12 * fRec25[0]))) + (fConst14 * fRec24[1]));
401 fRec15[0] = (fRec24[0] + fRec16[0]);
402 fRec14[0] = ((fConst41 * (fRec15[0] + fRec15[1])) + (fConst17 * fRec14[1]));
403 double fTemp4 = (fRec13[1] - 2.5e+02);
404 fVec4[0] = fTemp4;
405 fRec27[0] = ((fConst40 * (fVec4[0] + fVec4[1])) + (fConst39 * fRec27[1]));
406 fRec13[0] = Ftube3(1, (fRec27[0] + fRec14[0]));
407 fRec12[0] = ((fConst36 * ((fConst35 * fRec13[1]) + (fConst12 * fRec13[0]))) + (fConst14 * fRec12[1]));
408 double fTemp5 = (fRec29[1] - 2.5e+02);
409 fVec5[0] = fTemp5;
410 fRec30[0] = ((fConst45 * (fVec5[0] + fVec5[1])) + (fConst44 * fRec30[1]));
411 fRec29[0] = Ftube3(1, (fRec30[0] + fRec11[1]));
412 fRec28[0] = ((fConst36 * ((fConst35 * fRec29[1]) + (fConst12 * fRec29[0]))) + (fConst14 * fRec28[1]));
413 fRec11[0] = (fRec28[0] + fRec12[0]);
414 double fTemp6 = (fRec10[1] - 2.5e+02);
415 fVec6[0] = fTemp6;
416 fRec31[0] = ((fConst45 * (fVec6[0] + fVec6[1])) + (fConst44 * fRec31[1]));
417 fRec10[0] = Ftube3(1, (fRec31[0] + fRec11[0]));
418 fRec9[0] = ((fConst36 * ((fConst35 * fRec10[1]) + (fConst12 * fRec10[0]))) + (fConst14 * fRec9[1]));
419 double fTemp7 = (fRec9[0] * fRec8[0]);
420 fRec35[0] = (fSlow6 + (0.999 * fRec35[1]));
421 double fTemp8 = (fRec9[0] * fRec35[0]);
422 double fTemp9 = fabs(fTemp8);
423 fRec34[0] = ((9.999999999998899e-05 * fTemp9) + (0.9999 * fRec34[1]));
424 double fTemp10 = max(fRec34[0], fTemp9);
425 fVec7[IOTA&65535] = fTemp10;
426 fRec33[0] = ((fVec7[IOTA&65535] + fRec33[1]) - fVec7[(IOTA-iConst46)&65535]);
427 fRec32[0] = ((fConst47 * fRec33[0]) + (0.999 * fRec32[1]));
428 double fTemp11 = max(-1, min(-0.01, (fVec7[IOTA&65535] - (1.0 + (1.02 * fRec32[0])))));
429 double fTemp12 = (0 - fTemp11);
430 double fTemp13 = (40.1 * fTemp12);
431 double fTemp14 = max(-600, fTemp13);
432 double fTemp15 = (0 - fTemp14);
433 double fTemp16 = (fTemp8 - fTemp11);
434 double fTemp17 = (40.1 * fTemp16);
435 double fTemp18 = max(-600, fTemp17);
436 double fTemp19 = (0 - fTemp18);
437 double fTemp20 = (((int((fabs(fTemp17) > 0.0001)))?((int((fTemp18 < -50)))?(exp(fTemp18) * fTemp19):(fTemp18 / (1 - exp(fTemp19)))):(1 + (fTemp16 * (20.05 + (134.00083333333336 * fTemp16))))) - ((int((fabs(fTemp13) > 0.0001)))?((int((fTemp14 < -50)))?(exp(fTemp14) * fTemp15):(fTemp14 / (1 - exp(fTemp15)))):(1 + (fTemp12 * (20.05 + (134.00083333333336 * fTemp12))))));
438 double fTemp21 = (fConst50 * fRec37[1]);
439 double fTemp22 = (fConst56 * fRec38[1]);
440 fRec42[0] = ((0.024937655860349125 * fTemp20) - (fConst74 * ((fConst72 * fRec42[2]) + (fConst70 * fRec42[1]))));
441 double fTemp23 = (fRec42[2] + (fRec42[0] + (2 * fRec42[1])));
442 fVec8[0] = fTemp23;
443 fRec41[0] = ((fConst75 * ((fConst35 * fVec8[1]) + (fConst12 * fVec8[0]))) + (fConst14 * fRec41[1]));
444 fRec40[0] = ((fConst77 * ((fConst76 * fRec41[1]) + (fConst63 * fRec41[0]))) + (fConst68 * fRec40[1]));
445 fRec39[0] = (fRec40[0] - (fConst66 * ((fConst64 * fRec39[2]) + (fConst62 * fRec39[1]))));
446 fRec38[0] = ((fConst66 * (((fConst61 * fRec39[0]) + (fConst78 * fRec39[1])) + (fConst61 * fRec39[2]))) - (fConst59 * ((fConst58 * fRec38[2]) + fTemp22)));
447 fRec37[0] = ((fRec38[2] + (fConst59 * (fTemp22 + (fConst58 * fRec38[0])))) - (fConst53 * ((fConst52 * fRec37[2]) + fTemp21)));
448 double fTemp24 = max(-1, min(1, (fSlow9 * (fRec37[2] + (fConst53 * (fTemp21 + (fConst52 * fRec37[0])))))));
449 fRec48[0] = ((fConst77 * (fRec41[0] + fRec41[1])) + (fConst68 * fRec48[1]));
450 fRec47[0] = (fRec48[0] - (fConst66 * ((fConst64 * fRec47[2]) + (fConst62 * fRec47[1]))));
451 double fTemp25 = (fRec47[2] + (fRec47[0] + (2 * fRec47[1])));
452 fVec9[0] = fTemp25;
453 fRec46[0] = ((fConst88 * (fVec9[0] + fVec9[1])) + (fConst87 * fRec46[1]));
454 fRec45[0] = (fRec46[0] - (fConst85 * ((fConst83 * fRec45[2]) + (fConst56 * fRec45[1]))));
455 double fTemp26 = (fRec45[2] + (fRec45[0] + (2 * fRec45[1])));
456 fVec10[0] = fTemp26;
457 fRec44[0] = ((fConst90 * ((fConst89 * fVec10[1]) + (fConst51 * fVec10[0]))) + (fConst82 * fRec44[1]));
458 fRec43[0] = (fRec44[0] - (fConst80 * ((fConst79 * fRec43[2]) + (fConst50 * fRec43[1]))));
459 double fTemp27 = max(-1, min(1, (fSlow10 * (((fConst49 * fRec43[0]) + (fConst91 * fRec43[1])) + (fConst49 * fRec43[2])))));
460 fRec50[0] = ((fConst90 * (fVec10[0] + fVec10[1])) + (fConst82 * fRec50[1]));
461 fRec49[0] = (fRec50[0] - (fConst80 * ((fConst79 * fRec49[2]) + (fConst50 * fRec49[1]))));
462 double fTemp28 = max(-1, min(1, (fSlow11 * (fRec49[2] + (fRec49[0] + (2 * fRec49[1]))))));
463 double fTemp29 = (fConst50 * fRec51[1]);
464 fRec53[0] = ((fConst88 * ((fConst92 * fVec9[1]) + (fConst57 * fVec9[0]))) + (fConst87 * fRec53[1]));
465 fRec52[0] = (fRec53[0] - (fConst85 * ((fConst83 * fRec52[2]) + (fConst56 * fRec52[1]))));
466 fRec51[0] = ((fConst85 * (((fConst55 * fRec52[0]) + (fConst93 * fRec52[1])) + (fConst55 * fRec52[2]))) - (fConst53 * ((fConst52 * fRec51[2]) + fTemp29)));
467 double fTemp30 = max(-1, min(1, (fSlow12 * (fRec51[2] + (fConst53 * (fTemp29 + (fConst52 * fRec51[0])))))));
468 double fTemp31 = (((fTemp30 * (1 - (0.3333333333333333 * faustpower<2>(fTemp30)))) + ((fTemp28 * (1 - (0.3333333333333333 * faustpower<2>(fTemp28)))) + (0.841395141645195 * (fTemp27 * (1 - (0.3333333333333333 * faustpower<2>(fTemp27))))))) + (0.7943282347242815 * (fTemp24 * (1 - (0.3333333333333333 * faustpower<2>(fTemp24))))));
469 fVec11[0] = fTemp31;
470 fRec36[0] = ((fConst94 * (fVec11[0] + fVec11[1])) + (fConst17 * fRec36[1]));
471 double fTemp32 = (((fSlow13 * fRec36[0]) + (fSlow8 * fTemp20)) + (fTemp7 * (1 + (fSlow5 * ((4 - (4 * fabs(fTemp7))) - 1)))));
472 fVec12[0] = fTemp32;
473 fRec7[0] = ((fConst41 * (fVec12[0] + fVec12[1])) + (fConst17 * fRec7[1]));
474 double fTemp33 = (fRec7[0] * fRec6[0]);
475 fRec4[0] = Ftube2(0, (fTemp33 + fRec5[0]));
476 fRec3[0] = ((fConst36 * ((fConst35 * fRec4[1]) + (fConst12 * fRec4[0]))) + (fConst14 * fRec3[1]));
477 double fTemp34 = (fRec55[1] - 2.5e+02);
478 fVec13[0] = fTemp34;
479 fRec56[0] = ((fConst18 * (fVec13[0] + fVec13[1])) + (fConst17 * fRec56[1]));
480 fRec55[0] = Ftube2(1, (fRec56[0] + fTemp33));
481 fRec54[0] = ((fConst36 * ((fConst35 * fRec55[1]) + (fConst12 * fRec55[0]))) + (fConst14 * fRec54[1]));
482 double fTemp35 = (min(0.7, fRec54[0]) + max(-0.75, fRec3[0]));
483 fVec14[0] = fTemp35;
484 fRec2[0] = (fConst96 * ((fVec14[2] + (fVec14[0] + (fConst95 * fVec14[1]))) + ((fConst11 * fRec2[2]) + (fConst9 * fRec2[1]))));
485 fRec1[0] = (fConst98 * ((fRec2[2] + (fRec2[0] + (fConst97 * fRec2[1]))) + ((fConst7 * fRec1[2]) + (fConst5 * fRec1[1]))));
486 fRec0[0] = (fConst100 * ((fRec1[2] + (fRec1[0] + (fConst99 * fRec1[1]))) + ((fConst3 * fRec0[2]) + (fConst1 * fRec0[1]))));
487 output0[i] = (FAUSTFLOAT)fRec0[0];
488 // post processing
489 fRec0[2] = fRec0[1]; fRec0[1] = fRec0[0];
490 fRec1[2] = fRec1[1]; fRec1[1] = fRec1[0];
491 fRec2[2] = fRec2[1]; fRec2[1] = fRec2[0];
492 fVec14[2] = fVec14[1]; fVec14[1] = fVec14[0];
493 fRec54[1] = fRec54[0];
494 fRec55[1] = fRec55[0];
495 fRec56[1] = fRec56[0];
496 fVec13[1] = fVec13[0];
497 fRec3[1] = fRec3[0];
498 fRec4[1] = fRec4[0];
499 fRec7[1] = fRec7[0];
500 fVec12[1] = fVec12[0];
501 fRec36[1] = fRec36[0];
502 fVec11[1] = fVec11[0];
503 fRec51[2] = fRec51[1]; fRec51[1] = fRec51[0];
504 fRec52[2] = fRec52[1]; fRec52[1] = fRec52[0];
505 fRec53[1] = fRec53[0];
506 fRec49[2] = fRec49[1]; fRec49[1] = fRec49[0];
507 fRec50[1] = fRec50[0];
508 fRec43[2] = fRec43[1]; fRec43[1] = fRec43[0];
509 fRec44[1] = fRec44[0];
510 fVec10[1] = fVec10[0];
511 fRec45[2] = fRec45[1]; fRec45[1] = fRec45[0];
512 fRec46[1] = fRec46[0];
513 fVec9[1] = fVec9[0];
514 fRec47[2] = fRec47[1]; fRec47[1] = fRec47[0];
515 fRec48[1] = fRec48[0];
516 fRec37[2] = fRec37[1]; fRec37[1] = fRec37[0];
517 fRec38[2] = fRec38[1]; fRec38[1] = fRec38[0];
518 fRec39[2] = fRec39[1]; fRec39[1] = fRec39[0];
519 fRec40[1] = fRec40[0];
520 fRec41[1] = fRec41[0];
521 fVec8[1] = fVec8[0];
522 fRec42[2] = fRec42[1]; fRec42[1] = fRec42[0];
523 fRec32[1] = fRec32[0];
524 fRec33[1] = fRec33[0];
525 IOTA = IOTA+1;
526 fRec34[1] = fRec34[0];
527 fRec35[1] = fRec35[0];
528 fRec9[1] = fRec9[0];
529 fRec10[1] = fRec10[0];
530 fRec31[1] = fRec31[0];
531 fVec6[1] = fVec6[0];
532 fRec11[1] = fRec11[0];
533 fRec28[1] = fRec28[0];
534 fRec29[1] = fRec29[0];
535 fRec30[1] = fRec30[0];
536 fVec5[1] = fVec5[0];
537 fRec12[1] = fRec12[0];
538 fRec13[1] = fRec13[0];
539 fRec27[1] = fRec27[0];
540 fVec4[1] = fVec4[0];
541 fRec14[1] = fRec14[0];
542 fRec15[1] = fRec15[0];
543 fRec24[1] = fRec24[0];
544 fRec25[1] = fRec25[0];
545 fRec26[1] = fRec26[0];
546 fVec3[1] = fVec3[0];
547 fRec16[1] = fRec16[0];
548 fRec17[1] = fRec17[0];
549 fRec23[1] = fRec23[0];
550 fVec2[1] = fVec2[0];
551 fRec22[1] = fRec22[0];
552 fRec18[2] = fRec18[1]; fRec18[1] = fRec18[0];
553 fRec19[2] = fRec19[1]; fRec19[1] = fRec19[0];
554 fRec20[1] = fRec20[0];
555 fRec21[1] = fRec21[0];
556 fVec1[1] = fVec1[0];
557 fRec8[1] = fRec8[0];
558 fRec6[1] = fRec6[0];
559 fRec5[1] = fRec5[0];
560 fVec0[1] = fVec0[0];
561 }
562 }
563
564 static struct RegisterParams { RegisterParams(); } RegisterParams;
565 RegisterParams::RegisterParams()
566 {
567 registerInit("amp2", init);
568 }
569
570 } // end namespace gxamp8
0 namespace gxamp9 {
1 // generated from file '../src/faust/gxamp9.dsp'
2
3 FAUSTFLOAT& fslider0 = get_alias("amp2.stage2.gain1");
4 double fRec0[2];
5 double fConst0;
6 double fConst1;
7 double fConst2;
8 double fConst3;
9 double fConst4;
10 double fConst5;
11 FAUSTFLOAT& fslider1 = get_alias("amp2.stage1.Pregain");
12 double fRec8[2];
13 double fConst6;
14 double fConst7;
15 double fConst8;
16 double fConst9;
17 double fConst10;
18 double fConst11;
19 double fConst12;
20 double fConst13;
21 double fConst14;
22 double fConst15;
23 double fConst16;
24 double fConst17;
25 double fConst18;
26 double fConst19;
27 double fConst20;
28 double fConst21;
29 double fConst22;
30 double fConst23;
31 double fConst24;
32 double fConst25;
33 double fConst26;
34 double fConst27;
35 double fConst28;
36 double fConst29;
37 double fConst30;
38 double fConst31;
39 double fConst32;
40 double fRec21[2];
41 int IOTA;
42 double fVec0[65536];
43 int iConst33;
44 double fRec20[2];
45 double fConst34;
46 double fRec19[2];
47 FAUSTFLOAT& fslider2 = get_alias("gxdistortion.wet_dry");
48 double fRec18[3];
49 double fVec1[2];
50 double fConst35;
51 double fConst36;
52 double fRec17[2];
53 double fConst37;
54 double fConst38;
55 double fRec16[2];
56 double fRec15[3];
57 double fConst39;
58 double fRec14[3];
59 double fRec13[3];
60 FAUSTFLOAT& fslider3 = get_alias("gxdistortion.drive");
61 double fConst40;
62 double fConst41;
63 double fConst42;
64 double fConst43;
65 double fConst44;
66 double fConst45;
67 double fConst46;
68 double fConst47;
69 double fConst48;
70 double fRec27[2];
71 double fRec26[3];
72 double fVec2[2];
73 double fConst49;
74 double fRec25[2];
75 double fRec24[3];
76 double fVec3[2];
77 double fConst50;
78 double fConst51;
79 double fRec23[2];
80 double fRec22[3];
81 double fConst52;
82 double fRec29[2];
83 double fRec28[3];
84 double fConst53;
85 double fRec32[2];
86 double fRec31[3];
87 double fConst54;
88 double fRec30[3];
89 double fVec4[2];
90 double fConst55;
91 double fRec12[2];
92 double fConst56;
93 double fConst57;
94 double fConst58;
95 double fVec5[2];
96 double fConst59;
97 double fRec33[2];
98 double fRec11[2];
99 double fConst60;
100 double fRec10[2];
101 double fConst61;
102 double fConst62;
103 double fConst63;
104 double fVec6[2];
105 double fConst64;
106 double fRec36[2];
107 double fRec35[2];
108 double fRec34[2];
109 double fRec9[2];
110 double fVec7[2];
111 double fConst65;
112 double fRec7[2];
113 double fVec8[2];
114 double fRec37[2];
115 double fRec6[2];
116 double fRec5[2];
117 double fConst66;
118 double fConst67;
119 double fConst68;
120 double fVec9[2];
121 double fConst69;
122 double fRec40[2];
123 double fRec39[2];
124 double fRec38[2];
125 double fRec4[2];
126 double fRec3[2];
127 double fVec10[2];
128 double fRec41[2];
129 double fRec2[2];
130 double fRec1[2];
131 int fSamplingFreq;
132
133 void init(int samplingFreq)
134 {
135 fSamplingFreq = samplingFreq;
136 for (int i=0; i<2; i++) fRec0[i] = 0;
137 fConst0 = (1.0 / tan((97.38937226128358 / fSamplingFreq)));
138 fConst1 = (1 + fConst0);
139 fConst2 = (0 - ((1 - fConst0) / fConst1));
140 fConst3 = (1.0 / tan((20517.741620594938 / fSamplingFreq)));
141 fConst4 = (1 + fConst3);
142 fConst5 = (0 - ((1 - fConst3) / fConst4));
143 for (int i=0; i<2; i++) fRec8[i] = 0;
144 fConst6 = tan((942.4777960769379 / fSamplingFreq));
145 fConst7 = (1.0 / faustpower<2>(fConst6));
146 fConst8 = (2 * (1 - fConst7));
147 fConst9 = (1.0 / fConst6);
148 fConst10 = (1 + ((fConst9 - 1.0) / fConst6));
149 fConst11 = (1.0 / (1 + ((1.0 + fConst9) / fConst6)));
150 fConst12 = tan((3769.9111843077517 / fSamplingFreq));
151 fConst13 = (1.0 / faustpower<2>(fConst12));
152 fConst14 = (2 * (1 - fConst13));
153 fConst15 = (1.0 / fConst12);
154 fConst16 = (1 + ((fConst15 - 1.0) / fConst12));
155 fConst17 = (1.0 / (1 + ((1.0 + fConst15) / fConst12)));
156 fConst18 = tan((10053.096491487338 / fSamplingFreq));
157 fConst19 = (1.0 / faustpower<2>(fConst18));
158 fConst20 = (2 * (1 - fConst19));
159 fConst21 = (1.0 / fConst18);
160 fConst22 = (1 + ((fConst21 - 1.0000000000000004) / fConst18));
161 fConst23 = (1 + ((1.0000000000000004 + fConst21) / fConst18));
162 fConst24 = (1.0 / fConst23);
163 fConst25 = (1 + fConst21);
164 fConst26 = (0 - ((1 - fConst21) / fConst25));
165 fConst27 = tan((47123.8898038469 / fSamplingFreq));
166 fConst28 = (2 * (1 - (1.0 / faustpower<2>(fConst27))));
167 fConst29 = (1.0 / fConst27);
168 fConst30 = (1 + ((fConst29 - 1.414213562373095) / fConst27));
169 fConst31 = (1 + ((1.414213562373095 + fConst29) / fConst27));
170 fConst32 = (1.0 / fConst31);
171 for (int i=0; i<2; i++) fRec21[i] = 0;
172 IOTA = 0;
173 for (int i=0; i<65536; i++) fVec0[i] = 0;
174 iConst33 = int((int((0.1111111111111111 * fSamplingFreq)) & 65535));
175 for (int i=0; i<2; i++) fRec20[i] = 0;
176 fConst34 = (0.009000000000000008 / fSamplingFreq);
177 for (int i=0; i<2; i++) fRec19[i] = 0;
178 for (int i=0; i<3; i++) fRec18[i] = 0;
179 for (int i=0; i<2; i++) fVec1[i] = 0;
180 fConst35 = (0 - fConst0);
181 fConst36 = (1.0 / (fConst1 * fConst31));
182 for (int i=0; i<2; i++) fRec17[i] = 0;
183 fConst37 = (0 - fConst21);
184 fConst38 = (1.0 / fConst25);
185 for (int i=0; i<2; i++) fRec16[i] = 0;
186 for (int i=0; i<3; i++) fRec15[i] = 0;
187 fConst39 = (2 * (0 - fConst19));
188 for (int i=0; i<3; i++) fRec14[i] = 0;
189 for (int i=0; i<3; i++) fRec13[i] = 0;
190 fConst40 = (1 + ((fConst9 - 1.0000000000000004) / fConst6));
191 fConst41 = (1.0 / (1 + ((fConst9 + 1.0000000000000004) / fConst6)));
192 fConst42 = (1 + fConst9);
193 fConst43 = (0 - ((1 - fConst9) / fConst42));
194 fConst44 = (1 + ((fConst15 - 1.0000000000000004) / fConst12));
195 fConst45 = (1 + ((fConst15 + 1.0000000000000004) / fConst12));
196 fConst46 = (1.0 / fConst45);
197 fConst47 = (1 + fConst15);
198 fConst48 = (0 - ((1 - fConst15) / fConst47));
199 for (int i=0; i<2; i++) fRec27[i] = 0;
200 for (int i=0; i<3; i++) fRec26[i] = 0;
201 for (int i=0; i<2; i++) fVec2[i] = 0;
202 fConst49 = (1.0 / (fConst47 * fConst23));
203 for (int i=0; i<2; i++) fRec25[i] = 0;
204 for (int i=0; i<3; i++) fRec24[i] = 0;
205 for (int i=0; i<2; i++) fVec3[i] = 0;
206 fConst50 = (0 - fConst9);
207 fConst51 = (1.0 / (fConst42 * fConst45));
208 for (int i=0; i<2; i++) fRec23[i] = 0;
209 for (int i=0; i<3; i++) fRec22[i] = 0;
210 fConst52 = (2 * (0 - fConst7));
211 for (int i=0; i<2; i++) fRec29[i] = 0;
212 for (int i=0; i<3; i++) fRec28[i] = 0;
213 fConst53 = (0 - fConst15);
214 for (int i=0; i<2; i++) fRec32[i] = 0;
215 for (int i=0; i<3; i++) fRec31[i] = 0;
216 fConst54 = (2 * (0 - fConst13));
217 for (int i=0; i<3; i++) fRec30[i] = 0;
218 for (int i=0; i<2; i++) fVec4[i] = 0;
219 fConst55 = (1.5848931924611136 / fConst4);
220 for (int i=0; i<2; i++) fRec12[i] = 0;
221 fConst56 = (1.0 / tan((270.1769682087222 / fSamplingFreq)));
222 fConst57 = (1 + fConst56);
223 fConst58 = (0 - ((1 - fConst56) / fConst57));
224 for (int i=0; i<2; i++) fVec5[i] = 0;
225 fConst59 = (0.027 / fConst57);
226 for (int i=0; i<2; i++) fRec33[i] = 0;
227 for (int i=0; i<2; i++) fRec11[i] = 0;
228 fConst60 = (0.025 / fConst1);
229 for (int i=0; i<2; i++) fRec10[i] = 0;
230 fConst61 = (1.0 / tan((414.6902302738527 / fSamplingFreq)));
231 fConst62 = (1 + fConst61);
232 fConst63 = (0 - ((1 - fConst61) / fConst62));
233 for (int i=0; i<2; i++) fVec6[i] = 0;
234 fConst64 = (0.015 / fConst62);
235 for (int i=0; i<2; i++) fRec36[i] = 0;
236 for (int i=0; i<2; i++) fRec35[i] = 0;
237 for (int i=0; i<2; i++) fRec34[i] = 0;
238 for (int i=0; i<2; i++) fRec9[i] = 0;
239 for (int i=0; i<2; i++) fVec7[i] = 0;
240 fConst65 = (1.0 / fConst4);
241 for (int i=0; i<2; i++) fRec7[i] = 0;
242 for (int i=0; i<2; i++) fVec8[i] = 0;
243 for (int i=0; i<2; i++) fRec37[i] = 0;
244 for (int i=0; i<2; i++) fRec6[i] = 0;
245 for (int i=0; i<2; i++) fRec5[i] = 0;
246 fConst66 = (1.0 / tan((609.4689747964198 / fSamplingFreq)));
247 fConst67 = (1 + fConst66);
248 fConst68 = (0 - ((1 - fConst66) / fConst67));
249 for (int i=0; i<2; i++) fVec9[i] = 0;
250 fConst69 = (0.0082 / fConst67);
251 for (int i=0; i<2; i++) fRec40[i] = 0;
252 for (int i=0; i<2; i++) fRec39[i] = 0;
253 for (int i=0; i<2; i++) fRec38[i] = 0;
254 for (int i=0; i<2; i++) fRec4[i] = 0;
255 for (int i=0; i<2; i++) fRec3[i] = 0;
256 for (int i=0; i<2; i++) fVec10[i] = 0;
257 for (int i=0; i<2; i++) fRec41[i] = 0;
258 for (int i=0; i<2; i++) fRec2[i] = 0;
259 for (int i=0; i<2; i++) fRec1[i] = 0;
260 }
261
262 void compute(int count, float *input0, float *output0)
263 {
264 double fSlow0 = (0.0010000000000000009 * pow(10,(0.05 * fslider0)));
265 double fSlow1 = (0.0010000000000000009 * pow(10,(0.05 * fslider1)));
266 double fSlow2 = fslider2;
267 double fSlow3 = (0.00024937655860349125 * fSlow2);
268 double fSlow4 = fslider3;
269 double fSlow5 = pow(1e+01,(0.8 * fSlow4));
270 double fSlow6 = pow(1e+01,(2 * fSlow4));
271 double fSlow7 = (fConst41 * fSlow6);
272 double fSlow8 = (fConst41 * pow(1e+01,(0.9 * fSlow4)));
273 double fSlow9 = pow(1e+01,(1.2 * fSlow4));
274 double fSlow10 = (2 * (fSlow4 - 0.5));
275 double fSlow11 = (1 - max(0, (0 - fSlow10)));
276 double fSlow12 = (1 - (0.01 * fSlow2));
277 double fSlow13 = (0.024937655860349125 * fSlow12);
278 double fSlow14 = (1.25 * fSlow4);
279 double fSlow15 = (0.00024937655860349125 * (fSlow2 * (1 - max(0, fSlow10))));
280 for (int i=0; i<count; i++) {
281 fRec0[0] = (fSlow0 + (0.999 * fRec0[1]));
282 fRec8[0] = (fSlow1 + (0.999 * fRec8[1]));
283 double fTemp0 = (fConst8 * fRec13[1]);
284 double fTemp1 = (fConst14 * fRec14[1]);
285 double fTemp2 = (double)input0[i];
286 double fTemp3 = fabs(fTemp2);
287 fRec21[0] = ((9.999999999998899e-05 * fTemp3) + (0.9999 * fRec21[1]));
288 double fTemp4 = max(fRec21[0], fTemp3);
289 fVec0[IOTA&65535] = fTemp4;
290 fRec20[0] = ((fVec0[IOTA&65535] + fRec20[1]) - fVec0[(IOTA-iConst33)&65535]);
291 fRec19[0] = ((fConst34 * fRec20[0]) + (0.999 * fRec19[1]));
292 double fTemp5 = max(-1, min(-0.01, (fVec0[IOTA&65535] - (1.0 + (1.02 * fRec19[0])))));
293 double fTemp6 = (0 - fTemp5);
294 double fTemp7 = (40.1 * fTemp6);
295 double fTemp8 = max(-600, fTemp7);
296 double fTemp9 = (0 - fTemp8);
297 double fTemp10 = (fTemp2 - fTemp5);
298 double fTemp11 = (40.1 * fTemp10);
299 double fTemp12 = max(-600, fTemp11);
300 double fTemp13 = (0 - fTemp12);
301 double fTemp14 = (((int((fabs(fTemp11) > 0.0001)))?((int((fTemp12 < -50)))?(exp(fTemp12) * fTemp13):(fTemp12 / (1 - exp(fTemp13)))):(1 + (fTemp10 * (20.05 + (134.00083333333336 * fTemp10))))) - ((int((fabs(fTemp7) > 0.0001)))?((int((fTemp8 < -50)))?(exp(fTemp8) * fTemp9):(fTemp8 / (1 - exp(fTemp9)))):(1 + (fTemp6 * (20.05 + (134.00083333333336 * fTemp6))))));
302 double fTemp15 = (fSlow3 * fTemp14);
303 fRec18[0] = (fTemp15 - (fConst32 * ((fConst30 * fRec18[2]) + (fConst28 * fRec18[1]))));
304 double fTemp16 = (fRec18[2] + (fRec18[0] + (2 * fRec18[1])));
305 fVec1[0] = fTemp16;
306 fRec17[0] = ((fConst36 * ((fConst35 * fVec1[1]) + (fConst0 * fVec1[0]))) + (fConst2 * fRec17[1]));
307 fRec16[0] = ((fConst38 * ((fConst37 * fRec17[1]) + (fConst21 * fRec17[0]))) + (fConst26 * fRec16[1]));
308 fRec15[0] = (fRec16[0] - (fConst24 * ((fConst22 * fRec15[2]) + (fConst20 * fRec15[1]))));
309 fRec14[0] = ((fConst24 * (((fConst19 * fRec15[0]) + (fConst39 * fRec15[1])) + (fConst19 * fRec15[2]))) - (fConst17 * ((fConst16 * fRec14[2]) + fTemp1)));
310 fRec13[0] = ((fRec14[2] + (fConst17 * (fTemp1 + (fConst16 * fRec14[0])))) - (fConst11 * ((fConst10 * fRec13[2]) + fTemp0)));
311 double fTemp17 = max(-1, min(1, (fSlow5 * (fRec13[2] + (fConst11 * (fTemp0 + (fConst10 * fRec13[0])))))));
312 fRec27[0] = ((fConst38 * (fRec17[0] + fRec17[1])) + (fConst26 * fRec27[1]));
313 fRec26[0] = (fRec27[0] - (fConst24 * ((fConst22 * fRec26[2]) + (fConst20 * fRec26[1]))));
314 double fTemp18 = (fRec26[2] + (fRec26[0] + (2 * fRec26[1])));
315 fVec2[0] = fTemp18;
316 fRec25[0] = ((fConst49 * (fVec2[0] + fVec2[1])) + (fConst48 * fRec25[1]));
317 fRec24[0] = (fRec25[0] - (fConst46 * ((fConst44 * fRec24[2]) + (fConst14 * fRec24[1]))));
318 double fTemp19 = (fRec24[2] + (fRec24[0] + (2 * fRec24[1])));
319 fVec3[0] = fTemp19;
320 fRec23[0] = ((fConst51 * ((fConst50 * fVec3[1]) + (fConst9 * fVec3[0]))) + (fConst43 * fRec23[1]));
321 fRec22[0] = (fRec23[0] - (fConst41 * ((fConst40 * fRec22[2]) + (fConst8 * fRec22[1]))));
322 double fTemp20 = max(-1, min(1, (fSlow7 * (((fConst7 * fRec22[0]) + (fConst52 * fRec22[1])) + (fConst7 * fRec22[2])))));
323 fRec29[0] = ((fConst51 * (fVec3[0] + fVec3[1])) + (fConst43 * fRec29[1]));
324 fRec28[0] = (fRec29[0] - (fConst41 * ((fConst40 * fRec28[2]) + (fConst8 * fRec28[1]))));
325 double fTemp21 = max(-1, min(1, (fSlow8 * (fRec28[2] + (fRec28[0] + (2 * fRec28[1]))))));
326 double fTemp22 = (fConst8 * fRec30[1]);
327 fRec32[0] = ((fConst49 * ((fConst53 * fVec2[1]) + (fConst15 * fVec2[0]))) + (fConst48 * fRec32[1]));
328 fRec31[0] = (fRec32[0] - (fConst46 * ((fConst44 * fRec31[2]) + (fConst14 * fRec31[1]))));
329 fRec30[0] = ((fConst46 * (((fConst13 * fRec31[0]) + (fConst54 * fRec31[1])) + (fConst13 * fRec31[2]))) - (fConst11 * ((fConst10 * fRec30[2]) + fTemp22)));
330 double fTemp23 = max(-1, min(1, (fSlow9 * (fRec30[2] + (fConst11 * (fTemp22 + (fConst10 * fRec30[0])))))));
331 double fTemp24 = (((fTemp23 * (1 - (0.3333333333333333 * faustpower<2>(fTemp23)))) + ((fTemp21 * (1 - (0.3333333333333333 * faustpower<2>(fTemp21)))) + (0.841395141645195 * (fTemp20 * (1 - (0.3333333333333333 * faustpower<2>(fTemp20))))))) + (0.7943282347242815 * (fTemp17 * (1 - (0.3333333333333333 * faustpower<2>(fTemp17))))));
332 fVec4[0] = fTemp24;
333 fRec12[0] = ((fConst55 * (fVec4[0] + fVec4[1])) + (fConst5 * fRec12[1]));
334 double fTemp25 = (fRec11[1] - 2.5e+02);
335 fVec5[0] = fTemp25;
336 fRec33[0] = ((fConst59 * (fVec5[0] + fVec5[1])) + (fConst58 * fRec33[1]));
337 double fTemp26 = max(-1, min(1, (fSlow6 * max(-0.7, min(0.7, fTemp15)))));
338 fRec11[0] = Ftube(0, ((fTemp14 * (fSlow15 + (fSlow12 * (0.024937655860349125 + (fSlow14 * ((0.0997506234413965 - (0.0997506234413965 * fabs((fSlow13 * fTemp14)))) - 0.024937655860349125)))))) + ((0.5 * (fTemp26 * (1 - (0.3333333333333333 * faustpower<2>(fTemp26))))) + (fRec33[0] + (fSlow11 * fRec12[0])))));
339 fRec10[0] = ((fConst60 * ((fConst35 * fRec11[1]) + (fConst0 * fRec11[0]))) + (fConst2 * fRec10[1]));
340 double fTemp27 = (fRec35[1] - 2.5e+02);
341 fVec6[0] = fTemp27;
342 fRec36[0] = ((fConst64 * (fVec6[0] + fVec6[1])) + (fConst63 * fRec36[1]));
343 fRec35[0] = Ftube(1, (fRec36[0] + fRec9[1]));
344 fRec34[0] = ((fConst60 * ((fConst35 * fRec35[1]) + (fConst0 * fRec35[0]))) + (fConst2 * fRec34[1]));
345 fRec9[0] = (fRec34[0] - fRec10[0]);
346 double fTemp28 = (fRec9[0] * fRec8[0]);
347 fVec7[0] = fTemp28;
348 fRec7[0] = ((fConst65 * (fVec7[0] + fVec7[1])) + (fConst5 * fRec7[1]));
349 double fTemp29 = (fRec6[1] - 2.5e+02);
350 fVec8[0] = fTemp29;
351 fRec37[0] = ((fConst64 * (fVec8[0] + fVec8[1])) + (fConst63 * fRec37[1]));
352 fRec6[0] = Ftube(1, (fRec37[0] + fRec7[0]));
353 fRec5[0] = ((fConst60 * ((fConst35 * fRec6[1]) + (fConst0 * fRec6[0]))) + (fConst2 * fRec5[1]));
354 double fTemp30 = (fRec39[1] - 2.5e+02);
355 fVec9[0] = fTemp30;
356 fRec40[0] = ((fConst69 * (fVec9[0] + fVec9[1])) + (fConst68 * fRec40[1]));
357 fRec39[0] = Ftube(1, (fRec40[0] + fRec4[1]));
358 fRec38[0] = ((fConst60 * ((fConst35 * fRec39[1]) + (fConst0 * fRec39[0]))) + (fConst2 * fRec38[1]));
359 fRec4[0] = (fRec38[0] + fRec5[0]);
360 fRec3[0] = ((fConst65 * (fRec4[0] + fRec4[1])) + (fConst5 * fRec3[1]));
361 double fTemp31 = (fRec2[1] - 2.5e+02);
362 fVec10[0] = fTemp31;
363 fRec41[0] = ((fConst69 * (fVec10[0] + fVec10[1])) + (fConst68 * fRec41[1]));
364 fRec2[0] = Ftube(1, (fRec41[0] + fRec3[0]));
365 fRec1[0] = ((fConst60 * ((fConst35 * fRec2[1]) + (fConst0 * fRec2[0]))) + (fConst2 * fRec1[1]));
366 output0[i] = (FAUSTFLOAT)(fRec1[0] * fRec0[0]);
367 // post processing
368 fRec1[1] = fRec1[0];
369 fRec2[1] = fRec2[0];
370 fRec41[1] = fRec41[0];
371 fVec10[1] = fVec10[0];
372 fRec3[1] = fRec3[0];
373 fRec4[1] = fRec4[0];
374 fRec38[1] = fRec38[0];
375 fRec39[1] = fRec39[0];
376 fRec40[1] = fRec40[0];
377 fVec9[1] = fVec9[0];
378 fRec5[1] = fRec5[0];
379 fRec6[1] = fRec6[0];
380 fRec37[1] = fRec37[0];
381 fVec8[1] = fVec8[0];
382 fRec7[1] = fRec7[0];
383 fVec7[1] = fVec7[0];
384 fRec9[1] = fRec9[0];
385 fRec34[1] = fRec34[0];
386 fRec35[1] = fRec35[0];
387 fRec36[1] = fRec36[0];
388 fVec6[1] = fVec6[0];
389 fRec10[1] = fRec10[0];
390 fRec11[1] = fRec11[0];
391 fRec33[1] = fRec33[0];
392 fVec5[1] = fVec5[0];
393 fRec12[1] = fRec12[0];
394 fVec4[1] = fVec4[0];
395 fRec30[2] = fRec30[1]; fRec30[1] = fRec30[0];
396 fRec31[2] = fRec31[1]; fRec31[1] = fRec31[0];
397 fRec32[1] = fRec32[0];
398 fRec28[2] = fRec28[1]; fRec28[1] = fRec28[0];
399 fRec29[1] = fRec29[0];
400 fRec22[2] = fRec22[1]; fRec22[1] = fRec22[0];
401 fRec23[1] = fRec23[0];
402 fVec3[1] = fVec3[0];
403 fRec24[2] = fRec24[1]; fRec24[1] = fRec24[0];
404 fRec25[1] = fRec25[0];
405 fVec2[1] = fVec2[0];
406 fRec26[2] = fRec26[1]; fRec26[1] = fRec26[0];
407 fRec27[1] = fRec27[0];
408 fRec13[2] = fRec13[1]; fRec13[1] = fRec13[0];
409 fRec14[2] = fRec14[1]; fRec14[1] = fRec14[0];
410 fRec15[2] = fRec15[1]; fRec15[1] = fRec15[0];
411 fRec16[1] = fRec16[0];
412 fRec17[1] = fRec17[0];
413 fVec1[1] = fVec1[0];
414 fRec18[2] = fRec18[1]; fRec18[1] = fRec18[0];
415 fRec19[1] = fRec19[0];
416 fRec20[1] = fRec20[0];
417 IOTA = IOTA+1;
418 fRec21[1] = fRec21[0];
419 fRec8[1] = fRec8[0];
420 fRec0[1] = fRec0[0];
421 }
422 }
423
424 static struct RegisterParams { RegisterParams(); } RegisterParams;
425 RegisterParams::RegisterParams()
426 {
427 registerInit("amp2", init);
428 }
429
430 } // end namespace gxamp9
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * ---------------------------------------------------------------------------
1718 *
1819 * This is the 12AU7 tube table
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * ---------------------------------------------------------------------------
1718 *
1819 * This is the 12ax7 tube table
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 *
3 * Copyright (C) 2011, Pete Shorthose
2 * Copyright (C) 2011 Pete Shorthose
43 *
54 * This program is free software; you can redistribute it and/or modify
65 * it under the terms of the GNU General Public License as published by
1413 *
1514 * You should have received a copy of the GNU General Public License
1615 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1817 * ---------------------------------------------------------------------------
1918 *
2019 * This is the 6DJ8 tube table
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * ---------------------------------------------------------------------------
1718 *
1819 * This is the 6V6 tube table
0 /*
1 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17 */
18
019 namespace cabinet_impulse_former {
120 // generated from file '../src/faust/cabinet_impulse_former.dsp'
221
00 /*
1 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011, Pete Shorthose
1 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
1313 *
1414 * You should have received a copy of the GNU General Public License
1515 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1717 * ---------------------------------------------------------------------------
1818 *
1919 * This is the gx_head cabinet impulse response data file
2222 */
2323
2424
25 #include "guitarix.h"
25 #include "guitarix.h" // NOLINT
26
27 #include <iostream> // NOLINT
2628
2729 namespace gx_gui
2830 {
3436 //4x12
3537 int cab_ir_count = 1000;
3638 int cab_ir_sr = 48000;
37 static float cab_ir_data[] = {
38 0.0210554,0.0750885,0.139243,0.180713,0.184139,0.144903,0.0686037,-0.0185033,-0.0886042,-0.12552,
39 static float cab_ir_data[] = { 0.0210554,0.0750885,0.139243,0.180713,0.184139,0.144903,0.0686037,-0.0185033,-0.0886042,-0.12552,
3940 -0.121363,-0.0787852,-0.0213013,0.0229356,0.0411458,0.0370145,0.0195269,-0.00133213,-0.0152812,-0.0145159,
4041 -0.00183383,0.0137818,0.0256187,0.0286779,0.0207782,0.0077942,-0.00120299,-0.0031918,-0.00206098,-0.00135227,
4142 -0.00140983,-0.00497816,-0.0130377,-0.0218103,-0.0277226,-0.0286464,-0.0215221,-0.00951618,-0.00086607,0.0013951,
139140 // 2x12
140141 int cab_ir1_count = 256;
141142 int cab_ir1_sr = 48000;
142 static float cab_ir1_data[] = {0.000143433, -0.00176392, -0.00148621, -0.000708008, -0.00242004, -0.00015564, -0.00227661, 0.00195923, -0.000411987, -0.0011322, 0.00241699, -0.00110779, 0.00299988,
143 static float cab_ir1_data[] = { 0.000143433, -0.00176392, -0.00148621, -0.000708008, -0.00242004, -0.00015564, -0.00227661, 0.00195923, -0.000411987, -0.0011322, 0.00241699, -0.00110779, 0.00299988,
143144 -0.000100708, 0.000189209, 0.00255127, -0.00119019, 0.00362854, -0.000640869, 0.000799561, 0.00148926, -0.0009552, -0.000741577, 0.0017334, -0.00278931, -0.00083313,
144145 0.000411987, -0.0014679, -0.00211182, -0.000662231, -0.00348206, -0.00157166, -0.00445557, -0.00551147, -0.00564575, -0.00552673, -0.00611267, -0.007901, -0.00586548,
145146 -0.00760193, -0.00686646, -0.010202, -0.00746155, -0.00887146, -0.0119141, -0.0100189, -0.0115234, -0.0120728, -0.0124878, -0.0139679, -0.0155396, -0.0146942,
164165 // 1x12
165166 int cab_ir2_count = 768;
166167 int cab_ir2_sr = 48000;
167 static float cab_ir2_data[] = {-0.00323486, -0.0026062, -0.00215454, -0.00219116, -0.00232544, -0.00252686, -0.002948, -0.00360107, -0.00460205, -0.00614014, -0.00812988, -0.0102478, -0.0127991,
168 static float cab_ir2_data[] = { -0.00323486, -0.0026062, -0.00215454, -0.00219116, -0.00232544, -0.00252686, -0.002948, -0.00360107, -0.00460205, -0.00614014, -0.00812988, -0.0102478, -0.0127991,
168169 -0.0177124, -0.02771, -0.0431702, -0.0599945, -0.0708221, -0.0681854, -0.0474915, -0.0095398, 0.0378418, 0.0806122, 0.0999969, 0.0999969, 0.0800568,
169170 0.0421997, -0.00293579, -0.0395203, -0.057785, -0.0583466, -0.0467346, -0.0289368, -0.0101624, 0.00603027, 0.0182739, 0.0267273, 0.0316956, 0.0329712,
170171 0.0304016, 0.0247803, 0.017749, 0.0108948, 0.00513916, 0.000915527, -0.0013855, -0.00125732, 0.00157471, 0.00671997, 0.0129822, 0.0184143, 0.0207336,
229230 // 4x10
230231 int cab_ir3_count = 192;
231232 int cab_ir3_sr = 48000;
232 static float cab_ir3_data[] = {-0.00127869, 0.00161743, 0.00407104, 0.00612183, 0.00762024, 0.00864563, 0.00959778, 0.0106781, 0.012323, 0.0140106, 0.0155396, 0.0171661, 0.0183319,
233 static float cab_ir3_data[] = { -0.00127869, 0.00161743, 0.00407104, 0.00612183, 0.00762024, 0.00864563, 0.00959778, 0.0106781, 0.012323, 0.0140106, 0.0155396, 0.0171661, 0.0183319,
233234 0.0191315, 0.0198395, 0.0205811, 0.0225037, 0.0254089, 0.0303925, 0.0372711, 0.0453613, 0.053598, 0.0605743, 0.0649933, 0.0650116, 0.0606659,
234235 0.0507782, 0.0354889, 0.0160004, -0.00758972, -0.03237, -0.0576294, -0.0792542, -0.0948212, -0.0999908, -0.0914398, -0.068631, -0.0339661, 0.00720825,
235236 0.0443512, 0.0698151, 0.0776123, 0.0687683, 0.0484406, 0.0240448, 0.00180359, -0.0130371, -0.0180328, -0.0166748, -0.0127258, -0.00917053, -0.0100311,
249250 //2x10
250251 int cab_ir4_count = 896;
251252 int cab_ir4_sr = 48000;
252 static float cab_ir4_data[] = {0.000701904, 0.000823975, 0.00101318, 0.0013916, 0.000299072, -0.00462647, -0.0127136, -0.0191956, -0.0182678, -0.00629272, 0.0156799, 0.041217, 0.0609344,
253 static float cab_ir4_data[] = { 0.000701904, 0.000823975, 0.00101318, 0.0013916, 0.000299072, -0.00462647, -0.0127136, -0.0191956, -0.0182678, -0.00629272, 0.0156799, 0.041217, 0.0609344,
253254 0.0665375, 0.0536774, 0.023584, -0.0168274, -0.0571197, -0.0869965, -0.0999969, -0.09534, -0.0768219, -0.0508453, -0.0246521, -0.0041687, 0.00806885,
254255 0.0136108, 0.0166321, 0.0211365, 0.028302, 0.0363892, 0.0423523, 0.0434326, 0.0385742, 0.0293823, 0.0194702, 0.0121216, 0.00860596, 0.00822144,
255256 0.00960693, 0.0114746, 0.0130127, 0.0138916, 0.0137878, 0.0119385, 0.00778198, 0.0020874, -0.00289307, -0.00475464, -0.00239258, 0.00332642, 0.0101624,
323324 //HighGain
324325 int cab_ir5_count = 192;
325326 int cab_ir5_sr = 48000;
326 static float cab_ir5_data[] = {0.00032959, 0.00110474, 0.00174866, 0.00374451, 0.00339966, 0.00570374, 0.00650635, 0.007901, 0.00887451, 0.00844727, 0.00891724, 0.0078064, 0.00594177,
327 static float cab_ir5_data[] = { 0.00032959, 0.00110474, 0.00174866, 0.00374451, 0.00339966, 0.00570374, 0.00650635, 0.007901, 0.00887451, 0.00844727, 0.00891724, 0.0078064, 0.00594177,
327328 0.0055481, 0.0041687, 0.00488892, 0.00620117, 0.0124329, 0.0188995, 0.0307892, 0.0434265, 0.0538727, 0.0629425, 0.0670319, 0.0642609, 0.0613708,
328329 0.0476685, 0.0340912, 0.0156799, -0.00499878, -0.0286621, -0.0470245, -0.0614594, -0.0639069, -0.050943, -0.0213898, 0.0180359, 0.0591553, 0.0882782,
329330 0.0999878, 0.0933716, 0.0748993, 0.0485596, 0.0243927, 0.00559082, -0.00264282, -0.00406189, -0.00350952, -0.000479126, -0.00288696, -0.00631104, -0.0085022,
343344 //Twin
344345 int cab_ir6_count = 192;
345346 int cab_ir6_sr = 48000;
346 static float cab_ir6_data[] = {-0.00248718, 0.00213013, 0.00604248, 0.0112091, 0.0163269, 0.021521, 0.0275574, 0.0338104, 0.0412903, 0.0489868, 0.0579742, 0.0658875, 0.0735504,
347 static float cab_ir6_data[] = { -0.00248718, 0.00213013, 0.00604248, 0.0112091, 0.0163269, 0.021521, 0.0275574, 0.0338104, 0.0412903, 0.0489868, 0.0579742, 0.0658875, 0.0735504,
347348 0.0774078, 0.0771973, 0.07229, 0.0630219, 0.051239, 0.0374146, 0.021994, 0.00320129, -0.0183258, -0.0423828, -0.0672119, -0.0882599, -0.0995728,
348349 -0.0971954, -0.0775452, -0.0434357, 0.000286865, 0.0402557, 0.0653076, 0.0661804, 0.0455444, 0.0165436, -0.0072052, -0.0144287, -0.00848083, 0.00375977,
349350 0.0146698, 0.0196289, 0.0180511, 0.011264, 0.00258789, -0.00515747, -0.00702209, -0.00657959, -0.00658569, -0.0059082, -0.0061554, -0.00519714, -0.00263672,
363364 //Bassman
364365 int cab_ir7_count = 192;
365366 int cab_ir7_sr = 48000;
366 static float cab_ir7_data[] = {-0.0135193, -0.0170654, -0.0122955, -0.0142334, -0.0131775, -0.0132965, -0.0127258, -0.0152039, -0.01138, -0.016806, -0.011557, -0.0141876, -0.00864258,
367 static float cab_ir7_data[] = { -0.0135193, -0.0170654, -0.0122955, -0.0142334, -0.0131775, -0.0132965, -0.0127258, -0.0152039, -0.01138, -0.016806, -0.011557, -0.0141876, -0.00864258,
367368 -0.0124908, -0.0108978, -0.00955811, -0.0157318, -0.0183807, -0.0201386, -0.0251465, -0.0209259, -0.0262756, -0.0199371, -0.0149078, -0.00731201, 0.00153503,
368369 0.0135101, 0.0243683, 0.0322968, 0.0433075, 0.0503571, 0.0568634, 0.0703674, 0.0783051, 0.0914154, 0.0999908, 0.0980591, 0.0955383, 0.0794281,
369370 0.0597534, 0.031485, -0.00279541, -0.0304779, -0.0540436, -0.0625885, -0.0501495, -0.0274353, 0.0180267, 0.0631134, 0.0926331, 0.098819, 0.0706421,
383384 //Marshall
384385 int cab_ir8_count = 128;
385386 int cab_ir8_sr = 48000;
386 static float cab_ir8_data[] = {-0.00922852, -0.000869751, -0.00532837, -0.00475159, -0.00434875, -0.00599976, -0.0036438, -0.00747681, -0.00713806, -0.00734558, -0.00646667, -0.00988159, -0.00717163,
387 static float cab_ir8_data[] = { -0.00922852, -0.000869751, -0.00532837, -0.00475159, -0.00434875, -0.00599976, -0.0036438, -0.00747681, -0.00713806, -0.00734558, -0.00646667, -0.00988159, -0.00717163,
387388 -0.00905151, -0.00700378, -0.011731, -0.00480042, -0.0109528, -0.0086792, -0.0108398, -0.00987549, -0.0137299, -0.0147949, -0.0119843, -0.0141663, -0.0177155,
388389 -0.0137268, -0.0164459, -0.0175385, -0.0167175, -0.019162, -0.0172638, -0.0205505, -0.018927, -0.0181885, -0.0179016, -0.0175201, -0.0201355, -0.0151581,
389390 -0.0188446, -0.0123016, -0.0148804, -0.0123779, -0.0107971, -0.00960693, -0.00480652, -0.0113129, -0.00471497, -0.00960999, -0.00814209, -0.00911865, -0.0100708,
398399 //AC30
399400 int cab_ir9_count = 192;
400401 int cab_ir9_sr = 48000;
401 static float cab_ir9_data[] = {7.32422e-05, 0.00015564, 0.00302429, 0.0057251, 0.00652466, 0.00614014, 0.00662537, 0.00419922, 0.00424194, -0.00379334, -0.00308838, -0.0103577, -0.0165436,
402 static float cab_ir9_data[] = { 7.32422e-05, 0.00015564, 0.00302429, 0.0057251, 0.00652466, 0.00614014, 0.00662537, 0.00419922, 0.00424194, -0.00379334, -0.00308838, -0.0103577, -0.0165436,
402403 -0.0208832, -0.0206482, -0.027774, -0.0240204, -0.0231415, -0.0195801, -0.0178253, -0.015921, -0.0149628, -0.0164642, -0.0195465, -0.0218109, -0.0230652,
403404 -0.0246216, -0.0256104, -0.0260925, -0.0210358, -0.0207489, -0.015863, -0.0106201, -0.0106628, -0.00259705, 0.00690613, 0.0146484, 0.026236, 0.0348633,
404405 0.0506409, 0.0615387, 0.0747467, 0.0847351, 0.0917419, 0.0999908, 0.0957062, 0.093335, 0.0774262, 0.0564789, 0.0312073, 0.00177002, -0.0296539,
418419 //Princeton
419420 int cab_ir10_count = 768;
420421 int cab_ir10_sr = 48000;
421 static float cab_ir10_data[] = {-0.00309448, -0.00641479, -0.0076355, -0.00684204, -0.0046814, -0.00162964, 0.0022644, 0.00679321, 0.0110474, 0.0140808, 0.0159912, 0.0153442, 0.0124268,
422 static float cab_ir10_data[] = { -0.00309448, -0.00641479, -0.0076355, -0.00684204, -0.0046814, -0.00162964, 0.0022644, 0.00679321, 0.0110474, 0.0140808, 0.0159912, 0.0153442, 0.0124268,
422423 0.00848389, 0.00452881, 0.00045166, -0.00389404, -0.00841675, -0.0115479, -0.0121704, -0.0108582, -0.00772095, -0.00272827, 0.00341187, 0.00960693, 0.0144775,
423424 0.0154358, 0.0115173, 0.00429688, -0.00339355, -0.00940552, -0.0124878, -0.0122437, -0.00877686, -0.00349731, 0.0017395, 0.00515137, 0.00681152, 0.00726929,
424425 0.00681152, 0.00482788, 0.00195312, -0.00167847, -0.00560913, -0.00799561, -0.00747681, -0.00460205, -0.000897217, 0.00301514, 0.00552368, 0.00639038, 0.00568848,
477478 //A2
478479 int cab_ir11_count = 896;
479480 int cab_ir11_sr = 48000;
480 static float cab_ir11_data[] = {-0.0529144, -0.0479034, -0.0443909, -0.0402527, -0.0356598, -0.0326569, -0.0296112, -0.027478, -0.0252869, -0.0243713, -0.0245483, -0.0250519, -0.0316956,
481 static float cab_ir11_data[] = { -0.0529144, -0.0479034, -0.0443909, -0.0402527, -0.0356598, -0.0326569, -0.0296112, -0.027478, -0.0252869, -0.0243713, -0.0245483, -0.0250519, -0.0316956,
481482 -0.0375, -0.0475891, -0.054834, -0.0614899, -0.0598389, -0.0492432, -0.031076, -0.00463562, 0.0245972, 0.0523651, 0.0742096, 0.0906158, 0.0986084,
482483 0.0998169, 0.0968109, 0.0876556, 0.073114, 0.0524231, 0.0241486, -0.0106567, -0.0450958, -0.074826, -0.0859497, -0.0783478, -0.0476959, -0.00476685,
483484 0.0396454, 0.0748657, 0.0915741, 0.0869782, 0.0698364, 0.0443329, 0.0224701, 0.0104736, 0.0111023, 0.0213318, 0.0341736, 0.0478607, 0.0530609,
551552 //contrast
552553 int contrast_ircount = 192;
553554 int contrast_irsr = 48000;
554 static float contrast_irdata[] = {0.147081, 0.208808, 0.208996, 0.163228, 0.0858905, -0.0119104, -0.0932825, -0.121011, -0.0999426, -0.071073, -0.0403973, -0.00214844, 0.0287018,
555 static float contrast_irdata[] = { 0.147081, 0.208808, 0.208996, 0.163228, 0.0858905, -0.0119104, -0.0932825, -0.121011, -0.0999426, -0.071073, -0.0403973, -0.00214844, 0.0287018,
555556 0.0381079, 0.0372284, 0.0330389, 0.0252979, 0.0141394, 0.00118835, -0.00764709, -0.00751953, 0.00262512, 0.0143475, 0.0174762, 0.0168384, 0.0179126,
556557 0.00738525, -0.0114069, -0.0192352, -0.0145825, -0.0179932, -0.0244049, -0.0173956, -0.00357178, 0.00643188, 0.0108966, 0.0132935, 0.0123737, 0.00680786,
557558 -0.000214844, -0.0040686, -0.00533752, -0.00738525, -0.00539124, -0.00171875, 0.00156433, 0.00481384, 0.0038739, -0.00666016, -0.018866, -0.0216522, -0.0171606,
568569 -0.00496155, 0.00805664, 0.0157843, 0.0171069, 0.0131055, 0.00613647, -0.00216187, -0.00804321, -0.0117157, 0
569570 };
570571
571 /**----------------------------- cabinet impulse response data end --------------------------------**/
572
573 static bool cab_conv_start()
574 {
575 if(gx_engine::audio.cab_switched != gx_engine::audio.cabinet) {
576 gx_engine::audio.cab_switched = gx_engine::audio.cabinet;
577 gx_engine::init_non_rt_processing();
578 }
579 int cab_irsr = cab_ir_sr;
580 int cab_ircount = cab_ir_count;
581 float *cab_irdata = cab_ir_data;
582 switch(gx_engine::audio.cabinet){
583 case 0: //"4x12"
584 cab_ircount = cab_ir_count;
585 cab_irsr = cab_ir_sr;
586 cab_irdata = cab_ir_data;
587 break;
588 case 1: //"2x12"
589 cab_ircount = cab_ir1_count;
590 cab_irsr = cab_ir1_sr;
591 cab_irdata = cab_ir1_data;
592 break;
593 case 2: //"1x12"
594 cab_ircount = cab_ir2_count;
595 cab_irsr = cab_ir2_sr;
596 cab_irdata = cab_ir2_data;
597 break;
598 case 3: //"4x10"
599 cab_ircount = cab_ir3_count;
600 cab_irsr = cab_ir3_sr;
601 cab_irdata = cab_ir3_data;
602 break;
603 case 4: //"2x10"
604 cab_ircount = cab_ir4_count;
605 cab_irsr = cab_ir4_sr;
606 cab_irdata = cab_ir4_data;
607 break;
608 case 5: //"High Gain"
609 cab_ircount = cab_ir5_count;
610 cab_irsr = cab_ir5_sr;
611 cab_irdata = cab_ir5_data;
612 break;
613 case 6: //"Twin"
614 cab_ircount = cab_ir6_count;
615 cab_irsr = cab_ir6_sr;
616 cab_irdata = cab_ir6_data;
617 break;
618 case 7: //"Bassman"
619 cab_ircount = cab_ir7_count;
620 cab_irsr = cab_ir7_sr;
621 cab_irdata = cab_ir7_data;
622 break;
623 case 8: //"Marshall"
624 cab_ircount = cab_ir8_count;
625 cab_irsr = cab_ir8_sr;
626 cab_irdata = cab_ir8_data;
627 break;
628 case 9: //"AC-30"
629 cab_ircount = cab_ir9_count;
630 cab_irsr = cab_ir9_sr;
631 cab_irdata = cab_ir9_data;
632 break;
633 case 10: //"Princeton"
634 cab_ircount = cab_ir10_count;
635 cab_irsr = cab_ir10_sr;
636 cab_irdata = cab_ir10_data;
637 break;
638 case 11: //"A2"
639 cab_ircount = cab_ir11_count;
640 cab_irsr = cab_ir11_sr;
641 cab_irdata = cab_ir11_data;
642 break;
643 }
644 float cab_irdata_c[cab_ircount];
645 (void)memset(cab_irdata_c, 0, cab_ircount*sizeof(float));
646 gx_engine::cab_conv.stop();
647 gx_engine::non_rt_processing(cab_ircount,cab_irdata,cab_irdata_c);
648
649 while (!gx_engine::cab_conv.checkstate());
650 if (!gx_engine::cab_conv.configure(cab_ircount, cab_irdata_c, cab_irsr)) {
651 return false;
652 }
653 return gx_engine::cab_conv.start();
572 /**--------------------- cabinet impulse response data end ----------------------------**/
573
574 static bool cab_conv_start() {
575 if (gx_engine::audio.cab_switched != gx_engine::audio.cabinet) {
576 gx_engine::audio.cab_switched = gx_engine::audio.cabinet;
577 gx_engine::init_non_rt_processing();
578 }
579 int cab_irsr = cab_ir_sr;
580 int cab_ircount = cab_ir_count;
581 float *cab_irdata = cab_ir_data;
582 switch (gx_engine::audio.cabinet) {
583 case 0: // "4x12"
584 cab_ircount = cab_ir_count;
585 cab_irsr = cab_ir_sr;
586 cab_irdata = cab_ir_data;
587 break;
588 case 1: // "2x12"
589 cab_ircount = cab_ir1_count;
590 cab_irsr = cab_ir1_sr;
591 cab_irdata = cab_ir1_data;
592 break;
593 case 2: // "1x12"
594 cab_ircount = cab_ir2_count;
595 cab_irsr = cab_ir2_sr;
596 cab_irdata = cab_ir2_data;
597 break;
598 case 3: // "4x10"
599 cab_ircount = cab_ir3_count;
600 cab_irsr = cab_ir3_sr;
601 cab_irdata = cab_ir3_data;
602 break;
603 case 4: // "2x10"
604 cab_ircount = cab_ir4_count;
605 cab_irsr = cab_ir4_sr;
606 cab_irdata = cab_ir4_data;
607 break;
608 case 5: // "High Gain"
609 cab_ircount = cab_ir5_count;
610 cab_irsr = cab_ir5_sr;
611 cab_irdata = cab_ir5_data;
612 break;
613 case 6: // "Twin"
614 cab_ircount = cab_ir6_count;
615 cab_irsr = cab_ir6_sr;
616 cab_irdata = cab_ir6_data;
617 break;
618 case 7: // "Bassman"
619 cab_ircount = cab_ir7_count;
620 cab_irsr = cab_ir7_sr;
621 cab_irdata = cab_ir7_data;
622 break;
623 case 8: // "Marshall"
624 cab_ircount = cab_ir8_count;
625 cab_irsr = cab_ir8_sr;
626 cab_irdata = cab_ir8_data;
627 break;
628 case 9: // "AC-30"
629 cab_ircount = cab_ir9_count;
630 cab_irsr = cab_ir9_sr;
631 cab_irdata = cab_ir9_data;
632 break;
633 case 10: // "Princeton"
634 cab_ircount = cab_ir10_count;
635 cab_irsr = cab_ir10_sr;
636 cab_irdata = cab_ir10_data;
637 break;
638 case 11: // "A2"
639 cab_ircount = cab_ir11_count;
640 cab_irsr = cab_ir11_sr;
641 cab_irdata = cab_ir11_data;
642 break;
643 }
644 float cab_irdata_c[cab_ircount];
645 (void)memset(cab_irdata_c, 0, cab_ircount*sizeof(float));
646 gx_engine::cab_conv.stop();
647 gx_engine::non_rt_processing(cab_ircount,cab_irdata,cab_irdata_c);
648
649 while (!gx_engine::cab_conv.checkstate());
650 if (!gx_engine::cab_conv.configure(cab_ircount, cab_irdata_c, cab_irsr)) {
651 return false;
652 }
653 return gx_engine::cab_conv.start();
654654 }
655655
656 gboolean conv_restart(gpointer data)
657 {
658 //gx_engine::audio.fcab = false;
659
660 cab_conv_start();
661 //gx_engine::audio.fcab = true;
662 return false;
656 gboolean conv_restart(gpointer data) {
657 cab_conv_start();
658 return false;
663659 }
664660
665661
666 static bool contrast_start()
667 {
668 while (!gx_engine::contrast_conv.checkstate());
669 if (!gx_engine::contrast_conv.configure(contrast_ircount, contrast_irdata, contrast_irsr)) {
670 return false;
671 }
672 return gx_engine::contrast_conv.start();
662 static bool contrast_start() {
663 while (!gx_engine::contrast_conv.checkstate());
664 if (!gx_engine::contrast_conv.configure(contrast_ircount, contrast_irdata, contrast_irsr)) {
665 return false;
666 }
667 return gx_engine::contrast_conv.start();
673668 }
674669
675 gboolean contrast_restart(gpointer data)
676 {
677 contrast_start();
678 return false;
670 gboolean contrast_restart(gpointer data) {
671 contrast_start();
672 return false;
679673 }
680674
681 } //end namespace CabConvolveData
682
683 void cab_conv_restart()
684 {
685 if (g_threads[5] == 0 || g_main_context_find_source_by_id(NULL, g_threads[5]) == NULL) {
686 g_threads[5] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 0, CabConvolveData::conv_restart,NULL,NULL);
687 gx_engine::set_cab_mode(gx_engine::audio.cab_level+gx_engine::audio.cab_bass+gx_engine::audio.cab_treble);
688 } else cout << "cab thread is bussy" << endl;
675 } // end namespace CabConvolveData
676
677 void cab_conv_restart() {
678 if (g_threads[5] == 0 || g_main_context_find_source_by_id(NULL, g_threads[5]) == NULL) {
679 g_threads[5] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 0,
680 CabConvolveData::conv_restart,NULL,NULL);
681 gx_engine::set_cab_mode(gx_engine::audio.cab_level + gx_engine::audio.cab_bass +
682 gx_engine::audio.cab_treble);
683 } else {
684 std::cout << "cab thread is bussy" << endl;
685 }
689686 }
690687
691 void UiCabSwitch::on_switch_toggled()
692 {
693 if (!m_switch->get_active()) {
694 gx_engine::cab_conv.stop();
695 } else if (!CabConvolveData::cab_conv_start()) {
696 m_switch->set_active(false);
697 }
688 void UiCabSwitch::on_switch_toggled() {
689 if (!m_switch->get_active()) {
690 gx_engine::cab_conv.stop();
691 } else if (!CabConvolveData::cab_conv_start()) {
692 m_switch->set_active(false);
693 }
698694 }
699695
700696 // contrast
701697
702698
703 void contrast_conv_restart()
704 {
705 g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 0, CabConvolveData::contrast_restart,NULL,NULL);
706
699 void contrast_conv_restart() {
700 g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 0, CabConvolveData::contrast_restart,NULL,NULL);
707701 }
708702
709 void UiContrastSwitch::on_switch_toggled()
710 {
711 if (!m_switch->get_active()) {
712 gx_engine::contrast_conv.stop();
713 } else if (!CabConvolveData::contrast_start()) {
714 m_switch->set_active(false);
715 }
703 void UiContrastSwitch::on_switch_toggled() {
704 if (!m_switch->get_active()) {
705 gx_engine::contrast_conv.stop();
706 } else if (!CabConvolveData::contrast_start()) {
707 m_switch->set_active(false);
708 }
716709 }
717710
718 }//end namespace gx_gui
711 }// end namespace gx_gui
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * --------------------------------------------------------------------------
1718 *
1819 *
3132 // set cairo color related to the used skin
3233 void gx_skin_color(cairo_pattern_t *pat)
3334 {
34 int skin_is = int(float(gx_gui::gx_current_skin));
35 int skin_is = int(float(gx_gui::skin.gx_current_skin));
3536
3637 switch (skin_is)
3738 {
454455
455456 gboolean tribal_box_expose(GtkWidget *wi, GdkEventExpose *ev, gpointer user_data)
456457 {
457 if (int(float(gx_gui::gx_current_skin)!=1) && int(float(gx_gui::gx_current_skin)<7))
458 if (int(float(gx_gui::skin.gx_current_skin)!=1) && int(float(gx_gui::skin.gx_current_skin)<7))
458459 {
459460 GdkPixbuf *_image;
460461 cairo_t *cr;
509510
510511 gboolean vbox_expose(GtkWidget *wi, GdkEventExpose *ev, gpointer user_data)
511512 {
512 if (int(float(gx_gui::gx_current_skin)==1))
513 if (int(float(gx_gui::skin.gx_current_skin)==1))
513514 {
514515 cairo_t *cr;
515516 /* create a cairo context */
536537 cairo_pattern_destroy (pat);
537538 cairo_destroy(cr);
538539 }
539 else if (int(float(gx_gui::gx_current_skin)>=7))
540 else if (int(float(gx_gui::skin.gx_current_skin)>=7))
540541 zac_expose(wi,ev,user_data);
541542
542543 return FALSE;
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * --------------------------------------------------------------------------
1718 *
1819 * This is the guitarix module handling child processes spawned from it
2021 * --------------------------------------------------------------------------
2122 */
2223
24 #include "guitarix.h"
25
2326 #include <sys/wait.h>
27
2428 #include <fstream>
25 #include "guitarix.h"
26
27 using namespace gx_system;
28 using namespace gx_engine;
29
30 namespace gx_child_process
31 {
29 #include <string>
30 #include <list>
31
32 namespace gx_child_process {
3233
3334 /****************************************************************
3435 ** GxChild, GxChildProcs
3536 */
3637
37 bool GxChild::kill()
38 {
39 return ::kill(m_pid, m_killsignal) != -1;
40 }
41
42 GxChildProcs::~GxChildProcs()
43 {
44 for (list<GxChild*>::iterator i = children.begin(); i != children.end(); i++) {
45 (*i)->kill();
46 delete *i;
47 }
48 }
49
50 bool GxChildProcs::killall()
51 {
52 int ret = true;
53 for (list<GxChild*>::iterator i = children.begin(); i != children.end(); i++) {
54 if (! (*i)->kill()) {
55 ret = false;
56 }
57 }
58 return ret;
59 }
60
61 bool GxChildProcs::kill(string name)
62 {
63 GxChild *p = find(name);
64 if (p) {
65 return p->kill();
66 }
67 return true;
68 }
69
70 GxChild *GxChildProcs::find(string name)
71 {
72 for (list<GxChild*>::iterator i = children.begin(); i != children.end(); i++) {
73 if ((*i)->hasName(name)) {
74 return *i;
75 }
76 }
77 return 0;
38 bool GxChild::kill() {
39 return ::kill(m_pid, m_killsignal) != -1;
40 }
41
42 GxChildProcs::~GxChildProcs() {
43 for (list<GxChild*>::iterator i = children.begin(); i != children.end(); i++) {
44 (*i)->kill();
45 delete *i;
46 }
47 }
48
49 bool GxChildProcs::killall() {
50 int ret = true;
51 for (list<GxChild*>::iterator i = children.begin(); i != children.end(); i++) {
52 if (!(*i)->kill()) {
53 ret = false;
54 }
55 }
56 return ret;
57 }
58
59 bool GxChildProcs::kill(string name) {
60 GxChild *p = find(name);
61 if (p) {
62 return p->kill();
63 }
64 return true;
65 }
66
67 GxChild *GxChildProcs::find(string name) {
68 for (list<GxChild*>::iterator i = children.begin(); i != children.end(); i++) {
69 if ((*i)->hasName(name)) {
70 return *i;
71 }
72 }
73 return 0;
7874 }
7975
8076 #define EXIT_PGM_NOT_FOUND 127
8177
82 gboolean gx_sigchld_handler(gpointer)
83 {
84 int status;
85 pid_t pid = waitpid(-1, &status, WNOHANG);
86 if (pid == 0 || pid == -1) {
87 return false;
88 }
89 bool pgm_found = true;
90 if (WIFEXITED(status)) {
91 if (WEXITSTATUS(status) == EXIT_PGM_NOT_FOUND) {
92 pgm_found = false;
93 }
94 } else if (!WIFSIGNALED(status)) {
95 // process didn't terminate
96 return false;
97 }
98 // child pid has terminated
99 list<GxChild*>& cl = childprocs.children;
100 GxChild *p = 0;
101 for (list<GxChild*>::iterator i = cl.begin(); i != cl.end(); i++) {
102 if ((*i)->hasPid(pid)) {
103 p = *i;
104 cl.erase(i);
105 break;
106 }
107 }
108 if (p) {
109 p->terminated(pgm_found);
110 return false;
111 }
112 return false;
113 }
114
115 GxChild *GxChildProcs::launch(string name, const char *const args[], int killsignal)
116 {
117 // fork produces about 3ms latency on linux 2.6.31-9-rt
118 // vfork works
119 // FIXME check if its a version-specific bug
120 int pid = vfork();
121 switch (pid) {
122 case -1: // error, in parent
123 return 0;
124
125 case 0: // in child
126 execvp(args[0], (char**)args);
127 _exit(EXIT_PGM_NOT_FOUND);
128 /*NOTREACHED*/
129 return 0;
130
131 default: // in parent
132 GxChild *p = new GxChild(name, killsignal, pid);
133 children.push_back(p);
134 return p;
135 }
136 }
137
138 GxChild *GxChildProcs::launch(string name, list<string> args, int killsignal)
139 {
140 const char **p = new const char*[args.size()+1];
141 unsigned int i = 0;
142 for (list<string>::iterator j = args.begin(); j != args.end(); j++) {
143 //cout << *j << endl;
144 p[i++] = j->c_str();
145 }
146 assert(i == args.size());
147 p[i] = 0;
148 GxChild *c = launch(name, p, killsignal);
149 delete p;
150 return c;
78 gboolean gx_sigchld_handler(gpointer) {
79 int status;
80 pid_t pid = waitpid(-1, &status, WNOHANG);
81 if (pid == 0 || pid == -1) {
82 return false;
83 }
84 bool pgm_found = true;
85 if (WIFEXITED(status)) {
86 if (WEXITSTATUS(status) == EXIT_PGM_NOT_FOUND) {
87 pgm_found = false;
88 }
89 } else if (!WIFSIGNALED(status)) {
90 // process didn't terminate
91 return false;
92 }
93 // child pid has terminated
94 list<GxChild*>& cl = childprocs.children;
95 GxChild *p = 0;
96 for (list<GxChild*>::iterator i = cl.begin(); i != cl.end(); i++) {
97 if ((*i)->hasPid(pid)) {
98 p = *i;
99 cl.erase(i);
100 break;
101 }
102 }
103 if (p) {
104 p->terminated(pgm_found);
105 return false;
106 }
107 return false;
108 }
109
110 GxChild *GxChildProcs::launch(string name, const char *const args[], int killsignal) {
111 // fork produces about 3ms latency on linux 2.6.31-9-rt
112 // vfork works
113 // FIXME check if its a version-specific bug
114 int pid = vfork();
115 switch (pid) {
116 case -1: // error, in parent
117 return 0;
118
119 case 0: // in child
120 execvp(args[0], (char**)args);
121 _exit(EXIT_PGM_NOT_FOUND);
122 /*NOTREACHED*/
123 return 0;
124
125 default: // in parent
126 GxChild *p = new GxChild(name, killsignal, pid);
127 children.push_back(p);
128 return p;
129 }
130 }
131
132 GxChild *GxChildProcs::launch(string name, list<string> args, int killsignal) {
133 const char **p = new const char*[args.size()+1];
134 unsigned int i = 0;
135 for (list<string>::iterator j = args.begin(); j != args.end(); j++) {
136 // cout << *j << endl;
137 p[i++] = j->c_str();
138 }
139 assert(i == args.size());
140 p[i] = 0;
141 GxChild *c = launch(name, p, killsignal);
142 delete p;
143 return c;
151144 }
152145
153146 GxChildProcs childprocs;
157150 */
158151
159152 //----------------------- jack_capture settings ---------------------------
160 JackCaptureGui::JackCaptureGui(GxChild *p, GtkCheckMenuItem *i):
161 item(i)
162 {
163 gtk_widget_ref(GTK_WIDGET(item));
164 p->terminated.connect(sigc::mem_fun(*this, &JackCaptureGui::terminated));
165 }
166
167 void JackCaptureGui::terminated(bool pgm_found)
168 {
169 gtk_check_menu_item_set_active(item, false);
170 if (pgm_found) {
171 gx_print_info("Jack capture gui", "jack_capture_gui2 terminated");
172 } else {
173 gx_gui::gx_message_popup(
174 " "
175 " ERORR [Jack Capture GUI]\n\n "
176 " jack_capture_gui2 is not installed! "
177 );
178 }
179 gtk_widget_unref(GTK_WIDGET(item));
180 delete this;
181 }
182
183 void JackCaptureGui::start_stop(GtkCheckMenuItem *menuitem, gpointer)
184 {
185 const char *app_name = "jack_capture_gui2";
186 if (gtk_check_menu_item_get_active(menuitem)) {
187 if (childprocs.find(app_name)) {
188 return;
189 }
190 string sess = string(getenv("HOME")) + "/guitarix_session";
191 const char * const args[] = {
192 app_name, "-o", "yes", "-f", sess.c_str(), "-n", "guitarix", "-p", "/.guitarix/ja_ca_ssetrc", 0 };
193 GxChild *jack_cap_gui = childprocs.launch(app_name, args, SIGTERM);
194 if (jack_cap_gui) {
195 new JackCaptureGui(jack_cap_gui, menuitem);
196 } else {
197 gx_gui::gx_message_popup(
198 " "
199 "ERROR [Jack capture gui]\n\n "
200 "jack_capture_gui2 could not be launched!"
201 );
202 gx_print_error("Jack capture gui",
203 string("jack_capture_gui2 could not be launched (fork failed)!"));
204 gtk_check_menu_item_set_active(menuitem, FALSE);
205 }
206 } else {
207 childprocs.kill(app_name);
208 }
153 JackCaptureGui::JackCaptureGui(GxChild *p, GtkCheckMenuItem *i)
154 : item(i) {
155 gtk_widget_ref(GTK_WIDGET(item));
156 p->terminated.connect(sigc::mem_fun(*this, &JackCaptureGui::terminated));
157 }
158
159 void JackCaptureGui::terminated(bool pgm_found) {
160 gtk_check_menu_item_set_active(item, false);
161 if (pgm_found) {
162 gx_system::gx_print_info("Jack capture gui", "jack_capture_gui2 terminated");
163 } else {
164 gx_gui::gx_message_popup(
165 " "
166 " ERORR [Jack Capture GUI]\n\n "
167 " jack_capture_gui2 is not installed! "
168 );
169 }
170 gtk_widget_unref(GTK_WIDGET(item));
171 delete this;
172 }
173
174 void JackCaptureGui::start_stop(GtkCheckMenuItem *menuitem, gpointer) {
175 const char *app_name = "jack_capture_gui2";
176 if (gtk_check_menu_item_get_active(menuitem)) {
177 if (childprocs.find(app_name)) {
178 return;
179 }
180 string sess = string(getenv("HOME")) + "/guitarix_session";
181 const char * const args[] = {
182 app_name, "-o", "yes", "-f", sess.c_str(),
183 "-n", "guitarix", "-p", "/.guitarix/ja_ca_ssetrc", 0 };
184 GxChild *jack_cap_gui = childprocs.launch(app_name, args, SIGTERM);
185 if (jack_cap_gui) {
186 new JackCaptureGui(jack_cap_gui, menuitem);
187 } else {
188 gx_gui::gx_message_popup(
189 " "
190 "ERROR [Jack capture gui]\n\n "
191 "jack_capture_gui2 could not be launched!"
192 );
193 gx_system::gx_print_error("Jack capture gui",
194 string("jack_capture_gui2 could not be launched (fork failed)!"));
195 gtk_check_menu_item_set_active(menuitem, FALSE);
196 }
197 } else {
198 childprocs.kill(app_name);
199 }
209200 }
210201
211202 //---------------------------- Jack Capture -------------------------------
212203
213 JackCapture::JackCapture(GxChild *p, GtkToggleButton *b):
214 button(b)
215 {
216 gtk_widget_ref(GTK_WIDGET(button));
217 p->terminated.connect(sigc::mem_fun(*this, &JackCapture::terminated));
218 }
219
220 void JackCapture::terminated(bool pgm_found)
221 {
222 gtk_toggle_button_set_active(button, false);
223 if (pgm_found) {
224 gx_print_info("Jack Capture", "jack_capture terminated");
225 } else {
226 gx_print_warning("Record",
227 " WARNING [jack_capture]\n "
228 " You need jack_capture >= 0.9.30 by Kjetil S. Matheussen \n "
229 " Please look here\n "
230 " http://old.notam02.no/arkiv/src/?M=D\n");
231 }
232 gtk_widget_unref(GTK_WIDGET(button));
233 delete this;
234 }
235
236 //---- wav file construction for jack_capture
237 string JackCapture::make_fname(string buf, size_t j, size_t i, int n)
238 {
239 ostringstream str;
240 str << buf.substr(0,j+1) << n << buf.substr(i);
241 return str.str();
242 }
243
244 list<string> JackCapture::capture_command(int& seq)
245 {
246 // open jack_capture setup file
247 string gfilename = gx_user_dir + jcapsetup_file;
248 ifstream f(gfilename.c_str());
249
250 list<string> l;
251 string buf;
252 while (true) {
253 f >> buf;
254 if (!f.good()) {
255 break;
256 }
257 l.push_back(buf);
258 }
259 f.close();
260 if (l.empty()) {
261 (void)gx_gui::gx_message_popup(
262 " ERROR [Record]\n\n "
263 " Please run jack capture settings first [alt+j]"
264 );
265 return l;
266 }
267 buf = *l.rbegin(); // last argument should be filename
268 l.pop_back(); // pop last argument (re-add later after processing)
269 l.push_back("--hide-buffer-usage"); // add additional option
270 size_t i = buf.find_last_of(".");
271 if (i == string::npos) {
272 gx_print_error("Record", "could not parse cmd file (internal error)");
273 l.clear();
274 return l;
275 }
276 size_t j = buf.find_last_not_of("0123456789", i-1);
277 int n;
278 string fname;
279 for (n = 1; n < 1000; n++) {
280 fname = make_fname(buf, j, i, n);
281 if (access(fname.c_str(),F_OK) != 0) {
282 break;
283 }
284 }
285 if (n == 1000) {
286 gx_print_error("Record", "more than 999 capture files in directory?!");
287 l.clear();
288 return l;
289 }
290 seq = n;
291 l.push_back(fname); // add filename
292 return l;
293 }
294
295 void JackCapture::stop()
296 {
297 childprocs.kill("jack_capture");
298 }
299
300 void JackCapture::start_stop(GtkWidget *widget, gpointer data)
301 {
302 static int last_seqno;
303 // here, const applies to pointer, not pointed data ;)
304 GtkToggleButton* const cap_button = (GtkToggleButton*)widget;
305 const char *app_name = "jack_capture";
306 if (gtk_toggle_button_get_active(cap_button) == FALSE) {
307 // ---- stop recording
308 GxChild *jack_capture = childprocs.find(app_name);
309 if (jack_capture) {
310 if (jack_capture->kill()) {
311 gx_print_info("Record",
312 string(" Terminated jack_capture, session file #") +
313 gx_i2a(last_seqno));
314 } else {
315 gx_print_error("Record",
316 string(" Sorry, could not stop (Ctrl-C) jack_capture"));
317 }
318 }
319 return;
320 }
321
322 if (gx_jack::client == NULL) {
323 gtk_toggle_button_set_active(cap_button, FALSE);
324 (void)gx_gui::gx_message_popup(
325 " WARNING [Record]\n\n "
326 " Reconnect to Jack server first (Shift+C)"
327 );
328 return;
329 }
330
331 gx_print_info("Record", " Trying to run jack_capture");
332 list<string> capturas = capture_command(last_seqno);
333 if (capturas.empty()) {
334 gtk_toggle_button_set_active(cap_button, FALSE);
335 return; // messages to user already done
336 }
337 GxChild *jack_capture = childprocs.launch(app_name, capturas, SIGINT);
338 if (! jack_capture) {
339 gtk_toggle_button_set_active(cap_button, FALSE);
340 gx_print_error("Record", " WARNING [jack_capture] Sorry, could not start jack_capture");
341 return;
342 }
343 new JackCapture(jack_capture, cap_button);
344 gx_print_info("Record",
345 string("Started jack_capture, session file #") + gx_i2a(last_seqno));
204 JackCapture::JackCapture(GxChild *p, GtkToggleButton *b)
205 : button(b) {
206 gtk_widget_ref(GTK_WIDGET(button));
207 p->terminated.connect(sigc::mem_fun(*this, &JackCapture::terminated));
208 }
209
210 void JackCapture::terminated(bool pgm_found) {
211 gtk_toggle_button_set_active(button, false);
212 if (pgm_found) {
213 gx_system::gx_print_info("Jack Capture", "jack_capture terminated");
214 } else {
215 gx_system::gx_print_warning("Record",
216 " WARNING [jack_capture]\n "
217 " You need jack_capture >= 0.9.30 by Kjetil S. Matheussen \n "
218 " Please look here\n "
219 " http://old.notam02.no/arkiv/src/?M=D\n");
220 }
221 gtk_widget_unref(GTK_WIDGET(button));
222 delete this;
223 }
224
225 // ---- wav file construction for jack_capture
226 string JackCapture::make_fname(string buf, size_t j, size_t i, int n) {
227 ostringstream str;
228 str << buf.substr(0, j+1) << n << buf.substr(i);
229 return str.str();
230 }
231
232 list<string> JackCapture::capture_command(int& seq) {
233 // open jack_capture setup file
234 string gfilename = gx_system::gx_user_dir + gx_system::jcapsetup_file;
235 ifstream f(gfilename.c_str());
236
237 list<string> l;
238 string buf;
239 while (true) {
240 f >> buf;
241 if (!f.good()) {
242 break;
243 }
244 l.push_back(buf);
245 }
246 f.close();
247 if (l.empty()) {
248 (void)gx_gui::gx_message_popup(
249 " ERROR [Record]\n\n "
250 " Please run jack capture settings first [alt+j]"
251 );
252 return l;
253 }
254 buf = *l.rbegin(); // last argument should be filename
255 l.pop_back(); // pop last argument (re-add later after processing)
256 l.push_back("--hide-buffer-usage"); // add additional option
257 size_t i = buf.find_last_of(".");
258 if (i == string::npos) {
259 gx_system::gx_print_error("Record", "could not parse cmd file (internal error)");
260 l.clear();
261 return l;
262 }
263 size_t j = buf.find_last_not_of("0123456789", i-1);
264 int n;
265 string fname;
266 for (n = 1; n < 1000; n++) {
267 fname = make_fname(buf, j, i, n);
268 if (access(fname.c_str(), F_OK) != 0) {
269 break;
270 }
271 }
272 if (n == 1000) {
273 gx_system::gx_print_error("Record", "more than 999 capture files in directory?!");
274 l.clear();
275 return l;
276 }
277 seq = n;
278 l.push_back(fname); // add filename
279 return l;
280 }
281
282 void JackCapture::stop() {
283 childprocs.kill("jack_capture");
284 }
285
286 void JackCapture::start_stop(GtkWidget *widget, gpointer data) {
287 static int last_seqno;
288 // here, const applies to pointer, not pointed data ;)
289 GtkToggleButton* const cap_button = reinterpret_cast<GtkToggleButton*>(widget);
290 const char *app_name = "jack_capture";
291 if (gtk_toggle_button_get_active(cap_button) == FALSE) {
292 // ---- stop recording
293 GxChild *jack_capture = childprocs.find(app_name);
294 if (jack_capture) {
295 if (jack_capture->kill()) {
296 gx_system::gx_print_info("Record",
297 string(" Terminated jack_capture, session file #") +
298 gx_system::gx_i2a(last_seqno));
299 } else {
300 gx_system::gx_print_error("Record",
301 string(" Sorry, could not stop (Ctrl-C) jack_capture"));
302 }
303 }
304 return;
305 }
306
307 if (gx_jack::gxjack.client == NULL) {
308 gtk_toggle_button_set_active(cap_button, FALSE);
309 (void)gx_gui::gx_message_popup(
310 " WARNING [Record]\n\n "
311 " Reconnect to Jack server first (Shift+C)"
312 );
313 return;
314 }
315
316 gx_system::gx_print_info("Record", " Trying to run jack_capture");
317 list<string> capturas = capture_command(last_seqno);
318 if (capturas.empty()) {
319 gtk_toggle_button_set_active(cap_button, FALSE);
320 return; // messages to user already done
321 }
322 GxChild *jack_capture = childprocs.launch(app_name, capturas, SIGINT);
323 if (!jack_capture) {
324 gtk_toggle_button_set_active(cap_button, FALSE);
325 gx_system::gx_print_error("Record",
326 " WARNING [jack_capture] Sorry, could not start jack_capture");
327 return;
328 }
329 new JackCapture(jack_capture, cap_button);
330 gx_system::gx_print_info("Record",
331 string("Started jack_capture, session file #") + gx_system::gx_i2a(last_seqno));
346332 }
347333
348334 //-------------------- meterbridge --------------------------
349335
350 Meterbridge::Meterbridge(GxChild *p, GtkCheckMenuItem *i):
351 item(i)
352 {
353 gtk_widget_ref(GTK_WIDGET(item));
354 p->terminated.connect(sigc::mem_fun(*this, &Meterbridge::terminated));
355 }
356
357 void Meterbridge::terminated(bool pgm_found)
358 {
359 gtk_check_menu_item_set_active(item, false);
360 if (pgm_found) {
361 gx_print_info("Meterbridge", "meterbridge terminated");
362 } else {
363 gx_gui::gx_message_popup(
364 " "
365 " WARNING [meterbridge]\n\n "
366 " meterbridge is not installed! "
367 );
368 }
369 gtk_widget_unref(GTK_WIDGET(item));
370 delete this;
371 }
372
373 void Meterbridge::stop()
374 {
375 childprocs.kill("meterbridge");
376 }
377
378 void Meterbridge::start_stop(GtkCheckMenuItem *menuitem, gpointer)
379 {
380 // no need to do all this if jack is not running
381 if (!gx_jack::client) {
382 (void)gx_gui::gx_message_popup(
383 " WARNING [Meterbridge]\n\n "
384 " Reconnect to Jack server first (Shift+C)"
385 );
386 return;
387 }
388
389 const char *app_name = "meterbridge";
390 if (gtk_check_menu_item_get_active(menuitem)) {
391 if (childprocs.find(app_name)) {
392 return;
393 }
394 string s = gx_jack::client_instance + "_" + app_name;
395 const char * const args[] = {
396 app_name, "-n", s.c_str(), "-t", "sco", "-c", "3",
397 (gx_jack::client_name+":in_0").c_str(),
398 (gx_jack::client_name+":out_0").c_str(),
399 (gx_jack::client_insert_name+":in_0").c_str(),
400 (gx_jack::client_insert_name+":out_0").c_str(),
401 (gx_jack::client_insert_name+":out_1").c_str(),
402 0 };
403 GxChild *meterbridge = childprocs.launch(app_name, args, SIGTERM);
404 if (meterbridge) {
405 new Meterbridge(meterbridge, menuitem);
406 } else {
407 gx_gui::gx_message_popup(
408 " "
409 "WARNING [meterbridge]\n\n "
410 "meterbridge could not be launched!"
411 );
412 gx_print_error("Meterbridge",
413 string("meterbridge could not be launched (fork failed)!"));
414 gtk_check_menu_item_set_active(menuitem, FALSE);
415 }
416 } else { // -- deactivate meterbridge
417 childprocs.kill(app_name);
418 }
419 }
420
336 Meterbridge::Meterbridge(GxChild *p, GtkCheckMenuItem *i)
337 : item(i) {
338 gtk_widget_ref(GTK_WIDGET(item));
339 p->terminated.connect(sigc::mem_fun(*this, &Meterbridge::terminated));
340 }
341
342 void Meterbridge::terminated(bool pgm_found) {
343 gtk_check_menu_item_set_active(item, false);
344 if (pgm_found) {
345 gx_system::gx_print_info("Meterbridge", "meterbridge terminated");
346 } else {
347 gx_gui::gx_message_popup(
348 " "
349 " WARNING [meterbridge]\n\n "
350 " meterbridge is not installed! "
351 );
352 }
353 gtk_widget_unref(GTK_WIDGET(item));
354 delete this;
355 }
356
357 void Meterbridge::stop() {
358 childprocs.kill("meterbridge");
359 }
360
361 void Meterbridge::start_stop(GtkCheckMenuItem *menuitem, gpointer) {
362 // no need to do all this if jack is not running
363 if (!gx_jack::gxjack.client) {
364 (void)gx_gui::gx_message_popup(
365 " WARNING [Meterbridge]\n\n "
366 " Reconnect to Jack server first (Shift+C)"
367 );
368 return;
369 }
370
371 const char *app_name = "meterbridge";
372 if (gtk_check_menu_item_get_active(menuitem)) {
373 if (childprocs.find(app_name)) {
374 return;
375 }
376 string s = gx_jack::client_instance + "_" + app_name;
377 const char * const args[] = {
378 app_name, "-n", s.c_str(), "-t", "sco", "-c", "3",
379 (gx_jack::client_name+":in_0").c_str(),
380 (gx_jack::client_name+":out_0").c_str(),
381 (gx_jack::client_insert_name+":in_0").c_str(),
382 (gx_jack::client_insert_name+":out_0").c_str(),
383 (gx_jack::client_insert_name+":out_1").c_str(),
384 0 };
385 GxChild *meterbridge = childprocs.launch(app_name, args, SIGTERM);
386 if (meterbridge) {
387 new Meterbridge(meterbridge, menuitem);
388 } else {
389 gx_gui::gx_message_popup(
390 " "
391 "WARNING [meterbridge]\n\n "
392 "meterbridge could not be launched!"
393 );
394 gx_system::gx_print_error("Meterbridge",
395 string("meterbridge could not be launched (fork failed)!"));
396 gtk_check_menu_item_set_active(menuitem, FALSE);
397 }
398 } else { // -- deactivate meterbridge
399 childprocs.kill(app_name);
400 }
401 }
421402 } /* end of gx_child_process namespace */
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * --------------------------------------------------------------------------
1718 */
1819
1920 /* ------- This is the guitarix convolver, part of gx_engine_audio ------- */
2021
22 #include "guitarix.h"
23
24 #include <jack/jack.h>
25
26 #include <algorithm>
2127 #include <cstring>
22 #include <jack/jack.h>
23 #include "guitarix.h"
28 #include <string>
2429
2530 /****************************************************************
2631 ** some pieces in this file are copied from jconvolver
3035 ** AudioFile
3136 */
3237
33 namespace gx_engine
34 {
35
36 Audiofile::Audiofile (void)
37 {
38 reset();
39 }
40
41
42 Audiofile::~Audiofile (void)
43 {
44 close();
45 }
46
47
48 void Audiofile::reset (void)
49 {
50 _sndfile = 0;
51 _type = TYPE_OTHER;
52 _form = FORM_OTHER;
53 _rate = 0;
54 _chan = 0;
55 _size = 0;
56 }
57
58
59 int Audiofile::open_read (string name)
60 {
61 SF_INFO I;
62
63 reset ();
64
65 if ((_sndfile = sf_open (name.c_str(), SFM_READ, &I)) == 0) return ERR_OPEN;
66
67 switch (I.format & SF_FORMAT_TYPEMASK)
68 {
69 case SF_FORMAT_CAF:
70 _type = TYPE_CAF;
71 break;
72 case SF_FORMAT_WAV:
73 _type = TYPE_WAV;
74 break;
75 case SF_FORMAT_WAVEX:
76 #ifdef SFC_WAVEX_GET_AMBISONIC
77 if (sf_command (_sndfile, SFC_WAVEX_GET_AMBISONIC, 0, 0) == SF_AMBISONIC_B_FORMAT)
78 _type = TYPE_AMB;
79 else
38 namespace gx_engine {
39
40 Audiofile::Audiofile(void) {
41 reset();
42 }
43
44
45 Audiofile::~Audiofile(void) {
46 close();
47 }
48
49
50 void Audiofile::reset(void) {
51 _sndfile = 0;
52 _type = TYPE_OTHER;
53 _form = FORM_OTHER;
54 _rate = 0;
55 _chan = 0;
56 _size = 0;
57 }
58
59
60 int Audiofile::open_read(string name) {
61 SF_INFO I;
62
63 reset();
64
65 if ((_sndfile = sf_open(name.c_str(), SFM_READ, &I)) == 0) return ERR_OPEN;
66
67 switch (I.format & SF_FORMAT_TYPEMASK) {
68 case SF_FORMAT_CAF:
69 _type = TYPE_CAF;
70 break;
71 case SF_FORMAT_WAV:
72 _type = TYPE_WAV;
73 break;
74 case SF_FORMAT_WAVEX:
75 #ifdef SFC_WAVEX_GET_AMBISONIC
76 if (sf_command(_sndfile, SFC_WAVEX_GET_AMBISONIC, 0, 0) == SF_AMBISONIC_B_FORMAT)
77 _type = TYPE_AMB;
78 else
8079 #endif
81 _type = TYPE_WAV;
82 }
83
84 switch (I.format & SF_FORMAT_SUBMASK)
85 {
86 case SF_FORMAT_PCM_16:
87 _form = FORM_16BIT;
88 break;
89 case SF_FORMAT_PCM_24:
90 _form = FORM_24BIT;
91 break;
92 case SF_FORMAT_PCM_32:
93 _form = FORM_32BIT;
94 break;
95 case SF_FORMAT_FLOAT:
96 _form = FORM_FLOAT;
97 break;
98 }
99
100 _rate = I.samplerate;
101 _chan = I.channels;
102 _size = I.frames;
103
104 return 0;
105 }
106
107
108 int Audiofile::close (void)
109 {
110 if (_sndfile) sf_close (_sndfile);
111 reset ();
112 return 0;
113 }
114
115
116 int Audiofile::seek (uint32_t posit)
117 {
118 if (!_sndfile) return ERR_MODE;
119 if (sf_seek (_sndfile, posit, SEEK_SET) != posit) return ERR_SEEK;
120 return 0;
121 }
122
123
124 int Audiofile::read (float *data, uint32_t frames)
125 {
126 return sf_readf_float (_sndfile, data, frames);
80 _type = TYPE_WAV;
81 }
82
83 switch (I.format & SF_FORMAT_SUBMASK) {
84 case SF_FORMAT_PCM_16:
85 _form = FORM_16BIT;
86 break;
87 case SF_FORMAT_PCM_24:
88 _form = FORM_24BIT;
89 break;
90 case SF_FORMAT_PCM_32:
91 _form = FORM_32BIT;
92 break;
93 case SF_FORMAT_FLOAT:
94 _form = FORM_FLOAT;
95 break;
96 }
97
98 _rate = I.samplerate;
99 _chan = I.channels;
100 _size = I.frames;
101
102 return 0;
103 }
104
105
106 int Audiofile::close(void) {
107 if (_sndfile) sf_close(_sndfile);
108 reset();
109 return 0;
110 }
111
112
113 int Audiofile::seek(uint32_t posit) {
114 if (!_sndfile) return ERR_MODE;
115 if (sf_seek(_sndfile, posit, SEEK_SET) != posit) return ERR_SEEK;
116 return 0;
117 }
118
119
120 int Audiofile::read(float *data, uint32_t frames) {
121 return sf_readf_float(_sndfile, data, frames);
127122 }
128123
129124
132127 */
133128
134129 void GxConvolverBase::adjust_values(
135 unsigned int audio_size, unsigned int& count, unsigned int& offset,
136 unsigned int& delay, unsigned int& ldelay, unsigned int& length,
137 unsigned int& size, unsigned int& bufsize)
138 {
139 if (bufsize < count) {
140 bufsize = count;
141 }
142 if (offset > audio_size) {
143 offset = audio_size;
144 }
145 if (!size) {
146 if (offset + length > audio_size) {
147 gx_system::gx_print_warning(
148 "convolver",
149 (boost::format("length adjusted (%1% + %2% > %3%")
150 % offset % length % audio_size).str());
151 length = audio_size - offset;
152 }
153 if (!length) {
154 length = audio_size - offset;
155 }
156 size = max(delay, ldelay) + offset + length;
157 } else {
158 if (delay > size) {
159 delay = size;
160 }
161 if (ldelay > size) {
162 ldelay = size;
163 }
164 if (offset > size - max(delay, ldelay)) {
165 offset = size - max(delay, ldelay);
166 }
167 if (length > size - max(delay, ldelay) - offset) {
168 length = size - max(delay, ldelay) - offset;
169 gx_system::gx_print_warning("convolver", "data truncated");
170 }
171 if (!length) {
172 length = size - max(delay, ldelay) - offset;
173 }
174 }
175 }
176
177 bool GxConvolverBase::start()
178 {
179 int abspri, policy;
130 unsigned int audio_size, unsigned int& count, unsigned int& offset,
131 unsigned int& delay, unsigned int& ldelay, unsigned int& length,
132 unsigned int& size, unsigned int& bufsize) {
133
134 if (bufsize < count) {
135 bufsize = count;
136 }
137 if (offset > audio_size) {
138 offset = audio_size;
139 }
140 if (!size) {
141 if (offset + length > audio_size) {
142 gx_system::gx_print_warning(
143 "convolver",
144 (boost::format("length adjusted (%1% + %2% > %3%")
145 % offset % length % audio_size).str());
146 length = audio_size - offset;
147 }
148 if (!length) {
149 length = audio_size - offset;
150 }
151 size = max(delay, ldelay) + offset + length;
152 } else {
153 if (delay > size) {
154 delay = size;
155 }
156 if (ldelay > size) {
157 ldelay = size;
158 }
159 if (offset > size - max(delay, ldelay)) {
160 offset = size - max(delay, ldelay);
161 }
162 if (length > size - max(delay, ldelay) - offset) {
163 length = size - max(delay, ldelay) - offset;
164 gx_system::gx_print_warning("convolver", "data truncated");
165 }
166 if (!length) {
167 length = size - max(delay, ldelay) - offset;
168 }
169 }
170 }
171
172 bool GxConvolverBase::start() {
173 int abspri, policy;
180174 struct sched_param spar;
181 pthread_getschedparam(jack_client_thread_id(gx_jack::client), &policy, &spar);
175 pthread_getschedparam(jack_client_thread_id(gx_jack::gxjack.client), &policy, &spar);
182176 abspri = spar.sched_priority;
183 int rc = start_process(abspri, policy);
184 if (rc != 0) {
185 gx_system::gx_print_error("convolver", "can't start convolver");
186 return false;
187 }
188 ready = true;
189 return true;
190 }
191
192 bool GxConvolverBase::checkstate()
193 {
194 if (state() == Convproc::ST_WAIT) {
195 check();
196 return false;
197 } else if (state() == ST_STOP) {
198 ready = false;
199 }
200 return true;
177 int rc = start_process(abspri, policy);
178 if (rc != 0) {
179 gx_system::gx_print_error("convolver", "can't start convolver");
180 return false;
181 }
182 ready = true;
183 return true;
184 }
185
186 bool GxConvolverBase::checkstate() {
187 if (state() == Convproc::ST_WAIT) {
188 check();
189 return false;
190 } else if (state() == ST_STOP) {
191 ready = false;
192 }
193 return true;
201194 }
202195
203196
205198 ** GxConvolver
206199 */
207200
208 inline void compute_interpolation(double& fct, double& gp, unsigned int& idx, const Gainline& points, int offset)
209 {
210 fct = (points[idx+1].g-points[idx].g)/(20*(points[idx+1].i-points[idx].i));
211 gp = points[idx].g/20 + fct * (offset-points[idx].i);
212 idx++;
213 }
214
215 bool GxConvolver::read_sndfile (
216 Audiofile& audio, int nchan, int samplerate, const float *gain,
217 unsigned int *delay, unsigned int offset, unsigned int length,
218 const Gainline& points)
219 {
220 unsigned int nfram;
221 float *buff;
222 float *rbuff = 0;
223 float *bufp;
224 // keep BSIZE big enough so that resamp.flush() doesn't cause overflow
225 // (> 100 should be enough, and should be kept bigger anyhow)
226 const unsigned int BSIZE = 0x4000;
227 gx_resample::StreamingResampler resamp;
228
229 if (offset && audio.seek(offset)) {
230 gx_system::gx_print_error("convolver", "Can't seek to offset");
231 audio.close ();
232 return false;
233 }
234 try {
235 buff = new float[BSIZE * nchan];
236 } catch (...) {
237 audio.close();
238 gx_system::gx_print_error("convolver", "out of memory");
239 return false;
240 }
241 if (samplerate != audio.rate()) {
242 ostringstream buf;
243 buf << "resampling from " << audio.rate() << " to " << samplerate;
244 gx_system::gx_print_info("convolver", buf.str());
245 if (!resamp.setup(audio.rate(), samplerate, nchan)) {
246 assert(false);
247 }
248 try {
249 rbuff = new float[resamp.get_max_out_size(BSIZE)*nchan];
250 } catch (...) {
251 audio.close();
252 gx_system::gx_print_error("convolver", "out of memory");
253 return false;
254 }
255 bufp = rbuff;
256 } else {
257 bufp = buff;
258 }
259 bool done = false;
260 unsigned int idx = 0; // current index in gainline point array
261 double gp = 0.0, fct = 0.0; // calculated parameter of interpolation line
262 if (points.size()) {
263 while ((unsigned int)points[idx].i < offset) {
264 idx++;
265 assert(idx < points.size());
266 }
267 if ((unsigned int)points[idx].i > offset) {
268 idx--;
269 compute_interpolation(fct, gp, idx, points, offset);
270 }
271 }
272 while (!done) {
273 unsigned int cnt;
274 nfram = (length > BSIZE) ? BSIZE : length;
275 if (length) {
276 nfram = audio.read(buff, nfram);
277 if (nfram < 0) {
278 gx_system::gx_print_error("convolver", "Error reading file");
279 audio.close ();
280 delete[] buff;
281 delete[] rbuff;
282 return false;
283 }
284 for (unsigned int ix = 0; ix < nfram; ix++) {
285 if (idx+1 < points.size() && (unsigned int)points[idx].i == offset + ix) {
286 compute_interpolation(fct, gp, idx, points, offset);
287 }
288 for (int ichan = 0; ichan < nchan; ichan++) {
289 buff[ix*nchan+ichan] *= pow(10, gp + ix*fct) * gain[ichan];
290 }
291 }
292 offset += nfram;
293 gp += nfram*fct;
294 cnt = nfram;
295 if (rbuff) {
296 cnt = resamp.process(nfram, buff, rbuff);
297 }
298 } else {
299 if (rbuff) {
300 cnt = resamp.flush(rbuff);
301 done = true;
302 } else {
303 break;
304 }
305 }
306 if (cnt) {
307
308 for (int ichan = 0; ichan < nchan; ichan++) {
309 int rc;
310 if (ichan >= audio.chan()) {
311 rc = impdata_copy(0, 0, ichan, ichan);
312 } else {
313 rc = impdata_create(ichan, ichan, audio.chan(), bufp + ichan,
314 delay[ichan], delay[ichan] + cnt);
315 }
316 if (rc) {
317 audio.close ();
318 delete[] buff;
319 delete[] rbuff;
320 gx_system::gx_print_error("convolver", "out of memory");
321 return false;
322 }
323 delay[ichan] += cnt;
324 }
325 length -= nfram;
326 }
327 }
328
329 audio.close ();
330 delete[] buff;
331 delete[] rbuff;
332 return true;
201 inline void compute_interpolation(double& fct, double& gp, unsigned int& idx,
202 const Gainline& points, int offset) {
203 fct = (points[idx+1].g-points[idx].g)/(20*(points[idx+1].i-points[idx].i));
204 gp = points[idx].g/20 + fct * (offset-points[idx].i);
205 idx++;
206 }
207
208 bool GxConvolver::read_sndfile(
209 Audiofile& audio, int nchan, int samplerate, const float *gain,
210 unsigned int *delay, unsigned int offset, unsigned int length,
211 const Gainline& points) {
212 unsigned int nfram;
213 float *buff;
214 float *rbuff = 0;
215 float *bufp;
216 // keep BSIZE big enough so that resamp.flush() doesn't cause overflow
217 // (> 100 should be enough, and should be kept bigger anyhow)
218 const unsigned int BSIZE = 0x8000; // 0x4000;
219 gx_resample::StreamingResampler resamp;
220
221 if (offset && audio.seek(offset)) {
222 gx_system::gx_print_error("convolver", "Can't seek to offset");
223 audio.close();
224 return false;
225 }
226 try {
227 buff = new float[BSIZE * nchan];
228 } catch(...) {
229 audio.close();
230 gx_system::gx_print_error("convolver", "out of memory");
231 return false;
232 }
233 if (samplerate != audio.rate()) {
234 ostringstream buf;
235 buf << "resampling from " << audio.rate() << " to " << samplerate;
236 gx_system::gx_print_info("convolver", buf.str());
237 if (!resamp.setup(audio.rate(), samplerate, nchan)) {
238 assert(false);
239 }
240 try {
241 rbuff = new float[resamp.get_max_out_size(BSIZE)*nchan];
242 } catch(...) {
243 audio.close();
244 gx_system::gx_print_error("convolver", "out of memory");
245 return false;
246 }
247 bufp = rbuff;
248 } else {
249 bufp = buff;
250 }
251 bool done = false;
252 unsigned int idx = 0; // current index in gainline point array
253 double gp = 0.0, fct = 0.0; // calculated parameter of interpolation line
254 if (points.size()) {
255 while ((unsigned int)points[idx].i < offset) {
256 idx++;
257 assert(idx < points.size());
258 }
259 if ((unsigned int)points[idx].i > offset) {
260 idx--;
261 compute_interpolation(fct, gp, idx, points, offset);
262 }
263 }
264
265 gx_jconv::GxJConvSettings& jcset = *gx_jconv::GxJConvSettings::instance();
266 unsigned int gain_cor = jcset.getGainCor();
267 double gain_t[nchan];
268 if (!gain_cor) {
269 for (int ichan = 0; ichan < nchan; ichan++) {
270 gain_t[ichan] = 1.0;
271 }
272 } else {
273 for (int ichan = 0; ichan < nchan; ichan++) {
274 gain_t[ichan] = gain[ichan];
275 }
276 }
277
278 while (!done) {
279 unsigned int cnt;
280 nfram = (length > BSIZE) ? BSIZE : length;
281 if (length) {
282 nfram = audio.read(buff, nfram);
283 if (nfram < 0) {
284 gx_system::gx_print_error("convolver", "Error reading file");
285 audio.close();
286 delete[] buff;
287 delete[] rbuff;
288 return false;
289 }
290 for (unsigned int ix = 0; ix < nfram; ix++) {
291 if (idx+1 < points.size() && (unsigned int)points[idx].i == offset + ix) {
292 compute_interpolation(fct, gp, idx, points, offset);
293 }
294
295 for (int ichan = 0; ichan < nchan; ichan++) {
296 buff[ix*nchan+ichan] *= pow(10, gp + ix*fct) * gain_t[ichan];
297 }
298 }
299 offset += nfram;
300 gp += nfram*fct;
301 cnt = nfram;
302 if (rbuff) {
303 cnt = resamp.process(nfram, buff, rbuff);
304 }
305 } else {
306 if (rbuff) {
307 cnt = resamp.flush(rbuff);
308 done = true;
309 } else {
310 break;
311 }
312 }
313 if (cnt) {
314
315 for (int ichan = 0; ichan < nchan; ichan++) {
316 int rc;
317 if (ichan >= audio.chan()) {
318 rc = impdata_copy(0, 0, ichan, ichan);
319 } else {
320 rc = impdata_create(ichan, ichan, audio.chan(), bufp + ichan,
321 delay[ichan], delay[ichan] + cnt);
322 }
323 if (rc) {
324 audio.close();
325 delete[] buff;
326 delete[] rbuff;
327 gx_system::gx_print_error("convolver", "out of memory");
328 return false;
329 }
330 delay[ichan] += cnt;
331 }
332 length -= nfram;
333 }
334 }
335
336 audio.close();
337 delete[] buff;
338 delete[] rbuff;
339 return true;
333340 }
334341
335342 bool GxConvolver::configure(
336 unsigned int count, int samplerate, string fname, float gain, float lgain,
337 unsigned int delay, unsigned int ldelay, unsigned int offset,
338 unsigned int length, unsigned int size, unsigned int bufsize,
339 const Gainline& points)
340 {
343 unsigned int count, int samplerate, string fname, float gain, float lgain,
344 unsigned int delay, unsigned int ldelay, unsigned int offset,
345 unsigned int length, unsigned int size, unsigned int bufsize,
346 const Gainline& points) {
341347 Audiofile audio;
342348 cleanup();
343 if (audio.open_read (fname)) {
344 gx_system::gx_print_error("convolver", "Unable to open '" + fname + "'");
345 return false;
346 }
347 if (audio.chan() > 2) {
348 ostringstream buf;
349 buf << "only taking 2 of " << audio.chan() << " channels in impulse response";
350 gx_system::gx_print_error("convolver", buf.str());
351 return false;
352 }
353 adjust_values(audio.size(), count, offset, delay, ldelay, length, size, bufsize);
354 /* FIXME remove
355 cout << "state=" << state() << ", ready=" << ready << endl;
356 cout << "fname=" << fname << ", size=" << audio.size()
357 << ", channels=" << audio.chan() << endl;
358 cout << "convolver: size=" << size << ", count=" << count << ", bufsize="
359 << bufsize << ", offset=" << offset << ", delay=" << delay
360 << ", ldelay=" << ldelay << ", length=" << length << ", gain" << gain
361 << ", lgain" << lgain << endl;
362 */
363 if (Convproc::configure(2, 2, size, count, bufsize, Convproc::MAXPART)) {
364 gx_system::gx_print_error("convolver", "error in Convproc::configure");
365 return false;
366 }
367 float gain_a[2] = {gain, lgain};
368 unsigned int delay_a[2] = {delay, ldelay};
369 return read_sndfile(audio, 2, samplerate, gain_a, delay_a, offset, length, points);
370 }
371
372 bool GxConvolver::compute(int count, float* input1, float *input2, float *output1, float *output2)
373 {
374 if (state() == Convproc::ST_WAIT) {
375 check();
376 }
377 if (state() != Convproc::ST_PROC) {
378 if (input1 != output1) {
379 memcpy(output1, input1, count * sizeof(float));
380 }
381 if (input2 != output2) {
382 memcpy(output2, input2, count * sizeof(float));
383 }
384 if (state() == ST_STOP) {
385 ready = false;
386 return flags() == 0;
387 }
388 return true;
389 }
390 memcpy(inpdata(0), input1, count * sizeof(float));
391 memcpy(inpdata(1), input2, count * sizeof(float));
392
393 process();
394
395 memcpy (output1, outdata(0), count * sizeof(float));
396 memcpy (output2, outdata(1), count * sizeof(float));
397 return true;
349 if (audio.open_read(fname)) {
350 gx_system::gx_print_error("convolver", "Unable to open '" + fname + "'");
351 return false;
352 }
353 if (audio.chan() > 2) {
354 ostringstream buf;
355 buf << "only taking 2 of " << audio.chan() << " channels in impulse response";
356 gx_system::gx_print_error("convolver", buf.str());
357 return false;
358 }
359 adjust_values(audio.size(), count, offset, delay, ldelay, length, size, bufsize);
360 /* FIXME remove
361 cout << "state=" << state() << ", ready=" << ready << endl;
362 cout << "fname=" << fname << ", size=" << audio.size()
363 << ", channels=" << audio.chan() << endl;
364 cout << "convolver: size=" << size << ", count=" << count << ", bufsize="
365 << bufsize << ", offset=" << offset << ", delay=" << delay
366 << ", ldelay=" << ldelay << ", length=" << length << ", gain" << gain
367 << ", lgain" << lgain << endl;
368 */
369 if (Convproc::configure(2, 2, size, count, bufsize, Convproc::MAXPART)) {
370 gx_system::gx_print_error("convolver", "error in Convproc::configure");
371 return false;
372 }
373 float gain_a[2] = {gain, lgain};
374 unsigned int delay_a[2] = {delay, ldelay};
375 return read_sndfile(audio, 2, samplerate, gain_a, delay_a, offset, length, points);
376 }
377
378 bool GxConvolver::compute(int count, float* input1, float *input2, float *output1,
379 float *output2) {
380 if (state() == Convproc::ST_WAIT) {
381 check();
382 }
383 if (state() != Convproc::ST_PROC) {
384 if (input1 != output1) {
385 memcpy(output1, input1, count * sizeof(float));
386 }
387 if (input2 != output2) {
388 memcpy(output2, input2, count * sizeof(float));
389 }
390 if (state() == ST_STOP) {
391 ready = false;
392 return flags() == 0;
393 }
394 return true;
395 }
396 memcpy(inpdata(0), input1, count * sizeof(float));
397 memcpy(inpdata(1), input2, count * sizeof(float));
398
399 process();
400
401 memcpy(output1, outdata(0), count * sizeof(float));
402 memcpy(output2, outdata(1), count * sizeof(float));
403 return true;
398404 }
399405
400406 GxConvolver conv;
404410 ** GxSimpleConvolver
405411 */
406412
407 bool GxSimpleConvolver::configure(int count, float *impresp, unsigned int samplerate)
408 {
409 bool dyn = false;
410 if (samplerate != gx_jack::jack_sr) {
411 gx_resample::BufferResampler r;
412 impresp = r.process(samplerate, count, impresp, gx_jack::jack_sr, count);
413 if (!impresp) {
414 gx_system::gx_print_error("convolver", "failed to resample");
415 return false;
416 }
417 dyn = true;
418 }
419 cleanup();
420 bool ret;
421 if (Convproc::configure(1, 1, count, gx_jack::jack_bs, gx_jack::jack_bs, Convproc::MAXPART)) {
422 gx_system::gx_print_error("convolver", "error in Convproc::configure");
423 ret = false;
413 bool GxSimpleConvolver::configure(int count, float *impresp, unsigned int samplerate) {
414 bool dyn = false;
415 if (samplerate != gx_jack::gxjack.jack_sr) {
416 gx_resample::BufferResampler r;
417 impresp = r.process(samplerate, count, impresp, gx_jack::gxjack.jack_sr, count);
418 if (!impresp) {
419 gx_system::gx_print_error("convolver", "failed to resample");
420 return false;
421 }
422 dyn = true;
423 }
424 cleanup();
425 bool ret;
426 if (Convproc::configure(1, 1, count, gx_jack::gxjack.jack_bs,
427 gx_jack::gxjack.jack_bs, Convproc::MAXPART)) {
428 gx_system::gx_print_error("convolver", "error in Convproc::configure");
429 ret = false;
424430 } else if (impdata_create(0, 0, 1, impresp, 0, count)) {
425 gx_system::gx_print_error("convolver", "out of memory");
426 ret = false;
431 gx_system::gx_print_error("convolver", "out of memory");
432 ret = false;
427433 } else {
428 ret = true;
434 ret = true;
429435 }
430436 if (dyn) {
431 delete impresp;
437 delete impresp;
432438 }
433439 return ret;
434440 }
435441
436 bool GxSimpleConvolver::compute(int count, float* input, float *output)
437 {
438 if (state() == Convproc::ST_WAIT) {
439 check();
440 }
441 if (state() != Convproc::ST_PROC) {
442 if (input != output) {
443 memcpy(output, input, count * sizeof(float));
444 }
445 if (state() == ST_STOP) {
446 ready = false;
447 return flags() == 0;
448 }
449 return true;
450 }
451 memcpy(inpdata(0), input, count * sizeof(float));
452
453 process();
454
455 memcpy (output, outdata(0), count * sizeof(float));
456 return true;
442 bool GxSimpleConvolver::compute(int count, float* input, float *output) {
443 if (state() == Convproc::ST_WAIT) {
444 check();
445 }
446 if (state() != Convproc::ST_PROC) {
447 if (input != output) {
448 memcpy(output, input, count * sizeof(float));
449 }
450 if (state() == ST_STOP) {
451 ready = false;
452 return flags() == 0;
453 }
454 return true;
455 }
456 memcpy(inpdata(0), input, count * sizeof(float));
457
458 process();
459
460 memcpy(output, outdata(0), count * sizeof(float));
461 return true;
457462 }
458463
459464 GxSimpleConvolver cab_conv;
460465 GxSimpleConvolver contrast_conv;
461
462 }
466 }
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * --------------------------------------------------------------------------
1718 *
1819 *
19 * This is the guitarix engine definitions
20 * This is the guitarix engine definitions
2021 *
2122 *
2223 * --------------------------------------------------------------------------
2324 */
2425
25 #include <cstring>
26 #include "guitarix.h"
26 #include "guitarix.h" // NOLINT
2727
28 using namespace gx_system;
29 using namespace gx_resample;
28 #include <cstring> // NOLINT
29 #include <string> // NOLINT
3030
31 namespace gx_engine
32 {
3331
34 void gx_engine_init( const string *optvar )
35 {
36 //----- lock the buffer for the oscilloscope
37 const int frag = (const int)gx_jack::jack_bs;
32 namespace gx_engine {
3833
39 get_frame = new float[frag];
40 get_frame1 = new float[frag];
41 checkfreq = new float[frag];
42 oversample = new float[frag*MAX_UPSAMPLE];
43 result = new float[frag+46];
44 audio.posit00 = 0;
45 audio.gxtube = 1;
34 void gx_engine_init(const string *optvar ) {
35 // ----- lock the buffer for the oscilloscope
36 const int frag = (const int)gx_jack::gxjack.jack_bs;
4637
47 (void)memset(get_frame, 0, frag*sizeof(float));
48 (void)memset(get_frame1, 0, frag*sizeof(float));
49 (void)memset(checkfreq, 0, frag*sizeof(float));
50 (void)memset(oversample, 0, frag*MAX_UPSAMPLE*sizeof(float));
51 (void)memset(result, 0, (frag+46)*sizeof(float));
38 get_frame = new float[frag];
39 get_frame1 = new float[frag];
40 checkfreq = new float[frag];
41 oversample = new float[frag*MAX_UPSAMPLE];
42 result = new float[frag+46];
43 audio.gxtube = 1;
5244
53 midi.init(gx_jack::jack_sr);
54 faust_init(gx_jack::jack_sr);
55 //resampTube.setup(gx_jack::jack_sr, 2);
56 //resampDist.setup(gx_jack::jack_sr, 2);
57 if (!optvar[LOAD_FILE].empty()) {
58 gx_preset::gx_recall_settings_file(&optvar[LOAD_FILE]);
59 } else {
60 gx_preset::gx_recall_settings_file();
61 }
62 for (int i = 0; i < GX_NUM_OF_FACTORY_PRESET; i++)
63 gx_preset::gx_load_factory_file(i);
64 initialized = true;
45 (void)memset(get_frame, 0, frag*sizeof(float));
46 (void)memset(get_frame1, 0, frag*sizeof(float));
47 (void)memset(checkfreq, 0, frag*sizeof(float));
48 (void)memset(oversample, 0, frag*MAX_UPSAMPLE*sizeof(float));
49 (void)memset(result, 0, (frag+46)*sizeof(float));
50
51 midi.init(gx_jack::gxjack.jack_sr);
52 faust_init(gx_jack::gxjack.jack_sr);
53 // resampTube.setup(gx_jack::jack_sr, 2);
54 // resampDist.setup(gx_jack::jack_sr, 2);
55 if (!optvar[LOAD_FILE].empty()) {
56 gx_preset::gx_recall_settings_file(&optvar[LOAD_FILE]);
57 } else {
58 gx_preset::gx_recall_settings_file();
59 }
60 for (int i = 0; i < GX_NUM_OF_FACTORY_PRESET; i++)
61 gx_preset::gx_load_factory_file(i);
62 initialized = true;
6563 }
6664
67 void gx_engine_reset()
68 {
69 if (checkfreq) delete[] checkfreq;
70 if (get_frame) delete[] get_frame;
71 if (get_frame1) delete[] get_frame1;
72 if (oversample) delete[] oversample;
73 if (result) delete[] result;
65 void gx_engine_reset() {
7466
75 initialized = false;
67 if (checkfreq) delete[] checkfreq;
68 if (get_frame) delete[] get_frame;
69 if (get_frame1) delete[] get_frame1;
70 if (oversample) delete[] oversample;
71 if (result) delete[] result;
72 initialized = false;
7673 }
7774
7875 } /* end of gx_engine namespace */
00 /*
1 * Copyright (C) 2009-2010 Hermann Meyer, James Warden, Andreas Degert
1 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * --------------------------------------------------------------------------
1718 *
1819 *
2223 * --------------------------------------------------------------------------
2324 */
2425
25 #include <cstring>
26 #include <fstream>
27 #include <errno.h>
28 #include "guitarix.h"
29 #include <glibmm/i18n.h>
30
31
32 using namespace gx_resample;
26 #include "guitarix.h" // NOLINT
27
28 #include <errno.h> // NOLINT
29 #include <glibmm/i18n.h> // NOLINT
30
31 #include <cstring> // NOLINT
32 #include <string> // NOLINT
33 #include <fstream> // NOLINT
34 #include <iostream> // NOLINT
3335
3436 namespace gx_engine {
35
36 #include "gx_engine_tubetable.cc"
3737
3838 /****************************************************************
3939 ** registering of audio variables
4040 */
4141
42 inline void registerNonMidiParam(const char*a, float*c, bool d, float std=0, float lower=0, float upper=1)
43 {
44 gx_gui::parameter_map.insert(new gx_gui::FloatParameter(a,"",gx_gui::Parameter::None,d,*c,std,lower,upper,0,false));
45 }
46
47 inline void registerNonMidiParam(const char*a, bool*c, bool d, float std=false)
48 {
49 gx_gui::parameter_map.insert(new gx_gui::BoolParameter(a,"",gx_gui::Parameter::None,d,*c,std,0,false));
42 inline void registerNonMidiParam(const char*a, float*c, bool d, float std = 0,
43 float lower = 0, float upper = 1) {
44 gx_gui::parameter_map.insert(new gx_gui::FloatParameter(a, "", gx_gui::Parameter::None,
45 d, *c, std, lower, upper, 0, false));
46 }
47
48 inline void registerNonMidiParam(const char*a, bool*c, bool d, float std = false) {
49 gx_gui::parameter_map.insert(new gx_gui::BoolParameter(a, "", gx_gui::Parameter::None,
50 d, *c, std, 0, false));
5051 }
5152
5253 // should be int
53 inline void registerEnumParam(const char*a,const char*b,const char** vl,float*c,int std=0,bool exp=false)
54 {
55 gx_gui::parameter_map.insert(new gx_gui::FloatEnumParameter(a,b,vl,true,*c,std,true,exp)); //false == no_midi_var
56 }
57
58 inline void registerEnumParam(const char*a,const char*b,const char** vl, int*c,int std=0,bool exp=false)
59 {
60 gx_gui::parameter_map.insert(new gx_gui::EnumParameter(a,b,vl,true,*c,std,true,exp)); //false == no_midi_var
54 inline void registerEnumParam(const char*a, const char*b, const char** vl, float*c,
55 int std = 0, bool exp = false) {
56 gx_gui::parameter_map.insert(new gx_gui::FloatEnumParameter(a, b, vl, true, *c, std,
57 true, exp)); // false == no_midi_var
58 }
59
60 inline void registerEnumParam(const char*a, const char*b, const char** vl, int*c, int std = 0,
61 bool exp = false) {
62 gx_gui::parameter_map.insert(new gx_gui::EnumParameter(a, b, vl, true, *c, std,
63 true, exp)); // false == no_midi_var
64 }
65
66 inline void registerUEnumParam(const char*a, const char*b, const char** vl, unsigned int*c, unsigned int std = 0,
67 bool exp = false) {
68 gx_gui::parameter_map.insert(new gx_gui::UEnumParameter(a, b, vl, true, *c, std,
69 true, exp)); // false == no_midi_var
6170 }
6271
6372 /****************************************************************
6473 ** definitions for code generated with faust / dsp2cc
6574 */
6675
67 #include "gx_faust_includes.cc"
76 #include "./gx_faust_includes.cc"
6877
6978 /****************************************************************
7079 ** register audio variables to paramtable
7180 */
7281
73 void AudioVariables::register_parameter()
74 {
75 static const char *on_off = N_("on/off");
76 gx_gui::registerParam("amp.bass_boost.on_off", on_off, &fboost, 0);
77 gx_gui::registerParam("compressor.on_off", on_off, &fcheckboxcom1, 0);
78 gx_gui::registerParam("jconv.on_off", "Run", &gx_jconv::GxJConvSettings::checkbutton7);
79 gx_gui::registerParam("crybaby.on_off", on_off, &fcheckbox5, 0);
80 gx_gui::registerParam("cab.on_off", "Cabinet", &fcab,0);
81 gx_gui::registerParam("con.on_off", "Contrast-ImpResp", &fcon,0);
82 gx_gui::registerParam("overdrive.on_off", on_off, &foverdrive4, 0);
83 gx_gui::registerParam("gx_distortion.on_off", on_off, &fcheckbox4, 0);
84 gx_gui::registerParam("freeverb.on_off", on_off, &fcheckbox6, 0);
85 gx_gui::registerParam("IR.on_off", on_off, &fcheckbox8, 0);
86 gx_gui::registerParam("echo.on_off", on_off, (float*) &fcheckbox7, 0.);
87 gx_gui::registerParam("delay.on_off", on_off, (float*) &fdelay, 0.);
88 gx_gui::registerParam("chorus.on_off", on_off, (float*) &fchorus, 0.);
89 gx_gui::registerParam("eqs.on_off", on_off, &feq, 0);
90 gx_gui::registerParam("moog.on_off", on_off, &fmoog, 0);
91 gx_gui::registerParam("biquad.on_off", "on_off", &fbiquad, 0);
92 gx_gui::registerParam("flanger.on_off", on_off, &fflanger, 0);
93 //gx_gui::registerParam("SampleLooper.on_off", "on_off", (float*) &fsloop, 0.);
94 gx_gui::registerParam("phaser.on_off", on_off, (float*) &fphaser, 0.);
95 gx_gui::registerParam("shaper.on_off", on_off, &fng, 0);
96 gx_gui::registerParam("low_highpass.on_off", on_off, &flh, 0);
97 gx_gui::registerParam("stereodelay.on_off", on_off,(float*) &fsd, 0);
98 gx_gui::registerParam("stereoecho.on_off", on_off,(float*) &fse, 0);
99 gx_gui::registerParam("midi_out.on_off", on_off, &fmi, 0);
100 gx_gui::registerParam("oscilloscope.on_off", on_off, &fwv, 0);
101 gx_gui::registerParam("ampmodul.on_off", on_off, &famp, 0);
102 gx_gui::registerParam("noise_gate.on_off", "on/off", &fnoise_g, 0);
103 gx_gui::registerParam("amp.on_off", on_off, &fampout, 0);
104 gx_gui::registerParam("amp.clip.on_off", on_off, &ftube, 0);
105 gx_gui::registerParam("tonemodul.on_off", on_off, &ftone, 0);
106 gx_gui::registerParam("tremolo.on_off", on_off, &ftremolo, 0);
107 gx_gui::registerParam("phaser_mono.on_off", on_off, &fpm, 0);
108 gx_gui::registerParam("chorus_mono.on_off", on_off, (float*) &fchorus_mono, 0.);
109 gx_gui::registerParam("flanger_mono.on_off", on_off, &fflanger_mono, 0.);
110 gx_gui::registerParam("feedback.on_off", on_off, &ffeedback, 0.);
111 gx_gui::registerParam("amp.tonestack.on_off", on_off, &ftonestack, 0.);
112
113 gx_gui::registerParam("noise_gate.threshold", "Threshold", &fnglevel, 0.017f, 0.01f, 0.31f, 0.001f);
114
115 static const char *tonestack_model[] = {N_("default"),N_("Bassman"),N_("Twin Reverb"),
116 N_("Princeton"),N_("JCM-800"),N_("JCM-2000"),N_("M-Lead"),N_("M2199"),N_("AC-30"),
117 N_("Mesa Boogie"),N_("SOL 100"),N_("JTM-45"),N_("AC-15"),N_("Peavey"),N_("Ibanez"),
118 N_("Roland"),N_("Ampeg"),0};
119 registerEnumParam("amp.tonestack.select","select",tonestack_model,&tonestack, 0);
120 static const char *cabinet_model[] = {N_("4x12"),N_("2x12"),N_("1x12"),N_("4x10"),
121 N_("2x10"),N_("HighGain"),N_("Twin"),N_("Bassman"),N_("Marshall"),N_("AC-30"),
122 N_("Princeton"),N_("A2"),0};
123 registerEnumParam("cab.select","select",cabinet_model,&cabinet, 0);
124
125 static const char *post_pre[] = {N_("post"),N_("pre"),0};
126 registerEnumParam("compressor.pp","select",post_pre,&compressorpp, 0);
127 registerEnumParam("crybaby.pp","select",post_pre,&crybabypp, 0);
128 registerEnumParam("overdrive.pp","select",post_pre,&overdrivepp, 0);
129 registerEnumParam("gx_distortion.pp","select",post_pre,&distortionpp, 0);
130 registerEnumParam("freeverb.pp","select",post_pre,&freeverbpp, 0);
131 registerEnumParam("IR.pp","select",post_pre,&IRpp, 0);
132 registerEnumParam("echo.pp","select",post_pre,&echopp, 0);
133 registerEnumParam("delay.pp","select",post_pre,&delaypp, 0);
134 registerEnumParam("eqs.pp","select",post_pre,&eqpp, 0);
135 registerEnumParam("low_highpass.pp","select",post_pre,&lhpp, 0);
136 registerEnumParam("oscilloscope.pp","select",post_pre,&wvpp, 0);
137 registerEnumParam("biquad.pp","select",post_pre,&bipp, 0);
138 registerEnumParam("tremolo.pp","select",post_pre,&trpp, 0);
139 registerEnumParam("phaser_mono.pp","select",post_pre,&pmpp, 0);
140 registerEnumParam("chorus_mono.pp","select",post_pre,&chpp, 0);
141 registerEnumParam("flanger_mono.pp","select",post_pre,&flpp, 0);
142 registerEnumParam("feedback.pp","select",post_pre,&ffb, 0);
143 registerEnumParam("amp.tonestack.pp","select",post_pre,&fts, 0);
144 registerEnumParam("cab.pp","select",post_pre,&fcb, 0);
145
146 static const char *crybaby_autowah[] = {N_("manual"),N_("auto"),0};
147 registerEnumParam("crybaby.autowah", "select", crybaby_autowah, &fautowah, 0);
148
149
150
151 //static const char *eqt_onetwo[] = {"fixed","scale",0};
152 //registerEnumParam("eqt.onetwo", "select", eqt_onetwo, &witcheq, 0);
153
154 registerNonMidiParam("compressor.position", &posit5, true, 6, 1, 22);
155 registerNonMidiParam("crybaby.position", &posit0, true, 3, 1, 22);
156 registerNonMidiParam("overdrive.position", &posit1, true, 7, 1, 22);
157 registerNonMidiParam("gx_distortion.position", &posit2, true, 4, 1, 22);
158 registerNonMidiParam("freeverb.position", &posit3, true, 10, 1, 22);
159 registerNonMidiParam("IR.position", &posit4, true, 5, 1, 22);
160 registerNonMidiParam("echo.position", &posit6, true, 8, 1, 22);
161 registerNonMidiParam("delay.position", &posit7, true, 9, 1, 22);
162 registerNonMidiParam("eqs.position", &posit10, true, 2, 1, 22);
163 registerNonMidiParam("chorus.position", &posit8, true, 1, 1, 10);
164 registerNonMidiParam("flanger.position", &posit9, true, 2, 1, 10);
165 registerNonMidiParam("moog.position", &posit11, true, 6, 1, 10);
166 registerNonMidiParam("phaser.position", &posit12, true, 3, 1, 10);
167 registerNonMidiParam("low_highpass.position", &posit14, true, 1, 1, 22);
168 registerNonMidiParam("stereodelay.position", &posit15, true, 4, 1, 10);
169 registerNonMidiParam("stereoecho.position", &posit16, true, 5, 1, 10);
170 registerNonMidiParam("oscilloscope.position", &posit17, true, 11, 1, 22);
171 registerNonMidiParam("biquad.position", &posit18, true, 12, 1, 22);
172 registerNonMidiParam("midi_out.position", &posit00, true, 20, 1, 22);
173 registerNonMidiParam("ampmodul.position", &posit19, true, 7, 1, 10);
174 registerNonMidiParam("tonemodul.position", &posit20, true, 8, 1, 10);
175 registerNonMidiParam("tremolo.position", &posit21, true, 13, 1, 22);
176 registerNonMidiParam("phaser_mono.position", &posit22, true, 14, 1, 22);
177 registerNonMidiParam("chorus_mono.position", &posit23, true, 15, 1, 22);
178 registerNonMidiParam("flanger_mono.position", &posit24, true, 16, 1, 22);
179 registerNonMidiParam("feedback.position", &posit25, true, 17, 1, 22);
180 registerNonMidiParam("amp.tonestack.position", &posit26, true, 18, 1, 22);
181 registerNonMidiParam("cab.position", &posit27, true, 19, 1, 22);
182
183
184 registerNonMidiParam("system.waveview", &viv, false);
185 registerNonMidiParam("midi_out.midistat", &midistat, false);
186 registerNonMidiParam("midi_out.midistat1", &midistat1, false);
187 registerNonMidiParam("midi_out.midistat2", &midistat2, false);
188 registerNonMidiParam("midi_out.midistat3", &midistat3, false);
189
190 // user interface options
191 registerNonMidiParam("ui.latency_nowarn", &fwarn, false, 0);
192 registerNonMidiParam("ui.skin", &fskin, false, 0, 0, 100);
193
82 void AudioVariables::register_parameter() {
83 static const char *on_off = N_("on/off");
84 gx_gui::registerParam("amp.bass_boost.on_off", on_off, &fboost, 0);
85 gx_gui::registerParam("compressor.on_off", on_off, &fcheckboxcom1, 0);
86 gx_gui::registerParam("jconv.on_off", "Run", &gx_jconv::GxJConvSettings::checkbutton7);
87 gx_gui::registerParam("crybaby.on_off", on_off, &fcheckbox5, 0);
88 gx_gui::registerParam("cab.on_off", "Cabinet", &fcab, 0);
89 gx_gui::registerParam("con.on_off", "Contrast-ImpResp", &fcon, 0);
90 gx_gui::registerParam("overdrive.on_off", on_off, &foverdrive4, 0);
91 gx_gui::registerParam("gx_distortion.on_off", on_off, &fcheckbox4, 0);
92 gx_gui::registerParam("freeverb.on_off", on_off, &fcheckbox6, 0);
93 gx_gui::registerParam("IR.on_off", on_off, &fcheckbox8, 0);
94 gx_gui::registerParam("echo.on_off", on_off, (float*) &fcheckbox7, 0.);
95 gx_gui::registerParam("delay.on_off", on_off, (float*) &fdelay, 0.);
96 gx_gui::registerParam("chorus.on_off", on_off, (float*) &fchorus, 0.);
97 gx_gui::registerParam("eqs.on_off", on_off, &feq, 0);
98 gx_gui::registerParam("moog.on_off", on_off, &fmoog, 0);
99 gx_gui::registerParam("biquad.on_off", "on_off", &fbiquad, 0);
100 gx_gui::registerParam("flanger.on_off", on_off, &fflanger, 0);
101 // gx_gui::registerParam("SampleLooper.on_off", "on_off", (float*) &fsloop, 0.);
102 gx_gui::registerParam("phaser.on_off", on_off, (float*) &fphaser, 0.);
103 gx_gui::registerParam("shaper.on_off", on_off, &fng, 0);
104 gx_gui::registerParam("low_highpass.on_off", on_off, &flh, 0);
105 gx_gui::registerParam("stereodelay.on_off", on_off, (float*) &fsd, 0);
106 gx_gui::registerParam("stereoecho.on_off", on_off, (float*) &fse, 0);
107 gx_gui::registerParam("midi_out.on_off", on_off, &fmi, 0);
108 gx_gui::registerParam("oscilloscope.on_off", on_off, &fwv, 0);
109 gx_gui::registerParam("ampmodul.on_off", on_off, &famp, 0);
110 gx_gui::registerParam("noise_gate.on_off", "on/off", &fnoise_g, 0);
111 gx_gui::registerParam("amp.on_off", on_off, &fampout, 0);
112 gx_gui::registerParam("amp.clip.on_off", on_off, &ftube, 0);
113 gx_gui::registerParam("tonemodul.on_off", on_off, &ftone, 0);
114 gx_gui::registerParam("tremolo.on_off", on_off, &ftremolo, 0);
115 gx_gui::registerParam("phaser_mono.on_off", on_off, &fpm, 0);
116 gx_gui::registerParam("chorus_mono.on_off", on_off, (float*) &fchorus_mono, 0.);
117 gx_gui::registerParam("flanger_mono.on_off", on_off, &fflanger_mono, 0.);
118 gx_gui::registerParam("feedback.on_off", on_off, &ffeedback, 0.);
119 gx_gui::registerParam("amp.tonestack.on_off", on_off, &ftonestack, 0.);
120
121 gx_gui::registerParam("noise_gate.threshold", "Threshold", &fnglevel,
122 0.017f, 0.01f, 0.31f, 0.001f);
123
124 static const char *tonestack_model[] = {N_("default"), N_("Bassman"), N_("Twin Reverb"),
125 N_("Princeton"), N_("JCM-800"), N_("JCM-2000"), N_("M-Lead"), N_("M2199"), N_("AC-30"),
126 N_("Mesa Boogie"), N_("SOL 100"), N_("JTM-45"), N_("AC-15"), N_("Peavey"), N_("Ibanez"),
127 N_("Roland"), N_("Ampeg"), 0};
128 registerEnumParam("amp.tonestack.select", "select", tonestack_model, &tonestack, 0);
129 static const char *cabinet_model[] = {N_("4x12"), N_("2x12"), N_("1x12"), N_("4x10"),
130 N_("2x10"), N_("HighGain"), N_("Twin"), N_("Bassman"), N_("Marshall"), N_("AC-30"),
131 N_("Princeton"), N_("A2"), 0};
132 registerEnumParam("cab.select", "select", cabinet_model, &cabinet, 0);
133
134 static const char *post_pre[] = {N_("post"), N_("pre"), 0};
135 registerUEnumParam("compressor.pp", "select", post_pre, &effect_pre_post[0], 0);
136 registerUEnumParam("crybaby.pp", "select", post_pre, &effect_pre_post[1], 0);
137 registerUEnumParam("overdrive.pp", "select", post_pre, &effect_pre_post[2], 0);
138 registerUEnumParam("gx_distortion.pp", "select", post_pre, &effect_pre_post[3], 0);
139 registerUEnumParam("freeverb.pp", "select", post_pre, &effect_pre_post[4], 0);
140 registerUEnumParam("IR.pp", "select", post_pre, &effect_pre_post[5], 0);
141 registerUEnumParam("echo.pp", "select", post_pre, &effect_pre_post[6], 0);
142 registerUEnumParam("delay.pp", "select", post_pre, &effect_pre_post[7], 0);
143 registerUEnumParam("eqs.pp", "select", post_pre, &effect_pre_post[8], 0);
144 registerUEnumParam("low_highpass.pp", "select", post_pre, &effect_pre_post[9], 0);
145 registerUEnumParam("oscilloscope.pp", "select", post_pre, &effect_pre_post[10], 0);
146 registerUEnumParam("biquad.pp", "select", post_pre, &effect_pre_post[11], 0);
147 registerUEnumParam("tremolo.pp", "select", post_pre, &effect_pre_post[12], 0);
148 registerUEnumParam("phaser_mono.pp", "select", post_pre, &effect_pre_post[13], 0);
149 registerUEnumParam("chorus_mono.pp", "select", post_pre, &effect_pre_post[14], 0);
150 registerUEnumParam("flanger_mono.pp", "select", post_pre, &effect_pre_post[15], 0);
151 registerUEnumParam("feedback.pp", "select", post_pre, &effect_pre_post[16], 0);
152 registerUEnumParam("amp.tonestack.pp", "select", post_pre, &effect_pre_post[17], 0);
153 registerUEnumParam("cab.pp", "select", post_pre, &effect_pre_post[18], 0);
154
155 static const char *crybaby_autowah[] = {N_("manual"), N_("auto"), 0};
156 registerEnumParam("crybaby.autowah", "select", crybaby_autowah, &fautowah, 0);
157
158 // static const char *eqt_onetwo[] = {"fixed","scale",0};
159 // registerEnumParam("eqt.onetwo", "select", eqt_onetwo, &witcheq, 0);
160
161 registerNonMidiParam("compressor.position", &posit[5], true, 6, 1, 22);
162 registerNonMidiParam("crybaby.position", &posit[0], true, 3, 1, 22);
163 registerNonMidiParam("overdrive.position", &posit[1], true, 7, 1, 22);
164 registerNonMidiParam("gx_distortion.position", &posit[2], true, 4, 1, 22);
165 registerNonMidiParam("freeverb.position", &posit[3], true, 10, 1, 22);
166 registerNonMidiParam("IR.position", &posit[4], true, 5, 1, 22);
167 registerNonMidiParam("echo.position", &posit[6], true, 8, 1, 22);
168 registerNonMidiParam("delay.position", &posit[7], true, 9, 1, 22);
169 registerNonMidiParam("eqs.position", &posit[10], true, 2, 1, 22);
170 registerNonMidiParam("chorus.position", &posit[8], true, 1, 1, 10);
171 registerNonMidiParam("flanger.position", &posit[9], true, 2, 1, 10);
172 registerNonMidiParam("moog.position", &posit[11], true, 6, 1, 10);
173 registerNonMidiParam("phaser.position", &posit[12], true, 3, 1, 10);
174 registerNonMidiParam("low_highpass.position", &posit[14], true, 1, 1, 22);
175 registerNonMidiParam("stereodelay.position", &posit[15], true, 4, 1, 10);
176 registerNonMidiParam("stereoecho.position", &posit[16], true, 5, 1, 10);
177 registerNonMidiParam("oscilloscope.position", &posit[17], true, 11, 1, 22);
178 registerNonMidiParam("biquad.position", &posit[18], true, 12, 1, 22);
179 // registerNonMidiParam("midi_out.position", &posit[28], true, 20, 1, 22);
180 registerNonMidiParam("ampmodul.position", &posit[19], true, 7, 1, 10);
181 registerNonMidiParam("tonemodul.position", &posit[20], true, 8, 1, 10);
182 registerNonMidiParam("tremolo.position", &posit[21], true, 13, 1, 22);
183 registerNonMidiParam("phaser_mono.position", &posit[22], true, 14, 1, 22);
184 registerNonMidiParam("chorus_mono.position", &posit[23], true, 15, 1, 22);
185 registerNonMidiParam("flanger_mono.position", &posit[24], true, 16, 1, 22);
186 registerNonMidiParam("feedback.position", &posit[25], true, 17, 1, 22);
187 registerNonMidiParam("amp.tonestack.position", &posit[26], true, 18, 1, 22);
188 registerNonMidiParam("cab.position", &posit[27], true, 19, 1, 22);
189
190
191 registerNonMidiParam("system.waveview", &viv, false);
192 registerNonMidiParam("midi_out.midistat", &midistat, false);
193 registerNonMidiParam("midi_out.midistat1", &midistat1, false);
194 registerNonMidiParam("midi_out.midistat2", &midistat2, false);
195 registerNonMidiParam("midi_out.midistat3", &midistat3, false);
196
197 // user interface options
198 registerNonMidiParam("ui.latency_nowarn", &fwarn, false, 0);
199 registerNonMidiParam("ui.skin", &fskin, false, 0, 0, 100);
194200 }
195201
196202 AudioVariables audio;
197203
198 inline float noise_gate(int sf, float* input, float ngate)
199 {
200 float sumnoise = 0;
201 for (int i = 0; i < sf; i++) {
202 sumnoise += sqrf(fabs(input[i]));
203 }
204 float noisepulse = sqrtf(sumnoise/sf);
205 if (noisepulse > audio.fnglevel * 0.01) {
206 return 1; // -75db 0.001 = 65db
207 } else if (ngate > 0.01) {
208 return ngate * 0.996;
209 } else {
210 return ngate;
211 }
204 inline float noise_gate(int sf, float* input, float ngate) {
205 float sumnoise = 0;
206 for (int i = 0; i < sf; i++) {
207 sumnoise += sqrf(fabs(input[i]));
208 }
209 float noisepulse = sqrtf(sumnoise/sf);
210 if (noisepulse > audio.fnglevel * 0.01) {
211 return 1; // -75db 0.001 = 65db
212 } else if (ngate > 0.01) {
213 return ngate * 0.996;
214 } else {
215 return ngate;
216 }
212217 }
213218
214219 inline void run_tonestack(int count, float *output0) {
215 switch (audio.tonestack) {
216 case 0: //"default"
217 gx_tonestacks::tonestack_default::compute(count, output0, output0);
218 break;
219 case 1: //"Bassman"
220 gx_tonestacks::tonestack_bassman::compute(count, output0, output0);
221 break;
222 case 2: //"Twin Reverb"
223 gx_tonestacks::tonestack_twin::compute(count, output0, output0);
224 break;
225 case 3: //"Princeton"
226 gx_tonestacks::tonestack_princeton::compute(count, output0, output0);
227 break;
228 case 4: //"JCM-800"
229 gx_tonestacks::tonestack_jcm800::compute(count, output0, output0);
230 break;
231 case 5: //"JCM-2000"
232 gx_tonestacks::tonestack_jcm2000::compute(count, output0, output0);
233 break;
234 case 6: //"M-Lead"
235 gx_tonestacks::tonestack_mlead::compute(count, output0, output0);
236 break;
237 case 7: //"M2199"
238 gx_tonestacks::tonestack_m2199::compute(count, output0, output0);
239 break;
240 case 8: //"AC-30"
241 gx_tonestacks::tonestack_ac30::compute(count, output0, output0);
242 break;
243 case 9: //"Mesa"
244 gx_tonestacks::tonestack_mesa::compute(count, output0, output0);
245 break;
246 case 10: //"Soldano"
247 gx_tonestacks::tonestack_soldano::compute(count, output0, output0);
248 break;
249 case 11: //"jtm45"
250 gx_tonestacks::tonestack_jtm45::compute(count, output0, output0);
251 break;
252 case 12: //"ac15"
253 gx_tonestacks::tonestack_ac15::compute(count, output0, output0);
254 break;
255 case 13: //"peavey"
256 gx_tonestacks::tonestack_peavey::compute(count, output0, output0);
257 break;
258 case 14: //"ibanez"
259 gx_tonestacks::tonestack_ibanez::compute(count, output0, output0);
260 break;
261 case 15: //"roland"
262 gx_tonestacks::tonestack_roland::compute(count, output0, output0);
263 break;
264 case 16: //"ampeg"
265 gx_tonestacks::tonestack_ampeg::compute(count, output0, output0);
266 break;
267 case 17: //"Off"
268 break;
269 }
270 }
271
272 inline void compensate_cab(int count, float *input0, float *output0)
273 {
274 double fSlow0 = (0.0010000000000000009 * pow(10,(0.05 * (-audio.cab_level*2.0))));
275 static double fRec0[2] = {0,0};
276 for (int i=0; i<count; i++) {
277 fRec0[0] = (fSlow0 + (0.999 * fRec0[1]));
278 output0[i] = (FAUSTFLOAT)((double)input0[i] * fRec0[0]);
279 // post processing
280 fRec0[1] = fRec0[0];
281 }
282 }
283
284 void cab_conv_restart()
285 {
286 cab_conv.stop();
287
288 gx_gui::cab_conv_restart();
220 switch (audio.tonestack) {
221 case 0: // "default"
222 gx_tonestacks::tonestack_default::compute(count, output0, output0);
223 break;
224 case 1: // "Bassman"
225 gx_tonestacks::tonestack_bassman::compute(count, output0, output0);
226 break;
227 case 2: // "Twin Reverb"
228 gx_tonestacks::tonestack_twin::compute(count, output0, output0);
229 break;
230 case 3: // "Princeton"
231 gx_tonestacks::tonestack_princeton::compute(count, output0, output0);
232 break;
233 case 4: // "JCM-800"
234 gx_tonestacks::tonestack_jcm800::compute(count, output0, output0);
235 break;
236 case 5: // "JCM-2000"
237 gx_tonestacks::tonestack_jcm2000::compute(count, output0, output0);
238 break;
239 case 6: // "M-Lead"
240 gx_tonestacks::tonestack_mlead::compute(count, output0, output0);
241 break;
242 case 7: // "M2199"
243 gx_tonestacks::tonestack_m2199::compute(count, output0, output0);
244 break;
245 case 8: // "AC-30"
246 gx_tonestacks::tonestack_ac30::compute(count, output0, output0);
247 break;
248 case 9: // "Mesa"
249 gx_tonestacks::tonestack_mesa::compute(count, output0, output0);
250 break;
251 case 10: // "Soldano"
252 gx_tonestacks::tonestack_soldano::compute(count, output0, output0);
253 break;
254 case 11: // "jtm45"
255 gx_tonestacks::tonestack_jtm45::compute(count, output0, output0);
256 break;
257 case 12: // "ac15"
258 gx_tonestacks::tonestack_ac15::compute(count, output0, output0);
259 break;
260 case 13: // "peavey"
261 gx_tonestacks::tonestack_peavey::compute(count, output0, output0);
262 break;
263 case 14: // "ibanez"
264 gx_tonestacks::tonestack_ibanez::compute(count, output0, output0);
265 break;
266 case 15: // "roland"
267 gx_tonestacks::tonestack_roland::compute(count, output0, output0);
268 break;
269 case 16: // "ampeg"
270 gx_tonestacks::tonestack_ampeg::compute(count, output0, output0);
271 break;
272 case 17: // "Off"
273 break;
274 }
275 }
276
277 inline void compensate_cab(int count, float *input0, float *output0) {
278 double fSlow0 = (0.0010000000000000009 * pow(10, (0.05 * (-audio.cab_level*2.0))));
279 static double fRec0[2] = {0, 0};
280 for (int i = 0; i < count; i++) {
281 fRec0[0] = (fSlow0 + (0.999 * fRec0[1]));
282 output0[i] = (FAUSTFLOAT)(static_cast<double>(input0[i]) * fRec0[0]);
283 // post processing
284 fRec0[1] = fRec0[0];
285 }
286 }
287
288 void cab_conv_restart() {
289 cab_conv.stop();
290 gx_gui::cab_conv_restart();
289291 }
290292
291293 /****************************************************************
292294 ** this is the process callback called from jack
293295 **
294296 ***************************************************************/
295 void compute_insert (int count, float* input1, float* output0, float* output1)
296 {
297 void compute_insert(int count, float* input1, float* output0, float* output1) {
297298 // retrieve engine state
298 const GxEngineState estate = checky;
299
300 //------------ determine processing type
301 unsigned short process_type = ZEROIZE_BUFFERS;
302
303 if (gx_jack::NO_CONNECTION == 0) { // ports connected
304 switch (estate) {
305 case kEngineOn:
306 process_type = PROCESS_BUFFERS;
307 break;
308
309 case kEngineBypass:
310 process_type = JUSTCOPY_BUFFERS;
311 break;
312
313 default: // engine off or whatever: zeroize
314 break;
315 }
316 }
317
318 //------------ main processing routine
319 switch (process_type) {
320
321 case PROCESS_BUFFERS:
322 process_insert_buffers(count, input1, output0,output1);
323 break;
324
325 // --------- just copy input to outputs
326 case JUSTCOPY_BUFFERS:
327 if (conv.is_runnable()) {
328 conv.checkstate();
329 }
330 gx_effects::balance1::compute(count, input1, output0,output1);
299 const GxEngineState estate = checky;
300
301 // ------------ determine processing type
302 uint16_t process_type = ZEROIZE_BUFFERS;
303
304 if (gx_jack::NO_CONNECTION == 0) { // ports connected
305 switch (estate) {
306 case kEngineOn:
307 process_type = PROCESS_BUFFERS;
308 break;
309
310 case kEngineBypass:
311 process_type = JUSTCOPY_BUFFERS;
312 break;
313
314 default: // engine off or whatever: zeroize
315 break;
316 }
317 }
318
319 // ------------ main processing routine
320 switch (process_type) {
321
322 case PROCESS_BUFFERS:
323 process_insert_buffers(count, input1, output0, output1);
324 break;
325
326 // --------- just copy input to outputs
327 case JUSTCOPY_BUFFERS:
328 if (conv.is_runnable()) {
329 conv.checkstate();
330 }
331 gx_effects::balance1::compute(count, input1, output0, output1);
331332 (void)memcpy(get_frame, output0, sizeof(float)*count);
332333 (void)memcpy(get_frame1, output1, sizeof(float)*count);
333 break;
334
335 // ------- zeroize buffers
336 case ZEROIZE_BUFFERS:
337 default:
338
339 if (conv.is_runnable()) {
340 conv.checkstate();
341 }
342
343 // no need of loop.
344
345 (void)memset(output0, 0, count*sizeof(float));
346 (void)memset(output1, 0, count*sizeof(float));
347 break;
348 }
349 }
350
351 void compute (int count, float* input, float* output0)
352 {
353 // retrieve engine state
354 const GxEngineState estate = checky;
355
356 //------------ determine processing type
357 unsigned short process_type = ZEROIZE_BUFFERS;
358
359 if (gx_jack::NO_CONNECTION == 0) { // ports connected
360 switch (estate) {
361 case kEngineOn:
362 process_type = PROCESS_BUFFERS;
363 break;
364
365 case kEngineBypass:
366 process_type = JUSTCOPY_BUFFERS;
367 break;
368
369 default: // engine off or whatever: zeroize
370 break;
371 }
372 }
373 if(audio.fmi && !isMidiOn()) turnOnMidi();
374 else if(!audio.fmi && isMidiOn()) turnOffMidi();
375
376 if(audio.fwv != audio.fwv_on) {
377 (void)memset(result, 0, count*sizeof(float));
378 audio.fwv_on = audio.fwv;
379 }
380
381 //------------ main processing routine
382 switch (process_type) {
383
384 case PROCESS_BUFFERS:
385
386 process_buffers(count, input, output0);
387 break;
388
389 // --------- just copy input to outputs
390 case JUSTCOPY_BUFFERS:
391 if (conv.is_runnable()) {
392 conv.checkstate();
393 }
394 // balance1::compute(count, input, output0);
395 (void)memcpy( output0, input, sizeof(float)*count);
396 break;
397
398
399 // ------- zeroize buffers
400 case ZEROIZE_BUFFERS:
401 default:
402
403 if (conv.is_runnable()) {
404 conv.checkstate();
405 }
406 if(audio.fwv)(void)memset(result, 0, count*sizeof(float));
407 // no need of loop.
408
409 (void)memset(output0, 0, count*sizeof(float));
410 break;
411 }
334 break;
335
336 // ------- zeroize buffers
337 case ZEROIZE_BUFFERS:
338 default:
339
340 if (conv.is_runnable()) {
341 conv.checkstate();
342 }
343
344 // no need of loop.
345
346 (void)memset(output0, 0, count*sizeof(float));
347 (void)memset(output1, 0, count*sizeof(float));
348 break;
349 }
350 }
351
352 void compute(int count, float* input, float* output0) {
353 // retrieve engine state
354 const GxEngineState estate = checky;
355
356 // ------------ determine processing type
357 uint16_t process_type = ZEROIZE_BUFFERS;
358
359 if (gx_jack::NO_CONNECTION == 0) { // ports connected
360 switch (estate) {
361 case kEngineOn:
362 process_type = PROCESS_BUFFERS;
363 break;
364
365 case kEngineBypass:
366 process_type = JUSTCOPY_BUFFERS;
367 break;
368
369 default: // engine off or whatever: zeroize
370 break;
371 }
372 }
373 if (audio.fmi && !isMidiOn()) turnOnMidi();
374 else if (!audio.fmi && isMidiOn()) turnOffMidi();
375
376 if (audio.fwv != audio.fwv_on) {
377 (void)memset(result, 0, count*sizeof(float));
378 audio.fwv_on = audio.fwv;
379 }
380
381 // ------------ main processing routine
382 switch (process_type) {
383
384 case PROCESS_BUFFERS:
385
386 process_buffers(count, input, output0);
387 break;
388
389 // --------- just copy input to outputs
390 case JUSTCOPY_BUFFERS:
391 if (conv.is_runnable()) {
392 conv.checkstate();
393 }
394 // balance1::compute(count, input, output0);
395 (void)memcpy(output0, input, sizeof(float)*count);
396 break;
397
398
399 // ------- zeroize buffers
400 case ZEROIZE_BUFFERS:
401 default:
402
403 if (conv.is_runnable()) {
404 conv.checkstate();
405 }
406 if (audio.fwv) (void)memset(result, 0, count*sizeof(float));
407 // no need of loop.
408
409 (void)memset(output0, 0, count*sizeof(float));
410 break;
411 }
412412 }
413413
414414 /****************************************************************
416416 */
417417
418418
419 void process_buffers(int count, float* input, float* output0)
420 {
421 int tuner_on = gx_gui::shownote + (int)isMidiOn() + 1;
422 if (tuner_on > 0) {
423 if (gx_gui::shownote == 0) {
424 gx_gui::shownote = -1;
425 } else {
426 pitch_tracker.add(count, input);
427 //moving_filter(input, checkfreq, count);
428 (void)memcpy(checkfreq, input, sizeof(float)*count);
429 }
430 }
431
432 memcpy(output0, input, count*sizeof(float));
433
434 if (audio.fnoise_g) {
435 gx_effects::noisegate::ngate = noise_gate(count,output0, gx_effects::noisegate::ngate);
419 void process_buffers(int count, float* input, float* output0) {
420
421 int tuner_on = gx_gui::shownote + static_cast<int>(isMidiOn()) + 1;
422 if (tuner_on > 0) {
423 if (gx_gui::shownote == 0) {
424 gx_gui::shownote = -1;
425 } else {
426 pitch_tracker.add(count, input);
427 // moving_filter(input, checkfreq, count);
428 (void)memcpy(checkfreq, input, sizeof(float)*count);
429 }
430 }
431
432 memcpy(output0, input, count*sizeof(float));
433
434 if (audio.fnoise_g) {
435 gx_effects::noisegate::ngate = noise_gate(count, output0, gx_effects::noisegate::ngate);
436436 } else {
437 gx_effects::noisegate::ngate = 1;
438 }
439
440 if (audio.fng) {
441 gx_effects::noise_shaper::compute(count, output0, output0);
442 }
443
444 for (int m = 1; m < audio.mono_plug_counter; m++) {
445 if (audio.posit0 == m && audio.fcheckbox5 && !audio.fautowah && audio.crybabypp) {
446 gx_effects::crybaby::compute(count, output0, output0);
447 } else if (audio.posit0 == m && audio.fcheckbox5 && audio.fautowah && audio.crybabypp) {
448 gx_effects::autowah::compute(count, output0, output0);
449 } else if (audio.posit5 == m && audio.fcheckboxcom1 && audio.compressorpp) {
450 gx_effects::compressor::compute(count, output0, output0);
451 } else if (audio.posit1 == m && audio.foverdrive4 && audio.overdrivepp) {
452 gx_effects::overdrive::compute(count, output0, output0);
453 } else if (audio.posit2 == m && audio.fcheckbox4 && audio.distortionpp) {
454 gx_effects::gx_distortion::compute(count, output0, output0);
455 } else if (audio.posit3 == m && audio.fcheckbox6 && audio.freeverbpp) {
456 gx_effects::freeverb::compute(count, output0, output0);
457 } else if (audio.posit6 == m && audio.fcheckbox7 && gx_effects::echo::is_inited() && audio.echopp) {
458 gx_effects::echo::compute(count, output0, output0);
459 } else if (audio.posit4 == m && audio.fcheckbox8 && audio.IRpp) {
460 gx_effects::impulseresponse::compute(count, output0, output0);
461 } else if (audio.posit7 == m && audio.fdelay && gx_effects::delay::is_inited() && audio.delaypp) {
462 gx_effects::delay::compute(count, output0, output0);
463 } else if (audio.posit10 == m && audio.feq && audio.eqpp) {
464 gx_effects::selecteq::compute(count, output0, output0);
465 } else if (audio.posit14 == m && audio.flh && audio.lhpp) {
466 gx_effects::low_high_pass::compute(count, output0, output0);
467 } else if (audio.posit17 == m && audio.fwv && audio.wvpp) {
468 (void)memcpy(result, output0, sizeof(float)*count);
469 } else if (audio.posit18 == m && audio.fbiquad && audio.bipp) {
470 gx_effects::biquad::compute(count, output0, output0);
471 } else if (audio.posit21 == m && audio.ftremolo && audio.trpp) {
472 gx_effects::tremolo::compute(count, output0, output0);
473 } else if (audio.posit22 == m && audio.fpm && audio.pmpp) {
474 gx_effects::phaser_mono::compute(count, output0, output0);
475 } else if (audio.posit23 == m && audio.fchorus_mono && audio.chpp && gx_effects::chorus_mono::is_inited()) {
476 gx_effects::chorus_mono::compute(count, output0, output0);
477 } else if (audio.posit24 == m && audio.fflanger_mono && audio.flpp) {
478 gx_effects::flanger_mono::compute(count, output0, output0);
479 } else if (audio.posit25 == m && audio.ffeedback && audio.ffb) {
480 gx_effects::gx_feedback::compute(count, output0, output0);
481 } else if (audio.posit26 == m && audio.ftonestack && audio.fts ) {
482 run_tonestack(count, output0);
483 } else if (audio.posit27 == m && audio.fcab && audio.fcb) {
484 compensate_cab(count,output0 , output0);
485 if (!cab_conv.compute(count, output0))
486 cout << "overload" << endl;
487 //FIXME error message??
488 }
489 }
490
491 switch (audio.gxtube) {
492 case 0: //"never"
493 gx_amps::gxamp::compute(count, output0, output0);
494 break;
495 case 1: //"default"
496 gx_amps::gxamp::compute(count, output0, output0);
497 break;
498 case 2:
499 gx_amps::gxamp3::compute(count, output0, output0);
500 break;
501 case 3:
502 gx_amps::gxamp2::compute(count, output0, output0);
503 break;
504 case 4:
505 gx_amps::gxamp4::compute(count, output0, output0);
506 break;
507 case 5:
508 gx_amps::gxamp5::compute(count, output0, output0);
509 break;
510 case 6:
511 gx_amps::gxamp10::compute(count, output0, output0);
512 break;
513 case 7:
514 gx_amps::gxamp12::compute(count, output0, output0);
515 break;
516 }
517
518 if (audio.ftube) {
437 gx_effects::noisegate::ngate = 1;
438 }
439
440 if (audio.fng) {
441 gx_effects::noise_shaper::compute(count, output0, output0);
442 }
443
444 for (int m = 1; m < audio.mono_plug_counter; m++) {
445 if (audio.posit[0] == m && audio.fcheckbox5 && !audio.fautowah
446 && audio.effect_pre_post[1]) {
447 gx_effects::crybaby::compute(count, output0, output0);
448 } else if (audio.posit[0] == m && audio.fcheckbox5 && audio.fautowah
449 && audio.effect_pre_post[1]) {
450 gx_effects::autowah::compute(count, output0, output0);
451 } else if (audio.posit[5] == m && audio.fcheckboxcom1 && audio.effect_pre_post[0]) {
452 gx_effects::compressor::compute(count, output0, output0);
453 } else if (audio.posit[1] == m && audio.foverdrive4 && audio.effect_pre_post[2]) {
454 gx_effects::overdrive::compute(count, output0, output0);
455 } else if (audio.posit[2] == m && audio.fcheckbox4 && audio.effect_pre_post[3]) {
456 gx_effects::gx_distortion::compute(count, output0, output0);
457 } else if (audio.posit[3] == m && audio.fcheckbox6 && audio.effect_pre_post[4]) {
458 gx_effects::freeverb::compute(count, output0, output0);
459 } else if (audio.posit[6] == m && audio.fcheckbox7 && gx_effects::echo::is_inited()
460 && audio.effect_pre_post[6]) {
461 gx_effects::echo::compute(count, output0, output0);
462 } else if (audio.posit[4] == m && audio.fcheckbox8 && audio.effect_pre_post[5]) {
463 gx_effects::impulseresponse::compute(count, output0, output0);
464 } else if (audio.posit[7] == m && audio.fdelay && gx_effects::delay::is_inited()
465 && audio.effect_pre_post[7]) {
466 gx_effects::delay::compute(count, output0, output0);
467 } else if (audio.posit[10] == m && audio.feq && audio.effect_pre_post[8]) {
468 gx_effects::selecteq::compute(count, output0, output0);
469 } else if (audio.posit[14] == m && audio.flh && audio.effect_pre_post[9]) {
470 gx_effects::low_high_pass::compute(count, output0, output0);
471 } else if (audio.posit[17] == m && audio.fwv && audio.effect_pre_post[10]) {
472 (void)memcpy(result, output0, sizeof(float)*count);
473 } else if (audio.posit[18] == m && audio.fbiquad && audio.effect_pre_post[11]) {
474 gx_effects::biquad::compute(count, output0, output0);
475 } else if (audio.posit[21] == m && audio.ftremolo && audio.effect_pre_post[12]) {
476 gx_effects::tremolo::compute(count, output0, output0);
477 } else if (audio.posit[22] == m && audio.fpm && audio.effect_pre_post[13]) {
478 gx_effects::phaser_mono::compute(count, output0, output0);
479 } else if (audio.posit[23] == m && audio.fchorus_mono && audio.effect_pre_post[14]
480 && gx_effects::chorus_mono::is_inited()) {
481 gx_effects::chorus_mono::compute(count, output0, output0);
482 } else if (audio.posit[24] == m && audio.fflanger_mono && audio.effect_pre_post[15]) {
483 gx_effects::flanger_mono::compute(count, output0, output0);
484 } else if (audio.posit[25] == m && audio.ffeedback && audio.effect_pre_post[16]) {
485 gx_effects::gx_feedback::compute(count, output0, output0);
486 } else if (audio.posit[26] == m && audio.ftonestack && audio.effect_pre_post[17]) {
487 run_tonestack(count, output0);
488 } else if (audio.posit[27] == m && audio.fcab && audio.effect_pre_post[18]) {
489 compensate_cab(count, output0, output0);
490 if (!cab_conv.compute(count, output0))
491 std::cout << "overload" << endl;
492 // FIXME error message??
493 }
494 }
495
496 switch (audio.gxtube) {
497 case 0: // "never"
498 gx_amps::gxamp::compute(count, output0, output0);
499 break;
500 case 1: // "default"
501 gx_amps::gxamp::compute(count, output0, output0);
502 break;
503 case 2:
504 gx_amps::gxamp3::compute(count, output0, output0);
505 break;
506 case 3:
507 gx_amps::gxamp2::compute(count, output0, output0);
508 break;
509 case 4:
510 gx_amps::gxamp4::compute(count, output0, output0);
511 break;
512 case 5:
513 gx_amps::gxamp5::compute(count, output0, output0);
514 break;
515 case 6:
516 gx_amps::gxamp10::compute(count, output0, output0);
517 break;
518 case 7:
519 gx_amps::gxamp12::compute(count, output0, output0);
520 break;
521 case 8:
522 gx_amps::gxamp6::compute(count, output0, output0);
523 break;
524 case 9:
525 gx_amps::gxamp7::compute(count, output0, output0);
526 break;
527 case 10:
528 gx_amps::gxamp8::compute(count, output0, output0);
529 break;
530 case 11:
531 gx_amps::gxamp9::compute(count, output0, output0);
532 break;
533 case 12:
534 gx_amps::gxamp11::compute(count, output0, output0);
535 break;
536 case 13:
537 gx_amps::gxamp13::compute(count, output0, output0);
538 break;
539 default:
540 gx_amps::gxamp::compute(count, output0, output0);
541 break;
542 }
543
544 if (audio.ftube) {
519545 gx_effects::softclip::compute(count, output0, output0);
520546 }
521
547
522548 for (int m = 1; m < audio.mono_plug_counter; m++) {
523 if (audio.posit0 == m && audio.fcheckbox5 && !audio.fautowah && !audio.crybabypp) {
524 gx_effects::crybaby::compute(count, output0, output0);
525 } else if (audio.posit0 == m && audio.fcheckbox5 && audio.fautowah && !audio.crybabypp) {
526 gx_effects::autowah::compute(count, output0, output0);
527 } else if (audio.posit5 == m && audio.fcheckboxcom1 && !audio.compressorpp) {
528 gx_effects::compressor::compute(count, output0, output0);
529 } else if (audio.posit1 == m && audio.foverdrive4 && !audio.overdrivepp) {
530 gx_effects::overdrive::compute(count, output0, output0);
531 } else if (audio.posit2 == m && audio.fcheckbox4 && !audio.distortionpp) {
532 gx_effects::gx_distortion::compute(count, output0, output0);
533 } else if (audio.posit3 == m && audio.fcheckbox6 && !audio.freeverbpp) {
534 gx_effects::freeverb::compute(count, output0, output0);
535 } else if (audio.posit6 == m && audio.fcheckbox7 && gx_effects::echo::is_inited() && !audio.echopp) {
536 gx_effects::echo::compute(count, output0, output0);
537 } else if (audio.posit4 == m && audio.fcheckbox8 && !audio.IRpp) {
538 gx_effects::impulseresponse::compute(count, output0, output0);
539 } else if (audio.posit7 == m && audio.fdelay && gx_effects::delay::is_inited() && !audio.delaypp) {
540 gx_effects::delay::compute(count, output0, output0);
541 } else if (audio.posit10 == m && audio.feq && !audio.eqpp) {
542 gx_effects::selecteq::compute(count, output0, output0);
543 } else if (audio.posit14 == m && audio.flh && !audio.lhpp) {
544 gx_effects::low_high_pass::compute(count, output0, output0);
545 } else if (audio.posit17 == m && audio.fwv && !audio.wvpp) {
546 (void)memcpy(result, output0, sizeof(float)*count);
547 } else if (audio.posit18 == m && audio.fbiquad && !audio.bipp) {
548 gx_effects::biquad::compute(count, output0, output0);
549 } else if (audio.posit21 == m && audio.ftremolo && !audio.trpp) {
550 gx_effects::tremolo::compute(count, output0, output0);
551 } else if (audio.posit22 == m && audio.fpm && !audio.pmpp) {
552 gx_effects::phaser_mono::compute(count, output0, output0);
553 } else if (audio.posit23 == m && audio.fchorus_mono && !audio.chpp && gx_effects::chorus_mono::is_inited()) {
554 gx_effects::chorus_mono::compute(count, output0, output0);
555 } else if (audio.posit24 == m && audio.fflanger_mono && !audio.flpp ) {
556 gx_effects::flanger_mono::compute(count, output0, output0);
557 } else if (audio.posit25 == m && audio.ffeedback && !audio.ffb ) {
558 gx_effects::gx_feedback::compute(count, output0, output0);
559 } else if (audio.posit26 == m && audio.ftonestack && !audio.fts ) {
560 run_tonestack(count, output0);
561 } else if (audio.posit27 == m && audio.fcab && !audio.fcb) {
562 compensate_cab(count,output0 , output0);
563 if (!cab_conv.compute(count, output0))
564 cout << "overload" << endl;
565 //FIXME error message??
566 }
567 }
568
549 if (audio.posit[0] == m && audio.fcheckbox5 && !audio.fautowah
550 && !audio.effect_pre_post[1]) {
551 gx_effects::crybaby::compute(count, output0, output0);
552 } else if (audio.posit[0] == m && audio.fcheckbox5 && audio.fautowah
553 && !audio.effect_pre_post[1]) {
554 gx_effects::autowah::compute(count, output0, output0);
555 } else if (audio.posit[5] == m && audio.fcheckboxcom1 && !audio.effect_pre_post[0]) {
556 gx_effects::compressor::compute(count, output0, output0);
557 } else if (audio.posit[1] == m && audio.foverdrive4 && !audio.effect_pre_post[2]) {
558 gx_effects::overdrive::compute(count, output0, output0);
559 } else if (audio.posit[2] == m && audio.fcheckbox4 && !audio.effect_pre_post[3]) {
560 gx_effects::gx_distortion::compute(count, output0, output0);
561 } else if (audio.posit[3] == m && audio.fcheckbox6 && !audio.effect_pre_post[4]) {
562 gx_effects::freeverb::compute(count, output0, output0);
563 } else if (audio.posit[6] == m && audio.fcheckbox7 && gx_effects::echo::is_inited()
564 && !audio.effect_pre_post[6]) {
565 gx_effects::echo::compute(count, output0, output0);
566 } else if (audio.posit[4] == m && audio.fcheckbox8 && !audio.effect_pre_post[5]) {
567 gx_effects::impulseresponse::compute(count, output0, output0);
568 } else if (audio.posit[7] == m && audio.fdelay && gx_effects::delay::is_inited()
569 && !audio.effect_pre_post[7]) {
570 gx_effects::delay::compute(count, output0, output0);
571 } else if (audio.posit[10] == m && audio.feq && !audio.effect_pre_post[8]) {
572 gx_effects::selecteq::compute(count, output0, output0);
573 } else if (audio.posit[14] == m && audio.flh && !audio.effect_pre_post[9]) {
574 gx_effects::low_high_pass::compute(count, output0, output0);
575 } else if (audio.posit[17] == m && audio.fwv && !audio.effect_pre_post[10]) {
576 (void)memcpy(result, output0, sizeof(float)*count);
577 } else if (audio.posit[18] == m && audio.fbiquad && !audio.effect_pre_post[11]) {
578 gx_effects::biquad::compute(count, output0, output0);
579 } else if (audio.posit[21] == m && audio.ftremolo && !audio.effect_pre_post[12]) {
580 gx_effects::tremolo::compute(count, output0, output0);
581 } else if (audio.posit[22] == m && audio.fpm && !audio.effect_pre_post[13]) {
582 gx_effects::phaser_mono::compute(count, output0, output0);
583 } else if (audio.posit[23] == m && audio.fchorus_mono && !audio.effect_pre_post[14]
584 && gx_effects::chorus_mono::is_inited()) {
585 gx_effects::chorus_mono::compute(count, output0, output0);
586 } else if (audio.posit[24] == m && audio.fflanger_mono && !audio.effect_pre_post[15]) {
587 gx_effects::flanger_mono::compute(count, output0, output0);
588 } else if (audio.posit[25] == m && audio.ffeedback && !audio.effect_pre_post[16]) {
589 gx_effects::gx_feedback::compute(count, output0, output0);
590 } else if (audio.posit[26] == m && audio.ftonestack && !audio.effect_pre_post[17]) {
591 run_tonestack(count, output0);
592 } else if (audio.posit[27] == m && audio.fcab && !audio.effect_pre_post[18]) {
593 compensate_cab(count, output0 , output0);
594 if (!cab_conv.compute(count, output0))
595 std::cout << "overload" << endl;
596 // FIXME error message??
597 }
598 }
599
569600 if (audio.fboost) {
570 gx_effects::bassbooster::compute(count, output0, output0);
571 }
601 gx_effects::bassbooster::compute(count, output0, output0);
602 }
572603
573604 if (audio.fampout) {
574605 gx_effects::gx_ampout::compute(count, output0, output0);
575606 }
576
607
577608 if (audio.fnoise_g) {
578 gx_effects::noisegate::compute(count,output0, output0);
579 }
580
581 if(audio.fcon) {
582 if (!contrast_conv.compute(count, output0))
583 cout << "overload contrast" << endl;
584 //FIXME error message??
585 }
586 }
587
588 void process_insert_buffers (int count, float* input1, float* output0, float* output1)
589 {
590
609 gx_effects::noisegate::compute(count, output0, output0);
610 }
611
612 if (audio.fcon) {
613 if (!contrast_conv.compute(count, output0))
614 std::cout << "overload contrast" << endl;
615 // FIXME error message??
616 }
617 }
618
619 void process_insert_buffers(int count, float* input1, float* output0, float* output1) {
620
591621 memcpy(output0, input1, count*sizeof(float));
592622 gx_effects::gxfeed::compute(count, output0, output0, output1);
593
623
594624 for (int m = 1; m < audio.stereo_plug_counter; m++) {
595 if (audio.posit8 == m && audio.fchorus && gx_effects::chorus::is_inited()) {
596 gx_effects::chorus::compute(count, output0, output1, output0, output1);
597 } else if (audio.posit9 == m && audio.fflanger) {
598 gx_effects::flanger::compute(count, output0, output1, output0, output1);
599 } else if (audio.posit11 == m && audio.fmoog) {
600 gx_effects::moog::compute(count, output0, output1, output0, output1);
601 } else if (audio.posit12 == m && audio.fphaser) {
602 gx_effects::phaser::compute(count, output0, output1, output0, output1);
603 } else if (audio.posit15 == m && audio.fsd && gx_effects::stereodelay::is_inited()) {
604 gx_effects::stereodelay::compute(count, output0, output1, output0, output1);
605 }else if (audio.posit16 == m && audio.fse && gx_effects::stereoecho::is_inited()) {
606 gx_effects::stereoecho::compute(count, output0, output1, output0, output1);
607 }else if (audio.posit19 == m && audio.famp ) {
608 gx_amps::gx_ampmodul::compute(count, output0, output1, output0, output1);
609 }else if (audio.posit20 == m && audio.ftone ) {
610 gx_effects::tonecontroll::compute(count, output0, output1, output0, output1);
611 }
612 }
625 if (audio.posit[8] == m && audio.fchorus && gx_effects::chorus::is_inited()) {
626 gx_effects::chorus::compute(count, output0, output1, output0, output1);
627 } else if (audio.posit[9] == m && audio.fflanger) {
628 gx_effects::flanger::compute(count, output0, output1, output0, output1);
629 } else if (audio.posit[11] == m && audio.fmoog) {
630 gx_effects::moog::compute(count, output0, output1, output0, output1);
631 } else if (audio.posit[12] == m && audio.fphaser) {
632 gx_effects::phaser::compute(count, output0, output1, output0, output1);
633 } else if (audio.posit[15] == m && audio.fsd && gx_effects::stereodelay::is_inited()) {
634 gx_effects::stereodelay::compute(count, output0, output1, output0, output1);
635 } else if (audio.posit[16] == m && audio.fse && gx_effects::stereoecho::is_inited()) {
636 gx_effects::stereoecho::compute(count, output0, output1, output0, output1);
637 } else if (audio.posit[19] == m && audio.famp) {
638 gx_amps::gx_ampmodul::compute(count, output0, output1, output0, output1);
639 } else if (audio.posit[20] == m && audio.ftone) {
640 gx_effects::tonecontroll::compute(count, output0, output1, output0, output1);
641 }
642 }
613643
614644 if (conv.is_runnable()) {
615 // reuse oversampling buffer
616 float *conv_out0 = oversample;
617 float *conv_out1 = oversample+count;
618 if (!conv.compute(count, output0, output1, conv_out0, conv_out1)) {
619 gx_jconv::GxJConvSettings::checkbutton7 = 0;
620 cout << "overload" << endl;
621 //FIXME error message??
622 } else {
623 gx_effects::jconv_post::compute(count, output0, output1, conv_out0, conv_out1, output0, output1);
624 }
645 // reuse oversampling buffer
646 float *conv_out0 = oversample;
647 float *conv_out1 = oversample+count;
648 if (!conv.compute(count, output0, output1, conv_out0, conv_out1)) {
649 gx_jconv::GxJConvSettings::checkbutton7 = 0;
650 std::cout << "overload" << endl;
651 // FIXME error message??
652 } else {
653 gx_effects::jconv_post::compute(count, output0, output1, conv_out0, conv_out1,
654 output0, output1);
655 }
625656 }
626657 gx_effects::gx_outputlevel::compute(count, output0, output1, output0, output1);
627 (void)memcpy(get_frame, output0, sizeof(float)*count);
628 (void)memcpy(get_frame1, output1, sizeof(float)*count);
658 (void)memcpy(get_frame, output0, sizeof(float)*count);
659 (void)memcpy(get_frame1, output1, sizeof(float)*count);
629660 }
630661
631662 } // namespace gx_engine
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * --------------------------------------------------------------------------
1718 *
1819 *
2223 * --------------------------------------------------------------------------
2324 */
2425
25 #include "guitarix.h"
26
27 namespace gx_engine
28 {
29
30 void MidiVariables::register_parameter()
31 {
32 gx_gui::registerParam("midi_out.channel_1.velocity", "velocity", &fslider26, 64.f, 0.f, 127.f, 1.f);
33 gx_gui::registerParam("midi_out.channel_1.volume", "volume", &fslider46, 64.f, 0.f, 127.f, 1.f);
34 gx_gui::registerParam("midi_out.channel_1.autogain", "autogain", &fautogain);
35 gx_gui::registerParam("midi_out.channel_1.channel", "channel 1", &fslider30, 0.f, 0.f, 16.f, 1.f);
36 gx_gui::registerParam("midi_out.channel_1.program", "program", &fslider31, 0.f, 0.f, 248.f, 1.f);
37 gx_gui::registerParam("midi_out.channel_1.oktave", "oktave", &fslider29, 0.f, -2.f, 2.f, 1.f);
38 gx_gui::registerParam("midi_out.channel_1.sensity", "sensity", &fslider27, 20.f, 1.f, 500.f, 1.f);
39 gx_gui::registerParam("midi_out.channel_1.auto_pitch", "auto pitch", &fpitch);
40
41 gx_gui::registerParam("midi_out.channel_2.on_off", "on/off", &fcheckbox10, 0);
42 gx_gui::registerParam("midi_out.channel_2.velocity", "velocity", &fslider32, 64.f, 0.f, 127.f, 1.f);
43 gx_gui::registerParam("midi_out.channel_2.volume", "volume", &fslider47, 64.f, 0.f, 127.f, 1.f);
44 gx_gui::registerParam("midi_out.channel_2.autogain", "autogain", &fautogain1);
45 gx_gui::registerParam("midi_out.channel_2.channel", "channel 2", &fslider35, 0.f, 0.f, 16.f, 1.f);
46 gx_gui::registerParam("midi_out.channel_2.program", "program", &fslider36, 0.f, 0.f, 248.f, 1.f);
47 gx_gui::registerParam("midi_out.channel_2.oktave", "oktave", &fslider34, 0.f, -2.f, 2.f, 1.f);
48 gx_gui::registerParam("midi_out.channel_2.sensity", "sensity", &fslider33, 20.f, 1.f, 500.f, 1.f);
49 gx_gui::registerParam("midi_out.channel_2.auto_pitch", "auto pitch", &fpitch1);
50
51 gx_gui::registerParam("midi_out.channel_3.on_off", "on/off", &fcheckbox11, 0);
52 gx_gui::registerParam("midi_out.channel_3.velocity", "velocity", &fslider40, 64.f, 0.f, 127.f, 1.f);
53 gx_gui::registerParam("midi_out.channel_3.volume", "volume", &fslider48, 64.f, 0.f, 127.f, 1.f);
54 gx_gui::registerParam("midi_out.channel_3.autogain", "autogain", &fautogain2);
55 gx_gui::registerParam("midi_out.channel_3.channel", "channel 3", &fslider44, 0.f, 0.f, 16.f, 1.f);
56 gx_gui::registerParam("midi_out.channel_3.program", "program", &fslider43, 0.f, 0.f, 248.f, 1.f);
57 gx_gui::registerParam("midi_out.channel_3.oktave", "oktave", &fslider42, 0.f, -2.f, 2.f, 1.f);
58 gx_gui::registerParam("midi_out.channel_3.sensity", "sensity", &fslider41, 20.f, 1.f, 500.f, 1.f);
59 gx_gui::registerParam("midi_out.channel_3.auto_pitch", "auto pitch", &fpitch2);
60
61 gx_gui::registerParam("beat_detector.stepper", "stepper", &fslider39, 1.f, 1.f, 32.f, 1.f);
62 gx_gui::registerParam("beat_detector.note_off", "note off", &fslider37, 2.f, 1.f, 127.f, 1.f);
63 gx_gui::registerParam("beat_detector.atack_gain", "atack gain", &fslider45, 5.f, 1.f, 127.f, 1.f);
64 gx_gui::registerParam("beat_detector.beat_gain", "beat gain", &fslider38, 1.f, 0.0f, 127.f, 1.f);
65 gx_gui::registerParam("beat_detector.midi_gain", "midi gain", &midi_gain, 0.f, -40.f, 60.f, 1.f);
26 #include "guitarix.h" // NOLINT
27
28 namespace gx_engine {
29
30 void MidiVariables::register_parameter() {
31 gx_gui::registerParam("midi_out.channel_1.velocity", "velocity", &fslider26,
32 64.f, 0.f, 127.f, 1.f);
33 gx_gui::registerParam("midi_out.channel_1.volume", "volume", &fslider46,
34 64.f, 0.f, 127.f, 1.f);
35 gx_gui::registerParam("midi_out.channel_1.autogain", "autogain", &fautogain);
36 gx_gui::registerParam("midi_out.channel_1.channel", "channel 1", &fslider30,
37 0.f, 0.f, 16.f, 1.f);
38 gx_gui::registerParam("midi_out.channel_1.program", "program", &fslider31,
39 0.f, 0.f, 248.f, 1.f);
40 gx_gui::registerParam("midi_out.channel_1.oktave", "oktave", &fslider29,
41 0.f, -2.f, 2.f, 1.f);
42 gx_gui::registerParam("midi_out.channel_1.sensity", "sensity", &fslider27,
43 20.f, 1.f, 500.f, 1.f);
44 gx_gui::registerParam("midi_out.channel_1.auto_pitch", "auto pitch", &fpitch);
45
46 gx_gui::registerParam("midi_out.channel_2.on_off", "on/off", &fcheckbox10, 0);
47 gx_gui::registerParam("midi_out.channel_2.velocity", "velocity", &fslider32,
48 64.f, 0.f, 127.f, 1.f);
49 gx_gui::registerParam("midi_out.channel_2.volume", "volume", &fslider47,
50 64.f, 0.f, 127.f, 1.f);
51 gx_gui::registerParam("midi_out.channel_2.autogain", "autogain", &fautogain1);
52 gx_gui::registerParam("midi_out.channel_2.channel", "channel 2", &fslider35,
53 0.f, 0.f, 16.f, 1.f);
54 gx_gui::registerParam("midi_out.channel_2.program", "program", &fslider36,
55 0.f, 0.f, 248.f, 1.f);
56 gx_gui::registerParam("midi_out.channel_2.oktave", "oktave", &fslider34,
57 0.f, -2.f, 2.f, 1.f);
58 gx_gui::registerParam("midi_out.channel_2.sensity", "sensity", &fslider33,
59 20.f, 1.f, 500.f, 1.f);
60 gx_gui::registerParam("midi_out.channel_2.auto_pitch", "auto pitch", &fpitch1);
61
62 gx_gui::registerParam("midi_out.channel_3.on_off", "on/off", &fcheckbox11, 0);
63 gx_gui::registerParam("midi_out.channel_3.velocity", "velocity", &fslider40,
64 64.f, 0.f, 127.f, 1.f);
65 gx_gui::registerParam("midi_out.channel_3.volume", "volume", &fslider48,
66 64.f, 0.f, 127.f, 1.f);
67 gx_gui::registerParam("midi_out.channel_3.autogain", "autogain", &fautogain2);
68 gx_gui::registerParam("midi_out.channel_3.channel", "channel 3", &fslider44,
69 0.f, 0.f, 16.f, 1.f);
70 gx_gui::registerParam("midi_out.channel_3.program", "program", &fslider43,
71 0.f, 0.f, 248.f, 1.f);
72 gx_gui::registerParam("midi_out.channel_3.oktave", "oktave", &fslider42,
73 0.f, -2.f, 2.f, 1.f);
74 gx_gui::registerParam("midi_out.channel_3.sensity", "sensity", &fslider41,
75 20.f, 1.f, 500.f, 1.f);
76 gx_gui::registerParam("midi_out.channel_3.auto_pitch", "auto pitch", &fpitch2);
77
78 gx_gui::registerParam("beat_detector.stepper", "stepper", &fslider39,
79 1.f, 1.f, 32.f, 1.f);
80 gx_gui::registerParam("beat_detector.note_off", "note off", &fslider37,
81 2.f, 1.f, 127.f, 1.f);
82 gx_gui::registerParam("beat_detector.atack_gain", "atack gain", &fslider45,
83 5.f, 1.f, 127.f, 1.f);
84 gx_gui::registerParam("beat_detector.beat_gain", "beat gain", &fslider38,
85 1.f, 0.0f, 127.f, 1.f);
86 gx_gui::registerParam("beat_detector.midi_gain", "midi gain", &midi_gain,
87 0.f, -40.f, 60.f, 1.f);
6688 }
6789
6890 MidiVariables midi;
6991
70 /*
71 float fslider45;
72 float fslider38;
73 float fslider31;
74 float fslider27;
75 float fslider29;
76 float fslider30;
77 float fslider26;
78 float fslider33;
79 float fslider34;
80 float fslider35;
81 float fslider36;
82 float fslider42;
83 float fslider43;
84 float fslider40;
85 float fslider41;
86 float fslider44;
87 float fslider37;
88 float fslider39;
89 float fslider46;
90 float fslider47;
91 float fslider48;
92 float fConsta4;
93 float fConstlog;
94 float fConstlog2;
95 float beat0;
96 float midi_gain;
97 float fConstun0;
98 int weg;
99 int program;
100 unsigned char* midi_send;
101 int send;
102 float fautogain;
103 int volume;
104 float fpitch;
105 int noten;
106 float fslider32;
107 float cache_note;
108 int fcheckbox10;
109 int program1;
110 int send1;
111 int noten1;
112 float fautogain1;
113 int volume1;
114 unsigned char* midi_send1;
115 int send2;
116 int noten2;
117 float fpitch1;
118 float fpitch2;
119 int fcheckbox11;
120 int program2;
121 int volume2;
122 int Beat_is;
123 unsigned char* midi_send2;
124 float fautogain2;
125 */
126
127 void MidiVariables::init(int samplingFreq)
128 {
129 fConstlog = log(1.055)*0.5;;
130 fConstlog2 = 6/log(2)*-1;
131 midi_gain = 1.0;
132 fConstun0 = (0.001*300*samplingFreq)*36;
133 BeatFilterk =1.0/(gx_jack::jack_sr*(1.0f/(2.0f*M_PI*1250.0f)));
134 BeatFilter1 =0.0;
92
93 void MidiVariables::init(int samplingFreq) {
94 fConstlog = log(1.055) * 0.5;
95 fConstlog2 = 6/log(2) * -1;
96 midi_gain = 1.0;
97 fConstun0 = (0.001 * 300 * samplingFreq) * 36;
98 BeatFilterk =1.0/(gx_jack::gxjack.jack_sr * (1.0f/(2.0f * M_PI * 1250.0f)));
99 BeatFilter1 =0.0;
135100 BeatFilter2 =0.0;
136101 }
137102
138 //----- jack process callback for the midi input
139 void compute_midi_in(void* midi_input_port_buf)
140 {
141 jack_midi_event_t in_event;
142 jack_nframes_t event_count = jack_midi_get_event_count(midi_input_port_buf);
143 unsigned int i;
144 for (i=0; i<event_count; i++) {
145 jack_midi_event_get(&in_event, midi_input_port_buf, i);
146 if ((in_event.buffer[0] & 0xf0) == 0xc0) { // program change on any midi channel
147 g_atomic_int_set(&gx_gui::program_change, in_event.buffer[1]);
148 sem_post(&gx_gui::program_change_sem);
149 }
150 else if ((in_event.buffer[0] & 0xf0) == 0xb0) { // controller
151 gx_gui::controller_map.set(in_event.buffer[1], in_event.buffer[2]);
152 }
153 }
103 // ----- jack process callback for the midi input
104 void compute_midi_in(void* midi_input_port_buf) {
105 jack_midi_event_t in_event;
106 jack_nframes_t event_count = jack_midi_get_event_count(midi_input_port_buf);
107 unsigned int i;
108 for (i = 0; i < event_count; i++) {
109 jack_midi_event_get(&in_event, midi_input_port_buf, i);
110 if ((in_event.buffer[0] & 0xf0) == 0xc0) { // program change on any midi channel
111 g_atomic_int_set(&gx_gui::program_change, in_event.buffer[1]);
112 sem_post(&gx_gui::program_change_sem);
113 } else if ((in_event.buffer[0] & 0xf0) == 0xb0) { // controller
114 gx_gui::controller_map.set(in_event.buffer[1], in_event.buffer[2]);
115 }
116 }
154117 }
155118
156 void compute_midi(int len)
157 {
158
159 // retrieve engine state
160 const GxEngineState estate = checky;
161
162 //------------ determine processing type
163 unsigned short process_type = ZEROIZE_BUFFERS;
164
165 if (gx_jack::NO_CONNECTION == 0) // ports connected
166 {
167 switch (estate)
168 {
169 case kEngineOn:
170 process_type = PROCESS_BUFFERS;
171 break;
172
173 case kEngineBypass:
174 process_type = JUSTCOPY_BUFFERS;
175 break;
176
177 default: // engine off or whatever: zeroize
178 break;
179 }
180 }
181
182 //------------ main processing routine
183 switch (process_type)
184 {
185 case PROCESS_BUFFERS:
186 process_midi(len);
187 break;
188 // --------- just copy input to outputs
189 case JUSTCOPY_BUFFERS:
190 process_midi(len);
191 break;
192 // ------- zeroize buffers
193 case ZEROIZE_BUFFERS:
194 default:
195 break;
196 }
119 void compute_midi(int len) {
120
121 // retrieve engine state
122 const GxEngineState estate = checky;
123
124 // ------------ determine processing type
125 uint16_t process_type = ZEROIZE_BUFFERS;
126
127 if (gx_jack::NO_CONNECTION == 0) { // ports connected
128 switch (estate) {
129 case kEngineOn:
130 process_type = PROCESS_BUFFERS;
131 break;
132
133 case kEngineBypass:
134 process_type = JUSTCOPY_BUFFERS;
135 break;
136
137 default: // engine off or whatever: zeroize
138 break;
139 }
140 }
141
142 // ------------ main processing routine
143 switch (process_type) {
144
145 case PROCESS_BUFFERS:
146 process_midi(len);
147 break;
148 // --------- just copy input to outputs
149 case JUSTCOPY_BUFFERS:
150 process_midi(len);
151 break;
152 // ------- zeroize buffers
153 case ZEROIZE_BUFFERS:
154 default:
155 break;
156 }
197157 }
198158
199159
200 //----- jack process callback for the midi output
201 void process_midi(int len)
202 {
203 //----- only run it when midi out or tuner is enabled
204 if (isMidiOn())
205 {
206 static float fnote = 1000.;
207 float fConsta2 = 0.;
208 float fTemps45 = midi.fslider45;
209 float fTemps38 = midi.fslider38;
210 float rms = 0.;
211 float midi_db = 0.;
212 float sum = 0.;
213 float *audiodata = checkfreq;
214
215 int preNote = 0;
216 int iTemps31 = int(midi.fslider31);
217 int iTemps30 = int(midi.fslider30);
218 int iTemps27 = int(midi.fslider27);
219 int iTemps29 = int(midi.fslider29)*12;
220 int iTemps26 = int(midi.fslider26);
221 int iTemps36 = int(midi.fslider36);
222 int iTemps35 = int(midi.fslider35);
223 int iTemps33 = int(midi.fslider33);
224 int iTemps34 = int(midi.fslider34)*12;
225 int iTemps32 = int(midi.fslider32);
226 int iTemps43 = int(midi.fslider43);
227 int iTemps44 = int(midi.fslider44);
228 int iTemps41 = int(midi.fslider41);
229 int iTemps42 = int(midi.fslider42)*12;
230 int iTemps40 = int(midi.fslider40);
231 int step = int(midi.fslider39);
232 int iTemps37 = int(48000/midi.fslider37);
233 int iTemps37a = iTemps37+5;
234 int iTemps46 = int(midi.fslider46);
235 int iTemps47 = int(midi.fslider47);
236 int iTemps48 = int(midi.fslider48);
237 int piwe = 0;
238 int cs = 0;
239
240 double stepper = 1./step;
241
242
243 /**fConsta4 is the frequence value from the actuell frame, here we
244 calculate the Note from the freq by log2(freq/440)*12
245 the result is the Note (as float) related to the note "A"
246
247 preNote contains the next posible Note, related by round float to int.
248 piwe contain the pitchweel value witch show the diff
249 beetween the detected Note and
250 the real Note by frequency.
251 **/
252 //fnote = 12 * log2f(2.272727e-03f * midi.fConsta4);
253 if(audio.fConsta1t < 999.) fnote = audio.fConsta1t;
254 preNote = int(round(fnote))+57;
255 fConsta2 = fnote - (preNote - 57);
256 piwe = ((int)fConsta2+1) * 8192; // pitch wheel value
257 // preNote = round(fConsta1t)+57;
258 // weg = 0;
259
260
261 for (int i=0; i<len; i+=step)
262 {
263 float audio_db = *audiodata++;
264 midi.BeatFilter1 = midi.BeatFilter1+(midi.BeatFilterk*(audio_db-midi.BeatFilter1));
265 midi.BeatFilter2 = midi.BeatFilter2+(midi.BeatFilterk*(midi.BeatFilter1-midi.BeatFilter2));
160 // ----- jack process callback for the midi output
161 void process_midi(int len) {
162
163 // ----- only run it when midi out or tuner is enabled
164 if (isMidiOn()) {
165 static float fnote = 1000.;
166 float fConsta2 = 0.;
167 float fTemps45 = midi.fslider45;
168 float fTemps38 = midi.fslider38;
169 float rms = 0.;
170 float midi_db = 0.;
171 float sum = 0.;
172 float *audiodata = checkfreq;
173
174 int preNote = 0;
175 int iTemps31 = static_cast<int>(midi.fslider31);
176 int iTemps30 = static_cast<int>(midi.fslider30);
177 int iTemps27 = static_cast<int>(midi.fslider27);
178 int iTemps29 = static_cast<int>(midi.fslider29)*12;
179 int iTemps26 = static_cast<int>(midi.fslider26);
180 int iTemps36 = static_cast<int>(midi.fslider36);
181 int iTemps35 = static_cast<int>(midi.fslider35);
182 int iTemps33 = static_cast<int>(midi.fslider33);
183 int iTemps34 = static_cast<int>(midi.fslider34)*12;
184 int iTemps32 = static_cast<int>(midi.fslider32);
185 int iTemps43 = static_cast<int>(midi.fslider43);
186 int iTemps44 = static_cast<int>(midi.fslider44);
187 int iTemps41 = static_cast<int>(midi.fslider41);
188 int iTemps42 = static_cast<int>(midi.fslider42)*12;
189 int iTemps40 = static_cast<int>(midi.fslider40);
190 int step = static_cast<int>(midi.fslider39);
191 int iTemps37 = static_cast<int>(48000/midi.fslider37);
192 int iTemps37a = iTemps37+5;
193 int iTemps46 = static_cast<int>(midi.fslider46);
194 int iTemps47 = static_cast<int>(midi.fslider47);
195 int iTemps48 = static_cast<int>(midi.fslider48);
196 int piwe = 0;
197 int cs = 0;
198
199 double stepper = 1./step;
200
201
202 /**fConsta4 is the frequence value from the actuell frame, here we
203 calculate the Note from the freq by log2(freq/440)*12
204 the result is the Note (as float) related to the note "A"
205
206 preNote contains the next posible Note, related by round float to int.
207 piwe contain the pitchweel value witch show the diff
208 beetween the detected Note and
209 the real Note by frequency.
210 **/
211 // fnote = 12 * log2f(2.272727e-03f * midi.fConsta4);
212 if (audio.fConsta1t < 999.) fnote = audio.fConsta1t;
213 preNote = static_cast<int>(round(fnote))+57;
214 fConsta2 = fnote - (preNote - 57);
215 piwe = (static_cast<int>(fConsta2+1)) * 8192; // pitch wheel value
216 // preNote = round(fConsta1t)+57;
217 // weg = 0;
218
219
220 for (int i = 0; i < len; i += step) {
221
222 float audio_db = *audiodata++;
223 midi.BeatFilter1 = midi.BeatFilter1+(midi.BeatFilterk*(audio_db-midi.BeatFilter1));
224 midi.BeatFilter2 = midi.BeatFilter2+(midi.BeatFilterk*(midi.BeatFilter1-
225 midi.BeatFilter2));
266226 audio_db = midi.BeatFilter2*10;
267 if(audio_db > 0.00001)
268 {
269 //----- convert the audio gain to midi gain value
270 midi_db = (log(fabs(audio_db))*midi.fConstlog2);
271 midi.beat0 = 254- floor(exp(midi.fConstlog*midi_db)*127)+ midi.midi_gain;
272 rms = midi.beat0;
273 }
274 //----- check gain value and run only when gain is higher then the selected value
275 if (( midi.beat0 >= fTemps45) && (gx_jack::jcpu_load < 65.0))
276 {
277
278 //----- rms the gain for a smother output
279 if (cs == int(midi.fConstun0*stepper))
280 {
281 cs = 0;
282 sum = 0;
283 }
284 else
285 {
286 cs += 1;
287 sum += sqrf(rms);
288 }
289
290 midi.beat0 = sqrtf(sum/cs);
291 //set the value for the tuner
292 //audio.fConsta1 = fnote;
293 //set timeout for tuner fallback
294 midi.weg = 0;
295
296 if ( rms >= (midi.Beat_is + fTemps38))
297 {
298 //midi.Beat_is = rms;
299 midi.Beat_is += (int)(rms*0.1);
300 midi.send+=step;
301 if (midi.fcheckbox10 ) midi.send1+=step;
302 if (midi.fcheckbox11 ) midi.send2+=step;
303 //midi.weg -= step;
304 }
305 // else midi.weg +=step;
306
307 //----- start the midi output
308
309 // channel0
310 if (midi.program != iTemps31)
311 {
312 midi.program = iTemps31;
313 audio.midistat += 1.0f;
314 midi.midi_send = jack_midi_event_reserve(gx_jack::midi_port_buf, i, 2);
315
316 if (midi.midi_send)
317 {
318 midi.midi_send[1] = (int)iTemps31; // program value
319 midi.midi_send[0] = 0xC0 | (int)iTemps30; // controller+ channel
320 }
321 }
322
323 if (midi.send > iTemps27) //20
324 {
325 if (int(midi.fautogain) == 1)
326 {
327 iTemps46 = (int)midi.beat0;
328 if ( iTemps46 < 0) iTemps46 = 0;
329 else if ( iTemps46 > 127) iTemps46 = 127;
330 midi.fslider46 = iTemps46;
331 }
332 if (midi.volume != iTemps46)
333 {
334 midi.volume = iTemps46;
335 audio.midistat += 1.0f;
336 midi.midi_send = jack_midi_event_reserve(gx_jack::midi_port_buf, i, 3);
337
338 if (midi.midi_send)
339 {
340 midi.midi_send[2] = (int)iTemps46; // volume value
341 midi.midi_send[1] = 0x07; // set controler volume
342 midi.midi_send[0] = 0xB0 | (int)iTemps30; // controller + channel
343 }
344 }
345
346 midi.noten = preNote + iTemps29;
347 midi.send = 0;
348 audio.midistat += 1.0f;
349 audio.midistat1 = true;
350
351 if (( midi.noten>=0)&&(midi.noten<=127))
352 {
353 // pitch wheel clear
354 if (midi.fpitch == 1.0)
355 {
356 midi.midi_send = jack_midi_event_reserve(gx_jack::midi_port_buf, i, 3);
357 if (midi.midi_send)
358 {
359 midi.midi_send[2] = 0x40; // pitch value
360 midi.midi_send[1] = 0x00 ; // pitch value
361 midi.midi_send[0] = 0xE0 | (int)iTemps30; // controller + channel
362 }
363 }
364 midi.midi_send = jack_midi_event_reserve(gx_jack::midi_port_buf, i, 3);
365 if (midi.midi_send)
366 {
367 midi.midi_send[2] = (int)iTemps26; // velocity
368 midi.midi_send[1] = midi.noten ; // note
369 midi.midi_send[0] = 0x90 | (int)iTemps30; // controller + channel
370 }
371
372 // pitch wheel set auto
373 if (midi.fpitch == 1.0)
374 {
375 if (piwe < 0) piwe = 0;
376 if (fConsta2 > 0x3fff) piwe = 0x3fff;
377 midi.midi_send = jack_midi_event_reserve(gx_jack::midi_port_buf, i, 3);
378
379 if (midi.midi_send)
380 {
381 midi.midi_send[2] = (piwe >> 7) & 0x7f; // pitch
382 midi.midi_send[1] = piwe & 0x7f ; // pitch
383 midi.midi_send[0] = 0xE0 | (int)iTemps30; // controller + channel
384 }
385 }
386 }
387 }
388
389 // channel1
390 if (midi.fcheckbox10)
391 {
392 if (midi.program1 != iTemps36)
393 {
394 midi.program1 = iTemps36;
395 audio.midistat += 1.0f;
396 midi.midi_send1 = jack_midi_event_reserve(gx_jack::midi_port_buf, i, 2);
397
398 if (midi.midi_send1)
399 {
400 midi.midi_send1[1] = (int)iTemps36; // program value
401 midi.midi_send1[0] = 0xC0 | (int)iTemps35; // controller+ channel
402 }
403 }
404
405 if (midi.send1 > iTemps33)
406 {
407 if (int(midi.fautogain1) == 1)
408 {
409 iTemps47 = (int)midi.beat0;
410 if ( iTemps47 < 0) iTemps47 = 0;
411 else if ( iTemps47 > 127) iTemps47 = 127;
412
413 midi.fslider47 = iTemps47;
414 }
415
416 if (midi.volume1 != iTemps47)
417 {
418 midi.volume1 = iTemps47;
419 audio.midistat += 1.0f;
420 midi.midi_send1 = jack_midi_event_reserve(gx_jack::midi_port_buf, i, 3);
421 if (midi.midi_send1)
422 {
423 midi.midi_send1[2] = (int)iTemps47; // volume value
424 midi.midi_send1[1] = 0x07; // set controler channel volume
425 midi.midi_send1[0] = 0xB0 | (int)iTemps35; // controller + channel
426 }
427 }
428
429 midi.noten1 = preNote + iTemps34;
430 midi.send1 = 0;
431 audio.midistat += 1.0f;
432 audio.midistat2 = true;
433 if ((midi.noten1>=0)&&(midi.noten1<=127))
434 {
435 // pitch wheel clear
436 if (midi.fpitch1 == 1.0)
437 {
438 midi.midi_send1 = jack_midi_event_reserve(gx_jack::midi_port_buf, i, 3);
439 if (midi.midi_send1)
440 {
441 midi.midi_send1[2] = 0x40; // pitch value
442 midi.midi_send1[1] = 0x00 ; // pitch value
443 midi.midi_send1[0] = 0xE0 | (int)iTemps35; // controller + channel
444 }
445 }
446 midi.midi_send1 = jack_midi_event_reserve(gx_jack::midi_port_buf, i, 3);
447
448 if (midi.midi_send1)
449 {
450 midi.midi_send1[2] = (int)iTemps32; // velocity
451 midi.midi_send1[1] = midi.noten1; // note
452 midi.midi_send1[0] = 0x90 | (int)iTemps35; // note on + channel
453 }
454
455 // pitch wheel set auto
456 if (midi.fpitch1 == 1.0)
457 {
458 if (piwe < 0) piwe = 0;
459 if (fConsta2 > 0x3fff) piwe = 0x3fff;
460 midi.midi_send1 = jack_midi_event_reserve(gx_jack::midi_port_buf, i, 3);
461
462 if (midi.midi_send1)
463 {
464 midi.midi_send1[2] = (piwe >> 7) & 0x7f; // pitch
465 midi.midi_send1[1] = piwe & 0x7f ; // pitch
466 midi.midi_send1[0] = 0xE0 | (int)iTemps35; // controller + channel
467 }
468 }
469 }
470 }
471 }
472 // channel2
473 if (midi.fcheckbox11)
474 {
475 if (midi.program2 != iTemps43)
476 {
477 midi.program2 = iTemps43;
478 audio.midistat += 1.0f;
479 midi.midi_send2 = jack_midi_event_reserve(gx_jack::midi_port_buf, i, 2);
480
481 if (midi.midi_send2)
482 {
483 midi.midi_send2[1] = (int)iTemps43; // program value
484 midi.midi_send2[0] = 0xC0 | (int)iTemps44; // controller
485 }
486 }
487
488 if (midi.send2 > iTemps41) //20
489 {
490 if (int(midi.fautogain2) == 1)
491 {
492 iTemps48 = (int)midi.beat0;
493 if ( iTemps48 < 0) iTemps48 = 0;
494 else if ( iTemps48 > 127) iTemps48 = 127;
495 midi.fslider48 = iTemps48;
496 }
497
498 if (midi.volume2 != iTemps48)
499 {
500 midi.volume2 = iTemps48;
501 audio.midistat += 1.0f;
502 midi.midi_send2 = jack_midi_event_reserve(gx_jack::midi_port_buf, i, 3);
503 if (midi.midi_send2)
504 {
505 midi.midi_send2[2] = (int)iTemps48; // volume value
506 midi.midi_send2[1] = 0x07; // set controler channel volume
507 midi.midi_send2[0] = 0xB0 | (int)iTemps44; // controller + channel
508 }
509 }
510
511 // pitch wheel clear
512 if (midi.fpitch2 == 1.0)
513 {
514 midi.midi_send2 = jack_midi_event_reserve(gx_jack::midi_port_buf, i, 3);
515 if (midi.midi_send2)
516 {
517 midi.midi_send2[2] = 0x40; // pitch value
518 midi.midi_send2[1] = 0x00 ; // pitch value
519 midi.midi_send2[0] = 0xE0 | (int)iTemps44; // controller + channel
520 }
521 }
522
523 midi.noten2 = preNote + iTemps42;
524 midi.send2 = 0;
525 audio.midistat += 1.0f;
526 audio.midistat3 = true;
527
528 if ((midi.noten2>=0)&&(midi.noten2<=127))
529 {
530 midi.midi_send2 = jack_midi_event_reserve(gx_jack::midi_port_buf, i, 3);
531
532 if (midi.midi_send2)
533 {
534 midi.midi_send2[2] = (int)iTemps40; // velocity
535 midi.midi_send2[1] = midi.noten2; // note
536 midi.midi_send2[0] = 0x90 | (int)iTemps44; // note on + channel
537 }
538
539 // pitch wheel set auto
540 if (midi.fpitch2 == 1.0)
541 {
542 if (piwe < 0) piwe = 0;
543 if (fConsta2 > 0x3fff) piwe = 0x3fff;
544 midi.midi_send2 = jack_midi_event_reserve(gx_jack::midi_port_buf, i, 3);
545 if (midi.midi_send2)
546 {
547 midi.midi_send2[2] = (piwe >> 7) & 0x7f; // pitch
548 midi.midi_send2[1] = piwe & 0x7f ; // pitch
549 midi.midi_send2[0] = 0xE0 | (int)iTemps44; // controller + channel
550 }
551 }
552 }
553 }
554 }
555
556
557
558
559 // end if playmidi = 1
560 }
561 else
562 {
563
564 if ((midi.weg > iTemps37) || (gx_jack::jcpu_load > 64.0))
565 {
566 midi.send = midi.send1 = midi.send2 = 0;
567 midi.Beat_is = (int)fTemps45;
568 if (midi.weg < iTemps37a) // 5.0
569 {
570 audio.midistat += 1.0f;
571 midi.midi_send = jack_midi_event_reserve(gx_jack::midi_port_buf, i, 3);
572
573 if (midi.midi_send)
574 {
575 midi.midi_send[2] = (int)iTemps26; // velocity
576 midi.midi_send[1] = 123; // fix me all notes off
577 midi.midi_send[0] = 0xB0 | (int)iTemps30 ; // controller
578 }
579
580 if (midi.fcheckbox10)
581 {
582 audio.midistat += 1.0f;
583 midi.midi_send1 = jack_midi_event_reserve(gx_jack::midi_port_buf, i, 3);
584
585 if (midi.midi_send1)
586 {
587 midi.midi_send1[2] = (int)iTemps32; // velocity
588 midi.midi_send1[1] = 123; // fix me all notes off
589 midi.midi_send1[0] = 0xB0 | (int)iTemps35; // controller
590 //fprintf(stderr, "Send %i , %i, %i.\n",iTemps32,123,0xB0 | iTemps35);
591 }
592 }
593
594 if (midi.fcheckbox11)
595 {
596 audio.midistat += 1.0f;
597 midi.midi_send2 = jack_midi_event_reserve(gx_jack::midi_port_buf, i, 3);
598
599 if (midi.midi_send2)
600 {
601 midi.midi_send2[2] = (int)iTemps40; // velocity
602 midi.midi_send2[1] = 123; // fix me all notes off
603 midi.midi_send2[0] = 0xB0 | (int)iTemps44; // controller
604 }
605 }
606 audio.midistat = 0.0f;
607 audio.midistat1 = audio.midistat2 = audio.midistat3 = false;
608 }
609 }
610 midi.weg+=step;
611
612 }
613
614 }
615 }
227 if (audio_db > 0.00001) {
228 // ----- convert the audio gain to midi gain value
229 midi_db = (log(fabs(audio_db))*midi.fConstlog2);
230 midi.beat0 = 254- floor(exp(midi.fConstlog*midi_db)*127)+ midi.midi_gain;
231 rms = midi.beat0;
232 }
233 // ----- check gain value and run only when gain is higher then the selected value
234 if (( midi.beat0 >= fTemps45) && (gx_jack::gxjack.jcpu_load < 65.0)) {
235
236 // ----- rms the gain for a smother output
237 if (cs == static_cast<int>(midi.fConstun0*stepper)) {
238 cs = 0;
239 sum = 0;
240 } else {
241 cs += 1;
242 sum += sqrf(rms);
243 }
244
245 midi.beat0 = sqrtf(sum/cs);
246 // set the value for the tuner
247 // audio.fConsta1 = fnote;
248 // set timeout for tuner fallback
249 midi.weg = 0;
250
251 if (rms >= (midi.Beat_is + fTemps38)) {
252 // midi.Beat_is = rms;
253 midi.Beat_is += static_cast<int>(rms*0.1);
254 midi.send+=step;
255 if (midi.fcheckbox10 ) midi.send1+=step;
256 if (midi.fcheckbox11 ) midi.send2+=step;
257 // midi.weg -= step;
258 }
259 // else midi.weg +=step;
260
261 // ----- start the midi output
262
263 // channel0
264 if (midi.program != iTemps31) {
265 midi.program = iTemps31;
266 audio.midistat += 1.0f;
267 midi.midi_send = jack_midi_event_reserve(gx_jack::midi_port_buf, i, 2);
268
269 if (midi.midi_send) {
270 // program value
271 midi.midi_send[1] = static_cast<int>(iTemps31);
272 // controller+ channel
273 midi.midi_send[0] = 0xC0 | static_cast<int>(iTemps30);
274 }
275 }
276
277 if (midi.send > iTemps27) { // 20
278 if (static_cast<int>(midi.fautogain) == 1) {
279 iTemps46 = static_cast<int>(midi.beat0);
280 if ( iTemps46 < 0) iTemps46 = 0;
281 else if ( iTemps46 > 127) iTemps46 = 127;
282 midi.fslider46 = iTemps46;
283 }
284 if (midi.volume != iTemps46) {
285 midi.volume = iTemps46;
286 audio.midistat += 1.0f;
287 midi.midi_send = jack_midi_event_reserve
288 (gx_jack::midi_port_buf, i, 3);
289
290 if (midi.midi_send) {
291 // volume value
292 midi.midi_send[2] = static_cast<int>(iTemps46);
293 // set controler volume
294 midi.midi_send[1] = 0x07;
295 // controller + channel
296 midi.midi_send[0] = 0xB0 | static_cast<int>(iTemps30);
297 }
298 }
299
300 midi.noten = preNote + iTemps29;
301 midi.send = 0;
302 audio.midistat += 1.0f;
303 audio.midistat1 = true;
304
305 if (( midi.noten >= 0)&&(midi.noten <= 127)) {
306 // pitch wheel clear
307 if (midi.fpitch == 1.0) {
308 midi.midi_send = jack_midi_event_reserve
309 (gx_jack::midi_port_buf, i, 3);
310 if (midi.midi_send) {
311 // pitch value
312 midi.midi_send[2] = 0x40;
313 // pitch value
314 midi.midi_send[1] = 0x00;
315 // controller + channel
316 midi.midi_send[0] = 0xE0 | static_cast<int>(iTemps30);
317 }
318 }
319 midi.midi_send = jack_midi_event_reserve
320 (gx_jack::midi_port_buf, i, 3);
321 if (midi.midi_send) {
322 // velocity
323 midi.midi_send[2] = static_cast<int>(iTemps26);
324 // note
325 midi.midi_send[1] = midi.noten;
326 // controller + channel
327 midi.midi_send[0] = 0x90 | static_cast<int>(iTemps30);
328 }
329
330 // pitch wheel set auto
331 if (midi.fpitch == 1.0) {
332 if (piwe < 0) piwe = 0;
333 if (fConsta2 > 0x3fff) piwe = 0x3fff;
334 midi.midi_send = jack_midi_event_reserve
335 (gx_jack::midi_port_buf, i, 3);
336
337 if (midi.midi_send) {
338 // pitch
339 midi.midi_send[2] = (piwe >> 7) & 0x7f;
340 // pitch
341 midi.midi_send[1] = piwe & 0x7f;
342 // controller + channel
343 midi.midi_send[0] = 0xE0 | static_cast<int>(iTemps30);
344 }
345 }
346 }
347 }
348
349 // channel1
350 if (midi.fcheckbox10) {
351 if (midi.program1 != iTemps36) {
352 midi.program1 = iTemps36;
353 audio.midistat += 1.0f;
354 midi.midi_send1 = jack_midi_event_reserve
355 (gx_jack::midi_port_buf, i, 2);
356
357 if (midi.midi_send1) {
358 // program value
359 midi.midi_send1[1] = static_cast<int>(iTemps36);
360 // controller+ channel
361 midi.midi_send1[0] = 0xC0 | static_cast<int>(iTemps35);
362 }
363 }
364
365 if (midi.send1 > iTemps33) {
366 if (static_cast<int>(midi.fautogain1) == 1) {
367 iTemps47 = static_cast<int>(midi.beat0);
368 if ( iTemps47 < 0) iTemps47 = 0;
369 else if ( iTemps47 > 127) iTemps47 = 127;
370
371 midi.fslider47 = iTemps47;
372 }
373
374 if (midi.volume1 != iTemps47) {
375 midi.volume1 = iTemps47;
376 audio.midistat += 1.0f;
377 midi.midi_send1 = jack_midi_event_reserve
378 (gx_jack::midi_port_buf, i, 3);
379 if (midi.midi_send1) {
380 // volume value
381 midi.midi_send1[2] = static_cast<int>(iTemps47);
382 // set controler channel volume
383 midi.midi_send1[1] = 0x07;
384 // controller + channel
385 midi.midi_send1[0] = 0xB0 | static_cast<int>(iTemps35);
386 }
387 }
388
389 midi.noten1 = preNote + iTemps34;
390 midi.send1 = 0;
391 audio.midistat += 1.0f;
392 audio.midistat2 = true;
393 if ((midi.noten1 >= 0)&&(midi.noten1 <= 127)) {
394 // pitch wheel clear
395 if (midi.fpitch1 == 1.0) {
396 midi.midi_send1 = jack_midi_event_reserve
397 (gx_jack::midi_port_buf, i, 3);
398 if (midi.midi_send1) {
399 // pitch value
400 midi.midi_send1[2] = 0x40;
401 // pitch value
402 midi.midi_send1[1] = 0x00;
403 // controller + channel
404 midi.midi_send1[0] = 0xE0 | static_cast<int>(iTemps35);
405 }
406 }
407 midi.midi_send1 = jack_midi_event_reserve(gx_jack::midi_port_buf, i, 3);
408
409 if (midi.midi_send1) {
410 // velocity
411 midi.midi_send1[2] = static_cast<int>(iTemps32);
412 // note
413 midi.midi_send1[1] = midi.noten1;
414 // note on + channel
415 midi.midi_send1[0] = 0x90 | static_cast<int>(iTemps35);
416 }
417
418 // pitch wheel set auto
419 if (midi.fpitch1 == 1.0) {
420 if (piwe < 0) piwe = 0;
421 if (fConsta2 > 0x3fff) piwe = 0x3fff;
422 midi.midi_send1 = jack_midi_event_reserve
423 (gx_jack::midi_port_buf, i, 3);
424
425 if (midi.midi_send1) {
426 // pitch
427 midi.midi_send1[2] = (piwe >> 7) & 0x7f;
428 // pitch
429 midi.midi_send1[1] = piwe & 0x7f;
430 // controller + channel
431 midi.midi_send1[0] = 0xE0 | static_cast<int>(iTemps35);
432 }
433 }
434 }
435 }
436 }
437 // channel2
438 if (midi.fcheckbox11) {
439 if (midi.program2 != iTemps43) {
440 midi.program2 = iTemps43;
441 audio.midistat += 1.0f;
442 midi.midi_send2 = jack_midi_event_reserve(gx_jack::midi_port_buf, i, 2);
443
444 if (midi.midi_send2) {
445 // program value
446 midi.midi_send2[1] = static_cast<int>(iTemps43);
447 // controller
448 midi.midi_send2[0] = 0xC0 | static_cast<int>(iTemps44);
449 }
450 }
451
452 if (midi.send2 > iTemps41) { // 20
453 if (static_cast<int>(midi.fautogain2) == 1) {
454 iTemps48 = static_cast<int>(midi.beat0);
455 if ( iTemps48 < 0) iTemps48 = 0;
456 else if ( iTemps48 > 127) iTemps48 = 127;
457 midi.fslider48 = iTemps48;
458 }
459
460 if (midi.volume2 != iTemps48) {
461 midi.volume2 = iTemps48;
462 audio.midistat += 1.0f;
463 midi.midi_send2 = jack_midi_event_reserve
464 (gx_jack::midi_port_buf, i, 3);
465 if (midi.midi_send2) {
466 // volume value
467 midi.midi_send2[2] = static_cast<int>(iTemps48);
468 // set controler channel volume
469 midi.midi_send2[1] = 0x07;
470 // controller + channel
471 midi.midi_send2[0] = 0xB0 | static_cast<int>(iTemps44);
472 }
473 }
474
475 // pitch wheel clear
476 if (midi.fpitch2 == 1.0) {
477 midi.midi_send2 = jack_midi_event_reserve
478 (gx_jack::midi_port_buf, i, 3);
479 if (midi.midi_send2) {
480 // pitch value
481 midi.midi_send2[2] = 0x40;
482 // pitch value
483 midi.midi_send2[1] = 0x00;
484 // controller + channel
485 midi.midi_send2[0] = 0xE0 | static_cast<int>(iTemps44);
486 }
487 }
488
489 midi.noten2 = preNote + iTemps42;
490 midi.send2 = 0;
491 audio.midistat += 1.0f;
492 audio.midistat3 = true;
493
494 if ((midi.noten2 >= 0)&&(midi.noten2 <= 127)) {
495 midi.midi_send2 = jack_midi_event_reserve
496 (gx_jack::midi_port_buf, i, 3);
497
498 if (midi.midi_send2) {
499 // velocity
500 midi.midi_send2[2] = static_cast<int>(iTemps40);
501 // note
502 midi.midi_send2[1] = midi.noten2;
503 // note on + channel
504 midi.midi_send2[0] = 0x90 | static_cast<int>(iTemps44);
505 }
506
507 // pitch wheel set auto
508 if (midi.fpitch2 == 1.0) {
509 if (piwe < 0) piwe = 0;
510 if (fConsta2 > 0x3fff) piwe = 0x3fff;
511 midi.midi_send2 = jack_midi_event_reserve
512 (gx_jack::midi_port_buf, i, 3);
513 if (midi.midi_send2) {
514 // pitch
515 midi.midi_send2[2] = (piwe >> 7) & 0x7f;
516 // pitch
517 midi.midi_send2[1] = piwe & 0x7f;
518 // controller + channel
519 midi.midi_send2[0] = 0xE0 | static_cast<int>(iTemps44);
520 }
521 }
522 }
523 }
524 }
525
526 // end if playmidi = 1
527 } else {
528 if ((midi.weg > iTemps37) || (gx_jack::gxjack.jcpu_load > 64.0)) {
529 midi.send = midi.send1 = midi.send2 = 0;
530 midi.Beat_is = static_cast<int>(fTemps45);
531 if (midi.weg < iTemps37a) { // 5.0
532 audio.midistat += 1.0f;
533 midi.midi_send = jack_midi_event_reserve(gx_jack::midi_port_buf, i, 3);
534
535 if (midi.midi_send) {
536 // velocity
537 midi.midi_send[2] = static_cast<int>(iTemps26);
538 // fix me all notes off
539 midi.midi_send[1] = 123;
540 // controller
541 midi.midi_send[0] = 0xB0 | static_cast<int>(iTemps30);
542 }
543
544 if (midi.fcheckbox10) {
545 audio.midistat += 1.0f;
546 midi.midi_send1 = jack_midi_event_reserve(gx_jack::midi_port_buf, i, 3);
547
548 if (midi.midi_send1) {
549 // velocity
550 midi.midi_send1[2] = static_cast<int>(iTemps32);
551 // fix me all notes off
552 midi.midi_send1[1] = 123;
553 // controller
554 midi.midi_send1[0] = 0xB0 | static_cast<int>(iTemps35);
555 }
556 }
557
558 if (midi.fcheckbox11) {
559 audio.midistat += 1.0f;
560 midi.midi_send2 = jack_midi_event_reserve(gx_jack::midi_port_buf, i, 3);
561
562 if (midi.midi_send2) {
563 // velocity
564 midi.midi_send2[2] = static_cast<int>(iTemps40);
565 // fix me all notes off
566 midi.midi_send2[1] = 123;
567 // controller
568 midi.midi_send2[0] = 0xB0 | static_cast<int>(iTemps44);
569 }
570 }
571 audio.midistat = 0.0f;
572 audio.midistat1 = audio.midistat2 = audio.midistat3 = false;
573 }
574 }
575 midi.weg+=step;
576 }
577 }
578 }
616579 }
617
618580 } /* end of gx_engine namespace */
+0
-100
src/gx_head/gx_engine_tubetable.cc less more
0 /*
1 * Copyright (C) 2009-2010 Hermann Meyer, James Warden, Andreas Degert
2 *
3 * Copyright (C) 2011, Pete Shorthose
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 * --------------------------------------------------------------------------
19 *
20 *
21 * This file is part of the Guitarix Audio Engine
22 *
23 *
24 * --------------------------------------------------------------------------
25 */
26
27
28 namespace gx_tubes {
29
30 #define TAB_SIZE (2001)
31
32 struct tabled {
33 float low;
34 float high;
35 float istep;
36 float data[TAB_SIZE];
37 };
38
39 #include "12ax7.cc"
40 #include "12AU7.cc"
41 #include "6V6.cc"
42 #include "6DJ8.cc"
43
44 }
45
46 inline float Ftube(int table, float Vgk)
47 {
48 struct gx_tubes::tabled& tab = gx_tubes::tubetable[table];
49 float f = (Vgk - tab.low) * tab.istep;
50 int i = int(f);
51 if (i < 0)
52 return tab.data[0];
53 if (i >= TAB_SIZE-1)
54 return tab.data[TAB_SIZE-1];
55 f -= i;
56 return tab.data[i]*(1-f) + tab.data[i+1]*f;
57 }
58
59 inline float Ftube2(int table, float Vgk)
60 {
61 struct gx_tubes::tabled& tab = gx_tubes::tubetable2[table];
62 float f = (Vgk - tab.low) * tab.istep;
63 int i = int(f);
64 if (i < 0)
65 return tab.data[0];
66 if (i >= TAB_SIZE-1)
67 return tab.data[TAB_SIZE-1];
68 f -= i;
69 return tab.data[i]*(1-f) + tab.data[i+1]*f;
70 }
71
72 inline float Ftube3(int table, float Vgk)
73 {
74 struct gx_tubes::tabled& tab = gx_tubes::tubetable3[table];
75 float f = (Vgk - tab.low) * tab.istep;
76 int i = int(f);
77 if (i < 0)
78 return tab.data[0];
79 if (i >= TAB_SIZE-1)
80 return tab.data[TAB_SIZE-1];
81 f -= i;
82 return tab.data[i]*(1-f) + tab.data[i+1]*f;
83 }
84
85 inline float Ftube4(int table, float Vgk)
86 {
87 struct gx_tubes::tabled& tab = gx_tubes::tubetable4[table];
88 float f = (Vgk - tab.low) * tab.istep;
89 int i = int(f);
90 if (i < 0)
91 return tab.data[0];
92 if (i >= TAB_SIZE-1)
93 return tab.data[TAB_SIZE-1];
94 f -= i;
95 return tab.data[i]*(1-f) + tab.data[i+1]*f;
96 }
97
98
99
0 /*
1 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17 * --------------------------------------------------------------------------
18 *
19 *
20 * This file is part of the Guitarix Audio Engine
21 *
22 *
23 * --------------------------------------------------------------------------
24 */
25
26 #include "guitarix.h"
27
28 namespace gx_tubes {
29
30 #include "12ax7.cc"
31 #include "12AU7.cc"
32 #include "6V6.cc"
33 #include "6DJ8.cc"
34
35 }
36
00 /*
1 * Copyright (C) 2009-2010 Hermann Meyer, James Warden, Andreas Degert
1 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * --------------------------------------------------------------------------
1718 * --------------------------------------------------------------------------
1819 */
2324 ** definitions for code generated with faust / dsp2cc
2425 */
2526
26 typedef void (*inifunc)(int);
27 typedef void (*inifunc)(int); // NOLINT
2728
2829 typedef struct {
29 inifunc func;
30 const char *name;
30 inifunc func;
31 const char *name;
3132 } inidef;
3233
3334
34 static list<inidef>& get_inilist()
35 {
36 static list<inidef> inilist;
37 return inilist;
38 }
39
40 static list<gx_gui::Parameter*>& get_paramlist()
41 {
42 static list<gx_gui::Parameter*> paramlist;
43 return paramlist;
44 }
45
46 void register_faust_parameters()
47 {
48 list<gx_gui::Parameter*>& paramlist = get_paramlist();
49 for (list<gx_gui::Parameter*>::iterator i = paramlist.begin(); i != paramlist.end(); i++) {
50 gx_gui::parameter_map.insert(*i);
51 //fprintf(stderr, "%s \n",(*i)->id().c_str() );
52 }
53 paramlist.clear();
54 }
55
56 static gx_gui::Parameter *find_parameter(const char *id)
57 {
58 list<gx_gui::Parameter*>& paramlist = get_paramlist();
59 for (list<gx_gui::Parameter*>::iterator i = paramlist.begin(); i != paramlist.end(); i++) {
60 if ((*i)->id() == id) {
61 return *i;
62 }
63 }
64 return 0;
65 }
66
67 static float& get_alias(const char *id)
68 {
69 static float dummy;
70 gx_gui::Parameter *p = find_parameter(id);
71 if (!p) {
72 gx_system::gx_print_error("engine", string("can't define alias for unknown (or not yet defined) parameter id: ") + id);
73 return dummy;
74 } else {
75 return p->getFloat().value;
76 }
35 static list<inidef>& get_inilist() {
36 static list<inidef> inilist;
37 return inilist;
38 }
39
40 static list<gx_gui::Parameter*>& get_paramlist() {
41 static list<gx_gui::Parameter*> paramlist;
42 return paramlist;
43 }
44
45 void register_faust_parameters() {
46 list<gx_gui::Parameter*>& paramlist = get_paramlist();
47 for (list<gx_gui::Parameter*>::iterator i = paramlist.begin(); i != paramlist.end(); i++) {
48 gx_gui::parameter_map.insert(*i);
49 // fprintf(stderr, "%s \n",(*i)->id().c_str() );
50 }
51 paramlist.clear();
52 }
53
54 static gx_gui::Parameter *find_parameter(const char *id) {
55 list<gx_gui::Parameter*>& paramlist = get_paramlist();
56 for (list<gx_gui::Parameter*>::iterator i = paramlist.begin(); i != paramlist.end(); i++) {
57 if ((*i)->id() == id) {
58 return *i;
59 }
60 }
61 return 0;
62 }
63
64 static float& get_alias(const char *id) {
65 static float dummy;
66 gx_gui::Parameter *p = find_parameter(id);
67 if (!p) {
68 gx_system::gx_print_error("engine", string
69 ("can't define alias for unknown (or not yet defined) parameter id: ") + id);
70 return dummy;
71 } else {
72 return p->getFloat().value;
73 }
7774 }
7875
7976 static void registerVar(const char* id, const char* name, const char* tp,
80 const char* tooltip, float* var, float val=0,
81 float low=0, float up=0, float step=0, bool exp=false)
82 {
83 if (!name[0]) {
84 assert(strrchr(id, '.'));
85 name = strrchr(id, '.')+1;
86 }
87 gx_gui::Parameter *p = new gx_gui::FloatParameter(
88 id, name, gx_gui::Parameter::Continuous, true, *var, val, low, up, step, true, exp);
89 if (tooltip) {
90 p->set_desc(tooltip);
91 }
92 get_paramlist().push_back(p);
77 const char* tooltip, float* var, float val = 0,
78 float low = 0, float up = 0, float step = 0, bool exp = false) {
79 if (!name[0]) {
80 assert(strrchr(id, '.'));
81 name = strrchr(id, '.')+1;
82 }
83 gx_gui::Parameter *p = new gx_gui::FloatParameter(
84 id, name, gx_gui::Parameter::Continuous, true, *var, val, low, up, step, true, exp);
85 if (tooltip) {
86 p->set_desc(tooltip);
87 }
88 get_paramlist().push_back(p);
9389 }
9490
9591 static void registerEnumVar(const char *id, const char* name, const char* tp,
9692 const char* tooltip, const char** values, float *var, float val,
97 float low=0, float up=0, float step=1, bool exp=false)
98 {
99 if (!name[0]) {
100 assert(strrchr(id, '.'));
101 name = strrchr(id, '.')+1;
102 }
103 assert(low == 0.0 && step == 1.0);
104 gx_gui::FloatEnumParameter *p = new gx_gui::FloatEnumParameter(
105 id, name, values, true, *var, (int)round(val), true, exp); //false == no_midi_var
106 assert(up == p->upper); // calculated by constructor
107 get_paramlist().push_back(p);
108 }
109
110 static inline void registerIntParam(const char*a,const char*b,int*c,int std=0,int lower=0,int upper=1,bool exp=false)
111 {
112 get_paramlist().push_back(
113 new gx_gui::IntParameter(a,b,gx_gui::Parameter::Enum,true,*c,std,
114 lower,upper,true,exp));
115 }
116
117 static void registerInit(const char *name, inifunc f)
118 {
119 inidef i;
120 i.func = f;
121 i.name = name;
122 //fprintf(stderr, "%s \n", i.name);
123 get_inilist().push_back(i);
124 }
125
126 static void jack_sync()
127 {
128 while (sem_wait(&gx_jack::jack_sync_sem) == EINTR);
129 }
130
131 #define max(x,y) (((x)>(y)) ? (x) : (y))
132 #define min(x,y) (((x)<(y)) ? (x) : (y))
133
134 //FIXME (temporary)hack to support older compiler versions
135 inline float pow(float b, float e) { return ::powf(b, e); }
136 inline double pow(double b, double e){return ::pow(b, e); }
137 inline double pow(double b, int e) { return ::pow(b, (double)e); }
138 inline double pow(int b, double e) { return ::pow((double)b, e); }
139 inline double pow(double b, float e){ return ::pow(b, (double)e); }
140 inline double pow(float b, double e){ return ::pow((double)b, e); }
141 inline float pow(float b, int e) { return ::powf(b, (float) e); }
142 inline float pow(int b, float e) { return ::powf((float)b, e); }
143
144 template <int N> inline float faustpower(float x) { return powf(x,N); }
145 template <int N> inline double faustpower(double x) { return pow(x,N); }
146 template <int N> inline int faustpower(int x) { return faustpower<N/2>(x) * faustpower<N-N/2>(x); }
147 template <> inline int faustpower<0>(int x) { return 1; }
148 template <> inline int faustpower<1>(int x) { return x; }
93 float low = 0, float up = 0, float step = 1, bool exp = false) {
94 if (!name[0]) {
95 assert(strrchr(id, '.'));
96 name = strrchr(id, '.')+1;
97 }
98 assert(low == 0.0 && step == 1.0);
99 gx_gui::FloatEnumParameter *p = new gx_gui::FloatEnumParameter(
100 id, name, values, true, *var,
101 static_cast<int>(round(val)), true, exp); // false == no_midi_var
102 assert(up == p->upper); // calculated by constructor
103 get_paramlist().push_back(p);
104 }
105
106 static inline void registerIntParam(const char*a, const char*b, int*c, int std = 0,
107 int lower = 0, int upper = 1, bool exp = false) {
108 get_paramlist().push_back(
109 new gx_gui::IntParameter(a , b, gx_gui::Parameter::Enum, true, *c, std,
110 lower, upper, true, exp));
111 }
112
113 static void registerInit(const char *name, inifunc f) {
114 inidef i;
115 i.func = f;
116 i.name = name;
117 // fprintf(stderr, "%s \n", i.name);
118 get_inilist().push_back(i);
119 }
120
121 static void jack_sync() {
122 while (sem_wait(&gx_jack::jack_sync_sem) == EINTR);
123 }
124
125 /****************************************************************
126 ** definitions for ffunction(float Ftube(int,float), "valve.h", "");
127 ** in gx_amp.dsp - gx_ampmodul.dsp
128 **/
129
130 inline float Ftube(int table, float Vgk) {
131 struct gx_tubes::tabled& tab = gx_tubes::tubetable[table];
132 float f = (Vgk - tab.low) * tab.istep;
133 int i = static_cast<int>(f);
134 if (i < 0)
135 return tab.data[0];
136 if (i >= TAB_SIZE-1)
137 return tab.data[TAB_SIZE-1];
138 f -= i;
139 return tab.data[i]*(1-f) + tab.data[i+1]*f;
140 }
141
142 inline float Ftube2(int table, float Vgk) {
143 struct gx_tubes::tabled& tab = gx_tubes::tubetable2[table];
144 float f = (Vgk - tab.low) * tab.istep;
145 int i = static_cast<int>(f);
146 if (i < 0)
147 return tab.data[0];
148 if (i >= TAB_SIZE-1)
149 return tab.data[TAB_SIZE-1];
150 f -= i;
151 return tab.data[i]*(1-f) + tab.data[i+1]*f;
152 }
153
154 inline float Ftube3(int table, float Vgk) {
155 struct gx_tubes::tabled& tab = gx_tubes::tubetable3[table];
156 float f = (Vgk - tab.low) * tab.istep;
157 int i = static_cast<int>(f);
158 if (i < 0)
159 return tab.data[0];
160 if (i >= TAB_SIZE-1)
161 return tab.data[TAB_SIZE-1];
162 f -= i;
163 return tab.data[i]*(1-f) + tab.data[i+1]*f;
164 }
165
166 inline float Ftube4(int table, float Vgk) {
167 struct gx_tubes::tabled& tab = gx_tubes::tubetable4[table];
168 float f = (Vgk - tab.low) * tab.istep;
169 int i = static_cast<int>(f);
170 if (i < 0)
171 return tab.data[0];
172 if (i >= TAB_SIZE-1)
173 return tab.data[TAB_SIZE-1];
174 f -= i;
175 return tab.data[i]*(1-f) + tab.data[i+1]*f;
176 }
177
178 /****************************************************************/
179
180 #define max(x, y) (((x) > (y)) ? (x) : (y))
181 #define min(x, y) (((x) < (y)) ? (x) : (y))
182
183 // FIXME (temporary)hack to support older compiler versions
184 inline float pow(float b, float e) {return ::powf(b, e);}
185 inline double pow(double b, double e) {return ::pow(b, e);}
186 inline double pow(double b, int e) {return ::pow(b, static_cast<double>(e));}
187 inline double pow(int b, double e) {return ::pow(static_cast<double>(b), e);}
188 inline double pow(double b, float e) {return ::pow(b, static_cast<double>(e));}
189 inline double pow(float b, double e) {return ::pow(static_cast<double>(b), e);}
190 inline float pow(float b, int e) {return ::powf(b, static_cast<float>(e));}
191 inline float pow(int b, float e) {return ::powf(static_cast<float>(b), e);}
192
193 template <int N> inline float faustpower(float x) {return powf(x, N);}
194 template <int N> inline double faustpower(double x) {return pow(x, N);}
195 template <int N> inline int faustpower(int x) {return faustpower<N/2>(x) * faustpower<N-N/2>(x);}
196 template <> inline int faustpower<0>(int x) {return 1;}
197 template <> inline int faustpower<1>(int x) {return x;}
149198
150199 #define FAUSTFLOAT float
151200
152201 /****************************************************************
153202 ** include faust/dsp2cc generated files
154203 */
155
204
156205 // gxdistortion
157 static struct GxDistortionParams { GxDistortionParams(); } GxDistortionParams;
206 static struct GxDistortionParams { GxDistortionParams();}
207 GxDistortionParams;
158208 GxDistortionParams::GxDistortionParams() {
159 static FAUSTFLOAT v1,v2;
160 registerVar("gxdistortion.drive","","S","",&v1, 0.35, 0.0, 1.0, 0.01);
161 registerVar("gxdistortion.wet_dry","","S","",&v2, 100.0, 0.0, 100.0, 1.0);
209 static FAUSTFLOAT v1, v2;
210 registerVar("gxdistortion.drive", "", "S", "", &v1, 0.35, 0.0, 1.0, 0.01);
211 registerVar("gxdistortion.wet_dry", "", "S", "", &v2, 100.0, 0.0, 100.0, 1.0);
162212 }
163213
164214 namespace gx_amps {
167217 #include "faust/gxamp3.cc"
168218 #include "faust/gxamp4.cc"
169219 #include "faust/gxamp5.cc"
220 #include "faust/gxamp6.cc"
221 #include "faust/gxamp7.cc"
222 #include "faust/gxamp8.cc"
223 #include "faust/gxamp9.cc"
170224 #include "faust/gxamp10.cc"
225 #include "faust/gxamp11.cc"
171226 #include "faust/gxamp12.cc"
227 #include "faust/gxamp13.cc"
172228 #include "faust/gx_ampmodul.cc"
173229 }
174230
176232 namespace gx_effects {
177233 // foreign variable added to faust module feed
178234 // it's set in process_buffers()
179 namespace noisegate { float ngate = 1; } // noise-gate, modifies output gain
180 static struct CabParams { CabParams(); } CabParams;
235 namespace noisegate { float ngate = 1;} // noise-gate, modifies output gain
236
237 static struct CabParams { CabParams();}
238 CabParams;
181239 CabParams::CabParams() {
182 registerVar("cab.Level","","S","",&audio.cab_level, 1.0, 0.5, 5.0, 0.5);
183 registerVar("cab.bass","","S","",&audio.cab_bass, 0.0, -10.0, 10.0, 0.5);
184 registerVar("cab.treble","","S","",&audio.cab_treble, 0.0, -10.0, 10.0, 0.5);
240 registerVar("cab.Level", "", "S", "", &audio.cab_level, 1.0, 0.5, 5.0, 0.5);
241 registerVar("cab.bass", "", "S", "", &audio.cab_bass, 0.0, -10.0, 10.0, 0.5);
242 registerVar("cab.treble", "", "S", "", &audio.cab_treble, 0.0, -10.0, 10.0, 0.5);
185243 }
186244
187245 #include "faust/bassbooster.cc"
221279 #include "cabinet_impulse_former.cc"
222280 }
223281
282 // init cabinet impulse former to 48000 Hz, the buffer will resampled
283 // afterwards whe needed.
224284 void init_non_rt_processing() {
225 gx_effects::cabinet_impulse_former::init(48000);
285 gx_effects::cabinet_impulse_former::init(48000);
226286 }
227287
228288 void non_rt_processing(int count, float* input, float* output0) {
229 gx_effects::cabinet_impulse_former::compute(count,input,output0);
289 gx_effects::cabinet_impulse_former::compute(count, input, output0);
230290 }
231291
232292 // tone stack
233 static struct ToneStackParams { ToneStackParams(); } ToneStackParams;
293
294
295 namespace gx_tonestacks {
296
297 static struct ToneStackParams { ToneStackParams(); }
298 ToneStackParams;
234299 ToneStackParams::ToneStackParams() {
235 static FAUSTFLOAT v1, v2, v3;
236 registerVar("amp.tonestack.Treble","","S","",&v1, 0.5, 0.0, 1.0, 0.01);
237 registerVar("amp.tonestack.Bass", "","S","",&v2, 0.5, 0.0, 1.0, 0.01);
238 registerVar("amp.tonestack.Middle","","S","",&v3, 0.5, 0.0, 1.0, 0.01);
239 }
240
241 namespace gx_tonestacks {
300 static FAUSTFLOAT v1, v2, v3;
301 registerVar("amp.tonestack.Treble", "", "S", "", &v1, 0.5, 0.0, 1.0, 0.01);
302 registerVar("amp.tonestack.Bass", "", "S", "", &v2, 0.5, 0.0, 1.0, 0.01);
303 registerVar("amp.tonestack.Middle", "", "S", "", &v3, 0.5, 0.0, 1.0, 0.01);
304 }
305
242306 #include "faust/tonestack_default.cc"
243307 #include "faust/tonestack_bassman.cc"
244308 #include "faust/tonestack_twin.cc"
258322 #include "faust/tonestack_ampeg.cc"
259323 }
260324
261 static void activate_callback(float val, void *data)
262 {
263 ((void (*)(bool,int))data)(!(val == 0.0), gx_jack::jack_sr);
264 }
265
266 static void faust_add_callback(const char* id, void (*func)(bool,int))
267 {
268 new gx_ui::GxUiCallbackItemFloat(gx_gui::GxMainInterface::instance(),
269 (float*)gx_gui::parameter_map[id].zone(),
270 activate_callback, (void*)func);
271 }
272
273 void faust_init(int samplingFreq)
274 {
275 //faust_add_callback("SampleLooper.on_off", sloop::activate);
276 faust_add_callback("delay.on_off", gx_effects::delay::activate);
277 faust_add_callback("echo.on_off", gx_effects::echo::activate);
278 faust_add_callback("chorus.on_off", gx_effects::chorus::activate);
279 faust_add_callback("chorus_mono.on_off", gx_effects::chorus::activate);
280 faust_add_callback("stereodelay.on_off", gx_effects::stereodelay::activate);
281 faust_add_callback("stereoecho.on_off", gx_effects::stereoecho::activate);
282 list<inidef>& inilist = get_inilist();
283 for (list<inidef>::iterator i = inilist.begin(); i != inilist.end(); i++) {
284 try {
285 i->func(samplingFreq);
286 } catch (bad_alloc) {
287 string name = gx_gui::param_group(i->name, true);
288 gx_system::gx_print_error("DSP Module", (boost::format("not enough memory to initialize module %1%") % i->name).str());
289 }
290 }
291 }
292
325 /****************************************************************
326 ** free memory when effects are unused, load with jack_sync
327 */
328
329 static void activate_callback(float val, void *data) {
330 ((void (*)(bool, int))data)(!(val == 0.0), gx_jack::gxjack.jack_sr);
331 }
332
333 static void faust_add_callback(const char* id, void (*func)(bool, int)) {
334 new gx_ui::GxUiCallbackItemFloat(gx_gui::GxMainInterface::instance(),
335 reinterpret_cast<float*>(gx_gui::parameter_map[id].zone()),
336 activate_callback, reinterpret_cast<void*>(func));
337 }
338
339 void faust_init(int samplingFreq) {
340 // faust_add_callback("SampleLooper.on_off", sloop::activate);
341 faust_add_callback("delay.on_off", gx_effects::delay::activate);
342 faust_add_callback("echo.on_off", gx_effects::echo::activate);
343 faust_add_callback("chorus.on_off", gx_effects::chorus::activate);
344 faust_add_callback("chorus_mono.on_off", gx_effects::chorus::activate);
345 faust_add_callback("stereodelay.on_off", gx_effects::stereodelay::activate);
346 faust_add_callback("stereoecho.on_off", gx_effects::stereoecho::activate);
347 list<inidef>& inilist = get_inilist();
348 for (list<inidef>::iterator i = inilist.begin(); i != inilist.end(); i++) {
349 try {
350 i->func(samplingFreq);
351 } catch(bad_alloc) {
352 string name = gx_gui::param_group(i->name, true);
353 gx_system::gx_print_error("DSP Module", (boost::format
354 ("not enough memory to initialize module %1%") % i->name).str());
355 }
356 }
357 }
358
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * --------------------------------------------------------------------------
1718 *
1819 * This is the gx_head global variable definitions for all namespaces
2021 * --------------------------------------------------------------------------
2122 */
2223
23 #include "guitarix.h"
24 #include <glibmm/i18n.h>
24 #include "guitarix.h" // NOLINT
25 #include <glibmm/i18n.h> // NOLINT
26
27 #include <string> // NOLINT
28 #include <vector> // NOLINT
2529
2630 /* ------------------------------------------------------------------------- */
2731
2832 /* ----- main engine ----- */
29 namespace gx_engine
30 {
33 namespace gx_engine {
3134 GxEngineState checky = kEngineOn;
3235 float* get_frame = NULL;
3336 float* get_frame1 = NULL;
3437 float* checkfreq = NULL;
3538 float* oversample = NULL;
36 float* result = NULL ;
39 float* result = NULL;
3740
3841 /* latency warning switch */
3942 float fwarn;
4750
4851 /* buffer ready state */
4952 bool buffers_ready = false;
50
5153 }
5254
5355
5456 /* ------------------------------------------------------------------------- */
5557
5658 /* ----- jack namespace ----- */
57 namespace gx_jack
58 {
59 const int nIPorts = 3; // mono input + jconv
60 const int nOPorts = 4; // stereo output + jconv
59 namespace gx_jack {
60
6161 int NO_CONNECTION = 1;
6262
63 /* variables */
64 jack_nframes_t jack_sr; // jack sample rate
65 jack_nframes_t jack_bs; // jack buffer size
66 float jcpu_load; // jack cpu_load
67 float xdel; // last xrun delay
68 int is_rt;
69
70 jack_client_t* client ;
71 jack_client_t* client_insert ;
72 jack_port_t* output_ports[nOPorts];
73 jack_port_t* input_ports [nIPorts];
7463 void* midi_input_port_buf;
7564 void* midi_port_buf;
76
77 jack_port_t* midi_input_port;
78
79 jack_port_t* midi_output_ports;
80 jack_nframes_t time_is;
8165
8266 bool jack_is_down = false;
8367 bool jack_is_exit = false;
8468 GxJackLatencyChange change_latency;
8569
86 #ifdef USE_RINGBUFFER
87 struct MidiMessage ev;
88 jack_ringbuffer_t* jack_ringbuffer;
89 #endif
90
9170 string client_name = "gx_head_amp";
9271 string client_insert_name = "gx_head_fx";
9372 string client_instance = "gx_head";
9473
9574 string client_out_graph = "";
9675
97 string gx_port_names[] =
98 {
76 string gx_port_names[] = {
9977 "in_0",
10078 "out_0",
10179 "out_1",
10280 "midi_in_1",
10381 "out_3"
10482 };
105
10683 }
10784
10885 /* ------------------------------------------------------------------------- */
10986
11087 /* ----- system namespace ----- */
111 namespace gx_system
112 {
88 namespace gx_system {
11389 /* variables and constants */
11490 const int SYSTEM_OK = 0;
91
92 bool is_session = false;
11593
11694 string rcpath;
11795
12098 const char* jcapfile_wavbase = "gx_head_session";
12199
122100 const string gx_pixmap_dir = string(GX_PIXMAPS_DIR) + "/";
123 const string gx_user_dir = string(getenv ("HOME")) + string("/") + string(gx_head_dir) + "/";
101 const string gx_user_dir = string(getenv("HOME")) + string("/") + string(gx_head_dir) + "/";
124102
125103 string gx_style_dir = string(GX_STYLE_DIR1) + "/";
126104 string gx_builder_dir = string(GX_BUILDER_DIR1) + "/";
127105
128106 /* shell variable names */
129 const char* shell_var_name[] =
130 {
107 const char* shell_var_name[] = {
131108 "GUITARIX2JACK_INPUTS",
132109 "GUITARIX2JACK_OUTPUTS1",
133110 "GUITARIX2JACK_OUTPUTS2",
142119 /* ------------------------------------------------------------------------- */
143120
144121 /* ----- preset namespace ----- */
145 namespace gx_preset
146 {
122 namespace gx_preset {
147123 /* global var declarations */
148124
149125 gx_gui::FileParameter gx_preset_file("system.current_preset_file");
150126 gx_gui::FileParameter gx_factory_preset_file("system.factory_preset_file");
151127
152 GdkModifierType list_mod[] =
153 {
128 GdkModifierType list_mod[] = {
154129 GDK_NO_MOD_MASK,
155130 GDK_CONTROL_MASK,
156131 GDK_MOD1_MASK,
157132 GdkModifierType(GDK_CONTROL_MASK|GDK_MOD1_MASK)
158133 };
159134
160 const char* preset_accel_path[] =
161 {
135 const char* preset_accel_path[] = {
162136 "<gx_head>/Load",
163137 "<gx_head>/Save",
164138 "<gx_head>/Rename",
165139 "<gx_head>/Delete"
166140 };
167141
168 const char* preset_menu_name[] =
169 {
142 const char* preset_menu_name[] = {
170143 N_("_Load Preset..."),
171144 N_("_Save Preset..."),
172145 N_("_Rename Preset..."),
173146 N_("_Delete Preset...")
174147 };
175148
176 //map<GtkMenuItem*, string> preset_list[GX_NUM_OF_PRESET_LISTS];
177
178149 string gx_current_preset;
179150 string gx_factory_preset;
180151 string old_preset_name;
195166 bool setting_is_preset = false;
196167 bool setting_is_factory = false;
197168
198 GCallback preset_action_func[] =
199 {
169 GCallback preset_action_func[] = {
200170 G_CALLBACK(gx_load_preset),
201171 G_CALLBACK(gx_save_oldpreset),
202172 G_CALLBACK(gx_rename_preset_dialog),
207177 /* ------------------------------------------------------------------------- */
208178
209179 /* ----- GUI namespace ----- */
210 namespace gx_gui
211 {
212
213 /* global GUI widgets */
214 GtkWidget* fWindow;
215 GtkWidget* menuh;
216 GtkWidget* midibox;
217 GtkWidget* patch_info;
218 GtkWidget* tuner_widget;
219 GtkWidget* rack_widget;
220 GtkWidget* srack_widget;
221 GtkWidget* menu_mono_rack;
222 GtkWidget* menu_stereo_rack;
223 GtkWidget* rack_tool_bar;
224
225 /* icon widgets */
226 GdkPixbuf* ib;
227 GdkPixbuf* ibm;
228 GdkPixbuf* ibr;
229
230 /* jack server status icons */
231 GtkWidget* gx_jackd_on_image;
232 GtkWidget* gx_jackd_off_image;
233
234 /* engine status images */
235 GtkWidget* gx_engine_on_image;
236 GtkWidget* gx_engine_off_image;
237 GtkWidget* gx_engine_bypass_image;
238 GtkWidget* gx_engine_item;
239
240 GtkStatusIcon* status_icon;
180 namespace gx_gui {
241181
242182 int showwave = 0;
243183 int shownote = -1;
244184 float show_patch_info = 0;
245
246 /* skin handling */
247 vector<string> skin_list;
248 gint gx_current_skin = 0;
249 int last_skin = 0;
250 int no_opt_skin = 0;
251 int set_knob = 0;
252185
253186 /* rack handlig */
254187 int mono_plugs = 1;
255188 int stereo_plugs = 1;
256189 int refresh_size = 0;
257190
258 int g_threads[10]={0,0,0,0,0,0,0,0,0,0};
191 int g_threads[10]= {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
259192
260193 /* for level display */
261194 int meter_falloff = 27; // in dB/sec.
268201 /* widget orientation */
269202 float main_xorg;
270203 float main_yorg;
271
272204 }
273205
274206 /* ------------------------------------------------------------------------- */
275207
276208 /* ----- cairo namespace ----- */
277 namespace gx_cairo
278 {
209 namespace gx_cairo {
279210 GdkPixbuf *tribeimage;
280211 GdkPixbuf *tribeimage1;
281212 GdkPixbuf *tribeimage2;
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * ---------------------------------------------------------------------------
1718 *
1819 * This is the gx_head GUI related functionality
2021 * ----------------------------------------------------------------------------
2122 */
2223
23 #include <cstring>
24 #include <dirent.h>
25 #include "guitarix.h"
26 #include <unistd.h>
27 #include <glibmm/i18n.h>
28
29 using namespace gx_system;
30 using namespace gx_preset;
31 using namespace gx_cairo;
24 #include "guitarix.h" // NOLINT
25
26 #include <dirent.h> // NOLINT
27 #include <unistd.h> // NOLINT
28 #include <glibmm/i18n.h> // NOLINT
29
30 #include <cstring> // NOLINT
31 #include <algorithm> // NOLINT
32 #include <string> // NOLINT
33 #include <iostream> // NOLINT
34
3235
3336 /* --------------------------- gx_gui namespace ------------------------ */
34 namespace gx_gui
35 {
36
37 //#include "gx_cabinet_data.cc"
37 namespace gx_gui {
3838
3939 /* ----- Menu check item signaled from parameter ------ */
4040
41 void MenuCheckItem::on_my_activate()
42 {
43 param->set(get_active());
44 }
45
46 SwitchParameter* MenuCheckItem::get_parameter()
47 {
48 return param;
49 }
50
51 void MenuCheckItem::set_parameter(SwitchParameter *p)
52 {
53 param = p;
54 parameter_map.insert(p);
55 p->changed.connect(sigc::mem_fun(*this, &MenuCheckItem::set_active));
56 signal_activate().connect(
57 sigc::mem_fun(*this, &MenuCheckItem::on_my_activate));
58 }
59
60 void MenuCheckItem::add_parameter(SwitchParameter *p)
61 {
62 param = p;
63 p->changed.connect(sigc::mem_fun(*this, &MenuCheckItem::set_active));
64 signal_activate().connect(
65 sigc::mem_fun(*this, &MenuCheckItem::on_my_activate));
66 }
67
68 void RadioCheckItem::on_my_toggled()
69 {
70 param->set(get_active());
71 }
72
73 SwitchParameter* RadioCheckItem::get_parameter()
74 {
75 return param;
76 }
77
78 void RadioCheckItem::set_parameter(SwitchParameter *p)
79 {
80 param = p;
81 parameter_map.insert(p);
82 p->changed.connect(sigc::mem_fun(*this, &RadioCheckItem::set_active));
83 signal_activate().connect(
84 sigc::mem_fun(*this, &RadioCheckItem::on_my_toggled));
41 void MenuCheckItem::on_my_activate() {
42 param->set(get_active());
43 }
44
45 SwitchParameter* MenuCheckItem::get_parameter() {
46 return param;
47 }
48
49 void MenuCheckItem::set_parameter(SwitchParameter *p) {
50 param = p;
51 parameter_map.insert(p);
52 p->changed.connect(sigc::mem_fun(*this, &MenuCheckItem::set_active));
53 signal_activate().connect(
54 sigc::mem_fun(*this, &MenuCheckItem::on_my_activate));
55 }
56
57 void MenuCheckItem::add_parameter(SwitchParameter *p) {
58 param = p;
59 p->changed.connect(sigc::mem_fun(*this, &MenuCheckItem::set_active));
60 signal_activate().connect(
61 sigc::mem_fun(*this, &MenuCheckItem::on_my_activate));
62 }
63
64 void RadioCheckItem::on_my_toggled() {
65 param->set(get_active());
66 }
67
68 SwitchParameter* RadioCheckItem::get_parameter() {
69 return param;
70 }
71
72 void RadioCheckItem::set_parameter(SwitchParameter *p) {
73 param = p;
74 parameter_map.insert(p);
75 p->changed.connect(sigc::mem_fun(*this, &RadioCheckItem::set_active));
76 signal_activate().connect(
77 sigc::mem_fun(*this, &RadioCheckItem::on_my_toggled));
8578 }
8679
8780 /* ----- load a top level window from gtk builder file ------ */
8881
89 GtkWidget *load_toplevel(GtkBuilder *builder, const char* filename, const char* windowname)
90 {
91 string fname = gx_builder_dir+filename;
92 GError *err = NULL;
93 if (!gtk_builder_add_from_file(builder,fname.c_str(), &err)) {
94 g_object_unref(G_OBJECT(builder));
95 gx_print_fatal(_("gtk builder"), err->message);
96 g_error_free(err);
97 return NULL;
98 }
99 GtkWidget *w = GTK_WIDGET(gtk_builder_get_object(builder, windowname));
100 if (!w) {
101 g_object_unref(G_OBJECT(builder));
102 gx_print_fatal(_("gtk builder"), string(windowname)+_(" not found in ")+fname);
103 return NULL;
104 }
105 gtk_builder_connect_signals(builder, 0);
106 return w;
82 GtkWidget *load_toplevel(GtkBuilder *builder, const char* filename, const char* windowname) {
83 string fname = gx_system::gx_builder_dir+filename;
84 GError *err = NULL;
85 if (!gtk_builder_add_from_file(builder, fname.c_str(), &err)) {
86 g_object_unref(G_OBJECT(builder));
87 gx_system::gx_print_fatal(_("gtk builder"), err->message);
88 g_error_free(err);
89 return NULL;
90 }
91 GtkWidget *w = GTK_WIDGET(gtk_builder_get_object(builder, windowname));
92 if (!w) {
93 g_object_unref(G_OBJECT(builder));
94 gx_system::gx_print_fatal(_("gtk builder"), string(windowname)+_(" not found in ")+fname);
95 return NULL;
96 }
97 gtk_builder_connect_signals(builder, 0);
98 return w;
10799 }
108100
109101 /* --------- menu function triggering engine on/off/bypass --------- */
110 void gx_engine_switch (GtkWidget* widget, gpointer arg)
111 {
112 gx_engine::GxEngineState estate = gx_engine::checky;
113
114 switch (estate)
115 {
116 case gx_engine::kEngineOn:
117 estate = gx_engine::kEngineOff;
118 if (arg)
119 {
120 // need to activate item
121 gtk_check_menu_item_set_active(
122 GTK_CHECK_MENU_ITEM(gx_engine_item), TRUE
123 );
124 estate = gx_engine::kEngineBypass;
125 }
126
127 break;
128
129 case gx_engine::kEngineOff:
130 if (!arg)
131 estate = gx_engine::kEngineOn;
132 break;
133
134 default:
135 estate = gx_engine::kEngineOn;
136 gtk_check_menu_item_set_active(
137 GTK_CHECK_MENU_ITEM(gx_engine_item), TRUE
138 );
139 }
140
141 gx_engine::checky = estate;
142 gx_refresh_engine_status_display();
102 void gx_engine_switch(GtkWidget* widget, gpointer arg) {
103 gx_engine::GxEngineState estate = gx_engine::checky;
104
105 switch (estate) {
106 case gx_engine::kEngineOn:
107 estate = gx_engine::kEngineOff;
108 if (arg) {
109 // need to activate item
110 gtk_check_menu_item_set_active(
111 GTK_CHECK_MENU_ITEM(gw.gx_engine_item), TRUE
112 );
113 estate = gx_engine::kEngineBypass;
114 }
115
116 break;
117
118 case gx_engine::kEngineOff:
119 if (!arg)
120 estate = gx_engine::kEngineOn;
121 break;
122
123 default:
124 estate = gx_engine::kEngineOn;
125 gtk_check_menu_item_set_active(
126 GTK_CHECK_MENU_ITEM(gw.gx_engine_item), TRUE
127 );
128 }
129
130 gx_engine::checky = estate;
131 gx_refresh_engine_status_display();
143132 }
144133
145134 /* -------------- refresh engine status display ---------------- */
146 void gx_refresh_engine_status_display()
147 {
148 gx_engine::GxEngineState estate = gx_engine::checky;
149
150 string state;
151
152 switch (estate)
153 {
154
155 case gx_engine::kEngineOff:
156 gtk_widget_show(gx_engine_off_image);
157 gtk_widget_hide(gx_engine_on_image);
158 gtk_widget_hide(gx_engine_bypass_image);
159
160 gtk_check_menu_item_set_active(
161 GTK_CHECK_MENU_ITEM(gx_engine_item), FALSE
162 );
163 state = "OFF";
164 break;
165
166 case gx_engine::kEngineBypass:
167 gtk_widget_show(gx_engine_bypass_image);
168 gtk_widget_hide(gx_engine_off_image);
169 gtk_widget_hide(gx_engine_on_image);
170
171 gtk_check_menu_item_set_active(
172 GTK_CHECK_MENU_ITEM(gx_gui::gx_engine_item), TRUE
173 );
174 state = "BYPASSED";
175 break;
176
177 case gx_engine::kEngineOn:
178 default: // ON
179 gtk_widget_show(gx_engine_on_image);
180 gtk_widget_hide(gx_engine_off_image);
181 gtk_widget_hide(gx_engine_bypass_image);
182
183 gtk_check_menu_item_set_active(
184 GTK_CHECK_MENU_ITEM(gx_gui::gx_engine_item), TRUE
185 );
186 state = "ON";
187 }
188
189 gx_print_info(_("Engine State: "), state);
135 void gx_refresh_engine_status_display() {
136 gx_engine::GxEngineState estate = gx_engine::checky;
137
138 string state;
139
140 switch (estate) {
141
142 case gx_engine::kEngineOff:
143 gtk_widget_show(gw.gx_engine_off_image);
144 gtk_widget_hide(gw.gx_engine_on_image);
145 gtk_widget_hide(gw.gx_engine_bypass_image);
146
147 gtk_check_menu_item_set_active(
148 GTK_CHECK_MENU_ITEM(gw.gx_engine_item), FALSE
149 );
150 state = "OFF";
151 break;
152
153 case gx_engine::kEngineBypass:
154 gtk_widget_show(gw.gx_engine_bypass_image);
155 gtk_widget_hide(gw.gx_engine_off_image);
156 gtk_widget_hide(gw.gx_engine_on_image);
157
158 gtk_check_menu_item_set_active(
159 GTK_CHECK_MENU_ITEM(gx_gui::gw.gx_engine_item), TRUE
160 );
161 state = "BYPASSED";
162 break;
163
164 case gx_engine::kEngineOn:
165 default: // ON
166 gtk_widget_show(gw.gx_engine_on_image);
167 gtk_widget_hide(gw.gx_engine_off_image);
168 gtk_widget_hide(gw.gx_engine_bypass_image);
169
170 gtk_check_menu_item_set_active(
171 GTK_CHECK_MENU_ITEM(gx_gui::gw.gx_engine_item), TRUE
172 );
173 state = "ON";
174 }
175
176 gx_system::gx_print_info(_("Engine State: "), state);
190177 }
191178
192179
193180 // get the last used skin as default
194 void gx_set_skin_change(float fskin)
195 {
196 last_skin = int(fskin);
181 void gx_set_skin_change(float fskin) {
182 skin.last_skin = static_cast<int>(fskin);
197183 }
198184
199185 // save the current used skin as default
200 void gx_get_skin_change(float *fskin)
201 {
202 *fskin = float(gx_current_skin);
203 }
204
205 void gx_jack_is_down()
206 {
207 /* FIXME send to ui thread
208 gx_print_warning("Jack Shutdown",
209 "jack has bumped us out!!");
210 */
211 cout << _("jack has bumped us out!!") << endl;
212 g_timeout_add_full(G_PRIORITY_LOW,200, gx_threads::gx_survive_jack_shutdown, 0, NULL);
213 }
214
215 void gx_jack_report_xrun()
216 {
217 g_threads[2] = 0;
218 if (g_threads[2] == 0 ||g_main_context_find_source_by_id(NULL, g_threads[2]) == NULL)
219 g_threads[2] =g_idle_add(gx_threads::gx_xrun_report,gpointer (NULL));
220 }
221
222 //----menu function gx_show_oscilloscope
223 void GxMainInterface::on_show_oscilloscope()
224 {
225 if (fShowWaveView.get_active()) {
226 showwave = 1; //FIXME just use is_visible
227 Glib::signal_timeout().connect(sigc::mem_fun(*this, &GxMainInterface::on_refresh_oscilloscope), 60); //FIXME G_PRIORITY_DEFAULT_IDLE??
228 //g_timeout_add_full(G_PRIORITY_DEFAULT_IDLE, 60, gx_threads::gx_refresh_oscilloscope, 0, NULL);
229 fWaveView.get_parent()->show(); //FIXME why??
230 if (gx_engine::audio.wvpp) fWaveView.set_multiplicator(150.,250);
231 else fWaveView.set_multiplicator(20.,60);
232 fWaveView.show();
233 } else {
234 showwave = 0;
235 fWaveView.get_parent()->hide();
236 fWaveView.show(); //FIXME why??
237 }
186 void gx_get_skin_change(float *fskin) {
187 *fskin = static_cast<float>(skin.gx_current_skin);
188 }
189
190 void gx_jack_is_down() {
191 /* FIXME send to ui thread
192 gx_print_warning("Jack Shutdown",
193 "jack has bumped us out!!");
194 */
195 std::cout << _("jack has bumped us out!!") << endl;
196 g_timeout_add_full(G_PRIORITY_LOW, 200, gx_threads::gx_survive_jack_shutdown, 0, NULL);
197 }
198
199 void gx_jack_report_xrun() {
200 g_threads[2] = 0;
201 if (g_threads[2] == 0 ||g_main_context_find_source_by_id(NULL, g_threads[2]) == NULL)
202 g_threads[2] =g_idle_add(gx_threads::gx_xrun_report, gpointer(NULL));
203 }
204
205 // ----menu function gx_show_oscilloscope
206 void GxMainInterface::on_show_oscilloscope() {
207 if (fShowWaveView.get_active()) {
208 showwave = 1; // FIXME just use is_visible
209 Glib::signal_timeout().connect(sigc::mem_fun(*this,
210 &GxMainInterface::on_refresh_oscilloscope), 60); // FIXME G_PRIORITY_DEFAULT_IDLE??
211 fWaveView.get_parent()->show(); // FIXME why??
212 if (gx_engine::audio.effect_pre_post[10]) fWaveView.set_multiplicator(150., 250);
213 else
214 fWaveView.set_multiplicator(20., 60);
215 fWaveView.show();
216 } else {
217 showwave = 0;
218 fWaveView.get_parent()->hide();
219 fWaveView.show(); // FIXME why??
220 }
238221 }
239222
240223 // show loggingbox
241224 void GxMainInterface::on_log_activate() {
242 if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(fShowLogger.gobj())) == TRUE) {
243 gint rxorg,ryorg ;
244 gtk_window_get_position (GTK_WINDOW(fWindow), &rxorg, &ryorg);
245 gtk_window_move(GTK_WINDOW(logger), rxorg+5, ryorg+272);
246 gtk_widget_show_all(GTK_WIDGET(logger));
247 } else {
248 gtk_widget_hide(GTK_WIDGET(logger));
249 }
250
251 }
252
253 //----menu function gx_tuner
254 void gx_patch(GtkCheckMenuItem *menuitem, gpointer checkplay)
255 {
256 gtk_widget_show_all(patch_info);
257 }
258
259 //---- menu function gx_midi_out
260 void gx_log_window (GtkWidget* menuitem, gpointer arg)
261 {
262 GtkExpander* const exbox = GxMainInterface::instance()->getLoggingBox();
263
264 // we could be called before UI is built up
265 if (!exbox) return;
266
267 bool expanded = gtk_expander_get_expanded(exbox);
268 bool checked = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem));
269 if (!(expanded ^ checked)) {
270 return;
271 }
272 gtk_signal_emit_by_name(GTK_OBJECT(exbox), "activate");
273 }
274
275 //----menu funktion about
276 void gx_show_about( GtkWidget *widget, gpointer data )
277 {
278 static string about;
279 if (about.empty())
280 {
281 about +=
282 _("\n This Aplication is to a large extent provided"
283 "\n with the marvelous faust compiler.Yann Orlary"
284 "\n <http://faust.grame.fr/>"
285 "\n A large part is based on the work of Julius Orion Smith"
286 "\n <http://ccrma.stanford.edu/realsimple/faust/>"
287 "\n and Albert Graef\n <http://www.musikwissenschaft.uni-mainz.de/~ag/ag.html> "
288 "\n\n\n gx_head ");
289
290 about += GX_VERSION;
291
292 about +=
293 _("\n for impulse response it use zita-convolver "
294 "\n byFons Adriaensen "
295 "\n http://www.kokkinizita.net/linuxaudio/index.html "
296 "\n\n authors: Hermann Meyer <brummer-@web.de>"
297 "\n authors: James Warden <warjamy@yahoo.com>"
298 "\n authors: Andreas Degert <andreas.degert@googlemail.com> "
299 "\n authors: Pete Shorthose <pshorthose@gmail.com> "
300 "\n home: http://guitarix.sourceforge.net/\n");
301 }
302
303 gx_message_popup(about.c_str());
304 }
305
306
307 //----- change the jack buffersize on the fly is still experimental, give a warning
308 gint gx_wait_latency_warn()
309 {
310 GtkWidget* warn_dialog = gtk_dialog_new();
311 gtk_window_set_destroy_with_parent(GTK_WINDOW(warn_dialog), TRUE);
312
313 GtkWidget* box = gtk_vbox_new (0, 4);
314 GtkWidget* labelt = gtk_label_new(_("\nWARNING\n"));
315 GtkWidget* labelt1 = gtk_label_new(_("CHANGING THE JACK_BUFFER_SIZE ON THE FLY \n"
316 "MAY CAUSE UNPREDICTABLE EFFECTS \n"
317 "TO OTHER RUNNING JACK APPLICATIONS. \n"
318 "DO YOU WANT TO PROCEED ?"));
319 GdkColor colorGreen;
320 gdk_color_parse("#969292", &colorGreen);
321 gtk_widget_modify_fg (labelt1, GTK_STATE_NORMAL, &colorGreen);
322
323 GtkStyle *style1 = gtk_widget_get_style(labelt1);
324 pango_font_description_set_size(style1->font_desc, 10*PANGO_SCALE);
325 pango_font_description_set_weight(style1->font_desc, PANGO_WEIGHT_BOLD);
326 gtk_widget_modify_font(labelt1, style1->font_desc);
327
328 gdk_color_parse("#ffffff", &colorGreen);
329 gtk_widget_modify_fg (labelt, GTK_STATE_NORMAL, &colorGreen);
330 style1 = gtk_widget_get_style(labelt);
331 pango_font_description_set_size(style1->font_desc, 14*PANGO_SCALE);
332 pango_font_description_set_weight(style1->font_desc, PANGO_WEIGHT_BOLD);
333 gtk_widget_modify_font(labelt, style1->font_desc);
334
335 GtkWidget* button1 =
336 gtk_dialog_add_button(GTK_DIALOG (warn_dialog),
337 _("Yes"), gx_jack::kChangeLatency);
338
339 GtkWidget* button2 =
340 gtk_dialog_add_button(GTK_DIALOG (warn_dialog),
341 _("No"), gx_jack::kKeepLatency);
342
343
344 GtkWidget* box1 = gtk_hbox_new (0, 4);
345 GtkWidget* box2 = gtk_hbox_new (0, 4);
346
347 GtkWidget* disable_warn = gtk_check_button_new();
348 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(disable_warn), FALSE);
349 g_signal_connect(disable_warn, "clicked",
350 G_CALLBACK(gx_user_disable_latency_warn), NULL);
351
352 GtkWidget * labelt2 =
353 gtk_label_new (_("Don't bother me again with such a question, "
354 "I know what I am doing"));
355
356 gtk_container_add (GTK_CONTAINER(box), labelt);
357 gtk_container_add (GTK_CONTAINER(box), labelt1);
358 gtk_container_add (GTK_CONTAINER(box), box2);
359 gtk_container_add (GTK_CONTAINER(box), box1);
360 gtk_container_add (GTK_CONTAINER(box1), disable_warn);
361 gtk_container_add (GTK_CONTAINER(box1), labelt2);
362 gtk_container_add (GTK_CONTAINER(GTK_DIALOG(warn_dialog)->vbox), box);
363
364 gtk_widget_modify_fg (labelt2, GTK_STATE_NORMAL, &colorGreen);
365
366 GtkStyle *style = gtk_widget_get_style(labelt2);
367 pango_font_description_set_size(style->font_desc, 8*PANGO_SCALE);
368 pango_font_description_set_weight(style->font_desc, PANGO_WEIGHT_NORMAL);
369 gtk_widget_modify_font(labelt2, style->font_desc);
370
371 g_signal_connect_swapped(button1, "clicked",
372 G_CALLBACK (gtk_widget_destroy), warn_dialog);
373 g_signal_connect_swapped(button2, "clicked",
374 G_CALLBACK (gtk_widget_destroy), warn_dialog);
375
376 gtk_widget_show_all(box);
377
378 return gtk_dialog_run (GTK_DIALOG (warn_dialog));
225 if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(fShowLogger.gobj())) == TRUE) {
226 gint rxorg, ryorg;
227 gtk_window_get_position(GTK_WINDOW(gw.fWindow), &rxorg, &ryorg);
228 gtk_window_move(GTK_WINDOW(logger), rxorg+5, ryorg+272);
229 gtk_widget_show_all(GTK_WIDGET(logger));
230 } else {
231 gtk_widget_hide(GTK_WIDGET(logger));
232 }
233 }
234
235 // ----menu function oatch info widget
236 void gx_patch(GtkCheckMenuItem *menuitem, gpointer checkplay) {
237 gtk_widget_show_all(gw.patch_info);
238 }
239
240 // ---- menu function logging widget
241 void gx_log_window(GtkWidget* menuitem, gpointer arg) {
242 GtkExpander* const exbox = GxMainInterface::instance()->getLoggingBox();
243
244 // we could be called before UI is built up
245 if (!exbox) return;
246
247 bool expanded = gtk_expander_get_expanded(exbox);
248 bool checked = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem));
249 if (!(expanded ^ checked)) {
250 return;
251 }
252 gtk_signal_emit_by_name(GTK_OBJECT(exbox), "activate");
253 }
254
255 // ----menu funktion about
256 void gx_show_about(GtkWidget *widget, gpointer data ) {
257 static string about;
258 if (about.empty()) {
259 about +=
260 _("\n This Aplication is to a large extent provided"
261 "\n with the marvelous faust compiler.Yann Orlary"
262 "\n <http://faust.grame.fr/>"
263 "\n A large part is based on the work of Julius Orion Smith"
264 "\n <http://ccrma.stanford.edu/realsimple/faust/>"
265 "\n and Albert Graef\n <http://www.musikwissenschaft.uni-mainz.de/~ag/ag.html> "
266 "\n\n\n gx_head ");
267
268 about += GX_VERSION;
269
270 about +=
271 _("\n for impulse response it use zita-convolver "
272 "\n byFons Adriaensen "
273 "\n http://www.kokkinizita.net/linuxaudio/index.html "
274 "\n\n authors: Hermann Meyer <brummer-@web.de>"
275 "\n authors: James Warden <warjamy@yahoo.com>"
276 "\n authors: Andreas Degert <andreas.degert@googlemail.com> "
277 "\n authors: Pete Shorthose <pshorthose@gmail.com> "
278 "\n home: http://guitarix.sourceforge.net/\n");
279 }
280
281 gx_message_popup(about.c_str());
282 }
283
284
285 // ----- change the jack buffersize on the fly is still experimental, give a warning
286 gint gx_wait_latency_warn() {
287 GtkWidget* warn_dialog = gtk_dialog_new();
288 gtk_window_set_destroy_with_parent(GTK_WINDOW(warn_dialog), TRUE);
289
290 GtkWidget* box = gtk_vbox_new(0, 4);
291 GtkWidget* labelt = gtk_label_new(_("\nWARNING\n"));
292 GtkWidget* labelt1 = gtk_label_new(_("CHANGING THE JACK_BUFFER_SIZE ON THE FLY \n"
293 "MAY CAUSE UNPREDICTABLE EFFECTS \n"
294 "TO OTHER RUNNING JACK APPLICATIONS. \n"
295 "DO YOU WANT TO PROCEED ?"));
296 GdkColor colorGreen;
297 gdk_color_parse("#969292", &colorGreen);
298 gtk_widget_modify_fg(labelt1, GTK_STATE_NORMAL, &colorGreen);
299
300 GtkStyle *style1 = gtk_widget_get_style(labelt1);
301 pango_font_description_set_size(style1->font_desc, 10*PANGO_SCALE);
302 pango_font_description_set_weight(style1->font_desc, PANGO_WEIGHT_BOLD);
303 gtk_widget_modify_font(labelt1, style1->font_desc);
304
305 gdk_color_parse("#ffffff", &colorGreen);
306 gtk_widget_modify_fg(labelt, GTK_STATE_NORMAL, &colorGreen);
307 style1 = gtk_widget_get_style(labelt);
308 pango_font_description_set_size(style1->font_desc, 14*PANGO_SCALE);
309 pango_font_description_set_weight(style1->font_desc, PANGO_WEIGHT_BOLD);
310 gtk_widget_modify_font(labelt, style1->font_desc);
311
312 GtkWidget* button1 =
313 gtk_dialog_add_button(GTK_DIALOG(warn_dialog),
314 _("Yes"), gx_jack::kChangeLatency);
315
316 GtkWidget* button2 =
317 gtk_dialog_add_button(GTK_DIALOG(warn_dialog),
318 _("No"), gx_jack::kKeepLatency);
319
320
321 GtkWidget* box1 = gtk_hbox_new(0, 4);
322 GtkWidget* box2 = gtk_hbox_new(0, 4);
323
324 GtkWidget* disable_warn = gtk_check_button_new();
325 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(disable_warn), FALSE);
326 g_signal_connect(disable_warn, "clicked",
327 G_CALLBACK(gx_user_disable_latency_warn), NULL);
328
329 GtkWidget * labelt2 =
330 gtk_label_new(_("Don't bother me again with such a question, "
331 "I know what I am doing"));
332
333 gtk_container_add(GTK_CONTAINER(box), labelt);
334 gtk_container_add(GTK_CONTAINER(box), labelt1);
335 gtk_container_add(GTK_CONTAINER(box), box2);
336 gtk_container_add(GTK_CONTAINER(box), box1);
337 gtk_container_add(GTK_CONTAINER(box1), disable_warn);
338 gtk_container_add(GTK_CONTAINER(box1), labelt2);
339 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(warn_dialog)->vbox), box);
340
341 gtk_widget_modify_fg(labelt2, GTK_STATE_NORMAL, &colorGreen);
342
343 GtkStyle *style = gtk_widget_get_style(labelt2);
344 pango_font_description_set_size(style->font_desc, 8*PANGO_SCALE);
345 pango_font_description_set_weight(style->font_desc, PANGO_WEIGHT_NORMAL);
346 gtk_widget_modify_font(labelt2, style->font_desc);
347
348 g_signal_connect_swapped(button1, "clicked",
349 G_CALLBACK(gtk_widget_destroy), warn_dialog);
350 g_signal_connect_swapped(button2, "clicked",
351 G_CALLBACK(gtk_widget_destroy), warn_dialog);
352
353 gtk_widget_show_all(box);
354
355 return gtk_dialog_run(GTK_DIALOG(warn_dialog));
379356 }
380357
381358 // check user's decision to turn off latency change warning
382 void gx_user_disable_latency_warn(GtkWidget* wd, gpointer arg)
383 {
384 GtkToggleButton* button = GTK_TOGGLE_BUTTON(wd);
385 gx_engine::fwarn = (int)gtk_toggle_button_get_active(button);
386 }
387
388 void gx_reset_effects( GtkWidget *widget, gpointer data )
389 {
390 string pos(".position");
391 for (ParamMap::iterator i = parameter_map.begin(); i != parameter_map.end(); i++) {
392 string id = i->first;
393 if (id.size() > pos.size() &&
394 id.compare(id.size()-pos.size(), pos.size(), pos) == 0) {
395 i->second->set_std_value();
396 }
397 }
359 void gx_user_disable_latency_warn(GtkWidget* wd, gpointer arg) {
360 GtkToggleButton* button = GTK_TOGGLE_BUTTON(wd);
361 gx_engine::fwarn = static_cast<int>(gtk_toggle_button_get_active(button));
362 }
363
364 void gx_reset_effects(GtkWidget *widget, gpointer data ) {
365 string pos(".position");
366 for (ParamMap::iterator i = parameter_map.begin(); i != parameter_map.end(); i++) {
367 string id = i->first;
368 if (id.size() > pos.size() &&
369 id.compare(id.size()-pos.size(), pos.size(), pos) == 0) {
370 i->second->set_std_value();
371 }
372 }
398373 }
399374
400375 // reset the extended sliders to default settings
401 void gx_reset_units(Glib::ustring group_id)
402 {
403 group_id += ".";
404 string on_off = group_id + "on_off";
405 for (ParamMap::iterator i = parameter_map.begin(); i != parameter_map.end(); i++) {
406 if (i->first.compare(0, group_id.size(), group_id) == 0) {
407 if (i->second->isControllable()) {
408 string id = i->first;
409 if (i->first != on_off) {
410 i->second->set_std_value();
411 }
412 }
413 }
414 }
415 }
416
417 gboolean gx_set_resizeable(gpointer data)
418 {
419 if(!gtk_window_get_resizable(GTK_WINDOW (data)))
420 gtk_window_set_resizable(GTK_WINDOW (data) , TRUE);
421 return false;
422 }
423
424 gboolean gx_set_sresizeable(gpointer data)
425 {
426 if(!gtk_window_get_resizable(GTK_WINDOW (data)))
427 gtk_window_set_resizable(GTK_WINDOW (data) , FALSE);
428 return false;
429 }
430
431 gboolean gx_set_default(gpointer data)
432 {
433 gtk_widget_set_size_request (GTK_WIDGET (data),-1,-1 );
434
435 return false;
436 }
437
438 gboolean gx_set_default_size(gpointer data)
439 {
440 gtk_widget_set_size_request (GTK_WIDGET (data),-1, 440 );
441 return false;
442 }
443
444 gboolean gx_set_default_ssize(gpointer data)
445 {
446 gtk_widget_set_size_request (GTK_WIDGET (data),-1, 460 );
447 return false;
448 }
449
450 //----- show extendend settings slider
451 void gx_show_extended_settings(GtkWidget *widget, gpointer data)
452 {
453 gx_gui::GxMainInterface* gui = gx_gui::GxMainInterface::instance("gx_head");
454 if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)) == TRUE) {
455
456 GtkWidget *plug = gtk_widget_get_parent(GTK_WIDGET(data));
457 gtk_widget_show_all(GTK_WIDGET(plug));
458 GtkWidget *vbox = gtk_widget_get_parent(GTK_WIDGET(plug));
459 GtkWidget *box1 = gtk_widget_get_parent(GTK_WIDGET(vbox));
460 vbox = gtk_widget_get_parent(GTK_WIDGET(box1));
461 box1 = gtk_widget_get_parent(GTK_WIDGET(vbox));
462 vbox = gtk_widget_get_parent(GTK_WIDGET(box1));
463 box1 = gtk_widget_get_parent(GTK_WIDGET(vbox));
464
465 //if order is horizontal, force resize the rack widget width
466 if(strcmp(gtk_widget_get_name(GTK_WIDGET(box1)),"GtkViewport")==0) {
467 gtk_widget_hide(GTK_WIDGET(vbox));
468 if(gtk_window_get_resizable(GTK_WINDOW (fWindow)))
469 gtk_window_set_resizable(GTK_WINDOW (fWindow) , FALSE);
470 gtk_widget_show(GTK_WIDGET(vbox));
471
472 gtk_widget_set_size_request (GTK_WIDGET (gui->RBox),-1, 460 );
473 if (g_threads[7] == 0 || g_main_context_find_source_by_id(NULL, g_threads[7]) == NULL)
474 g_threads[7] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 40, gx_gui::gx_set_resizeable,gpointer(fWindow),NULL);
475 if (g_threads[6] == 0 || g_main_context_find_source_by_id(NULL, g_threads[6]) == NULL)
476 g_threads[6] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 50, gx_gui::gx_set_default,gpointer(gui->RBox),NULL);
477 }
478 } else {
479 GtkWidget *plug = gtk_widget_get_parent(GTK_WIDGET(data));
480 gtk_widget_hide(GTK_WIDGET(plug));
481 GtkWidget *vbox = gtk_widget_get_parent(GTK_WIDGET(plug));
482 GtkWidget *box1 = gtk_widget_get_parent(GTK_WIDGET(vbox));
483 vbox = gtk_widget_get_parent(GTK_WIDGET(box1));
484 box1 = gtk_widget_get_parent(GTK_WIDGET(vbox));
485 vbox = gtk_widget_get_parent(GTK_WIDGET(box1));
486 box1 = gtk_widget_get_parent(GTK_WIDGET(vbox));
487
488 //if order is horizontal, force resize the rack widget width
489 if(strcmp(gtk_widget_get_name(GTK_WIDGET(box1)),"GtkViewport")==0) {
490 gtk_widget_hide(GTK_WIDGET(vbox));
491 if(gtk_window_get_resizable(GTK_WINDOW (fWindow)))
492 gtk_window_set_resizable(GTK_WINDOW (fWindow) , FALSE);
493 gtk_widget_show(GTK_WIDGET(vbox));
494
495 gtk_widget_set_size_request (GTK_WIDGET (gui->RBox),-1, 460 );
496 if (g_threads[7] == 0 || g_main_context_find_source_by_id(NULL, g_threads[7]) == NULL)
497 g_threads[7] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 40, gx_gui::gx_set_resizeable,gpointer(fWindow),NULL);
498 if (g_threads[6] == 0 || g_main_context_find_source_by_id(NULL, g_threads[6]) == NULL)
499 g_threads[6] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 50, gx_gui::gx_set_default,gpointer(gui->RBox),NULL);
500 }
501 }
502 }
503
504 //----- show extendend settings slider
505 void gx_show_menu_settings(GtkWidget *widget, gpointer data)
506 {
507 // done by the button allready
508 /*if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)) == TRUE) {
509 if(refresh_size)refresh_size = 6;
510 gtk_widget_show_all(GTK_WIDGET(data));
511 GtkWidget *plug = gtk_widget_get_parent(GTK_WIDGET(data));
512 gtk_widget_show_all(GTK_WIDGET(plug));
513 GtkWidget *box2 = gtk_widget_get_parent(GTK_WIDGET(plug));
514 GtkWidget *box1 = gtk_widget_get_parent(GTK_WIDGET(box2));
515 box2 = gtk_widget_get_parent(GTK_WIDGET(box1));
516 GtkWidget *box3 = gtk_widget_get_parent(GTK_WIDGET(box2));
517
518 box2 = gtk_widget_get_parent(GTK_WIDGET(box3));
519 box1 = gtk_widget_get_parent(GTK_WIDGET(box2));*/
520 /*GxMainInterface* gui = GxMainInterface::instance();
521 if(!gtk_widget_get_visible(GTK_WIDGET(box1))) {
522 const gchar * title = gtk_widget_get_name(GTK_WIDGET(box1));
523 if(strcmp(title,"MonoRack")==0) gui->fShowRack.set_active();
524 else if (strcmp(title,"StereoRack")==0) gui->fShowSRack.set_active();
525 } */
526 //FIXME show rack when enable plugins
527 /*gtk_window_set_resizable(GTK_WINDOW (box1) , FALSE);
528
529 GtkRequisition my_size;
530 gtk_widget_size_request(GTK_WIDGET(box3),&my_size);
531 gint my_width, my_height;
532 gtk_widget_get_size_request (GTK_WIDGET(box1),&my_width, &my_height);
533 gtk_widget_set_size_request (GTK_WIDGET (box2),my_size.width , my_height );
534 gtk_window_set_resizable(GTK_WINDOW (box1) , TRUE);
535 gtk_widget_set_size_request (GTK_WIDGET (box2),-1 , my_height );
536 if(my_height > 1) {
537 refresh_size = 8;
538 if(my_size.height < 620)my_height = my_size.height;
539 gtk_widget_set_size_request (GTK_WIDGET (box1),my_size.width+24 , my_height );
540 }
541 } else {
542 refresh_size = 8;
543
544 GtkWidget *plug = gtk_widget_get_parent(GTK_WIDGET(data));
545
546 GtkWidget *box2 = gtk_widget_get_parent(GTK_WIDGET(plug));
547 GtkWidget *box1 = gtk_widget_get_parent(GTK_WIDGET(box2));
548 box2 = gtk_widget_get_parent(GTK_WIDGET(box1));
549 GtkWidget * box3 = gtk_widget_get_parent(GTK_WIDGET(box2));
550
551 box2 = gtk_widget_get_parent(GTK_WIDGET(box3)); // scroll box
552 box1 = gtk_widget_get_parent(GTK_WIDGET(box2)); // window
553
554
555 gtk_window_set_resizable(GTK_WINDOW (box1) , FALSE);
556 gtk_widget_hide(GTK_WIDGET(plug));
557
558 GtkRequisition my_size;
559 gtk_widget_size_request(GTK_WIDGET(box3),&my_size);
560 const gchar * title = gtk_widget_get_name(GTK_WIDGET(box1));
561 if(strcmp(title,"MonoRack")==0) {
562 if (g_threads[7] == 0 || g_main_context_find_source_by_id(NULL, g_threads[7]) == NULL)
563 g_threads[7] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 40, gx_set_resizeable,gpointer(box1),NULL);
564 } else {
565 if (g_threads[6] == 0 || g_main_context_find_source_by_id(NULL, g_threads[6]) == NULL)
566 g_threads[6] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 40, gx_set_sresizeable,gpointer(box1),NULL);
567 }
568 gtk_widget_set_size_request (GTK_WIDGET (box2),my_size.width+24 , -1 );
569
570 gint my_width, my_height;
571 gtk_widget_get_size_request (GTK_WIDGET(box1),&my_width, &my_height);
572 //fprintf(stderr, "%i ,%i before\n", my_height,my_size.height);
573 if(my_height > my_size.height ) {
574 my_height = my_size.height;
575 refresh_size = 8;
576 //fprintf(stderr, "%i ,%i \n", my_height,my_size.height);
577 }
578 gtk_widget_set_size_request (GTK_WIDGET (box1),my_size.width+24 , my_height );
579
580 }*/
581 }
582
583
584 //----menu function gx_mono_rack
585 void GxMainInterface::on_rack_activate()
586 {
587 if (fShowRack.get_active()) {
588 gtk_widget_show(rack_widget);
589 if (!fShowRRack.get_active()) {
590 fShowRRack.set_active(true);
591 }
592 } else {
593 gtk_widget_hide(rack_widget);
594 }
595 }
596
597 //----menu function gx_rack
598 void GxMainInterface::on_rrack_activate()
599 {
600
601 if (fShowRRack.get_active()) {
602 gtk_widget_set_size_request (GTK_WIDGET (RBox),-1, 460);
603 gtk_widget_show(RBox);
604 //fShowRack.set_active(true);
605 //fShowSRack.set_active(true);
606 } else {
607 if(gtk_window_get_resizable(GTK_WINDOW (fWindow)))
608 gtk_window_set_resizable(GTK_WINDOW (fWindow) , FALSE);
609 gtk_widget_hide(RBox);
610 //fShowRack.set_active(false);
611 //fShowSRack.set_active(false);
612 }
613 if (g_threads[7] == 0 || g_main_context_find_source_by_id(NULL, g_threads[7]) == NULL)
614 g_threads[7] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 40, gx_set_resizeable,gpointer(fWindow),NULL);
615 if (g_threads[6] == 0 || g_main_context_find_source_by_id(NULL, g_threads[6]) == NULL)
616 g_threads[6] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 50, gx_set_default,gpointer(RBox),NULL);
617
618 }
619
620 //----menu function gx_rack
621 void GxMainInterface::on_srack_activate()
622 {
623 if(gtk_window_get_resizable(GTK_WINDOW (fWindow)))
624 gtk_window_set_resizable(GTK_WINDOW (fWindow) , FALSE);
625 if (fShowSRack.get_active()) {
626 gtk_widget_show(srack_widget);
627
628 GtkWidget *parent = gtk_widget_get_parent(GTK_WIDGET(srack_widget));
629 GtkWidget *vbox = gtk_widget_get_parent(GTK_WIDGET(parent));
630 vbox = gtk_widget_get_parent(GTK_WIDGET(vbox));
631 vbox = gtk_widget_get_parent(GTK_WIDGET(vbox));
632 //if order is horizontal, force resize the rack widget width
633 if(strcmp(gtk_widget_get_name(GTK_WIDGET(vbox)),"GtkViewport")==0) {
634 gtk_widget_hide(GTK_WIDGET(vbox));
635
636 gtk_widget_show(GTK_WIDGET(vbox));
637 }
638 if (!fShowRRack.get_active()) {
639 fShowRRack.set_active(true);
640 }
641 } else {
642 gtk_widget_hide(srack_widget);
643
644 GtkWidget *parent = gtk_widget_get_parent(GTK_WIDGET(srack_widget));
645 GtkWidget *vbox = gtk_widget_get_parent(GTK_WIDGET(parent));
646 vbox = gtk_widget_get_parent(GTK_WIDGET(vbox));
647 vbox = gtk_widget_get_parent(GTK_WIDGET(vbox));
648 //if order is horizontal, force resize the rack widget size
649 if(strcmp(gtk_widget_get_name(GTK_WIDGET(vbox)),"GtkViewport")==0) {
650 gtk_widget_hide(GTK_WIDGET(vbox));
651
652 gtk_widget_show(GTK_WIDGET(vbox));
653 }
654 }
655
656 gtk_widget_set_size_request (GTK_WIDGET (RBox),-1, 460 );
657 if (g_threads[7] == 0 || g_main_context_find_source_by_id(NULL, g_threads[7]) == NULL)
658 g_threads[7] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 40, gx_set_resizeable,gpointer(fWindow),NULL);
659 if (g_threads[6] == 0 || g_main_context_find_source_by_id(NULL, g_threads[6]) == NULL)
660 g_threads[6] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 50, gx_set_default,gpointer(RBox),NULL);
661
662 }
663
664 //----menu function gx_toolbar
665 void GxMainInterface::on_toolbar_activate()
666 {
667
668 if (fShowToolBar.get_active()) {
669 gtk_widget_show_all(rack_tool_bar);
670 } else {
671 GtkAllocation my_size;
672 gtk_widget_get_allocation(GTK_WIDGET(RBox),&my_size);
673 gtk_widget_set_size_request (GTK_WIDGET (RBox),-1, my_size.height);
674 if(gtk_window_get_resizable(GTK_WINDOW (fWindow)))
675 gtk_window_set_resizable(GTK_WINDOW (fWindow) , FALSE);
676 gtk_widget_hide(rack_tool_bar);
677 }
678 if (g_threads[7] == 0 || g_main_context_find_source_by_id(NULL, g_threads[7]) == NULL)
679 g_threads[7] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 40, gx_set_resizeable,gpointer(fWindow),NULL);
680 if (g_threads[6] == 0 || g_main_context_find_source_by_id(NULL, g_threads[6]) == NULL)
681 g_threads[6] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 50, gx_set_default,gpointer(RBox),NULL);
682
683 }
684
685 //----menu function gx_tuner
686 void GxMainInterface::on_tuner_activate()
687 {
688
689
690 if (fShowTuner.get_active()) {
691 gtk_widget_show_all(tuner_widget);
692 shownote = 1;
693 fTuner.show();
694 } else {
695 GtkAllocation my_size;
696 gtk_widget_get_allocation(GTK_WIDGET(RBox),&my_size);
697 gtk_widget_set_size_request (GTK_WIDGET (RBox),-1, my_size.height);
698 if(gtk_window_get_resizable(GTK_WINDOW (fWindow)))
699 gtk_window_set_resizable(GTK_WINDOW (fWindow) , FALSE);
700 shownote = 0;
701 fTuner.hide();
702 gtk_widget_hide(tuner_widget);
703 }
704 if (g_threads[7] == 0 || g_main_context_find_source_by_id(NULL, g_threads[7]) == NULL)
705 g_threads[7] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 40, gx_set_resizeable,gpointer(fWindow),NULL);
706 if (g_threads[6] == 0 || g_main_context_find_source_by_id(NULL, g_threads[6]) == NULL)
707 g_threads[6] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 50, gx_set_default,gpointer(RBox),NULL);
708
709 }
710
711 //---- menu function gx_midi_out
712 void gx_midi_out (GtkCheckMenuItem *menuitem, gpointer checkplay)
713 {
714 GList* child_list = gtk_container_get_children(GTK_CONTAINER(midibox));
715 GtkWidget *child = (GtkWidget *) g_list_nth_data(child_list,0);
716 g_list_free(child_list);
717 gx_show_extended_settings(GTK_WIDGET(menuitem), (gpointer) child);
718 static bool first = true;
719 if (gtk_check_menu_item_get_active(menuitem) == TRUE) {
720 if(first)refresh_size = 0;
721
722 gx_engine::turnOnMidi();
723 } else {
724 gx_engine::turnOffMidi();
725 string group = "midi_out.on_off";
726 parameter_map[group].set_std_value();
727 }
728 first =false;
729 }
730
731 //----- hide the extendend settings slider
732 void gx_hide_extended_settings( GtkWidget *widget, gpointer data )
733 {
734
735 if (gdk_window_get_state(fWindow->window)
736 & (GDK_WINDOW_STATE_ICONIFIED|GDK_WINDOW_STATE_WITHDRAWN)) {
737 gint mainxorg = gx_set_mx_oriantation();
738 gint mainyorg = gx_set_my_oriantation();
739 gtk_window_move(GTK_WINDOW(fWindow), mainxorg, mainyorg);
740 gtk_window_present(GTK_WINDOW(fWindow));
741 } else {
742 gtk_widget_hide(fWindow);
743 //gtk_window_iconify(GTK_WINDOW(fWindow));
744 }
745 }
746
747 //----- systray menu
748 void gx_systray_menu( GtkWidget *widget, gpointer data )
749 {
750 guint32 tim = gtk_get_current_event_time ();
751 gtk_menu_popup (GTK_MENU(menuh),NULL,NULL,NULL,(gpointer) menuh,2,tim);
752 }
753
754 //---- choice dialog without text entry
755 gint gx_nchoice_dialog_without_entry (
756 const char* window_title,
757 const char* msg,
758 const guint nchoice,
759 const char* label[],
760 const gint resp[],
761 const gint default_response
762 )
763 {
764 GtkWidget* dialog = gtk_dialog_new();
765 GtkWidget* text_label = gtk_label_new (msg);
766 gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), text_label);
767
768 GdkColor colorGreen;
769 gdk_color_parse("#969292", &colorGreen);
770 gtk_widget_modify_fg (text_label, GTK_STATE_NORMAL, &colorGreen);
771
772 GdkColor colorBlack;
773 gdk_color_parse("#000000", &colorBlack);
774 gtk_widget_modify_bg (dialog, GTK_STATE_NORMAL, &colorBlack);
775 g_signal_connect(GTK_DIALOG(dialog)->vbox, "expose-event", G_CALLBACK(rectangle_skin_color_expose), NULL);
776 GtkStyle* text_style = gtk_widget_get_style(text_label);
777 pango_font_description_set_size(text_style->font_desc, 10*PANGO_SCALE);
778 pango_font_description_set_weight(text_style->font_desc, PANGO_WEIGHT_BOLD);
779
780 gtk_widget_modify_font(text_label, text_style->font_desc);
781
782 for (guint i = 0; i < nchoice; i++)
783 {
784 GtkWidget* button =
785 gtk_dialog_add_button(GTK_DIALOG (dialog), label[i], resp[i]);
786
787 gdk_color_parse("#555555", &colorBlack);
788 gtk_widget_modify_bg(button, GTK_STATE_NORMAL, &colorBlack);
789
790 g_signal_connect_swapped(button, "clicked", G_CALLBACK (gtk_widget_destroy), dialog);
791 }
792
793 // set default
794 gtk_dialog_set_has_separator(GTK_DIALOG(dialog), TRUE);
795 gtk_dialog_set_default_response(GTK_DIALOG(dialog), default_response);
796 gtk_window_set_title(GTK_WINDOW(dialog), window_title);
797
798 gtk_widget_show(text_label);
799
800 //--- run dialog and check response
801 gint response = gtk_dialog_run (GTK_DIALOG (dialog));
802 return response;
803 }
804
805 //---- choice dialog without text entry
806 gint gx_choice_dialog_without_entry (
807 const char* window_title,
808 const char* msg,
809 const char* label1,
810 const char* label2,
811 const gint resp1,
812 const gint resp2,
813 const gint default_response
814 )
815 {
816 const guint nchoice = 2;
817 const char* labels[] = {label1, label2};
818 const gint responses[] = {resp1, resp2};
819
820 return gx_nchoice_dialog_without_entry(
821 window_title,
822 msg,
823 nchoice,
824 labels,
825 responses,
826 default_response);
827 }
828
829 //---- get text entry from dialog
830 void gx_get_text_entry(GtkEntry* entry, string& output)
831 {
832 if (gtk_entry_get_text(entry)[0])
833 output = gtk_entry_get_text(entry);
834 }
835
836 //---- choice dialog with text entry
837 gint gx_choice_dialog_with_text_entry (
838 const char* window_title,
839 const char* msg,
840 const char* label1,
841 const char* label2,
842 const gint resp1,
843 const gint resp2,
844 const gint default_response,
845 GCallback func
846 )
847 {
848 GtkWidget *dialog, *button1, *button2;
849 dialog = gtk_dialog_new();
850 button1 = gtk_dialog_add_button(GTK_DIALOG (dialog), label1, resp1);
851 button2 = gtk_dialog_add_button(GTK_DIALOG (dialog), label2, resp2);
852
853 GtkWidget* text_label = gtk_label_new (msg);
854 gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), text_label);
855
856
857 GtkWidget* gtk_entry = gtk_entry_new_with_max_length(32);
858 gtk_entry_set_text(GTK_ENTRY(gtk_entry), "");
859 gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), gtk_entry);
860
861 g_signal_connect_swapped (button1, "clicked", G_CALLBACK (func), gtk_entry);
862
863 gtk_dialog_set_has_separator(GTK_DIALOG(dialog), TRUE);
864 gtk_dialog_set_default_response(GTK_DIALOG(dialog), default_response);
865 gtk_entry_set_activates_default(GTK_ENTRY(gtk_entry), TRUE);
866 GTK_BOX(GTK_DIALOG(dialog)->action_area)->spacing = 4;
867
868 // some display style
869 GdkColor colorGreen;
870 gdk_color_parse("#969292", &colorGreen);
871 gtk_widget_modify_fg (text_label, GTK_STATE_NORMAL, &colorGreen);
872
873 GdkColor colorBlack;
874 gdk_color_parse("#000000", &colorBlack);
875 gtk_widget_modify_bg (dialog, GTK_STATE_NORMAL, &colorBlack);
876
877 GtkStyle* text_style = gtk_widget_get_style(text_label);
878 pango_font_description_set_size(text_style->font_desc, 10*PANGO_SCALE);
879 pango_font_description_set_weight(text_style->font_desc, PANGO_WEIGHT_BOLD);
880
881 gtk_widget_modify_font(text_label, text_style->font_desc);
882
883 gdk_color_parse("#555555", &colorBlack);
884 gtk_widget_modify_bg (button1, GTK_STATE_NORMAL, &colorBlack);
885
886 gdk_color_parse("#555555", &colorBlack);
887 gtk_widget_modify_bg (button2, GTK_STATE_NORMAL, &colorBlack);
888
889 // display extra stuff
890 gtk_widget_show (text_label);
891 gtk_widget_show (gtk_entry);
892 gtk_window_set_title(GTK_WINDOW(dialog), window_title);
893
894 // run the dialog and wait for response
895 gint response = gtk_dialog_run (GTK_DIALOG(dialog));
896
897 if (dialog) gtk_widget_destroy(dialog);
898
899 return response;
900 }
901
902 //---- retrive skin array index from skin name
903 void gx_actualize_skin_index(const string& skin_name)
904 {
905 for (guint s = 0; s < skin_list.size(); s++) {
906 if (skin_name == skin_list[s]) {
907 gx_current_skin = s;
908 return;
909 }
910 }
911 }
912
913 //------- count the number of available skins
914 unsigned int gx_fetch_available_skins()
915 {
916 DIR *d;
917 d = opendir(gx_style_dir.c_str());
918 if (!d) {
919 return 0;
920 }
921 // look for gx_head_*.rc and extract *-part
376 void gx_reset_units(Glib::ustring group_id) {
377 group_id += ".";
378 string on_off = group_id + "on_off";
379 for (ParamMap::iterator i = parameter_map.begin(); i != parameter_map.end(); i++) {
380 if (i->first.compare(0, group_id.size(), group_id) == 0) {
381 if (i->second->isControllable()) {
382 string id = i->first;
383 if (i->first != on_off) {
384 i->second->set_std_value();
385 }
386 }
387 }
388 }
389 }
390
391 gboolean gx_set_resizeable(gpointer data) {
392 if (!gtk_window_get_resizable(GTK_WINDOW(data)))
393 gtk_window_set_resizable(GTK_WINDOW(data), TRUE);
394 return false;
395 }
396
397 gboolean gx_set_sresizeable(gpointer data) {
398 if (!gtk_window_get_resizable(GTK_WINDOW(data)))
399 gtk_window_set_resizable(GTK_WINDOW(data), FALSE);
400 return false;
401 }
402
403 gboolean gx_set_default(gpointer data) {
404 gtk_widget_set_size_request(GTK_WIDGET(data), -1, -1);
405 return false;
406 }
407
408 gboolean gx_set_default_size(gpointer data) {
409 gtk_widget_set_size_request(GTK_WIDGET(data), -1, 440);
410 return false;
411 }
412
413 gboolean gx_set_default_ssize(gpointer data) {
414 gtk_widget_set_size_request(GTK_WIDGET(data), -1, 460);
415 return false;
416 }
417
418 // ----- show extendend settings slider
419 void gx_show_extended_settings(GtkWidget *widget, gpointer data) {
420 gx_gui::GxMainInterface* gui = gx_gui::GxMainInterface::instance("gx_head");
421 if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)) == TRUE) {
422
423 GtkWidget *plug = gtk_widget_get_parent(GTK_WIDGET(data));
424 gtk_widget_show_all(GTK_WIDGET(plug));
425 GtkWidget *vbox = gtk_widget_get_parent(GTK_WIDGET(plug));
426 GtkWidget *box1 = gtk_widget_get_parent(GTK_WIDGET(vbox));
427 vbox = gtk_widget_get_parent(GTK_WIDGET(box1));
428 box1 = gtk_widget_get_parent(GTK_WIDGET(vbox));
429 vbox = gtk_widget_get_parent(GTK_WIDGET(box1));
430 box1 = gtk_widget_get_parent(GTK_WIDGET(vbox));
431
432 // if order is horizontal, force resize the rack widget width
433 if (strcmp(gtk_widget_get_name(GTK_WIDGET(box1)), "GtkViewport") == 0) {
434 gtk_widget_hide(GTK_WIDGET(vbox));
435 if (gtk_window_get_resizable(GTK_WINDOW(gw.fWindow)))
436 gtk_window_set_resizable(GTK_WINDOW(gw.fWindow), FALSE);
437 gtk_widget_show(GTK_WIDGET(vbox));
438
439 gtk_widget_set_size_request(GTK_WIDGET(gui->RBox), -1, 460);
440 if (g_threads[7] == 0 || g_main_context_find_source_by_id
441 (NULL, g_threads[7]) == NULL)
442 g_threads[7] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 40,
443 gx_gui::gx_set_resizeable, gpointer(gw.fWindow), NULL);
444 if (g_threads[6] == 0 || g_main_context_find_source_by_id
445 (NULL, g_threads[6]) == NULL)
446 g_threads[6] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 50,
447 gx_gui::gx_set_default, gpointer(gui->RBox), NULL);
448 }
449 } else {
450 GtkWidget *plug = gtk_widget_get_parent(GTK_WIDGET(data));
451 gtk_widget_hide(GTK_WIDGET(plug));
452 GtkWidget *vbox = gtk_widget_get_parent(GTK_WIDGET(plug));
453 GtkWidget *box1 = gtk_widget_get_parent(GTK_WIDGET(vbox));
454 vbox = gtk_widget_get_parent(GTK_WIDGET(box1));
455 box1 = gtk_widget_get_parent(GTK_WIDGET(vbox));
456 vbox = gtk_widget_get_parent(GTK_WIDGET(box1));
457 box1 = gtk_widget_get_parent(GTK_WIDGET(vbox));
458
459 // if order is horizontal, force resize the rack widget width
460 if (strcmp(gtk_widget_get_name(GTK_WIDGET(box1)), "GtkViewport") == 0) {
461 gtk_widget_hide(GTK_WIDGET(vbox));
462 if (gtk_window_get_resizable(GTK_WINDOW(gw.fWindow)))
463 gtk_window_set_resizable(GTK_WINDOW(gw.fWindow) , FALSE);
464 gtk_widget_show(GTK_WIDGET(vbox));
465
466 gtk_widget_set_size_request(GTK_WIDGET(gui->RBox), -1, 460);
467 if (g_threads[7] == 0 || g_main_context_find_source_by_id
468 (NULL, g_threads[7]) == NULL)
469 g_threads[7] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 40,
470 gx_gui::gx_set_resizeable, gpointer(gw.fWindow), NULL);
471 if (g_threads[6] == 0 || g_main_context_find_source_by_id
472 (NULL, g_threads[6]) == NULL)
473 g_threads[6] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 50,
474 gx_gui::gx_set_default, gpointer(gui->RBox), NULL);
475 }
476 }
477 }
478
479 // ----- show extendend settings slider
480 void gx_show_menu_settings(GtkWidget *widget, gpointer data) {
481 // done by the button allready
482 }
483
484
485 // ----menu function gx_mono_rack
486 void GxMainInterface::on_rack_activate() {
487 if (fShowRack.get_active()) {
488 gtk_widget_show(gw.rack_widget);
489 if (!fShowRRack.get_active()) {
490 fShowRRack.set_active(true);
491 }
492 } else {
493 gtk_widget_hide(gw.rack_widget);
494 }
495 }
496
497 // ----menu function gx_rack
498 void GxMainInterface::on_rrack_activate() {
499
500 if (fShowRRack.get_active()) {
501 gtk_widget_set_size_request(GTK_WIDGET(RBox), -1, 460);
502 gtk_widget_show(RBox);
503 // fShowRack.set_active(true);
504 // fShowSRack.set_active(true);
505 } else {
506 if (gtk_window_get_resizable(GTK_WINDOW(gw.fWindow)))
507 gtk_window_set_resizable(GTK_WINDOW(gw.fWindow) , FALSE);
508 gtk_widget_hide(RBox);
509 // fShowRack.set_active(false);
510 // fShowSRack.set_active(false);
511 }
512 if (g_threads[7] == 0 || g_main_context_find_source_by_id(NULL, g_threads[7]) == NULL)
513 g_threads[7] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 40,
514 gx_set_resizeable, gpointer(gw.fWindow), NULL);
515 if (g_threads[6] == 0 || g_main_context_find_source_by_id(NULL, g_threads[6]) == NULL)
516 g_threads[6] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 50,
517 gx_set_default, gpointer(RBox), NULL);
518 }
519
520 // ----menu function gx_rack
521 void GxMainInterface::on_srack_activate() {
522 if (gtk_window_get_resizable(GTK_WINDOW(gw.fWindow)))
523 gtk_window_set_resizable(GTK_WINDOW(gw.fWindow) , FALSE);
524 if (fShowSRack.get_active()) {
525 gtk_widget_show(gw.srack_widget);
526
527 GtkWidget *parent = gtk_widget_get_parent(GTK_WIDGET(gw.srack_widget));
528 GtkWidget *vbox = gtk_widget_get_parent(GTK_WIDGET(parent));
529 vbox = gtk_widget_get_parent(GTK_WIDGET(vbox));
530 // vbox = gtk_widget_get_parent(GTK_WIDGET(vbox));
531 // if order is horizontal, force resize the rack widget width
532 if (strcmp(gtk_widget_get_name(GTK_WIDGET(vbox)), "GtkViewport") == 0) {
533 gtk_widget_hide(GTK_WIDGET(vbox));
534 parent = gtk_widget_get_parent(GTK_WIDGET(vbox));
535 if (strcmp(gtk_widget_get_name(GTK_WIDGET(parent)), "HorizontalStereoBox") == 0) {
536 if (!gtk_widget_is_drawable(GTK_WIDGET(parent)))
537 gtk_widget_show(GTK_WIDGET(parent));
538 }
539 gtk_widget_show(GTK_WIDGET(vbox));
540 }
541 if (!fShowRRack.get_active()) {
542 fShowRRack.set_active(true);
543 }
544 } else {
545 gtk_widget_hide(gw.srack_widget);
546
547 GtkWidget *parent = gtk_widget_get_parent(GTK_WIDGET(gw.srack_widget));
548 GtkWidget *vbox = gtk_widget_get_parent(GTK_WIDGET(parent));
549 vbox = gtk_widget_get_parent(GTK_WIDGET(vbox));
550 // vbox = gtk_widget_get_parent(GTK_WIDGET(vbox));
551 // if order is horizontal, force resize the rack widget size
552 if (strcmp(gtk_widget_get_name(GTK_WIDGET(vbox)), "GtkViewport") == 0) {
553 gtk_widget_hide(GTK_WIDGET(vbox));
554 parent = gtk_widget_get_parent(GTK_WIDGET(vbox));
555 if (strcmp(gtk_widget_get_name(GTK_WIDGET(parent)), "HorizontalStereoBox") == 0) {
556 if (gtk_widget_is_drawable(GTK_WIDGET(parent)))
557 gtk_widget_hide(GTK_WIDGET(parent));
558 }
559 gtk_widget_show(GTK_WIDGET(vbox));
560 }
561 }
562
563 gtk_widget_set_size_request(GTK_WIDGET(RBox), -1, 460 );
564 if (g_threads[7] == 0 || g_main_context_find_source_by_id(NULL, g_threads[7]) == NULL)
565 g_threads[7] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 40,
566 gx_set_resizeable, gpointer(gw.fWindow), NULL);
567 if (g_threads[6] == 0 || g_main_context_find_source_by_id(NULL, g_threads[6]) == NULL)
568 g_threads[6] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 50,
569 gx_set_default, gpointer(RBox), NULL);
570 }
571
572 // ----menu function gx_toolbar
573 void GxMainInterface::on_toolbar_activate() {
574
575 if (fShowToolBar.get_active()) {
576 gtk_widget_show_all(gw.rack_tool_bar);
577 } else {
578 GtkAllocation my_size;
579 gtk_widget_get_allocation(GTK_WIDGET(RBox), &my_size);
580 gtk_widget_set_size_request(GTK_WIDGET(RBox), -1, my_size.height);
581 if (gtk_window_get_resizable(GTK_WINDOW(gw.fWindow)))
582 gtk_window_set_resizable(GTK_WINDOW(gw.fWindow) , FALSE);
583 gtk_widget_hide(gw.rack_tool_bar);
584 }
585 if (g_threads[7] == 0 || g_main_context_find_source_by_id(NULL, g_threads[7]) == NULL)
586 g_threads[7] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 40,
587 gx_set_resizeable, gpointer(gw.fWindow), NULL);
588 if (g_threads[6] == 0 || g_main_context_find_source_by_id(NULL, g_threads[6]) == NULL)
589 g_threads[6] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 50,
590 gx_set_default, gpointer(RBox), NULL);
591 }
592
593 // ----menu function gx_tuner
594 void GxMainInterface::on_tuner_activate() {
595
596 if (fShowTuner.get_active()) {
597 gtk_widget_show_all(gw.tuner_widget);
598 shownote = 1;
599 fTuner.show();
600 } else {
601 GtkAllocation my_size;
602 gtk_widget_get_allocation(GTK_WIDGET(RBox), &my_size);
603 gtk_widget_set_size_request(GTK_WIDGET(RBox), -1, my_size.height);
604 if (gtk_window_get_resizable(GTK_WINDOW(gw.fWindow)))
605 gtk_window_set_resizable(GTK_WINDOW(gw.fWindow) , FALSE);
606 shownote = 0;
607 fTuner.hide();
608 gtk_widget_hide(gw.tuner_widget);
609 }
610 if (g_threads[7] == 0 || g_main_context_find_source_by_id(NULL, g_threads[7]) == NULL)
611 g_threads[7] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 40,
612 gx_set_resizeable, gpointer(gw.fWindow), NULL);
613 if (g_threads[6] == 0 || g_main_context_find_source_by_id(NULL, g_threads[6]) == NULL)
614 g_threads[6] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 50,
615 gx_set_default, gpointer(RBox), NULL);
616 }
617
618 // ---- menu function gx_midi_out
619 void gx_midi_out(GtkCheckMenuItem *menuitem, gpointer checkplay) {
620 GList* child_list = gtk_container_get_children(GTK_CONTAINER(gw.midibox));
621 GtkWidget *child = reinterpret_cast<GtkWidget *>(g_list_nth_data(child_list, 0));
622 g_list_free(child_list);
623 gx_show_extended_settings(GTK_WIDGET(menuitem), (gpointer) child);
624 static bool first = true;
625 if (gtk_check_menu_item_get_active(menuitem) == TRUE) {
626 if (first)refresh_size = 0;
627
628 gx_engine::turnOnMidi();
629 } else {
630 gx_engine::turnOffMidi();
631 string group = "midi_out.on_off";
632 parameter_map[group].set_std_value();
633 }
634 first =false;
635 }
636
637 // ----- hide the extendend settings slider
638 void gx_hide_extended_settings(GtkWidget *widget, gpointer data) {
639
640 if (gdk_window_get_state(gw.fWindow->window)
641 & (GDK_WINDOW_STATE_ICONIFIED|GDK_WINDOW_STATE_WITHDRAWN)) {
642 gint mainxorg = gx_set_mx_oriantation();
643 gint mainyorg = gx_set_my_oriantation();
644 gtk_window_move(GTK_WINDOW(gw.fWindow), mainxorg, mainyorg);
645 gtk_window_present(GTK_WINDOW(gw.fWindow));
646 } else {
647 gtk_widget_hide(gw.fWindow);
648 // gtk_window_iconify(GTK_WINDOW(gw.fWindow));
649 }
650 }
651
652 // ----- systray menu
653 void gx_systray_menu(GtkWidget *widget, gpointer data) {
654 guint32 tim = gtk_get_current_event_time();
655 gtk_menu_popup(GTK_MENU(gw.menuh), NULL, NULL, NULL, (gpointer) gw.menuh, 2, tim);
656 }
657
658 // ---- choice dialog without text entry
659 gint gx_nchoice_dialog_without_entry(
660 const char* window_title,
661 const char* msg,
662 const guint nchoice,
663 const char* label[],
664 const gint resp[],
665 const gint default_response) {
666
667 GtkWidget* dialog = gtk_dialog_new();
668 GtkWidget* text_label = gtk_label_new(msg);
669 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), text_label);
670
671 GdkColor colorGreen;
672 gdk_color_parse("#969292", &colorGreen);
673 gtk_widget_modify_fg(text_label, GTK_STATE_NORMAL, &colorGreen);
674
675 GdkColor colorBlack;
676 gdk_color_parse("#000000", &colorBlack);
677 gtk_widget_modify_bg(dialog, GTK_STATE_NORMAL, &colorBlack);
678 g_signal_connect(GTK_DIALOG(dialog)->vbox, "expose-event",
679 G_CALLBACK(gx_cairo::rectangle_skin_color_expose), NULL);
680 GtkStyle* text_style = gtk_widget_get_style(text_label);
681 pango_font_description_set_size(text_style->font_desc, 10*PANGO_SCALE);
682 pango_font_description_set_weight(text_style->font_desc, PANGO_WEIGHT_BOLD);
683
684 gtk_widget_modify_font(text_label, text_style->font_desc);
685
686 for (guint i = 0; i < nchoice; i++) {
687 GtkWidget* button =
688 gtk_dialog_add_button(GTK_DIALOG(dialog), label[i], resp[i]);
689
690 gdk_color_parse("#555555", &colorBlack);
691 gtk_widget_modify_bg(button, GTK_STATE_NORMAL, &colorBlack);
692
693 g_signal_connect_swapped(button, "clicked", G_CALLBACK(gtk_widget_destroy), dialog);
694 }
695
696 // set default
697 gtk_dialog_set_has_separator(GTK_DIALOG(dialog), TRUE);
698 gtk_dialog_set_default_response(GTK_DIALOG(dialog), default_response);
699 gtk_window_set_title(GTK_WINDOW(dialog), window_title);
700
701 gtk_widget_show(text_label);
702
703 // --- run dialog and check response
704 gint response = gtk_dialog_run(GTK_DIALOG(dialog));
705 return response;
706 }
707
708 // ---- choice dialog without text entry
709 gint gx_choice_dialog_without_entry(
710 const char* window_title,
711 const char* msg,
712 const char* label1,
713 const char* label2,
714 const gint resp1,
715 const gint resp2,
716 const gint default_response) {
717
718 const guint nchoice = 2;
719 const char* labels[] = {label1, label2};
720 const gint responses[] = {resp1, resp2};
721
722 return gx_nchoice_dialog_without_entry(
723 window_title,
724 msg,
725 nchoice,
726 labels,
727 responses,
728 default_response);
729 }
730
731 // ---- get text entry from dialog
732 void gx_get_text_entry(GtkEntry* entry, string& output) {
733 if (gtk_entry_get_text(entry)[0])
734 output = gtk_entry_get_text(entry);
735 }
736
737 // ---- choice dialog with text entry
738 gint gx_choice_dialog_with_text_entry(
739 const char* window_title,
740 const char* msg,
741 const char* label1,
742 const char* label2,
743 const gint resp1,
744 const gint resp2,
745 const gint default_response,
746 GCallback func) {
747
748 GtkWidget *dialog, *button1, *button2;
749 dialog = gtk_dialog_new();
750 button1 = gtk_dialog_add_button(GTK_DIALOG(dialog), label1, resp1);
751 button2 = gtk_dialog_add_button(GTK_DIALOG(dialog), label2, resp2);
752
753 GtkWidget* text_label = gtk_label_new(msg);
754 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), text_label);
755
756
757 GtkWidget* gtk_entry = gtk_entry_new_with_max_length(32);
758 gtk_entry_set_text(GTK_ENTRY(gtk_entry), "");
759 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), gtk_entry);
760
761 g_signal_connect_swapped(button1, "clicked", G_CALLBACK(func), gtk_entry);
762
763 gtk_dialog_set_has_separator(GTK_DIALOG(dialog), TRUE);
764 gtk_dialog_set_default_response(GTK_DIALOG(dialog), default_response);
765 gtk_entry_set_activates_default(GTK_ENTRY(gtk_entry), TRUE);
766 GTK_BOX(GTK_DIALOG(dialog)->action_area)->spacing = 4;
767
768 // some display style
769 GdkColor colorGreen;
770 gdk_color_parse("#969292", &colorGreen);
771 gtk_widget_modify_fg(text_label, GTK_STATE_NORMAL, &colorGreen);
772
773 GdkColor colorBlack;
774 gdk_color_parse("#000000", &colorBlack);
775 gtk_widget_modify_bg(dialog, GTK_STATE_NORMAL, &colorBlack);
776
777 GtkStyle* text_style = gtk_widget_get_style(text_label);
778 pango_font_description_set_size(text_style->font_desc, 10*PANGO_SCALE);
779 pango_font_description_set_weight(text_style->font_desc, PANGO_WEIGHT_BOLD);
780
781 gtk_widget_modify_font(text_label, text_style->font_desc);
782
783 gdk_color_parse("#555555", &colorBlack);
784 gtk_widget_modify_bg(button1, GTK_STATE_NORMAL, &colorBlack);
785
786 gdk_color_parse("#555555", &colorBlack);
787 gtk_widget_modify_bg(button2, GTK_STATE_NORMAL, &colorBlack);
788
789 // display extra stuff
790 gtk_widget_show(text_label);
791 gtk_widget_show(gtk_entry);
792 gtk_window_set_title(GTK_WINDOW(dialog), window_title);
793
794 // run the dialog and wait for response
795 gint response = gtk_dialog_run(GTK_DIALOG(dialog));
796
797 if (dialog) gtk_widget_destroy(dialog);
798
799 return response;
800 }
801
802 // ---- retrive skin array index from skin name
803 void gx_actualize_skin_index(const string& skin_name) {
804 for (guint s = 0; s < skin.skin_list.size(); s++) {
805 if (skin_name == skin.skin_list[s]) {
806 skin.gx_current_skin = s;
807 return;
808 }
809 }
810 }
811
812 // ------- count the number of available skins
813 unsigned int gx_fetch_available_skins() {
814 DIR *d;
815 d = opendir(gx_system::gx_style_dir.c_str());
816 if (!d) {
817 return 0;
818 }
819 // look for gx_head_*.rc and extract *-part
922820 struct dirent *de;
923 while ((de = readdir(d)) != 0) {
924 char *p = de->d_name;
925 if (strncmp(p, "gx_head_", 8) != 0) {
926 continue;
927 }
928 p += 8;
929 int n = strlen(p) - 3;
930 if (strcmp(p+n, ".rc") != 0) {
931 continue;
932 }
933 skin_list.push_back(string(p, n));
934 sort(skin_list.begin(), skin_list.end());
935 }
936 closedir(d);
937 return skin_list.size();
821 while ((de = readdir(d)) != 0) {
822 char *p = de->d_name;
823 if (strncmp(p, "gx_head_", 8) != 0) {
824 continue;
825 }
826 p += 8;
827 int n = strlen(p) - 3;
828 if (strcmp(p+n, ".rc") != 0) {
829 continue;
830 }
831 skin.skin_list.push_back(string(p, n));
832 sort(skin.skin_list.begin(), skin.skin_list.end());
833 }
834 closedir(d);
835 return skin.skin_list.size();
938836 }
939837
940838 // ----- skin change
941 void gx_change_skin(GtkCheckMenuItem *menuitem, gpointer arg)
942 {
943 // no action needed on false
944 if (gtk_check_menu_item_get_active(menuitem) == FALSE)
945 return;
946
947 // update the skin to the one picked by user
948 const int idx = (int)GPOINTER_TO_INT(arg);
949
950 (void)gx_update_skin(idx, "gx_change_skin");
839 void gx_change_skin(GtkCheckMenuItem *menuitem, gpointer arg) {
840 // no action needed on false
841 if (gtk_check_menu_item_get_active(menuitem) == FALSE)
842 return;
843
844 // update the skin to the one picked by user
845 const int idx = static_cast<int>(GPOINTER_TO_INT(arg));
846
847 (void)gx_update_skin(idx, "gx_change_skin");
951848 }
952849
953850 // ----- cycling through skin
954 void gx_cycle_through_skin(GtkWidget *widget, gpointer arg)
955 {
956
957 gint idx = gx_current_skin + 1;
958 idx %= skin_list.size();
959
960 // did it work ? if yes, update current skin
961 if (gx_update_skin(idx, "gx_cycle_through_skin"))
962 gx_current_skin = idx;
963
964 // update menu item state
965 gx_update_skin_menu_item(gx_current_skin);
851 void gx_cycle_through_skin(GtkWidget *widget, gpointer arg) {
852
853 gint idx = skin.gx_current_skin + 1;
854 idx %= skin.skin_list.size();
855
856 // did it work ? if yes, update current skin
857 if (gx_update_skin(idx, "gx_cycle_through_skin"))
858 skin.gx_current_skin = idx;
859
860 // update menu item state
861 gx_update_skin_menu_item(skin.gx_current_skin);
966862 }
967863
968864 // ----- cycling through skin
969 void gx_update_skin_menu_item(const int index)
970 {
971 // update menu item state
972 GxMainInterface* gui = GxMainInterface::instance();
973 GtkWidget* skinmenu = gui->getMenu("Skin");
974
975 GList* list = gtk_container_get_children(GTK_CONTAINER(skinmenu));
976 GtkWidget* item = (GtkWidget*)g_list_nth_data(list, index);
977 g_list_free(list);
978 if (item) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), TRUE);
865 void gx_update_skin_menu_item(const int index) {
866 // update menu item state
867 GxMainInterface* gui = GxMainInterface::instance();
868 GtkWidget* skinmenu = gui->getMenu("Skin");
869
870 GList* list = gtk_container_get_children(GTK_CONTAINER(skinmenu));
871 GtkWidget* item = reinterpret_cast<GtkWidget*>(g_list_nth_data(list, index));
872 g_list_free(list);
873 if (item) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), TRUE);
979874 }
980875
981876 // ---- skin changer, used internally frm callbacks
982 bool gx_update_skin(const gint idx, const char* calling_func)
983 {
984 // check skin validity
985 if (idx < 0 || idx >= (gint)skin_list.size())
986 {
987 gx_print_warning(calling_func, _("skin index out of range, keeping actual skin"));
988 return false;
989 }
990
991 string rcfile = gx_style_dir + "gx_head_";
992 rcfile += skin_list[idx];
993 rcfile += ".rc";
994
995 gtk_rc_parse(rcfile.c_str());
996 gtk_rc_reset_styles(gtk_settings_get_default());
997
998 gx_current_skin = idx;
999
1000 // refresh latency check menu
1001 GxMainInterface* gui = GxMainInterface::instance();
1002 GtkWidget* wd = gui->getJackLatencyItem(gx_jack::jack_bs);
1003 if (wd) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(wd), TRUE);
1004
1005 return true;
877 bool gx_update_skin(const gint idx, const char* calling_func) {
878 // check skin validity
879 if (idx < 0 || idx >= (gint)skin.skin_list.size()) {
880 gx_system::gx_print_warning(calling_func,
881 _("skin index out of range, keeping actual skin"));
882 return false;
883 }
884
885 string rcfile = gx_system::gx_style_dir + "gx_head_";
886 rcfile += skin.skin_list[idx];
887 rcfile += ".rc";
888
889 gtk_rc_parse(rcfile.c_str());
890 gtk_rc_reset_styles(gtk_settings_get_default());
891
892 skin.gx_current_skin = idx;
893
894 // refresh latency check menu
895 GxMainInterface* gui = GxMainInterface::instance();
896 GtkWidget* wd = gui->getJackLatencyItem(gx_jack::gxjack.jack_bs);
897 if (wd) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(wd), TRUE);
898
899 return true;
1006900 }
1007901
1008902 // ---- set last used skin as default
1009 bool gx_set_skin(GtkWidget *widget, gpointer data)
1010 {
1011 return gx_update_skin(last_skin, "Set Skin");
1012 }
1013
1014 //---- popup warning
1015 int gx_message_popup(const char* msg)
1016 {
1017 // check msg validity
1018 if (!msg)
1019 {
1020 gx_print_warning("Message Popup",
1021 string(_("warning message does not exist")));
1022 return -1;
1023 }
1024
1025 // build popup window
1026 GtkWidget *about;
1027 GtkWidget *label;
1028 GtkWidget *ok_button;
1029
1030 about = gtk_dialog_new();
1031 ok_button = gtk_button_new_from_stock(GTK_STOCK_OK);
1032
1033 label = gtk_label_new (msg);
1034
1035 GtkStyle *style = gtk_widget_get_style(label);
1036
1037 pango_font_description_set_size(style->font_desc, 10*PANGO_SCALE);
1038 pango_font_description_set_weight(style->font_desc, PANGO_WEIGHT_BOLD);
1039
1040 gtk_widget_modify_font(label, style->font_desc);
1041
1042 gtk_label_set_selectable(GTK_LABEL(label), TRUE);
1043
1044 gtk_container_add (GTK_CONTAINER (GTK_DIALOG(about)->vbox), label);
1045
1046 GTK_BOX(GTK_DIALOG(about)->action_area)->spacing = 3;
1047 gtk_container_add (GTK_CONTAINER (GTK_DIALOG(about)->action_area), ok_button);
1048
1049 g_signal_connect_swapped (ok_button, "clicked",
1050 G_CALLBACK (gtk_widget_destroy), about);
1051
1052 g_signal_connect(label, "expose-event", G_CALLBACK(conv_widget_expose), NULL);
1053 gtk_widget_show (ok_button);
1054 gtk_widget_show (label);
1055 return gtk_dialog_run (GTK_DIALOG(about));
903 bool gx_set_skin(GtkWidget *widget, gpointer data) {
904 return gx_update_skin(skin.last_skin, "Set Skin");
905 }
906
907 // ---- popup warning
908 int gx_message_popup(const char* msg) {
909 // check msg validity
910 if (!msg) {
911 gx_system::gx_print_warning("Message Popup",
912 string(_("warning message does not exist")));
913 return -1;
914 }
915
916 // build popup window
917 GtkWidget *about;
918 GtkWidget *label;
919 GtkWidget *ok_button;
920
921 about = gtk_dialog_new();
922 ok_button = gtk_button_new_from_stock(GTK_STOCK_OK);
923
924 label = gtk_label_new(msg);
925
926 GtkStyle *style = gtk_widget_get_style(label);
927
928 pango_font_description_set_size(style->font_desc, 10*PANGO_SCALE);
929 pango_font_description_set_weight(style->font_desc, PANGO_WEIGHT_BOLD);
930
931 gtk_widget_modify_font(label, style->font_desc);
932
933 gtk_label_set_selectable(GTK_LABEL(label), TRUE);
934
935 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(about)->vbox), label);
936
937 GTK_BOX(GTK_DIALOG(about)->action_area)->spacing = 3;
938 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(about)->action_area), ok_button);
939
940 g_signal_connect_swapped(ok_button, "clicked",
941 G_CALLBACK(gtk_widget_destroy), about);
942
943 g_signal_connect(label, "expose-event", G_CALLBACK(gx_cairo::conv_widget_expose), NULL);
944 gtk_widget_show(ok_button);
945 gtk_widget_show(label);
946 return gtk_dialog_run (GTK_DIALOG(about));
1056947 }
1057948
1058949 /* meter button release */
1059 bool GxMainInterface::on_meter_button_release(GdkEventButton* ev)
1060 {
1061 if (ev->button == 1) {
1062 for (unsigned int i = 0; i < sizeof(fLevelMeters)/sizeof(fLevelMeters[0]); i++) {
1063 fLevelMeters[i].clear();
1064 }
1065 return true;
1066 }
1067 return false;
950 bool GxMainInterface::on_meter_button_release(GdkEventButton* ev) {
951 if (ev->button == 1) {
952 for (unsigned int i = 0; i < sizeof(fLevelMeters)/sizeof(fLevelMeters[0]); i++) {
953 fLevelMeters[i].clear();
954 }
955 return true;
956 }
957 return false;
1068958 }
1069959
1070960
1071961
1072962 /* ----- delete event ---- */
1073 gboolean gx_delete_event( GtkWidget *widget, gpointer data )
1074 {
1075 gtk_range_set_value(GTK_RANGE(widget), 0);
1076 return TRUE;
1077 }
1078
963 gboolean gx_delete_event(GtkWidget *widget, gpointer data ) {
964 gtk_range_set_value(GTK_RANGE(widget), 0);
965 return TRUE;
966 }
1079967 } /* end of gx_gui namespace */
968
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * ---------------------------------------------------------------------------
1718 *
1819 * This is the gx_head interface builder,
2122 * ----------------------------------------------------------------------------
2223 */
2324
24 #include "guitarix.h"
25 #include <glibmm/i18n.h>
26
27 //-------- the gx_head user interface build instruktions
25 #include "guitarix.h" // NOLINT
26
27 #include <glibmm/i18n.h> // NOLINT
28
29 // -------- the gx_head user interface build instruktions
2830
2931 namespace gx_gui {
3032
3133 #ifndef NDEBUG
3234 // debug_check
33 inline void all_midi_params_assigned()
34 {
35 for (ParamMap::iterator i = parameter_map.begin(); i != parameter_map.end(); i++) {
36 if (i->second->isControllable() && ! i->second->isUsed() && ! i->second->isExperimental())
37 gx_system::gx_print_error("Debug Check",
38 "midi-parameter not assigned in ui: " + i->first);
39 }
35 inline void all_midi_params_assigned() {
36 for (ParamMap::iterator i = parameter_map.begin(); i != parameter_map.end(); i++) {
37 if (i->second->isControllable() && !i->second->isUsed() && !i->second->isExperimental())
38 gx_system::gx_print_error("Debug Check",
39 "midi-parameter not assigned in ui: " + i->first);
40 }
4041 }
4142 #endif
4243
4344 /* -------- user interface builder ---------- */
44 void GxMainInterface::setup()
45 {
46
47 //----- the main box, all visible widgets are a child of this box
48 openVerticalBox("");
49
50 //----- add the menubar on top
51 {
52 addMainMenu();
53 openHorizontalBox("");
54 {
55 openVerticalBox("");
56 {
57
58 openToolBar(_("Plugins"));
45 void GxMainInterface::setup() {
46
47 // ----- the main box, all visible widgets are a child of this box
48 openVerticalBox("");
49
50 // ----- add the menubar on top
51 {
52 addMainMenu();
53 openHorizontalBox("");
54 {
55 openVerticalBox("");
56 {
57
58 openToolBar(_("Plugins"));
59 {
60 addPToggleButton("presets", &gx_engine::audio.viv);
61 }
62 closeBox();
63 addNumDisplay();
64 }
65 closeBox();
66
67 openVerticalBox("");
68 {
69 openEventBox(" "); // main widget start openMainBox(" ", "main_expose");
70 {
71 // ----- this is a dummy widget, only for save settings
72 // for the latency warning dialog
73 openWarningBox("WARNING", &gx_engine::audio.fwarn);
74 setSkinBox("SKIN", &gx_engine::audio.fskin);
75 openHorizontalBox("");
5976 {
60 addPToggleButton("presets",&gx_engine::audio.viv);
77 openSpaceBox("");
78 closeBox();
79 openSpaceBox("");
80 closeBox();
81 openSpaceBox("");
82 closeBox();
83 openSpaceBox("");
84 closeBox();
85 openSpaceBox("");
86 closeBox();
87
88 openFlipLabelBox("gx-2 ");
89 {
90 openHorizontalBox("");
91 {
92 openSpaceBox("");
93 closeBox();
94 openSpaceBox("");
95 closeBox();
96 openVerticalBox("");
97 {
98 openSpaceBox("");
99 closeBox();
100 openSpaceBox("");
101 closeBox();
102 openSpaceBox("");
103 closeBox();
104 openSpaceBox("");
105 closeBox();
106 openSpaceBox("");
107 closeBox();
108 openSpaceBox("");
109 closeBox();
110 openSpaceBox("");
111 closeBox();
112 create_bigknob("amp2.stage1.Pregain", _("Pre gain"));
113 openSpaceBox("");
114 closeBox();
115 }
116 closeBox();
117
118 openSpaceBox("");
119 closeBox();
120
121 openVerticalBox("");
122 {
123 openSpaceBox("");
124 closeBox();
125 openSpaceBox("");
126 closeBox();
127 openSpaceBox("");
128 closeBox();
129 openSpaceBox("");
130 closeBox();
131 openSpaceBox("");
132 closeBox();
133 openSpaceBox("");
134 closeBox();
135 openSpaceBox("");
136 closeBox();
137 create_bigknob("gxdistortion.drive", _(" Drive "));
138 openSpaceBox("");
139 closeBox();
140 }
141 closeBox();
142 openSpaceBox("");
143 closeBox();
144
145 openVerticalBox("");
146 {
147 openSpaceBox("");
148 closeBox();
149 openSpaceBox("");
150 closeBox();
151 openSpaceBox("");
152 closeBox();
153 openSpaceBox("");
154 closeBox();
155 openSpaceBox("");
156 closeBox();
157 openSpaceBox("");
158 closeBox();
159 openSpaceBox("");
160 closeBox();
161 create_bigknob("gxdistortion.wet_dry", _(" Clean/Dist "));
162 openSpaceBox("");
163 closeBox();
164 }
165 closeBox();
166 openSpaceBox("");
167 closeBox();
168
169 openVerticalBox("");
170 {
171 openSpaceBox("");
172 closeBox();
173 openSpaceBox("");
174 closeBox();
175 openSpaceBox("");
176 closeBox();
177 openSpaceBox("");
178 closeBox();
179 openSpaceBox("");
180 closeBox();
181 openSpaceBox("");
182 closeBox();
183 openSpaceBox("");
184 closeBox();
185 create_bigknob("amp2.stage2.gain1", _("Master gain"));
186 openSpaceBox("");
187 closeBox();
188 }
189 closeBox();
190 openSpaceBox("");
191 closeBox();
192 openSpaceBox("");
193 closeBox();
194 openSpaceBox("");
195 closeBox();
196
197 openVerticalBox("");
198 {
199 openSpaceBox("");
200 closeBox();
201 openSpaceBox("");
202 closeBox();
203 openSpaceBox("");
204 closeBox();
205 openSpaceBox("");
206 closeBox();
207 create_switch(sw_minitoggle, "amp.bass_boost.on_off",
208 _(" Bass boost "), Gtk::POS_RIGHT);
209 create_contrast_switch("con.on_off", _(" Presence "),
210 Gtk::POS_TOP);
211 create_switch(sw_minitoggle, "amp.feed_on_off", _(" Reverb "),
212 Gtk::POS_RIGHT);
213 create_minislider("amp.wet_dry");
214 openSpaceBox("");
215 closeBox();
216 }
217 closeBox();
218 openSpaceBox("");
219 closeBox();
220 openSpaceBox("");
221 closeBox();
222 openSpaceBox("");
223 closeBox();
224
225 openVerticalBox("");
226 {
227 openSpaceBox("");
228 closeBox();
229 openSpaceBox("");
230 closeBox();
231 openSpaceBox("");
232 closeBox();
233 openSpaceBox("");
234 closeBox();
235 openSpaceBox("");
236 closeBox();
237 openSpaceBox("");
238 closeBox();
239 openSpaceBox("");
240 closeBox();
241 openSpaceBox("");
242 closeBox();
243 openVerticalBox1("Convolver");
244 {
245 }
246 closeBox();
247 addJConvButton(_("set"), &gx_engine::audio.filebutton);
248 addJToggleButton(_("run"),
249 &gx_jconv::GxJConvSettings::checkbutton7);
250 openSpaceBox("");
251 closeBox();
252 }
253 closeBox();
254 openSpaceBox("");
255 closeBox();
256 openSpaceBox("");
257 closeBox();
258 openSpaceBox("");
259 closeBox();
260 openVerticalBox("");
261 {
262 openSpaceBox("");
263 closeBox();
264 openFrameBox("");
265 closeBox();
266 openFrameBox("");
267 closeBox();
268 openFrameBox("");
269 closeBox();
270 openHorizontalBox("");
271 {
272 openFrameBox("");
273 closeBox();
274 // add a meter level box: out of box stack,
275 // no need to closeBox
276 openLevelMeterBox("Signal Level");
277 openFrameBox("");
278 closeBox();
279 }
280 closeBox();
281 openFrameBox("");
282 closeBox();
283 }
284 closeBox();
285 openSpaceBox("");
286 closeBox();
287 openSpaceBox("");
288 closeBox();
289 }
290 closeBox();
291 openSpaceBox("");
292 closeBox();
293 openSpaceBox("");
294 closeBox();
295 openSpaceBox("");
296 closeBox();
297 }
298 closeBox();
299 openSpaceBox("");
300 closeBox();
301 openSpaceBox("");
302 closeBox();
303 openSpaceBox("");
304 closeBox();
305 openSpaceBox("");
306 closeBox();
307 openSpaceBox("");
308 closeBox();
309 openSpaceBox("");
310 closeBox();
61311 }
62312 closeBox();
63 addNumDisplay();
64 }
65 closeBox();
66
67 openVerticalBox("");
68 {
69 openEventBox(" "); //main widget start
313 }
314 closeBox(); // main widget end
315 // add racks
316 openScrollBox("");
317 {
318 openPlugBox(_("Mono Rack"));
70319 {
71 //----- this is a dummy widget, only for save settings for the latency warning dialog
72 openWarningBox("WARNING", &gx_engine::audio.fwarn);
73 setSkinBox("SKIN", &gx_engine::audio.fskin);
74 openHorizontalBox("");
75 {
76 openSpaceBox("");
77 closeBox();
78 openSpaceBox("");
79 closeBox();
80 openSpaceBox("");
81 closeBox();
82 openSpaceBox("");
83 closeBox();
84 openSpaceBox("");
85 closeBox();
86
87 openFlipLabelBox("gx-2 ");
88 {
89 openHorizontalBox("");
90 {
91 openSpaceBox("");
92 closeBox();
93 openSpaceBox("");
94 closeBox();
95 openVerticalBox("");
96 {
97 openSpaceBox("");
98 closeBox();
99 openSpaceBox("");
100 closeBox();
101 openSpaceBox("");
102 closeBox();
103 openSpaceBox("");
104 closeBox();
105 openSpaceBox("");
106 closeBox();
107 openSpaceBox("");
108 closeBox();
109 openSpaceBox("");
110 closeBox();
111 create_bigknob("amp2.stage1.Pregain", _("Pre gain"));
112 openSpaceBox("");
113 closeBox();
114 }
115 closeBox();
116
117 openSpaceBox("");
118 closeBox();
119
120 openVerticalBox("");
121 {
122 openSpaceBox("");
123 closeBox();
124 openSpaceBox("");
125 closeBox();
126 openSpaceBox("");
127 closeBox();
128 openSpaceBox("");
129 closeBox();
130 openSpaceBox("");
131 closeBox();
132 openSpaceBox("");
133 closeBox();
134 openSpaceBox("");
135 closeBox();
136 create_bigknob("gxdistortion.drive",_(" Drive "));
137 openSpaceBox("");
138 closeBox();
139 }
140 closeBox();
141 openSpaceBox("");
142 closeBox();
143
144 openVerticalBox("");
145 {
146 openSpaceBox("");
147 closeBox();
148 openSpaceBox("");
149 closeBox();
150 openSpaceBox("");
151 closeBox();
152 openSpaceBox("");
153 closeBox();
154 openSpaceBox("");
155 closeBox();
156 openSpaceBox("");
157 closeBox();
158 openSpaceBox("");
159 closeBox();
160 create_bigknob("gxdistortion.wet_dry",_(" Clean/Dist "));
161 openSpaceBox("");
162 closeBox();
163 }
164 closeBox();
165 openSpaceBox("");
166 closeBox();
167
168 openVerticalBox("");
169 {
170 openSpaceBox("");
171 closeBox();
172 openSpaceBox("");
173 closeBox();
174 openSpaceBox("");
175 closeBox();
176 openSpaceBox("");
177 closeBox();
178 openSpaceBox("");
179 closeBox();
180 openSpaceBox("");
181 closeBox();
182 openSpaceBox("");
183 closeBox();
184 create_bigknob("amp2.stage2.gain1", _("Master gain"));
185 openSpaceBox("");
186 closeBox();
187 }
188 closeBox();
189 openSpaceBox("");
190 closeBox();
191 openSpaceBox("");
192 closeBox();
193 openSpaceBox("");
194 closeBox();
195
196 openVerticalBox("");
197 {
198 openSpaceBox("");
199 closeBox();
200 openSpaceBox("");
201 closeBox();
202 openSpaceBox("");
203 closeBox();
204 openSpaceBox("");
205 closeBox();
206 create_switch(sw_minitoggle, "amp.bass_boost.on_off", _(" Bass boost "), Gtk::POS_RIGHT);
207 create_contrast_switch("con.on_off",_(" Presence "), Gtk::POS_TOP);
208 create_switch(sw_minitoggle, "amp.feed_on_off", _(" Reverb "), Gtk::POS_RIGHT);
209 create_minislider("amp.wet_dry");
210 openSpaceBox("");
211 closeBox();
212 }
213 closeBox();
214 openSpaceBox("");
215 closeBox();
216 openSpaceBox("");
217 closeBox();
218 openSpaceBox("");
219 closeBox();
220
221 openVerticalBox("");
222 {
223 openSpaceBox("");
224 closeBox();
225 openSpaceBox("");
226 closeBox();
227 openSpaceBox("");
228 closeBox();
229 openSpaceBox("");
230 closeBox();
231 openSpaceBox("");
232 closeBox();
233 openSpaceBox("");
234 closeBox();
235 openSpaceBox("");
236 closeBox();
237 openSpaceBox("");
238 closeBox();
239 openVerticalBox1("Convolver");
240 {
241 }
242 closeBox();
243 addJConvButton(_("set"), &gx_engine::audio.filebutton);
244 addJToggleButton(_("run"), &gx_jconv::GxJConvSettings::checkbutton7);
245 openSpaceBox("");
246 closeBox();
247 }
248 closeBox();
249 openSpaceBox("");
250 closeBox();
251 openSpaceBox("");
252 closeBox();
253 openSpaceBox("");
254 closeBox();
255 openVerticalBox("");
256 {
257 openSpaceBox("");
258 closeBox();
259 openFrameBox("");
260 closeBox();
261 openFrameBox("");
262 closeBox();
263 openFrameBox("");
264 closeBox();
265 openHorizontalBox("");
266 {
267 openFrameBox("");
268 closeBox();
269 // add a meter level box: out of box stack, no need to closeBox
270 openLevelMeterBox("Signal Level");
271 openFrameBox("");
272 closeBox();
273 }
274 closeBox();
275 openFrameBox("");
276 closeBox();
277 }
278 closeBox();
279 openSpaceBox("");
280 closeBox();
281 openSpaceBox("");
282 closeBox();
283
284 }
285 closeBox();
286 openSpaceBox("");
287 closeBox();
288 openSpaceBox("");
289 closeBox();
290 openSpaceBox("");
291 closeBox();
292
293 }
294 closeBox();
295 openSpaceBox("");
296 closeBox();
297 openSpaceBox("");
298 closeBox();
299 openSpaceBox("");
300 closeBox();
301 openSpaceBox("");
302 closeBox();
303 openSpaceBox("");
304 closeBox();
305 openSpaceBox("");
306 closeBox();
307 }
308 closeBox();
309 }
310 closeBox(); // main widget end
311 // add racks
312 openScrollBox("");
313 {
314 openPlugBox(_("Mono Rack"));
315 {
316 gx_build_mono_rack();
317 }
318 closeBox();
319
320 openAmpBox(_("Stereo Rack"));
321 {
322 gx_build_stereo_rack();
323 }
324 closeBox();
320 gx_build_mono_rack();
325321 }
326322 closeBox();
327 }
328 closeBox();
329 }
330 closeBox();
331 }
332 closeBox();
333 // add a Patch Info widget
334 openPatchInfoBox(&gx_gui::show_patch_info);
335
336 openTextLoggingBox(_("Logging Window"));
337
338 debug_check(all_midi_params_assigned);
323
324 openAmpBox(_("Stereo Rack"));
325 {
326 gx_build_stereo_rack();
327 }
328 closeBox();
329 }
330 closeBox();
331 }
332 closeBox();
333 }
334 closeBox();
335 }
336 closeBox();
337 // add a Patch Info widget
338 openPatchInfoBox(&gx_gui::show_patch_info);
339
340 openTextLoggingBox(_("Logging Window"));
341
342 debug_check(all_midi_params_assigned);
339343 }
340
341344 }
345
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * --------------------------------------------------------------------------
1718 *
1819 * This is the gx_head interface to the jackd audio / midi server
1920 *
2021 * --------------------------------------------------------------------------
2122 */
22 #include <cstring>
23 #include <fstream>
24 #include <errno.h>
25 #include <jack/statistics.h>
26 #include <jack/jack.h>
27 #include "guitarix.h"
28 #include <glibmm/i18n.h>
23
24 #include "guitarix.h" // NOLINT
25
26 #include <errno.h> // NOLINT
27 #include <jack/statistics.h> // NOLINT
28 #include <jack/jack.h> // NOLINT
29 #include <glibmm/i18n.h> // NOLINT
2930
3031 #ifdef HAVE_JACK_SESSION
31 #include <jack/session.h>
32 #include <jack/session.h> // NOLINT
3233 #endif
3334
34 using namespace gx_system;
35 using namespace gx_engine;
36 using namespace gx_jconv;
37 using namespace gx_child_process;
38
39 namespace gx_jack
40 {
35 #include <cstring> // NOLINT
36 #include <string> // NOLINT
37 #include <fstream> // NOLINT
38 #include <list> // NOLINT
39
40
41 namespace gx_jack {
4142
4243 sem_t jack_sync_sem;
4344
44 //----- pop up a dialog for starting jack
45 bool gx_jack_init( const string *optvar )
46 {
47 jack_status_t jackstat;
48 client_name = "gx_head_amp";
49 client_insert_name = "gx_head_fx";
50 client_instance = "gx_head";
51 int jack_is_fresh = 0;
52
53 AVOIDDENORMALS;
54
55 sem_init(&jack_sync_sem, 0, 0);
56
57 // init the pointer to the jackbuffer
58 for (int i=0; i < nOPorts; i++) output_ports[i] = 0;
59 for (int i=0; i < nIPorts; i++) input_ports [i] = 0;
45 GxJack gxjack;
46
47 // ----- pop up a dialog for starting jack
48 bool gx_jack_init(const string *optvar) {
49 jack_status_t jackstat;
50 client_name = "gx_head_amp";
51 client_insert_name = "gx_head_fx";
52 client_instance = "gx_head";
53 int jack_is_fresh = 0;
54
55 AVOIDDENORMALS;
56
57 sem_init(&jack_sync_sem, 0, 0);
58
59 // init the pointer to the jackbuffer
60 for (int i = 0; i < gxjack.nOPorts; i++) gxjack.output_ports[i] = 0;
61 for (int i = 0; i < gxjack.nIPorts; i++) gxjack.input_ports[i] = 0;
6062
6163 #ifdef HAVE_JACK_SESSION
62 // try to open jack client
63 if (! optvar[JACK_UUID].empty()) {
64
65 client = jack_client_open (client_name.c_str(), jack_options_t(JackNoStartServer | JackSessionID), &jackstat, optvar[JACK_UUID].c_str());
66 } else {
67 client = jack_client_open (client_name.c_str(), JackNoStartServer, &jackstat);
68 }
64 // try to open jack gxjack.client
65 if (!optvar[JACK_UUID].empty()) {
66
67 gxjack.client = jack_client_open(client_name.c_str(),
68 jack_options_t(JackNoStartServer | JackSessionID),
69 &jackstat, optvar[JACK_UUID].c_str());
70 } else {
71 gxjack.client = jack_client_open(client_name.c_str(), JackNoStartServer, &jackstat);
72 }
6973 #else
70 client = jack_client_open (client_name.c_str(), JackNoStartServer, &jackstat);
74 gxjack.client = jack_client_open(client_name.c_str(), JackNoStartServer, &jackstat);
7175 #endif
72 // ----- only start the insert client when the amp client is true
73 if (client) {
74 client_insert = jack_client_open (client_insert_name.c_str(), JackNoStartServer, &jackstat);
75 }
76 if (client == 0) {
77 // skip useless message
78 //gx_print_warning("Jack Init", "not yet a jack client");
79
80 // if jackd is running, let's call ourselves again
81 if (gx_system_call("pgrep", "jackd", true) == SYSTEM_OK) {
82 gx_print_warning(_("Jack Init"), _("jackd OK, trying to be a client"));
83 usleep(500000);
84 return gx_jack_init( optvar );
85 }
86
87 // start a dialog
88 if (gx_start_jack_dialog())
89 {
90 usleep(500000);
91 // so let's try to be a jack client again
92 client = jack_client_open (client_name.c_str(), JackNoStartServer, &jackstat);
93 client_insert = jack_client_open (client_insert_name.c_str(), JackNoStartServer, &jackstat);
94
95 if (!client)
96 {
97 gx_print_error(_("main"),
98 string(_("I really tried to get jack up and running, sorry ... ")));
99 return false;
100 }
101 jack_is_fresh = 1;
102 }
103
104 else // we give up
105 {
106 gx_print_error(_("main"),
107 string(_("Ignoring jackd ...")));
108 return false;
109 }
110 }
111
112 // ----------------------------------
113 jack_is_down = false;
114 is_rt = jack_is_realtime (client);
115
116 // it is maybe not the 1st gx_head instance ?
117 if (jackstat & JackNameNotUnique) {
118 client_name = jack_get_client_name (client);
119 client_insert_name = jack_get_client_name (client_insert);
120 assert(client_name.substr(0,11) == "gx_head_amp");
121 client_instance = client_name.substr(0,8) + client_name.substr(12);
122 }
123
124 #ifdef USE_RINGBUFFER
125 jack_ringbuffer = jack_ringbuffer_create(2048*sizeof(struct MidiMessage));
126
127 if (jack_ringbuffer == NULL)
128 {
129 g_critical(_("Cannot create JACK ringbuffer."));
130 gx_clean_exit(NULL, NULL);
131 }
132
133 jack_ringbuffer_reset(jack_ringbuffer);
134 jack_ringbuffer_mlock(jack_ringbuffer);
135
136 #endif
137
138 jack_sr = jack_get_sample_rate (client); // jack sample rate
139 ostringstream s;
140 s << _("The jack sample rate is ") << jack_sr << _("/sec");
141 gx_print_info(_("Jack init"), s.str().c_str());
142
143 jack_bs = jack_get_buffer_size (client); // jack buffer size
144 s.str("");
145 s << _("The jack buffer size is ") << jack_bs << _("/frames ... ");
146
147 gx_print_info(_("Jack init"), s.str());
148
149
150 if (gx_gui::fWindow) {
151 string window_name = "gx_head";
152 gtk_window_set_title (GTK_WINDOW (gx_gui::fWindow), window_name.c_str());
153 }
154 if(jack_is_fresh) sleep(8);
155 return true;
156 }
157
158 struct PortConnData
159 {
160 string name_a, name_b;
161 int connect;
162 PortConnData(string a, string b, int conn): name_a(a), name_b(b), connect(conn) {}
76 // ----- only start the insert gxjack.client when the amp gxjack.client is true
77 if (gxjack.client) {
78 gxjack.client_insert = jack_client_open(client_insert_name.c_str(),
79 JackNoStartServer, &jackstat);
80 }
81 if (gxjack.client == 0) {
82 // skip useless message
83 // gx_print_warning("Jack Init", "not yet a jack gxjack.client");
84
85 // if jackd is running, let's call ourselves again
86 if (gx_system::gx_system_call("pgrep", "jackd", true) == gx_system::SYSTEM_OK) {
87 gx_system::gx_print_warning(_("Jack Init"),
88 _("jackd OK, trying to be a gxjack.client"));
89 usleep(500000);
90 return gx_jack_init( optvar );
91 }
92
93 // start a dialog
94 if (gx_start_jack_dialog()) {
95 usleep(500000);
96 // so let's try to be a jack gxjack.client again
97 gxjack.client = jack_client_open(client_name.c_str(), JackNoStartServer,
98 &jackstat);
99 gxjack.client_insert = jack_client_open(client_insert_name.c_str(),
100 JackNoStartServer, &jackstat);
101
102 if (!gxjack.client) {
103 gx_system::gx_print_error(_("main"),
104 string(_("I really tried to get jack up and running, sorry ... ")));
105 return false;
106 }
107 jack_is_fresh = 1;
108 } else { // we give up
109 gx_system::gx_print_error(_("main"),
110 string(_("Ignoring jackd ...")));
111 return false;
112 }
113 }
114
115 // ----------------------------------
116 jack_is_down = false;
117 gxjack.is_rt = jack_is_realtime(gxjack.client);
118
119 // it is maybe not the 1st gx_head instance ?
120 if (jackstat & JackNameNotUnique) {
121 client_name = jack_get_client_name(gxjack.client);
122 client_insert_name = jack_get_client_name(gxjack.client_insert);
123 assert(client_name.substr(0, 11) == "gx_head_amp");
124 client_instance = client_name.substr(0, 8) + client_name.substr(12);
125 }
126
127 gxjack.jack_sr = jack_get_sample_rate(gxjack.client); // jack sample rate
128 ostringstream s;
129 s << _("The jack sample rate is ") << gxjack.jack_sr << _("/sec");
130 gx_system::gx_print_info(_("Jack init"), s.str().c_str());
131
132 gxjack.jack_bs = jack_get_buffer_size(gxjack.client); // jack buffer size
133 s.str("");
134 s << _("The jack buffer size is ") << gxjack.jack_bs << _("/frames ... ");
135
136 gx_system::gx_print_info(_("Jack init"), s.str());
137
138
139 if (gx_gui::gw.fWindow) {
140 string window_name = "gx_head";
141 gtk_window_set_title(GTK_WINDOW(gx_gui::gw.fWindow), window_name.c_str());
142 }
143 if (jack_is_fresh) sleep(8);
144 return true;
145 }
146
147 struct PortConnData {
148 string name_a, name_b;
149 int connect;
150 PortConnData(string a, string b, int conn): name_a(a), name_b(b), connect(conn) {}
163151 };
164152
165 static gboolean gx_jack_portconn_helper(gpointer data)
166 {
167 PortConnData *pc = (PortConnData*)data;
168 if (gx_gui::PortMapWindow::instance) {
169 gx_gui::PortMapWindow::instance->connection_changed(pc->name_a, pc->name_b, pc->connect);
170 }
171 delete pc;
172 return FALSE;
173 }
174
175 static void gx_jack_portconn_callback(jack_port_id_t a, jack_port_id_t b, int connect, void*)
176 {
177 if (!client) {
178 return;
179 }
180 jack_port_t* port_a = jack_port_by_id(client, a);
181 jack_port_t* port_b = jack_port_by_id(client, b);
182 if (!port_a || !port_b) {
183 return;
184 }
185 gtk_idle_add(gx_jack_portconn_helper,
186 new PortConnData(jack_port_name(port_a), jack_port_name(port_b),
187 connect));
188 // check if we are connected
189 const char** port = jack_port_get_connections(input_ports[0]);
190 if (port) { // might be 0 (e.g. due to race conditions)
153 static gboolean gx_jack_portconn_helper(gpointer data) {
154 PortConnData *pc = reinterpret_cast<PortConnData*>(data);
155 if (gx_portmap::PortMapWindow::instance) {
156 gx_portmap::PortMapWindow::instance->connection_changed(pc->name_a, pc->name_b,
157 pc->connect);
158 }
159 delete pc;
160 return FALSE;
161 }
162
163 static void gx_jack_portconn_callback(jack_port_id_t a, jack_port_id_t b, int connect, void*) {
164 if (!gxjack.client) {
165 return;
166 }
167 jack_port_t* port_a = jack_port_by_id(gxjack.client, a);
168 jack_port_t* port_b = jack_port_by_id(gxjack.client, b);
169 if (!port_a || !port_b) {
170 return;
171 }
172 gtk_idle_add(gx_jack_portconn_helper,
173 new PortConnData(jack_port_name(port_a), jack_port_name(port_b),
174 connect));
175 // check if we are connected
176 const char** port = jack_port_get_connections(gxjack.input_ports[0]);
177 if (port) { // might be 0 (e.g. due to race conditions)
191178
192179 NO_CONNECTION = 0;
193180 free(port);
194 }
195 else {
181 } else {
196182 NO_CONNECTION = 1;
197183 }
198184 }
199185
200186
201 //----- set client callbacks and activate client
187 // ----- set gxjack.client callbacks and activate gxjack.client
202188 // Note: to be called after gx_engine::gx_engine_init()
203 void gx_jack_callbacks_and_activate()
204 {
205 //----- set the jack callbacks
206 jack_set_xrun_callback(client, gx_jack_xrun_callback, NULL);
207 jack_set_sample_rate_callback(client, gx_jack_srate_callback, 0);
208 jack_on_shutdown(client, gx_jack_shutdown_callback, NULL);
209 jack_set_buffer_size_callback (client, gx_jack_buffersize_callback, 0);
210 jack_set_process_callback(client, gx_jack_process, 0);
211 jack_set_process_callback(client_insert, gx_jack_insert_process, 0);
212 jack_set_port_registration_callback(client, gx_jack_portreg_callback, 0);
213 jack_set_port_connect_callback(client, gx_jack_portconn_callback, 0);
189 void gx_jack_callbacks_and_activate() {
190 // ----- set the jack callbacks
191 jack_set_xrun_callback(gxjack.client, gx_jack_xrun_callback, NULL);
192 jack_set_sample_rate_callback(gxjack.client, gx_jack_srate_callback, 0);
193 jack_on_shutdown(gxjack.client, gx_jack_shutdown_callback, NULL);
194 jack_set_buffer_size_callback(gxjack.client, gx_jack_buffersize_callback, 0);
195 jack_set_process_callback(gxjack.client, gx_jack_process, 0);
196 jack_set_process_callback(gxjack.client_insert, gx_jack_insert_process, 0);
197 jack_set_port_registration_callback(gxjack.client, gx_jack_portreg_callback, 0);
198 jack_set_port_connect_callback(gxjack.client, gx_jack_portconn_callback, 0);
214199 #ifdef HAVE_JACK_SESSION
215 if (jack_set_session_callback) {
216 jack_set_session_callback (client, gx_jack_session_callback, 0);
217 }
200 if (jack_set_session_callback) {
201 jack_set_session_callback(gxjack.client, gx_jack_session_callback, 0);
202 }
218203 #endif
219204
220 //----- register the midi input channel
221 midi_input_port =
222 jack_port_register(client, "midi_in_1", JACK_DEFAULT_MIDI_TYPE, JackPortIsInput, 0);
223
224 //----- register the input channel
225 input_ports[0] =
226 jack_port_register(client, "in_0", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
227 input_ports[1] =
228 jack_port_register(client_insert, "in_0", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
229
230 //----- register the midi output channel
231 midi_output_ports =
232 jack_port_register(client, "midi_out_1", JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0);
233
234 //----- register the audio output channels
235 for (int i = 0; i < 1; i++) {
236 ostringstream buf;
237 buf << "out_" << i;
238 output_ports[i] =
239 jack_port_register(client, buf.str().c_str(),
240 JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
241 }
242 //----- register the audio fx output channels
243 for (int i = 2; i < 4; i++) {
244 ostringstream buf;
245 buf << "out_" << i-2;
246 output_ports[i] =
247 jack_port_register(client_insert, buf.str().c_str(),
248 JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
249 }
250
251 //----- ready to go
252 if (jack_activate(client))
253 {
254 gx_print_error(_("Jack Activation"),
255 string(_("Can't activate JACK client")));
256 gx_clean_exit(NULL, NULL);
257 }
258 if (jack_activate(client_insert))
259 {
260 gx_print_error(_("Jack Activation"),
261 string(_("Can't activate JACK client")));
262 gx_clean_exit(NULL, NULL);
263 }
264 }
265
266 static gboolean gx_engine_restart(gpointer data)
267 {
268 usleep(5);
269 checky = kEngineOn;
270 return false;
271 }
272
273 //----- connect ports if we know them
274 void gx_jack_init_port_connection(const string* optvar)
275 {
205 // ----- register the midi input channel
206 gxjack.midi_input_port =
207 jack_port_register(gxjack.client, "midi_in_1", JACK_DEFAULT_MIDI_TYPE,
208 JackPortIsInput, 0);
209
210 // ----- register the input channel
211 gxjack.input_ports[0] =
212 jack_port_register(gxjack.client, "in_0", JACK_DEFAULT_AUDIO_TYPE,
213 JackPortIsInput, 0);
214 gxjack.input_ports[1] =
215 jack_port_register(gxjack.client_insert, "in_0", JACK_DEFAULT_AUDIO_TYPE,
216 JackPortIsInput, 0);
217
218 // ----- register the midi output channel
219 gxjack.midi_output_ports =
220 jack_port_register(gxjack.client, "midi_out_1", JACK_DEFAULT_MIDI_TYPE,
221 JackPortIsOutput, 0);
222
223 // ----- register the audio output channels
224 for (int i = 0; i < 1; i++) {
225 ostringstream buf;
226 buf << "out_" << i;
227 gxjack.output_ports[i] =
228 jack_port_register(gxjack.client, buf.str().c_str(),
229 JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
230 }
231 // ----- register the audio fx output channels
232 for (int i = 2; i < 4; i++) {
233 ostringstream buf;
234 buf << "out_" << i-2;
235 gxjack.output_ports[i] =
236 jack_port_register(gxjack.client_insert, buf.str().c_str(),
237 JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
238 }
239
240 // ----- ready to go
241 if (jack_activate(gxjack.client)) {
242 gx_system::gx_print_error(_("Jack Activation"),
243 string(_("Can't activate JACK gxjack.client")));
244 gx_system::gx_clean_exit(NULL, NULL);
245 }
246 if (jack_activate(gxjack.client_insert)) {
247 gx_system::gx_print_error(_("Jack Activation"),
248 string(_("Can't activate JACK gxjack.client")));
249 gx_system::gx_clean_exit(NULL, NULL);
250 }
251 }
252
253 static gboolean gx_engine_restart(gpointer data) {
254 usleep(5);
255 gx_engine::checky = gx_engine::kEngineOn;
256 return false;
257 }
258
259 // ----- connect ports if we know them
260 void gx_jack_init_port_connection(const string* optvar) {
276261 // set engine off for one GTK thread cycle to avoid Xrun at startup
277 gx_gui::g_threads[4] = g_idle_add_full(G_PRIORITY_HIGH_IDLE+20,gx_engine_restart,NULL,NULL);
278 checky = kEngineOff;
279
280 // set autoconnect capture to user capture port
281 if (!optvar[JACK_INP].empty())
282 {
283 jack_connect(client, optvar[JACK_INP].c_str(),
284 jack_port_name(input_ports[0]));
285 } else {
286 list<string>& l = jack_connection_lists[kAudioInput];
287 for (list<string>::iterator i = l.begin(); i != l.end(); i++) {
288 jack_connect(client, i->c_str(), jack_port_name(input_ports[0]));
289 }
290 }
291
292 // set autoconnect midi to user midi port
293 if (midi_input_port && !optvar[JACK_MIDI].empty())
294 {
295 jack_connect(client, optvar[JACK_MIDI].c_str(),
296 jack_port_name(midi_input_port));
297 } else {
298 list<string>& l = jack_connection_lists[kMidiInput];
299 for (list<string>::iterator i = l.begin(); i != l.end(); i++) {
300 jack_connect(client, i->c_str(), jack_port_name(midi_input_port));
301 }
302 }
303
304 // set autoconnect to user playback ports
305 if (optvar[JACK_OUT1].empty() && optvar[JACK_OUT2].empty()) {
306 list<string>& l1 = jack_connection_lists[kAudioOutput1];
307 for (list<string>::iterator i = l1.begin(); i != l1.end(); i++) {
308 jack_connect(client_insert, jack_port_name(output_ports[2]), i->c_str());
309 }
310 list<string>& l2 = jack_connection_lists[kAudioOutput2];
311 for (list<string>::iterator i = l2.begin(); i != l2.end(); i++) {
312 jack_connect(client_insert, jack_port_name(output_ports[3]), i->c_str());
313 }
314 } else {
315 int idx = JACK_OUT1;
316 for (int i = 2; i < 4; i++) {
317 if (!optvar[idx].empty()) {
318 jack_connect(client_insert,
319 jack_port_name(output_ports[i]), optvar[idx].c_str());
320 }
321 idx++;
322 }
323 }
324
325 // autoconnect midi output port
326 list<string>& lmo = jack_connection_lists[kMidiOutput];
327 for (list<string>::iterator i = lmo.begin(); i != lmo.end(); i++) {
328 jack_connect(client, jack_port_name(midi_output_ports), i->c_str());
329 }
330
331 // autoconnect to insert ports
332 list<string>& lins_in = jack_connection_lists[kAudioInsertIn];
333 list<string>& lins_out = jack_connection_lists[kAudioInsertOut];
334 bool ifound = false, ofound = false;
335 for (list<string>::iterator i = lins_in.begin(); i != lins_in.end(); i++) {
336 int rc = jack_connect(client_insert, i->c_str(), jack_port_name(input_ports[1]));
337 if (rc == 0 || rc == EEXIST) {
338 ifound = true;
339 }
340 }
341 for (list<string>::iterator i = lins_out.begin(); i != lins_out.end(); i++) {
342 int rc = jack_connect(client, jack_port_name(output_ports[0]), i->c_str());
343 if (rc == 0 || rc == EEXIST) {
344 ofound = true;
345 }
346 }
347 if (!ifound || !ofound) {
348 jack_connect(client_insert, jack_port_name(output_ports[0]), (client_insert_name+":in_0").c_str());
349 }
350
351 }
352
353 //----- pop up a dialog for starting jack
354 bool gx_start_jack_dialog()
355 {
356 //--- run dialog and check response
357 const guint nchoices = 3;
358
359 const char* labels[] =
360 {
361 _("Start Jack"), _("Ignore Jack"), _("Exit")
362 };
363
364 const gint responses[] =
365 {
366 GTK_RESPONSE_YES, GTK_RESPONSE_NO, GTK_RESPONSE_CANCEL
367 };
368
369 gint response =
370 gx_gui::gx_nchoice_dialog_without_entry (
371 _(" Jack Starter "),
372 _("\n WARNING \n\n"
373 " The jack server is not currently running\n"
374 " You can choose to activate it or terminate gx_head \n\n"
375 " 1) activate jack \n"
376 " 2) ignore jack, start gx_head anyway \n"
377 " 3) exit gx_head \n"),
378 nchoices,
379 labels,
380 responses,
381 GTK_RESPONSE_YES
382 );
383
384 // we are cancelling
385 bool retstat = false;
386
387 switch (response)
388 {
389 case GTK_RESPONSE_NO:
390 jack_is_down = true;
391 break;
392
393 case GTK_RESPONSE_CANCEL:
394 gx_abort(NULL);
395 break;
396
397 default:
398 case GTK_RESPONSE_YES:
399 retstat = gx_start_jack(NULL);
400 break;
401 }
402
403 // start jack
404 return retstat;
405 }
406
407
408 //----start jack if possible
409 bool gx_start_jack(void* arg)
410 {
411 // first, let's try via qjackctl
412 if (gx_system_call("which", "qjackctl", true) == SYSTEM_OK)
413 {
414 if (gx_system_call("qjackctl", "--start", true, true) == SYSTEM_OK)
415 {
416 sleep(5);
417
418 // let's check it is really running
419 if (gx_system_call("pgrep", "jackd", true) == SYSTEM_OK)
420 {
421 return true;
422 }
423 }
424 }
425
426 // qjackctl not found or not started, let's try .jackdrc
427 string jackdrc = "$HOME/.jackdrc";
428 if (gx_system_call("ls", jackdrc.c_str(), true, false) == SYSTEM_OK)
429 {
430 // open it
431 jackdrc = string(getenv("HOME")) + string("/") + ".jackdrc";
432 string cmdline = "";
433
434 ifstream f(jackdrc.c_str());
435 if (f.good())
436 {
437 // should contain only one command line
438 getline(f, cmdline);
439 f.close();
440 }
441
442 // launch jackd
443 if (!cmdline.empty())
444 if (gx_system_call(cmdline.c_str(), "", true, true) == SYSTEM_OK)
445 {
446 sleep(2);
447
448 // let's check it is really running
449 if (gx_system_call("pgrep", "jackd", true) == SYSTEM_OK)
450 {
451 return true;
452 }
453 }
454
455 }
456
457 return false;
458 }
459
460 static gboolean gx_ports_refresh(gpointer data)
461 {
462 // reload ports for portmap widget when needed
463 if (gx_gui::PortMapWindow::instance) {
464 gx_gui::PortMapWindow::instance->refresh();
465 }
262 gx_gui::g_threads[4] = g_idle_add_full(G_PRIORITY_HIGH_IDLE+20, gx_engine_restart,
263 NULL, NULL);
264 gx_engine::checky = gx_engine::kEngineOff;
265
266 // set autoconnect capture to user capture port
267 if (!optvar[JACK_INP].empty()) {
268 jack_connect(gxjack.client, optvar[JACK_INP].c_str(),
269 jack_port_name(gxjack.input_ports[0]));
270 } else {
271 list<string>& l = gx_system::jack_connection_lists[kAudioInput];
272 for (list<string>::iterator i = l.begin(); i != l.end(); i++) {
273 jack_connect(gxjack.client, i->c_str(), jack_port_name(gxjack.input_ports[0]));
274 }
275 }
276
277 // set autoconnect midi to user midi port
278 if (gxjack.midi_input_port && !optvar[JACK_MIDI].empty()) {
279 jack_connect(gxjack.client, optvar[JACK_MIDI].c_str(),
280 jack_port_name(gxjack.midi_input_port));
281 } else {
282 list<string>& l = gx_system::jack_connection_lists[kMidiInput];
283 for (list<string>::iterator i = l.begin(); i != l.end(); i++) {
284 jack_connect(gxjack.client, i->c_str(), jack_port_name(gxjack.midi_input_port));
285 }
286 }
287
288 // set autoconnect to user playback ports
289 if (optvar[JACK_OUT1].empty() && optvar[JACK_OUT2].empty()) {
290 list<string>& l1 = gx_system::jack_connection_lists[kAudioOutput1];
291 for (list<string>::iterator i = l1.begin(); i != l1.end(); i++) {
292 jack_connect(gxjack.client_insert, jack_port_name(gxjack.output_ports[2]), i->c_str());
293 }
294 list<string>& l2 = gx_system::jack_connection_lists[kAudioOutput2];
295 for (list<string>::iterator i = l2.begin(); i != l2.end(); i++) {
296 jack_connect(gxjack.client_insert, jack_port_name(gxjack.output_ports[3]), i->c_str());
297 }
298 } else {
299 int idx = JACK_OUT1;
300 for (int i = 2; i < 4; i++) {
301 if (!optvar[idx].empty()) {
302 jack_connect(gxjack.client_insert,
303 jack_port_name(gxjack.output_ports[i]), optvar[idx].c_str());
304 }
305 idx++;
306 }
307 }
308
309 // autoconnect midi output port
310 list<string>& lmo = gx_system::jack_connection_lists[kMidiOutput];
311 for (list<string>::iterator i = lmo.begin(); i != lmo.end(); i++) {
312 jack_connect(gxjack.client, jack_port_name(gxjack.midi_output_ports), i->c_str());
313 }
314
315 // autoconnect to insert ports
316 list<string>& lins_in = gx_system::jack_connection_lists[kAudioInsertIn];
317 list<string>& lins_out = gx_system::jack_connection_lists[kAudioInsertOut];
318 bool ifound = false, ofound = false;
319 for (list<string>::iterator i = lins_in.begin(); i != lins_in.end(); i++) {
320 int rc = jack_connect(gxjack.client_insert, i->c_str(),
321 jack_port_name(gxjack.input_ports[1]));
322 if (rc == 0 || rc == EEXIST) {
323 ifound = true;
324 }
325 }
326 for (list<string>::iterator i = lins_out.begin(); i != lins_out.end(); i++) {
327 int rc = jack_connect(gxjack.client, jack_port_name(gxjack.output_ports[0]), i->c_str());
328 if (rc == 0 || rc == EEXIST) {
329 ofound = true;
330 }
331 }
332 if (!ifound || !ofound) {
333 jack_connect(gxjack.client_insert, jack_port_name(gxjack.output_ports[0]),
334 (client_insert_name+":in_0").c_str());
335 }
336 }
337
338 // ----- pop up a dialog for starting jack
339 bool gx_start_jack_dialog() {
340 // --- run dialog and check response
341 const guint nchoices = 3;
342
343 const char* labels[] = {
344 _("Start Jack"), _("Ignore Jack"), _("Exit")
345 };
346
347 const gint responses[] = {
348 GTK_RESPONSE_YES, GTK_RESPONSE_NO, GTK_RESPONSE_CANCEL
349 };
350
351 gint response =
352 gx_gui::gx_nchoice_dialog_without_entry(
353 _(" Jack Starter "),
354 _("\n WARNING \n\n"
355 " The jack server is not currently running\n"
356 " You can choose to activate it or terminate gx_head \n\n"
357 " 1) activate jack \n"
358 " 2) ignore jack, start gx_head anyway \n"
359 " 3) exit gx_head \n"),
360 nchoices,
361 labels,
362 responses,
363 GTK_RESPONSE_YES);
364
365 // we are cancelling
366 bool retstat = false;
367
368 switch (response) {
369 case GTK_RESPONSE_NO:
370 jack_is_down = true;
371 break;
372
373 case GTK_RESPONSE_CANCEL:
374 gx_system::gx_abort(NULL);
375 break;
376
377 default:
378 case GTK_RESPONSE_YES:
379 retstat = gx_start_jack(NULL);
380 break;
381 }
382
383 // start jack
384 return retstat;
385 }
386
387
388 // ----start jack if possible
389 bool gx_start_jack(void* arg) {
390 // first, let's try via qjackctl
391 if (gx_system::gx_system_call("which", "qjackctl", true) == gx_system::SYSTEM_OK) {
392 if (gx_system::gx_system_call("qjackctl", "--start", true, true) == gx_system::SYSTEM_OK) {
393 sleep(5);
394
395 // let's check it is really running
396 if (gx_system::gx_system_call("pgrep", "jackd", true) == gx_system::SYSTEM_OK) {
397 return true;
398 }
399 }
400 }
401
402 // qjackctl not found or not started, let's try .jackdrc
403 string jackdrc = "$HOME/.jackdrc";
404 if (gx_system::gx_system_call("ls", jackdrc.c_str(), true, false) == gx_system::SYSTEM_OK) {
405 // open it
406 jackdrc = string(getenv("HOME")) + string("/") + ".jackdrc";
407 string cmdline = "";
408
409 ifstream f(jackdrc.c_str());
410 if (f.good()) {
411 // should contain only one command line
412 getline(f, cmdline);
413 f.close();
414 }
415
416 // launch jackd
417 if (!cmdline.empty())
418 if (gx_system::gx_system_call(cmdline.c_str(), "", true, true) ==
419 gx_system::SYSTEM_OK) {
420
421 sleep(2);
422
423 // let's check it is really running
424 if (gx_system::gx_system_call("pgrep", "jackd", true) == gx_system::SYSTEM_OK) {
425 return true;
426 }
427 }
428 }
429
466430 return false;
467431 }
468432
469 //---- Jack server connection / disconnection
470 void gx_jack_connection(GtkCheckMenuItem *menuitem, gpointer arg)
471 {
472 if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM (menuitem)) == TRUE) {
473 if (!client) {
474 string optvar[NUM_SHELL_VAR];
475 gx_assign_shell_var(shell_var_name[JACK_INP], optvar[JACK_INP] );
476 gx_assign_shell_var(shell_var_name[JACK_MIDI], optvar[JACK_MIDI] );
477 gx_assign_shell_var(shell_var_name[JACK_OUT1], optvar[JACK_OUT1]);
478 gx_assign_shell_var(shell_var_name[JACK_OUT2], optvar[JACK_OUT2]);
479 gx_assign_shell_var(shell_var_name[JACK_UUID], optvar[JACK_UUID]);
480
481 if (gx_jack_init(optvar)) {
482
483 // initialize gx_head engine if necessary
484 if (!gx_engine::initialized) {
485 gx_engine::gx_engine_init( optvar );
486 }
487 gx_jack_callbacks_and_activate();
488 gx_jack_init_port_connection(optvar);
489
490 // refresh latency check menu
491 gx_gui::GxMainInterface* gui = gx_gui::GxMainInterface::instance();
492 GtkWidget* wd = gui->getJackLatencyItem(gx_jack::jack_bs);
493 if (wd) {
494 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(wd), TRUE);
495 }
496 if (!gx_engine::pt_initialized) {
497 sleep(5);
433 static gboolean gx_ports_refresh(gpointer data) {
434 // reload ports for portmap widget when needed
435 if (gx_portmap::PortMapWindow::instance) {
436 gx_portmap::PortMapWindow::instance->refresh();
437 }
438 return false;
439 }
440
441 // ---- Jack server connection / disconnection
442 void gx_jack_connection(GtkCheckMenuItem *menuitem, gpointer arg) {
443 if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)) == TRUE) {
444 if (!gxjack.client) {
445 string optvar[NUM_SHELL_VAR];
446 gx_system::gx_assign_shell_var(gx_system::shell_var_name[JACK_INP], optvar[JACK_INP]);
447 gx_system::gx_assign_shell_var(gx_system::shell_var_name[JACK_MIDI], optvar[JACK_MIDI]);
448 gx_system::gx_assign_shell_var(gx_system::shell_var_name[JACK_OUT1], optvar[JACK_OUT1]);
449 gx_system::gx_assign_shell_var(gx_system::shell_var_name[JACK_OUT2], optvar[JACK_OUT2]);
450 gx_system::gx_assign_shell_var(gx_system::shell_var_name[JACK_UUID], optvar[JACK_UUID]);
451
452 if (gx_jack_init(optvar)) {
453
454 // initialize gx_head engine if necessary
455 if (!gx_engine::initialized) {
456 gx_engine::gx_engine_init(optvar);
457 }
458 gx_jack_callbacks_and_activate();
459 gx_jack_init_port_connection(optvar);
460
461 // refresh latency check menu
462 gx_gui::GxMainInterface* gui = gx_gui::GxMainInterface::instance();
463 GtkWidget* wd = gui->getJackLatencyItem(gx_jack::gxjack.jack_bs);
464 if (wd) {
465 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(wd), TRUE);
466 }
467 if (!gx_engine::pt_initialized) {
468 sleep(5);
498469 // -------- pitch tracker (needs jack thread running) -------------
499470 gx_engine::pitch_tracker.init();
500471 }
501 }
502 }
503
504 if (client) {
505 if (gx_gui::gx_jackd_on_image) {
506 gtk_widget_show(gx_gui::gx_jackd_on_image);
507 gtk_widget_hide(gx_gui::gx_jackd_off_image);
508 }
509 jack_is_exit = false;
510
511 gx_print_info(_("Jack Server"), _("Connected to Jack Server"));
512 }
513 } else {
514 gx_jack_cleanup();
515
516 // we bring down jack capture and meterbridge
517 Meterbridge::stop();
518 JackCapture::stop();
519
520 if (gx_gui::gx_jackd_on_image) {
521 gtk_widget_hide(gx_gui::gx_jackd_on_image);
522 gtk_widget_show(gx_gui::gx_jackd_off_image);
523 }
524
525 // engine buffers no longer ready
526 gx_engine::buffers_ready = false;
527
528 gx_print_warning(_("Jack Server"), _("Disconnected from Jack Server"));
529 }
530 g_idle_add(gx_ports_refresh,NULL);
531 }
532
533 //----jack latency change
534 void gx_set_jack_buffer_size(GtkCheckMenuItem* menuitem, gpointer arg)
535 {
536 // are we a proper jack client ?
537 if (!client)
538 {
539 gx_print_error(
540 _("Jack Buffer Size setting"),
541 _("we are not a jack client, server may be down")
542 );
543
544 return;
545 }
546
547 // ----- if check button triggered menually
548
549 // let's avoid triggering the jack server on "inactive"
550 if (gtk_check_menu_item_get_active(menuitem) == false) {
551 return;
552 }
553 // requested latency
554 jack_nframes_t buf_size = (jack_nframes_t)GPOINTER_TO_INT(arg);
555
556 // if the actual buffer size is the same, no need further action
557 if (buf_size == jack_get_buffer_size(client)) {
558 return;
559 }
560
561 // first time useage warning
562 GxJackLatencyChange change_latency = kChangeLatency;
563
564 // if user still wants to be given a choice, let's trigger dialog
565 if (fwarn == 0.0)
566 change_latency = (GxJackLatencyChange)gx_gui::gx_wait_latency_warn();
567
568 // let's see
569 if (change_latency == kChangeLatency) {
570 // let's resize the buffer
571 if (jack_set_buffer_size (client, buf_size) != 0)
572 gx_print_warning(_("Setting Jack Buffer Size"),
573 _("Could not change latency"));
574 } else { // restore latency status
575 // refresh latency check menu
576 gx_gui::GxMainInterface* gui = gx_gui::GxMainInterface::instance();
577 GtkWidget* wd = gui->getJackLatencyItem(jack_bs);
578 if (wd) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(wd), TRUE);
579 }
580 gx_print_info(_("Jack Buffer Size"),
581 string(_("latency is ")) +
582 gx_i2a(jack_get_buffer_size(client)));
583 }
584
585 //-----Function that cleans the jack stuff on shutdown
586 void gx_jack_cleanup()
587 {
588 if (client && !jack_is_down) {
589 jack_is_exit = true;
590 // disable input ports
591 jack_port_unregister(client, input_ports[0]);
592 jack_port_unregister(client_insert, input_ports[1]);
593 if (midi_input_port != NULL) {
594 jack_port_unregister(client, midi_input_port);
595 }
596 for (int i = 0; i < 1; i++) {
597 jack_port_unregister(client, output_ports[i]);
598 }
599 for (int i = 2; i < 4; i++) {
600 jack_port_unregister(client_insert, output_ports[i]);
601 }
602 if (midi_output_ports != NULL) {
603 jack_port_unregister(client, midi_output_ports);
604 }
605 #ifdef USE_RINGBUFFER
606 jack_ringbuffer_free(jack_ringbuffer);
607 #endif
608
609 jack_deactivate(client);
610 jack_client_close(client);
611 client = NULL;
612 jack_deactivate(client_insert);
613 jack_client_close(client_insert);
614 client_insert = NULL;
615 }
616 }
617
618 //----jack sample rate change callback
619 int gx_jack_srate_callback(jack_nframes_t frames, void* arg)
620 {
621 /* Note: just reporting log for now */
622
623 /* ostringstream s;
624 s << " jack sample rate changed to " << frames;
625 gx_print_warning("Jack sample rate", s.str()); */
626
627 return 0;
628 }
629
630 //---- jack shutdown callback in case jackd shuts down on us
631 void gx_jack_shutdown_callback(void *arg)
632 {
633 // global var to let all know that jack is down
634 jack_is_down = true;
635 // helper funktion to start gx_survive_jack_shutdown thread
636 gx_gui::gx_jack_is_down();
637
638 }
639
640 //---- jack xrun callback
641 int gx_jack_xrun_callback (void* arg)
642 {
643 xdel = jack_get_xrun_delayed_usecs(client);
644 gx_gui::gx_jack_report_xrun();
645 return 0;
646 }
647
648 //---- jack buffer size change callback
649 int gx_jack_buffersize_callback (jack_nframes_t nframes,void* arg)
650 {
651 GxEngineState estate = checky;
652
653 // turn off engine
654 // Note: simply changing checky is enough to "stop" processing
655 // incoming jack buffers. The mydsp::compute method is owned by
656 // the jack audio thread. It always runs as long as jack runs
657 // independently of the non-RT GUI thread. The value of
658 // checky is checked at each jack cycle in mydsp::compute
659 // so changing it here affects the behavior of mydsp::compute
660 // immediately during the jack_processing of jack cycles.
661
662 if (estate != kEngineOff)
663 checky = kEngineOff;
664
665 jack_bs = nframes;
666
667
668 if (checkfreq) delete[] checkfreq;
669 if (get_frame) delete[] get_frame;
670 if (get_frame1) delete[] get_frame1;
671 if (oversample) delete[] oversample;
672 if (result) delete[] result;
673
674 get_frame = new float[jack_bs];
675 (void)memset(get_frame, 0, sizeof(float)*jack_bs);
676
677 get_frame1 = new float[jack_bs];
678 (void)memset(get_frame1, 0, sizeof(float)*jack_bs);
679
680 checkfreq = new float[jack_bs];
681 (void)memset(checkfreq, 0, sizeof(float)*jack_bs);
682
683 oversample = new float[jack_bs*MAX_UPSAMPLE];
684 (void)memset(oversample, 0, sizeof(float)*jack_bs*MAX_UPSAMPLE);
685
686 result = new float[jack_bs+46];
687 (void)memset(result, 0, sizeof(float)*jack_bs+46);
688
689 gx_gui::GxMainInterface::instance()->set_waveview_buffer();
690 if (cab_conv.is_runnable()) {
691 cab_conv.set_not_runnable();
692 Glib::signal_idle().connect(
693 sigc::bind_return(sigc::ptr_fun(gx_gui::cab_conv_restart), false));
694 }
695 if (conv.is_runnable()) {
696 conv.set_not_runnable();
697 Glib::signal_idle().connect(
698 sigc::bind_return(sigc::ptr_fun(gx_gui::conv_restart), false));
699 }
700
701 // restore previous state
702 checky = estate;
703 // return 0 to jack
704 return 0;
705
706 }
707
708 //---- jack midi control input processing
709 int gx_jack_midi_input_process(jack_nframes_t nframes, void *arg)
710 {
711 if (midi_input_port != NULL)
712 {
713 midi_input_port_buf = jack_port_get_buffer(midi_input_port, nframes);
714 compute_midi_in(midi_input_port_buf);
715 }
716 return 0;
717 }
718
719 //---- jack midi processing
720 #ifndef USE_RINGBUFFER
721 int gx_jack_midi_process (jack_nframes_t nframes, void *arg)
722 {
723 if (midi_output_ports != NULL)
724 {
725 AVOIDDENORMALS;
726
727 midi_port_buf = jack_port_get_buffer(midi_output_ports, nframes);
728 jack_midi_clear_buffer(midi_port_buf);
729
730 if ((isMidiOn() == true) || (gx_gui::showwave == 1))
731 jcpu_load = jack_cpu_load(client);
732
733 compute_midi(nframes);
734 }
735 return 0;
736 }
737
738 #else
739 int gx_jack_midi_process_ringbuffer (jack_nframes_t nframes, void *arg)
740 {
741
742 /*************************************************************************
743 The code for the jack_ringbuffer is take from
744 jack-keyboard 2.4, a virtual keyboard for JACK MIDI.
745 from Edward Tomasz Napierala <trasz@FreeBSD.org>.
746 **************************************************************************/
747 int read, t;
748 unsigned char* buffer ;
749
750 jack_nframes_t last_frame_time = jack_last_frame_time(client);
751
752 midi_port_buf = jack_port_get_buffer(midi_output_ports, nframes);
753 jack_midi_clear_buffer( midi_port_buf);
754
755 if (dsp::playmidi == 1) jcpu_load = jack_cpu_load(client);
756 GxEngine::instance()->compute_midi(nframes);
757
758 while (jack_ringbuffer_read_space(jack_ringbuffer))
759 {
760 read = jack_ringbuffer_peek(jack_ringbuffer, (char *)&ev, sizeof(ev));
761
762 if (read != sizeof(ev))
763 {
764 // fprintf(stderr, " Short read from the ringbuffer, possible note loss.\n");
765 continue;
766 }
767
768 t = ev.time + nframes - last_frame_time;
769 if ((t >= (int)nframes) || (cpu_load > 75.0))
770 break;
771
772 if (t < 0)
773 t = 0;
774
775 jack_ringbuffer_read_advance(jack_ringbuffer, sizeof(ev));
776
777 if (jack_midi_max_event_size(midi_port_buf) > sizeof(ev))
778 buffer = jack_midi_event_reserve(midi_port_buf, t, ev.len);
779 else
780 break;
781
782 if (ev.len > 2)
783 buffer[2] = ev.data[2];
784 if (ev.len > 1)
785 buffer[1] = ev.data[1];
786
787 buffer[0] = ev.data[0];
788 }
789
790 /********************************************************************
791 Thanks Edward for your friendly permision
792 Edward Tomasz Napierala <trasz@FreeBSD.org>.
793 *********************************************************************/
794 return 0;
795 }
796 #endif
472 }
473 }
474
475 if (gxjack.client) {
476 if (gx_gui::gw.gx_jackd_on_image) {
477 gtk_widget_show(gx_gui::gw.gx_jackd_on_image);
478 gtk_widget_hide(gx_gui::gw.gx_jackd_off_image);
479 }
480 jack_is_exit = false;
481
482 gx_system::gx_print_info(_("Jack Server"), _("Connected to Jack Server"));
483 }
484 } else {
485 gx_jack_cleanup();
486
487 // we bring down jack capture and meterbridge
488 gx_child_process::Meterbridge::stop();
489 gx_child_process::JackCapture::stop();
490
491 if (gx_gui::gw.gx_jackd_on_image) {
492 gtk_widget_hide(gx_gui::gw.gx_jackd_on_image);
493 gtk_widget_show(gx_gui::gw.gx_jackd_off_image);
494 }
495
496 // engine buffers no longer ready
497 gx_engine::buffers_ready = false;
498
499 gx_system::gx_print_warning(_("Jack Server"), _("Disconnected from Jack Server"));
500 }
501 g_idle_add(gx_ports_refresh, NULL);
502 }
503
504 // ----jack latency change
505 void gx_set_jack_buffer_size(GtkCheckMenuItem* menuitem, gpointer arg) {
506 // are we a proper jack gxjack.client ?
507 if (!gxjack.client) {
508 gx_system::gx_print_error(
509 _("Jack Buffer Size setting"),
510 _("we are not a jack gxjack.client, server may be down")
511 );
512
513 return;
514 }
515
516 // ----- if check button triggered menually
517
518 // let's avoid triggering the jack server on "inactive"
519 if (gtk_check_menu_item_get_active(menuitem) == false) {
520 return;
521 }
522 // requested latency
523 jack_nframes_t buf_size = (jack_nframes_t)GPOINTER_TO_INT(arg);
524
525 // if the actual buffer size is the same, no need further action
526 if (buf_size == jack_get_buffer_size(gxjack.client)) {
527 return;
528 }
529
530 // first time useage warning
531 GxJackLatencyChange change_latency = kChangeLatency;
532
533 // if user still wants to be given a choice, let's trigger dialog
534 if (gx_engine::fwarn == 0.0)
535 change_latency = (GxJackLatencyChange)gx_gui::gx_wait_latency_warn();
536
537 // let's see
538 if (change_latency == kChangeLatency) {
539 // let's resize the buffer
540 if (jack_set_buffer_size(gxjack.client, buf_size) != 0)
541 gx_system::gx_print_warning(_("Setting Jack Buffer Size"),
542 _("Could not change latency"));
543 } else { // restore latency status
544 // refresh latency check menu
545 gx_gui::GxMainInterface* gui = gx_gui::GxMainInterface::instance();
546 GtkWidget* wd = gui->getJackLatencyItem(gxjack.jack_bs);
547 if (wd) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(wd), TRUE);
548 }
549 gx_system::gx_print_info(_("Jack Buffer Size"),
550 string(_("latency is ")) +
551 gx_system::gx_i2a(jack_get_buffer_size(gxjack.client)));
552 }
553
554 // -----Function that cleans the jack stuff on shutdown
555 void gx_jack_cleanup() {
556 if (gxjack.client && !jack_is_down) {
557 jack_is_exit = true;
558 // disable input ports
559 jack_port_unregister(gxjack.client, gxjack.input_ports[0]);
560 jack_port_unregister(gxjack.client_insert, gxjack.input_ports[1]);
561 if (gxjack.midi_input_port != NULL) {
562 jack_port_unregister(gxjack.client, gxjack.midi_input_port);
563 }
564 for (int i = 0; i < 1; i++) {
565 jack_port_unregister(gxjack.client, gxjack.output_ports[i]);
566 }
567 for (int i = 2; i < 4; i++) {
568 jack_port_unregister(gxjack.client_insert, gxjack.output_ports[i]);
569 }
570 if (gxjack.midi_output_ports != NULL) {
571 jack_port_unregister(gxjack.client, gxjack.midi_output_ports);
572 }
573
574 jack_deactivate(gxjack.client);
575 jack_client_close(gxjack.client);
576 gxjack.client = NULL;
577 jack_deactivate(gxjack.client_insert);
578 jack_client_close(gxjack.client_insert);
579 gxjack.client_insert = NULL;
580 }
581 }
582
583 // ----jack sample rate change callback
584 int gx_jack_srate_callback(jack_nframes_t frames, void* arg) {
585 /* Note: just reporting log for now */
586
587 /* ostringstream s;
588 s << " jack sample rate changed to " << frames;
589 gx_print_warning("Jack sample rate", s.str()); */
590
591 return 0;
592 }
593
594 // ---- jack shutdown callback in case jackd shuts down on us
595 void gx_jack_shutdown_callback(void *arg) {
596 // global var to let all know that jack is down
597 jack_is_down = true;
598 // helper funktion to start gx_survive_jack_shutdown thread
599 gx_gui::gx_jack_is_down();
600 }
601
602 // ---- jack xrun callback
603 int gx_jack_xrun_callback(void* arg) {
604 gxjack.xdel = jack_get_xrun_delayed_usecs(gxjack.client);
605 gx_gui::gx_jack_report_xrun();
606 return 0;
607 }
608
609 // ---- jack buffer size change callback
610 int gx_jack_buffersize_callback(jack_nframes_t nframes, void* arg) {
611 gx_engine::GxEngineState estate = gx_engine::checky;
612
613 // turn off engine
614 // Note: simply changing checky is enough to "stop" processing
615 // incoming jack buffers. The mydsp::compute method is owned by
616 // the jack audio thread. It always runs as long as jack runs
617 // independently of the non-RT GUI thread. The value of
618 // checky is checked at each jack cycle in mydsp::compute
619 // so changing it here affects the behavior of mydsp::compute
620 // immediately during the jack_processing of jack cycles.
621
622 if (estate != gx_engine::kEngineOff)
623 gx_engine::checky = gx_engine::kEngineOff;
624
625 gxjack.jack_bs = nframes;
626
627
628 if (gx_engine::checkfreq) delete[] gx_engine::checkfreq;
629 if (gx_engine::get_frame) delete[] gx_engine::get_frame;
630 if (gx_engine::get_frame1) delete[] gx_engine::get_frame1;
631 if (gx_engine::oversample) delete[] gx_engine::oversample;
632 if (gx_engine::result) delete[] gx_engine::result;
633
634 gx_engine::get_frame = new float[gxjack.jack_bs];
635 (void)memset(gx_engine::get_frame, 0, sizeof(float)*gxjack.jack_bs);
636
637 gx_engine::get_frame1 = new float[gxjack.jack_bs];
638 (void)memset(gx_engine::get_frame1, 0, sizeof(float)*gxjack.jack_bs);
639
640 gx_engine::checkfreq = new float[gxjack.jack_bs];
641 (void)memset(gx_engine::checkfreq, 0, sizeof(float)*gxjack.jack_bs);
642
643 gx_engine::oversample = new float[gxjack.jack_bs*MAX_UPSAMPLE];
644 (void)memset(gx_engine::oversample, 0, sizeof(float)*gxjack.jack_bs*MAX_UPSAMPLE);
645
646 gx_engine::result = new float[gxjack.jack_bs+46];
647 (void)memset(gx_engine::result, 0, sizeof(float)*gxjack.jack_bs+46);
648
649 gx_gui::GxMainInterface::instance()->set_waveview_buffer();
650 if (gx_engine::cab_conv.is_runnable()) {
651 gx_engine::cab_conv.set_not_runnable();
652 Glib::signal_idle().connect(
653 sigc::bind_return(sigc::ptr_fun(gx_gui::cab_conv_restart), false));
654 }
655 if (gx_engine::contrast_conv.is_runnable()) {
656 gx_engine::contrast_conv.set_not_runnable();
657 Glib::signal_idle().connect(
658 sigc::bind_return(sigc::ptr_fun(gx_gui::contrast_conv_restart), false));
659 }
660 if (gx_engine::conv.is_runnable()) {
661 gx_engine::conv.set_not_runnable();
662 Glib::signal_idle().connect(
663 sigc::bind_return(sigc::ptr_fun(gx_gui::conv_restart), false));
664 }
665
666 // restore previous state
667 gx_engine::checky = estate;
668 // return 0 to jack
669 return 0;
670 }
671
672 // ---- jack midi control input processing
673 int gx_jack_midi_input_process(jack_nframes_t nframes, void *arg) {
674 if (gxjack.midi_input_port != NULL) {
675 midi_input_port_buf = jack_port_get_buffer(gxjack.midi_input_port, nframes);
676 gx_engine::compute_midi_in(midi_input_port_buf);
677 }
678 return 0;
679 }
680
681 // ---- jack midi processing
682
683 int gx_jack_midi_process(jack_nframes_t nframes, void *arg) {
684 if (gxjack.midi_output_ports != NULL) {
685 AVOIDDENORMALS;
686
687 midi_port_buf = jack_port_get_buffer(gxjack.midi_output_ports, nframes);
688 jack_midi_clear_buffer(midi_port_buf);
689
690 if ((gx_engine::isMidiOn() == true) || (gx_gui::showwave == 1))
691 gxjack.jcpu_load = jack_cpu_load(gxjack.client);
692
693 gx_engine::compute_midi(nframes);
694 }
695 return 0;
696 }
797697
798698 // ----- main jack process method
799 int gx_jack_process (jack_nframes_t nframes, void *arg)
800 {
699 int gx_jack_process(jack_nframes_t nframes, void *arg) {
801700 int val;
802 measure_start();
701 gx_system::measure_start();
803702 if (sem_getvalue(&jack_sync_sem, &val) == 0 && val == 0) {
804 sem_post(&jack_sync_sem);
805 }
806 if (!jack_is_exit) {
807 AVOIDDENORMALS;
808
809 // retrieve buffers at jack ports
810 float *input = (float *)jack_port_get_buffer(input_ports[0], nframes);
811 float *output0 = (float *)jack_port_get_buffer(output_ports[0], nframes);
812 //float *output1 = (float *)jack_port_get_buffer(output_ports[1], nframes);
813
814 // gx_head DSP computing
815 compute(nframes, input, output0);
816
817 // ready to go for e.g. level display
818 gx_engine::buffers_ready = true;
819
820 // midi input processing
821 gx_jack_midi_input_process(nframes, 0);
822
823 // midi processing
824 #ifdef USE_RINGBUFFER
825 gx_jack_midi_process_ringbuffer(nframes, 0);
826 #else
827 gx_jack_midi_process(nframes, 0);
828 #endif
829
830 // some info display
831 if (gx_gui::showwave == 1) {
832 time_is = jack_frame_time (client);
833 }
834 } else {
835 gx_engine::buffers_ready = false;
836 }
837 //measure_stop();
838 return 0;
703 sem_post(&jack_sync_sem);
704 }
705 if (!jack_is_exit) {
706 AVOIDDENORMALS;
707
708 // retrieve buffers at jack ports
709 float *input = static_cast<float *>
710 (jack_port_get_buffer(gxjack.input_ports[0], nframes));
711 float *output0 = static_cast<float *>
712 (jack_port_get_buffer(gxjack.output_ports[0], nframes));
713
714 // gx_head DSP computing
715 gx_engine::compute(nframes, input, output0);
716
717 // ready to go for e.g. level display
718 gx_engine::buffers_ready = true;
719
720 // midi input processing
721 gx_jack_midi_input_process(nframes, 0);
722
723 // midi processing
724
725 gx_jack_midi_process(nframes, 0);
726
727
728 // some info display
729 if (gx_gui::showwave == 1) {
730 gxjack.time_is = jack_frame_time(gxjack.client);
731 }
732 } else {
733 gx_engine::buffers_ready = false;
734 }
735 // measure_stop();
736 return 0;
839737 }
840738
841739 // ----- main jack process method
842 int gx_jack_insert_process (jack_nframes_t nframes, void *arg)
843 {
844 //measure_start();
845 if (!jack_is_exit) {
846 AVOIDDENORMALS;
847
848 float *input1 = (float *)jack_port_get_buffer(input_ports[1], nframes);
849 float *output2 = (float *)jack_port_get_buffer(output_ports[2], nframes);
850 float *output3 = (float *)jack_port_get_buffer(output_ports[3], nframes);
851 // gx_head DSP computing
852 compute_insert(nframes, input1, output2, output3);
853 }
854 measure_stop();
855 return 0;
856 }
857
858 struct PortRegData
859 {
860 string name;
861 const char *tp;
862 int jackflags;
863 int reg;
864 PortRegData(string nm, const char *t, int flags, int r): name(nm), tp(t), jackflags(flags), reg(r) {}
740 int gx_jack_insert_process(jack_nframes_t nframes, void *arg) {
741 // measure_start();
742 if (!jack_is_exit) {
743 AVOIDDENORMALS;
744
745 float *input1 = static_cast<float *>
746 (jack_port_get_buffer(gxjack.input_ports[1], nframes));
747 float *output2 = static_cast<float *>
748 (jack_port_get_buffer(gxjack.output_ports[2], nframes));
749 float *output3 = static_cast<float *>
750 (jack_port_get_buffer(gxjack.output_ports[3], nframes));
751 // gx_head DSP computing
752 gx_engine::compute_insert(nframes, input1, output2, output3);
753 }
754 gx_system::measure_stop();
755 return 0;
756 }
757
758 struct PortRegData {
759 string name;
760 const char *tp;
761 int jackflags;
762 int reg;
763 PortRegData(string nm, const char *t, int flags, int r): name(nm), tp(t),
764 jackflags(flags), reg(r) {}
865765 };
866766
867 static gboolean gx_jack_portreg_helper(gpointer data)
868 {
869 //PortRegData *pm = (PortRegData*)data;
870 if (gx_gui::PortMapWindow::instance) {
871 gx_gui::PortMapWindow::instance->refresh();
872 //gx_gui::PortMapWindow::instance->port_changed(pm->name, pm->tp, pm->jackflags, pm->reg);
873 }
874 //delete pm;
875 return FALSE;
876 }
877
878 //----- fetch available jack ports other than gx_head ports
879 void gx_jack_portreg_callback(jack_port_id_t pid, int reg, void* arg)
880 {
881 if (!client) {
882 return;
883 }
884 jack_port_t* port = jack_port_by_id(client, pid);
885 if (!port || jack_port_is_mine(client, port)) {
886 return;
887 }
888 gtk_idle_add(gx_jack_portreg_helper,
889 new PortRegData(jack_port_name(port), jack_port_type(port),
890 jack_port_flags(port), reg));
767 static gboolean gx_jack_portreg_helper(gpointer data) {
768 if (gx_portmap::PortMapWindow::instance) {
769 gx_portmap::PortMapWindow::instance->refresh();
770 }
771 // delete pm;
772 return FALSE;
773 }
774
775 // ----- fetch available jack ports other than gx_head ports
776 void gx_jack_portreg_callback(jack_port_id_t pid, int reg, void* arg) {
777 if (!gxjack.client) {
778 return;
779 }
780 jack_port_t* port = jack_port_by_id(gxjack.client, pid);
781 if (!port || jack_port_is_mine(gxjack.client, port)) {
782 return;
783 }
784 gtk_idle_add(gx_jack_portreg_helper,
785 new PortRegData(jack_port_name(port), jack_port_type(port),
786 jack_port_flags(port), reg));
891787 }
892788
893789 #ifdef HAVE_JACK_SESSION
894790 static int gx_jack_session_callback_helper(gpointer data) {
895 jack_session_event_t *event = (jack_session_event_t *) data;
896 string fname( event->session_dir );
791 jack_session_event_t *event = reinterpret_cast<jack_session_event_t *>(data);
792 string fname(event->session_dir);
897793 fname += "gx_head.state";
898 string cmd( "gx_head -U " );
794 string cmd("guitarix -U ");
899795 cmd += event->client_uuid;
900796 cmd += " -f ${SESSION_DIR}gx_head.state";
901797
902 saveStateToFile(fname);
798 gx_system::saveStateToFile(fname);
903799
904800 event->command_line = strdup(cmd.c_str());
905801
906 jack_session_reply(client, event);
802 jack_session_reply(gxjack.client, event);
907803
908804 if (event->type == JackSessionSaveAndQuit) {
909 gtk_main_quit();
805 gx_system::is_session = true;
806 gx_system::gx_clean_exit(NULL, NULL);
807 jack_session_event_free(event);
808 exit(0);
910809 }
911810 jack_session_event_free(event);
912
913811 return 0;
914812 }
915813
916 void gx_jack_session_callback(jack_session_event_t *event, void *arg)
917 {
918 gtk_idle_add(gx_jack_session_callback_helper, (void *)event);
814 void gx_jack_session_callback(jack_session_event_t *event, void *arg) {
815 gtk_idle_add(gx_jack_session_callback_helper, reinterpret_cast<void *>(event));
919816 }
920817 #endif
921818
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * --------------------------------------------------------------------------
1718 */
18 #include "guitarix.h"
19 #include <gxw/GxControlParameter.h>
20 #include <gxwmm/controlparameter.h>
21 #include <gxwmm/radiobutton.h>
22 #include <gxwmm/iredit.h>
23 #include <gtkmm/window.h>
24 #include <gtkmm/builder.h>
25 #include <gtkmm/main.h>
26 #include <gtkmm/filechooserdialog.h>
27
28 #include <gtkmm/combobox.h>
29 #include <gtkmm/treeview.h>
30 #include <gtkmm/treestore.h>
31 #include <glibmm/ustring.h>
32 #include <giomm/file.h>
33 //#include <iostream>
34
35 #include <gtkmm/stock.h>
36 #include <gtkmm/recentmanager.h>
37 #include <giomm.h>
19
20 #include "guitarix.h" // NOLINT
21
22 #include <gxw/GxControlParameter.h> // NOLINT
23 #include <gxwmm/controlparameter.h> // NOLINT
24 #include <gxwmm/radiobutton.h> // NOLINT
25 #include <gxwmm/iredit.h> // NOLINT
26 #include <gtkmm/window.h> // NOLINT
27 #include <gtkmm/builder.h> // NOLINT
28 #include <gtkmm/main.h> // NOLINT
29 #include <gtkmm/filechooserdialog.h> // NOLINT
30
31 #include <gtkmm/combobox.h> // NOLINT
32 #include <gtkmm/treeview.h> // NOLINT
33 #include <gtkmm/treestore.h> // NOLINT
34 #include <glibmm/ustring.h> // NOLINT
35 #include <giomm/file.h> // NOLINT
36
37 #include <gtkmm/stock.h> // NOLINT
38 #include <gtkmm/recentmanager.h> // NOLINT
39 #include <giomm.h> // NOLINT
40
41 #include <string> // NOLINT
42 #include <vector> // NOLINT
3843
3944 #define _(x) (x)
4045
4853
4954 namespace Glib { namespace Container_Helpers {
5055 template <>
51 struct TypeTraits<GObject*>
52 {
53 typedef GObject *CppType;
54 typedef GObject *CType;
55 typedef GObject *CTypeNonConst;
56
57 static CType to_c_type(CppType item) { return item; }
58 static CppType to_cpp_type(CType item) { return item; }
59 static void release_c_type(CType) {}
56 struct TypeTraits<GObject*> {
57 typedef GObject *CppType;
58 typedef GObject *CType;
59 typedef GObject *CTypeNonConst;
60
61 static CType to_c_type(CppType item) { return item; }
62 static CppType to_cpp_type(CType item) { return item; }
63 static void release_c_type(CType) {}
6064 };
6165 }} // end namespace Glib::Container_Helpers
6266
63 namespace gx_jconv
64 {
65
66 class uiToggle: gx_ui::GxUiItemFloat
67 {
68 protected:
69 Glib::RefPtr<Gtk::ToggleButton> button;
70 void on_button_toggled();
71 virtual void reflectZone();
72 public:
73 uiToggle(gx_ui::GxUI& ui, Glib::RefPtr<Gtk::ToggleButton>& b, float *zone);
67 namespace gx_jconv {
68
69 class uiToggle: gx_ui::GxUiItemFloat {
70 protected:
71 Glib::RefPtr<Gtk::ToggleButton> button;
72 void on_button_toggled();
73 virtual void reflectZone();
74 public:
75 uiToggle(gx_ui::GxUI& ui, Glib::RefPtr<Gtk::ToggleButton>& b, float *zone);
7476 };
7577
76 uiToggle::uiToggle(gx_ui::GxUI& ui, Glib::RefPtr<Gtk::ToggleButton>& b, float *zone):
77 gx_ui::GxUiItemFloat(&ui, zone),
78 button(b)
79 {
80 button->signal_toggled().connect(sigc::mem_fun(*this, &uiToggle::on_button_toggled));
81 }
82
83 void uiToggle::on_button_toggled()
84 {
85 modifyZone(button->get_active());
86 }
87
88 void uiToggle::reflectZone()
89 {
90 float v = *fZone;
91 fCache = v;
92 button->set_active(v != 0.0);
93 }
94
95 static void fixup_controlparameters(Glib::RefPtr<Gtk::Builder> builder, gx_ui::GxUI& ui)
96 {
97 Glib::SListHandle<GObject*> objs = Glib::SListHandle<GObject*>(
98 gtk_builder_get_objects(builder->gobj()), Glib::OWNERSHIP_DEEP);
99 for (Glib::SListHandle<GObject*>::iterator i = objs.begin(); i != objs.end(); i++) {
100 if (!g_type_is_a(G_OBJECT_TYPE(*i), GX_TYPE_CONTROL_PARAMETER)) {
101 continue;
102 }
103 Glib::RefPtr<Gxw::ControlParameter> w = Glib::wrap(GX_CONTROL_PARAMETER(*i), true);
104 Glib::ustring v = w->cp_get_var();
105 if (v.empty()) {
106 continue;
107 }
108 if (!gx_gui::parameter_map.hasId(v)) {
109 gx_system::gx_print_warning("load dialog", (boost::format("Parameter variable %1% not found") % v).str());
110 continue;
111 }
112 gx_gui::Parameter& p = gx_gui::parameter_map[v];
113 if (!p.desc().empty()) {
114 Glib::RefPtr<Gtk::Widget>::cast_dynamic(w)->set_tooltip_text(p.desc());
115 }
116 if (p.isFloat()) {
117 gx_gui::FloatParameter &fp = p.getFloat();
118 w->cp_configure(p.group(), p.name(), fp.lower, fp.upper, fp.step);
119 w->cp_set_value(fp.value);
120 Glib::RefPtr<Gtk::Range> r = Glib::RefPtr<Gtk::Range>::cast_dynamic(w);
121 if (r) {
122 Gtk::Adjustment *adj = r->get_adjustment();
123 gx_gui::uiAdjustment* c = new gx_gui::uiAdjustment(&ui, &fp.value, adj->gobj());
124 adj->signal_value_changed().connect(
125 sigc::bind<GtkAdjustment*>(
126 sigc::bind<gpointer>(
127 sigc::ptr_fun(gx_gui::uiAdjustment::changed),(gpointer)c),adj->gobj()));
128 } else {
129 Glib::RefPtr<Gtk::ToggleButton> t = Glib::RefPtr<Gtk::ToggleButton>::cast_dynamic(w);
130 if (t) {
131 new uiToggle(ui, t, &fp.value);
132 }
133 }
134 if (fp.isControllable()) {
135 gx_gui::connect_midi_controller(GTK_WIDGET(w->gobj()), &fp.value);
136 }
137 } else {
138 gx_system::gx_print_warning("load dialog", (boost::format("Parameter variable %1%: type not handled") % v).str());
139 }
140 }
78 uiToggle::uiToggle(gx_ui::GxUI& ui, Glib::RefPtr<Gtk::ToggleButton>& b, float *zone)
79 : gx_ui::GxUiItemFloat(&ui, zone), button(b) {
80 button->signal_toggled().connect(sigc::mem_fun(*this, &uiToggle::on_button_toggled));
81 }
82
83 void uiToggle::on_button_toggled() {
84 modifyZone(button->get_active());
85 }
86
87 void uiToggle::reflectZone() {
88 float v = *fZone;
89 fCache = v;
90 button->set_active(v != 0.0);
91 }
92
93 static void fixup_controlparameters(Glib::RefPtr<Gtk::Builder> builder, gx_ui::GxUI& ui) {
94 Glib::SListHandle<GObject*> objs = Glib::SListHandle<GObject*>(
95 gtk_builder_get_objects(builder->gobj()), Glib::OWNERSHIP_DEEP);
96 for (Glib::SListHandle<GObject*>::iterator i = objs.begin(); i != objs.end(); i++) {
97 if (!g_type_is_a(G_OBJECT_TYPE(*i), GX_TYPE_CONTROL_PARAMETER)) {
98 continue;
99 }
100 Glib::RefPtr<Gxw::ControlParameter> w = Glib::wrap(GX_CONTROL_PARAMETER(*i), true);
101 Glib::ustring v = w->cp_get_var();
102 if (v.empty()) {
103 continue;
104 }
105 if (!gx_gui::parameter_map.hasId(v)) {
106 gx_system::gx_print_warning("load dialog",
107 (boost::format("Parameter variable %1% not found") % v).str());
108 continue;
109 }
110 gx_gui::Parameter& p = gx_gui::parameter_map[v];
111 if (!p.desc().empty()) {
112 Glib::RefPtr<Gtk::Widget>::cast_dynamic(w)->set_tooltip_text(p.desc());
113 }
114 if (p.isFloat()) {
115 gx_gui::FloatParameter &fp = p.getFloat();
116 w->cp_configure(p.group(), p.name(), fp.lower, fp.upper, fp.step);
117 w->cp_set_value(fp.value);
118 Glib::RefPtr<Gtk::Range> r = Glib::RefPtr<Gtk::Range>::cast_dynamic(w);
119 if (r) {
120 Gtk::Adjustment *adj = r->get_adjustment();
121 gx_gui::uiAdjustment* c = new gx_gui::uiAdjustment(&ui, &fp.value, adj->gobj());
122 adj->signal_value_changed().connect(
123 sigc::bind<GtkAdjustment*>(
124 sigc::bind<gpointer>(
125 sigc::ptr_fun(gx_gui::uiAdjustment::changed),
126 (gpointer)c), adj->gobj()));
127 } else {
128 Glib::RefPtr<Gtk::ToggleButton> t =
129 Glib::RefPtr<Gtk::ToggleButton>::cast_dynamic(w);
130 if (t) {
131 new uiToggle(ui, t, &fp.value);
132 }
133 }
134 if (fp.isControllable()) {
135 gx_gui::connect_midi_controller(GTK_WIDGET(w->gobj()), &fp.value);
136 }
137 } else {
138 gx_system::gx_print_warning("load dialog",
139 (boost::format("Parameter variable %1%: type not handled") % v).str());
140 }
141 }
141142 }
142143
143144 // FIXME: needs to be moved somewhere else (at least be together with convolver_start)
144 void gx_convolver_restart()
145 {
146 if (!GxJConvSettings::checkbutton7) {
147 return;
148 }
145 void gx_convolver_restart() {
146 if (!GxJConvSettings::checkbutton7) {
147 return;
148 }
149149 gx_engine::conv.stop();
150150 while (gx_engine::conv.is_runnable()) gx_engine::conv.checkstate();
151151 gx_jconv::GxJConvSettings* jcset = GxJConvSettings::instance();
152152 bool rc = gx_engine::conv.configure(
153 gx_jack::jack_bs, gx_jack::jack_sr, jcset->getFullIRPath(),
154 jcset->getGain(), jcset->getGain(), jcset->getDelay(), jcset->getDelay(),
155 jcset->getOffset(), jcset->getLength(), 0, 0, jcset->getGainline());
153 gx_jack::gxjack.jack_bs, gx_jack::gxjack.jack_sr, jcset->getFullIRPath(),
154 jcset->getGain(), jcset->getGain(), jcset->getDelay(), jcset->getDelay(),
155 jcset->getOffset(), jcset->getLength(), 0, 0, jcset->getGainline());
156156 if (!rc || !gx_engine::conv.start()) {
157157 GxJConvSettings::checkbutton7 = 0;
158158 }
162162 ** Convolver Parameter Window
163163 */
164164
165 class IRWindow: public Gtk::Window
166 {
167 private:
168 Glib::RefPtr<Gtk::Builder> builder;
169 Glib::ustring filename;
170 double ms; // samples per millisecond
171 float *audio_buffer;
172 unsigned int audio_size;
173 int audio_chan;
174 static IRWindow *instance;
175
176 // helper functions
177 int set_val(Gxw::ControlParameter *sample_display, Gxw::ControlParameter *ms_display, double value, int fs);
178 inline int get_ms(Gxw::ControlParameter *w) { return int(round(w->cp_get_value()*ms)); }
179 void file_changed(Glib::ustring filename, int rate, int length, int channels, Glib::ustring format);
180 void load_data(Glib::ustring filename);
181 void load_state();
182 bool save_state();
183 double calc_normalized_gain(int offset, int length, const Gainline& points);
184 void destroy_self();
185
186
187 // signal functions and widget pointers
188 void on_window_hide();
189
190 Gxw::IREdit *wIredit;
191 void on_delay_changed(int delay, int fs);
192 void on_offset_changed(int offset, int fs);
193 void on_length_changed(int length, int fs);
194 void on_max_scale_reached(bool v);
195 void on_min_scale_reached(bool v);
196
197 Gxw::RadioButton *wLeft, *wRight, *wSum;
198 void on_left();
199 void on_right();
200 void on_sum();
201
202 Gxw::RadioButton *wLinear, *wLog;
203 void on_linear();
204
205 Gxw::ValueDisplay *wDelay, *wDelay_ms, *wOffset, *wOffset_ms, *wLength, *wLength_ms;
206 void on_m_delay_changed();
165 class IRWindow: public Gtk::Window {
166 private:
167 Glib::RefPtr<Gtk::Builder> builder;
168 Glib::ustring filename;
169 double ms; // samples per millisecond
170 float *audio_buffer;
171 unsigned int audio_size;
172 int audio_chan;
173 static IRWindow *instance;
174
175 // helper functions
176 int set_val(Gxw::ControlParameter *sample_display, Gxw::ControlParameter *ms_display,
177 double value, int fs);
178 inline int get_ms(Gxw::ControlParameter *w) {
179 return static_cast<int>(round(w->cp_get_value()*ms));
180 }
181 void file_changed(Glib::ustring filename, int rate, int length,
182 int channels, Glib::ustring format);
183 void load_data(Glib::ustring filename);
184 void load_state();
185 bool save_state();
186 void set_GainCor();
187 double calc_normalized_gain(int offset, int length, const Gainline& points);
188 void destroy_self();
189
190
191 // signal functions and widget pointers
192 void on_window_hide();
193
194 Gxw::IREdit *wIredit;
195 void on_delay_changed(int delay, int fs);
196 void on_offset_changed(int offset, int fs);
197 void on_length_changed(int length, int fs);
198 void on_max_scale_reached(bool v);
199 void on_min_scale_reached(bool v);
200
201 Gxw::RadioButton *wLeft, *wRight, *wSum;
202 void on_left();
203 void on_right();
204 void on_sum();
205
206 Gxw::RadioButton *wLinear, *wLog;
207 void on_linear();
208
209 Gxw::ValueDisplay *wDelay, *wDelay_ms, *wOffset, *wOffset_ms, *wLength, *wLength_ms;
210 void on_m_delay_changed();
207211 void on_ms_delay_changed();
208212 void on_m_offset_changed();
209213 void on_ms_offset_changed();
210214 void on_m_length_changed();
211215 void on_ms_length_changed();
212216
213 Gxw::Regler *wDelay_delta;
214 Glib::ustring on_delay_delta_format_value(double v);
215
216 Gtk::Button *wHome, *wJump_zoom_mark, *wIncr, *wDecr;
217 void on_home();
218 void on_jump_zoom_mark();
219 void on_decr();
220 void on_incr();
221
222 Gtk::Button *wReset, *wOpen;
223 void on_reset_clicked();
224 void on_open();
225
226 Gtk::Button *wOk, *wApply,*wCancel;
217 Gxw::Regler *wDelay_delta;
218 Glib::ustring on_delay_delta_format_value(double v);
219
220 Gtk::Button *wHome, *wJump_zoom_mark, *wIncr, *wDecr;
221 void on_home();
222 void on_jump_zoom_mark();
223 void on_decr();
224 void on_incr();
225
226 Gtk::Button *wReset, *wOpen;
227 void on_reset_clicked();
228 void on_open();
229
230 Gtk::Button *wOk, *wApply, *wCancel;
227231 void on_apply_button_clicked();
228232 void on_cancel_button_clicked();
229233 void on_ok_button_clicked();
230234
231 Gtk::Label *wSamples, *wSampleRate, *wFormat, *wFilename;
232 Gtk::Widget *wChannelbox;
233
234 void on_help_clicked();
235 Gtk::Window *wHelp;
236
237 protected:
238 void init_connect();
239 IRWindow(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
240 ~IRWindow();
241 friend class Gtk::Builder;
242 friend void gx_show_jconv_dialog_gui(_GtkWidget*, void*);
243
244 class ModelColumns : public Gtk::TreeModel::ColumnRecord
245 {
246 public:
247 ModelColumns()
248 { add(name);}
249 Gtk::TreeModelColumn<Glib::ustring> name;
250 };
251 Gtk::ComboBox *wcombo;
252 Gtk::HBox *wboxcombo;
253 Gtk::TreeView *treeview;
254 Glib::RefPtr<Gtk::TreeStore> model;
255 ModelColumns columns;
256 void on_remove_tree();
257 void on_combo_changed();
258
259 public:
260 void on_enumerate();
261 static void create(gx_ui::GxUI& ui);
262 static void reload() { if (instance) instance->load_state(); }
263 static bool save() { if (instance) return instance->save_state(); else return false; }
264 static void show_window() { if (instance) instance->IRWindow::show(); }
265 static IRWindow* get_window() {return instance;}
235 Gtk::ToggleButton *wGain_correction;
236 void on_gain_button_toggled();
237
238 Gtk::Label *wSamples, *wSampleRate, *wFormat, *wFilename;
239 Gtk::Widget *wChannelbox;
240
241 void on_help_clicked();
242 Gtk::Window *wHelp;
243
244 protected:
245 void init_connect();
246 IRWindow(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
247 ~IRWindow();
248 friend class Gtk::Builder;
249 friend void gx_show_jconv_dialog_gui(_GtkWidget*, void*);
250
251 class ModelColumns : public Gtk::TreeModel::ColumnRecord {
252 public:
253 ModelColumns() { add(name);}
254 Gtk::TreeModelColumn<Glib::ustring> name;
255 };
256 Gtk::ComboBox *wcombo;
257 Gtk::HBox *wboxcombo;
258 Gtk::TreeView *treeview;
259 Glib::RefPtr<Gtk::TreeStore> model;
260 ModelColumns columns;
261 void on_remove_tree();
262 void on_combo_changed();
263
264 public:
265 void on_enumerate();
266 static void create(gx_ui::GxUI& ui);
267 static void reload() { if (instance) instance->load_state(); }
268 static bool save() {
269 if (instance) return instance->save_state();
270 else
271 return false;
272 }
273 static void show_window() { if (instance) instance->IRWindow::show(); }
274 static IRWindow* get_window() {return instance;}
266275 };
267276
268277 /*
271280
272281 IRWindow *IRWindow::instance = 0;
273282
274 Glib::RefPtr<Gtk::Builder> load_builder(Glib::ustring name)
275 {
276 Glib::RefPtr<Gtk::Builder> bld = Gtk::Builder::create();
277 try {
278 bld->add_from_file(gx_system::gx_builder_dir+name);
279 } catch(const Glib::FileError& ex) {
280 gx_system::gx_print_error("FileError", ex.what());
281 } catch (const Gtk::BuilderError& ex) {
282 gx_system::gx_print_error("Builder Error", ex.what());
283 }
284 return bld;
285 }
286
287 void IRWindow::create(gx_ui::GxUI& ui)
288 {
289 if (instance) {
290 return;
291 }
292 Glib::RefPtr<Gtk::Builder> bld = load_builder("iredit.glade");
293 fixup_controlparameters(bld, ui);
294 bld->get_widget_derived("DisplayIR", instance);
283 Glib::RefPtr<Gtk::Builder> load_builder(Glib::ustring name) {
284 Glib::RefPtr<Gtk::Builder> bld = Gtk::Builder::create();
285 try {
286 bld->add_from_file(gx_system::gx_builder_dir+name);
287 } catch(const Glib::FileError& ex) {
288 gx_system::gx_print_error("FileError", ex.what());
289 } catch(const Gtk::BuilderError& ex) {
290 gx_system::gx_print_error("Builder Error", ex.what());
291 }
292 return bld;
293 }
294
295 void IRWindow::create(gx_ui::GxUI& ui) {
296 if (instance) {
297 return;
298 }
299 Glib::RefPtr<Gtk::Builder> bld = load_builder("iredit.glade");
300 fixup_controlparameters(bld, ui);
301 bld->get_widget_derived("DisplayIR", instance);
295302 }
296303
297304 /*
298305 ** Constructor
299306 */
300307
301 void IRWindow::init_connect()
302 {
303 builder->get_widget("vbox11", wboxcombo);
304 wboxcombo->add(*wcombo);
305 wboxcombo->show_all();
306
307 //wcombo->signal_changed().connect(sigc::mem_fun(*this,
308 // &IRWindow::on_combo_changed) );
309
310 //signal_hide().connect(sigc::mem_fun(*this, &IRWindow::on_window_hide));
311
312 builder->get_widget("iredit", wIredit);
313 wIredit->signal_delay_changed().connect(sigc::mem_fun(*this, &IRWindow::on_delay_changed));
314 wIredit->signal_offset_changed().connect(sigc::mem_fun(*this, &IRWindow::on_offset_changed));
315 wIredit->signal_length_changed().connect(sigc::mem_fun(*this, &IRWindow::on_length_changed));
316 wIredit->signal_scale_max_reached().connect(sigc::mem_fun(*this, &IRWindow::on_max_scale_reached));
317 wIredit->signal_scale_min_reached().connect(sigc::mem_fun(*this, &IRWindow::on_min_scale_reached));
318
319 builder->get_widget("left", wLeft);
320 wLeft->signal_toggled().connect(sigc::mem_fun(*this, &IRWindow::on_left));
321 builder->get_widget("right", wRight);
322 wRight->signal_toggled().connect(sigc::mem_fun(*this, &IRWindow::on_right));
323 builder->get_widget("sum", wSum);
324 wSum->set_active(true);
325 wSum->signal_toggled().connect(sigc::mem_fun(*this, &IRWindow::on_sum));
326
327 builder->get_widget("log", wLog);
328 wLog->set_active(true);
329 builder->get_widget("linear", wLinear);
330 wLinear->signal_toggled().connect(sigc::mem_fun(*this, &IRWindow::on_linear));
331
332 builder->get_widget("delay", wDelay);
333 wDelay->signal_value_changed().connect(sigc::mem_fun(*this, &IRWindow::on_m_delay_changed));
334 builder->get_widget("offset", wOffset);
335 wOffset->signal_value_changed().connect(sigc::mem_fun(*this, &IRWindow::on_m_offset_changed));
336 builder->get_widget("irlength", wLength);
337 wLength->signal_value_changed().connect(sigc::mem_fun(*this, &IRWindow::on_m_length_changed));
338 builder->get_widget("delay_ms", wDelay_ms);
339 wDelay_ms->signal_value_changed().connect(sigc::mem_fun(*this, &IRWindow::on_ms_delay_changed));
340 builder->get_widget("offset_ms", wOffset_ms);
341 wOffset_ms->signal_value_changed().connect(sigc::mem_fun(*this, &IRWindow::on_ms_offset_changed));
342 builder->get_widget("irlength_ms", wLength_ms);
343 wLength_ms->signal_value_changed().connect(sigc::mem_fun(*this, &IRWindow::on_ms_length_changed));
344
345 builder->get_widget("delay_delta", wDelay_delta);
346 wDelay_delta->signal_format_value().connect(sigc::mem_fun(*this, &IRWindow::on_delay_delta_format_value));
347
348 builder->get_widget("home", wHome);
349 wHome->signal_clicked().connect(sigc::mem_fun(*this, &IRWindow::on_home));
350 builder->get_widget("jump_zoom_mark", wJump_zoom_mark);
351 wJump_zoom_mark->signal_clicked().connect(sigc::mem_fun(*this, &IRWindow::on_jump_zoom_mark));
352 builder->get_widget("incr", wIncr);
353 wIncr->signal_clicked().connect(sigc::mem_fun(*this, &IRWindow::on_incr));
354 builder->get_widget("decr", wDecr);
355 wDecr->signal_clicked().connect(sigc::mem_fun(*this, &IRWindow::on_decr));
356
357 builder->get_widget("reset_button", wReset);
358 wReset->signal_clicked().connect(sigc::mem_fun(*this, &IRWindow::on_reset_clicked));
359 builder->get_widget("open_button", wOpen);
360 wOpen->signal_clicked().connect(sigc::mem_fun(*this, &IRWindow::on_open));
361
362 builder->get_widget("apply_button", wApply);
363 wApply->signal_clicked().connect(sigc::mem_fun(*this, &IRWindow::on_apply_button_clicked));
364 builder->get_widget("cancel_button", wCancel);
365 wCancel->signal_clicked().connect(sigc::mem_fun(*this, &IRWindow::on_cancel_button_clicked));
366 builder->get_widget("ok_button", wOk);
367 wOk->signal_clicked().connect(sigc::mem_fun(*this, &IRWindow::on_ok_button_clicked));
368
369 builder->get_widget("length", wSamples);
370 builder->get_widget("samplerate", wSampleRate);
371 builder->get_widget("format", wFormat);
372 builder->get_widget("filename", wFilename);
373
374 builder->get_widget("channelbox", wChannelbox);
375
376 Gtk::Button* button;
377 builder->get_widget("help_button", button);
378 button->signal_clicked().connect(sigc::mem_fun(*this, &IRWindow::on_help_clicked));
379 builder->get_widget("HelpIR", wHelp);
380 builder->get_widget("close_irhelp", button);
381 button->signal_clicked().connect(sigc::mem_fun(wHelp, &Gtk::Widget::hide));
382 }
383
384 IRWindow::IRWindow(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& bld):
385 Gtk::Window(cobject),
386 builder(bld),
387 ms(0.0),
388 audio_buffer(0),
389 audio_size(0),
390 audio_chan(0)
391 {
392 //setup the TreeView
393 treeview = new Gtk::TreeView;
394 model = Gtk::TreeStore::create(columns);
395 treeview->set_headers_visible(false);
396 treeview->set_model(model);
397 treeview->append_column("", columns.name);
398 wcombo = new Gtk::ComboBox();
399 wcombo->set_name("rack_button");
400
401 init_connect();
402 set_icon(Glib::wrap(gx_gui::ib));
403
404 // reset display
405 file_changed("", 0, 0, 0, "");
406 on_delay_changed(0, 0);
407 on_offset_changed(0, 0);
408 on_length_changed(0, 0);
409
410 //show();
411 }
412
413 IRWindow::~IRWindow()
414 {
415 delete audio_buffer;
416 delete treeview;
417 delete wcombo;
308 void IRWindow::init_connect() {
309 builder->get_widget("vbox11", wboxcombo);
310 wboxcombo->add(*wcombo);
311 wboxcombo->show_all();
312
313 builder->get_widget("iredit", wIredit);
314 wIredit->signal_delay_changed().connect(sigc::mem_fun(*this,
315 &IRWindow::on_delay_changed));
316 wIredit->signal_offset_changed().connect(sigc::mem_fun(*this,
317 &IRWindow::on_offset_changed));
318 wIredit->signal_length_changed().connect(sigc::mem_fun(*this,
319 &IRWindow::on_length_changed));
320 wIredit->signal_scale_max_reached().connect(sigc::mem_fun(*this,
321 &IRWindow::on_max_scale_reached));
322 wIredit->signal_scale_min_reached().connect(sigc::mem_fun(*this,
323 &IRWindow::on_min_scale_reached));
324
325 builder->get_widget("left", wLeft);
326 wLeft->signal_toggled().connect(sigc::mem_fun(*this, &IRWindow::on_left));
327 builder->get_widget("right", wRight);
328 wRight->signal_toggled().connect(sigc::mem_fun(*this, &IRWindow::on_right));
329 builder->get_widget("sum", wSum);
330 wSum->set_active(true);
331 wSum->signal_toggled().connect(sigc::mem_fun(*this, &IRWindow::on_sum));
332
333 builder->get_widget("log", wLog);
334 wLog->set_active(true);
335 builder->get_widget("linear", wLinear);
336 wLinear->signal_toggled().connect(sigc::mem_fun(*this, &IRWindow::on_linear));
337
338 builder->get_widget("delay", wDelay);
339 wDelay->signal_value_changed().connect(sigc::mem_fun(*this,
340 &IRWindow::on_m_delay_changed));
341 builder->get_widget("offset", wOffset);
342 wOffset->signal_value_changed().connect(sigc::mem_fun(*this,
343 &IRWindow::on_m_offset_changed));
344 builder->get_widget("irlength", wLength);
345 wLength->signal_value_changed().connect(sigc::mem_fun(*this,
346 &IRWindow::on_m_length_changed));
347 builder->get_widget("delay_ms", wDelay_ms);
348 wDelay_ms->signal_value_changed().connect(sigc::mem_fun(*this,
349 &IRWindow::on_ms_delay_changed));
350 builder->get_widget("offset_ms", wOffset_ms);
351 wOffset_ms->signal_value_changed().connect(sigc::mem_fun(*this,
352 &IRWindow::on_ms_offset_changed));
353 builder->get_widget("irlength_ms", wLength_ms);
354 wLength_ms->signal_value_changed().connect(sigc::mem_fun(*this,
355 &IRWindow::on_ms_length_changed));
356
357 builder->get_widget("delay_delta", wDelay_delta);
358 wDelay_delta->signal_format_value().connect(sigc::mem_fun(*this,
359 &IRWindow::on_delay_delta_format_value));
360
361 builder->get_widget("home", wHome);
362 wHome->signal_clicked().connect(sigc::mem_fun(*this, &IRWindow::on_home));
363 builder->get_widget("jump_zoom_mark", wJump_zoom_mark);
364 wJump_zoom_mark->signal_clicked().connect(sigc::mem_fun(*this,
365 &IRWindow::on_jump_zoom_mark));
366 builder->get_widget("incr", wIncr);
367 wIncr->signal_clicked().connect(sigc::mem_fun(*this, &IRWindow::on_incr));
368 builder->get_widget("decr", wDecr);
369 wDecr->signal_clicked().connect(sigc::mem_fun(*this, &IRWindow::on_decr));
370
371 builder->get_widget("reset_button", wReset);
372 wReset->signal_clicked().connect(sigc::mem_fun(*this, &IRWindow::on_reset_clicked));
373 builder->get_widget("open_button", wOpen);
374 wOpen->signal_clicked().connect(sigc::mem_fun(*this, &IRWindow::on_open));
375
376 builder->get_widget("apply_button", wApply);
377 wApply->signal_clicked().connect(sigc::mem_fun(*this,
378 &IRWindow::on_apply_button_clicked));
379
380 builder->get_widget("cancel_button", wCancel);
381 wCancel->signal_clicked().connect(sigc::mem_fun(*this,
382 &IRWindow::on_cancel_button_clicked));
383 builder->get_widget("ok_button", wOk);
384 wOk->signal_clicked().connect(sigc::mem_fun(*this,
385 &IRWindow::on_ok_button_clicked));
386
387 builder->get_widget("gain_button", wGain_correction);
388 wGain_correction->signal_toggled().connect(sigc::mem_fun(*this,
389 &IRWindow::on_gain_button_toggled));
390
391 builder->get_widget("length", wSamples);
392 builder->get_widget("samplerate", wSampleRate);
393 builder->get_widget("format", wFormat);
394 builder->get_widget("filename", wFilename);
395
396 builder->get_widget("channelbox", wChannelbox);
397
398 Gtk::Button* button;
399 builder->get_widget("help_button", button);
400 button->signal_clicked().connect(sigc::mem_fun(*this, &IRWindow::on_help_clicked));
401 builder->get_widget("HelpIR", wHelp);
402 builder->get_widget("close_irhelp", button);
403 button->signal_clicked().connect(sigc::mem_fun(wHelp, &Gtk::Widget::hide));
404 }
405
406 void IRWindow::set_GainCor() {
407 GxJConvSettings& jcset = *GxJConvSettings::instance();
408 unsigned int gain_cor = jcset.getGainCor();
409 if (gain_cor) {
410 wGain_correction->set_active(true);
411 } else {
412 wGain_correction->set_active(false);
413 }
414 }
415
416 IRWindow::IRWindow(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& bld)
417 : Gtk::Window(cobject), builder(bld), ms(0.0), audio_buffer(0),
418 audio_size(0), audio_chan(0) {
419
420 // setup the TreeView
421 treeview = new Gtk::TreeView;
422 model = Gtk::TreeStore::create(columns);
423 treeview->set_headers_visible(false);
424 treeview->set_model(model);
425 treeview->append_column("", columns.name);
426 wcombo = new Gtk::ComboBox();
427 wcombo->set_name("rack_button");
428
429 init_connect();
430 set_icon(Glib::wrap(gx_gui::gw.ib));
431 set_GainCor();
432
433 // reset display
434 file_changed("", 0, 0, 0, "");
435 on_delay_changed(0, 0);
436 on_offset_changed(0, 0);
437 on_length_changed(0, 0);
438
439 // show();
440 }
441
442 IRWindow::~IRWindow() {
443 delete audio_buffer;
444 delete treeview;
445 delete wcombo;
418446 }
419447
420448 /*
421449 ** helper functions
422450 */
423451
424 int IRWindow::set_val(
425 Gxw::ControlParameter *sample_display, Gxw::ControlParameter *ms_display, double value, int fs)
426 {
427 double s1, s2;
428 if (fs) {
429 s1 = value;
430 s2 = (value*1000.0)/fs;
431 } else {
432 s1 = 0;
433 s2 = 0;
434 }
435 ms_display->cp_set_value(s2);
436 sample_display->cp_set_value(s1);
437 return sample_display->cp_get_int_value();
438 }
439
440 void IRWindow::file_changed(Glib::ustring filename, int rate, int length, int channels, Glib::ustring format)
441 {
442 Glib::ustring s_rate, s_length, s_channels;
443 if (filename.empty()) {
444 filename = "no file selected";
445 s_length = s_rate = format = s_channels = "--";
446 } else {
447 ms = rate/1000.0;
448 wDelay->set_range(0, 5*rate);
449 wDelay_ms->set_range(0, 5*1000);
450 wOffset->set_range(0, length-1);
451 wOffset_ms->set_range(0, (length-1)*1000.0/rate);
452 wLength->set_range(0, length);
453 wLength_ms->set_range(0, (length)*1000.0/rate);
454 on_delay_changed(0, rate);
455 on_offset_changed(0, rate);
456 on_length_changed(length, rate);
457 s_length = (boost::format("%1%") % length).str();
458 s_rate = (boost::format("%1%") % rate).str();
459 }
460 wSamples->set_text(s_length);
461 wSampleRate->set_text(s_rate);
462 wFormat->set_text(format);
463 wChannelbox->set_sensitive(channels >= 2);
464 wFilename->set_text(Glib::path_get_dirname(filename));
452 int IRWindow::set_val(Gxw::ControlParameter *sample_display,
453 Gxw::ControlParameter *ms_display,
454 double value, int fs) {
455 double s1, s2;
456 if (fs) {
457 s1 = value;
458 s2 = (value*1000.0)/fs;
459 } else {
460 s1 = 0;
461 s2 = 0;
462 }
463 ms_display->cp_set_value(s2);
464 sample_display->cp_set_value(s1);
465 return sample_display->cp_get_int_value();
466 }
467
468 void IRWindow::file_changed(Glib::ustring filename, int rate, int length,
469 int channels, Glib::ustring format) {
470 Glib::ustring s_rate, s_length, s_channels;
471 if (filename.empty()) {
472 filename = "no file selected";
473 s_length = s_rate = format = s_channels = "--";
474 } else {
475 ms = rate/1000.0;
476 wDelay->set_range(0, 5*rate);
477 wDelay_ms->set_range(0, 5*1000);
478 wOffset->set_range(0, length-1);
479 wOffset_ms->set_range(0, (length-1)*1000.0/rate);
480 wLength->set_range(0, length);
481 wLength_ms->set_range(0, (length)*1000.0/rate);
482 on_delay_changed(0, rate);
483 on_offset_changed(0, rate);
484 on_length_changed(length, rate);
485 s_length = (boost::format("%1%") % length).str();
486 s_rate = (boost::format("%1%") % rate).str();
487 }
488 wSamples->set_text(s_length);
489 wSampleRate->set_text(s_rate);
490 wFormat->set_text(format);
491 wChannelbox->set_sensitive(channels >= 2);
492 wFilename->set_text(Glib::path_get_dirname(filename));
465493 }
466494
467495 // wrapper function to reload the cmbobox tree in a idle loop
468 gboolean enumerate (gpointer arg)
469 {
470 IRWindow::get_window()->on_enumerate();
471 return false;
472 }
473
474 void IRWindow::load_state()
475 {
476 GxJConvSettings& jcset = *GxJConvSettings::instance();
477 string path = jcset.getFullIRPath();
478 if (path.empty()) {
479 return;
480 }
481 load_data(path);
482 wIredit->set_offset(jcset.getOffset());
483 wIredit->set_delay(jcset.getDelay());
484 wIredit->set_length(jcset.getLength());
485 if (jcset.getGainline().size()) {
486 wIredit->set_gain(jcset.getGainline());
487 }
488 g_idle_add(enumerate,NULL);
489 }
490
491 void IRWindow::load_data(Glib::ustring f)
492 {
493 filename = f;
494 gx_engine::Audiofile audio;
495 if (audio.open_read(filename)) {
496 gx_system::gx_print_error("jconvolver", "Unable to open '" + filename + "'");
497 return;
498 }
499 audio_size = audio.size();
500 audio_chan = audio.chan();
501 const unsigned int limit = 2000000; // arbitrary size limit
502 if (audio_size > limit) {
503 gx_system::gx_print_warning(
504 "jconvolver", (boost::format(_("too many samples (%1%), truncated to %2%")) % audio_size % limit).str());
505 audio_size = limit;
506 }
507 if (audio_size * audio_chan == 0) {
508 gx_system::gx_print_error("jconvolver", "No samples found");
509 return;
510 }
511 float *buffer = new float[audio_size*audio_chan];
512 if (audio.read(buffer, audio_size) != (int)audio_size) {
513 gx_system::gx_print_error("jconvolver", "Error reading file");
514 return;
515 }
516 Glib::ustring enc;
517 switch (audio.type()) {
518 case gx_engine::Audiofile::TYPE_OTHER: enc = "???"; break;
519 case gx_engine::Audiofile::TYPE_CAF: enc = "CAF"; break;
520 case gx_engine::Audiofile::TYPE_WAV: enc = "WAV"; break;
521 case gx_engine::Audiofile::TYPE_AMB: enc = "AMB"; break;
522 }
523 enc += " ";
524 switch (audio.form()) {
525 case gx_engine::Audiofile::FORM_OTHER: enc += "?"; break;
526 case gx_engine::Audiofile::FORM_16BIT: enc += "16 bit"; break;
527 case gx_engine::Audiofile::FORM_24BIT: enc += "24 bit"; break;
528 case gx_engine::Audiofile::FORM_32BIT: enc += "32 bit"; break;
529 case gx_engine::Audiofile::FORM_FLOAT: enc += "float"; break;
530 }
531 delete audio_buffer;
532 audio_buffer = buffer;
533 wIredit->set_ir_data(audio_buffer, audio_chan, audio_size, audio.rate());
534 file_changed(filename, audio.rate(), audio_size, audio_chan, enc);
535 wSum->set_active(true);
536 wLog->set_active(true);
537 }
538
539 //FIXME: gainline code just copied from GxConvolver::read_sndfile, move to 1 location
496 gboolean enumerate(gpointer arg) {
497 IRWindow::get_window()->on_enumerate();
498 return false;
499 }
500
501 void IRWindow::load_state() {
502 GxJConvSettings& jcset = *GxJConvSettings::instance();
503 string path = jcset.getFullIRPath();
504 if (path.empty()) {
505 return;
506 }
507 load_data(path);
508 wIredit->set_offset(jcset.getOffset());
509 wIredit->set_delay(jcset.getDelay());
510 wIredit->set_length(jcset.getLength());
511 if (jcset.getGainline().size()) {
512 wIredit->set_gain(jcset.getGainline());
513 }
514 g_idle_add(enumerate, NULL);
515 }
516
517 void IRWindow::load_data(Glib::ustring f) {
518 filename = f;
519 gx_engine::Audiofile audio;
520 if (audio.open_read(filename)) {
521 gx_system::gx_print_error("jconvolver", "Unable to open '" + filename + "'");
522 return;
523 }
524 audio_size = audio.size();
525 audio_chan = audio.chan();
526 const unsigned int limit = 2000000; // arbitrary size limit
527 if (audio_size > limit) {
528 gx_system::gx_print_warning(
529 "jconvolver", (boost::format(_("too many samples (%1%), truncated to %2%"))
530 % audio_size % limit).str());
531 audio_size = limit;
532 }
533 if (audio_size * audio_chan == 0) {
534 gx_system::gx_print_error("jconvolver", "No samples found");
535 return;
536 }
537 float *buffer = new float[audio_size*audio_chan];
538 if (audio.read(buffer, audio_size) != static_cast<int>(audio_size)) {
539 gx_system::gx_print_error("jconvolver", "Error reading file");
540 return;
541 }
542 Glib::ustring enc;
543 switch (audio.type()) {
544 case gx_engine::Audiofile::TYPE_OTHER: enc = "???"; break;
545 case gx_engine::Audiofile::TYPE_CAF: enc = "CAF"; break;
546 case gx_engine::Audiofile::TYPE_WAV: enc = "WAV"; break;
547 case gx_engine::Audiofile::TYPE_AMB: enc = "AMB"; break;
548 }
549 enc += " ";
550 switch (audio.form()) {
551 case gx_engine::Audiofile::FORM_OTHER: enc += "?"; break;
552 case gx_engine::Audiofile::FORM_16BIT: enc += "16 bit"; break;
553 case gx_engine::Audiofile::FORM_24BIT: enc += "24 bit"; break;
554 case gx_engine::Audiofile::FORM_32BIT: enc += "32 bit"; break;
555 case gx_engine::Audiofile::FORM_FLOAT: enc += "float"; break;
556 }
557 delete audio_buffer;
558 audio_buffer = buffer;
559 wIredit->set_ir_data(audio_buffer, audio_chan, audio_size, audio.rate());
560 file_changed(filename, audio.rate(), audio_size, audio_chan, enc);
561 wSum->set_active(true);
562 wLog->set_active(true);
563 }
564
565 // FIXME: gainline code just copied from GxConvolver::read_sndfile, move to 1 location
540566 inline void compute_interpolation(
541 double& fct, double& gp, unsigned int& idx, const Gainline& points, int offset)
542 {
543 fct = (points[idx+1].g-points[idx].g)/(20*(points[idx+1].i-points[idx].i));
544 gp = points[idx].g/20 + fct * (offset-points[idx].i);
545 idx++;
546 }
547
548 double IRWindow::calc_normalized_gain(int offset, int length, const Gainline& points)
549 {
550 double gain = 0.0;
551 unsigned int idx = 0; // current index in gainline point array
552 double gp = 0.0, fct = 0.0; // calculated parameter of interpolation line
553 if (points.size()) {
554 while (points[idx].i < offset) {
555 idx++;
556 assert(idx < points.size());
557 }
558 if (points[idx].i > offset) {
559 idx--;
560 compute_interpolation(fct, gp, idx, points, 0);
561 }
562 }
563 for (int i = offset; i < offset+length; i++) {
564 if (idx+1 < points.size() && points[idx].i == i) {
565 compute_interpolation(fct, gp, idx, points, 0);
566 }
567 double g = pow(10, gp + i*fct);
568 for (int j = 0; j < audio_chan; j++) {
569 double v = audio_buffer[i*audio_chan+j] * g;
570 gain += v*v;
571 }
572 }
573 gain = sqrt(gain / audio_chan);
574 if (gain != 0.0) {
575 gain = 1 / gain;
576 }
577 return gain;
578 }
579
580 bool IRWindow::save_state()
581 {
582 GxJConvSettings& jcset = *GxJConvSettings::instance();
583 unsigned int offset = wIredit->get_offset();
584 unsigned int length = wIredit->get_length();
585 unsigned int delay = wIredit->get_delay();
586 Gainline gainline = wIredit->get_gain();
587 if (offset == jcset.getOffset() &&
588 delay == jcset.getDelay() &&
589 length == jcset.getLength() &&
590 filename == jcset.getFullIRPath() &&
591 gainline == jcset.getGainline()) {
592 // assume gain value is already calculated correctly
593 return false;
594 }
595 jcset.setOffset(offset);
596 jcset.setDelay(delay);
597 jcset.setLength(length);
598 jcset.setFullIRPath(filename);
599 jcset.setGainline(gainline);
600 double gain = calc_normalized_gain(offset, length, gainline);
601 jcset.setGain(gain);
602 return true;
603 }
604
605 /*
567 double& fct, double& gp, unsigned int& idx,
568 const Gainline& points, int offset) {
569 fct = (points[idx+1].g-points[idx].g)/(20*(points[idx+1].i-points[idx].i));
570 gp = points[idx].g/20 + fct * (offset-points[idx].i);
571 idx++;
572 }
573
574 double IRWindow::calc_normalized_gain(int offset, int length, const Gainline& points) {
575 double gain = 0.0;
576 unsigned int idx = 0; // current index in gainline point array
577 double gp = 0.0, fct = 0.0; // calculated parameter of interpolation line
578 if (points.size()) {
579 while (points[idx].i < offset) {
580 idx++;
581 assert(idx < points.size());
582 }
583 if (points[idx].i > offset) {
584 idx--;
585 compute_interpolation(fct, gp, idx, points, 0);
586 }
587 }
588 for (int i = offset; i < offset+length; i++) {
589 if (idx+1 < points.size() && points[idx].i == i) {
590 compute_interpolation(fct, gp, idx, points, 0);
591 }
592 double g = pow(10, gp + i*fct);
593 for (int j = 0; j < audio_chan; j++) {
594 double v = audio_buffer[i*audio_chan+j] * g;
595 gain += v*v;
596 }
597 }
598 gain = sqrt(gain / audio_chan);
599 if (gain != 0.0) {
600 gain = 1 / gain;
601 }
602 return gain;
603 }
604
605 bool IRWindow::save_state() {
606 GxJConvSettings& jcset = *GxJConvSettings::instance();
607 unsigned int offset = wIredit->get_offset();
608 unsigned int length = wIredit->get_length();
609 unsigned int delay = wIredit->get_delay();
610 unsigned int gain_cor = jcset.getGainCor();
611 Gainline gainline = wIredit->get_gain();
612 if (offset == jcset.getOffset() &&
613 delay == jcset.getDelay() &&
614 length == jcset.getLength() &&
615 filename == jcset.getFullIRPath() &&
616 gainline == jcset.getGainline()) {
617 // assume gain value is already calculated correctly
618 return false;
619 }
620 jcset.setOffset(offset);
621 jcset.setDelay(delay);
622 jcset.setLength(length);
623 jcset.setFullIRPath(filename);
624 jcset.setGainline(gainline);
625 double gain = calc_normalized_gain(offset, length, gainline);
626 jcset.setGain(gain);
627 jcset.setGainCor(gain_cor);
628 return true;
629 }
630
631 /**
606632 ** signal functions
607633 */
608634
609 void IRWindow::on_combo_changed()
610 {
611 Gtk::TreeModel::iterator iter = wcombo->get_active();
612 if(iter)
613 {
614 Gtk::TreeModel::Row row = *iter;
615 if(row)
616 {
617 Glib::ustring name = row[columns.name];
618 static Glib::ustring old_name = name;
619 GxJConvSettings& jcset = *GxJConvSettings::instance();
620 Glib::ustring path = jcset.getIRDir();
621 path += "/";
622 path += name;
623 if ( name != old_name){
624 old_name = name;
625 load_data(path);
626 }
627 }
628 }
629 }
630
631 void IRWindow::on_remove_tree()
632 {
633 delete wcombo;
634 wcombo = new Gtk::ComboBox();
635 wcombo->set_name("rack_button");
636 wboxcombo->add(*wcombo);
637 wboxcombo->show_all();
638 wcombo->signal_changed().connect(sigc::mem_fun(*this,
635 void IRWindow::on_combo_changed() {
636 Gtk::TreeModel::iterator iter = wcombo->get_active();
637 if (iter) {
638 Gtk::TreeModel::Row row = *iter;
639 if (row) {
640 Glib::ustring name = row[columns.name];
641 static Glib::ustring old_name = name;
642 GxJConvSettings& jcset = *GxJConvSettings::instance();
643 Glib::ustring path = jcset.getIRDir();
644 path += "/";
645 path += name;
646 if (name != old_name) {
647 old_name = name;
648 load_data(path);
649 }
650 }
651 }
652 }
653
654 void IRWindow::on_remove_tree() {
655 delete wcombo;
656 wcombo = new Gtk::ComboBox();
657 wcombo->set_name("rack_button");
658 wboxcombo->add(*wcombo);
659 wboxcombo->show_all();
660 wcombo->signal_changed().connect(sigc::mem_fun(*this,
639661 &IRWindow::on_combo_changed) );
640662 }
641663
642664 // reload the treelist for the combobox
643 void IRWindow::on_enumerate()
644 {
645 on_remove_tree();
646 wcombo->set_model(model);
647 GxJConvSettings& jcset = *GxJConvSettings::instance();
648 Glib::ustring path = jcset.getIRDir();
649 Glib::RefPtr<Gio::File> file = Gio::File::create_for_path(path);
650 if(file->query_exists()) {
651 Glib::RefPtr<Gio::FileEnumerator> child_enumeration = file->enumerate_children(G_FILE_ATTRIBUTE_STANDARD_NAME);
652 std::vector<Glib::ustring> file_names;
653 Glib::RefPtr<Gio::FileInfo> file_info;
654
655 while ((file_info = child_enumeration->next_file()) != 0) //NULL
656 {
657 if(file_info->get_name().size() >3) { // filefilter
658 if(file_info->get_name().compare(file_info->get_name().size()-3,3,"wav") == 0 ||
659 file_info->get_name().compare(file_info->get_name().size()-3,3,"Wav") == 0 ||
660 file_info->get_name().compare(file_info->get_name().size()-3,3,"WAV") == 0)
661 file_names.push_back(file_info->get_name());
662 }
663 }
664 //clear the TreeView
665 model->clear();
666 //now populate the TreeView
667 Gtk::TreeModel::Row row = *(model->append());
668 string irfile = jcset.getIRFile();
669 for (unsigned int i=0; i < file_names.size(); i++)
670 {
671 row[columns.name] = file_names[i];
672 if (file_names[i] == irfile ) wcombo->set_active(i);
673
674 //avoid appending a last empty row
675 if (i != file_names.size()-1) {
676 row = *(model->append());
677 }
678 }
679 wcombo->pack_start(columns.name,false);
680 } else {
681 gx_system::gx_print_error("jconvolver", "Error reading file path");
682 }
683 }
684
685 void IRWindow::on_linear()
686 {
687 wIredit->set_log(not wLinear->get_active());
688 }
689
690 void IRWindow::on_left()
691 {
692 if (wLeft->get_active()) {
693 wIredit->set_channel(0);
694 }
695 }
696
697 void IRWindow::on_right()
698 {
699 if (wRight->get_active()) {
700 wIredit->set_channel(1);
701 }
702 }
703
704 void IRWindow::on_sum()
705 {
706 if (wSum->get_active()) {
707 wIredit->set_channel(-1);
708 }
709 }
710
711 void IRWindow::on_delay_changed(int delay, int fs)
712 {
713 int d = int(round(set_val(wDelay, wDelay_ms, delay, fs)));
714 if (d != delay) {
715 wIredit->set_delay(d);
716 }
717 }
718
719 void IRWindow::on_offset_changed(int offset, int fs)
720 {
721 set_val(wOffset, wOffset_ms, offset, fs);
722 }
723
724 void IRWindow::on_length_changed(int length, int fs)
725 {
726 set_val(wLength, wLength_ms, length, fs);
727 }
728
729 void IRWindow::on_reset_clicked()
730 {
731 wIredit->set_offset(0);
732 wIredit->set_delay(0);
733 wIredit->set_length(audio_size);
734 gx_gui::gx_reset_units("jconv");
735 }
736
737 Glib::ustring IRWindow::on_delay_delta_format_value(double v)
738 {
739 Glib::ustring s = "";
740 if (v < 0.0) {
741 v = -v;
742 s = " R";
743 } else if (v > 0.0) {
744 s = " L";
745 }
746 // boost::format does not support "%*f"
747 Glib::ustring fmt = (boost::format("%%.%df%%s") % wDelay_delta->property_digits()).str();
748 return (boost::format(fmt) % v % s).str();
749 }
750
751 void IRWindow::on_max_scale_reached(bool v)
752 {
753 wIncr->set_sensitive(not v);
754 }
755
756 void IRWindow::on_min_scale_reached(bool v)
757 {
758 wDecr->set_sensitive(not v);
759 }
760
761 void IRWindow::on_open()
762 {
763 Gtk::FileChooserDialog d(*this, "Select Impulse Response");
764 d.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
765 d.add_button(Gtk::Stock::OK, Gtk::RESPONSE_OK);
766 Gtk::FileFilter wav;
767 wav.set_name("WAV Files");
768 wav.add_pattern("*.wav");
769 wav.add_pattern("*.WAV");
770 wav.add_pattern("*.Wav");
771 d.add_filter(wav);
772 Gtk::FileFilter audio;
773 audio.set_name("Audio Files");
774 audio.add_mime_type("audio/*");
775 d.add_filter(audio);
776 Gtk::FileFilter all;
777 all.add_pattern("*");
778 all.set_name("All Files");
779 d.add_filter(all);
780 if (!filename.empty()) {
781 d.set_filename(filename);
782 } else {
783 d.set_current_folder("/home/ad/Desktop/amp");
784 }
785 if (d.run() != Gtk::RESPONSE_OK) {
786 return;
787 }
788 string fname = d.get_filename();
789 Gtk::RecentManager::Data data;
790 bool result_uncertain;
791 data.mime_type = Gio::content_type_guess(fname, "", result_uncertain);
792 data.app_name = "guitarix";
793 data.groups.push_back("impulseresponse");
794 Gtk::RecentManager::get_default()->add_item(d.get_uri(), data);
795 load_data(fname);
796 GxJConvSettings& jcset = *GxJConvSettings::instance();
797 jcset.setFullIRPath(fname);
798 save_state();
799 g_idle_add(enumerate,NULL);
800 }
801
802 void IRWindow::on_home()
803 {
804 wIredit->home();
805 }
806
807 void IRWindow::on_jump_zoom_mark()
808 {
809 wIredit->jump_zoom_mark();
810 }
811
812 void IRWindow::on_decr()
813 {
814 wIredit->decr_scale(0.0);
815 }
816
817 void IRWindow::on_incr()
818 {
819 wIredit->incr_scale(0.0);
820 }
821
822 void IRWindow::on_m_delay_changed()
823 {
824 wIredit->set_delay(wDelay->cp_get_int_value());
825 }
826
827 void IRWindow::on_ms_delay_changed()
828 {
829 wIredit->set_delay(get_ms(wDelay_ms));
830 }
831
832 void IRWindow::on_m_offset_changed()
833 {
834 wIredit->set_offset(wOffset->cp_get_int_value());
835 }
836
837 void IRWindow::on_ms_offset_changed()
838 {
839 wIredit->set_offset(get_ms(wOffset_ms));
840 }
841
842 void IRWindow::on_m_length_changed()
843 {
844 wIredit->set_length(wLength->cp_get_int_value());
845 }
846
847 void IRWindow::on_ms_length_changed()
848 {
849 wIredit->set_length(get_ms(wLength_ms));
850 }
851
852 void IRWindow::on_apply_button_clicked()
853 {
854 if (!GxJConvSettings::checkbutton7) {
855 GxJConvSettings::checkbutton7 = 1;
856 return;
857 }
858 if (save_state()) {
859 gx_convolver_restart();
860 }
861 }
862
863 void IRWindow::destroy_self()
864 {
865 delete this;
866 instance = 0;
867 }
868
869 void IRWindow::on_window_hide()
870 {
871 Glib::signal_idle().connect(
872 sigc::bind_return(sigc::mem_fun(*this, &IRWindow::destroy_self), false));
873 }
874
875 void IRWindow::on_cancel_button_clicked()
876 {
877 hide();
878 }
879
880 void IRWindow::on_ok_button_clicked()
881 {
882 if (save_state()) {
883 gx_convolver_restart();
884 }
885 hide();
886 }
887
888 void IRWindow::on_help_clicked()
889 {
890 wHelp->show();
665 void IRWindow::on_enumerate() {
666 on_remove_tree();
667 wcombo->set_model(model);
668 GxJConvSettings& jcset = *GxJConvSettings::instance();
669 Glib::ustring path = jcset.getIRDir();
670 Glib::RefPtr<Gio::File> file = Gio::File::create_for_path(path);
671 if (file->query_exists()) {
672 Glib::RefPtr<Gio::FileEnumerator> child_enumeration =
673 file->enumerate_children(G_FILE_ATTRIBUTE_STANDARD_NAME);
674 std::vector<Glib::ustring> file_names;
675 Glib::RefPtr<Gio::FileInfo> file_info;
676
677 while ((file_info = child_enumeration->next_file()) != 0) {
678 if (file_info->get_name().size() > 3) { // filefilter
679 if (file_info->get_name().compare(file_info->get_name().size()-3, 3, "wav") == 0 ||
680 file_info->get_name().compare(file_info->get_name().size()-3, 3, "Wav") == 0 ||
681 file_info->get_name().compare(file_info->get_name().size()-3, 3, "WAV") == 0)
682 file_names.push_back(file_info->get_name());
683 }
684 }
685 // clear the TreeView
686 model->clear();
687 // now populate the TreeView
688 Gtk::TreeModel::Row row = *(model->append());
689 string irfile = jcset.getIRFile();
690 for (unsigned int i = 0; i < file_names.size(); i++) {
691 row[columns.name] = file_names[i];
692 if (file_names[i] == irfile ) wcombo->set_active(i);
693
694 // avoid appending a last empty row
695 if (i != file_names.size()-1) {
696 row = *(model->append());
697 }
698 }
699 wcombo->pack_start(columns.name, false);
700 } else {
701 gx_system::gx_print_error("jconvolver", "Error reading file path");
702 }
703 }
704
705 void IRWindow::on_linear() {
706 wIredit->set_log(not wLinear->get_active());
707 }
708
709 void IRWindow::on_left() {
710 if (wLeft->get_active()) {
711 wIredit->set_channel(0);
712 }
713 }
714
715 void IRWindow::on_right() {
716 if (wRight->get_active()) {
717 wIredit->set_channel(1);
718 }
719 }
720
721 void IRWindow::on_sum() {
722 if (wSum->get_active()) {
723 wIredit->set_channel(-1);
724 }
725 }
726
727 void IRWindow::on_delay_changed(int delay, int fs) {
728 int d = static_cast<int>(round(set_val(wDelay, wDelay_ms, delay, fs)));
729 if (d != delay) {
730 wIredit->set_delay(d);
731 }
732 }
733
734 void IRWindow::on_offset_changed(int offset, int fs) {
735 set_val(wOffset, wOffset_ms, offset, fs);
736 }
737
738 void IRWindow::on_length_changed(int length, int fs) {
739 set_val(wLength, wLength_ms, length, fs);
740 }
741
742 void IRWindow::on_reset_clicked() {
743 wIredit->set_offset(0);
744 wIredit->set_delay(0);
745 wIredit->set_length(audio_size);
746 gx_gui::gx_reset_units("jconv");
747 }
748
749 Glib::ustring IRWindow::on_delay_delta_format_value(double v) {
750 Glib::ustring s = "";
751 if (v < 0.0) {
752 v = -v;
753 s = " R";
754 } else if (v > 0.0) {
755 s = " L";
756 }
757 // boost::format does not support "%*f"
758 Glib::ustring fmt = (boost::format("%%.%df%%s") % wDelay_delta->property_digits()).str();
759 return (boost::format(fmt) % v % s).str();
760 }
761
762 void IRWindow::on_max_scale_reached(bool v) {
763 wIncr->set_sensitive(not v);
764 }
765
766 void IRWindow::on_min_scale_reached(bool v) {
767 wDecr->set_sensitive(not v);
768 }
769
770 void IRWindow::on_open() {
771 Gtk::FileChooserDialog d(*this, "Select Impulse Response");
772 d.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
773 d.add_button(Gtk::Stock::OK, Gtk::RESPONSE_OK);
774 Gtk::FileFilter wav;
775 wav.set_name("WAV Files");
776 wav.add_pattern("*.wav");
777 wav.add_pattern("*.WAV");
778 wav.add_pattern("*.Wav");
779 d.add_filter(wav);
780 Gtk::FileFilter audio;
781 audio.set_name("Audio Files");
782 audio.add_mime_type("audio/*");
783 d.add_filter(audio);
784 Gtk::FileFilter all;
785 all.add_pattern("*");
786 all.set_name("All Files");
787 d.add_filter(all);
788 if (!filename.empty()) {
789 d.set_filename(filename);
790 } else {
791 d.set_current_folder("/home/ad/Desktop/amp");
792 }
793 if (d.run() != Gtk::RESPONSE_OK) {
794 return;
795 }
796 string fname = d.get_filename();
797 Gtk::RecentManager::Data data;
798 bool result_uncertain;
799 data.mime_type = Gio::content_type_guess(fname, "", result_uncertain);
800 data.app_name = "guitarix";
801 data.groups.push_back("impulseresponse");
802 Gtk::RecentManager::get_default()->add_item(d.get_uri(), data);
803 load_data(fname);
804 GxJConvSettings& jcset = *GxJConvSettings::instance();
805 jcset.setFullIRPath(fname);
806 save_state();
807 g_idle_add(enumerate, NULL);
808 }
809
810 void IRWindow::on_home() {
811 wIredit->home();
812 }
813
814 void IRWindow::on_jump_zoom_mark() {
815 wIredit->jump_zoom_mark();
816 }
817
818 void IRWindow::on_decr() {
819 wIredit->decr_scale(0.0);
820 }
821
822 void IRWindow::on_incr() {
823 wIredit->incr_scale(0.0);
824 }
825
826 void IRWindow::on_m_delay_changed() {
827 wIredit->set_delay(wDelay->cp_get_int_value());
828 }
829
830 void IRWindow::on_ms_delay_changed() {
831 wIredit->set_delay(get_ms(wDelay_ms));
832 }
833
834 void IRWindow::on_m_offset_changed() {
835 wIredit->set_offset(wOffset->cp_get_int_value());
836 }
837
838 void IRWindow::on_ms_offset_changed() {
839 wIredit->set_offset(get_ms(wOffset_ms));
840 }
841
842 void IRWindow::on_m_length_changed() {
843 wIredit->set_length(wLength->cp_get_int_value());
844 }
845
846 void IRWindow::on_ms_length_changed() {
847 wIredit->set_length(get_ms(wLength_ms));
848 }
849
850 void IRWindow::on_apply_button_clicked() {
851 if (!GxJConvSettings::checkbutton7) {
852 GxJConvSettings::checkbutton7 = 1;
853 return;
854 }
855 if (save_state()) {
856 gx_convolver_restart();
857 }
858 }
859
860 void IRWindow::destroy_self() {
861 delete this;
862 instance = 0;
863 }
864
865 void IRWindow::on_window_hide() {
866 Glib::signal_idle().connect(
867 sigc::bind_return(sigc::mem_fun(*this, &IRWindow::destroy_self), false));
868 }
869
870 void IRWindow::on_cancel_button_clicked() {
871 hide();
872 }
873
874 void IRWindow::on_ok_button_clicked() {
875 if (save_state()) {
876 gx_convolver_restart();
877 }
878 hide();
879 }
880
881 void IRWindow::on_help_clicked() {
882 wHelp->show();
883 }
884
885 void IRWindow::on_gain_button_toggled() {
886 GxJConvSettings& jcset = *GxJConvSettings::instance();
887 if (wGain_correction->get_active()) {
888 jcset.setGainCor(1);
889 } else {
890 jcset.setGainCor(0);
891 }
891892 }
892893
893894 /****************************************************************
894895 ** Interface to rest of program
895896 */
896897
897 void gx_show_jconv_dialog_gui(_GtkWidget*, void*)
898 {
899 IRWindow::create(*gx_gui::GxMainInterface::instance());
900 IRWindow::reload();
901 IRWindow::show_window();
902 }
903
904 void gx_reload_jcgui()
905 {
906 IRWindow::reload();
907 }
908
909 void gx_save_jcgui()
910 {
911 IRWindow::save();
898 void gx_show_jconv_dialog_gui(_GtkWidget*, void*) {
899 IRWindow::create(*gx_gui::GxMainInterface::instance());
900 IRWindow::reload();
901 IRWindow::show_window();
902 }
903
904 void gx_reload_jcgui() {
905 IRWindow::reload();
906 }
907
908 void gx_save_jcgui() {
909 IRWindow::save();
912910 }
913911
914912 // --------------- static vars
915913 float GxJConvSettings::checkbutton7 = 0.;
916914
917915 // --------------- constructor
918 GxJConvSettings::GxJConvSettings()
919 {
920 // default parameters
921 fIRDir = getenv("HOME");
922 fIRFile = "";
923 fGain = 0.2;
924 fOffset = 0;
925 fLength = 0;
926 fDelay = 0;
927 }
928
929 string GxJConvSettings::getFullIRPath() const
930 {
931 if (fIRFile.empty()) {
932 return fIRFile;
933 } else {
934 return Glib::build_filename(fIRDir, fIRFile);
935 }
936 }
937
938 void GxJConvSettings::setFullIRPath(string name)
939 {
940 fIRDir = Glib::path_get_dirname(name);
941 fIRFile= Glib::path_get_basename(name);
942 }
943
944 void GxJConvSettings::writeJSON(gx_system::JsonWriter& w)
945 {
946 w.begin_object(true);
947 w.write_key("jconv.IRFile"); w.write(fIRFile, true);
948 w.write_key("jconv.IRDir"); w.write(fIRDir, true);
949 w.write_key("jconv.Gain"); w.write(fGain, true);
950 w.write_key("jconv.Offset"); w.write(fOffset, true);
951 w.write_key("jconv.Length"); w.write(fLength, true);
952 w.write_key("jconv.Delay"); w.write(fDelay, true);
953 w.write_key("jconv.gainline");
954 w.begin_array();
955 for (unsigned int i = 0; i < gainline.size(); i++) {
956 w.begin_array();
957 w.write(gainline[i].i);
958 w.write(gainline[i].g);
959 w.end_array();
960 }
961 w.end_array();
962 w.end_object(true);
963 }
964
965 void GxJConvSettings::read_gainline(gx_system::JsonParser& jp)
966 {
967 gainline.clear();
968 jp.next(gx_system::JsonParser::begin_array);
969 while (jp.peek() == gx_system::JsonParser::begin_array) {
970 jp.next();
971 jp.next(gx_system::JsonParser::value_number);
972 gain_points p;
973 p.i = jp.current_value_int();
974 jp.next(gx_system::JsonParser::value_number);
975 p.g = jp.current_value_float();
976 jp.next(gx_system::JsonParser::end_array);
977 gainline.push_back(p);
978 }
979 jp.next(gx_system::JsonParser::end_array);
980 }
981
982 GxJConvSettings::GxJConvSettings(gx_system::JsonParser& jp)
983 {
984 jp.next(gx_system::JsonParser::begin_object);
985 do {
986 jp.next(gx_system::JsonParser::value_key);
987 if (jp.current_value() == "jconv.IRFile") {
988 jp.next(gx_system::JsonParser::value_string);
989 fIRFile = jp.current_value();
990 } else if (jp.current_value() == "jconv.IRDir") {
991 jp.next(gx_system::JsonParser::value_string);
992 fIRDir = jp.current_value();
993 } else if (jp.current_value() == "jconv.Gain") {
994 jp.next(gx_system::JsonParser::value_number);
995 fGain = jp.current_value_float();
996 } else if (jp.current_value() == "jconv.Offset") {
997 jp.next(gx_system::JsonParser::value_number);
998 fOffset = jp.current_value_int();
999 } else if (jp.current_value() == "jconv.Length") {
1000 jp.next(gx_system::JsonParser::value_number);
1001 fLength = jp.current_value_int();
1002 } else if (jp.current_value() == "jconv.Delay") {
1003 jp.next(gx_system::JsonParser::value_number);
1004 fDelay = jp.current_value_int();
1005 } else if (jp.current_value() == "jconv.gainline") {
1006 read_gainline(jp);
1007 } else {
1008 gx_system::gx_print_warning("jconv settings", "unknown key: " + jp.current_value());
1009 jp.skip_object();
1010 }
1011 } while (jp.peek() == gx_system::JsonParser::value_key);
1012 jp.next(gx_system::JsonParser::end_object);
1013 }
1014
916 GxJConvSettings::GxJConvSettings() {
917 // default parameters
918 fIRDir = getenv("HOME");
919 fIRFile = "";
920 fGain = 0.2;
921 fGainCor = 1;
922 fOffset = 0;
923 fLength = 0;
924 fDelay = 0;
925 }
926
927 string GxJConvSettings::getFullIRPath() const {
928 if (fIRFile.empty()) {
929 return fIRFile;
930 } else {
931 return Glib::build_filename(fIRDir, fIRFile);
932 }
933 }
934
935 void GxJConvSettings::setFullIRPath(string name) {
936 fIRDir = Glib::path_get_dirname(name);
937 fIRFile= Glib::path_get_basename(name);
938 }
939
940 void GxJConvSettings::writeJSON(gx_system::JsonWriter& w) {
941 w.begin_object(true);
942 w.write_key("jconv.IRFile");
943 w.write(fIRFile, true);
944 w.write_key("jconv.IRDir");
945 w.write(fIRDir, true);
946 w.write_key("jconv.Gain");
947 w.write(fGain, true);
948 w.write_key("jconv.GainCor");
949 w.write(fGainCor, true);
950 w.write_key("jconv.Offset");
951 w.write(fOffset, true);
952 w.write_key("jconv.Length");
953 w.write(fLength, true);
954 w.write_key("jconv.Delay");
955 w.write(fDelay, true);
956 w.write_key("jconv.gainline");
957 w.begin_array();
958 for (unsigned int i = 0; i < gainline.size(); i++) {
959 w.begin_array();
960 w.write(gainline[i].i);
961 w.write(gainline[i].g);
962 w.end_array();
963 }
964 w.end_array();
965 w.end_object(true);
966 }
967
968 void GxJConvSettings::read_gainline(gx_system::JsonParser& jp) {
969 gainline.clear();
970 jp.next(gx_system::JsonParser::begin_array);
971 while (jp.peek() == gx_system::JsonParser::begin_array) {
972 jp.next();
973 jp.next(gx_system::JsonParser::value_number);
974 gain_points p;
975 p.i = jp.current_value_int();
976 jp.next(gx_system::JsonParser::value_number);
977 p.g = jp.current_value_float();
978 jp.next(gx_system::JsonParser::end_array);
979 gainline.push_back(p);
980 }
981 jp.next(gx_system::JsonParser::end_array);
982 }
983
984 GxJConvSettings::GxJConvSettings(gx_system::JsonParser& jp) {
985 jp.next(gx_system::JsonParser::begin_object);
986 do {
987 jp.next(gx_system::JsonParser::value_key);
988 if (jp.current_value() == "jconv.IRFile") {
989 jp.next(gx_system::JsonParser::value_string);
990 fIRFile = jp.current_value();
991 } else if (jp.current_value() == "jconv.IRDir") {
992 jp.next(gx_system::JsonParser::value_string);
993 fIRDir = jp.current_value();
994 } else if (jp.current_value() == "jconv.Gain") {
995 jp.next(gx_system::JsonParser::value_number);
996 fGain = jp.current_value_float();
997 } else if (jp.current_value() == "jconv.GainCor") {
998 jp.next(gx_system::JsonParser::value_number);
999 fGainCor = jp.current_value_int();
1000 } else if (jp.current_value() == "jconv.Offset") {
1001 jp.next(gx_system::JsonParser::value_number);
1002 fOffset = jp.current_value_int();
1003 } else if (jp.current_value() == "jconv.Length") {
1004 jp.next(gx_system::JsonParser::value_number);
1005 fLength = jp.current_value_int();
1006 } else if (jp.current_value() == "jconv.Delay") {
1007 jp.next(gx_system::JsonParser::value_number);
1008 fDelay = jp.current_value_int();
1009 } else if (jp.current_value() == "jconv.gainline") {
1010 read_gainline(jp);
1011 } else {
1012 gx_system::gx_print_warning("jconv settings", "unknown key: " + jp.current_value());
1013 jp.skip_object();
1014 }
1015 } while (jp.peek() == gx_system::JsonParser::value_key);
1016 jp.next(gx_system::JsonParser::end_object);
1017 }
10151018 } // namespace gx_jconv
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * ---------------------------------------------------------------------------
17 *
18 * name : "gx_head"
19 * version : "0.04.7"
20 * authors : "hermann meyer" & "james warden"
21 * contributors : "Julius O. Smith (jos at ccrma.stanford.edu)"
22 * license : "GPL"
23 * copyright : "(c)brummer 2008"
24 * reference : "http://ccrma.stanford.edu/realsimple/faust_strings/"
25 *
26 * Code prototype generated with Faust 0.9.9.4f (http://faust.grame.fr)
2718 * ----------------------------------------------------------------------------
2819 *
2920 * This is gx_head main.
3122 * ----------------------------------------------------------------------------
3223 */
3324
34 #include <giomm/init.h>
35 #include <gtkmm/main.h>
36 #include <gxwmm/init.h>
37 #include "guitarix.h"
25 #include "guitarix.h" // NOLINT
3826
39 using namespace gx_system;
27 #include <giomm/init.h> // NOLINT
28 #include <gtkmm/main.h> // NOLINT
29 #include <gxwmm/init.h> // NOLINT
30 #include <string> // NOLINT
4031
41 void init_unix_signal_handlers()
42 {
43 /* ----- block signal USR1 ---------
44 ** inherited by all threads which are created later
45 ** USR1 is processed synchronously by gx_signal_helper_thread
46 */
47 sigset_t waitset;
48 sigemptyset(&waitset);
49 sigaddset(&waitset, SIGUSR1);
50 sigaddset(&waitset, SIGCHLD);
51 sigprocmask(SIG_BLOCK, &waitset, NULL);
5232
53 //----- set unix signal handlers for proper shutdown
54 signal(SIGQUIT, gx_signal_handler);
55 signal(SIGTERM, gx_signal_handler);
56 signal(SIGHUP, gx_signal_handler);
57 signal(SIGINT, gx_signal_handler);
58 //signal(SIGSEGV, gx_signal_handler); // no good, quits application silently
33 // using namespace gx_system;
34
35 void init_unix_signal_handlers() {
36 /* ----- block signal USR1 ---------
37 ** inherited by all threads which are created later
38 ** USR1 is processed synchronously by gx_signal_helper_thread
39 */
40 sigset_t waitset;
41 sigemptyset(&waitset);
42 sigaddset(&waitset, SIGUSR1);
43 sigaddset(&waitset, SIGCHLD);
44 sigprocmask(SIG_BLOCK, &waitset, NULL);
45
46 // ----- set unix signal handlers for proper shutdown
47 signal(SIGQUIT, gx_system::gx_signal_handler);
48 signal(SIGTERM, gx_system::gx_signal_handler);
49 signal(SIGHUP, gx_system::gx_signal_handler);
50 signal(SIGINT, gx_system::gx_signal_handler);
51 // signal(SIGSEGV, gx_signal_handler); // no good, quits application silently
5952 }
6053
6154 /* --------- Guitarix main ---------- */
62 int main(int argc, char *argv[])
63 {
64 #ifdef ENABLE_NLS
65 bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
66 bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
67 textdomain(GETTEXT_PACKAGE);
68 #endif
69 init_unix_signal_handlers();
55 int main(int argc, char *argv[]) {
56 #ifdef DISABLE_NLS
57 // break
58 #elseif IS_MACOSX
59 // break
60 #elseif ENABLE_NLS
7061
71 // ----------------------- init basic subsystems ----------------------
72 Glib::thread_init();
73 Glib::init();
74 Gxw::init();
75
76 // ------ initialize parameter list ------
77 gx_engine::audio.register_parameter();
78 gx_engine::midi.register_parameter();
79 gx_engine::register_faust_parameters();
80 gx_gui::GuiVariables guivar;
81 guivar.register_gui_parameter();
82 gx_preset::init();
83 gx_gui::parameter_map.set_init_values();
84
85 // ---------------------- user options handling ------------------
86 string optvar[NUM_SHELL_VAR];
87 gx_process_cmdline_options(argc, argv, optvar);
88 Gtk::Main main(argc, argv);
89
90 // ---------------- Check for working user directory -------------
91 gx_system::gx_version_check();
92
93 // ------ time measurement (debug) ------
94 #ifndef NDEBUG
95 add_time_measurement();
62 bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
63 bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
64 textdomain(GETTEXT_PACKAGE);
9665 #endif
9766
98 // ----------------------- init GTK interface----------------------
99 g_type_class_unref (g_type_class_ref (GTK_TYPE_IMAGE_MENU_ITEM));
100 g_object_set (gtk_settings_get_default (), "gtk-menu-images", FALSE, NULL);
101 gx_gui::GxMainInterface* gui = gx_gui::GxMainInterface::instance("gx_head");
102 gui->setup();
67 init_unix_signal_handlers();
68
69 // ----------------------- init basic subsystems ----------------------
70 Glib::thread_init();
71 Glib::init();
72 Gxw::init();
73
74 // ------ initialize parameter list ------
75 gx_engine::audio.register_parameter();
76 gx_engine::midi.register_parameter();
77 gx_engine::register_faust_parameters();
78 gx_gui::GuiVariables guivar;
79 guivar.register_gui_parameter();
80 gx_preset::init();
81 gx_gui::parameter_map.set_init_values();
82
83 // ---------------------- user options handling ------------------
84 string optvar[NUM_SHELL_VAR];
85 gx_system::gx_process_cmdline_options(argc, argv, optvar);
86 Gtk::Main main(argc, argv);
87
88 // ---------------- Check for working user directory -------------
89 gx_system::gx_version_check();
90
91 // ------ time measurement (debug) ------
92 #ifndef NDEBUG
93 gx_system::add_time_measurement();
94 #endif
95
96 // ----------------------- init GTK interface----------------------
97 g_type_class_unref(g_type_class_ref(GTK_TYPE_IMAGE_MENU_ITEM));
98 g_object_set(gtk_settings_get_default(), "gtk-menu-images", FALSE, NULL);
99 gx_gui::GxMainInterface* gui = gx_gui::GxMainInterface::instance("gx_head");
100 gui->setup();
103101
104102
105 // ---------------------- initialize jack client ------------------
106 if (gx_jack::gx_jack_init(optvar))
107 {
108 // -------- initialize gx_head engine --------------------------
109 gx_engine::gx_engine_init(optvar);
103 // ---------------------- initialize jack gxjack.client ------------------
104 if (gx_jack::gx_jack_init(optvar)) {
105 // -------- initialize gx_head engine --------------------------
106 gx_engine::gx_engine_init(optvar);
110107
111 // -------- set jack callbacks and activation -------------------
112 gx_jack::gx_jack_callbacks_and_activate();
108 // -------- set jack callbacks and activation -------------------
109 gx_jack::gx_jack_callbacks_and_activate();
113110
114 // -------- init port connections
115 gx_jack::gx_jack_init_port_connection(optvar);
116 }
111 // -------- init port connections
112 gx_jack::gx_jack_init_port_connection(optvar);
113 }
117114
118 // ----------------------- run GTK main loop ----------------------
119 gx_set_override_options(optvar);
120 gx_ui::GxUI::updateAllGuis();
121 g_type_class_unref (g_type_class_ref (GTK_TYPE_IMAGE_MENU_ITEM));
122 g_object_set (gtk_settings_get_default (), "gtk-menu-images", TRUE, NULL);
123 gui->show();
115 // ----------------------- run GTK main loop ----------------------
116 gx_system::gx_set_override_options(optvar);
117 gx_ui::GxUI::updateAllGuis();
118 g_type_class_unref(g_type_class_ref(GTK_TYPE_IMAGE_MENU_ITEM));
119 g_object_set(gtk_settings_get_default(), "gtk-menu-images", TRUE, NULL);
120 gui->show();
124121
125 if (gx_jack::client) {
126 // -------- pitch tracker (needs jack thread running) -------------
127 gx_engine::pitch_tracker.init();
128 }
122 if (gx_jack::gxjack.client) {
123 // -------- pitch tracker (needs jack thread running) -------------
124 gx_engine::pitch_tracker.init();
125 }
129126
130 //Gxw::Knob::set_jump_to_mouse(false);
131 gui->run();
127 // Gxw::Knob::set_jump_to_mouse(false);
128 gui->run();
132129
133 // ------------- shut things down
134 gx_system::gx_clean_exit(NULL, NULL);
130 // ------------- shut things down
131 gx_system::gx_clean_exit(NULL, NULL);
135132
136 return 0;
133 return 0;
137134 }
0 /*
1 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17 * ---------------------------------------------------------------------------
18 *
19 * This file is part of the gx_head GUI main class
20 *
21 * ----------------------------------------------------------------------------
22 */
23
24 #include "guitarix.h" // NOLINT
25
26
27 #include <gdk/gdkkeysyms.h> // NOLINT
28 #include <glibmm/i18n.h> // NOLINT
29
30 #include <iomanip> // NOLINT
31 #include <cstring> // NOLINT
32 #include <string> // NOLINT
33
34 namespace gx_gui {
35
36 /****************************************************************
37 ** predefined gtkmm widget classes used in main GUI
38 */
39
40 void ToggleCheckButton::on_my_toggled() {
41 param->set(get_active());
42 }
43
44 SwitchParameter* ToggleCheckButton::get_parameter() {
45 return param;
46 }
47
48 void ToggleCheckButton::set_parameter(SwitchParameter *p) {
49 param = p;
50 p->changed.connect(sigc::mem_fun(*this, &ToggleCheckButton::set_active));
51 signal_toggled().connect(
52 sigc::mem_fun(*this, &ToggleCheckButton::on_my_toggled));
53 }
54
55 ToggleCheckButton::~ToggleCheckButton() {}
56
57 ToggleCheckButton::ToggleCheckButton() {
58 set_name("barbutton");
59 Pango::FontDescription font = m_label.get_style()->get_font();
60 font.set_size(8*Pango::SCALE);
61 font.set_weight(Pango::WEIGHT_BOLD);
62 m_label.modify_font(font);
63 m_label.set_name("barbuttonlabel");
64 add(m_label);
65 }
66 /****************************************************************/
67
68 GxTBox::~GxTBox() {}
69
70 GxTBox::GxTBox(gx_ui::GxUI& ui) {}
71 /****************************************************************/
72
73 GxVBox::~GxVBox() {}
74
75 GxVBox::GxVBox(gx_ui::GxUI& ui) {}
76 /****************************************************************/
77
78 GxHBox::~GxHBox() {}
79
80 GxHBox::GxHBox(gx_ui::GxUI& ui) {}
81 /****************************************************************/
82
83 GxFixedBox::~GxFixedBox() {}
84
85 GxFixedBox::GxFixedBox(gx_ui::GxUI& ui) {
86 m_fixed.put(m_box, 0, 0);
87 }
88 /****************************************************************/
89
90 GxPaintBox::~GxPaintBox() {}
91
92 GxPaintBox::GxPaintBox(gx_ui::GxUI& ui, const char *expose_funk)
93 : m_box(false, 0) {
94 m_paintbox.property_paint_func() = expose_funk;
95 m_paintbox.add(m_box);
96 }
97 /****************************************************************/
98
99 GxEventBox::~GxEventBox() {}
100
101 GxEventBox::GxEventBox(gx_ui::GxUI& ui) {
102 m_eventbox.add(m_box);
103 m_fixedbox.add(m_eventbox);
104 m_hbox.add(m_pbox);
105 m_hbox.pack_start(m_fbox, false, false);
106 m_fbox.pack_start(m_fixedbox, false, false);
107 m_hbox.add(m_tbox);
108 }
109 /****************************************************************/
110
111 GxMainBox::~GxMainBox() {}
112
113 GxMainBox::GxMainBox(gx_ui::GxUI& ui, const char *expose_funk) {
114 m_paintbox.add(m_box);
115 m_eventbox.add(m_paintbox);
116 m_paintbox.property_paint_func() = expose_funk;
117 m_fixedbox.put(m_eventbox, 0, 0);
118 m_hbox.add(m_pbox);
119 m_hbox.pack_start(m_fbox, false, false);
120 m_fbox.pack_start(m_fixedbox, false, false);
121 m_hbox.add(m_tbox);
122 }
123 /****************************************************************/
124
125 GxMidiBox::~GxMidiBox() {
126 delete unit_on_off;
127 }
128
129 GxMidiBox::GxMidiBox(gx_ui::GxUI& ui, const char *expose_funk)
130 : unit_on_off(UiSwitch::new_switch(ui, sw_led, "midi_out.on_off")) {
131 m_bbox.pack_start(m_tcb, true, true);
132 m_bbox.pack_end(*unit_on_off, false, false);
133 m_paintbox.property_paint_func() = expose_funk;
134 m_eventbox.add(m_paintbox);
135 m_paintbox.add(m_box);
136 m_eventbox.set_border_width(0);
137 m_eventbox.set_name("black_box");
138 m_box.set_homogeneous(false);
139 m_box.set_spacing(0);
140 m_box.set_border_width(4);
141 m_box.pack_end(m_fixedbox, false, false, 0);
142 m_fixedbox.set_size_request(25, -1);
143 }
144 /****************************************************************/
145
146 GxNotebookBox::~GxNotebookBox() {}
147
148 GxNotebookBox::GxNotebookBox(gx_ui::GxUI& ui) {
149 m_box.set_name("tab_rack");
150 }
151 /****************************************************************/
152
153 GxMoveBox::~GxMoveBox() {
154 }
155
156 GxMoveBox::GxMoveBox(gx_ui::GxUI& ui) {
157 m_paintbox.property_paint_func() = "rectangle_skin_color_expose";
158 m_label.set_text("â–¼");
159 m_label.set_name("rack_slider");
160 m_label1.set_text("â–²");
161 m_label1.set_name("rack_slider");
162 m_button.add(m_label);
163 m_button.set_size_request(20, 15);
164 m_button.set_name("effect_reset");
165 m_button1.add(m_label1);
166 m_button1.set_size_request(20, 15);
167 m_button1.set_name("effect_reset");
168 GtkStyle *style = gtk_widget_get_style(GTK_WIDGET(m_label.gobj()));
169 pango_font_description_set_size(style->font_desc, 6*PANGO_SCALE);
170 pango_font_description_set_weight(style->font_desc, PANGO_WEIGHT_BOLD);
171 gtk_widget_modify_font(GTK_WIDGET(m_label.gobj()), style->font_desc);
172 gtk_widget_modify_font(GTK_WIDGET(m_label1.gobj()), style->font_desc);
173 m_fixed.set_size_request(25, -1);
174 m_fixed.put(m_button1, 2, 5);
175 m_fixed.put(m_button, 2, 20);
176 m_paintbox.pack_end(m_fixed, false, false, 0 );
177 m_fixed.show_all();
178 m_paintbox.set_border_width(4);
179 m_paintbox.property_spacing() = 0;
180 m_paintbox.property_homogeneous() = false;
181 }
182
183 /****************************************************************/
184
185
186 GxDialogButtonBox::GxDialogButtonBox(gx_ui::GxUI& ui, Parameter& param_dialog)
187 : box(false, 0),
188 show_dialog(ui, sw_button, param_dialog.getBool()) {
189 box.set_border_width(0);
190 box.show_all();
191 }
192
193
194 /****************************************************************/
195
196 void GxDialogWindowBox::on_dialog_button_toggled() {
197 if (dialog_button.get_active()) {
198 const gchar * title = gtk_widget_get_name(GTK_WIDGET(paintbox.gobj()));
199 string p = "ui.";
200 p +=title;
201 string group = group_id;
202 group += ".on_off";
203 parameter_map[p].set_std_value();
204 parameter_map[group].set_std_value();
205 dialog_button.set_active(false);
206 }
207 }
208
209 void GxDialogWindowBox::on_dialog_menu_activate() {
210 gx_show_extended_settings(GTK_WIDGET(menuitem.gobj()), (gpointer)paintbox.gobj());
211
212 if (!menuitem.get_active()) {
213 string group = group_id;
214 group += ".on_off";
215 parameter_map[group].set_std_value();
216 }
217 }
218
219 void GxDialogWindowBox::on_reset_button_pressed() {
220 gx_reset_units(group_id);
221 }
222
223 GxDialogWindowBox::~GxDialogWindowBox() {
224 delete unit_on_off;
225 }
226
227 GxDialogWindowBox::GxDialogWindowBox(gx_ui::GxUI& ui, const char *expose_funk,
228 Parameter& param_dialog,
229 Parameter& param_switch,
230 Gtk::ToggleButton& button, GtkWidget * Caller)
231 :box(false, 0),
232 unit_on_off(UiSwitch::new_switch(ui, sw_led, param_switch)),
233 dialog_button(button),
234 m_regler_tooltip_window(Gtk::WINDOW_POPUP) {
235 group_id = param_dialog.id().substr(0, param_dialog.id().find_last_of(".")).c_str();
236 Glib::ustring title = param_dialog.group();
237 box1.pack_end(*unit_on_off, false, false);
238 box.set_border_width(2);
239 box4.set_spacing(2);
240 box4.set_border_width(2);
241 box5.set_border_width(4);
242 box6.set_border_width(4);
243 paintbox.property_paint_func() = expose_funk;
244 paintbox.set_name(title);
245 reset_button.set_name("effect_reset");
246 reset_button1.set_name("effect_reset");
247 box5.add(reset_button);
248 box6.add(reset_button1);
249 box5.set_size_request(15, -1);
250 box6.set_size_request(15, -1);
251 reset_button.signal_pressed().connect(
252 sigc::mem_fun(*this, &GxDialogWindowBox::on_reset_button_pressed));
253 reset_button1.signal_pressed().connect(
254 sigc::mem_fun(*this, &GxDialogWindowBox::on_reset_button_pressed));
255 reset_button.set_tooltip_text(_("Reset Button, press to reset settings"));
256 reset_button1.set_tooltip_text(_("Reset Button, press to reset settings"));
257 box4.pack_start(box6, false, false, 0);
258 box4.pack_start(box, true, true, 0);
259 box4.pack_end(box5, false, false, 0);
260 paintbox.add(box4);
261 paintbox.set_tooltip_text(_(title.c_str()));
262 m_tcb.m_label.set_text(_(title.c_str()));
263 dialog_button.signal_toggled().connect(
264 sigc::mem_fun(*this, &GxDialogWindowBox::on_dialog_button_toggled));
265 menuitem.signal_activate().connect(
266 sigc::mem_fun(*this, &GxDialogWindowBox::on_dialog_menu_activate));
267 }
268
269 /****************************************************************/
270
271 bool GxWindowBox::on_window_delete_event(GdkEventAny*, gpointer d) {
272 gtk_check_menu_item_set_active(
273 GTK_CHECK_MENU_ITEM(GTK_WIDGET(d)), FALSE
274 );
275 return false;
276 }
277
278 bool GxWindowBox::on_button_pressed(GdkEventButton* event) {
279 // fprintf(stderr, "butto pressed\n" );
280 if ((event->type == GDK_BUTTON_PRESS) && (event->button == 3)) {
281 const gchar * title = gtk_widget_get_name(GTK_WIDGET(window.gobj()));
282 if (strcmp(title, "MonoRack") == 0) {
283 guint32 tim = gtk_get_current_event_time();
284 gtk_menu_popup(GTK_MENU(gw.menu_mono_rack), NULL, NULL, NULL,
285 (gpointer) gw.menu_mono_rack, 2, tim);
286 return true;
287 } else if (strcmp(title, "StereoRack") == 0) {
288 guint32 tim = gtk_get_current_event_time();
289 gtk_menu_popup(GTK_MENU(gw.menu_stereo_rack), NULL, NULL, NULL,
290 (gpointer) gw.menu_stereo_rack, 2, tim);
291 return true;
292 }
293 }
294
295 return false;
296 }
297
298 GxWindowBox::GxWindowBox(gx_ui::GxUI& ui,
299 Glib::ustring titl, GtkWidget * d)
300 : window(Gtk::WINDOW_TOPLEVEL),
301 rbox(false, 0),
302 m_regler_tooltip_window(Gtk::WINDOW_POPUP) {
303 Glib::ustring title = titl;
304 window.add_events(Gdk::BUTTON_PRESS_MASK);
305 window.signal_delete_event().connect(
306 sigc::bind<gpointer>(sigc::mem_fun(*this, &GxWindowBox::on_window_delete_event), d));
307 window.add(box);
308 window.signal_button_press_event().connect(
309 sigc::mem_fun(*this, &GxWindowBox::on_button_pressed));
310 box.show();
311 rbox.show();
312 }
313
314 /****************************************************************/
315
316 bool GxScrollBox::on_window_delete_event(GdkEventAny*, gpointer d) {
317 gtk_check_menu_item_set_active(
318 GTK_CHECK_MENU_ITEM(GTK_WIDGET(d)), FALSE
319 );
320 return false;
321 }
322
323 bool GxScrollBox::on_button_pressed(GdkEventButton* event) {
324 if ((event->type == GDK_BUTTON_PRESS) && (event->button == 3)) {
325 guint32 tim = gtk_get_current_event_time();
326 gtk_menu_popup(GTK_MENU(gw.menu_mono_rack), NULL, NULL, NULL,
327 (gpointer) gw.menu_mono_rack, 2, tim);
328 return true;
329 }
330 return false;
331 }
332
333 void GxScrollBox::on_rack_reorder_horizontal() {
334 if (fOrderhRack.get_active()) { // horizontal
335
336 if (gx_gui::gw.srack_widget) {
337 paintbox1.hide();
338 gx_gui::GxMainInterface* gui = gx_gui::GxMainInterface::instance();
339 if (gtk_window_get_resizable(GTK_WINDOW (gw.fWindow)))
340 gtk_window_set_resizable(GTK_WINDOW(gw.fWindow), FALSE);
341 gtk_widget_ref(gx_gui::gw.srack_widget);
342 GtkWidget *parent = gtk_widget_get_parent(GTK_WIDGET(gx_gui::gw.srack_widget));
343 gtk_container_remove(GTK_CONTAINER(parent), gx_gui::gw.srack_widget);
344 gtk_box_pack_start(GTK_BOX(box1.gobj()), gx_gui::gw.srack_widget, false, true, 0);
345 gtk_widget_unref(gx_gui::gw.srack_widget);
346 if (gui->fShowSRack.get_active()) m_scrolled_window2.show();
347 paintbox1.show();
348 parent = gtk_widget_get_parent(GTK_WIDGET(gx_gui::gw.rack_tool_bar));
349
350 if (strcmp(gtk_widget_get_name(parent), "gtkmm__GtkVBox") == 0) {
351 gtk_widget_ref(gx_gui::gw.rack_tool_bar);
352 gtk_widget_ref(gx_gui::gw.tuner_widget);
353 gtk_container_remove(GTK_CONTAINER(parent), gx_gui::gw.rack_tool_bar);
354 gtk_container_remove(GTK_CONTAINER(parent), gx_gui::gw.tuner_widget);
355 parent = gtk_widget_get_parent(GTK_WIDGET(parent));
356 GList* child_list = gtk_container_get_children(GTK_CONTAINER(parent));
357 parent = reinterpret_cast<GtkWidget *>(g_list_nth_data(child_list, 1));
358 child_list = gtk_container_get_children(GTK_CONTAINER(parent));
359 parent = reinterpret_cast<GtkWidget *>(g_list_nth_data(child_list, 0));
360 child_list = gtk_container_get_children(GTK_CONTAINER(parent));
361 parent = reinterpret_cast<GtkWidget *>(g_list_nth_data(child_list, 2));
362 gtk_container_add(GTK_CONTAINER(parent), gx_gui::gw.tuner_widget);
363 parent = reinterpret_cast<GtkWidget *>(g_list_nth_data(child_list, 0));
364 gtk_container_add(GTK_CONTAINER(parent), gx_gui::gw.rack_tool_bar);
365 gtk_widget_unref(gx_gui::gw.rack_tool_bar);
366 gtk_widget_unref(gx_gui::gw.tuner_widget);
367 g_list_free(child_list);
368 }
369
370 gtk_widget_set_size_request(GTK_WIDGET(gui->RBox), -1, 460 );
371 if (g_threads[7] == 0 || g_main_context_find_source_by_id(NULL, g_threads[7]) == NULL)
372 g_threads[7] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 40,
373 gx_gui::gx_set_resizeable, gpointer(gw.fWindow), NULL);
374 if (g_threads[6] == 0 || g_main_context_find_source_by_id(NULL, g_threads[6]) == NULL)
375 g_threads[6] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 50,
376 gx_gui::gx_set_default, gpointer(gui->RBox), NULL);
377 }
378 }
379 }
380
381 void GxScrollBox::on_rack_reorder_vertical() {
382 if (fOrdervRack.get_active()) { // vertical
383
384 if (gx_gui::gw.srack_widget) {
385 paintbox1.hide();
386 gx_gui::GxMainInterface* gui = gx_gui::GxMainInterface::instance();
387 if (gtk_window_get_resizable(GTK_WINDOW(gw.fWindow)))
388 gtk_window_set_resizable(GTK_WINDOW(gw.fWindow), FALSE);
389 gtk_widget_ref(gx_gui::gw.srack_widget);
390 GtkWidget *parent = gtk_widget_get_parent(GTK_WIDGET(gx_gui::gw.srack_widget));
391 gtk_container_remove(GTK_CONTAINER(parent), gx_gui::gw.srack_widget);
392 gtk_box_pack_start(GTK_BOX(rbox.gobj()), gx_gui::gw.srack_widget, false, true, 0);
393 gtk_widget_unref(gx_gui::gw.srack_widget);
394 m_scrolled_window2.hide();
395 paintbox1.show();
396 parent = gtk_widget_get_parent(GTK_WIDGET(gx_gui::gw.rack_tool_bar));
397
398 if (strcmp(gtk_widget_get_name(parent), "gtkmm__GtkHBox") == 0) {
399 gtk_widget_ref(gx_gui::gw.rack_tool_bar);
400 gtk_widget_ref(gx_gui::gw.tuner_widget);
401 gtk_container_remove(GTK_CONTAINER(parent), gx_gui::gw.rack_tool_bar);
402 parent = gtk_widget_get_parent(GTK_WIDGET(gx_gui::gw.tuner_widget));
403 gtk_container_remove(GTK_CONTAINER(parent), gx_gui::gw.tuner_widget);
404 parent = gtk_widget_get_parent(GTK_WIDGET(parent));
405 parent = gtk_widget_get_parent(GTK_WIDGET(parent));
406 parent = gtk_widget_get_parent(GTK_WIDGET(parent));
407 GList* child_list = gtk_container_get_children(GTK_CONTAINER(parent));
408 parent = reinterpret_cast<GtkWidget *>(g_list_nth_data(child_list, 0));
409 gtk_container_add(GTK_CONTAINER(parent), gx_gui::gw.rack_tool_bar);
410 gtk_container_add(GTK_CONTAINER(parent), gx_gui::gw.tuner_widget);
411 gtk_widget_unref(gx_gui::gw.rack_tool_bar);
412 gtk_widget_unref(gx_gui::gw.tuner_widget);
413 g_list_free(child_list);
414 }
415
416 gtk_widget_set_size_request(GTK_WIDGET(gui->RBox), -1, 460 );
417 if (g_threads[7] == 0 || g_main_context_find_source_by_id(NULL, g_threads[7]) == NULL)
418 g_threads[7] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 40,
419 gx_gui::gx_set_resizeable, gpointer(gw.fWindow), NULL);
420 if (g_threads[6] == 0 || g_main_context_find_source_by_id(NULL, g_threads[6]) == NULL)
421 g_threads[6] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 50,
422 gx_gui::gx_set_default, gpointer(gui->RBox), NULL);
423 }
424 }
425 }
426
427 GxScrollBox::GxScrollBox(gx_ui::GxUI& ui,
428 const char *pb_2, Glib::ustring titl, GtkWidget * d)
429 : window(Gtk::WINDOW_TOPLEVEL),
430 rbox(false, 4) {
431 Glib::ustring title = titl;
432 window.add_events(Gdk::BUTTON_PRESS_MASK);
433 m_scrolled_window.set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_ALWAYS);
434 m_scrolled_window.set_shadow_type(Gtk::SHADOW_NONE);
435 m_scrolled_window2.set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_ALWAYS);
436 m_scrolled_window2.set_shadow_type(Gtk::SHADOW_NONE);
437 m_scrolled_window2.set_name("HorizontalStereoBox");
438 rbox.set_name("MonoBox");
439 box1.set_name("SereoBox");
440 paintbox1.set_border_width(18);
441 paintbox1.property_paint_func() = pb_2;
442 window.signal_delete_event().connect(
443 sigc::bind<gpointer>(sigc::mem_fun(*this, &GxScrollBox::on_window_delete_event), d));
444 paintbox1.add(m_scrolled_window);
445 paintbox1.add(m_scrolled_window2);
446 m_scrolled_window.add(box);
447 m_scrolled_window2.add(vbox);
448 window.add(paintbox1);
449 window.signal_button_press_event().connect(
450 sigc::mem_fun(*this, &GxScrollBox::on_button_pressed));
451 fOrderhRack.signal_activate().connect(
452 sigc::mem_fun(*this, &GxScrollBox::on_rack_reorder_horizontal));
453 fOrdervRack.signal_activate().connect(
454 sigc::mem_fun(*this, &GxScrollBox::on_rack_reorder_vertical));
455
456 const gchar * mtitle = "Order Rack Vertically";
457 set_label(fOrdervRack, _(mtitle));
458 group = fOrdervRack.get_group();
459 gx_gui::GxMainInterface* gui = gx_gui::GxMainInterface::instance();
460 gtk_menu_shell_append(GTK_MENU_SHELL(gui->getMenu("PluginMenu")),
461 GTK_WIDGET(fOrdervRack.gobj()));
462 fOrdervRack.set_parameter(new SwitchParameter("system.order_rack_v", true, false));
463 fOrdervRack.show();
464
465 mtitle = "Order Rack Horizontally";
466 set_label(fOrderhRack, _(mtitle));
467 fOrderhRack.set_group(group);
468 gtk_menu_shell_append(GTK_MENU_SHELL(gui->getMenu("PluginMenu")),
469 GTK_WIDGET(fOrderhRack.gobj()));
470 fOrderhRack.set_active(false);
471 fOrderhRack.set_parameter(new SwitchParameter("system.order_rack_h", true, false));
472 fOrderhRack.show();
473
474 paintbox1.show();
475 box.show();
476 m_scrolled_window.show();
477 // m_scrolled_window2.show();
478 rbox.show();
479 }
480
481 /****************************************************************/
482
483 bool GxToolBox::on_window_delete_event(GdkEventAny*, gpointer d) {
484 gtk_check_menu_item_set_active(
485 GTK_CHECK_MENU_ITEM(GTK_WIDGET(d)), FALSE
486 );
487 return false;
488 }
489
490 bool GxToolBox::on_button_pressed(GdkEventButton* event) {
491 if ((event->type == GDK_BUTTON_PRESS) && (event->button == 3)) {
492 const gchar * title = gtk_widget_get_name(GTK_WIDGET(window.gobj()));
493 if (strcmp(title, "MonoRack") == 0) {
494 guint32 tim = gtk_get_current_event_time();
495 gtk_menu_popup(GTK_MENU(gw.menu_mono_rack), NULL, NULL, NULL,
496 (gpointer) gw.menu_mono_rack, 2, tim);
497 return true;
498 } else if (strcmp(title, "StereoRack") == 0) {
499 guint32 tim = gtk_get_current_event_time();
500 gtk_menu_popup(GTK_MENU(gw.menu_stereo_rack), NULL, NULL, NULL,
501 (gpointer) gw.menu_stereo_rack, 2, tim);
502 return true;
503 }
504 }
505 return false;
506 }
507
508 GxToolBox::GxToolBox(gx_ui::GxUI& ui,
509 const char *pb_2, Glib::ustring titl, GtkWidget * d)
510 : rbox(false, 4),
511 m_regler_tooltip_window(Gtk::WINDOW_POPUP) {
512 Glib::ustring title = titl;
513 window.add_events(Gdk::BUTTON_PRESS_MASK);
514 m_scrolled_window.set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
515 paintbox1.set_border_width(18);
516 paintbox.set_border_width(4);
517 paintbox1.property_paint_func() = pb_2;
518 paintbox.property_paint_func() = pb_rectangle_skin_color_expose;
519 window.signal_delete_event().connect(
520 sigc::bind<gpointer>(sigc::mem_fun(*this, &GxToolBox::on_window_delete_event), d));
521 box.add(rbox);
522 paintbox1.add(m_scrolled_window);
523 m_scrolled_window.add(paintbox);
524 paintbox.add(box);
525 window.add(paintbox1);
526 window.signal_button_press_event().connect(
527 sigc::mem_fun(*this, &GxToolBox::on_button_pressed));
528 paintbox1.show();
529 box.show();
530 m_scrolled_window.show();
531 rbox.show();
532 }
533 /****************************************************************/
534 }
535
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * ---------------------------------------------------------------------------
1718 *
1819 * This is the gx_head GUI main class
2021 * ----------------------------------------------------------------------------
2122 */
2223
23 #include <iomanip>
24 #include <cstring>
25 #include <gdk/gdkkeysyms.h>
26 #include "guitarix.h"
27 #include <gtkmm/liststore.h>
28 #include <gtkmm/window.h>
29 #include <gtkmm/frame.h>
30 #include <gtkmm/accelgroup.h>
31 #include <gtkmm/scrolledwindow.h>
32 #include <gtkmm/fixed.h>
33 #include <gtkmm/eventbox.h>
34 #include <gtkmm/notebook.h>
35 #include <gxwmm/paintbox.h>
36 #include <gtkmm/radiomenuitem.h>
37 #include <gtkmm/paned.h>
38
39 #include <glibmm/i18n.h>
40
41 using namespace gx_system;
42 using namespace gx_child_process;
43 using namespace gx_preset;
44 using namespace gx_cairo;
45 using namespace gx_threads;
46
47
48
49 namespace gx_gui
50 {
24 #include "guitarix.h" // NOLINT
25
26
27 #include <gdk/gdkkeysyms.h> // NOLINT
28 #include <glibmm/i18n.h> // NOLINT
29
30 #include <iomanip> // NOLINT
31 #include <cstring> // NOLINT
32 #include <string> // NOLINT
33
34 namespace gx_gui {
5135
5236 // Stock Items for Gxw::Switch
5337
8670 ** register GUI parameter to save/load them within the settigs file
8771 */
8872
89 inline void registerNonMidiParam(const char*a, float*c, bool d, float std=0, float lower=0, float upper=1)
90 {
91 parameter_map.insert(new FloatParameter(a,"",Parameter::None,d,*c,std,lower,upper,0,false));
92 }
93
94 inline void registerNonMidiParam(const char*a, bool*c, bool d, float std=false)
95 {
96 parameter_map.insert(new BoolParameter(a,"",Parameter::None,d,*c,std,0,false));
97 }
98
99 void GuiVariables::register_gui_parameter()
100 {
101 registerNonMidiParam("ui.main_xorg", &main_xorg, true, 300,0,10000);
102 registerNonMidiParam("ui.main_yorg", &main_yorg, true, 300,0,10000);
103
104 registerNonMidiParam("compressor.dialog", &fdialogbox8, false);
105 registerNonMidiParam("crybaby.dialog", &fdialogbox4, false);
106 registerNonMidiParam("gx_distortion.dialog", &fdialogbox1, false);
107 registerNonMidiParam("freeverb.dialog", &fdialogbox2, false);
108 registerNonMidiParam("IR.dialog", &fdialogbox3, false);
109 registerNonMidiParam("chorus.dialog", &fchorusbox, false);
110 registerNonMidiParam("eq.dialog", &fdialogbox_eq, false);
111 registerNonMidiParam("eqs.dialog", &fdialogbox_eqs, false);
112 registerNonMidiParam("MultiBandFilter.dialog", &fdialogbox_mbf, false);
113 registerNonMidiParam("moog.dialog", &fdialogbox_moo, false);
114 registerNonMidiParam("biquad.dialog", &fbiquadbox, false);
115 registerNonMidiParam("flanger.dialog", &fflangerbox, false);
116 registerNonMidiParam("echo.dialog", &fdialogbox_echo, false);
117 registerNonMidiParam("delay.dialog", &fdialogbox_delay, false);
118 registerNonMidiParam("overdrive.dialog", &fdialogbox_ovd, false);
119 registerNonMidiParam("phaser.dialog", &fdialogbox_pha, false);
120 registerNonMidiParam("low_highpass.dialog", &fdialogbox_lh, false);
121 registerNonMidiParam("stereodelay.dialog", &fdialogbox_sd, false);
122 registerNonMidiParam("stereoecho.dialog", &fdialogbox_se, false);
123 registerNonMidiParam("midi_out.dialog", &fdialogbox6, false);
124 registerNonMidiParam("oscilloscope.dialog", &fdialogbox_wv, false);
125 registerNonMidiParam("ampmodul.dialog", &fampmodul, false);
126 registerNonMidiParam("tonemodul.dialog", &ftonemodule, false);
127 registerNonMidiParam("tremolo.dialog", &ftremolo_dialog, false);
128 registerNonMidiParam("phaser_mono.dialog", &fphaser_mono_dialog, false);
129 registerNonMidiParam("chorus_mono.dialog", &fchorus_mono_dialog, false);
130 registerNonMidiParam("flanger_mono.dialog", &fflanger_mono_dialog, false);
131 registerNonMidiParam("feedback.dialog", &ffeedback_dialog, false);
132 registerNonMidiParam("amp.tonestack.dialog", &ftonestack_dialog, false);
133 registerNonMidiParam("cab.dialog", &fcabinet_dialog, false);
134 }
135
136
73 inline void registerNonMidiParam(const char*a, float*c, bool d,
74 float std = 0, float lower = 0, float upper = 1) {
75 parameter_map.insert(new FloatParameter(a, "", Parameter::None, d, *c, std,
76 lower, upper, 0, false));
77 }
78
79 inline void registerNonMidiParam(const char*a, bool*c, bool d, float std = false) {
80 parameter_map.insert(new BoolParameter(a, "", Parameter::None, d, *c, std, 0, false));
81 }
82
83 void GuiVariables::register_gui_parameter() {
84 registerNonMidiParam("ui.main_xorg", &main_xorg, true, 300, 0, 10000);
85 registerNonMidiParam("ui.main_yorg", &main_yorg, true, 300, 0, 10000);
86
87 registerNonMidiParam("compressor.dialog", &dialogbox[0], false);
88 registerNonMidiParam("crybaby.dialog", &dialogbox[1], false);
89 registerNonMidiParam("gx_distortion.dialog", &dialogbox[2], false);
90 registerNonMidiParam("freeverb.dialog", &dialogbox[3], false);
91 registerNonMidiParam("IR.dialog", &dialogbox[4], false);
92 registerNonMidiParam("chorus.dialog", &dialogbox[5], false);
93 registerNonMidiParam("eq.dialog", &dialogbox[6], false);
94 registerNonMidiParam("eqs.dialog", &dialogbox[7], false);
95 registerNonMidiParam("MultiBandFilter.dialog", &dialogbox[8], false);
96 registerNonMidiParam("moog.dialog", &dialogbox[9], false);
97 registerNonMidiParam("biquad.dialog", &dialogbox[10], false);
98 registerNonMidiParam("flanger.dialog", &dialogbox[11], false);
99 registerNonMidiParam("echo.dialog", &dialogbox[12], false);
100 registerNonMidiParam("delay.dialog", &dialogbox[13], false);
101 registerNonMidiParam("overdrive.dialog", &dialogbox[14], false);
102 registerNonMidiParam("phaser.dialog", &dialogbox[15], false);
103 registerNonMidiParam("low_highpass.dialog", &dialogbox[16], false);
104 registerNonMidiParam("stereodelay.dialog", &dialogbox[17], false);
105 registerNonMidiParam("stereoecho.dialog", &dialogbox[18], false);
106 registerNonMidiParam("midi_out.dialog", &dialogbox[19], false);
107 registerNonMidiParam("oscilloscope.dialog", &dialogbox[20], false);
108 registerNonMidiParam("ampmodul.dialog", &dialogbox[21], false);
109 registerNonMidiParam("tonemodul.dialog", &dialogbox[22], false);
110 registerNonMidiParam("tremolo.dialog", &dialogbox[23], false);
111 registerNonMidiParam("phaser_mono.dialog", &dialogbox[24], false);
112 registerNonMidiParam("chorus_mono.dialog", &dialogbox[25], false);
113 registerNonMidiParam("flanger_mono.dialog", &dialogbox[26], false);
114 registerNonMidiParam("feedback.dialog", &dialogbox[27], false);
115 registerNonMidiParam("amp.tonestack.dialog", &dialogbox[28], false);
116 registerNonMidiParam("cab.dialog", &dialogbox[29], false);
117 }
137118
138119 /****************************************************************
139120 ** format controller values
140121 */
141122
142 int precision(double n)
143 {
144 if (n < 0.009999) return 3;
145 else if (n < 0.099999) return 2;
146 else if (n < 0.999999) return 1;
147 else return 0;
148 }
149
150 string fformat(float value, float step)
151 {
152 ostringstream buf;
153 buf << fixed << setprecision(precision(step)) << value;
154 return buf.str();
123 int precision(double n) {
124 if (n < 0.009999)
125 return 3;
126 else if (n < 0.099999)
127 return 2;
128 else if (n < 0.999999)
129 return 1;
130 else
131 return 0;
132 }
133
134 string fformat(float value, float step) {
135 ostringstream buf;
136 buf << fixed << setprecision(precision(step)) << value;
137 return buf.str();
155138 }
156139
157140 /****************************************************************
158141 ** GxMidiController definitions and connecting method
159142 */
160143
161 #include "gx_main_midi.cc"
162
163 /****************************************************************
164 ** predefined gtkmm widget classes used in main GUI
165 */
166
167
168 class ToggleCheckButton: public Gtk::ToggleButton
169 {
170 private:
171 SwitchParameter* param;
172 void on_my_toggled();
173 public:
174 Gtk::Label m_label;
175 void set_parameter(SwitchParameter *p);
176 SwitchParameter * get_parameter();
177 ToggleCheckButton();
178 ~ToggleCheckButton();
179 };
180
181 void ToggleCheckButton::on_my_toggled()
182 {
183 param->set(get_active());
184 }
185
186 SwitchParameter* ToggleCheckButton::get_parameter()
187 {
188 return param;
189 }
190
191 void ToggleCheckButton::set_parameter(SwitchParameter *p)
192 {
193 param = p;
194 p->changed.connect(sigc::mem_fun(*this, &ToggleCheckButton::set_active));
195 signal_toggled().connect(
196 sigc::mem_fun(*this, &ToggleCheckButton::on_my_toggled));
197 }
198
199 ToggleCheckButton::~ToggleCheckButton()
200 {
201 }
202
203 ToggleCheckButton::ToggleCheckButton()
204 {
205 //modify_bg(Gtk::STATE_ACTIVE, Gdk::Color("#58b45e"));
206 set_name("barbutton");
207 Pango::FontDescription font = m_label.get_style()->get_font();
208 font.set_size(8*Pango::SCALE);
209 font.set_weight(Pango::WEIGHT_BOLD);
210 m_label.modify_font(font);
211 m_label.set_name("barbuttonlabel");
212 //m_label.modify_fg(Gtk::STATE_NORMAL, Gdk::Color("#f1eded"));
213 //m_label.modify_fg(Gtk::STATE_ACTIVE, Gdk::Color("#111111"));
214 add(m_label);
215 }
216 /****************************************************************/
217 class GxTBox
218 {
219 public:
220 Gtk::VBox m_box;
221 ToggleCheckButton m_tcb;
222 GxTBox(gx_ui::GxUI& ui);
223 virtual ~GxTBox();
224 };
225
226 GxTBox::~GxTBox()
227 {
228 }
229
230 GxTBox::GxTBox(gx_ui::GxUI& ui)
231 {
232 }
233 /****************************************************************/
234 class GxVBox
235 {
236 public:
237 Gtk::VBox m_box;
238 Gtk::Label m_label;
239 GxVBox(gx_ui::GxUI& ui);
240 virtual ~GxVBox();
241 };
242
243 GxVBox::~GxVBox()
244 {
245 }
246
247 GxVBox::GxVBox(gx_ui::GxUI& ui)
248 {
249 }
250 /****************************************************************/
251 class GxHBox
252 {
253 public:
254 Gtk::HBox m_box;
255 Gtk::Label m_label;
256 Gtk::Frame m_frame;
257 GxHBox(gx_ui::GxUI& ui);
258 virtual ~GxHBox();
259 };
260
261 GxHBox::~GxHBox()
262 {
263 }
264
265 GxHBox::GxHBox(gx_ui::GxUI& ui)
266 {
267 }
268 /****************************************************************/
269 class GxFixedBox
270 {
271 public:
272 Gtk::Fixed m_fixed;
273 Gtk::VBox m_box;
274 GxFixedBox(gx_ui::GxUI& ui);
275 virtual ~GxFixedBox();
276 };
277
278 GxFixedBox::~GxFixedBox()
279 {
280 }
281
282 GxFixedBox::GxFixedBox(gx_ui::GxUI& ui)
283 {
284 m_fixed.put(m_box,0,0);
285 }
286 /****************************************************************/
287 class GxPaintBox
288 {
289
290 public:
291
292 Gtk::HBox m_box;
293 Gxw::PaintBox m_paintbox;
294 GxPaintBox(gx_ui::GxUI& ui, const char *expose_funk);
295 ~GxPaintBox();
296 };
297
298 GxPaintBox::~GxPaintBox()
299 {
300 }
301
302 GxPaintBox::GxPaintBox(gx_ui::GxUI& ui,const char *expose_funk):
303 m_box(false, 0)
304 {
305 m_paintbox.property_paint_func() = expose_funk;
306 m_paintbox.add(m_box);
307 }
308 /****************************************************************/
309 class GxEventBox
310 {
311 public:
312 Gtk::HBox m_box;
313 Gtk::HBox m_hbox;
314 Gtk::HBox m_pbox;
315 Gtk::HBox m_tbox;
316 Gtk::EventBox m_eventbox;
317 Gtk::HBox m_fbox;
318 Gtk::HBox m_fixedbox;
319 Gtk::Label m_label;
320 GxEventBox(gx_ui::GxUI& ui);
321 virtual ~GxEventBox();
322 };
323
324 GxEventBox::~GxEventBox()
325 {
326 }
327
328 GxEventBox::GxEventBox(gx_ui::GxUI& ui)
329 {
330
331 m_eventbox.add(m_box);
332 m_fixedbox.add(m_eventbox);
333 m_hbox.add(m_pbox);
334 m_hbox.pack_start(m_fbox,false,false);
335 m_fbox.pack_start(m_fixedbox,false,false);
336 m_hbox.add(m_tbox);
337 }
338 /****************************************************************/
339 class GxMainBox
340 {
341 public:
342 Gtk::HBox m_box;
343 Gtk::EventBox m_eventbox;
344 Gtk::Fixed m_fixedbox;
345 Gtk::Label m_label;
346 Gxw::PaintBox m_paintbox;
347 GxMainBox(gx_ui::GxUI& ui,const char *expose_funk);
348 virtual ~GxMainBox();
349 };
350
351 GxMainBox::~GxMainBox()
352 {
353 }
354
355 GxMainBox::GxMainBox(gx_ui::GxUI& ui,const char *expose_funk)
356 {
357 m_paintbox.add(m_box);
358 m_eventbox.add(m_paintbox);
359 m_paintbox.property_paint_func() = expose_funk;
360 m_fixedbox.put(m_eventbox,0,0);
361 }
362 /****************************************************************/
363 class GxMidiBox
364 {
365 public:
366 Gtk::HBox m_box;
367 Gtk::EventBox m_eventbox;
368 Gxw::PaintBox m_paintbox;
369 ToggleCheckButton m_tcb;
370 UiSwitch* unit_on_off;
371 Gtk::HBox m_bbox;
372 Gtk::Fixed m_fixedbox;
373 GxMidiBox(gx_ui::GxUI& ui,const char *expose_funk);
374 virtual ~GxMidiBox();
375 };
376
377 GxMidiBox::~GxMidiBox()
378 {
379 delete unit_on_off;
380 }
381
382 GxMidiBox::GxMidiBox(gx_ui::GxUI& ui,const char *expose_funk):
383 unit_on_off( UiSwitch::new_switch(ui, sw_led, "midi_out.on_off"))
384 {
385 m_bbox.pack_start(m_tcb,true,true);
386 m_bbox.pack_end(*unit_on_off,false,false);
387 m_paintbox.property_paint_func() = expose_funk;
388 m_eventbox.add(m_paintbox);
389 m_paintbox.add(m_box);
390 m_eventbox.set_border_width(0);
391 m_eventbox.set_name("black_box");
392 m_box.set_homogeneous(false);
393 m_box.set_spacing(0);
394 m_box.set_border_width(4);
395 m_box.pack_end(m_fixedbox,false, false, 0 );
396 m_fixedbox.set_size_request ( 25, -1);
397 }
398 /****************************************************************/
399 class GxNotebookBox
400 {
401 public:
402 Gtk::Notebook m_box;
403 GxNotebookBox(gx_ui::GxUI& ui);
404 virtual ~GxNotebookBox();
405 };
406
407 GxNotebookBox::~GxNotebookBox()
408 {
409 }
410
411 GxNotebookBox::GxNotebookBox(gx_ui::GxUI& ui)
412 {
413 m_box.set_name("tab_rack");
414 }
415 /****************************************************************/
416 class GxMoveBox
417 {
418 public:
419 Gtk::Label m_label;
420 Gtk::Label m_label1;
421 Gtk::Fixed m_fixed;
422 Gxw::PaintBox m_paintbox;
423 Gtk::Button m_button;
424 Gtk::Button m_button1;
425 GxMoveBox(gx_ui::GxUI& ui);
426 virtual ~GxMoveBox();
427 };
428
429 GxMoveBox::~GxMoveBox()
430 {
431 }
432
433 GxMoveBox::GxMoveBox(gx_ui::GxUI& ui)
434 {
435 m_paintbox.property_paint_func() = "rectangle_skin_color_expose";
436 m_label.set_text("â–¼");
437 m_label.set_name ("rack_label");
438 m_label1.set_text("â–²");
439 m_label1.set_name ("rack_label");
440 m_button.add(m_label);
441 m_button.set_size_request (20, 15);
442 m_button.set_name ("effect_reset");
443 m_button1.add(m_label1);
444 m_button1.set_size_request (20, 15);
445 m_button1.set_name ("effect_reset");
446 GtkStyle *style = gtk_widget_get_style(GTK_WIDGET(m_label.gobj()));
447 pango_font_description_set_size(style->font_desc, 6*PANGO_SCALE);
448 pango_font_description_set_weight(style->font_desc, PANGO_WEIGHT_BOLD);
449 gtk_widget_modify_font(GTK_WIDGET(m_label.gobj()), style->font_desc);
450 gtk_widget_modify_font(GTK_WIDGET(m_label1.gobj()), style->font_desc);
451 m_fixed.set_size_request (25, -1);
452 m_fixed.put(m_button1, 2, 5);
453 m_fixed.put(m_button, 2, 20);
454 m_paintbox.pack_end(m_fixed,false, false, 0 );
455 m_fixed.show_all();
456 m_paintbox.set_border_width (4);
457 m_paintbox.property_spacing() = 0;
458 m_paintbox.property_homogeneous() = false;
459 }
144 gboolean button_press_cb(GtkWidget *widget, GdkEventButton *event, gpointer data) {
145 if (event->button != 2)
146 return FALSE;
147 if (controller_map.get_config_mode())
148 return TRUE;
149 new gx_main_midi::MidiConnect(event, *reinterpret_cast<Parameter*>(data));
150 return TRUE;
151 }
152
153
154 // #include "gx_main_midi.cc"
460155
461156 /****************************************************************
462157 ** GxMainInterface widget and method definitions
463158 */
159
160 /*set global GUI widgets class */
161 GlobalWidgets gw;
162
163 /*init values for skin hadling */
164 SkinHandling::SkinHandling() {
165 gx_current_skin = 0;
166 last_skin = 0;
167 no_opt_skin = 0;
168 set_knob = 0;
169 }
170
171 SkinHandling skin;
464172
465173 // static member
466174 bool GxMainInterface::fInitialized = false;
468176 static pthread_t ui_thread;
469177 #endif
470178
471 int gx_set_mx_oriantation()
472 {
473 return (gint) gx_gui::main_xorg;
474 }
475
476 int gx_set_my_oriantation()
477 {
478 return (gint) gx_gui::main_yorg;
479 }
480
481 GxMainInterface::GxMainInterface(const char * name):
482 fTuner(this, &gx_engine::audio.fConsta1t)
483 {
484 highest_unseen_msg_level = -1;
485
486 /*-- set rc file overwrite it with export--*/
487 gtk_rc_parse(rcpath.c_str());
488
489 /*-- Declare the GTK Widgets --*/
490 fWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
491
492 /*---------------- set window defaults ----------------*/
493 //gtk_widget_set_size_request (GTK_WIDGET (fWindow) , 600,205);
494 gtk_window_set_resizable(GTK_WINDOW (fWindow) , FALSE);
495 gtk_window_set_title (GTK_WINDOW (fWindow), name);
496 gtk_window_set_gravity(GTK_WINDOW(fWindow), GDK_GRAVITY_STATIC);
497
498
499
500 /*---------------- singnals ----------------*/
501 g_signal_connect (GTK_OBJECT (fWindow), "destroy",
502 G_CALLBACK (gx_clean_exit), NULL);
503
504 /*---------------- status icon ----------------*/
505 if (gx_pixmap_check() == 0) {
506 status_icon = gtk_status_icon_new_from_pixbuf (GDK_PIXBUF(ib));
507 gtk_window_set_icon(GTK_WINDOW (fWindow), GDK_PIXBUF(ib));
508 g_signal_connect (G_OBJECT (status_icon), "activate", G_CALLBACK (gx_hide_extended_settings), NULL);
509 g_signal_connect (G_OBJECT (status_icon), "popup-menu", G_CALLBACK (gx_systray_menu), NULL);
510 }
511 else
512 {
513 gx_print_error(_("Main Interface Constructor"),
514 _("pixmap check failed, giving up"));
515 gx_clean_exit(NULL, (gpointer)1);
516 }
517
518 /*-- create accelerator group for keyboard shortcuts --*/
519 fAccelGroup = gtk_accel_group_new();
520 gtk_window_add_accel_group(GTK_WINDOW(fWindow), fAccelGroup);
521
522 /*---------------- create boxes ----------------*/
523 fTop = 0;
524 fBox[fTop] = gtk_vbox_new (homogene, 4);
525 fMode[fTop] = kBoxMode;
526
527 /*---------------- add mainbox to main window ---------------*/
528 gtk_container_add (GTK_CONTAINER (fWindow), fBox[fTop]);
529
530 fStopped = false;
531 }
532
533 //------- create or retrieve unique instance
534 GxMainInterface* GxMainInterface::instance(const char* name)
535 {
536 static GxMainInterface maingui(name);
537 return &maingui;
179 /* set initial window position*/
180 int gx_set_mx_oriantation() {
181 return (gint) gx_gui::main_xorg;
182 }
183
184 int gx_set_my_oriantation() {
185 return (gint) gx_gui::main_yorg;
186 }
187
188 /* create main window*/
189 GxMainInterface::GxMainInterface(const char * name)
190 :fTuner(this, &gx_engine::audio.fConsta1t) {
191 highest_unseen_msg_level = -1;
192
193 /*-- set rc file overwrite it with export--*/
194 gtk_rc_parse(gx_system::rcpath.c_str());
195
196 /*-- Declare the GTK Widgets --*/
197 gw.fWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
198
199 /*---------------- set window defaults ----------------*/
200 // gtk_widget_set_size_request (GTK_WIDGET (gw.fWindow) , 600,205);
201 gtk_window_set_resizable(GTK_WINDOW(gw.fWindow) , FALSE);
202 gtk_window_set_title(GTK_WINDOW(gw.fWindow), name);
203 gtk_window_set_gravity(GTK_WINDOW(gw.fWindow), GDK_GRAVITY_STATIC);
204
205 /*---------------- singnals ----------------*/
206 g_signal_connect(GTK_OBJECT(gw.fWindow), "destroy",
207 G_CALLBACK(gx_system::gx_clean_exit), NULL);
208
209 /*---------------- status icon ----------------*/
210 if (gx_system::gx_pixmap_check() == 0) {
211 gw.status_icon = gtk_status_icon_new_from_pixbuf(GDK_PIXBUF(gw.ib));
212 gtk_window_set_icon(GTK_WINDOW(gw.fWindow), GDK_PIXBUF(gw.ib));
213 g_signal_connect(G_OBJECT(gw.status_icon), "activate",
214 G_CALLBACK(gx_hide_extended_settings), NULL);
215 g_signal_connect(G_OBJECT(gw.status_icon), "popup-menu",
216 G_CALLBACK(gx_systray_menu), NULL);
217 } else {
218 gx_system::gx_print_error(_("Main Interface Constructor"),
219 _("pixmap check failed, giving up"));
220 gx_system::gx_clean_exit(NULL, (gpointer)1);
221 }
222
223 /*-- create accelerator group for keyboard shortcuts --*/
224 fAccelGroup = gtk_accel_group_new();
225 gtk_window_add_accel_group(GTK_WINDOW(gw.fWindow), fAccelGroup);
226
227 /*---------------- create boxes ----------------*/
228 fTop = 0;
229 fBox[fTop] = gtk_vbox_new(homogene, 4);
230 fMode[fTop] = kBoxMode;
231
232 /*---------------- add mainbox to main window ---------------*/
233 gtk_container_add(GTK_CONTAINER(gw.fWindow), fBox[fTop]);
234
235 fStopped = false;
236 }
237
238 // ------- create or retrieve unique instance
239 GxMainInterface* GxMainInterface::instance(const char* name) {
240 static GxMainInterface maingui(name);
241 return &maingui;
538242 }
539243
540244 /****************************************************************
541245 ** virtual GUI discriptions
542246 */
543247
544 //------- retrieve jack latency menu item
545 GtkWidget* const
546 GxMainInterface::getJackLatencyItem(jack_nframes_t bufsize) const
547 {
548 if (bufsize & (bufsize-1)) {
549 return NULL; // not power of 2
550 }
551 const int minbuf = 5; // 2**5 = 32 //FIXME magic value
552 int index = -(minbuf+1);
553 while (bufsize) {
554 bufsize >>= 1;
555 index++;
556 }
557 if (index >= 0 && index < NJACKLAT) {
558 return fJackLatencyItem[index];
559 }
560 return NULL;
561 }
562
563 //------- box stacking up
564 void GxMainInterface::pushBox(int mode, GtkWidget* w)
565 {
566 ++fTop;
567 assert(fTop < stackSize);
568 fMode[fTop] = mode;
569 fBox[fTop] = w;
570 }
571
572 void GxMainInterface::closeBox()
573 {
574 --fTop;
575 assert(fTop >= 0);
576 }
577
578 static void logging_set_color(GtkWidget *w, gpointer data)
579 {
580 GxMainInterface *p = (GxMainInterface*)data;
581 if (gtk_expander_get_expanded(GTK_EXPANDER(w)) == FALSE) {
582 // expander will be opened
583 p->highest_unseen_msg_level = kMessageTypeCount;
584 p->set_logging_expander_color("#ffffff");
585 } else {
586 p->highest_unseen_msg_level = -1;
587 }
588 }
589
590 static bool on_logger_delete_event()
591 {
592 GxMainInterface* gui = GxMainInterface::instance();
593 gtk_check_menu_item_set_active(
594 GTK_CHECK_MENU_ITEM(GTK_WIDGET(gui->fShowLogger.gobj())), FALSE
595 );
596 gtk_widget_hide(GTK_WIDGET(gui->logger));
597 return true;
598 }
599
600 void GxMainInterface::openTextLoggingBox(const char* label)
601 {
602 GtkWidget* box = gtk_hbox_new (homogene, 0);
603 logger = gtk_window_new (GTK_WINDOW_TOPLEVEL);
604 gtk_widget_set_size_request (GTK_WIDGET (logger) , 600,-1);
605 gtk_window_set_decorated(GTK_WINDOW(logger), TRUE);
606 gtk_window_set_icon(GTK_WINDOW (logger), GDK_PIXBUF(ib));
607 gtk_window_set_resizable(GTK_WINDOW(logger), FALSE);
608 gtk_window_set_gravity(GTK_WINDOW(logger), GDK_GRAVITY_SOUTH);
609 gtk_window_set_transient_for (GTK_WINDOW(logger), GTK_WINDOW(fWindow));
610 gtk_window_set_keep_below (GTK_WINDOW(logger), FALSE);
611 gtk_window_set_title (GTK_WINDOW (logger), _("Logging Window"));
612 gtk_window_set_type_hint (GTK_WINDOW (logger), GDK_WINDOW_TYPE_HINT_UTILITY);
613 gtk_window_set_destroy_with_parent(GTK_WINDOW(logger), TRUE);
614
615 gtk_container_set_border_width (GTK_CONTAINER (box), 0);
616
617 GtkWidget * scrollbox = gtk_scrolled_window_new(NULL,NULL);
618 fLoggingVAdjustment = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(scrollbox));
619 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(scrollbox),
620 GTK_POLICY_NEVER,GTK_POLICY_AUTOMATIC);
621
622 GtkWidget* frame = gtk_expander_new(label);
623 gtk_container_add (GTK_CONTAINER(frame), box);
624 gtk_container_add (GTK_CONTAINER(logger), frame);
625 gtk_widget_show(frame);
626 gtk_expander_set_expanded(GTK_EXPANDER(frame), true);
627 fLoggingBox = GTK_EXPANDER(frame);
628
629 // create text buffer
630 GtkTextBuffer* buffer = gtk_text_buffer_new(NULL);
631
632 GtkWidget* tbox = gtk_text_view_new_with_buffer(buffer);
633 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(tbox), GTK_WRAP_WORD_CHAR);
634 gtk_container_set_border_width (GTK_CONTAINER (tbox), 0);
635 gtk_text_view_set_editable(GTK_TEXT_VIEW(tbox), FALSE);
636 gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(tbox), FALSE);
637 gtk_text_view_set_pixels_above_lines (GTK_TEXT_VIEW(tbox), 0);
638 gtk_text_view_set_pixels_below_lines (GTK_TEXT_VIEW(tbox), 2);
639 gtk_text_view_set_justification(GTK_TEXT_VIEW(tbox), GTK_JUSTIFY_LEFT);
640 gtk_text_view_set_left_margin(GTK_TEXT_VIEW(tbox), 5);
641 gtk_text_view_set_indent(GTK_TEXT_VIEW(tbox), 0);
642
643 gtk_container_add (GTK_CONTAINER(box), scrollbox);
644 gtk_container_add(GTK_CONTAINER(scrollbox),GTK_WIDGET(tbox));
645 gtk_widget_show(tbox);
646 gtk_widget_show(scrollbox);
647 fLoggingWindow = GTK_TEXT_VIEW(tbox);
648 gtk_widget_set_size_request(tbox, -1, 100);
649 g_signal_connect(fLoggingBox, "activate", G_CALLBACK(logging_set_color), this);
650 g_signal_connect(GTK_CONTAINER(logger), "delete_event",
651 G_CALLBACK(on_logger_delete_event), NULL);
652 gtk_widget_show(box);
653
654 }
655
656 void GxMainInterface::set_logging_expander_color(const char *color)
657 {
658 GtkExpander* exbox = getLoggingBox();
659 if (gtk_expander_get_expanded(exbox) == FALSE) {
660 GdkColor c;
661 gdk_color_parse(color, &c);
662 gtk_widget_modify_fg(GTK_WIDGET(exbox), GTK_STATE_NORMAL, &c);
663 gtk_widget_modify_fg(gtk_expander_get_label_widget(exbox), GTK_STATE_NORMAL, &c);
664 }
665 }
666
667 void GxMainInterface::show_msg(string msgbuf, gx_system::GxMsgType msgtype)
668 {
669 // color depending on msg type
670 // initialize static tag table
671 static struct tab_table {
672 const char *tagname;
673 const char *tag_color;
674 GtkTextTag *tag;
675 } tags[kMessageTypeCount] = {
676 {"colinfo", "#0000ff"},
677 {"colwarn", "#ff8800"},
678 {"colerr", "#ff0000"},
679 };
680
681 assert(0 <= msgtype && msgtype < kMessageTypeCount);
682 assert(pthread_equal(pthread_self(), ui_thread));
683
684 // retrieve gtk text buffer
685 GtkTextBuffer* buffer = gtk_text_view_get_buffer(getLoggingWindow());
686
687 if (!tags[0].tag) { // fill static table
688 for (int i = 0; i < kMessageTypeCount; i++) {
689 tags[i].tag = gtk_text_buffer_create_tag(buffer, tags[i].tagname, "foreground",
690 tags[i].tag_color, NULL);
691 }
692 }
693
694 // how many lines to keep
695 const int nlines = 50;
696
697 // delete first line when window filled up
698 int linecount = gtk_text_buffer_get_line_count(buffer); // empty buffer == 1 line
699 if (linecount >= nlines) {
700 GtkTextIter iter1;
701 GtkTextIter iter2;
702 gtk_text_buffer_get_iter_at_line(buffer, &iter1, 0);
703 gtk_text_buffer_get_iter_at_line(buffer, &iter2, 1);
704 gtk_text_buffer_delete(buffer, &iter1, &iter2);
705 }
706 GtkTextIter iter;
707 gtk_text_buffer_get_end_iter(buffer, &iter);
708 if (gtk_text_buffer_get_char_count(buffer) > 0) {
709 gtk_text_buffer_insert(buffer, &iter, "\n", -1);
710 }
711
712 gtk_text_buffer_insert_with_tags(buffer, &iter, msgbuf.c_str(), -1,
713 tags[msgtype].tag, NULL);
714 gtk_adjustment_set_value(fLoggingVAdjustment, 10000); // scroll to end (big value, gets clamped to max)
715
716 // modify expander bg color is closed
717 if (msgtype > highest_unseen_msg_level) {
718 set_logging_expander_color(tags[msgtype].tag_color);
719 highest_unseen_msg_level = msgtype;
720 }
721 }
722
723 void GxMainInterface::openLevelMeterBox(const char* label)
724 {
725 GtkWidget* box1 = addWidget(label, gtk_alignment_new (0.5, 0.5, 0, 0));
726 GtkWidget* box = gtk_hbox_new (FALSE, 0);
727 gtk_container_add (GTK_CONTAINER(box1), box);
728
729 gint boxheight = 125;
730 gint boxwidth = 47;
731
732 gtk_container_set_border_width (GTK_CONTAINER (box), 3);
733 gtk_box_set_spacing(GTK_BOX(box), 1);
734
735 gtk_widget_set_size_request (GTK_WIDGET(box), boxwidth, boxheight);
736 g_signal_connect(box, "expose-event", G_CALLBACK(level_meter_expose), NULL);
737 g_signal_connect(GTK_CONTAINER(box), "check-resize",
738 G_CALLBACK(level_meter_expose), NULL);
739
740 // width of meter
741 int width = 8;
742
743 // how long we hold the peak bar = hold * thread call timeout
744 // Note: 30 * 80 = 2.4 sec
745 int hold = 20;
746
747 // gx_head output levels
748 GtkWidget* gxbox = gtk_hbox_new (FALSE, 0);
749 gtk_container_set_border_width (GTK_CONTAINER (gxbox), 0);
750 //gtk_box_set_spacing(GTK_BOX(gxbox), 6);
751
752 for (int i = 0; i < 2; i++) {
753 Gxw::FastMeter& fastmeter = fLevelMeters[i];
754 fastmeter.set_hold_count(hold);
755 fastmeter.property_dimen() = width;
756 fastmeter.set_size_request(width, boxheight);
757 fastmeter.signal_button_release_event().connect(
758 sigc::mem_fun(*this, &GxMainInterface::on_meter_button_release));
759 gtk_box_pack_start(GTK_BOX(gxbox), GTK_WIDGET(fastmeter.gobj()), FALSE, FALSE, 0);
760 if(i==0)
761 {
762 gtk_box_pack_start(GTK_BOX(gxbox),(UiRegler::create(*this,
763 new Gxw::LevelSlider(),"amp.out_master" , FALSE)), FALSE, FALSE, 0);
764 }
765 fastmeter.show();
766 fastmeter.set_tooltip_text(_("gx_head output"));
767 }
768
769 gtk_box_pack_start(GTK_BOX(box), gxbox, FALSE, TRUE, 0);
770 gtk_widget_show(gxbox);
771
772 // show main box
773 gtk_widget_show(box);
774 gtk_widget_show(box1);
248 // ------- retrieve jack latency menu item
249 GtkWidget* const GxMainInterface::getJackLatencyItem(jack_nframes_t bufsize) const {
250 if (bufsize & (bufsize-1)) {
251 return NULL; // not power of 2
252 }
253 const int minbuf = 5; // 2**5 = 32 // FIXME magic value
254 int index = -(minbuf+1);
255 while (bufsize) {
256 bufsize >>= 1;
257 index++;
258 }
259 if (index >= 0 && index < NJACKLAT) {
260 return fJackLatencyItem[index];
261 }
262 return NULL;
263 }
264
265 // ------- box stacking up
266 void GxMainInterface::pushBox(int mode, GtkWidget* w) {
267 ++fTop;
268 assert(fTop < stackSize);
269 fMode[fTop] = mode;
270 fBox[fTop] = w;
271 }
272
273 void GxMainInterface::closeBox() {
274 --fTop;
275 assert(fTop >= 0);
276 }
277
278 GtkWidget* GxMainInterface::addWidget(const char* label, GtkWidget* w) {
279 switch (fMode[fTop]) {
280 case kSingleMode :
281 gtk_container_add(GTK_CONTAINER(fBox[fTop]), w);
282 break;
283 case kBoxMode :
284 gtk_box_pack_start(GTK_BOX(fBox[fTop]), w, expand, fill, 0);
285 break;
286 case kTabMode :
287 gtk_notebook_append_page(GTK_NOTEBOOK(fBox[fTop]), w, gtk_label_new(label));
288 break;
289 }
290 gtk_widget_show(w);
291 return w;
292 }
293
294 /* loging box handling*/
295 static void logging_set_color(GtkWidget *w, gpointer data) {
296 GxMainInterface *p = reinterpret_cast<GxMainInterface*>(data);
297 if (gtk_expander_get_expanded(GTK_EXPANDER(w)) == FALSE) {
298 // expander will be opened
299 p->highest_unseen_msg_level = gx_system::kMessageTypeCount;
300 p->set_logging_expander_color("#ffffff");
301 } else {
302 p->highest_unseen_msg_level = -1;
303 }
304 }
305
306 static bool on_logger_delete_event() {
307 GxMainInterface* gui = GxMainInterface::instance();
308 gtk_check_menu_item_set_active(
309 GTK_CHECK_MENU_ITEM(GTK_WIDGET(gui->fShowLogger.gobj())), FALSE
310 );
311 gtk_widget_hide(GTK_WIDGET(gui->logger));
312 return true;
313 }
314
315 void GxMainInterface::openTextLoggingBox(const char* label) {
316 GtkWidget* box = gtk_hbox_new(homogene, 0);
317 logger = gtk_window_new(GTK_WINDOW_TOPLEVEL);
318 gtk_widget_set_size_request(GTK_WIDGET(logger) , 600, -1);
319 gtk_window_set_decorated(GTK_WINDOW(logger), TRUE);
320 gtk_window_set_icon(GTK_WINDOW(logger), GDK_PIXBUF(gw.ib));
321 gtk_window_set_resizable(GTK_WINDOW(logger), FALSE);
322 gtk_window_set_gravity(GTK_WINDOW(logger), GDK_GRAVITY_SOUTH);
323 gtk_window_set_transient_for(GTK_WINDOW(logger), GTK_WINDOW(gw.fWindow));
324 gtk_window_set_keep_below(GTK_WINDOW(logger), FALSE);
325 gtk_window_set_title(GTK_WINDOW(logger), _("Logging Window"));
326 gtk_window_set_type_hint(GTK_WINDOW(logger), GDK_WINDOW_TYPE_HINT_UTILITY);
327 gtk_window_set_destroy_with_parent(GTK_WINDOW(logger), TRUE);
328
329 gtk_container_set_border_width(GTK_CONTAINER(box), 0);
330
331 GtkWidget * scrollbox = gtk_scrolled_window_new(NULL, NULL);
332 fLoggingVAdjustment = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(scrollbox));
333 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollbox),
334 GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
335
336 GtkWidget* frame = gtk_expander_new(label);
337 gtk_container_add(GTK_CONTAINER(frame), box);
338 gtk_container_add(GTK_CONTAINER(logger), frame);
339 gtk_widget_show(frame);
340 gtk_expander_set_expanded(GTK_EXPANDER(frame), true);
341 fLoggingBox = GTK_EXPANDER(frame);
342
343 // create text buffer
344 GtkTextBuffer* buffer = gtk_text_buffer_new(NULL);
345
346 GtkWidget* tbox = gtk_text_view_new_with_buffer(buffer);
347 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(tbox), GTK_WRAP_WORD_CHAR);
348 gtk_container_set_border_width(GTK_CONTAINER(tbox), 0);
349 gtk_text_view_set_editable(GTK_TEXT_VIEW(tbox), FALSE);
350 gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(tbox), FALSE);
351 gtk_text_view_set_pixels_above_lines(GTK_TEXT_VIEW(tbox), 0);
352 gtk_text_view_set_pixels_below_lines(GTK_TEXT_VIEW(tbox), 2);
353 gtk_text_view_set_justification(GTK_TEXT_VIEW(tbox), GTK_JUSTIFY_LEFT);
354 gtk_text_view_set_left_margin(GTK_TEXT_VIEW(tbox), 5);
355 gtk_text_view_set_indent(GTK_TEXT_VIEW(tbox), 0);
356
357 gtk_container_add(GTK_CONTAINER(box), scrollbox);
358 gtk_container_add(GTK_CONTAINER(scrollbox), GTK_WIDGET(tbox));
359 gtk_widget_show(tbox);
360 gtk_widget_show(scrollbox);
361 fLoggingWindow = GTK_TEXT_VIEW(tbox);
362 gtk_widget_set_size_request(tbox, -1, 100);
363 g_signal_connect(fLoggingBox, "activate", G_CALLBACK(logging_set_color), this);
364 g_signal_connect(GTK_CONTAINER(logger), "delete_event",
365 G_CALLBACK(on_logger_delete_event), NULL);
366 gtk_widget_show(box);
367 }
368
369 void GxMainInterface::set_logging_expander_color(const char *color) {
370 GtkExpander* exbox = getLoggingBox();
371 if (gtk_expander_get_expanded(exbox) == FALSE) {
372 GdkColor c;
373 gdk_color_parse(color, &c);
374 gtk_widget_modify_fg(GTK_WIDGET(exbox), GTK_STATE_NORMAL, &c);
375 gtk_widget_modify_fg(gtk_expander_get_label_widget(exbox), GTK_STATE_NORMAL, &c);
376 }
377 }
378
379 void GxMainInterface::show_msg(string msgbuf, gx_system::GxMsgType msgtype) {
380 // color depending on msg type
381 // initialize static tag table
382 static struct tab_table {
383 const char *tagname;
384 const char *tag_color;
385 GtkTextTag *tag;
386 } tags[gx_system::kMessageTypeCount] = {
387 {"colinfo", "#0000ff"},
388 {"colwarn", "#ff8800"},
389 {"colerr", "#ff0000"},
390 };
391
392 assert(0 <= msgtype && msgtype < gx_system::kMessageTypeCount);
393 assert(pthread_equal(pthread_self(), ui_thread));
394
395 // retrieve gtk text buffer
396 GtkTextBuffer* buffer = gtk_text_view_get_buffer(getLoggingWindow());
397
398 if (!tags[0].tag) { // fill static table
399 for (int i = 0; i < gx_system::kMessageTypeCount; i++) {
400 tags[i].tag = gtk_text_buffer_create_tag(buffer, tags[i].tagname, "foreground",
401 tags[i].tag_color, NULL);
402 }
403 }
404
405 // how many lines to keep
406 const int nlines = 50;
407
408 // delete first line when window filled up
409 int linecount = gtk_text_buffer_get_line_count(buffer); // empty buffer == 1 line
410 if (linecount >= nlines) {
411 GtkTextIter iter1;
412 GtkTextIter iter2;
413 gtk_text_buffer_get_iter_at_line(buffer, &iter1, 0);
414 gtk_text_buffer_get_iter_at_line(buffer, &iter2, 1);
415 gtk_text_buffer_delete(buffer, &iter1, &iter2);
416 }
417 GtkTextIter iter;
418 gtk_text_buffer_get_end_iter(buffer, &iter);
419 if (gtk_text_buffer_get_char_count(buffer) > 0) {
420 gtk_text_buffer_insert(buffer, &iter, "\n", -1);
421 }
422
423 gtk_text_buffer_insert_with_tags(buffer, &iter, msgbuf.c_str(), -1,
424 tags[msgtype].tag, NULL);
425 gtk_adjustment_set_value(fLoggingVAdjustment, 10000);
426 // scroll to end (big value, gets clamped to max)
427
428 // modify expander bg color is closed
429 if (msgtype > highest_unseen_msg_level) {
430 set_logging_expander_color(tags[msgtype].tag_color);
431 highest_unseen_msg_level = msgtype;
432 }
433 }
434
435 /* create level meter*/
436 void GxMainInterface::openLevelMeterBox(const char* label) {
437 GtkWidget* box1 = addWidget(label, gtk_alignment_new(0.5, 0.5, 0, 0));
438 GtkWidget* box = gtk_hbox_new(FALSE, 0);
439 gtk_container_add(GTK_CONTAINER(box1), box);
440
441 gint boxheight = 125;
442 gint boxwidth = 47;
443
444 gtk_container_set_border_width(GTK_CONTAINER(box), 3);
445 gtk_box_set_spacing(GTK_BOX(box), 1);
446
447 gtk_widget_set_size_request(GTK_WIDGET(box), boxwidth, boxheight);
448 g_signal_connect(box, "expose-event", G_CALLBACK(gx_cairo::level_meter_expose), NULL);
449 g_signal_connect(GTK_CONTAINER(box), "check-resize",
450 G_CALLBACK(gx_cairo::level_meter_expose), NULL);
451
452 // width of meter
453 int width = 8;
454
455 // how long we hold the peak bar = hold * thread call timeout
456 // Note: 30 * 80 = 2.4 sec
457 int hold = 20;
458
459 // gx_head output levels
460 GtkWidget* gxbox = gtk_hbox_new(FALSE, 0);
461 gtk_container_set_border_width(GTK_CONTAINER(gxbox), 0);
462 // gtk_box_set_spacing(GTK_BOX(gxbox), 6);
463
464 for (int i = 0; i < 2; i++) {
465 Gxw::FastMeter& fastmeter = fLevelMeters[i];
466 fastmeter.set_hold_count(hold);
467 fastmeter.property_dimen() = width;
468 fastmeter.set_size_request(width, boxheight);
469 fastmeter.signal_button_release_event().connect(
470 sigc::mem_fun(*this, &GxMainInterface::on_meter_button_release));
471 gtk_box_pack_start(GTK_BOX(gxbox), GTK_WIDGET(fastmeter.gobj()), FALSE, FALSE, 0);
472 if (i == 0) {
473 gtk_box_pack_start(GTK_BOX(gxbox), (UiRegler::create(*this,
474 new Gxw::LevelSlider(), "amp.out_master" , FALSE)), FALSE, FALSE, 0);
475 }
476 fastmeter.show();
477 fastmeter.set_tooltip_text(_("gx_head output"));
478 }
479
480 gtk_box_pack_start(GTK_BOX(box), gxbox, FALSE, TRUE, 0);
481 gtk_widget_show(gxbox);
482
483 // show main box
484 gtk_widget_show(box);
485 gtk_widget_show(box1);
775486 }
776487
777488 // --------------------------- reorder effect chain button ---------------------------
778 struct uiOrderButton : public gx_ui::GxUiItemFloat
779 {
780 GtkButton* fButton;
781 uiOrderButton (gx_ui::GxUI* ui, float* zone, GtkButton* b) : gx_ui::GxUiItemFloat(ui, zone), fButton(b) {}
782
783 // box move to the right
784 static void pressed_right( GtkWidget *widget, gpointer data )
785 {
786 GtkWidget *box1 = gtk_widget_get_parent(GTK_WIDGET(widget));
787 GtkWidget * box = gtk_widget_get_parent(GTK_WIDGET(box1));
788 GtkWidget * parent = gtk_widget_get_parent(GTK_WIDGET(box));
789 if(GTK_IS_CONTAINER(parent)){
790 GValue pos = {0};
791 g_value_init (&pos, G_TYPE_INT);
792 static int move = 0;
793 gtk_container_child_get_property(GTK_CONTAINER(parent),GTK_WIDGET(box),"position", &pos);
794 GList* child_list = gtk_container_get_children(GTK_CONTAINER(parent));
795 guint max_client = g_list_length (child_list)-1;
796 guint per = g_value_get_int(&pos);
797 if (per<max_client-1)
798 {
799 GtkWidget *obi = (GtkWidget *) g_list_nth_data(child_list,per+1);
800 if(GTK_IS_CONTAINER(obi)){
801 child_list = gtk_container_get_children(GTK_CONTAINER(obi));
802 GtkWidget *obib = (GtkWidget *) g_list_nth_data(child_list,1);
803 child_list = gtk_container_get_children(GTK_CONTAINER(obib));
804 GtkWidget *obibi = (GtkWidget *) g_list_nth_data(child_list,0);
805
806 gtk_box_reorder_child (GTK_BOX(parent),GTK_WIDGET(box),per +1);
807 ((gx_ui::GxUiItemFloat*)data)->modifyZone(per+1);
808 /*child_list = gtk_container_get_children(GTK_CONTAINER(box));
809 GtkWidget *plug = (GtkWidget *) g_list_nth_data(child_list,1);
810 string name = gtk_widget_get_name(plug);
811 fprintf(stderr, " %i %s .pressed right\n",per,name.c_str()); */
812 if(GTK_IS_BUTTON (obibi)) {
813 gtk_button_clicked(GTK_BUTTON(obibi));
814 } else {
815 child_list = gtk_container_get_children(GTK_CONTAINER(obi));
816 obib = (GtkWidget *) g_list_nth_data(child_list,1);
817 // name = gtk_widget_get_name(obib);
818 //fprintf(stderr, " %i %s .next child right\n",per,name.c_str());
819 if(!GDK_IS_WINDOW (obib->window)|| !gtk_widget_is_drawable (obib)) {
820 //fprintf(stderr, " %i %s.hidden\n",per,name.c_str());
821 move =1;
822 } else move= 0;
823 obib = (GtkWidget *) g_list_nth_data(child_list,3);
824
825 if(GTK_IS_CONTAINER(obib)){
826 child_list = gtk_container_get_children(GTK_CONTAINER(obib));
827 obibi = (GtkWidget *) g_list_nth_data(child_list,0);
828 if(GTK_IS_BUTTON (obibi)) {
829 gtk_button_clicked(GTK_BUTTON(obibi));
830 if(move) gtk_button_pressed(GTK_BUTTON(widget));
831
832 }
833 }
834 }
835 }
836 }
837 g_list_free(child_list);
838 }
839 }
840 // box move to the left
841 static void pressed_left( GtkWidget *widget, gpointer data )
842 {
843
844 GtkWidget *box1 = gtk_widget_get_parent(GTK_WIDGET(widget));
845 GtkWidget * box = gtk_widget_get_parent(GTK_WIDGET(box1));
846 GtkWidget * parent = gtk_widget_get_parent(GTK_WIDGET(box));
847 if(GTK_IS_CONTAINER(parent)){
848 GValue pos = {0};
849 g_value_init (&pos, G_TYPE_INT);
850 static int move = 0;
851 gtk_container_child_get_property(GTK_CONTAINER(parent),GTK_WIDGET(box),"position", &pos);
852 guint per = g_value_get_int(&pos);
853 if (per>1)
854 {
855 GList* child_list = gtk_container_get_children(GTK_CONTAINER(parent));
856 GtkWidget *obi = (GtkWidget *) g_list_nth_data(child_list,per-1);
857 if(GTK_IS_CONTAINER(obi)){
858 child_list = gtk_container_get_children(GTK_CONTAINER(obi));
859 GtkWidget *obib = (GtkWidget *) g_list_nth_data(child_list,1);
860 child_list = gtk_container_get_children(GTK_CONTAINER(obib));
861 GtkWidget *obibi = (GtkWidget *) g_list_nth_data(child_list,1);
862
863 gtk_box_reorder_child (GTK_BOX(parent),GTK_WIDGET(box),per -1);
864 ((gx_ui::GxUiItemFloat*)data)->modifyZone(per-1);
865 /*child_list = gtk_container_get_children(GTK_CONTAINER(box));
866 GtkWidget *plug = (GtkWidget *) g_list_nth_data(child_list,1);
867 string name = gtk_widget_get_name(plug);
868 fprintf(stderr, " %i %s .pressed left\n",per,name.c_str()); */
869 if(GTK_IS_BUTTON (obibi)){
870 gtk_button_clicked(GTK_BUTTON(obibi));
871 } else {
872 child_list = gtk_container_get_children(GTK_CONTAINER(obi));
873 obib = (GtkWidget *) g_list_nth_data(child_list,1);
874 //name = gtk_widget_get_name(obib);
875 //fprintf(stderr, " %i %s .next child left\n",per,name.c_str());
876 if(!GDK_IS_WINDOW (obib->window)|| !gtk_widget_is_drawable (obib)) {
877 //fprintf(stderr, " %i %s.hidden\n",per,name.c_str());
878 move =1;
879 } else move= 0;
880 obib = (GtkWidget *) g_list_nth_data(child_list,3);
881
882 if(GTK_IS_CONTAINER(obib)){
883 child_list = gtk_container_get_children(GTK_CONTAINER(obib));
884 obibi = (GtkWidget *) g_list_nth_data(child_list,1);
885 if(GTK_IS_BUTTON (obibi)) {
886 gtk_button_clicked(GTK_BUTTON(obibi));
887 if(move)
888 gtk_button_pressed(GTK_BUTTON(widget));
889
890 }
891 }
892 }
893 }
894 g_list_free(child_list);
895 }
896 }
897 }
898 // resize the effect box
899 static void resize( GtkWidget *widget, gpointer data )
900 {
901 GtkWidget *box1 = gtk_widget_get_parent(GTK_WIDGET(widget));
902 GList* child_list = gtk_container_get_children(GTK_CONTAINER(box1));
903 GtkWidget *parent = (GtkWidget *) g_list_nth_data(child_list,1);
904 child_list = gtk_container_get_children(GTK_CONTAINER(parent));
905 box1 = (GtkWidget *) g_list_nth_data(child_list,0);
906 child_list = gtk_container_get_children(GTK_CONTAINER(box1));
907 box1 = (GtkWidget *) g_list_nth_data(child_list,0);
908 child_list = gtk_container_get_children(GTK_CONTAINER(box1));
909 box1 = (GtkWidget *) g_list_nth_data(child_list,0);
910 child_list = gtk_container_get_children(GTK_CONTAINER(box1));
911 box1 = (GtkWidget *) g_list_nth_data(child_list,0);
912 child_list = gtk_container_get_children(GTK_CONTAINER(box1));
913 box1 = (GtkWidget *) g_list_nth_data(child_list,0);
914 g_list_free(child_list);
915
916 int width, height;
917 gtk_widget_get_size_request (parent, &width, &height);
918 if (width!=-1)
919 {
920 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(parent),GTK_POLICY_NEVER,GTK_POLICY_NEVER);
921 gtk_widget_set_size_request (parent, -1, -1);
922 }
923 else
924 {
925 width= box1->allocation.width;
926 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(parent),GTK_POLICY_AUTOMATIC,GTK_POLICY_NEVER);
927 gtk_widget_set_size_request (parent, width*5, -1);
928 }
929 }
930
931 // save order for neigbor box
932 static void clicked( GtkWidget *widget, gpointer data )
933 {
934 GtkWidget *box1 = gtk_widget_get_parent(GTK_WIDGET(widget));
935 GtkWidget * box = gtk_widget_get_parent(GTK_WIDGET(box1));
936 GtkWidget * parent = gtk_widget_get_parent(GTK_WIDGET(box));
937 if(GTK_IS_CONTAINER(parent)){
938 GValue pos = {0};
939 g_value_init (&pos, G_TYPE_INT);
940
941 gtk_container_child_get_property(GTK_CONTAINER(parent),GTK_WIDGET(box),"position", &pos);
942 guint per = g_value_get_int(&pos);
943 gtk_box_reorder_child (GTK_BOX(parent),GTK_WIDGET(box),per);
944 if(GDK_IS_WINDOW (box->window))
945 gdk_window_invalidate_rect(box->window,NULL,true);
946
947 ((gx_ui::GxUiItemFloat*)data)->modifyZone(per);
948 /*GList* child_list = gtk_container_get_children(GTK_CONTAINER(box));
949 GtkWidget *plug = (GtkWidget *) g_list_nth_data(child_list,1);
950 const gchar *name = gtk_widget_get_name(plug);
951 fprintf(stderr, " %i %s .clicked\n",per,name);
952
953 g_list_free(child_list);*/
954 }
955 }
956 // set the init order
957 virtual void reflectZone()
958 {
959
960 float v = *fZone;
961 fCache = v;
962 GValue pos = {0};
963
964 g_value_init (&pos, G_TYPE_INT);
965 g_value_set_int(&pos,(gint)v);
966
967 GtkWidget *box1 = gtk_widget_get_parent(GTK_WIDGET(fButton));
968 GtkWidget * box = gtk_widget_get_parent(GTK_WIDGET(box1));
969 GtkWidget * parent = gtk_widget_get_parent(GTK_WIDGET(box));
970 if(GTK_IS_CONTAINER(parent)){
971 gtk_container_child_set_property(GTK_CONTAINER(parent),GTK_WIDGET(box),"position", &pos);
972 guint per = g_value_get_int(&pos);
973 gtk_box_reorder_child (GTK_BOX(parent),GTK_WIDGET(box),per);
974 }
975
976 }
489 struct uiOrderButton : public gx_ui::GxUiItemFloat {
490 GtkButton* fButton;
491 uiOrderButton(gx_ui::GxUI* ui, float* zone, GtkButton* b)
492 : gx_ui::GxUiItemFloat(ui, zone), fButton(b) {}
493
494 // box move to the right
495 static void pressed_right(GtkWidget *widget, gpointer data) {
496 GtkWidget *box1 = gtk_widget_get_parent(GTK_WIDGET(widget));
497 GtkWidget * box = gtk_widget_get_parent(GTK_WIDGET(box1));
498 GtkWidget * parent = gtk_widget_get_parent(GTK_WIDGET(box));
499 if (GTK_IS_CONTAINER(parent)) {
500 GValue pos = {0};
501 g_value_init(&pos, G_TYPE_INT);
502 static int move = 0;
503 gtk_container_child_get_property(GTK_CONTAINER(parent),
504 GTK_WIDGET(box), "position", &pos);
505 GList* child_list = gtk_container_get_children(GTK_CONTAINER(parent));
506 guint max_client = g_list_length(child_list)-1;
507 guint per = g_value_get_int(&pos);
508 if (per < max_client-1) {
509 GtkWidget *obi = reinterpret_cast<GtkWidget *>
510 (g_list_nth_data(child_list, per+1));
511 if (GTK_IS_CONTAINER(obi)) {
512 child_list = gtk_container_get_children(GTK_CONTAINER(obi));
513 GtkWidget *obib = reinterpret_cast<GtkWidget *>
514 (g_list_nth_data(child_list, 1));
515 child_list = gtk_container_get_children(GTK_CONTAINER(obib));
516 GtkWidget *obibi = reinterpret_cast<GtkWidget *>
517 (g_list_nth_data(child_list, 0));
518
519 gtk_box_reorder_child(GTK_BOX(parent), GTK_WIDGET(box), per +1);
520 ((gx_ui::GxUiItemFloat*)data)->modifyZone(per+1);
521 /*child_list = gtk_container_get_children(GTK_CONTAINER(box));
522 GtkWidget *plug = (GtkWidget *) g_list_nth_data(child_list,1);
523 string name = gtk_widget_get_name(plug);
524 fprintf(stderr, " %i %s .pressed right\n",per,name.c_str()); */
525 if (GTK_IS_BUTTON(obibi)) {
526 gtk_button_clicked(GTK_BUTTON(obibi));
527 } else {
528 child_list = gtk_container_get_children(GTK_CONTAINER(obi));
529 obib = reinterpret_cast<GtkWidget *>(g_list_nth_data(child_list, 1));
530 // name = gtk_widget_get_name(obib);
531 // fprintf(stderr, " %i %s .next child right\n",per,name.c_str());
532 if (!GDK_IS_WINDOW(obib->window)|| !gtk_widget_is_drawable(obib)) {
533 // fprintf(stderr, " %i %s.hidden\n",per,name.c_str());
534 move = 1;
535 } else {
536 move = 0;
537 }
538 obib = reinterpret_cast<GtkWidget *>(g_list_nth_data(child_list, 3));
539
540 if (GTK_IS_CONTAINER(obib)) {
541 child_list = gtk_container_get_children(GTK_CONTAINER(obib));
542 obibi = reinterpret_cast<GtkWidget *>(g_list_nth_data(child_list, 0));
543 if (GTK_IS_BUTTON(obibi)) {
544 gtk_button_clicked(GTK_BUTTON(obibi));
545 if (move) gtk_button_pressed(GTK_BUTTON(widget));
546 }
547 }
548 }
549 }
550 }
551 g_list_free(child_list);
552 }
553 }
554 // box move to the left
555 static void pressed_left(GtkWidget *widget, gpointer data) {
556
557 GtkWidget *box1 = gtk_widget_get_parent(GTK_WIDGET(widget));
558 GtkWidget * box = gtk_widget_get_parent(GTK_WIDGET(box1));
559 GtkWidget * parent = gtk_widget_get_parent(GTK_WIDGET(box));
560 if (GTK_IS_CONTAINER(parent)) {
561 GValue pos = {0};
562 g_value_init(&pos, G_TYPE_INT);
563 static int move = 0;
564 gtk_container_child_get_property(GTK_CONTAINER(parent),
565 GTK_WIDGET(box), "position", &pos);
566 guint per = g_value_get_int(&pos);
567 if (per > 1) {
568 GList* child_list = gtk_container_get_children(GTK_CONTAINER(parent));
569 GtkWidget *obi = reinterpret_cast<GtkWidget *>
570 (g_list_nth_data(child_list, per-1));
571 if (GTK_IS_CONTAINER(obi)) {
572 child_list = gtk_container_get_children(GTK_CONTAINER(obi));
573 GtkWidget *obib = reinterpret_cast<GtkWidget *>
574 (g_list_nth_data(child_list, 1));
575 child_list = gtk_container_get_children(GTK_CONTAINER(obib));
576 GtkWidget *obibi = reinterpret_cast<GtkWidget *>
577 (g_list_nth_data(child_list, 1));
578
579 gtk_box_reorder_child(GTK_BOX(parent), GTK_WIDGET(box), per -1);
580 ((gx_ui::GxUiItemFloat*)data)->modifyZone(per-1);
581 /*child_list = gtk_container_get_children(GTK_CONTAINER(box));
582 GtkWidget *plug = (GtkWidget *) g_list_nth_data(child_list,1);
583 string name = gtk_widget_get_name(plug);
584 fprintf(stderr, " %i %s .pressed left\n",per,name.c_str()); */
585 if (GTK_IS_BUTTON(obibi)) {
586 gtk_button_clicked(GTK_BUTTON(obibi));
587 } else {
588 child_list = gtk_container_get_children(GTK_CONTAINER(obi));
589 obib = reinterpret_cast<GtkWidget *>(g_list_nth_data(child_list, 1));
590 // name = gtk_widget_get_name(obib);
591 // fprintf(stderr, " %i %s .next child left\n",per,name.c_str());
592 if (!GDK_IS_WINDOW(obib->window)|| !gtk_widget_is_drawable(obib)) {
593 // fprintf(stderr, " %i %s.hidden\n",per,name.c_str());
594 move =1;
595 } else {
596 move= 0;
597 }
598 obib = reinterpret_cast<GtkWidget *>(g_list_nth_data(child_list, 3));
599
600 if (GTK_IS_CONTAINER(obib)) {
601 child_list = gtk_container_get_children(GTK_CONTAINER(obib));
602 obibi = reinterpret_cast<GtkWidget *>
603 (g_list_nth_data(child_list, 1));
604 if (GTK_IS_BUTTON(obibi)) {
605 gtk_button_clicked(GTK_BUTTON(obibi));
606 if (move)
607 gtk_button_pressed(GTK_BUTTON(widget));
608 }
609 }
610 }
611 }
612 g_list_free(child_list);
613 }
614 }
615 }
616 // resize the effect box
617 static void resize(GtkWidget *widget, gpointer data) {
618 GtkWidget *box1 = gtk_widget_get_parent(GTK_WIDGET(widget));
619 GList* child_list = gtk_container_get_children(GTK_CONTAINER(box1));
620 GtkWidget *parent = reinterpret_cast<GtkWidget *>(g_list_nth_data(child_list, 1));
621 child_list = gtk_container_get_children(GTK_CONTAINER(parent));
622 box1 = reinterpret_cast<GtkWidget *>(g_list_nth_data(child_list, 0));
623 child_list = gtk_container_get_children(GTK_CONTAINER(box1));
624 box1 = reinterpret_cast<GtkWidget *>(g_list_nth_data(child_list, 0));
625 child_list = gtk_container_get_children(GTK_CONTAINER(box1));
626 box1 = reinterpret_cast<GtkWidget *>(g_list_nth_data(child_list, 0));
627 child_list = gtk_container_get_children(GTK_CONTAINER(box1));
628 box1 = reinterpret_cast<GtkWidget *>(g_list_nth_data(child_list, 0));
629 child_list = gtk_container_get_children(GTK_CONTAINER(box1));
630 box1 = reinterpret_cast<GtkWidget *>(g_list_nth_data(child_list, 0));
631 g_list_free(child_list);
632
633 int width, height;
634 gtk_widget_get_size_request(parent, &width, &height);
635 if (width != -1) {
636 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(parent),
637 GTK_POLICY_NEVER, GTK_POLICY_NEVER);
638 gtk_widget_set_size_request(parent, -1, -1);
639 } else {
640 width = box1->allocation.width;
641 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(parent),
642 GTK_POLICY_AUTOMATIC, GTK_POLICY_NEVER);
643 gtk_widget_set_size_request(parent, width*5, -1);
644 }
645 }
646
647 // save order for neigbor box
648 static void clicked(GtkWidget *widget, gpointer data) {
649 GtkWidget *box1 = gtk_widget_get_parent(GTK_WIDGET(widget));
650 GtkWidget * box = gtk_widget_get_parent(GTK_WIDGET(box1));
651 GtkWidget * parent = gtk_widget_get_parent(GTK_WIDGET(box));
652 if (GTK_IS_CONTAINER(parent)) {
653 GValue pos = {0};
654 g_value_init(&pos, G_TYPE_INT);
655
656 gtk_container_child_get_property(GTK_CONTAINER(parent),
657 GTK_WIDGET(box), "position", &pos);
658 guint per = g_value_get_int(&pos);
659 gtk_box_reorder_child(GTK_BOX(parent), GTK_WIDGET(box), per);
660 if (GDK_IS_WINDOW (box->window))
661 gdk_window_invalidate_rect(box->window, NULL, true);
662
663 ((gx_ui::GxUiItemFloat*)data)->modifyZone(per);
664 /*GList* child_list = gtk_container_get_children(GTK_CONTAINER(box));
665 GtkWidget *plug = (GtkWidget *) g_list_nth_data(child_list,1);
666 const gchar *name = gtk_widget_get_name(plug);
667 fprintf(stderr, " %i %s .clicked\n",per,name);
668
669 g_list_free(child_list);*/
670 }
671 }
672 // set the init order
673 virtual void reflectZone() {
674
675 float v = *fZone;
676 fCache = v;
677 GValue pos = {0};
678
679 g_value_init(&pos, G_TYPE_INT);
680 g_value_set_int(&pos, (gint)v);
681
682 GtkWidget *box1 = gtk_widget_get_parent(GTK_WIDGET(fButton));
683 GtkWidget * box = gtk_widget_get_parent(GTK_WIDGET(box1));
684 GtkWidget * parent = gtk_widget_get_parent(GTK_WIDGET(box));
685 if (GTK_IS_CONTAINER(parent)) {
686 gtk_container_child_set_property(GTK_CONTAINER(parent),
687 GTK_WIDGET(box), "position", &pos);
688 guint per = g_value_get_int(&pos);
689 gtk_box_reorder_child(GTK_BOX(parent), GTK_WIDGET(box), per);
690 }
691 }
977692 };
978693
979694
980 //----- boxes to move inside a other box
981 void GxMainInterface::openHorizontalOrderBox(const char* label, float* posit)
982 {
983 GxMoveBox * box = new GxMoveBox(*this);
984 uiOrderButton* c = new uiOrderButton(this, posit, GTK_BUTTON(box->m_button.gobj()));
985
986 g_signal_connect (GTK_OBJECT (box->m_button.gobj()), "pressed",
987 G_CALLBACK (uiOrderButton::pressed_right), (gpointer) c);
988 g_signal_connect (GTK_OBJECT (box->m_button1.gobj()), "pressed",
989 G_CALLBACK (uiOrderButton::pressed_left), (gpointer) c);
990 g_signal_connect (GTK_OBJECT (box->m_button.gobj()), "clicked",
991 G_CALLBACK (uiOrderButton::clicked), (gpointer) c);
992 g_signal_connect (GTK_OBJECT (box->m_button1.gobj()), "clicked",
993 G_CALLBACK (uiOrderButton::clicked), (gpointer) c);
994 gtk_box_pack_start (GTK_BOX(rBox),GTK_WIDGET(box->m_paintbox.gobj()) , expand, false, 0);
995 GValue pos = {0};
996 float z = *posit;
997 gint poset = int(z);
998 //fprintf(stderr, " %i .monobox\n",poset);
999 g_value_init (&pos, G_TYPE_INT);
1000 g_value_set_int(&pos,poset);
1001 string tooltip = _("Move ");
1002 tooltip += label;
1003 tooltip += _(" up");
1004 box->m_button1.set_tooltip_text(tooltip);
1005 box->m_button1.get_accessible()->set_description (tooltip);
1006 box->m_button1.get_accessible()->set_name (label);
1007 tooltip = _("Move ");
1008 tooltip += label;
1009 tooltip += _(" down");
1010 box->m_button.set_tooltip_text(tooltip);
1011 box->m_button.get_accessible()->set_description (tooltip);
1012 box->m_button.get_accessible()->set_name (label);
1013 gtk_container_child_set_property(GTK_CONTAINER(rBox),GTK_WIDGET(box->m_paintbox.gobj()),"position", &pos);
1014 pushBox(kBoxMode, GTK_WIDGET(box->m_paintbox.gobj()));
1015 }
1016
1017 void GxMainInterface::openHorizontalRestetBox(const char* label, float* posit)
1018 {
1019 GxMoveBox * box = new GxMoveBox(*this);
1020 uiOrderButton* c = new uiOrderButton(this, posit, GTK_BUTTON(box->m_button.gobj()));
1021
1022 g_signal_connect (GTK_OBJECT (box->m_button.gobj()), "pressed",
1023 G_CALLBACK (uiOrderButton::pressed_right), (gpointer) c);
1024 g_signal_connect (GTK_OBJECT (box->m_button1.gobj()), "pressed",
1025 G_CALLBACK (uiOrderButton::pressed_left), (gpointer) c);
1026 g_signal_connect (GTK_OBJECT (box->m_button.gobj()), "clicked",
1027 G_CALLBACK (uiOrderButton::clicked), (gpointer) c);
1028 g_signal_connect (GTK_OBJECT (box->m_button1.gobj()), "clicked",
1029 G_CALLBACK (uiOrderButton::clicked), (gpointer) c);
1030 gtk_box_pack_start (GTK_BOX(sBox),GTK_WIDGET(box->m_paintbox.gobj()) , expand, false, 0);
1031 GValue pos = {0};
1032 float z = *posit;
1033 gint poset = int(z);
1034 //fprintf(stderr, " %i .monobox\n",poset);
1035 g_value_init (&pos, G_TYPE_INT);
1036 g_value_set_int(&pos,poset);
1037 string tooltip = _("Move ");
1038 tooltip += label;
1039 tooltip += _(" up");
1040 box->m_button1.set_tooltip_text(tooltip);
1041 box->m_button1.get_accessible()->set_description (tooltip);
1042 box->m_button1.get_accessible()->set_name (label);
1043 tooltip = _("Move ");
1044 tooltip += label;
1045 tooltip += _(" down");
1046 box->m_button.set_tooltip_text(tooltip);
1047 box->m_button.get_accessible()->set_description (tooltip);
1048 box->m_button.get_accessible()->set_name (label);
1049 gtk_container_child_set_property(GTK_CONTAINER(sBox),GTK_WIDGET(box->m_paintbox.gobj()),"position", &pos);
1050 pushBox(kBoxMode, GTK_WIDGET(box->m_paintbox.gobj()));
1051 }
1052
1053 //-------- different gxmm container
1054 void GxMainInterface::openEventBox(const char* label)
1055 {
1056 GxEventBox * box = new GxEventBox(*this);
1057 gtk_box_pack_start (GTK_BOX(fBox[fTop]), GTK_WIDGET (box->m_hbox.gobj()), false, fill, 0);
1058 box->m_box.set_size_request (600,182); // main window size
1059 box->m_box.set_border_width (2);
1060 box->m_eventbox.set_name("main_window");
1061 pushBox(kBoxMode, GTK_WIDGET(box->m_box.gobj()));
1062 box->m_hbox.show_all();
1063 }
1064
1065 void GxMainInterface::openFrameBox(const char* label)
1066 {
1067 GxHBox * box = new GxHBox(*this);
1068 box->m_box.set_homogeneous(false);
1069 box->m_box.set_spacing(2);
1070 box->m_box.set_border_width(2);
1071
1072 if (fMode[fTop] != kTabMode && label[0] != 0) {
1073 box->m_frame.set_label(label);
1074 box->m_frame.set_shadow_type(Gtk::SHADOW_NONE);
1075 box->m_frame.add(box->m_box);
1076 gtk_box_pack_start (GTK_BOX(fBox[fTop]), GTK_WIDGET(box->m_frame.gobj()), false, fill, 0);
1077 box->m_box.show();
1078 box->m_frame.show();
1079 pushBox(kBoxMode, GTK_WIDGET(box->m_box.gobj()));
1080 } else {
1081 pushBox(kBoxMode, addWidget(label,GTK_WIDGET(box->m_box.gobj())));
1082 }
1083 }
1084
1085 void GxMainInterface::openHorizontalBox(const char* label)
1086 {
1087 GxHBox * box = new GxHBox(*this);
1088 box->m_box.set_homogeneous(false);
1089 box->m_box.set_spacing(0);
1090 box->m_box.set_border_width(0);
1091
1092 if (fMode[fTop] != kTabMode && label[0] != 0) {
1093 box->m_frame.set_label(label);
1094 box->m_frame.set_shadow_type(Gtk::SHADOW_NONE);
1095 box->m_frame.add(box->m_box);
1096 gtk_box_pack_start (GTK_BOX(fBox[fTop]), GTK_WIDGET(box->m_frame.gobj()), false, fill, 0);
1097 box->m_box.show();
1098 box->m_frame.show();
1099 pushBox(kBoxMode, GTK_WIDGET(box->m_box.gobj()));
1100 } else {
1101 pushBox(kBoxMode, addWidget(label,GTK_WIDGET(box->m_box.gobj())));
1102 }
1103 }
1104
1105 void GxMainInterface::openHorizontalTableBox(const char* label)
1106 {
1107 GxHBox * box = new GxHBox(*this);
1108 box->m_box.set_homogeneous(false);
1109 box->m_box.set_spacing(0);
1110 box->m_box.set_border_width(0);
1111
1112 if (fMode[fTop] != kTabMode && label[0] != 0) {
1113 box->m_frame.set_label(label);
1114 box->m_frame.set_shadow_type(Gtk::SHADOW_NONE);
1115 box->m_frame.add(box->m_box);
1116 gtk_box_pack_start (GTK_BOX(fBox[fTop]), GTK_WIDGET(box->m_frame.gobj()), false, fill, 0);
1117 box->m_box.show();
1118 box->m_frame.show();
1119 pushBox(kBoxMode, GTK_WIDGET(box->m_box.gobj()));
1120 } else {
1121 pushBox(kBoxMode, addWidget(label,GTK_WIDGET(box->m_box.gobj())));
1122 }
1123 }
1124
1125 void GxMainInterface::openVerticalBox(const char* label)
1126 {
1127 GxVBox * box = new GxVBox(*this);
1128 box->m_box.set_homogeneous(false);
1129 box->m_box.set_spacing(0);
1130 box->m_box.set_border_width(0);
1131
1132 if (fMode[fTop] != kTabMode && label[0] != 0) {
1133 box->m_label.set_text(label);
1134 box->m_label.set_name ("rack_label");
1135 GtkStyle *style = gtk_widget_get_style(GTK_WIDGET(box->m_label.gobj()));
1136 pango_font_description_set_size(style->font_desc, 8*PANGO_SCALE);
1137 pango_font_description_set_weight(style->font_desc, PANGO_WEIGHT_BOLD);
1138 gtk_widget_modify_font(GTK_WIDGET(box->m_label.gobj()), style->font_desc);
1139 box->m_box.pack_start(box->m_label,false, false, 0 );
1140 gtk_box_pack_start (GTK_BOX(fBox[fTop]), GTK_WIDGET(box->m_box.gobj()), false, fill, 0);
1141 box->m_box.show();
1142 box->m_label.show();
1143 pushBox(kBoxMode, GTK_WIDGET(box->m_box.gobj()));
1144 } else {
1145 pushBox(kBoxMode, addWidget(label,GTK_WIDGET(box->m_box.gobj())));
1146 }
1147 }
1148
1149 void GxMainInterface::openFlipLabelBox(const char* label)
1150 {
1151 GxVBox * box = new GxVBox(*this);
1152 box->m_box.set_homogeneous(false);
1153 box->m_box.set_spacing(0);
1154 box->m_box.set_border_width(0);
1155
1156 if (fMode[fTop] != kTabMode && label[0] != 0) {
1157 GxVBox * vbox = new GxVBox(*this);
1158 vbox->m_box.set_homogeneous(false);
1159 vbox->m_box.set_spacing(0);
1160 vbox->m_box.set_border_width(0);
1161
1162 GxHBox * hbox = new GxHBox(*this);
1163 hbox->m_box.set_homogeneous(false);
1164 hbox->m_box.set_spacing(0);
1165 hbox->m_box.set_border_width(0);
1166
1167 hbox->m_label.set_text(label);
1168 hbox->m_label.set_name ("beffekt_label");
1169 hbox->m_label.set_angle(90);
1170 hbox->m_label.set_size_request (15,-1);
1171
1172 Pango::FontDescription font = hbox->m_label.get_style()->get_font();
1173 font.set_size(8*Pango::SCALE);
1174 font.set_weight(Pango::WEIGHT_BOLD);
1175 hbox->m_label.modify_font(font);
1176
1177 hbox->m_box.add(hbox->m_label);
1178 hbox->m_box.add(vbox->m_box);
1179 box->m_box.add(hbox->m_box);
1180 gtk_box_pack_start (GTK_BOX(fBox[fTop]), GTK_WIDGET(box->m_box.gobj()), false, fill, 0);
1181 box->m_box.show_all();
1182
1183 pushBox(kBoxMode, GTK_WIDGET(vbox->m_box.gobj()));
1184 } else {
1185 pushBox(kBoxMode, addWidget(label,GTK_WIDGET(box->m_box.gobj())));
1186 }
1187 }
1188
1189 void GxMainInterface::openSpaceBox(const char* label)
1190 {
1191 GxVBox * box = new GxVBox(*this);
1192 box->m_box.set_homogeneous(true);
1193 box->m_box.set_spacing(2);
1194 box->m_box.set_border_width(4);
1195 box->m_box.show_all();
1196 if (fMode[fTop] != kTabMode && label[0] != 0) {
1197 gtk_box_pack_start (GTK_BOX(fBox[fTop]), GTK_WIDGET(box->m_box.gobj()), expand, fill, 0);
1198 pushBox(kBoxMode, GTK_WIDGET(box->m_box.gobj()));
1199 } else {
1200 pushBox(kBoxMode, addWidget(label, GTK_WIDGET (box->m_box.gobj())));
1201 }
1202 }
1203
1204 void GxMainInterface::openPaintBox(const char* label, const char* name)
1205 {
1206 GxPaintBox * box = new GxPaintBox(*this,pb_rectangle_skin_color_expose);
1207 box->m_box.set_border_width(4);
1208 if (name) {
1209 box->m_paintbox.set_name(name);
1210 }
1211 gtk_box_pack_start (GTK_BOX(fBox[fTop]), GTK_WIDGET (box->m_paintbox.gobj()), false, fill, 0);
1212 box->m_paintbox.show_all();
1213 pushBox(kBoxMode, GTK_WIDGET(box->m_box.gobj()));
1214 }
1215
1216 void GxMainInterface::openpaintampBox(const char* label)
1217 {
1218 GxPaintBox * box = new GxPaintBox(*this,pb_RackBox_expose);
1219 box->m_box.set_border_width(4);
1220 box->m_paintbox.set_name(label);
1221 box->m_paintbox.set_tooltip_text(_(label));
1222 gtk_box_pack_start (GTK_BOX(fBox[fTop]), GTK_WIDGET (box->m_paintbox.gobj()), expand, fill, 0);
1223 box->m_paintbox.show_all();
1224 pushBox(kBoxMode, GTK_WIDGET(box->m_box.gobj()));
1225 }
1226
1227 void GxMainInterface::openPaintBox1(const char* label)
1228 {
1229 GxVBox * box = new GxVBox(*this);
1230 box->m_box.set_homogeneous(false);
1231 box->m_box.set_spacing(0);
1232 box->m_box.set_border_width(0);
1233 box->m_box.show_all();
1234 gtk_box_pack_start (GTK_BOX(fBox[fTop]), GTK_WIDGET(box->m_box.gobj()), expand, fill, 0);
1235 pushBox(kBoxMode, GTK_WIDGET(box->m_box.gobj()));
1236 }
1237
1238 void GxMainInterface::openPaintBox2(const char* label)
1239 {
1240 GxEventBox * box = new GxEventBox(*this);
1241 box->m_eventbox.set_name(label);
1242 box->m_box.set_homogeneous(false);
1243 box->m_box.set_spacing(0);
1244 box->m_box.set_border_width(0);
1245 gtk_box_pack_start (GTK_BOX(fBox[fTop]), GTK_WIDGET(box->m_hbox.gobj()), false, false, 0);
1246 box->m_hbox.show_all();
1247 pushBox(kBoxMode, GTK_WIDGET(box->m_box.gobj()));
1248 }
1249
1250 void GxMainInterface::openVerticalBox1(const char* label)
1251 {
1252 GxVBox * box = new GxVBox(*this);
1253 box->m_box.set_homogeneous(false);
1254 box->m_box.set_spacing(0);
1255 box->m_box.set_border_width(0);
1256
1257 if (fMode[fTop] != kTabMode && label[0] != 0) {
1258 box->m_label.set_text(label);
1259 box->m_label.set_name ("effekt_label");
1260 box->m_box.pack_start(box->m_label,false, false, 0 );
1261 gtk_box_pack_start (GTK_BOX(fBox[fTop]), GTK_WIDGET(box->m_box.gobj()), expand, fill, 0);
1262 box->m_box.show();
1263 box->m_label.show();
1264 pushBox(kBoxMode, GTK_WIDGET(box->m_box.gobj()));
1265 } else {
1266 pushBox(kBoxMode, addWidget(label,GTK_WIDGET(box->m_box.gobj())));
1267 }
1268 }
1269
1270 void GxMainInterface::openTabBox(const char* label)
1271 {
1272 GxNotebookBox * box = new GxNotebookBox(*this);
1273 pushBox(kTabMode, addWidget(label, GTK_WIDGET(box->m_box.gobj())));
1274 }
1275
1276 void GxMainInterface::openVerticalMidiBox(const char* label)
1277 {
1278 GxMidiBox * box = new GxMidiBox(*this,pb_eq_expose);
1279 midibox = GTK_WIDGET(box->m_eventbox.gobj());
1280 //gtk_container_add (GTK_CONTAINER(rBox), midibox);
1281 gtk_box_pack_end (GTK_BOX(rBox),GTK_WIDGET(midibox) , false, false, 0);
1282 gtk_widget_show(midibox);
1283 pushBox(kBoxMode,GTK_WIDGET( box->m_box.gobj()));
1284 gtk_widget_hide(midibox);
1285
1286 GList* child_list = gtk_container_get_children(GTK_CONTAINER(rack_tool_bar));
1287 GtkWidget *box1 = (GtkWidget *) g_list_nth_data(child_list,0);
1288 child_list = gtk_container_get_children(GTK_CONTAINER(box1));
1289 box1 = (GtkWidget *) g_list_nth_data(child_list,0);
1290 child_list = gtk_container_get_children(GTK_CONTAINER(box1));
1291 box1 = (GtkWidget *) g_list_nth_data(child_list,0);
1292 child_list = gtk_container_get_children(GTK_CONTAINER(box1));
1293 box1 = (GtkWidget *) g_list_nth_data(child_list,0);
1294 child_list = gtk_container_get_children(GTK_CONTAINER(box1));
1295 box1 = (GtkWidget *) g_list_nth_data(child_list,0);
1296 child_list = gtk_container_get_children(GTK_CONTAINER(box1));
1297 box1 = (GtkWidget *) g_list_nth_data(child_list,0);
1298 g_list_free(child_list);
1299 box->m_tcb.set_parameter(fShowMidiOut.get_parameter());
1300 box->m_tcb.m_label.set_text(_("MIDI out"));
1301 gtk_container_add (GTK_CONTAINER(box1), GTK_WIDGET(box->m_bbox.gobj()));
1302
1303
1304 }
1305
1306 void GxMainInterface::openHorizontalhideBox(const char* label)
1307 {
1308 GxHBox * box = new GxHBox(*this);
1309 box->m_box.set_homogeneous(false);
1310 box->m_box.set_spacing(0);
1311 box->m_box.set_border_width(0);
1312 gtk_box_pack_start (GTK_BOX(fBox[fTop]),GTK_WIDGET(box->m_box.gobj()) , false, false, 0);
1313 pushBox(kBoxMode, GTK_WIDGET(box->m_box.gobj()));
1314 box->m_box.hide();
1315 if (label[0] != 0) box->m_box.show();
1316 }
1317
1318 void GxMainInterface::openHorizontalhideBox1(const char* label)
1319 {
1320 GxHBox * box = new GxHBox(*this);
1321 box->m_box.set_homogeneous(false);
1322 box->m_box.set_spacing(0);
1323 box->m_box.set_border_width(0);
1324 gtk_box_pack_end (GTK_BOX(sBox),GTK_WIDGET(box->m_box.gobj()) , false, false, 0);
1325 pushBox(kBoxMode, GTK_WIDGET(box->m_box.gobj()));
1326 box->m_box.hide();
1327 if (label[0] != 0) box->m_box.show();
1328 }
1329
1330 GtkWidget* GxMainInterface::addWidget(const char* label, GtkWidget* w)
1331 {
1332 switch (fMode[fTop])
1333 {
1334 case kSingleMode :
1335 gtk_container_add (GTK_CONTAINER(fBox[fTop]), w);
1336 break;
1337 case kBoxMode :
1338 gtk_box_pack_start (GTK_BOX(fBox[fTop]), w, expand, fill, 0);
1339 break;
1340 case kTabMode :
1341 gtk_notebook_append_page (GTK_NOTEBOOK(fBox[fTop]), w, gtk_label_new(label));
1342 break;
1343 }
1344 gtk_widget_show (w);
1345 return w;
695 // ----- boxes to move inside a other box (mono effects)
696 void GxMainInterface::openHorizontalOrderBox(const char* label, float* posit) {
697 GxMoveBox * box = new GxMoveBox(*this);
698 uiOrderButton* c = new uiOrderButton(this, posit, GTK_BUTTON(box->m_button.gobj()));
699
700 g_signal_connect(GTK_OBJECT(box->m_button.gobj()), "pressed",
701 G_CALLBACK(uiOrderButton::pressed_right), (gpointer) c);
702 g_signal_connect(GTK_OBJECT(box->m_button1.gobj()), "pressed",
703 G_CALLBACK(uiOrderButton::pressed_left), (gpointer) c);
704 g_signal_connect(GTK_OBJECT(box->m_button.gobj()), "clicked",
705 G_CALLBACK(uiOrderButton::clicked), (gpointer) c);
706 g_signal_connect(GTK_OBJECT(box->m_button1.gobj()), "clicked",
707 G_CALLBACK(uiOrderButton::clicked), (gpointer) c);
708 gtk_box_pack_start(GTK_BOX(rBox), GTK_WIDGET(box->m_paintbox.gobj()), expand, false, 0);
709 GValue pos = {0};
710 float z = *posit;
711 gint poset = static_cast<int>(z);
712 // fprintf(stderr, " %i .monobox\n",poset);
713 g_value_init(&pos, G_TYPE_INT);
714 g_value_set_int(&pos, poset);
715 string tooltip = _("Move ");
716 tooltip += label;
717 tooltip += _(" up");
718 box->m_button1.set_tooltip_text(tooltip);
719 box->m_button1.get_accessible()->set_description(tooltip);
720 box->m_button1.get_accessible()->set_name(label);
721 tooltip = _("Move ");
722 tooltip += label;
723 tooltip += _(" down");
724 box->m_button.set_tooltip_text(tooltip);
725 box->m_button.get_accessible()->set_description(tooltip);
726 box->m_button.get_accessible()->set_name(label);
727 gtk_container_child_set_property(GTK_CONTAINER(rBox),
728 GTK_WIDGET(box->m_paintbox.gobj()), "position", &pos);
729 pushBox(kBoxMode, GTK_WIDGET(box->m_paintbox.gobj()));
730 }
731
732 // ----- boxes to move inside a other box (stereo effects)
733 void GxMainInterface::openHorizontalRestetBox(const char* label, float* posit) {
734 GxMoveBox * box = new GxMoveBox(*this);
735 uiOrderButton* c = new uiOrderButton(this, posit, GTK_BUTTON(box->m_button.gobj()));
736
737 g_signal_connect(GTK_OBJECT(box->m_button.gobj()), "pressed",
738 G_CALLBACK(uiOrderButton::pressed_right), (gpointer) c);
739 g_signal_connect(GTK_OBJECT(box->m_button1.gobj()), "pressed",
740 G_CALLBACK(uiOrderButton::pressed_left), (gpointer) c);
741 g_signal_connect(GTK_OBJECT(box->m_button.gobj()), "clicked",
742 G_CALLBACK(uiOrderButton::clicked), (gpointer) c);
743 g_signal_connect(GTK_OBJECT(box->m_button1.gobj()), "clicked",
744 G_CALLBACK(uiOrderButton::clicked), (gpointer) c);
745 gtk_box_pack_start(GTK_BOX(sBox), GTK_WIDGET(box->m_paintbox.gobj()), expand, false, 0);
746 GValue pos = {0};
747 float z = *posit;
748 gint poset = static_cast<int>(z);
749 // fprintf(stderr, " %i .stereobox\n",poset);
750 g_value_init(&pos, G_TYPE_INT);
751 g_value_set_int(&pos, poset);
752 string tooltip = _("Move ");
753 tooltip += label;
754 tooltip += _(" up");
755 box->m_button1.set_tooltip_text(tooltip);
756 box->m_button1.get_accessible()->set_description(tooltip);
757 box->m_button1.get_accessible()->set_name(label);
758 tooltip = _("Move ");
759 tooltip += label;
760 tooltip += _(" down");
761 box->m_button.set_tooltip_text(tooltip);
762 box->m_button.get_accessible()->set_description(tooltip);
763 box->m_button.get_accessible()->set_name(label);
764 gtk_container_child_set_property(GTK_CONTAINER(sBox),
765 GTK_WIDGET(box->m_paintbox.gobj()), "position", &pos);
766 pushBox(kBoxMode, GTK_WIDGET(box->m_paintbox.gobj()));
767 }
768
769 // -------- different gtk(x)mm container (virtuell discription)
770 void GxMainInterface::openEventBox(const char* label) {
771 GxEventBox * box = new GxEventBox(*this);
772 gtk_box_pack_start(GTK_BOX(fBox[fTop]), GTK_WIDGET(box->m_hbox.gobj()), false, fill, 0);
773 box->m_box.set_size_request(600, 182); // main window size
774 box->m_box.set_border_width(2);
775 box->m_eventbox.set_name("main_window");
776 pushBox(kBoxMode, GTK_WIDGET(box->m_box.gobj()));
777 box->m_hbox.show_all();
778 }
779
780 void GxMainInterface::openMainBox(const char* label, const char* expose_funk) {
781 GxMainBox * box = new GxMainBox(*this, expose_funk);
782 gtk_box_pack_start(GTK_BOX(fBox[fTop]), GTK_WIDGET(box->m_hbox.gobj()), false, fill, 0);
783 box->m_box.set_border_width(2);
784 // box->m_eventbox.set_name("main_window");
785 pushBox(kBoxMode, GTK_WIDGET(box->m_box.gobj()));
786 box->m_hbox.show_all();
787 }
788
789 void GxMainInterface::openFrameBox(const char* label) {
790 GxHBox * box = new GxHBox(*this);
791 box->m_box.set_homogeneous(false);
792 box->m_box.set_spacing(2);
793 box->m_box.set_border_width(2);
794
795 if (fMode[fTop] != kTabMode && label[0] != 0) {
796 box->m_frame.set_label(label);
797 box->m_frame.set_shadow_type(Gtk::SHADOW_NONE);
798 box->m_frame.add(box->m_box);
799 gtk_box_pack_start(GTK_BOX(fBox[fTop]), GTK_WIDGET(box->m_frame.gobj()), false, fill, 0);
800 box->m_box.show();
801 box->m_frame.show();
802 pushBox(kBoxMode, GTK_WIDGET(box->m_box.gobj()));
803 } else {
804 pushBox(kBoxMode, addWidget(label, GTK_WIDGET(box->m_box.gobj())));
805 }
806 }
807
808 void GxMainInterface::openHorizontalBox(const char* label) {
809 GxHBox * box = new GxHBox(*this);
810 box->m_box.set_homogeneous(false);
811 box->m_box.set_spacing(0);
812 box->m_box.set_border_width(0);
813
814 if (fMode[fTop] != kTabMode && label[0] != 0) {
815 box->m_frame.set_label(label);
816 box->m_frame.set_shadow_type(Gtk::SHADOW_NONE);
817 box->m_frame.add(box->m_box);
818 gtk_box_pack_start(GTK_BOX(fBox[fTop]), GTK_WIDGET(box->m_frame.gobj()), false, fill, 0);
819 box->m_box.show();
820 box->m_frame.show();
821 pushBox(kBoxMode, GTK_WIDGET(box->m_box.gobj()));
822 } else {
823 pushBox(kBoxMode, addWidget(label, GTK_WIDGET(box->m_box.gobj())));
824 }
825 }
826
827 void GxMainInterface::openHorizontalTableBox(const char* label) {
828 GxHBox * box = new GxHBox(*this);
829 box->m_box.set_homogeneous(false);
830 box->m_box.set_spacing(0);
831 box->m_box.set_border_width(0);
832
833 if (fMode[fTop] != kTabMode && label[0] != 0) {
834 box->m_frame.set_label(label);
835 box->m_frame.set_shadow_type(Gtk::SHADOW_NONE);
836 box->m_frame.add(box->m_box);
837 gtk_box_pack_start(GTK_BOX(fBox[fTop]), GTK_WIDGET(box->m_frame.gobj()), false, fill, 0);
838 box->m_box.show();
839 box->m_frame.show();
840 pushBox(kBoxMode, GTK_WIDGET(box->m_box.gobj()));
841 } else {
842 pushBox(kBoxMode, addWidget(label, GTK_WIDGET(box->m_box.gobj())));
843 }
844 }
845
846 void GxMainInterface::openVerticalBox(const char* label) {
847 GxVBox * box = new GxVBox(*this);
848 box->m_box.set_homogeneous(false);
849 box->m_box.set_spacing(0);
850 box->m_box.set_border_width(0);
851
852 if (fMode[fTop] != kTabMode && label[0] != 0) {
853 box->m_label.set_text(label);
854 box->m_label.set_name("rack_effect_label");
855 GtkStyle *style = gtk_widget_get_style(GTK_WIDGET(box->m_label.gobj()));
856 pango_font_description_set_size(style->font_desc, 8*PANGO_SCALE);
857 pango_font_description_set_weight(style->font_desc, PANGO_WEIGHT_BOLD);
858 gtk_widget_modify_font(GTK_WIDGET(box->m_label.gobj()), style->font_desc);
859 box->m_box.pack_start(box->m_label, false, false, 0 );
860 gtk_box_pack_start(GTK_BOX(fBox[fTop]), GTK_WIDGET(box->m_box.gobj()), false, fill, 0);
861 box->m_box.show();
862 box->m_label.show();
863 pushBox(kBoxMode, GTK_WIDGET(box->m_box.gobj()));
864 } else {
865 pushBox(kBoxMode, addWidget(label, GTK_WIDGET(box->m_box.gobj())));
866 }
867 }
868
869 void GxMainInterface::openFlipLabelBox(const char* label) {
870 GxVBox * box = new GxVBox(*this);
871 box->m_box.set_homogeneous(false);
872 box->m_box.set_spacing(0);
873 box->m_box.set_border_width(0);
874
875 if (fMode[fTop] != kTabMode && label[0] != 0) {
876 GxVBox * vbox = new GxVBox(*this);
877 vbox->m_box.set_homogeneous(false);
878 vbox->m_box.set_spacing(0);
879 vbox->m_box.set_border_width(0);
880
881 GxHBox * hbox = new GxHBox(*this);
882 hbox->m_box.set_homogeneous(false);
883 hbox->m_box.set_spacing(0);
884 hbox->m_box.set_border_width(0);
885
886 hbox->m_label.set_text(label);
887 hbox->m_label.set_name("beffekt_label");
888 hbox->m_label.set_angle(90);
889 hbox->m_label.set_size_request(15, -1);
890
891 Pango::FontDescription font = hbox->m_label.get_style()->get_font();
892 font.set_size(8*Pango::SCALE);
893 font.set_weight(Pango::WEIGHT_BOLD);
894 hbox->m_label.modify_font(font);
895
896 hbox->m_box.add(hbox->m_label);
897 hbox->m_box.add(vbox->m_box);
898 box->m_box.add(hbox->m_box);
899 gtk_box_pack_start(GTK_BOX(fBox[fTop]), GTK_WIDGET(box->m_box.gobj()), false, fill, 0);
900 box->m_box.show_all();
901
902 pushBox(kBoxMode, GTK_WIDGET(vbox->m_box.gobj()));
903 } else {
904 pushBox(kBoxMode, addWidget(label, GTK_WIDGET(box->m_box.gobj())));
905 }
906 }
907
908 void GxMainInterface::openSpaceBox(const char* label) {
909 GxVBox * box = new GxVBox(*this);
910 box->m_box.set_homogeneous(true);
911 box->m_box.set_spacing(2);
912 box->m_box.set_border_width(4);
913 box->m_box.show_all();
914 if (fMode[fTop] != kTabMode && label[0] != 0) {
915 gtk_box_pack_start(GTK_BOX(fBox[fTop]), GTK_WIDGET(box->m_box.gobj()), expand, fill, 0);
916 pushBox(kBoxMode, GTK_WIDGET(box->m_box.gobj()));
917 } else {
918 pushBox(kBoxMode, addWidget(label, GTK_WIDGET(box->m_box.gobj())));
919 }
920 }
921
922 void GxMainInterface::openPaintBox(const char* label, const char* name) {
923 GxPaintBox * box = new GxPaintBox(*this, pb_rectangle_skin_color_expose);
924 box->m_box.set_border_width(4);
925 if (name) {
926 box->m_paintbox.set_name(name);
927 }
928 gtk_box_pack_start(GTK_BOX(fBox[fTop]), GTK_WIDGET(box->m_paintbox.gobj()), false, fill, 0);
929 box->m_paintbox.show_all();
930 pushBox(kBoxMode, GTK_WIDGET(box->m_box.gobj()));
931 }
932
933 void GxMainInterface::openpaintampBox(const char* label) {
934 GxPaintBox * box = new GxPaintBox(*this, pb_RackBox_expose);
935 box->m_box.set_border_width(4);
936 box->m_paintbox.set_name(label);
937 box->m_paintbox.set_tooltip_text(_(label));
938 gtk_box_pack_start(GTK_BOX(fBox[fTop]), GTK_WIDGET(box->m_paintbox.gobj()), expand, fill, 0);
939 box->m_paintbox.show_all();
940 pushBox(kBoxMode, GTK_WIDGET(box->m_box.gobj()));
941 }
942
943 void GxMainInterface::openPaintBox1(const char* label) {
944 GxVBox * box = new GxVBox(*this);
945 box->m_box.set_homogeneous(false);
946 box->m_box.set_spacing(0);
947 box->m_box.set_border_width(0);
948 box->m_box.show_all();
949 gtk_box_pack_start(GTK_BOX(fBox[fTop]), GTK_WIDGET(box->m_box.gobj()), expand, fill, 0);
950 pushBox(kBoxMode, GTK_WIDGET(box->m_box.gobj()));
951 }
952
953 void GxMainInterface::openPaintBox2(const char* label) {
954 GxEventBox * box = new GxEventBox(*this);
955 box->m_eventbox.set_name(label);
956 box->m_box.set_homogeneous(false);
957 box->m_box.set_spacing(0);
958 box->m_box.set_border_width(0);
959 gtk_box_pack_start(GTK_BOX(fBox[fTop]), GTK_WIDGET(box->m_hbox.gobj()), false, false, 0);
960 box->m_hbox.show_all();
961 pushBox(kBoxMode, GTK_WIDGET(box->m_box.gobj()));
962 }
963
964 void GxMainInterface::openVerticalBox1(const char* label) {
965 GxVBox * box = new GxVBox(*this);
966 box->m_box.set_homogeneous(false);
967 box->m_box.set_spacing(0);
968 box->m_box.set_border_width(0);
969
970 if (fMode[fTop] != kTabMode && label[0] != 0) {
971 box->m_label.set_text(label);
972 box->m_label.set_name("effekt_label");
973 box->m_box.pack_start(box->m_label, false, false, 0 );
974 gtk_box_pack_start(GTK_BOX(fBox[fTop]), GTK_WIDGET(box->m_box.gobj()), expand, fill, 0);
975 box->m_box.show();
976 box->m_label.show();
977 pushBox(kBoxMode, GTK_WIDGET(box->m_box.gobj()));
978 } else {
979 pushBox(kBoxMode, addWidget(label, GTK_WIDGET(box->m_box.gobj())));
980 }
981 }
982
983 void GxMainInterface::openTabBox(const char* label) {
984 GxNotebookBox * box = new GxNotebookBox(*this);
985 pushBox(kTabMode, addWidget(label, GTK_WIDGET(box->m_box.gobj())));
986 }
987
988 void GxMainInterface::openVerticalMidiBox(const char* label) {
989 GxMidiBox * box = new GxMidiBox(*this, pb_eq_expose);
990 gw.midibox = GTK_WIDGET(box->m_eventbox.gobj());
991 // gtk_container_add (GTK_CONTAINER(rBox), gw.midibox);
992 gtk_box_pack_end(GTK_BOX(rBox), GTK_WIDGET(gw.midibox) , false, false, 0);
993 gtk_widget_show(gw.midibox);
994 pushBox(kBoxMode, GTK_WIDGET(box->m_box.gobj()));
995 gtk_widget_hide(gw.midibox);
996
997 GList* child_list = gtk_container_get_children(GTK_CONTAINER(gw.rack_tool_bar));
998 GtkWidget *box1 = reinterpret_cast<GtkWidget *>(g_list_nth_data(child_list, 0));
999 child_list = gtk_container_get_children(GTK_CONTAINER(box1));
1000 box1 = reinterpret_cast<GtkWidget *>(g_list_nth_data(child_list, 0));
1001 child_list = gtk_container_get_children(GTK_CONTAINER(box1));
1002 box1 = reinterpret_cast<GtkWidget *>(g_list_nth_data(child_list, 0));
1003 child_list = gtk_container_get_children(GTK_CONTAINER(box1));
1004 box1 = reinterpret_cast<GtkWidget *>(g_list_nth_data(child_list, 0));
1005 child_list = gtk_container_get_children(GTK_CONTAINER(box1));
1006 box1 = reinterpret_cast<GtkWidget *>(g_list_nth_data(child_list, 0));
1007 child_list = gtk_container_get_children(GTK_CONTAINER(box1));
1008 box1 = reinterpret_cast<GtkWidget *>(g_list_nth_data(child_list, 0));
1009 g_list_free(child_list);
1010 box->m_tcb.set_parameter(fShowMidiOut.get_parameter());
1011 box->m_tcb.m_label.set_text(_("MIDI out"));
1012 gtk_container_add(GTK_CONTAINER(box1), GTK_WIDGET(box->m_bbox.gobj()));
1013 }
1014
1015 void GxMainInterface::openHorizontalhideBox(const char* label) {
1016 GxHBox * box = new GxHBox(*this);
1017 box->m_box.set_homogeneous(false);
1018 box->m_box.set_spacing(0);
1019 box->m_box.set_border_width(0);
1020 gtk_box_pack_start(GTK_BOX(fBox[fTop]), GTK_WIDGET(box->m_box.gobj()) , false, false, 0);
1021 pushBox(kBoxMode, GTK_WIDGET(box->m_box.gobj()));
1022 box->m_box.hide();
1023 if (label[0] != 0) box->m_box.show();
1024 }
1025
1026 void GxMainInterface::openHorizontalhideBox1(const char* label) {
1027 GxHBox * box = new GxHBox(*this);
1028 box->m_box.set_homogeneous(false);
1029 box->m_box.set_spacing(0);
1030 box->m_box.set_border_width(0);
1031 gtk_box_pack_end(GTK_BOX(sBox), GTK_WIDGET(box->m_box.gobj()) , false, false, 0);
1032 pushBox(kBoxMode, GTK_WIDGET(box->m_box.gobj()));
1033 box->m_box.hide();
1034 if (label[0] != 0) box->m_box.show();
1035 }
1036
1037 /* add mono effect to the mono rack, increase mono effect counter*/
1038 void GxMainInterface::openDialogBox(const char *id_dialog, const char *id_switch,
1039 const char *expose_funk ) {
1040 Parameter& param_dialog = parameter_map[id_dialog];
1041 Parameter& param_switch = parameter_map[id_switch];
1042 GxDialogButtonBox *bbox = new GxDialogButtonBox(*this, param_dialog);
1043 GList* child_list = gtk_container_get_children(GTK_CONTAINER(rBox));
1044 GtkWidget *child = reinterpret_cast<GtkWidget *>(g_list_nth_data(child_list, mono_plugs));
1045 mono_plugs++;
1046 g_list_free(child_list);
1047 gx_engine::set_mono_plug_counter(mono_plugs);
1048 gtk_box_pack_end(GTK_BOX(child), GTK_WIDGET(bbox->box.gobj()), false, false, 0);
1049 GxDialogWindowBox *dialog = new GxDialogWindowBox(*this, expose_funk, param_dialog,
1050 param_switch, bbox->show_dialog, gw.rack_widget);
1051 gtk_box_pack_start(GTK_BOX(child), GTK_WIDGET(dialog->paintbox.gobj()) , true, fill, 0);
1052 pushBox(kBoxMode, GTK_WIDGET(dialog->box.gobj()));
1053
1054 const gchar * title = gtk_widget_get_name(GTK_WIDGET(dialog->paintbox.gobj()));
1055 string p = "ui.";
1056 p +=title;
1057 set_label(dialog->menuitem, _(title));
1058 guint accel_key = GDK_a + mono_plugs;
1059 dialog->menuitem.add_accelerator("activate", Glib::wrap(fAccelGroup, true),
1060 accel_key, Gdk::LOCK_MASK, Gtk::ACCEL_VISIBLE); // FIXME MOD1_MASK
1061 gtk_menu_shell_append(GTK_MENU_SHELL(fMenuList["PluginsMono"]),
1062 GTK_WIDGET(dialog->menuitem.gobj()));
1063 dialog->menuitem.show();
1064 dialog->menuitem.set_parameter(new SwitchParameter(p, true, false));
1065
1066 dialog->m_tcb.set_parameter(dialog->menuitem.get_parameter());
1067 gtk_box_pack_start(GTK_BOX(tBox), GTK_WIDGET(dialog->box1.gobj()) , false, false, 0);
1068 dialog->box1.pack_start(dialog->m_tcb, true, true);
1069 string tooltip = "Show ";
1070 tooltip +=title;
1071 dialog->m_tcb.set_tooltip_text(_(tooltip.c_str()));
1072 dialog->box1.show_all();
1073 if (strcmp(title, "Oscilloscope") == 0) {
1074 fShowWaveView.add_parameter(dialog->menuitem.get_parameter());
1075 fShowWaveView.signal_activate().connect(
1076 sigc::mem_fun(*this, &GxMainInterface::on_show_oscilloscope));
1077 }
1078 // gtk_box_pack_start (GTK_BOX(tBox),GTK_WIDGET(dialog->m_tcb.gobj()) , false, false, 0);
1079 }
1080
1081 /* add stereo effect to the stereo rack, increase stereo effect counter*/
1082 void GxMainInterface::opensDialogBox(const char *id_dialog, const char *id_switch,
1083 const char *expose_funk ) {
1084 Parameter& param_dialog = parameter_map[id_dialog];
1085 Parameter& param_switch = parameter_map[id_switch];
1086 GxDialogButtonBox *bbox = new GxDialogButtonBox(*this, param_dialog);
1087
1088 GList* child_list = gtk_container_get_children(GTK_CONTAINER(sBox));
1089 GtkWidget *child = reinterpret_cast<GtkWidget *>(g_list_nth_data(child_list, stereo_plugs));
1090 stereo_plugs++;
1091 g_list_free(child_list);
1092 gx_engine::set_stereo_plug_counter(stereo_plugs);
1093 gtk_box_pack_end(GTK_BOX(child), GTK_WIDGET(bbox->box.gobj()), false, false, 0);
1094 GxDialogWindowBox *bdialog = new GxDialogWindowBox(*this, expose_funk, param_dialog,
1095 param_switch, bbox->show_dialog, gw.srack_widget);
1096 gtk_box_pack_start(GTK_BOX(child), GTK_WIDGET(bdialog->paintbox.gobj()) , true, fill, 0);
1097 pushBox(kBoxMode, GTK_WIDGET(bdialog->box.gobj()));
1098
1099 const gchar * title = gtk_widget_get_name(GTK_WIDGET(bdialog->paintbox.gobj()));
1100 set_label(bdialog->menuitem, _(title));
1101 string p = "ui.";
1102 p +=title;
1103 string s;
1104
1105 guint accel_key = GDK_r + stereo_plugs;
1106 bdialog->menuitem.add_accelerator("activate", Glib::wrap(fAccelGroup, true),
1107 accel_key, Gdk::LOCK_MASK, Gtk::ACCEL_VISIBLE); // FIXME
1108 gtk_menu_shell_append(GTK_MENU_SHELL(fMenuList["PluginsStereo"]),
1109 GTK_WIDGET(bdialog->menuitem.gobj()));
1110 bdialog->menuitem.show();
1111 bdialog->menuitem.set_parameter(new SwitchParameter(p, true, false));
1112
1113 bdialog->m_tcb.set_parameter(bdialog->menuitem.get_parameter());
1114 gtk_box_pack_start(GTK_BOX(tBox), GTK_WIDGET(bdialog->box1.gobj()) , false, false, 0);
1115 bdialog->box1.pack_start(bdialog->m_tcb, true, true);
1116 string tooltip = "Show ";
1117 tooltip +=title;
1118 bdialog->m_tcb.set_tooltip_text(_(tooltip.c_str()));
1119 bdialog->box1.show_all();
1120 // gtk_box_pack_start (GTK_BOX(tBox),GTK_WIDGET(bdialog->m_tcb.gobj()) , false, false, 0);
1121 }
1122
1123 /* button box for the (show)effect buttons*/
1124 void GxMainInterface::openToolBar(const char* label) {
1125 GxToolBox *box = new GxToolBox(*this,
1126 pb_gxrack_expose, _("Plugin Bar"), GTK_WIDGET(fShowToolBar.gobj()));
1127
1128 // box->window.set_size_request(-1,524);
1129 gw.rack_tool_bar = GTK_WIDGET(box->window.gobj());
1130 tBox = GTK_WIDGET(box->rbox.gobj());
1131 box->rbox.add(box->box1);
1132 box->m_tmono_rack.set_parameter(fShowRack.get_parameter());
1133 box->m_tstereo_rack.set_parameter(fShowSRack.get_parameter());
1134 box->m_tmono_rack.m_label.set_text(_("mono rack"));
1135 box->m_tstereo_rack.m_label.set_text(_("stereo rack"));
1136
1137 box->box1.pack_start(box->m_tmono_rack, true, true);
1138 box->box1.pack_end(box->m_tstereo_rack, true, true);
1139 box->m_tmono_rack.set_tooltip_text(_("Show mono rack"));
1140 box->m_tstereo_rack.set_tooltip_text(_("Show stereo rack"));
1141 box->box1.show_all();
1142 gtk_box_pack_start(GTK_BOX(fBox[fTop]), GTK_WIDGET(box->window.gobj()), expand, fill, 0);
1143 pushBox(kBoxMode, GTK_WIDGET(tBox));
1144 }
1145
1146 /* the mono rack*/
1147 void GxMainInterface::openPlugBox(const char* label) {
1148 GxWindowBox *plugbox = new GxWindowBox(*this,
1149 label, GTK_WIDGET(fShowRack.gobj()));
1150 gw.rack_widget = GTK_WIDGET(plugbox->window.gobj());
1151 plugbox->box.pack_start(plugbox->rbox, true, true, 0);
1152 plugbox->window.set_name("MonoRack");
1153 plugbox->window.set_tooltip_text(_("Mono Rack, right click pop up the plugin menu"));
1154 rBox = GTK_WIDGET(plugbox->rbox.gobj());
1155 gtk_box_pack_start(GTK_BOX(fBox[fTop]), GTK_WIDGET(plugbox->window.gobj()), false, true, 0);
1156 pushBox(kBoxMode, GTK_WIDGET(rBox));
1157 }
1158
1159 /* the main rack widget for all racks*/
1160 void GxMainInterface::openScrollBox(const char* label) {
1161 GxScrollBox *scrollbox = new GxScrollBox(*this,
1162 pb_gxrack_expose, label, GTK_WIDGET(fShowRack.gobj()));
1163 scrollbox->box.pack_start(scrollbox->rbox, true, true, 0);
1164 // scrollbox->box.pack_start(scrollbox->vbox, false, false, 0);
1165 scrollbox->vbox.pack_start(scrollbox->box1, false, false, 0);
1166
1167 RBox = GTK_WIDGET(scrollbox->window.gobj());
1168 scrollbox->window.set_name("Rack");
1169 scrollbox->window.set_size_request(-1, 460);
1170 scrollbox->rbox.show();
1171 scrollbox->box1.show();
1172 scrollbox->vbox.show();
1173 gtk_box_pack_start(GTK_BOX(fBox[fTop]), GTK_WIDGET(scrollbox->window.gobj()), expand, true, 0);
1174 pushBox(kBoxMode, GTK_WIDGET(scrollbox->rbox.gobj()));
1175 }
1176
1177 /* the stereo rack*/
1178 void GxMainInterface::openAmpBox(const char* label) {
1179 GxWindowBox *box = new GxWindowBox(*this,
1180 label, GTK_WIDGET(fShowSRack.gobj()));
1181 box->box.pack_start(box->rbox, true, true, 0);
1182 gw.srack_widget = GTK_WIDGET(box->window.gobj());
1183 box->window.set_name("StereoRack");
1184 box->window.set_tooltip_text(_("Stereo Rack, right click pop up the plugin menu"));
1185 sBox = GTK_WIDGET(box->rbox.gobj());
1186 gtk_box_pack_start(GTK_BOX(fBox[fTop]), GTK_WIDGET(box->window.gobj()), false, true, 0);
1187 pushBox(kBoxMode, GTK_WIDGET(sBox));
13461188 }
13471189
13481190 // --------------------------- Press button ---------------------------
13491191
1350 struct uipButton : public gx_ui::GxUiItemFloat
1351 {
1352 GtkButton* fButton;
1353 uipButton(gx_ui::GxUI* ui, float* zone, GtkButton* b) : gx_ui::GxUiItemFloat(ui, zone), fButton(b) {}
1354 static void pressed( GtkWidget *widget, gpointer data )
1355 {
1356 gx_ui::GxUiItemFloat* c = (gx_ui::GxUiItemFloat*)data;
1357 c->modifyZone(1.0);
1358 guint32 tim = gtk_get_current_event_time ();
1359 gtk_menu_popup (GTK_MENU(presmenu[0]),NULL,NULL,NULL,(gpointer)presmenu[0] ,2,tim);
1360 }
1361
1362 static void released( GtkWidget *widget, gpointer data )
1363 {
1364 gx_ui::GxUiItemFloat* c = (gx_ui::GxUiItemFloat*) data;
1365 c->modifyZone(0.0);
1366 }
1367
1368 virtual void reflectZone()
1369 {
1370 float v = *fZone;
1371 fCache = v;
1372 if (v > 0.0) gtk_button_pressed(fButton);
1373 else gtk_button_released(fButton);
1374 }
1192 struct uipButton : public gx_ui::GxUiItemFloat {
1193 GtkButton* fButton;
1194 uipButton(gx_ui::GxUI* ui, float* zone, GtkButton* b)
1195 : gx_ui::GxUiItemFloat(ui, zone), fButton(b) {}
1196 static void pressed(GtkWidget *widget, gpointer data) {
1197 gx_ui::GxUiItemFloat* c = (gx_ui::GxUiItemFloat*)data;
1198 c->modifyZone(1.0);
1199 guint32 tim = gtk_get_current_event_time();
1200 gtk_menu_popup(GTK_MENU(gx_preset::presmenu[0]), NULL, NULL, NULL,
1201 (gpointer) gx_preset::presmenu[0] , 2, tim);
1202 }
1203
1204 static void released(GtkWidget *widget, gpointer data) {
1205 gx_ui::GxUiItemFloat* c = (gx_ui::GxUiItemFloat*) data;
1206 c->modifyZone(0.0);
1207 }
1208
1209 virtual void reflectZone() {
1210 float v = *fZone;
1211 fCache = v;
1212 if (v > 0.0) {
1213 gtk_button_pressed(fButton);
1214 } else {
1215 gtk_button_released(fButton);
1216 }
1217 }
13751218 };
13761219
1377 void GxMainInterface::addPToggleButton(const char* label, float* zone)
1378 {
1379 *zone = 0.0;
1380 GtkWidget* button = gtk_button_new ();
1381 GtkWidget* lab = gtk_label_new(label);
1382 GtkStyle *style = gtk_widget_get_style(lab);
1383 pango_font_description_set_size(style->font_desc, 8*PANGO_SCALE);
1384 pango_font_description_set_weight(style->font_desc, PANGO_WEIGHT_BOLD);
1385 gtk_widget_modify_font(lab, style->font_desc);
1386 gtk_container_add (GTK_CONTAINER(button), lab);
1387
1388 gtk_widget_set_name (lab,"beffekt_label");
1389
1390 addWidget(label,GTK_WIDGET(button));
1391 gtk_widget_show (lab);
1392 uipButton* c = new uipButton(this, zone, GTK_BUTTON(button));
1393 g_signal_connect (GTK_OBJECT (button), "clicked", G_CALLBACK (uipButton::pressed), (gpointer) c);
1394 }
1395
1396 struct uiButton : public gx_ui::GxUiItemFloat
1397 {
1398 GtkButton* fButton;
1399 uiButton(gx_ui::GxUI* ui, float* zone, GtkButton* b) : gx_ui::GxUiItemFloat(ui, zone), fButton(b) {}
1400 static void pressed( GtkWidget *widget, gpointer data )
1401 {
1402 gx_ui::GxUiItemFloat* c = (gx_ui::GxUiItemFloat*)data;
1403 c->modifyZone(1.0);
1404 }
1405
1406 static void released( GtkWidget *widget, gpointer data )
1407 {
1408 gx_ui::GxUiItemFloat* c = (gx_ui::GxUiItemFloat*) data;
1409 c->modifyZone(0.0);
1410 }
1411
1412 virtual void reflectZone()
1413 {
1414 float v = *fZone;
1415 fCache = v;
1416 if (v > 0.0) gtk_button_pressed(fButton);
1417 else gtk_button_released(fButton);
1418 }
1220 void GxMainInterface::addPToggleButton(const char* label, float* zone) {
1221 *zone = 0.0;
1222 GtkWidget* button = gtk_button_new();
1223 GtkWidget* lab = gtk_label_new(label);
1224 GtkStyle *style = gtk_widget_get_style(lab);
1225 pango_font_description_set_size(style->font_desc, 8*PANGO_SCALE);
1226 pango_font_description_set_weight(style->font_desc, PANGO_WEIGHT_BOLD);
1227 gtk_widget_modify_font(lab, style->font_desc);
1228 gtk_container_add(GTK_CONTAINER(button), lab);
1229
1230 gtk_widget_set_name(lab, "beffekt_label");
1231
1232 addWidget(label, GTK_WIDGET(button));
1233 gtk_widget_show(lab);
1234 uipButton* c = new uipButton(this, zone, GTK_BUTTON(button));
1235 g_signal_connect(GTK_OBJECT(button), "clicked", G_CALLBACK(uipButton::pressed),
1236 (gpointer) c);
1237 }
1238
1239 struct uiButton : public gx_ui::GxUiItemFloat {
1240 GtkButton* fButton;
1241 uiButton(gx_ui::GxUI* ui, float* zone, GtkButton* b) : gx_ui::GxUiItemFloat(ui, zone),
1242 fButton(b) {}
1243 static void pressed(GtkWidget *widget, gpointer data) {
1244 gx_ui::GxUiItemFloat* c = (gx_ui::GxUiItemFloat*)data;
1245 c->modifyZone(1.0);
1246 }
1247
1248 static void released(GtkWidget *widget, gpointer data) {
1249 gx_ui::GxUiItemFloat* c = (gx_ui::GxUiItemFloat*) data;
1250 c->modifyZone(0.0);
1251 }
1252
1253 virtual void reflectZone() {
1254 float v = *fZone;
1255 fCache = v;
1256 if (v > 0.0) {
1257 gtk_button_pressed(fButton);
1258 } else {
1259 gtk_button_released(fButton);
1260 }
1261 }
14191262 };
14201263
1421 void GxMainInterface::addJConvButton(const char* label, float* zone)
1422 {
1423 *zone = 0.0;
1424 GtkWidget* button = gtk_button_new ();
1425
1426 GtkWidget* lab = gtk_label_new(label);
1427 GtkStyle *style = gtk_widget_get_style(lab);
1428 pango_font_description_set_size(style->font_desc, 10*PANGO_SCALE);
1429 pango_font_description_set_weight(style->font_desc, PANGO_WEIGHT_NORMAL);
1430 gtk_widget_modify_font(lab, style->font_desc);
1431 gtk_container_add (GTK_CONTAINER(button), lab);
1432
1433 gtk_widget_set_name (lab,"beffekt_label");
1434 addWidget(label, button);
1435 gtk_widget_show (lab);
1436
1437 uiButton* c = new uiButton(this, zone, GTK_BUTTON(button));
1438 g_signal_connect (GTK_OBJECT (button), "clicked",
1439 G_CALLBACK (gx_jconv::gx_show_jconv_dialog_gui),
1440 (gpointer) c);
1441
1442 }
1443
1444 // --------------------------- Toggle Buttons ---------------------------
1445
1446 struct uiToggleButton : public gx_ui::GxUiItemFloat
1447 {
1448 GtkToggleButton* fButton;
1449 uiToggleButton(gx_ui::GxUI* ui, float* zone, GtkToggleButton* b) : gx_ui::GxUiItemFloat(ui, zone), fButton(b) {}
1450 static void toggled (GtkWidget *widget, gpointer data)
1451 {
1452 float v = (GTK_TOGGLE_BUTTON (widget)->active) ? 1.0 : 0.0;
1453 ((gx_ui::GxUiItemFloat*)data)->modifyZone(v);
1454 }
1455
1456 virtual void reflectZone()
1457 {
1458 float v = *fZone;
1459 fCache = v;
1460 gtk_toggle_button_set_active(fButton, v > 0.0);
1461 }
1264 void GxMainInterface::addJConvButton(const char* label, float* zone) {
1265 *zone = 0.0;
1266 GtkWidget* button = gtk_button_new();
1267
1268 GtkWidget* lab = gtk_label_new(label);
1269 GtkStyle *style = gtk_widget_get_style(lab);
1270 pango_font_description_set_size(style->font_desc, 10*PANGO_SCALE);
1271 pango_font_description_set_weight(style->font_desc, PANGO_WEIGHT_NORMAL);
1272 gtk_widget_modify_font(lab, style->font_desc);
1273 gtk_container_add(GTK_CONTAINER(button), lab);
1274
1275 gtk_widget_set_name(lab, "beffekt_label");
1276 addWidget(label, button);
1277 gtk_widget_show(lab);
1278
1279 uiButton* c = new uiButton(this, zone, GTK_BUTTON(button));
1280 g_signal_connect(GTK_OBJECT(button), "clicked",
1281 G_CALLBACK(gx_jconv::gx_show_jconv_dialog_gui),
1282 (gpointer) c);
1283 }
1284
1285 // --------------------------- Toggle Buttons ---------------------------
1286
1287 struct uiToggleButton : public gx_ui::GxUiItemFloat {
1288 GtkToggleButton* fButton;
1289 uiToggleButton(gx_ui::GxUI* ui, float* zone, GtkToggleButton* b)
1290 : gx_ui::GxUiItemFloat(ui, zone), fButton(b) {}
1291 static void toggled(GtkWidget *widget, gpointer data) {
1292 float v = (GTK_TOGGLE_BUTTON(widget)->active) ? 1.0 : 0.0;
1293 ((gx_ui::GxUiItemFloat*)data)->modifyZone(v);
1294 }
1295
1296 virtual void reflectZone() {
1297 float v = *fZone;
1298 fCache = v;
1299 gtk_toggle_button_set_active(fButton, v > 0.0);
1300 }
14621301 };
14631302
1464 void GxMainInterface::addToggleButton(const char* label, float* zone)
1465 {
1466 GdkColor colorRed;
1467 GdkColor colorOwn;
1468 gdk_color_parse ("#d56161", &colorRed);
1469 gdk_color_parse ("#7f7f7f", &colorOwn);
1470 GtkWidget* button = gtk_toggle_button_new();
1471 GtkWidget* lab = gtk_label_new(label);
1472 GtkStyle *style = gtk_widget_get_style(lab);
1473 pango_font_description_set_size(style->font_desc, 10*PANGO_SCALE);
1474 pango_font_description_set_weight(style->font_desc, PANGO_WEIGHT_NORMAL);
1475 gtk_widget_modify_font(lab, style->font_desc);
1476 gtk_container_add (GTK_CONTAINER(button), lab);
1477
1478 gtk_widget_set_name (lab,"beffekt_label");
1479 addWidget(label, button);
1480
1481 gtk_widget_modify_bg (button, GTK_STATE_NORMAL, &colorOwn);
1482 gtk_widget_modify_bg (button, GTK_STATE_ACTIVE, &colorRed);
1483
1484 g_signal_connect (GTK_OBJECT (button), "toggled", G_CALLBACK (JackCapture::start_stop), NULL);
1485 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE);
1486 gtk_widget_add_accelerator(button, "activate", fAccelGroup, GDK_r, GDK_NO_MOD_MASK, GTK_ACCEL_VISIBLE);
1487 gtk_widget_show (lab);
1488
1489 }
1490
1491
1492
1493 void GxMainInterface::addMToggleButton(const char* label, float* zone)
1494 {
1495 GdkColor colorRed;
1496 GdkColor colorOwn;
1497 GdkColor colorwn;
1498 gdk_color_parse ("#58b45e", &colorRed);
1499 gdk_color_parse ("#000000", &colorwn);
1500 gdk_color_parse ("#7f7f7f", &colorOwn);
1501 *zone = 0.0;
1502 GtkWidget* button = gtk_toggle_button_new();
1503 GtkWidget* lab = gtk_label_new(label);
1504 GtkStyle *style = gtk_widget_get_style(lab);
1505 pango_font_description_set_weight(style->font_desc, PANGO_WEIGHT_BOLD);
1506 gtk_widget_modify_font(lab, style->font_desc);
1507 gtk_container_add (GTK_CONTAINER(button), lab);
1508 gtk_widget_set_size_request (GTK_WIDGET(button), 70, 20);
1509 GtkWidget * box = gtk_hbox_new (homogene, 4);
1510 GtkWidget * box1 = gtk_vbox_new (homogene, 4);
1511 gtk_container_set_border_width (GTK_CONTAINER (box), 0);
1512 gtk_container_set_border_width (GTK_CONTAINER (box1), 0);
1513 gtk_container_add (GTK_CONTAINER(box), box1);
1514 GtkWidget * box2 = gtk_vbox_new (homogene, 4);
1515 gtk_container_set_border_width (GTK_CONTAINER (box2), 0);
1516 gtk_widget_set_size_request (GTK_WIDGET(box2), 6, 20);
1517 gtk_container_add (GTK_CONTAINER(box), button);
1518 gtk_container_add (GTK_CONTAINER(box), box2);
1519 gtk_widget_set_size_request (GTK_WIDGET(box1), 6, 20);
1520 gtk_widget_show (button);
1521 gtk_widget_show (box1);
1522 gtk_widget_show (box2);
1523 gtk_widget_show (lab);
1524 gtk_widget_show (box);
1525 gtk_container_add (GTK_CONTAINER(fBox[fTop]), box);
1526 uiToggleButton* c = new uiToggleButton(this, zone, GTK_TOGGLE_BUTTON(button));
1527 gtk_widget_modify_bg (button, GTK_STATE_NORMAL, &colorOwn);
1528 gtk_widget_modify_bg (button, GTK_STATE_ACTIVE, &colorRed);
1529 gtk_widget_set_name (lab,"rack_label");
1530 g_signal_connect (GTK_OBJECT (button), "toggled", G_CALLBACK (uiToggleButton::toggled), (gpointer) c);
1531 connect_midi_controller(button, zone);
1532 }
1533
1534
1535 static bool conv_start()
1536 {
1537 gx_jconv::GxJConvSettings* jcset = gx_jconv::GxJConvSettings::instance();
1538 string path = jcset->getFullIRPath();
1539 if (path.empty()) {
1540 gx_system::gx_print_warning(_("convolver"), _("no impulseresponse file"));
1541 return false;
1542 }
1543 while (!gx_engine::conv.checkstate());
1544 if (!gx_engine::conv.configure(
1545 gx_jack::jack_bs, gx_jack::jack_sr, path,
1546 jcset->getGain(), jcset->getGain(), jcset->getDelay(), jcset->getDelay(),
1547 jcset->getOffset(), jcset->getLength(), 0, 0, jcset->getGainline())) {
1548 return false;
1549 }
1550 return gx_engine::conv.start();
1551 }
1552
1553 void conv_restart()
1554 {
1555 gx_engine::conv.stop();
1556 conv_start();
1557 }
1558
1559 void gx_start_stop_jconv(GtkWidget *widget, gpointer data)
1560 {
1561 if (gx_jconv::GxJConvSettings::checkbutton7 == 0) {
1562 gx_engine::conv.stop();
1563 } else {
1564 gx_jconv::gx_save_jcgui();
1565 if (!conv_start()) {
1566 gx_jconv::GxJConvSettings::checkbutton7 = 0;
1567 }
1568 }
1569 //if(GDK_WINDOW(gx_gui::patch_info->window)) gdk_window_invalidate_rect(GDK_WINDOW(patch_info->window),NULL,false);
1570 }
1571
1572 void GxMainInterface::addJToggleButton(const char* label, float* zone)
1573 {
1574 GdkColor colorRed;
1575 GdkColor colorOwn;
1576 gdk_color_parse ("#58b45e", &colorRed);
1577 gdk_color_parse ("#7f7f7f", &colorOwn);
1578
1579 *zone = 0.0;
1580
1581 GtkWidget* button = gtk_toggle_button_new();
1582 GtkWidget* lab = gtk_label_new(label);
1583 gtk_widget_set_name (lab,"beffekt_label");
1584 GtkStyle *style = gtk_widget_get_style(lab);
1585
1586 pango_font_description_set_size(style->font_desc, 10*PANGO_SCALE);
1587 pango_font_description_set_weight(style->font_desc, PANGO_WEIGHT_BOLD);
1588 gtk_widget_modify_font(lab, style->font_desc);
1589 gtk_container_add (GTK_CONTAINER(button), lab);
1590 addWidget(label, button);
1591 gtk_widget_show (lab);
1592
1593 uiToggleButton* c =
1594 new uiToggleButton(this, zone, GTK_TOGGLE_BUTTON(button));
1595
1596 gtk_widget_modify_bg (button, GTK_STATE_NORMAL, &colorOwn);
1597 gtk_widget_modify_bg (button, GTK_STATE_ACTIVE, &colorRed);
1598
1599 g_signal_connect (GTK_OBJECT (button), "toggled",
1600 G_CALLBACK (uiToggleButton::toggled), (gpointer) c);
1601
1602 g_signal_connect (GTK_OBJECT (button), "toggled",
1603 G_CALLBACK (gx_start_stop_jconv), (gpointer)c);
1604 connect_midi_controller(button, zone);
1605 }
1606
1607 // --------------------------- Check Button ---------------------------
1608
1609 struct uiCheckButton : public gx_ui::GxUiItemFloat
1610 {
1611 GtkToggleButton* fButton;
1612 uiCheckButton(gx_ui::GxUI* ui, float* zone, GtkToggleButton* b) : gx_ui::GxUiItemFloat(ui, zone), fButton(b) {}
1613 static void toggled (GtkWidget *widget, gpointer data)
1614 {
1615 float v = (GTK_TOGGLE_BUTTON (widget)->active) ? 1.0 : 0.0;
1616 ((gx_ui::GxUiItemFloat*)data)->modifyZone(v);
1617 }
1618
1619 virtual void reflectZone()
1620 {
1621 float v = *fZone;
1622 fCache = v;
1623 gtk_toggle_button_set_active(fButton, v > 0.0);
1624 }
1303 void GxMainInterface::addToggleButton(const char* label, float* zone) {
1304 GdkColor colorRed;
1305 GdkColor colorOwn;
1306 gdk_color_parse("#d56161", &colorRed);
1307 gdk_color_parse("#7f7f7f", &colorOwn);
1308 GtkWidget* button = gtk_toggle_button_new();
1309 GtkWidget* lab = gtk_label_new(label);
1310 GtkStyle *style = gtk_widget_get_style(lab);
1311 pango_font_description_set_size(style->font_desc, 10*PANGO_SCALE);
1312 pango_font_description_set_weight(style->font_desc, PANGO_WEIGHT_NORMAL);
1313 gtk_widget_modify_font(lab, style->font_desc);
1314 gtk_container_add(GTK_CONTAINER(button), lab);
1315
1316 gtk_widget_set_name(lab, "beffekt_label");
1317 addWidget(label, button);
1318
1319 gtk_widget_modify_bg(button, GTK_STATE_NORMAL, &colorOwn);
1320 gtk_widget_modify_bg(button, GTK_STATE_ACTIVE, &colorRed);
1321
1322 g_signal_connect(GTK_OBJECT(button), "toggled",
1323 G_CALLBACK(gx_child_process::JackCapture::start_stop), NULL);
1324 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE);
1325 gtk_widget_add_accelerator(button, "activate", fAccelGroup, GDK_r,
1326 GDK_NO_MOD_MASK, GTK_ACCEL_VISIBLE);
1327 gtk_widget_show(lab);
1328 }
1329
1330 void GxMainInterface::addMToggleButton(const char* label, float* zone) {
1331 GdkColor colorRed;
1332 GdkColor colorOwn;
1333 GdkColor colorwn;
1334 gdk_color_parse("#58b45e", &colorRed);
1335 gdk_color_parse("#000000", &colorwn);
1336 gdk_color_parse("#7f7f7f", &colorOwn);
1337 *zone = 0.0;
1338 GtkWidget* button = gtk_toggle_button_new();
1339 GtkWidget* lab = gtk_label_new(label);
1340 GtkStyle *style = gtk_widget_get_style(lab);
1341 pango_font_description_set_weight(style->font_desc, PANGO_WEIGHT_BOLD);
1342 gtk_widget_modify_font(lab, style->font_desc);
1343 gtk_container_add(GTK_CONTAINER(button), lab);
1344 gtk_widget_set_size_request(GTK_WIDGET(button), 70, 20);
1345 GtkWidget * box = gtk_hbox_new(homogene, 4);
1346 GtkWidget * box1 = gtk_vbox_new(homogene, 4);
1347 gtk_container_set_border_width(GTK_CONTAINER(box), 0);
1348 gtk_container_set_border_width(GTK_CONTAINER(box1), 0);
1349 gtk_container_add(GTK_CONTAINER(box), box1);
1350 GtkWidget * box2 = gtk_vbox_new(homogene, 4);
1351 gtk_container_set_border_width(GTK_CONTAINER(box2), 0);
1352 gtk_widget_set_size_request(GTK_WIDGET(box2), 6, 20);
1353 gtk_container_add(GTK_CONTAINER(box), button);
1354 gtk_container_add(GTK_CONTAINER(box), box2);
1355 gtk_widget_set_size_request(GTK_WIDGET(box1), 6, 20);
1356 gtk_widget_show(button);
1357 gtk_widget_show(box1);
1358 gtk_widget_show(box2);
1359 gtk_widget_show(lab);
1360 gtk_widget_show(box);
1361 gtk_container_add(GTK_CONTAINER(fBox[fTop]), box);
1362 uiToggleButton* c = new uiToggleButton(this, zone, GTK_TOGGLE_BUTTON(button));
1363 gtk_widget_modify_bg(button, GTK_STATE_NORMAL, &colorOwn);
1364 gtk_widget_modify_bg(button, GTK_STATE_ACTIVE, &colorRed);
1365 gtk_widget_set_name(lab, "rack_label");
1366 g_signal_connect(GTK_OBJECT(button), "toggled",
1367 G_CALLBACK(uiToggleButton::toggled), (gpointer) c);
1368 connect_midi_controller(button, zone);
1369 }
1370
1371 static bool conv_start() {
1372 gx_jconv::GxJConvSettings* jcset = gx_jconv::GxJConvSettings::instance();
1373 string path = jcset->getFullIRPath();
1374 if (path.empty()) {
1375 gx_system::gx_print_warning(_("convolver"), _("no impulseresponse file"));
1376 return false;
1377 }
1378 while (!gx_engine::conv.checkstate());
1379 if (!gx_engine::conv.configure(
1380 gx_jack::gxjack.jack_bs, gx_jack::gxjack.jack_sr, path,
1381 jcset->getGain(), jcset->getGain(), jcset->getDelay(), jcset->getDelay(),
1382 jcset->getOffset(), jcset->getLength(), 0, 0, jcset->getGainline())) {
1383 return false;
1384 }
1385 return gx_engine::conv.start();
1386 }
1387
1388 void conv_restart() {
1389 gx_engine::conv.stop();
1390 conv_start();
1391 }
1392
1393 void gx_start_stop_jconv(GtkWidget *widget, gpointer data) {
1394 if (gx_jconv::GxJConvSettings::checkbutton7 == 0) {
1395 gx_engine::conv.stop();
1396 } else {
1397 gx_jconv::gx_save_jcgui();
1398 if (!conv_start()) {
1399 gx_jconv::GxJConvSettings::checkbutton7 = 0;
1400 }
1401 }
1402 }
1403
1404 void GxMainInterface::addJToggleButton(const char* label, float* zone) {
1405 GdkColor colorRed;
1406 GdkColor colorOwn;
1407 gdk_color_parse("#58b45e", &colorRed);
1408 gdk_color_parse("#7f7f7f", &colorOwn);
1409
1410 *zone = 0.0;
1411
1412 GtkWidget* button = gtk_toggle_button_new();
1413 GtkWidget* lab = gtk_label_new(label);
1414 gtk_widget_set_name(lab, "beffekt_label");
1415 GtkStyle *style = gtk_widget_get_style(lab);
1416
1417 pango_font_description_set_size(style->font_desc, 10*PANGO_SCALE);
1418 pango_font_description_set_weight(style->font_desc, PANGO_WEIGHT_BOLD);
1419 gtk_widget_modify_font(lab, style->font_desc);
1420 gtk_container_add(GTK_CONTAINER(button), lab);
1421 addWidget(label, button);
1422 gtk_widget_show(lab);
1423
1424 uiToggleButton* c =
1425 new uiToggleButton(this, zone, GTK_TOGGLE_BUTTON(button));
1426
1427 gtk_widget_modify_bg(button, GTK_STATE_NORMAL, &colorOwn);
1428 gtk_widget_modify_bg(button, GTK_STATE_ACTIVE, &colorRed);
1429
1430 g_signal_connect(GTK_OBJECT(button), "toggled",
1431 G_CALLBACK(uiToggleButton::toggled), (gpointer) c);
1432
1433 g_signal_connect(GTK_OBJECT(button), "toggled",
1434 G_CALLBACK(gx_start_stop_jconv), (gpointer)c);
1435 connect_midi_controller(button, zone);
1436 }
1437
1438 // --------------------------- Check Button ---------------------------
1439
1440 struct uiCheckButton : public gx_ui::GxUiItemFloat {
1441 GtkToggleButton* fButton;
1442 uiCheckButton(gx_ui::GxUI* ui, float* zone, GtkToggleButton* b)
1443 : gx_ui::GxUiItemFloat(ui, zone), fButton(b) {}
1444 static void toggled(GtkWidget *widget, gpointer data) {
1445 float v = (GTK_TOGGLE_BUTTON(widget)->active) ? 1.0 : 0.0;
1446 ((gx_ui::GxUiItemFloat*)data)->modifyZone(v);
1447 }
1448
1449 virtual void reflectZone() {
1450 float v = *fZone;
1451 fCache = v;
1452 gtk_toggle_button_set_active(fButton, v > 0.0);
1453 }
16251454 };
16261455
1627 void GxMainInterface::addCheckButton(const char* label, float* zone)
1628 {
1629 GdkColor colorRed;
1630 GdkColor colorOwn;
1631 GdkColor colorba;
1632 gdk_color_parse ("#000000", &colorRed);
1633 gdk_color_parse ("#4c5159", &colorOwn);
1634 gdk_color_parse ("#c4c0c0", &colorba);
1635 GtkWidget* lab = gtk_label_new(label);
1636 GtkWidget* button = gtk_check_button_new ();
1637 gtk_container_add (GTK_CONTAINER(button), lab);
1638 addWidget(label, button);
1639 gtk_widget_modify_bg (button, GTK_STATE_PRELIGHT, &colorOwn);
1640 gtk_widget_modify_fg (button, GTK_STATE_PRELIGHT, &colorRed);
1641 gtk_widget_modify_text (button, GTK_STATE_NORMAL, &colorRed);
1642 gtk_widget_modify_base (button, GTK_STATE_NORMAL, &colorba);
1643 GtkStyle *style = gtk_widget_get_style(lab);
1644 pango_font_description_set_size(style->font_desc, 8*PANGO_SCALE);
1645 pango_font_description_set_weight(style->font_desc, PANGO_WEIGHT_NORMAL);
1646 gtk_widget_modify_font(lab, style->font_desc);
1647 uiCheckButton* c = new uiCheckButton(this, zone, GTK_TOGGLE_BUTTON(button));
1648 g_signal_connect (GTK_OBJECT (button), "toggled", G_CALLBACK(uiCheckButton::toggled), (gpointer) c);
1649 connect_midi_controller(button, zone);
1650 gtk_widget_show (lab);
1651 }
1652
1653 // --------------------------- Adjustmenty based widgets ---------------------------
1654
1655 struct uiValueDisplay : public gx_ui::GxUiItemFloat
1656 {
1657 GtkLabel* fLabel;
1658 int fPrecision ;
1659
1660 uiValueDisplay(gx_ui::GxUI* ui, float* zone, GtkLabel* label, int precision)
1661 : gx_ui::GxUiItemFloat(ui, zone), fLabel(label), fPrecision(precision) {}
1662
1663 virtual void reflectZone()
1664 {
1665 float v = *fZone;
1666 fCache = v;
1667 char s[64];
1668 if (fPrecision <= 0)
1669 snprintf(s, 63, "%d", int(v));
1670
1671 else if (fPrecision > 3)
1672 snprintf(s, 63, "%f", v);
1673
1674 else if (fPrecision == 1)
1675 {
1676 const char* format[] = {"%.1f", "%.2f", "%.3f"};
1677 snprintf(s, 63, format[1-1], v);
1678 }
1679 else if (fPrecision == 2)
1680 {
1681 const char* format[] = {"%.1f", "%.2f", "%.3f"};
1682 snprintf(s, 63, format[2-1], v);
1683 }
1684 else
1685 {
1686 const char* format[] = {"%.1f", "%.2f", "%.3f"};
1687 snprintf(s, 63, format[3-1], v);
1688 }
1689 gtk_label_set_text(fLabel, s);
1690 }
1456 void GxMainInterface::addCheckButton(const char* label, float* zone) {
1457 GdkColor colorRed;
1458 GdkColor colorOwn;
1459 GdkColor colorba;
1460 gdk_color_parse("#000000", &colorRed);
1461 gdk_color_parse("#4c5159", &colorOwn);
1462 gdk_color_parse("#c4c0c0", &colorba);
1463 GtkWidget* lab = gtk_label_new(label);
1464 GtkWidget* button = gtk_check_button_new();
1465 gtk_container_add(GTK_CONTAINER(button), lab);
1466 addWidget(label, button);
1467 gtk_widget_modify_bg(button, GTK_STATE_PRELIGHT, &colorOwn);
1468 gtk_widget_modify_fg(button, GTK_STATE_PRELIGHT, &colorRed);
1469 gtk_widget_modify_text(button, GTK_STATE_NORMAL, &colorRed);
1470 gtk_widget_modify_base(button, GTK_STATE_NORMAL, &colorba);
1471 GtkStyle *style = gtk_widget_get_style(lab);
1472 pango_font_description_set_size(style->font_desc, 8*PANGO_SCALE);
1473 pango_font_description_set_weight(style->font_desc, PANGO_WEIGHT_NORMAL);
1474 gtk_widget_modify_font(lab, style->font_desc);
1475 uiCheckButton* c = new uiCheckButton(this, zone, GTK_TOGGLE_BUTTON(button));
1476 g_signal_connect(GTK_OBJECT(button), "toggled",
1477 G_CALLBACK(uiCheckButton::toggled), (gpointer) c);
1478 connect_midi_controller(button, zone);
1479 gtk_widget_show(lab);
1480 }
1481
1482 // --------------------------- Adjustmenty based widgets ---------------------------
1483
1484 struct uiValueDisplay : public gx_ui::GxUiItemFloat {
1485 GtkLabel* fLabel;
1486 int fPrecision;
1487
1488 uiValueDisplay(gx_ui::GxUI* ui, float* zone, GtkLabel* label, int precision)
1489 : gx_ui::GxUiItemFloat(ui, zone), fLabel(label), fPrecision(precision) {}
1490
1491 virtual void reflectZone() {
1492 float v = *fZone;
1493 fCache = v;
1494 char s[64];
1495 if (fPrecision <= 0) {
1496 snprintf(s, sizeof(s), "%d", static_cast<int>(v));
1497 } else if (fPrecision > 3) {
1498 snprintf(s, sizeof(s), "%f", v);
1499 } else if (fPrecision == 1) {
1500 const char* format[] = {"%.1f", "%.2f", "%.3f"};
1501 snprintf(s, sizeof(s), format[1-1], v);
1502 } else if (fPrecision == 2) {
1503 const char* format[] = {"%.1f", "%.2f", "%.3f"};
1504 snprintf(s, sizeof(s), format[2-1], v);
1505 } else {
1506 const char* format[] = {"%.1f", "%.2f", "%.3f"};
1507 snprintf(s, sizeof(s), format[3-1], v);
1508 }
1509 gtk_label_set_text(fLabel, s);
1510 }
16911511 };
16921512
1693 void GxMainInterface::addCheckButton(string id, const char* label)
1694 {
1695 if (!parameter_map.hasId(id)) {
1696 return;
1697 }
1698 const FloatParameter &p = parameter_map[id].getFloat();
1699 if (!label) {
1700 label = p.name().c_str();
1701 }
1702 addCheckButton(label, &p.value);
1703 }
1704
1705 void GxMainInterface::addNumEntry(string id, const char* label)
1706 {
1707 if (!parameter_map.hasId(id)) {
1708 return;
1709 }
1710 const FloatParameter &p = parameter_map[id].getFloat();
1711 if (!label) {
1712 label = p.name().c_str();
1713 }
1714 addNumEntry(label, &p.value, p.std_value, p.lower, p.upper, p.step);
1715 }
1716
1717
1718 void GxMainInterface::addPToggleButton(string id, const char* label)
1719 {
1720 if (!parameter_map.hasId(id)) {
1721 return;
1722 }
1723 const FloatParameter &p = parameter_map[id].getFloat();
1724 if (!label) {
1725 label = p.name().c_str();
1726 }
1727 addPToggleButton(label, &p.value);
1728 }
1729
1730
1731 void GxMainInterface::addMToggleButton(string id, const char* label)
1732 {
1733 if (!parameter_map.hasId(id)) {
1734 return;
1735 }
1736 const FloatParameter &p = parameter_map[id].getFloat();
1737 if (!label) {
1738 label = p.name().c_str();
1739 }
1740 addMToggleButton(label, &p.value);
1741 }
1742
1743 // -------------------------- gxwmm library controlers -----------------------------------
1744
1745 void set_osilloscope_mode(GtkWidget *widget, gpointer data)
1746 {
1747 gx_gui::GxMainInterface* gui = gx_gui::GxMainInterface::instance();
1748 if (gx_engine::audio.wvpp) {
1749 gui->getWaveView().set_multiplicator(150.,250.);
1750 } else {
1751 gui->getWaveView().set_multiplicator(20.,60.);
1752 }
1753 }
1754
1755 void set_accessible(GtkWidget *widget,GtkLabel *label)
1756 {
1757 AtkObject *atk_widget, *atk_label;
1758 AtkRelationSet *relation_set;
1759 AtkRelation *relation;
1760 AtkObject *targets[1];
1761
1762 atk_widget = gtk_widget_get_accessible (widget);
1763 atk_label = gtk_widget_get_accessible (GTK_WIDGET(label));
1764
1765 relation_set = atk_object_ref_relation_set (atk_label);
1766 targets[0] = atk_widget;
1767
1768 relation = atk_relation_new(targets,1, ATK_RELATION_LABEL_FOR);
1769 atk_relation_set_add(relation_set,relation);
1770 g_object_unref(G_OBJECT(relation));
1771
1772 relation_set = atk_object_ref_relation_set (atk_widget);
1773 targets[0] = atk_label;
1774
1775 relation = atk_relation_new (targets, 1, ATK_RELATION_LABELLED_BY);
1776 atk_relation_set_add (relation_set, relation);
1777 g_object_unref (G_OBJECT (relation));
1778 }
1779
1780
1781 /****************************************************************
1782 ** UiRegler, UiSwitch
1783 */
1784
1785 void UiRegler::on_value_changed()
1786 {
1787 modifyZone(get_value());
1788 }
1789
1790 void UiRegler::reflectZone()
1791 {
1792 float v = *fZone;
1793 fCache = v;
1794 set_value(v);
1795 }
1796
1797 GtkWidget *UiRegler::create(gx_ui::GxUI& ui, Gxw::Regler *regler, string id, bool show_value)
1798 {
1799 if (!parameter_map.hasId(id)) {
1800 return 0;
1801 }
1802 return (new UiRegler(ui, parameter_map[id].getFloat(), regler, show_value))->get_widget();
1803 }
1804
1805 UiRegler::UiRegler(gx_ui::GxUI &ui, FloatParameter &param, Gxw::Regler *regler, bool show_value):
1806 gx_ui::GxUiItemFloat(&ui, &param.value),
1807 Gtk::Adjustment(param.std_value, param.lower, param.upper, param.step, 10*param.step, 0),
1808 m_regler(regler)
1809 {
1810 m_regler->set_show_value(show_value);
1811 m_regler->set_name("regler");
1812 m_regler->set_has_tooltip();
1813 m_regler->set_tooltip_text(param.id().substr( param.id().find_last_of(".")+1).c_str());
1814 m_regler->cp_set_var(param.id());
1815 m_regler->set_adjustment(*this);
1816 m_regler->show();
1817 m_regler->get_accessible()->set_description (param.id().c_str());
1818 m_regler->get_accessible()->set_name (param.id().substr( param.id().find_last_of(".")+1).c_str());
1819
1820 param.value = param.std_value;
1821 connect_midi_controller(GTK_WIDGET(m_regler->gobj()), &param.value);
1822 }
1823
1824 UiRegler::~UiRegler()
1825 {
1826 delete m_regler;
1827 }
1828
1829 UiSelector::UiSelector()
1830 {
1831 m_selector.show();
1832 }
1833
1834 void UiSelectorFloat::on_value_changed()
1835 {
1836 modifyZone(get_value());
1837 }
1838
1839 void UiSelectorInt::on_value_changed()
1840 {
1841 modifyZone((int)get_value());
1842 }
1843
1844 GtkWidget* UiSelector::create(gx_ui::GxUI& ui, string id)
1845 {
1846 Parameter& p = parameter_map[id];
1847 UiSelector *s;
1848 if (p.isFloat()) {
1849 s = new UiSelectorFloat(ui, p.getFloat());
1850 } else {
1851 s = new UiSelectorInt(ui, p.getInt());
1852 }
1853 return s->get_widget();
1854 }
1855
1856 void UiSelector::init(Parameter& param)
1857 {
1858 m_selector.cp_set_var(param.id());
1859 Gtk::TreeModelColumn<Glib::ustring> label;
1860 Gtk::TreeModelColumnRecord rec;
1861 rec.add(label);
1862 Glib::RefPtr<Gtk::ListStore> ls = Gtk::ListStore::create(rec);
1863 for (const char **p = param.getValueNames(); *p; p++) {
1864 ls->append()->set_value(0, Glib::ustring(*p));
1865 }
1866 m_selector.set_model(ls);
1867 if (strcmp(param.group().c_str(),"Oscilloscope")==0) {
1868 g_signal_connect (GTK_OBJECT (m_selector.gobj()), "value_changed", G_CALLBACK(set_osilloscope_mode), NULL);
1869 }
1870 }
1871
1872 UiSelectorFloat::UiSelectorFloat(gx_ui::GxUI& ui, FloatParameter &param):
1873 gx_ui::GxUiItemFloat(&ui, &param.value),
1874 Gtk::Adjustment(param.std_value, param.lower, param.upper, param.step, 10*param.step, 0)
1875 {
1876 m_selector.set_adjustment(*this);
1877 init(param);
1878 m_selector.get_accessible()->set_description (param.id().c_str());
1879 m_selector.get_accessible()->set_name (param.id().substr( param.id().find_last_of(".")+1).c_str());
1880 connect_midi_controller(GTK_WIDGET(m_selector.gobj()), fZone);
1881 }
1882
1883 void UiSelectorFloat::reflectZone()
1884 {
1885 float v = *fZone;
1886 fCache = v;
1887 set_value(v);
1888 }
1889
1890 void UiSelectorInt::reflectZone()
1891 {
1892 int v = *fZone;
1893 fCache = v;
1894 set_value(v);
1895 }
1896
1897 UiSelectorInt::UiSelectorInt(gx_ui::GxUI& ui, IntParameter &param):
1898 gx_ui::GxUiItemInt(&ui, &param.value),
1899 Gtk::Adjustment(param.std_value, param.lower, param.upper, 1, 5, 0)
1900 {
1901 m_selector.set_adjustment(*this);
1902 init(param);
1903 m_selector.get_accessible()->set_description (param.id().c_str());
1904 m_selector.get_accessible()->set_name (param.id().substr( param.id().find_last_of(".")+1).c_str());
1905 connect_midi_controller(GTK_WIDGET(m_selector.gobj()), fZone);
1906 }
1907
1908 GtkWidget* UiReglerWithCaption::create(gx_ui::GxUI& ui, Gxw::Regler *regler, string id, bool show_value)
1909 {
1910 if (!parameter_map.hasId(id)) {
1911 return 0;
1912 }
1913 return create(ui, regler, id, parameter_map[id].name(), show_value);
1914 }
1915
1916 GtkWidget* UiReglerWithCaption::create(gx_ui::GxUI& ui, Gxw::Regler *regler, string id, Glib::ustring label, bool show_value)
1917 {
1918 if (!parameter_map.hasId(id)) {
1919 return 0;
1920 }
1921 return (new UiReglerWithCaption(ui, parameter_map[id].getFloat(), regler, label, show_value))->get_widget();
1922 }
1923
1924 GtkWidget* UiRackReglerWithCaption::create(gx_ui::GxUI& ui, Gxw::Regler *regler, string id)
1925 {
1926 if (!parameter_map.hasId(id)) {
1927 return 0;
1928 }
1929 return create(ui, regler, id, parameter_map[id].name());
1930 }
1931
1932 GtkWidget* UiRackReglerWithCaption::create(gx_ui::GxUI& ui, Gxw::Regler *regler, string id, Glib::ustring label)
1933 {
1934 if (!parameter_map.hasId(id)) {
1935 return 0;
1936 }
1937 return (new UiRackReglerWithCaption(ui, parameter_map[id].getFloat(), regler, label))->get_widget();
1938 }
1939
1940 GtkWidget* UiRackRegler::create(gx_ui::GxUI& ui, Gxw::Regler *regler, string id)
1941 {
1942 if (!parameter_map.hasId(id)) {
1943 return 0;
1944 }
1945 return create(ui, regler, id, parameter_map[id].name());
1946 }
1947
1948 GtkWidget* UiRackRegler::create(gx_ui::GxUI& ui, Gxw::Regler *regler, string id, Glib::ustring label)
1949 {
1950 if (!parameter_map.hasId(id)) {
1951 return 0;
1952 }
1953 return (new UiRackRegler(ui, parameter_map[id].getFloat(), regler, label))->get_widget();
1954 }
1955 UiReglerWithCaption::UiReglerWithCaption(gx_ui::GxUI &ui, FloatParameter &param, Gxw::Regler *regler,
1956 Glib::ustring label, bool show_value):
1957 UiRegler(ui, param, regler, show_value)
1958 {
1959 m_label.set_text(label);
1960 m_label.set_name("effekt_label");
1961 m_box.set_name(param.id());
1962 m_box.pack_start(m_label, Gtk::PACK_SHRINK);
1963 m_box.pack_start(*m_regler, Gtk::PACK_SHRINK);
1964 set_accessible(GTK_WIDGET(m_regler->gobj()),m_label.gobj());
1965 m_box.show_all();
1966 }
1967
1968 UiRackReglerWithCaption::UiRackReglerWithCaption(gx_ui::GxUI &ui, FloatParameter &param, Gxw::Regler *regler,
1969 Glib::ustring label):
1970 UiRegler(ui, param, regler, true)
1971 {
1972 m_label.set_text(label);
1973 m_label.set_name("rack_label");
1974 m_box.set_name(param.id());
1975 m_box.pack_start(m_label, Gtk::PACK_SHRINK);
1976 m_box.pack_start(*m_regler, Gtk::PACK_SHRINK);
1977 set_accessible(GTK_WIDGET(m_regler->gobj()),m_label.gobj());
1978 m_box.show_all();
1979 }
1980
1981 UiRackRegler::UiRackRegler(gx_ui::GxUI &ui, FloatParameter &param, Gxw::Regler *regler,
1982 Glib::ustring label):
1983 UiRegler(ui, param, regler, true)
1984 {
1985 m_box.set_name(param.id());
1986 m_box.pack_start(*m_regler, Gtk::PACK_SHRINK);
1987 m_regler->set_name("rack_regler");
1988 m_regler->get_accessible()->set_description (param.id().c_str());
1989 m_regler->get_accessible()->set_name (param.id().substr( param.id().find_last_of(".")+1).c_str());
1990 m_box.show_all();
1991 }
1992
1993 UiSwitch::UiSwitch(const char *sw_type):
1994 Switch(sw_type)
1995 {
1996 }
1997
1998 UiSwitch *UiSwitch::new_switch(gx_ui::GxUI& ui, const char* sw_type, Parameter& param)
1999 {
2000 if (param.isFloat()) {
2001 return new UiSwitchFloat(ui, sw_type, param.getFloat());
2002 } else {
2003 return new UiSwitchBool(ui, sw_type, param.getBool());
2004 }
2005 }
2006
2007 void UiSwitchFloat::on_toggled()
2008 {
2009 modifyZone(get_active());
2010 }
2011
2012 void UiSwitchFloat::reflectZone()
2013 {
2014 float v = *fZone;
2015 fCache = v;
2016 set_active(v != 0.0);
2017 }
2018
2019 UiSwitchFloat::UiSwitchFloat(gx_ui::GxUI& ui, const char *sw_type, FloatParameter &param):
2020 UiSwitch(sw_type),
2021 gx_ui::GxUiItemFloat(&ui, &param.value)
2022 {
2023 param.set_std_value();
2024 set_active(param.value != 0.0);
2025 cp_set_var(param.id());
2026 this->set_tooltip_text(param.id().substr( param.id().find_last_of(".")+1).c_str());
2027 this->get_accessible()->set_description (param.id().c_str());
2028 this->get_accessible()->set_name (param.id().substr( param.id().find_last_of(".")+1).c_str());
2029 connect_midi_controller(GTK_WIDGET(gobj()), fZone);
2030 show();
2031 }
2032
2033 void UiSwitchBool::on_toggled()
2034 {
2035 modifyZone(get_active());
2036 }
2037
2038 void UiSwitchBool::reflectZone()
2039 {
2040 bool v = *fZone;
2041 fCache = v;
2042 set_active(v != 0);
2043 }
2044
2045 UiSwitchBool::UiSwitchBool(gx_ui::GxUI& ui, const char *sw_type, BoolParameter &param):
2046 UiSwitch(sw_type),
2047 gx_ui::GxUiItemBool(&ui, &param.value)
2048 {
2049 param.set_std_value();
2050 set_active(param.value);
2051 cp_set_var(param.id());
2052 char s[64];
2053 snprintf(s, 63, _("%s on/off"),param.group().c_str());
2054 this->set_tooltip_text(s);
2055 this->get_accessible()->set_description (param.id().c_str());
2056 this->get_accessible()->set_name (param.id().substr( param.id().find_last_of(".")+1).c_str());
2057 connect_midi_controller(GTK_WIDGET(gobj()), fZone);
2058 show();
2059 }
2060
2061 GtkWidget* UiSwitchWithCaption::create(
2062 gx_ui::GxUI& ui, const char *sw_type, string id, Gtk::PositionType pos)
2063 {
2064 if (!parameter_map.hasId(id)) {
2065 return 0;
2066 }
2067 return create(ui, sw_type, id, parameter_map[id].name(), pos);
2068 }
2069
2070 GtkWidget* UiSwitchWithCaption::create(
2071 gx_ui::GxUI& ui, const char *sw_type, string id, Glib::ustring label, Gtk::PositionType pos)
2072 {
2073 if (!parameter_map.hasId(id)) {
2074 return 0;
2075 }
2076 return (new UiSwitchWithCaption(ui, sw_type, parameter_map[id], label, pos))->get_widget();
2077 }
2078
2079 UiSwitchWithCaption::UiSwitchWithCaption(gx_ui::GxUI &ui, const char *sw_type, Parameter &param,
2080 Glib::ustring label, Gtk::PositionType pos):
2081 m_switch(UiSwitch::new_switch(ui, sw_type, param))
2082 {
2083 m_label.set_text(label);
2084 m_label.set_name("effekt_label");
2085 if (pos == Gtk::POS_LEFT || pos == Gtk::POS_RIGHT) {
2086 m_box = new Gtk::HBox();
2087 } else {
2088 m_box = new Gtk::VBox();
2089 }
2090 if (pos == Gtk::POS_LEFT || pos == Gtk::POS_TOP) {
2091 m_box->pack_start(m_label, Gtk::PACK_SHRINK);
2092 m_box->pack_start(*m_switch, Gtk::PACK_SHRINK);
2093 } else {
2094 m_box->pack_start(*m_switch, Gtk::PACK_SHRINK);
2095 m_box->pack_start(m_label, Gtk::PACK_SHRINK);
2096 }
2097 m_box->set_name(param.id());
2098 set_accessible(GTK_WIDGET(m_switch->gobj()),m_label.gobj());
2099 m_box->show_all();
2100 }
2101
2102 UiSwitchWithCaption::~UiSwitchWithCaption()
2103 {
2104 delete m_switch;
2105 delete m_box;
2106 }
2107
2108 UiCabSwitch::UiCabSwitch(gx_ui::GxUI &ui, Parameter &param, Glib::ustring label):
2109 UiSwitchWithCaption(ui, sw_minitoggle, param, label, Gtk::POS_RIGHT)
2110 {
2111 m_switch->signal_toggled().connect(sigc::mem_fun(*this, &UiCabSwitch::on_switch_toggled));
2112 }
2113
2114 GtkWidget* UiCabSwitch::create(gx_ui::GxUI& ui, string id, Glib::ustring label)
2115 {
2116 if (!parameter_map.hasId(id)) {
2117 return 0;
2118 }
2119 return (new UiCabSwitch(ui, parameter_map[id], label))->get_widget();
2120 }
2121
2122 UiContrastSwitch::UiContrastSwitch(gx_ui::GxUI &ui, Parameter &param, Glib::ustring label):
2123 UiSwitchWithCaption(ui, sw_minitoggle, param, label, Gtk::POS_RIGHT)
2124 {
2125 m_switch->signal_toggled().connect(sigc::mem_fun(*this, &UiContrastSwitch::on_switch_toggled));
2126 }
2127
2128 GtkWidget* UiContrastSwitch::create(gx_ui::GxUI& ui, string id, Glib::ustring label)
2129 {
2130 if (!parameter_map.hasId(id)) {
2131 return 0;
2132 }
2133 return (new UiContrastSwitch(ui, parameter_map[id], label))->get_widget();
1513 void GxMainInterface::addCheckButton(string id, const char* label) {
1514 if (!parameter_map.hasId(id)) {
1515 return;
1516 }
1517 const FloatParameter &p = parameter_map[id].getFloat();
1518 if (!label) {
1519 label = p.name().c_str();
1520 }
1521 addCheckButton(label, &p.value);
1522 }
1523
1524 void GxMainInterface::addNumEntry(string id, const char* label) {
1525 if (!parameter_map.hasId(id)) {
1526 return;
1527 }
1528 const FloatParameter &p = parameter_map[id].getFloat();
1529 if (!label) {
1530 label = p.name().c_str();
1531 }
1532 addNumEntry(label, &p.value, p.std_value, p.lower, p.upper, p.step);
1533 }
1534
1535
1536 void GxMainInterface::addPToggleButton(string id, const char* label) {
1537 if (!parameter_map.hasId(id)) {
1538 return;
1539 }
1540 const FloatParameter &p = parameter_map[id].getFloat();
1541 if (!label) {
1542 label = p.name().c_str();
1543 }
1544 addPToggleButton(label, &p.value);
1545 }
1546
1547
1548 void GxMainInterface::addMToggleButton(string id, const char* label) {
1549 if (!parameter_map.hasId(id)) {
1550 return;
1551 }
1552 const FloatParameter &p = parameter_map[id].getFloat();
1553 if (!label) {
1554 label = p.name().c_str();
1555 }
1556 addMToggleButton(label, &p.value);
21341557 }
21351558
21361559 // -------------------------- gtk widgets -----------------------------------
21371560
2138 void GxMainInterface::addNumEntry(const char* label, float* zone, float init, float min, float max, float step)
2139 {
2140 *zone = init;
2141 GtkObject* adj = gtk_adjustment_new(init, min, max, step, 10*step, 0);
2142 uiAdjustment* c = new uiAdjustment(this, zone, GTK_ADJUSTMENT(adj));
2143 g_signal_connect (GTK_OBJECT (adj), "value-changed", G_CALLBACK (uiAdjustment::changed), (gpointer) c);
2144 GtkWidget* spinner = gtk_spin_button_new (GTK_ADJUSTMENT(adj), step, precision(step));
2145 connect_midi_controller(spinner, zone);
2146 GtkWidget * box = gtk_hbox_new (homogene, 0);
2147 GtkWidget* lab = gtk_label_new(label);
2148 gtk_container_add (GTK_CONTAINER(box), lab);
2149 gtk_widget_set_name (lab,"rack_label");
2150 addWidget(label, box);
2151 addWidget(label, spinner);
2152 }
2153
2154 void GxMainInterface::openWarningBox(const char* label, float* zone)
2155 {
2156 GtkWidget* button = gtk_check_button_new ();
2157 uiCheckButton* c = new uiCheckButton(this, zone, GTK_TOGGLE_BUTTON(button));
2158 g_signal_connect (GTK_OBJECT (button), "toggled", G_CALLBACK(uiCheckButton::toggled), (gpointer) c);
2159 }
2160
2161 void GxMainInterface::setSkinBox(const char* label, float* zone)
2162 {
2163 GtkObject* adj = gtk_adjustment_new(99, 0, 100, 1, 10*1, 0);
2164 uiAdjustment* c = new uiAdjustment(this, zone, GTK_ADJUSTMENT(adj));
2165
2166 g_signal_connect (GTK_OBJECT (adj), "value-changed", G_CALLBACK (uiAdjustment::changed), (gpointer) c);
2167 g_signal_connect (GTK_OBJECT (adj), "value-changed", G_CALLBACK (gx_set_skin), (gpointer) c);
2168 }
2169
2170 static void set_label(MenuCheckItem& item , const char *label)
2171 {
2172 dynamic_cast<Gtk::Label*>(item.get_child())->set_text_with_mnemonic(label);
2173 }
2174
2175 static void set_label(RadioCheckItem& item , const char *label)
2176 {
2177 dynamic_cast<Gtk::Label*>(item.get_child())->set_text_with_mnemonic(label);
2178 }
2179 /****************************************************************
2180 ** Effect Dialog Boxes
2181 */
2182
2183 class GxDialogButtonBox
2184 {
2185 public:
2186 Gtk::HBox box;
2187 UiSwitchBool show_dialog;
2188 GxDialogButtonBox(gx_ui::GxUI& ui, Parameter& param_dialog);
2189 };
2190
2191 GxDialogButtonBox::GxDialogButtonBox(gx_ui::GxUI& ui, Parameter& param_dialog):
2192 box(false, 0),
2193 show_dialog(ui, sw_button, param_dialog.getBool())
2194 {
2195 box.set_border_width(0);
2196 box.show_all();
2197 }
2198
2199 /***************************/
2200
2201 class GxDialogWindowBox
2202 {
2203 private:
2204 void on_dialog_button_toggled();
2205 void on_reset_button_pressed();
2206 void on_dialog_menu_activate();
2207 bool on_window_delete_event(GdkEventAny* event);
2208 Glib::ustring group_id;
2209 public:
2210 Gtk::HBox box;
2211 Gtk::HBox box1;
2212 Gxw::PaintBox paintbox;
2213 Gtk::HBox box4;
2214 Gtk::HBox box5;
2215 Gtk::HBox box6;
2216 UiSwitch* unit_on_off;
2217 MenuCheckItem menuitem;
2218 Gtk::Button reset_button;
2219 Gtk::Button reset_button1;
2220 ToggleCheckButton m_tcb;
2221 Gtk::ToggleButton& dialog_button;
2222 Gtk::Window m_regler_tooltip_window;
2223 GxDialogWindowBox(gx_ui::GxUI& ui, const char *expose_funk, Parameter& param_dialog, Parameter& param_switch, Gtk::ToggleButton& button,GtkWidget * Caller);
2224 ~GxDialogWindowBox();
2225 };
2226
2227 GxDialogWindowBox::~GxDialogWindowBox()
2228 {
2229 delete unit_on_off;
2230 }
2231
2232 void GxDialogWindowBox::on_dialog_button_toggled()
2233 {
2234 if (dialog_button.get_active()){
2235 const gchar * title = gtk_widget_get_name(GTK_WIDGET(paintbox.gobj()));
2236 string p = "ui.";
2237 p +=title;
2238 string group = group_id;
2239 group += ".on_off";
2240 parameter_map[p].set_std_value();
2241 parameter_map[group].set_std_value();
2242 dialog_button.set_active(false);
2243 }
2244 }
2245
2246 void GxDialogWindowBox::on_dialog_menu_activate()
2247 {
2248 gx_show_extended_settings(GTK_WIDGET(menuitem.gobj()), (gpointer)paintbox.gobj());
2249
2250 if (!menuitem.get_active()){
2251 string group = group_id;
2252 group += ".on_off";
2253 parameter_map[group].set_std_value();
2254 }
2255 }
2256
2257 void GxDialogWindowBox::on_reset_button_pressed()
2258 {
2259 gx_reset_units(group_id);
2260 }
2261
2262 GxDialogWindowBox::GxDialogWindowBox(gx_ui::GxUI& ui,const char *expose_funk, Parameter& param_dialog,
2263 Parameter& param_switch, Gtk::ToggleButton& button,GtkWidget * Caller):
2264 box(false, 0),
2265 unit_on_off( UiSwitch::new_switch(ui, sw_led, param_switch)),
2266 dialog_button(button),
2267 m_regler_tooltip_window(Gtk::WINDOW_POPUP)
2268 {
2269 group_id = param_dialog.id().substr(0, param_dialog.id().find_last_of(".")).c_str();
2270 Glib::ustring title = param_dialog.group();
2271 box1.pack_end(*unit_on_off,false,false);
2272 box.set_border_width(2);
2273 box4.set_spacing(2);
2274 box4.set_border_width(2);
2275 box5.set_border_width(4);
2276 box6.set_border_width(4);
2277 paintbox.property_paint_func() = expose_funk;
2278 paintbox.set_name(title);
2279 reset_button.set_name("effect_reset");
2280 reset_button1.set_name("effect_reset");
2281 box5.add(reset_button);
2282 box6.add(reset_button1);
2283 box5.set_size_request(15,-1);
2284 box6.set_size_request(15,-1);
2285 reset_button.signal_pressed().connect(
2286 sigc::mem_fun(*this, &GxDialogWindowBox::on_reset_button_pressed));
2287 reset_button1.signal_pressed().connect(
2288 sigc::mem_fun(*this, &GxDialogWindowBox::on_reset_button_pressed));
2289 reset_button.set_tooltip_text(_("Reset Button, press to reset settings"));
2290 reset_button1.set_tooltip_text(_("Reset Button, press to reset settings"));
2291 box4.pack_start(box6,false,false,0);
2292 box4.pack_start(box,true,true,0);
2293 box4.pack_end(box5,false,false,0);
2294 paintbox.add(box4);
2295 paintbox.set_tooltip_text(_(title.c_str()));
2296 m_tcb.m_label.set_text(_(title.c_str()));
2297 dialog_button.signal_toggled().connect(
2298 sigc::mem_fun(*this, &GxDialogWindowBox::on_dialog_button_toggled));
2299 menuitem.signal_activate().connect(
2300 sigc::mem_fun(*this, &GxDialogWindowBox::on_dialog_menu_activate));
2301 }
2302
2303 /***************************/
2304
2305 void GxMainInterface::openDialogBox(const char *id_dialog, const char *id_switch, const char *expose_funk )
2306 {
2307 Parameter& param_dialog = parameter_map[id_dialog];
2308 Parameter& param_switch = parameter_map[id_switch];
2309 GxDialogButtonBox *bbox = new GxDialogButtonBox(*this, param_dialog);
2310 GList* child_list = gtk_container_get_children(GTK_CONTAINER(rBox));
2311 GtkWidget *child = (GtkWidget *) g_list_nth_data(child_list,mono_plugs);
2312 mono_plugs++;
2313 g_list_free(child_list);
2314 gx_engine::set_mono_plug_counter(mono_plugs);
2315 gtk_box_pack_end (GTK_BOX(child),GTK_WIDGET(bbox->box.gobj()) , false, false, 0);
2316 GxDialogWindowBox *dialog = new GxDialogWindowBox(*this, expose_funk, param_dialog, param_switch, bbox->show_dialog, rack_widget);
2317 gtk_box_pack_start (GTK_BOX(child),GTK_WIDGET(dialog->paintbox.gobj()) , true, fill, 0);
2318 pushBox(kBoxMode, GTK_WIDGET(dialog->box.gobj()));
2319
2320 const gchar * title = gtk_widget_get_name(GTK_WIDGET(dialog->paintbox.gobj()));
2321 string p = "ui.";
2322 p +=title;
2323 set_label(dialog->menuitem, _(title));
2324 guint accel_key = GDK_a + mono_plugs ;
2325 dialog->menuitem.add_accelerator("activate", Glib::wrap(fAccelGroup, true),
2326 accel_key, Gdk::LOCK_MASK, Gtk::ACCEL_VISIBLE); //FIXME MOD1_MASK
2327 gtk_menu_shell_append(GTK_MENU_SHELL(fMenuList["PluginsMono"]), GTK_WIDGET(dialog->menuitem.gobj()));
2328 dialog->menuitem.show();
2329 dialog->menuitem.set_parameter(new SwitchParameter(p,true,false));
2330
2331 dialog->m_tcb.set_parameter(dialog->menuitem.get_parameter());
2332 gtk_box_pack_start (GTK_BOX(tBox),GTK_WIDGET(dialog->box1.gobj()) , false, false, 0);
2333 dialog->box1.pack_start(dialog->m_tcb,true,true);
2334 string tooltip = "show ";
2335 tooltip +=title;
2336 dialog->m_tcb.set_tooltip_text(_(tooltip.c_str()));
2337 dialog->box1.show_all();
2338 if(strcmp(title,"Oscilloscope")==0) {
2339 fShowWaveView.add_parameter(dialog->menuitem.get_parameter());
2340 fShowWaveView.signal_activate().connect(
2341 sigc::mem_fun(*this, &GxMainInterface::on_show_oscilloscope));
2342 }
2343
2344 //gtk_box_pack_start (GTK_BOX(tBox),GTK_WIDGET(dialog->m_tcb.gobj()) , false, false, 0);
2345 }
2346
2347 void GxMainInterface::opensDialogBox(const char *id_dialog, const char *id_switch, const char *expose_funk )
2348 {
2349 Parameter& param_dialog = parameter_map[id_dialog];
2350 Parameter& param_switch = parameter_map[id_switch];
2351 GxDialogButtonBox *bbox = new GxDialogButtonBox(*this, param_dialog);
2352
2353 GList* child_list = gtk_container_get_children(GTK_CONTAINER(sBox));
2354 GtkWidget *child = (GtkWidget *) g_list_nth_data(child_list,stereo_plugs);
2355 stereo_plugs++;
2356 g_list_free(child_list);
2357 gx_engine::set_stereo_plug_counter(stereo_plugs);
2358 gtk_box_pack_end (GTK_BOX(child),GTK_WIDGET(bbox->box.gobj()) , false, false, 0);
2359 GxDialogWindowBox *bdialog = new GxDialogWindowBox(*this, expose_funk, param_dialog, param_switch, bbox->show_dialog, srack_widget);
2360 gtk_box_pack_start (GTK_BOX(child),GTK_WIDGET(bdialog->paintbox.gobj()) , true, fill, 0);
2361 pushBox(kBoxMode, GTK_WIDGET(bdialog->box.gobj()));
2362
2363 const gchar * title = gtk_widget_get_name(GTK_WIDGET(bdialog->paintbox.gobj()));
2364 set_label(bdialog->menuitem, _(title));
2365 string p = "ui.";
2366 p +=title;
2367 string s;
2368
2369 guint accel_key = GDK_r + stereo_plugs ;
2370 bdialog->menuitem.add_accelerator("activate", Glib::wrap(fAccelGroup, true),
2371 accel_key, Gdk::LOCK_MASK, Gtk::ACCEL_VISIBLE); //FIXME
2372 gtk_menu_shell_append(GTK_MENU_SHELL(fMenuList["PluginsStereo"]), GTK_WIDGET(bdialog->menuitem.gobj()));
2373 bdialog->menuitem.show();
2374 bdialog->menuitem.set_parameter(new SwitchParameter(p,true,false));
2375
2376 bdialog->m_tcb.set_parameter(bdialog->menuitem.get_parameter());
2377 gtk_box_pack_start (GTK_BOX(tBox),GTK_WIDGET(bdialog->box1.gobj()) , false, false, 0);
2378 bdialog->box1.pack_start(bdialog->m_tcb,true,true);
2379 string tooltip = "show ";
2380 tooltip +=title;
2381 bdialog->m_tcb.set_tooltip_text(_(tooltip.c_str()));
2382 bdialog->box1.show_all();
2383 //gtk_box_pack_start (GTK_BOX(tBox),GTK_WIDGET(bdialog->m_tcb.gobj()) , false, false, 0);
2384 }
2385
2386 //-------- collect patch info for stage display
2387 struct uiPatchDisplay : public gx_ui::GxUiItemFloat
2388 {
2389 GtkWidget* fdialog;
2390
2391 uiPatchDisplay(gx_ui::GxUI* ui, float* zone, GtkWidget* dialog)
2392 : gx_ui::GxUiItemFloat(ui, zone), fdialog(dialog) {}
2393
2394 virtual void reflectZone()
2395 {
2396 GList* child_list = gtk_container_get_children(GTK_CONTAINER(fdialog));
2397 GtkWidget *parent = (GtkWidget *) g_list_nth_data(child_list,0);
2398 if(GDK_WINDOW(parent->window)) {
1561 void GxMainInterface::addNumEntry(const char* label, float* zone, float init, float min,
1562 float max, float step) {
1563 *zone = init;
1564 GtkObject* adj = gtk_adjustment_new(init, min, max, step, 10*step, 0);
1565 uiAdjustment* c = new uiAdjustment(this, zone, GTK_ADJUSTMENT(adj));
1566 g_signal_connect(GTK_OBJECT(adj), "value-changed",
1567 G_CALLBACK(uiAdjustment::changed), (gpointer) c);
1568 GtkWidget* spinner = gtk_spin_button_new(GTK_ADJUSTMENT(adj), step, precision(step));
1569 connect_midi_controller(spinner, zone);
1570 GtkWidget * box = gtk_hbox_new(homogene, 0);
1571 GtkWidget* lab = gtk_label_new(label);
1572 gtk_container_add(GTK_CONTAINER(box), lab);
1573 gtk_widget_set_name(lab, "rack_label");
1574 addWidget(label, box);
1575 addWidget(label, spinner);
1576 }
1577
1578 void GxMainInterface::openWarningBox(const char* label, float* zone) {
1579 GtkWidget* button = gtk_check_button_new();
1580 uiCheckButton* c = new uiCheckButton(this, zone, GTK_TOGGLE_BUTTON(button));
1581 g_signal_connect(GTK_OBJECT(button), "toggled",
1582 G_CALLBACK(uiCheckButton::toggled), (gpointer) c);
1583 }
1584
1585 void GxMainInterface::setSkinBox(const char* label, float* zone) {
1586 GtkObject* adj = gtk_adjustment_new(99, 0, 100, 1, 10*1, 0);
1587 uiAdjustment* c = new uiAdjustment(this, zone, GTK_ADJUSTMENT(adj));
1588
1589 g_signal_connect(GTK_OBJECT(adj), "value-changed",
1590 G_CALLBACK(uiAdjustment::changed), (gpointer) c);
1591 g_signal_connect(GTK_OBJECT(adj), "value-changed",
1592 G_CALLBACK(gx_set_skin), (gpointer) c);
1593 }
1594
1595 void set_label(MenuCheckItem& item , const char *label) {
1596 // dynamic_cast ??
1597 static_cast<Gtk::Label*>(item.get_child())->set_text_with_mnemonic(label);
1598 }
1599
1600 void set_label(RadioCheckItem& item , const char *label) {
1601 // dynamic_cast ??
1602 static_cast<Gtk::Label*>(item.get_child())->set_text_with_mnemonic(label);
1603 }
1604
1605 // -------- collect patch info for stage display
1606 struct uiPatchDisplay : public gx_ui::GxUiItemFloat {
1607 GtkWidget* fdialog;
1608
1609 uiPatchDisplay(gx_ui::GxUI* ui, float* zone, GtkWidget* dialog)
1610 : gx_ui::GxUiItemFloat(ui, zone), fdialog(dialog) {}
1611
1612 virtual void reflectZone() {
1613 GList* child_list = gtk_container_get_children(GTK_CONTAINER(fdialog));
1614 GtkWidget *parent = reinterpret_cast<GtkWidget *>( g_list_nth_data(child_list, 0));
1615 if (GDK_WINDOW(parent->window)) {
23991616 if (fCache != *fZone) {
24001617 char s[64];
2401 gdk_window_invalidate_rect(GDK_WINDOW(parent->window),NULL,false);
1618 gdk_window_invalidate_rect(GDK_WINDOW(parent->window), NULL, false);
24021619 child_list = gtk_container_get_children(GTK_CONTAINER(parent));
2403 parent = (GtkWidget *) g_list_nth_data(child_list,1);
2404 GtkWidget *pchild = (GtkWidget *) g_list_nth_data(child_list,2);
1620 parent = reinterpret_cast<GtkWidget *>( g_list_nth_data(child_list, 1));
1621 GtkWidget *pchild = reinterpret_cast<GtkWidget *>
1622 ( g_list_nth_data(child_list, 2));
24051623 gx_jconv::GxJConvSettings* jcset = gx_jconv::GxJConvSettings::instance();
24061624
2407 if(gx_jconv::GxJConvSettings::checkbutton7 == 1) {
2408 snprintf(s, 63, _("convolve %s"),jcset->getIRFile().c_str());
2409 gtk_label_set_text(GTK_LABEL(pchild),s);
2410 }else {
2411 snprintf(s, 63, _("convolver off"));
2412 gtk_label_set_text(GTK_LABEL(pchild),s);
1625 if (gx_jconv::GxJConvSettings::checkbutton7 == 1) {
1626 snprintf(s, sizeof(s), _("convolve %s"), jcset->getIRFile().c_str());
1627 gtk_label_set_text(GTK_LABEL(pchild), s);
1628 } else {
1629 snprintf(s, sizeof(s), _("convolver off"));
1630 gtk_label_set_text(GTK_LABEL(pchild), s);
24131631 }
24141632
2415 if(setting_is_preset ) {
2416 snprintf(s, 63, " %i%s%s ", int(show_patch_info),". ",gx_current_preset.c_str());
1633 if (gx_preset::setting_is_preset) {
1634 snprintf(s, sizeof(s), " %i%s%s ", static_cast<int>(show_patch_info),
1635 ". ", gx_preset::gx_current_preset.c_str());
24171636 gtk_label_set_text(GTK_LABEL(parent), s);
2418 }
2419 else {
1637 } else {
24201638 show_patch_info = 0;
2421 snprintf(s, 63, _(" %i%sMain Setting "), int(show_patch_info),". ");
1639 snprintf(s, sizeof(s), _(" %i%sMain Setting "),
1640 static_cast<int>(show_patch_info), ". ");
24221641 gtk_label_set_text(GTK_LABEL(parent), s);
24231642 }
24241643 fCache = *fZone;
24251644 }
24261645 }
24271646 g_list_free(child_list);
2428 }
1647 }
24291648 };
24301649
2431 //----- hide the jconv settings widget
2432 gboolean gx_delete_pi( GtkWidget *widget, gpointer data )
2433 {
2434 gtk_widget_hide(patch_info);
2435 return TRUE;
2436 }
2437
2438 void GxMainInterface::openPatchInfoBox(float* zone)
2439 {
2440 patch_info = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2441 gtk_window_set_decorated(GTK_WINDOW(patch_info), TRUE);
2442 gtk_window_set_icon(GTK_WINDOW (patch_info), GDK_PIXBUF(ib));
2443 gtk_window_set_resizable(GTK_WINDOW(patch_info), FALSE);
2444 gtk_window_set_gravity(GTK_WINDOW(patch_info), GDK_GRAVITY_SOUTH);
2445 gtk_window_set_transient_for (GTK_WINDOW(patch_info), GTK_WINDOW(fWindow));
2446 gtk_window_set_position (GTK_WINDOW(patch_info), GTK_WIN_POS_MOUSE);
2447 gtk_window_set_keep_below (GTK_WINDOW(patch_info), FALSE);
2448 gtk_window_set_title (GTK_WINDOW (patch_info), "Patch Info");
2449 gtk_window_set_type_hint (GTK_WINDOW (patch_info), GDK_WINDOW_TYPE_HINT_UTILITY);
2450 gtk_window_set_destroy_with_parent(GTK_WINDOW(patch_info), TRUE);
2451 GtkWidget * box = gtk_vbox_new (homogene, 8);
2452 const char *labe = "";
2453 GtkWidget* la = gtk_label_new(labe);
2454 GtkWidget* lab = gtk_label_new(labe);
2455 GtkWidget* label = gtk_label_new(labe);
2456 new uiPatchDisplay(this, zone, GTK_WIDGET(patch_info));
2457 g_signal_connect_swapped (G_OBJECT (patch_info), "delete_event", G_CALLBACK (gx_delete_pi), NULL);
2458 g_signal_connect(box, "expose-event", G_CALLBACK(info_box_expose), NULL);
2459 gtk_container_set_border_width (GTK_CONTAINER (box), 8);
2460
2461 GtkStyle *style = gtk_widget_get_style(lab);
2462 pango_font_description_set_size(style->font_desc, 30*PANGO_SCALE);
2463 pango_font_description_set_weight(style->font_desc, PANGO_WEIGHT_BOLD);
2464 gtk_widget_modify_font(lab, style->font_desc);
2465
2466 gtk_container_add (GTK_CONTAINER(box), la);
2467 gtk_container_add (GTK_CONTAINER(box), lab);
2468 gtk_container_add (GTK_CONTAINER(box), label);
2469 gtk_container_add (GTK_CONTAINER(patch_info), box);
2470
2471 gtk_widget_hide(patch_info);
1650 // ----- hide the PatchInfo widget
1651 gboolean gx_delete_pi(GtkWidget *widget, gpointer data ) {
1652 gtk_widget_hide(gw.patch_info);
1653 return TRUE;
1654 }
1655
1656 void GxMainInterface::openPatchInfoBox(float* zone) {
1657 gw.patch_info = gtk_window_new(GTK_WINDOW_TOPLEVEL);
1658 gtk_window_set_decorated(GTK_WINDOW(gw.patch_info), TRUE);
1659 gtk_window_set_icon(GTK_WINDOW(gw.patch_info), GDK_PIXBUF(gw.ib));
1660 gtk_window_set_resizable(GTK_WINDOW(gw.patch_info), FALSE);
1661 gtk_window_set_gravity(GTK_WINDOW(gw.patch_info), GDK_GRAVITY_SOUTH);
1662 gtk_window_set_transient_for(GTK_WINDOW(gw.patch_info), GTK_WINDOW(gw.fWindow));
1663 gtk_window_set_position(GTK_WINDOW(gw.patch_info), GTK_WIN_POS_MOUSE);
1664 gtk_window_set_keep_below(GTK_WINDOW(gw.patch_info), FALSE);
1665 gtk_window_set_title(GTK_WINDOW(gw.patch_info), "Patch Info");
1666 gtk_window_set_type_hint(GTK_WINDOW(gw.patch_info), GDK_WINDOW_TYPE_HINT_UTILITY);
1667 gtk_window_set_destroy_with_parent(GTK_WINDOW(gw.patch_info), TRUE);
1668 GtkWidget * box = gtk_vbox_new(homogene, 8);
1669 const char *labe = "";
1670 GtkWidget* la = gtk_label_new(labe);
1671 GtkWidget* lab = gtk_label_new(labe);
1672 GtkWidget* label = gtk_label_new(labe);
1673 new uiPatchDisplay(this, zone, GTK_WIDGET(gw.patch_info));
1674 g_signal_connect_swapped(G_OBJECT(gw.patch_info), "delete_event",
1675 G_CALLBACK(gx_delete_pi), NULL);
1676 g_signal_connect(box, "expose-event", G_CALLBACK(gx_cairo::info_box_expose), NULL);
1677 gtk_container_set_border_width(GTK_CONTAINER(box), 8);
1678
1679 GtkStyle *style = gtk_widget_get_style(lab);
1680 pango_font_description_set_size(style->font_desc, 30*PANGO_SCALE);
1681 pango_font_description_set_weight(style->font_desc, PANGO_WEIGHT_BOLD);
1682 gtk_widget_modify_font(lab, style->font_desc);
1683
1684 gtk_container_add(GTK_CONTAINER(box), la);
1685 gtk_container_add(GTK_CONTAINER(box), lab);
1686 gtk_container_add(GTK_CONTAINER(box), label);
1687 gtk_container_add(GTK_CONTAINER(gw.patch_info), box);
1688
1689 gtk_widget_hide(gw.patch_info);
24721690 }
24731691
24741692 // ------------------------------ Num Display -----------------------------------
24751693
2476 uiTuner::uiTuner(gx_ui::GxUI* ui, float* zone):
2477 gx_ui::GxUiItemFloat(ui, zone),
2478 Gtk::Alignment(0.5,0.5,0,0)
2479 {
2480 add(fTuner);
2481 fTuner.show();
2482 }
2483
2484 void uiTuner::reflectZone()
2485 {
2486 fCache = *fZone;
2487 if (shownote == 1) {
2488 set_freq(gx_engine::midi.fConsta4);
2489 } else if (shownote == 0) {
2490 shownote = -1;
2491 }
2492 }
2493
2494 class GxWindowBox
2495 {
2496 private:
2497 bool on_window_delete_event(GdkEventAny* event,gpointer d );
2498 bool on_button_pressed(GdkEventButton* event);
2499
2500 public:
2501 Gtk::HBox window;
2502
2503 Gtk::HBox box;
2504 Gtk::HBox box1;
2505
2506 Gtk::VBox rbox;
2507 Gtk::Window m_regler_tooltip_window;
2508 ToggleCheckButton m_tmono_rack;
2509 ToggleCheckButton m_tstereo_rack;
2510 GxWindowBox(gx_ui::GxUI& ui,
2511 Glib::ustring titl,GtkWidget * d);
2512 ~GxWindowBox();
1694 uiTuner::uiTuner(gx_ui::GxUI* ui, float* zone)
1695 : gx_ui::GxUiItemFloat(ui, zone),
1696 Gtk::Alignment(0.5, 0.5, 0, 0) {
1697 add(fTuner);
1698 fTuner.show();
1699 }
1700
1701 void uiTuner::reflectZone() {
1702 fCache = *fZone;
1703 if (shownote == 1) {
1704 set_freq(gx_engine::midi.fConsta4);
1705 } else if (shownote == 0) {
1706 shownote = -1;
1707 }
1708 }
1709
1710 void GxMainInterface::addNumDisplay() {
1711 GxToolBox *box = new GxToolBox(*this,
1712 pb_gxrack_expose, _("tuner"), GTK_WIDGET(fShowTuner.gobj()));
1713
1714 box->rbox.add(fTuner);
1715 // box->window.set_size_request(200,140);
1716 gtk_box_pack_start(GTK_BOX(fBox[fTop]), GTK_WIDGET(box->window.gobj()), expand, fill, 0);
1717
1718 gw.tuner_widget = GTK_WIDGET(box->window.gobj());
1719
1720 GList* child_list = gtk_container_get_children(GTK_CONTAINER(gw.rack_tool_bar));
1721 GtkWidget *box1 = reinterpret_cast<GtkWidget *>(g_list_nth_data(child_list, 0));
1722 child_list = gtk_container_get_children(GTK_CONTAINER(box1));
1723 box1 = reinterpret_cast<GtkWidget *>(g_list_nth_data(child_list, 0));
1724 child_list = gtk_container_get_children(GTK_CONTAINER(box1));
1725 box1 = reinterpret_cast<GtkWidget *>(g_list_nth_data(child_list, 0));
1726 child_list = gtk_container_get_children(GTK_CONTAINER(box1));
1727 box1 = reinterpret_cast<GtkWidget *>(g_list_nth_data(child_list, 0));
1728 child_list = gtk_container_get_children(GTK_CONTAINER(box1));
1729 box1 = reinterpret_cast<GtkWidget *>(g_list_nth_data(child_list, 0));
1730 child_list = gtk_container_get_children(GTK_CONTAINER(box1));
1731 box1 = reinterpret_cast<GtkWidget *>(g_list_nth_data(child_list, 0));
1732 g_list_free(child_list);
1733
1734 GxTBox * tbox1 = new GxTBox(*this);
1735 tbox1->m_tcb.set_parameter(fShowTuner.get_parameter());
1736 tbox1->m_tcb.m_label.set_text(_("tuner"));
1737 tbox1->m_tcb.set_tooltip_text(_("Show tuner"));
1738 gtk_container_add(GTK_CONTAINER(box1), GTK_WIDGET(tbox1->m_tcb.gobj()));
1739 }
1740
1741 /* status icons in the main menu bar*/
1742 struct uiStatusDisplay : public gx_ui::GxUiItemFloat {
1743 GtkLabel* fLabel;
1744 int fPrecision;
1745
1746 uiStatusDisplay(gx_ui::GxUI* ui, float* zone, GtkLabel* label)
1747 : gx_ui::GxUiItemFloat(ui, zone), fLabel(label) {}
1748
1749 virtual void reflectZone() {
1750 float v = *fZone;
1751 fCache = v;
1752 if ((gx_engine::isMidiOn() == true) &&
1753 (gx_jack::gxjack.jcpu_load < 65.0)) {
1754 if (v > 0.0f) gtk_status_icon_set_from_pixbuf
1755 ( GTK_STATUS_ICON(gw.status_icon), GDK_PIXBUF(gw.ibm));
1756 else
1757 gtk_status_icon_set_from_pixbuf(GTK_STATUS_ICON(gw.status_icon),
1758 GDK_PIXBUF(gw.ib));
1759 } else if (gx_engine::isMidiOn() == false) {
1760 gtk_status_icon_set_from_pixbuf(GTK_STATUS_ICON(gw.status_icon),
1761 GDK_PIXBUF(gw.ib));
1762 } else {
1763 gtk_status_icon_set_from_pixbuf(GTK_STATUS_ICON(gw.status_icon),
1764 GDK_PIXBUF(gw.ibr));
1765 }
1766 }
25131767 };
25141768
2515 bool GxWindowBox::on_window_delete_event(GdkEventAny*, gpointer d)
2516 {
2517 gtk_check_menu_item_set_active(
2518 GTK_CHECK_MENU_ITEM(GTK_WIDGET(d)), FALSE
2519 );
2520 return false;
2521 }
2522
2523 bool GxWindowBox::on_button_pressed(GdkEventButton* event)
2524 {
2525 if( (event->type == GDK_BUTTON_PRESS) && (event->button == 3) ){
2526 const gchar * title = gtk_widget_get_name(GTK_WIDGET(window.gobj()));
2527 if(strcmp(title,"MonoRack")==0) {
2528 guint32 tim = gtk_get_current_event_time ();
2529 gtk_menu_popup (GTK_MENU(menu_mono_rack),NULL,NULL,NULL,(gpointer) menu_mono_rack,2,tim);
2530 return true;
2531 }
2532 else if (strcmp(title,"StereoRack")==0){
2533 guint32 tim = gtk_get_current_event_time ();
2534 gtk_menu_popup (GTK_MENU(menu_stereo_rack),NULL,NULL,NULL,(gpointer) menu_stereo_rack,2,tim);
2535 return true;
2536 }
2537 }
2538
2539 return false;
2540 }
2541
2542 GxWindowBox::GxWindowBox(gx_ui::GxUI& ui,
2543 Glib::ustring titl,GtkWidget * d):
2544 window(Gtk::WINDOW_TOPLEVEL),
2545 rbox(false, 0),
2546 m_regler_tooltip_window(Gtk::WINDOW_POPUP)
2547 {
2548 Glib::ustring title = titl;
2549 window.add_events(Gdk::BUTTON_PRESS_MASK);
2550 window.signal_delete_event().connect(
2551 sigc::bind<gpointer>(sigc::mem_fun(*this, &GxWindowBox::on_window_delete_event),d));
2552 window.add(box);
2553 window.signal_button_press_event().connect(
2554 sigc::mem_fun(*this, &GxWindowBox::on_button_pressed));
2555 box.show();
2556 rbox.show();
2557 }
2558
2559 class GxScrollBox
2560 {
2561 private:
2562
2563 bool on_window_delete_event(GdkEventAny* event,gpointer d );
2564 void on_rack_reorder_vertical();
2565 void on_rack_reorder_horizontal();
2566
2567 public:
2568 Gtk::HBox window;
2569 Gtk::ScrolledWindow m_scrolled_window;
2570 Gtk::ScrolledWindow m_scrolled_window2;
2571 Gtk::HBox box;
2572 Gtk::HBox box1;
2573 Gxw::PaintBox paintbox1;
2574 Gtk::VBox rbox;
2575 Gtk::VBox vbox;
2576 RadioCheckItem fOrderhRack;
2577 RadioCheckItem fOrdervRack;
2578 Gtk::RadioMenuItem::Group group;
2579 GxScrollBox(gx_ui::GxUI& ui,
2580 const char *pb_2, Glib::ustring titl,GtkWidget * d);
2581 ~GxScrollBox();
2582 };
2583
2584 bool GxScrollBox::on_window_delete_event(GdkEventAny*, gpointer d)
2585 {
2586 gtk_check_menu_item_set_active(
2587 GTK_CHECK_MENU_ITEM(GTK_WIDGET(d)), FALSE
2588 );
2589 return false;
2590 }
2591
2592 void GxScrollBox::on_rack_reorder_horizontal()
2593 {
2594 if (fOrderhRack.get_active()) { //horizontal
2595
2596 if(gx_gui::srack_widget) {
2597 paintbox1.hide();
2598 gx_gui::GxMainInterface* gui = gx_gui::GxMainInterface::instance();
2599 if(gtk_window_get_resizable(GTK_WINDOW (fWindow)))
2600 gtk_window_set_resizable(GTK_WINDOW (fWindow) , FALSE);
2601 gtk_widget_ref(gx_gui::srack_widget);
2602 GtkWidget *parent = gtk_widget_get_parent(GTK_WIDGET(gx_gui::srack_widget));
2603 gtk_container_remove(GTK_CONTAINER(parent), gx_gui::srack_widget);
2604 gtk_box_pack_start(GTK_BOX(box1.gobj()), gx_gui::srack_widget, false, true, 0);
2605 gtk_widget_unref(gx_gui::srack_widget);
2606 m_scrolled_window2.show();
2607 paintbox1.show();
2608 parent = gtk_widget_get_parent(GTK_WIDGET(gx_gui::rack_tool_bar));
2609
2610 if (strcmp(gtk_widget_get_name(parent),"gtkmm__GtkVBox")==0) {
2611 gtk_widget_ref(gx_gui::rack_tool_bar);
2612 gtk_widget_ref(gx_gui::tuner_widget);
2613 gtk_container_remove(GTK_CONTAINER(parent), gx_gui::rack_tool_bar);
2614 gtk_container_remove(GTK_CONTAINER(parent), gx_gui::tuner_widget);
2615 parent = gtk_widget_get_parent(GTK_WIDGET(parent));
2616 GList* child_list = gtk_container_get_children(GTK_CONTAINER(parent));
2617 parent = (GtkWidget *) g_list_nth_data(child_list,1);
2618 child_list = gtk_container_get_children(GTK_CONTAINER(parent));
2619 parent = (GtkWidget *) g_list_nth_data(child_list,0);
2620 child_list = gtk_container_get_children(GTK_CONTAINER(parent));
2621 parent = (GtkWidget *) g_list_nth_data(child_list,2);
2622 gtk_container_add(GTK_CONTAINER(parent), gx_gui::tuner_widget);
2623 parent = (GtkWidget *) g_list_nth_data(child_list,0);
2624 gtk_container_add(GTK_CONTAINER(parent), gx_gui::rack_tool_bar);
2625 gtk_widget_unref(gx_gui::rack_tool_bar);
2626 gtk_widget_unref(gx_gui::tuner_widget);
2627 g_list_free(child_list);
2628 }
2629
2630 gtk_widget_set_size_request (GTK_WIDGET (gui->RBox),-1, 460 );
2631 if (g_threads[7] == 0 || g_main_context_find_source_by_id(NULL, g_threads[7]) == NULL)
2632 g_threads[7] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 40, gx_gui::gx_set_resizeable,gpointer(fWindow),NULL);
2633 if (g_threads[6] == 0 || g_main_context_find_source_by_id(NULL, g_threads[6]) == NULL)
2634 g_threads[6] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 50, gx_gui::gx_set_default,gpointer(gui->RBox),NULL);
2635 }
2636 }
2637 }
2638
2639 void GxScrollBox::on_rack_reorder_vertical()
2640 {
2641 if (fOrdervRack.get_active()) { //vertical
2642
2643 if(gx_gui::srack_widget) {
2644 paintbox1.hide();
2645 gx_gui::GxMainInterface* gui = gx_gui::GxMainInterface::instance();
2646 if(gtk_window_get_resizable(GTK_WINDOW (fWindow)))
2647 gtk_window_set_resizable(GTK_WINDOW (fWindow) , FALSE);
2648 gtk_widget_ref(gx_gui::srack_widget);
2649 GtkWidget *parent = gtk_widget_get_parent(GTK_WIDGET(gx_gui::srack_widget));
2650 gtk_container_remove(GTK_CONTAINER(parent), gx_gui::srack_widget);
2651 gtk_box_pack_start(GTK_BOX(rbox.gobj()), gx_gui::srack_widget, false, true, 0);
2652 gtk_widget_unref(gx_gui::srack_widget);
2653 m_scrolled_window2.hide();
2654 paintbox1.show();
2655 parent = gtk_widget_get_parent(GTK_WIDGET(gx_gui::rack_tool_bar));
2656
2657 if (strcmp(gtk_widget_get_name(parent),"gtkmm__GtkHBox")==0) {
2658 gtk_widget_ref(gx_gui::rack_tool_bar);
2659 gtk_widget_ref(gx_gui::tuner_widget);
2660 gtk_container_remove(GTK_CONTAINER(parent), gx_gui::rack_tool_bar);
2661 parent = gtk_widget_get_parent(GTK_WIDGET(gx_gui::tuner_widget));
2662 gtk_container_remove(GTK_CONTAINER(parent), gx_gui::tuner_widget);
2663 parent = gtk_widget_get_parent(GTK_WIDGET(parent));
2664 parent = gtk_widget_get_parent(GTK_WIDGET(parent));
2665 parent = gtk_widget_get_parent(GTK_WIDGET(parent));
2666 GList* child_list = gtk_container_get_children(GTK_CONTAINER(parent));
2667 parent = (GtkWidget *) g_list_nth_data(child_list,0);
2668 gtk_container_add(GTK_CONTAINER(parent), gx_gui::rack_tool_bar);
2669 gtk_container_add(GTK_CONTAINER(parent), gx_gui::tuner_widget);
2670 gtk_widget_unref(gx_gui::rack_tool_bar);
2671 gtk_widget_unref(gx_gui::tuner_widget);
2672 g_list_free(child_list);
2673 }
2674
2675 gtk_widget_set_size_request (GTK_WIDGET (gui->RBox),-1, 460 );
2676 if (g_threads[7] == 0 || g_main_context_find_source_by_id(NULL, g_threads[7]) == NULL)
2677 g_threads[7] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 40, gx_gui::gx_set_resizeable,gpointer(fWindow),NULL);
2678 if (g_threads[6] == 0 || g_main_context_find_source_by_id(NULL, g_threads[6]) == NULL)
2679 g_threads[6] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE + 10, 50, gx_gui::gx_set_default,gpointer(gui->RBox),NULL);
2680 }
2681 }
2682 }
2683
2684 GxScrollBox::GxScrollBox(gx_ui::GxUI& ui,
2685 const char *pb_2, Glib::ustring titl,GtkWidget * d):
2686 window(Gtk::WINDOW_TOPLEVEL),
2687 rbox(false, 4)
2688 {
2689 Glib::ustring title = titl;
2690 window.add_events(Gdk::BUTTON_PRESS_MASK);
2691 m_scrolled_window.set_policy(Gtk::POLICY_NEVER,Gtk::POLICY_ALWAYS);
2692 m_scrolled_window.set_shadow_type(Gtk::SHADOW_NONE);
2693 m_scrolled_window2.set_policy(Gtk::POLICY_NEVER,Gtk::POLICY_ALWAYS);
2694 m_scrolled_window2.set_shadow_type(Gtk::SHADOW_NONE);
2695 paintbox1.set_border_width(18);
2696 paintbox1.property_paint_func() = pb_2;
2697 window.signal_delete_event().connect(
2698 sigc::bind<gpointer>(sigc::mem_fun(*this, &GxScrollBox::on_window_delete_event),d));
2699 paintbox1.add(m_scrolled_window);
2700 paintbox1.add(m_scrolled_window2);
2701 m_scrolled_window.add(box);
2702 m_scrolled_window2.add(vbox);
2703 window.add(paintbox1);
2704 fOrderhRack.signal_activate().connect(
2705 sigc::mem_fun(*this, &GxScrollBox::on_rack_reorder_horizontal));
2706 fOrdervRack.signal_activate().connect(
2707 sigc::mem_fun(*this, &GxScrollBox::on_rack_reorder_vertical));
2708
2709 const gchar * mtitle = "order Rack vertical";
2710 set_label(fOrdervRack, _(mtitle));
2711 group = fOrdervRack.get_group();
2712 gx_gui::GxMainInterface* gui = gx_gui::GxMainInterface::instance();
2713 gtk_menu_shell_append(GTK_MENU_SHELL(gui->getMenu("PluginMenu")), GTK_WIDGET(fOrdervRack.gobj()));
2714 fOrdervRack.set_parameter(new SwitchParameter("system.order_rack_v",true,false));
2715 fOrdervRack.show();
2716
2717 mtitle = "order Rack horizotal";
2718 set_label(fOrderhRack, _(mtitle));
2719 fOrderhRack.set_group(group);
2720 gtk_menu_shell_append(GTK_MENU_SHELL(gui->getMenu("PluginMenu")), GTK_WIDGET(fOrderhRack.gobj()));
2721 fOrderhRack.set_active(false);
2722 fOrderhRack.set_parameter(new SwitchParameter("system.order_rack_h",true,false));
2723 fOrderhRack.show();
2724
2725 paintbox1.show();
2726 box.show();
2727 m_scrolled_window.show();
2728 //m_scrolled_window2.show();
2729 rbox.show();
2730 }
2731
2732 class GxToolBox
2733 {
2734 private:
2735 bool on_window_delete_event(GdkEventAny* event,gpointer d );
2736 bool on_button_pressed(GdkEventButton* event);
2737 public:
2738 Gtk::VBox window;
2739 Gtk::ScrolledWindow m_scrolled_window;
2740 Gtk::HBox box;
2741 Gtk::HBox box1;
2742 Gxw::PaintBox paintbox;
2743 Gxw::PaintBox paintbox1;
2744 Gtk::VBox rbox;
2745 Gtk::Window m_regler_tooltip_window;
2746 ToggleCheckButton m_tmono_rack;
2747 ToggleCheckButton m_tstereo_rack;
2748 GxToolBox(gx_ui::GxUI& ui,
2749 const char *pb_2, Glib::ustring titl,GtkWidget * d);
2750 ~GxToolBox();
2751 };
2752
2753 bool GxToolBox::on_window_delete_event(GdkEventAny*, gpointer d)
2754 {
2755 gtk_check_menu_item_set_active(
2756 GTK_CHECK_MENU_ITEM(GTK_WIDGET(d)), FALSE
2757 );
2758 return false;
2759 }
2760
2761
2762 bool GxToolBox::on_button_pressed(GdkEventButton* event)
2763 {
2764 if( (event->type == GDK_BUTTON_PRESS) && (event->button == 3) ){
2765 const gchar * title = gtk_widget_get_name(GTK_WIDGET(window.gobj()));
2766 if(strcmp(title,"MonoRack")==0) {
2767 guint32 tim = gtk_get_current_event_time ();
2768 gtk_menu_popup (GTK_MENU(menu_mono_rack),NULL,NULL,NULL,(gpointer) menu_mono_rack,2,tim);
2769 return true;
2770 }
2771 else if (strcmp(title,"StereoRack")==0){
2772 guint32 tim = gtk_get_current_event_time ();
2773 gtk_menu_popup (GTK_MENU(menu_stereo_rack),NULL,NULL,NULL,(gpointer) menu_stereo_rack,2,tim);
2774 return true;
2775 }
2776 }
2777 return false;
2778 }
2779
2780 GxToolBox::GxToolBox(gx_ui::GxUI& ui,
2781 const char *pb_2, Glib::ustring titl,GtkWidget * d):
2782 rbox(false, 4),
2783 m_regler_tooltip_window(Gtk::WINDOW_POPUP)
2784 {
2785 Glib::ustring title = titl;
2786 window.add_events(Gdk::BUTTON_PRESS_MASK);
2787 m_scrolled_window.set_policy(Gtk::POLICY_NEVER,Gtk::POLICY_AUTOMATIC);
2788 paintbox1.set_border_width(18);
2789 paintbox.set_border_width(4);
2790 paintbox1.property_paint_func() = pb_2;
2791 paintbox.property_paint_func() = pb_rectangle_skin_color_expose;
2792 window.signal_delete_event().connect(
2793 sigc::bind<gpointer>(sigc::mem_fun(*this, &GxToolBox::on_window_delete_event),d));
2794 box.add(rbox);
2795 paintbox1.add(m_scrolled_window);
2796 m_scrolled_window.add(paintbox);
2797 paintbox.add(box);
2798 window.add(paintbox1);
2799 window.signal_button_press_event().connect(
2800 sigc::mem_fun(*this, &GxToolBox::on_button_pressed));
2801 paintbox1.show();
2802 box.show();
2803 m_scrolled_window.show();
2804 rbox.show();
2805 }
2806
2807 void GxMainInterface::addNumDisplay()
2808 {
2809 GxToolBox *box = new GxToolBox(*this,
2810 pb_gxrack_expose, _("tuner"), GTK_WIDGET(fShowTuner.gobj()));
2811
2812 box->rbox.add(fTuner);
2813 //box->window.set_size_request(200,140);
2814 gtk_box_pack_start (GTK_BOX(fBox[fTop]), GTK_WIDGET(box->window.gobj()), expand, fill, 0);
2815
2816 tuner_widget = GTK_WIDGET(box->window.gobj());
2817
2818 GList* child_list = gtk_container_get_children(GTK_CONTAINER(rack_tool_bar));
2819 GtkWidget *box1 = (GtkWidget *) g_list_nth_data(child_list,0);
2820 child_list = gtk_container_get_children(GTK_CONTAINER(box1));
2821 box1 = (GtkWidget *) g_list_nth_data(child_list,0);
2822 child_list = gtk_container_get_children(GTK_CONTAINER(box1));
2823 box1 = (GtkWidget *) g_list_nth_data(child_list,0);
2824 child_list = gtk_container_get_children(GTK_CONTAINER(box1));
2825 box1 = (GtkWidget *) g_list_nth_data(child_list,0);
2826 child_list = gtk_container_get_children(GTK_CONTAINER(box1));
2827 box1 = (GtkWidget *) g_list_nth_data(child_list,0);
2828 child_list = gtk_container_get_children(GTK_CONTAINER(box1));
2829 box1 = (GtkWidget *) g_list_nth_data(child_list,0);
2830 g_list_free(child_list);
2831
2832 GxTBox * tbox1 = new GxTBox(*this);
2833 tbox1->m_tcb.set_parameter(fShowTuner.get_parameter());
2834 tbox1->m_tcb.m_label.set_text(_("tuner"));
2835 tbox1->m_tcb.set_tooltip_text(_("show tuner"));
2836 gtk_container_add (GTK_CONTAINER(box1), GTK_WIDGET(tbox1->m_tcb.gobj()));
2837
2838 }
2839
2840 void GxMainInterface::openToolBar(const char* label)
2841 {
2842 GxToolBox *box = new GxToolBox(*this,
2843 pb_gxrack_expose, _("Plugin Bar"), GTK_WIDGET(fShowToolBar.gobj()));
2844
2845 //box->window.set_size_request(-1,524);
2846 rack_tool_bar = GTK_WIDGET(box->window.gobj());
2847 tBox = GTK_WIDGET(box->rbox.gobj());
2848 box->rbox.add(box->box1);
2849 box->m_tmono_rack.set_parameter(fShowRack.get_parameter());
2850 box->m_tstereo_rack.set_parameter(fShowSRack.get_parameter());
2851 box->m_tmono_rack.m_label.set_text(_("mono rack"));
2852 box->m_tstereo_rack.m_label.set_text(_("stereo rack"));
2853
2854 box->box1.pack_start(box->m_tmono_rack,true,true);
2855 box->box1.pack_end(box->m_tstereo_rack,true,true);
2856 box->m_tmono_rack.set_tooltip_text(_("show mono rack"));
2857 box->m_tstereo_rack.set_tooltip_text(_("show stereo rack"));
2858 box->box1.show_all();
2859 gtk_box_pack_start (GTK_BOX(fBox[fTop]), GTK_WIDGET(box->window.gobj()), expand, fill, 0);
2860 pushBox(kBoxMode, GTK_WIDGET(tBox));
2861 }
2862
2863 void GxMainInterface::openPlugBox(const char* label)
2864 {
2865 GxWindowBox *plugbox = new GxWindowBox(*this,
2866 label, GTK_WIDGET(fShowRack.gobj()));
2867 rack_widget = GTK_WIDGET(plugbox->window.gobj());
2868 plugbox->box.pack_start(plugbox->rbox, true, true, 0);
2869 plugbox->window.set_name("MonoRack");
2870 plugbox->window.set_tooltip_text(_("Mono Rack, right click pop up the plugin menu"));
2871 rBox = GTK_WIDGET(plugbox->rbox.gobj());
2872 gtk_box_pack_start(GTK_BOX(fBox[fTop]), GTK_WIDGET(plugbox->window.gobj()), false, true, 0);
2873 pushBox(kBoxMode, GTK_WIDGET(rBox));
2874 }
2875
2876 void GxMainInterface::openScrollBox(const char* label)
2877 {
2878 GxScrollBox *scrollbox = new GxScrollBox(*this,
2879 pb_gxrack_expose, label, GTK_WIDGET(fShowRack.gobj()));
2880 scrollbox->box.pack_start(scrollbox->rbox, true, true, 0);
2881 //scrollbox->box.pack_start(scrollbox->vbox, false, false, 0);
2882 scrollbox->vbox.pack_start(scrollbox->box1, false, false, 0);
2883
2884 RBox = GTK_WIDGET(scrollbox->window.gobj());
2885 scrollbox->window.set_name("Rack");
2886 scrollbox->window.set_size_request(-1,460);
2887 scrollbox->rbox.show();
2888 scrollbox->box1.show();
2889 scrollbox->vbox.show();
2890 gtk_box_pack_start (GTK_BOX(fBox[fTop]), GTK_WIDGET(scrollbox->window.gobj()), expand, true, 0);
2891 pushBox(kBoxMode, GTK_WIDGET(scrollbox->rbox.gobj()));
2892 }
2893
2894 void GxMainInterface::openAmpBox(const char* label)
2895 {
2896 GxWindowBox *box = new GxWindowBox(*this,
2897 label, GTK_WIDGET(fShowSRack.gobj()));
2898 box->box.pack_start(box->rbox, true, true, 0);
2899 srack_widget = GTK_WIDGET(box->window.gobj());
2900 box->window.set_name("StereoRack");
2901 box->window.set_tooltip_text(_("Stereo Rack, right click pop up the plugin menu"));
2902 sBox = GTK_WIDGET(box->rbox.gobj());
2903 gtk_box_pack_start(GTK_BOX(fBox[fTop]), GTK_WIDGET(box->window.gobj()), true, true, 0);
2904 pushBox(kBoxMode, GTK_WIDGET(sBox));
2905 }
2906
2907 struct uiStatusDisplay : public gx_ui::GxUiItemFloat
2908 {
2909 GtkLabel* fLabel;
2910 int fPrecision;
2911
2912 uiStatusDisplay(gx_ui::GxUI* ui, float* zone, GtkLabel* label)
2913 : gx_ui::GxUiItemFloat(ui, zone), fLabel(label) {}
2914
2915 virtual void reflectZone()
2916 {
2917 float v = *fZone;
2918 fCache = v;
2919 if ((gx_engine::isMidiOn() == true) &&
2920 (gx_jack::jcpu_load < 65.0))
2921 {
2922 if (v > 0.0f) gtk_status_icon_set_from_pixbuf ( GTK_STATUS_ICON(status_icon), GDK_PIXBUF(ibm));
2923 else gtk_status_icon_set_from_pixbuf ( GTK_STATUS_ICON(status_icon), GDK_PIXBUF(ib));
2924 }
2925 else if (gx_engine::isMidiOn() == false)
2926 {
2927 gtk_status_icon_set_from_pixbuf ( GTK_STATUS_ICON(status_icon), GDK_PIXBUF(ib));
2928 }
2929 else gtk_status_icon_set_from_pixbuf ( GTK_STATUS_ICON(status_icon), GDK_PIXBUF(ibr));
2930 }
2931 };
2932
2933 void GxMainInterface::addStatusDisplay(const char* label, float* zone )
2934 {
2935 GtkWidget* lw = gtk_label_new("");
2936 new uiStatusDisplay(this, zone, GTK_LABEL(lw));
2937 openFrameBox(label);
2938 addWidget(label, lw);
2939 closeBox();
2940 gtk_widget_hide(lw);
2941 }
2942
2943
2944
2945
2946 bool GxMainInterface::on_refresh_oscilloscope()
2947 {
2948 static struct {
2949 int load, frames;
2950 jack_nframes_t bsize;
2951 bool rt;
2952 } oc;
2953 int load = int(round(gx_jack::jcpu_load));
2954 if (!oc.bsize || oc.load != load) {
2955 oc.load = load;
2956 fWaveView.set_text(
2957 (boost::format(_("dsp load %1% %%")) % oc.load).str().c_str(),
2958 Gtk::CORNER_TOP_LEFT);
2959 }
2960 int frames = gx_jack::time_is/100000;
2961 if (!oc.bsize || oc.frames != frames) {
2962 oc.frames = frames;
2963 fWaveView.set_text(
2964 (boost::format(_("ht frames %1%")) % oc.frames).str().c_str(),
2965 Gtk::CORNER_BOTTOM_LEFT);
2966 }
2967 if (!oc.bsize || oc.rt != gx_jack::is_rt) {
2968 oc.rt = gx_jack::is_rt;
2969 fWaveView.set_text(
2970 oc.rt ? _("RT mode yes ") : _("RT mode <span color=\"#cc1a1a\">NO</span>"),
2971 Gtk::CORNER_BOTTOM_RIGHT);
2972 }
2973 if (!oc.bsize || oc.bsize != gx_jack::jack_bs) {
2974 oc.bsize = gx_jack::jack_bs;
2975 fWaveView.set_text(
2976 (boost::format(_("latency %1%")) % oc.bsize).str().c_str(),
2977 Gtk::CORNER_TOP_RIGHT);
2978 }
2979 fWaveView.queue_draw();
2980 if (showwave) {
2981 return TRUE;
2982 } else {
2983 return FALSE;
2984 }
2985 }
2986
2987
2988 void GxMainInterface::addLiveWaveDisplay(const char* label, float* zone , float* zone1)
2989 {
2990 GtkWidget * box = gtk_hbox_new(false, 4);
2991 GtkWidget * box1 = gtk_vbox_new(false, 0);
2992 GtkWidget * box2 = gtk_vbox_new(false, 0);
2993 GtkWidget * e_box = gtk_event_box_new();
2994 //gtk_container_set_border_width (GTK_CONTAINER(e_box),2);
2995 g_signal_connect(box, "expose-event", G_CALLBACK(conv_widget_expose), NULL);
2996 gtk_widget_set_size_request(box, 303, 82);
2997 gtk_widget_set_size_request(e_box, 284, 54);
2998 gtk_container_set_border_width(GTK_CONTAINER (box), 12);
2999 gtk_container_add(GTK_CONTAINER(e_box), GTK_WIDGET(fWaveView.gobj()));
3000 //gtk_container_add(GTK_CONTAINER(box),e_box );
3001 gtk_box_pack_start (GTK_BOX(box), box1, true, true, 0);
3002 gtk_box_pack_start (GTK_BOX(box), e_box, false, false, 0);
3003 gtk_box_pack_start (GTK_BOX(box), box2, true, true, 0);
3004 addWidget(label, box);
3005 fWaveView.hide(); // was show()'n by addWidget
3006 fWaveView.property_text_pos_left() = 1.5;
3007 fWaveView.property_text_pos_right() = 77;
3008 fWaveView.set_multiplicator(150.,250.);
3009 gtk_widget_show(box);
3010 gtk_widget_hide(e_box);
3011 }
3012
3013 void GxMainInterface::set_mouse_mode()
3014 {
3015 if (fSetMouse.get_active()) {
3016 Gxw::Knob::set_jump_to_mouse(false);
3017 } else {
3018 Gxw::Knob::set_jump_to_mouse(true);
3019 }
1769 void GxMainInterface::addStatusDisplay(const char* label, float* zone ) {
1770 GtkWidget* lw = gtk_label_new("");
1771 new uiStatusDisplay(this, zone, GTK_LABEL(lw));
1772 openFrameBox(label);
1773 addWidget(label, lw);
1774 closeBox();
1775 gtk_widget_hide(lw);
1776 }
1777
1778 /* oscilloscope handling*/
1779 bool GxMainInterface::on_refresh_oscilloscope() {
1780 static struct {
1781 int load, frames;
1782 jack_nframes_t bsize;
1783 bool rt;
1784 } oc;
1785 int load = static_cast<int>(round(gx_jack::gxjack.jcpu_load));
1786 if (!oc.bsize || oc.load != load) {
1787 oc.load = load;
1788 fWaveView.set_text(
1789 (boost::format(_("dsp load %1% %%")) % oc.load).str().c_str(),
1790 Gtk::CORNER_TOP_LEFT);
1791 }
1792 int frames = gx_jack::gxjack.time_is/100000;
1793 if (!oc.bsize || oc.frames != frames) {
1794 oc.frames = frames;
1795 fWaveView.set_text(
1796 (boost::format(_("ht frames %1%")) % oc.frames).str().c_str(),
1797 Gtk::CORNER_BOTTOM_LEFT);
1798 }
1799 if (!oc.bsize || oc.rt != gx_jack::gxjack.is_rt) {
1800 oc.rt = gx_jack::gxjack.is_rt;
1801 fWaveView.set_text(
1802 oc.rt ? _("RT mode yes ") : _("RT mode <span color=\"#cc1a1a\">NO</span>"),
1803 Gtk::CORNER_BOTTOM_RIGHT);
1804 }
1805 if (!oc.bsize || oc.bsize != gx_jack::gxjack.jack_bs) {
1806 oc.bsize = gx_jack::gxjack.jack_bs;
1807 fWaveView.set_text(
1808 (boost::format(_("latency %1%")) % oc.bsize).str().c_str(),
1809 Gtk::CORNER_TOP_RIGHT);
1810 }
1811 fWaveView.queue_draw();
1812 if (showwave) {
1813 return TRUE;
1814 } else {
1815 return FALSE;
1816 }
1817 }
1818
1819 void GxMainInterface::addLiveWaveDisplay(const char* label, float* zone , float* zone1) {
1820 GtkWidget * box = gtk_hbox_new(false, 4);
1821 GtkWidget * box1 = gtk_vbox_new(false, 0);
1822 GtkWidget * box2 = gtk_vbox_new(false, 0);
1823 GtkWidget * e_box = gtk_event_box_new();
1824 // gtk_container_set_border_width (GTK_CONTAINER(e_box),2);
1825 g_signal_connect(box, "expose-event", G_CALLBACK(gx_cairo::conv_widget_expose), NULL);
1826 gtk_widget_set_size_request(box, 303, 82);
1827 gtk_widget_set_size_request(e_box, 284, 54);
1828 gtk_container_set_border_width(GTK_CONTAINER(box), 12);
1829 gtk_container_add(GTK_CONTAINER(e_box), GTK_WIDGET(fWaveView.gobj()));
1830 // gtk_container_add(GTK_CONTAINER(box),e_box );
1831 gtk_box_pack_start(GTK_BOX(box), box1, true, true, 0);
1832 gtk_box_pack_start(GTK_BOX(box), e_box, false, false, 0);
1833 gtk_box_pack_start(GTK_BOX(box), box2, true, true, 0);
1834 addWidget(label, box);
1835 fWaveView.hide(); // was show()'n by addWidget
1836 fWaveView.property_text_pos_left() = 1.5;
1837 fWaveView.property_text_pos_right() = 77;
1838 fWaveView.set_multiplicator(150., 250.);
1839 gtk_widget_show(box);
1840 gtk_widget_hide(e_box);
1841 }
1842
1843 /* set knobs in linear or radial mode*/
1844 void GxMainInterface::set_mouse_mode() {
1845 if (fSetMouse.get_active()) {
1846 Gxw::Knob::set_jump_to_mouse(false);
1847 } else {
1848 Gxw::Knob::set_jump_to_mouse(true);
1849 }
30201850 }
30211851
30221852 //----------------------------- main menu ----------------------------
3023 void GxMainInterface::addMainMenu()
3024 {
3025 /*-- Declare the GTK Widgets used in the menu --*/
3026 GtkWidget* menucont; // menu container
3027 GtkWidget* menupix; // menu container
3028 GtkWidget* hbox; // top menu bar box container
3029
3030 /*------------------ TOP Menu BAR ------------------*/
3031 hbox = gtk_hbox_new(FALSE, 0);
3032
3033 /*-- Create the menu bar --*/
3034 menucont = gtk_menu_bar_new();
3035 gtk_box_pack_start(GTK_BOX(hbox), menucont, TRUE, TRUE, 0);
3036
3037 /*-- Create the pixmap menu bar --*/
3038 menupix = gtk_menu_bar_new();
3039 gtk_box_pack_end(GTK_BOX(hbox), menupix, TRUE, TRUE, 0);
3040
3041 /*-- set packdirection for pixmaps from right to left --*/
3042 gtk_menu_bar_set_pack_direction(GTK_MENU_BAR(menupix),GTK_PACK_DIRECTION_RTL);
3043
3044 /*-- Engine on/off and status --*/
3045 // set up ON image: shown by default
3046 string img_path = gx_pixmap_dir + "gx_on.png";
3047
3048 gx_engine_on_image = gtk_image_menu_item_new_with_label("");
3049 GtkWidget* engineon = gtk_image_new_from_file(img_path.c_str());
3050 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(gx_engine_on_image),engineon);
3051 gtk_menu_bar_append (GTK_MENU_BAR(menupix), gx_engine_on_image);
3052 GtkTooltips* comandlin = gtk_tooltips_new ();
3053
3054 gtk_tooltips_set_tip(GTK_TOOLTIPS (comandlin),
3055 gx_engine_on_image, _("engine is on"), "engine state.");
3056 gtk_widget_show(gx_engine_on_image);
3057
3058 // set up OFF image: hidden by default
3059 img_path = gx_pixmap_dir + "gx_off.png";
3060
3061 gx_engine_off_image = gtk_image_menu_item_new_with_label("");
3062 GtkWidget* engineoff = gtk_image_new_from_file(img_path.c_str());
3063 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(gx_engine_off_image),engineoff);
3064 gtk_menu_bar_append (GTK_MENU_BAR(menupix), gx_engine_off_image);
3065 gtk_tooltips_set_tip(GTK_TOOLTIPS (comandlin),
3066 gx_engine_off_image, _("engine is off"), "engine state.");
3067 gtk_widget_hide(gx_engine_off_image);
3068
3069 // set up BYPASS image: hidden by default
3070 img_path = gx_pixmap_dir + "gx_bypass.png";
3071
3072 gx_engine_bypass_image = gtk_image_menu_item_new_with_label("");
3073 GtkWidget* engineby = gtk_image_new_from_file(img_path.c_str());
3074 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(gx_engine_bypass_image),engineby);
3075 gtk_menu_bar_append (GTK_MENU_BAR(menupix), gx_engine_bypass_image);
3076 gtk_tooltips_set_tip(GTK_TOOLTIPS (comandlin),
3077 gx_engine_bypass_image, _("engine is in bypass mode"), "engine state.");
3078 gtk_widget_hide(gx_engine_bypass_image);
3079
3080
3081 /*-- Jack server status image --*/
3082 // jackd ON image
3083 img_path = gx_pixmap_dir + "jackd_on.png";
3084
3085 gx_jackd_on_image = gtk_image_menu_item_new_with_label("");
3086 GtkWidget* jackstateon = gtk_image_new_from_file(img_path.c_str());
3087 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(gx_jackd_on_image),jackstateon);
3088 gtk_menu_bar_append (GTK_MENU_BAR(menupix), gx_jackd_on_image);
3089
3090 GtkTooltips* comandline = gtk_tooltips_new ();
3091
3092 gtk_tooltips_set_tip(GTK_TOOLTIPS (comandline),
3093 gx_jackd_on_image, _("jack server is connected"), "jack server state.");
3094
3095 gtk_widget_show(gx_jackd_on_image);
3096
3097 // jackd OFF image: hidden by default
3098 img_path = gx_pixmap_dir + "jackd_off.png";
3099
3100 gx_jackd_off_image = gtk_image_menu_item_new_with_label("");
3101 GtkWidget* jackstateoff = gtk_image_new_from_file(img_path.c_str());
3102 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(gx_jackd_off_image),jackstateoff);
3103 gtk_menu_bar_append (GTK_MENU_BAR(menupix), gx_jackd_off_image);
3104 gtk_tooltips_set_tip(GTK_TOOLTIPS (comandline),
3105 gx_jackd_off_image, _("jack server is unconnected"), "jack server state.");
3106 gtk_widget_hide(gx_jackd_off_image);
3107
3108
3109 /* ----------------------------------------------------------- */
3110 fMenuList["Top"] = menucont;
3111
3112 addEngineMenu();
3113 addPresetMenu();
3114 addPluginMenu();
3115 addAmpMenu();
3116 addOptionMenu();
3117 addAboutMenu();
3118
3119 /*---------------- add menu to main window box----------------*/
3120 gtk_box_pack_start (GTK_BOX (fBox[fTop]), hbox , FALSE, FALSE, 0);
3121 gtk_widget_show(menucont);
3122 gtk_widget_show(menupix);
3123 gtk_widget_show(hbox);
1853 void GxMainInterface::addMainMenu() {
1854 /*-- Declare the GTK Widgets used in the menu --*/
1855 GtkWidget* menucont; // menu container
1856 GtkWidget* menupix; // menu container
1857 GtkWidget* hbox; // top menu bar box container
1858
1859 /*------------------ TOP Menu BAR ------------------*/
1860 hbox = gtk_hbox_new(FALSE, 0);
1861
1862 /*-- Create the menu bar --*/
1863 menucont = gtk_menu_bar_new();
1864 gtk_box_pack_start(GTK_BOX(hbox), menucont, TRUE, TRUE, 0);
1865
1866 /*-- Create the pixmap menu bar --*/
1867 menupix = gtk_menu_bar_new();
1868 gtk_box_pack_end(GTK_BOX(hbox), menupix, TRUE, TRUE, 0);
1869
1870 /*-- set packdirection for pixmaps from right to left --*/
1871 gtk_menu_bar_set_pack_direction(GTK_MENU_BAR(menupix), GTK_PACK_DIRECTION_RTL);
1872
1873 /*-- Engine on/off and status --*/
1874 // set up ON image: shown by default
1875 string img_path = gx_system::gx_pixmap_dir + "gx_on.png";
1876
1877 gw.gx_engine_on_image = gtk_image_menu_item_new_with_label("");
1878 GtkWidget* engineon = gtk_image_new_from_file(img_path.c_str());
1879 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(gw.gx_engine_on_image), engineon);
1880 gtk_menu_bar_append(GTK_MENU_BAR(menupix), gw.gx_engine_on_image);
1881 GtkTooltips* comandlin = gtk_tooltips_new();
1882
1883 gtk_tooltips_set_tip(GTK_TOOLTIPS(comandlin),
1884 gw.gx_engine_on_image, _("engine is on"), "engine state.");
1885 gtk_widget_show(gw.gx_engine_on_image);
1886
1887 // set up OFF image: hidden by default
1888 img_path = gx_system::gx_pixmap_dir + "gx_off.png";
1889
1890 gw.gx_engine_off_image = gtk_image_menu_item_new_with_label("");
1891 GtkWidget* engineoff = gtk_image_new_from_file(img_path.c_str());
1892 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(gw.gx_engine_off_image), engineoff);
1893 gtk_menu_bar_append(GTK_MENU_BAR(menupix), gw.gx_engine_off_image);
1894 gtk_tooltips_set_tip(GTK_TOOLTIPS(comandlin),
1895 gw.gx_engine_off_image, _("engine is off"), "engine state.");
1896 gtk_widget_hide(gw.gx_engine_off_image);
1897
1898 // set up BYPASS image: hidden by default
1899 img_path = gx_system::gx_pixmap_dir + "gx_bypass.png";
1900
1901 gw.gx_engine_bypass_image = gtk_image_menu_item_new_with_label("");
1902 GtkWidget* engineby = gtk_image_new_from_file(img_path.c_str());
1903 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(gw.gx_engine_bypass_image), engineby);
1904 gtk_menu_bar_append(GTK_MENU_BAR(menupix), gw.gx_engine_bypass_image);
1905 gtk_tooltips_set_tip(GTK_TOOLTIPS(comandlin),
1906 gw.gx_engine_bypass_image, _("engine is in bypass mode"), "engine state.");
1907 gtk_widget_hide(gw.gx_engine_bypass_image);
1908
1909
1910 /*-- Jack server status image --*/
1911 // jackd ON image
1912 img_path = gx_system::gx_pixmap_dir + "jackd_on.png";
1913
1914 gw.gx_jackd_on_image = gtk_image_menu_item_new_with_label("");
1915 GtkWidget* jackstateon = gtk_image_new_from_file(img_path.c_str());
1916 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(gw.gx_jackd_on_image), jackstateon);
1917 gtk_menu_bar_append(GTK_MENU_BAR(menupix), gw.gx_jackd_on_image);
1918
1919 GtkTooltips* comandline = gtk_tooltips_new();
1920
1921 gtk_tooltips_set_tip(GTK_TOOLTIPS(comandline),
1922 gw.gx_jackd_on_image, _("jack server is connected"), "jack server state.");
1923
1924 gtk_widget_show(gw.gx_jackd_on_image);
1925
1926 // jackd OFF image: hidden by default
1927 img_path = gx_system::gx_pixmap_dir + "jackd_off.png";
1928
1929 gw.gx_jackd_off_image = gtk_image_menu_item_new_with_label("");
1930 GtkWidget* jackstateoff = gtk_image_new_from_file(img_path.c_str());
1931 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(gw.gx_jackd_off_image), jackstateoff);
1932 gtk_menu_bar_append(GTK_MENU_BAR(menupix), gw.gx_jackd_off_image);
1933 gtk_tooltips_set_tip(GTK_TOOLTIPS(comandline),
1934 gw.gx_jackd_off_image, _("jack server is unconnected"),
1935 "jack server state.");
1936 gtk_widget_hide(gw.gx_jackd_off_image);
1937
1938
1939 /* ----------------------------------------------------------- */
1940 fMenuList["Top"] = menucont;
1941
1942 addEngineMenu();
1943 addPresetMenu();
1944 addPluginMenu();
1945 addAmpMenu();
1946 addOptionMenu();
1947 addAboutMenu();
1948
1949 /*---------------- add menu to main window box----------------*/
1950 gtk_box_pack_start(GTK_BOX(fBox[fTop]), hbox , FALSE, FALSE, 0);
1951 gtk_widget_show(menucont);
1952 gtk_widget_show(menupix);
1953 gtk_widget_show(hbox);
31241954 }
31251955
31261956
31271957
31281958 //----------------------------- engine menu ----------------------------
3129 void GxMainInterface::addEngineMenu()
3130 {
3131 GtkWidget* menulabel; // menu label
3132 //GtkWidget* menucont; // menu container use menuh for systray menu here
3133 GtkWidget* menuitem; // menu item
3134 GSList * group = NULL;
3135
3136 /*---------------- Create Engine menu items ------------------*/
3137 menuh = fMenuList["Top"];
3138
3139 menulabel = gtk_menu_item_new_with_mnemonic (_("_Engine"));
3140 gtk_menu_bar_append (GTK_MENU_BAR(menuh), menulabel);
3141 gtk_widget_show(menulabel);
3142
3143 /*-- Create Engine submenu --*/
3144 menuh = gtk_menu_new();
3145 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menulabel), menuh);
3146 gtk_widget_show(menuh);
3147 fMenuList["Engine"] = menuh;
3148
3149 /*-- Create Engine start / stop item --*/
3150 group = NULL;
3151
3152 menuitem = gtk_check_menu_item_new_with_mnemonic (_("Engine _Start / _Stop"));
3153 gtk_widget_add_accelerator(menuitem, "activate", fAccelGroup,
3154 GDK_space, GDK_NO_MOD_MASK, GTK_ACCEL_VISIBLE);
3155
3156 gtk_menu_shell_append(GTK_MENU_SHELL(menuh), menuitem);
3157 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menuitem), TRUE);
3158 g_signal_connect (GTK_OBJECT (menuitem), "activate",
3159 G_CALLBACK (gx_engine_switch), (gpointer)0);
3160 gx_engine_item = menuitem; // save into global var
3161 gtk_widget_show (menuitem);
3162
3163 /*-- Create Engine bypass item --*/
3164 menuitem = gtk_menu_item_new_with_mnemonic (_("Engine _Bypass"));
3165 gtk_widget_add_accelerator(menuitem, "activate", fAccelGroup,
3166 GDK_b, GDK_NO_MOD_MASK, GTK_ACCEL_VISIBLE);
3167
3168 gtk_menu_shell_append(GTK_MENU_SHELL(menuh), menuitem);
3169 g_signal_connect (GTK_OBJECT (menuitem), "activate",
3170 G_CALLBACK (gx_engine_switch), (gpointer)1);
3171 gtk_widget_show (menuitem);
3172
3173 /*-- add a separator line --*/
3174 GtkWidget* sep = gtk_separator_menu_item_new();
3175 gtk_menu_shell_append(GTK_MENU_SHELL(menuh), sep);
3176 gtk_widget_show (sep);
3177
3178 /*---------------- Create Jack Server menu --------------------*/
3179 addJackServerMenu();
3180
3181 /*---------------- End Jack server menu declarations ----------------*/
3182
3183 /*-- add a separator line --*/
3184 sep = gtk_separator_menu_item_new();
3185 gtk_menu_shell_append(GTK_MENU_SHELL(menuh), sep);
3186 gtk_widget_show (sep);
3187
3188 /*-- create Midi Controller Table menu item --*/
3189 menuitem = gtk_check_menu_item_new_with_mnemonic (_("M_idi Controller"));
3190 gtk_widget_add_accelerator(menuitem, "activate", fAccelGroup,
3191 GDK_i, GDK_SHIFT_MASK, GTK_ACCEL_VISIBLE);
3192 g_signal_connect (
3193 GTK_OBJECT (menuitem), "activate",
3194 G_CALLBACK (MidiControllerTable::toggle), menuitem);
3195 gtk_menu_shell_append(GTK_MENU_SHELL(menuh), menuitem);
3196 gtk_widget_show (menuitem);
3197
3198 /*-- add a separator line --*/
3199 sep = gtk_separator_menu_item_new();
3200 gtk_menu_shell_append(GTK_MENU_SHELL(menuh), sep);
3201 gtk_widget_show (sep);
3202
3203 /*-- Create Exit menu item under Engine submenu --*/
3204 menuitem = gtk_menu_item_new_with_mnemonic (_("_Quit"));
3205 gtk_widget_add_accelerator(menuitem, "activate", fAccelGroup,
3206 GDK_q, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
3207 g_signal_connect(G_OBJECT (menuitem), "activate",
3208 G_CALLBACK (gx_clean_exit), NULL);
3209 gtk_menu_shell_append(GTK_MENU_SHELL(menuh), menuitem);
3210 gtk_widget_show (menuitem);
3211
3212 /*---------------- End Engine menu declarations ----------------*/
1959 void GxMainInterface::addEngineMenu() {
1960 GtkWidget* menulabel; // menu label
1961 // GtkWidget* menucont; // menu container use gw.menuh for systray menu here
1962 GtkWidget* menuitem; // menu item
1963 GSList * group = NULL;
1964
1965 /*---------------- Create Engine menu items ------------------*/
1966 gw.menuh = fMenuList["Top"];
1967
1968 menulabel = gtk_menu_item_new_with_mnemonic(_("_Engine"));
1969 gtk_menu_bar_append(GTK_MENU_BAR(gw.menuh), menulabel);
1970 gtk_widget_show(menulabel);
1971
1972 /*-- Create Engine submenu --*/
1973 gw.menuh = gtk_menu_new();
1974 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menulabel), gw.menuh);
1975 gtk_widget_show(gw.menuh);
1976 fMenuList["Engine"] = gw.menuh;
1977
1978 /*-- Create Engine start / stop item --*/
1979 group = NULL;
1980
1981 menuitem = gtk_check_menu_item_new_with_mnemonic(_("Engine _Start / _Stop"));
1982 gtk_widget_add_accelerator(menuitem, "activate", fAccelGroup,
1983 GDK_space, GDK_NO_MOD_MASK, GTK_ACCEL_VISIBLE);
1984
1985 gtk_menu_shell_append(GTK_MENU_SHELL(gw.menuh), menuitem);
1986 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE);
1987 g_signal_connect(GTK_OBJECT(menuitem), "activate",
1988 G_CALLBACK(gx_engine_switch), (gpointer)0);
1989 gw.gx_engine_item = menuitem; // save into global var
1990 gtk_widget_show(menuitem);
1991
1992 /*-- Create Engine bypass item --*/
1993 menuitem = gtk_menu_item_new_with_mnemonic(_("Engine _Bypass"));
1994 gtk_widget_add_accelerator(menuitem, "activate", fAccelGroup,
1995 GDK_b, GDK_NO_MOD_MASK, GTK_ACCEL_VISIBLE);
1996
1997 gtk_menu_shell_append(GTK_MENU_SHELL(gw.menuh), menuitem);
1998 g_signal_connect(GTK_OBJECT(menuitem), "activate",
1999 G_CALLBACK(gx_engine_switch), (gpointer)1);
2000 gtk_widget_show(menuitem);
2001
2002 /*-- add a separator line --*/
2003 GtkWidget* sep = gtk_separator_menu_item_new();
2004 gtk_menu_shell_append(GTK_MENU_SHELL(gw.menuh), sep);
2005 gtk_widget_show(sep);
2006
2007 /*---------------- Create Jack Server menu --------------------*/
2008 addJackServerMenu();
2009
2010 /*---------------- End Jack server menu declarations ----------------*/
2011
2012 /*-- add a separator line --*/
2013 sep = gtk_separator_menu_item_new();
2014 gtk_menu_shell_append(GTK_MENU_SHELL(gw.menuh), sep);
2015 gtk_widget_show(sep);
2016
2017 /*-- create Midi Controller Table menu item --*/
2018 menuitem = gtk_check_menu_item_new_with_mnemonic(_("M_idi Controller"));
2019 gtk_widget_add_accelerator(menuitem, "activate", fAccelGroup,
2020 GDK_i, GDK_SHIFT_MASK, GTK_ACCEL_VISIBLE);
2021 g_signal_connect(
2022 GTK_OBJECT(menuitem), "activate",
2023 G_CALLBACK(gx_main_midi::MidiControllerTable::toggle), menuitem);
2024 gtk_menu_shell_append(GTK_MENU_SHELL(gw.menuh), menuitem);
2025 gtk_widget_show(menuitem);
2026
2027 /*-- add a separator line --*/
2028 sep = gtk_separator_menu_item_new();
2029 gtk_menu_shell_append(GTK_MENU_SHELL(gw.menuh), sep);
2030 gtk_widget_show(sep);
2031
2032 /*-- Create Exit menu item under Engine submenu --*/
2033 menuitem = gtk_menu_item_new_with_mnemonic(_("_Quit"));
2034 gtk_widget_add_accelerator(menuitem, "activate", fAccelGroup,
2035 GDK_q, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
2036 g_signal_connect(G_OBJECT(menuitem), "activate",
2037 G_CALLBACK(gx_system::gx_clean_exit), NULL);
2038 gtk_menu_shell_append(GTK_MENU_SHELL(gw.menuh), menuitem);
2039 gtk_widget_show(menuitem);
2040
2041 /*---------------- End Engine menu declarations ----------------*/
32132042 }
32142043
32152044 //----------------------------- preset menu ----------------------------
3216 void GxMainInterface::addPresetMenu()
3217 {
3218 GtkWidget* menulabel; // menu label
3219 GtkWidget* menucont; // menu container
3220 GtkWidget* menuitem; // menu item
3221
3222 menucont = fMenuList["Top"];
3223
3224 /*---------------- Create Presets menu items --------------------*/
3225 menulabel = gtk_menu_item_new_with_mnemonic (_("_Presets"));
3226 gtk_menu_bar_append (GTK_MENU_BAR(menucont), menulabel);
3227 gtk_widget_show(menulabel);
3228
3229 /*-- Create Presets submenus --*/
3230 menucont = gtk_menu_new();
3231 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menulabel), menucont);
3232 gtk_widget_show(menucont);
3233 fMenuList["Presets"] = menucont;
3234
3235 /* special treatment of preset lists, from gx_preset namespace */
3236 for (int i = 0; i < GX_NUM_OF_PRESET_LISTS; i++)
3237 {
3238 GtkWidget* menuItem =
3239 gtk_menu_item_new_with_mnemonic (gettext (preset_menu_name[i]));
3240 gtk_menu_shell_append (GTK_MENU_SHELL(menucont), menuItem);
3241
3242 GtkWidget* menu = gtk_menu_new();
3243 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuItem), menu);
3244
3245 gtk_menu_set_accel_path(GTK_MENU(menu), preset_accel_path[i]);
3246
3247 presmenu[i] = menu;
3248 presMenu[i] = menuItem;
3249 }
3250
3251 GtkWidget* menuItem =
3252 gtk_menu_item_new_with_mnemonic (_("Factory Settings"));
3253 gtk_menu_shell_append (GTK_MENU_SHELL(menucont), menuItem);
3254
3255 GtkWidget* menu = gtk_menu_new();
3256 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuItem), menu);
3257
3258 fpresmenu = menu;
3259
3260 gtk_widget_show(menuItem);
3261
3262 menuitem = gtk_menu_item_new_with_mnemonic ("funkmuscle");
3263 menu = gtk_menu_new();
3264 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menu);
3265 gtk_menu_shell_insert(GTK_MENU_SHELL(fpresmenu), menuitem, 0);
3266 ffpresmenu[0] = menu;
3267
3268 gtk_widget_show (menuitem);
3269
3270 menuitem = gtk_menu_item_new_with_mnemonic ("zettberlin");
3271 menu = gtk_menu_new();
3272 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menu);
3273 gtk_menu_shell_insert(GTK_MENU_SHELL(fpresmenu), menuitem, 0);
3274 ffpresmenu[1] = menu;
3275
3276 gtk_widget_show (menuitem);
3277
3278 menuitem = gtk_menu_item_new_with_mnemonic ("StudioDave");
3279 menu = gtk_menu_new();
3280 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menu);
3281 gtk_menu_shell_insert(GTK_MENU_SHELL(fpresmenu), menuitem, 0);
3282 ffpresmenu[2] = menu;
3283
3284 gtk_widget_show (menuitem);
3285
3286 /*-- add New Preset saving under Save Presets menu */
3287 menuitem = gtk_menu_item_new_with_mnemonic (_("New _Preset"));
3288 g_signal_connect (GTK_OBJECT (menuitem), "activate",
3289 G_CALLBACK (gx_save_newpreset_dialog), NULL);
3290 gtk_widget_add_accelerator(menuitem, "activate", fAccelGroup,
3291 GDK_p, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
3292 gtk_menu_shell_insert(GTK_MENU_SHELL(presmenu[SAVE_PRESET_LIST]), menuitem, 0);
3293 gtk_widget_show (menuitem);
3294
3295 /*-- add a separator line --*/
3296 GtkWidget* sep = gtk_separator_menu_item_new();
3297 gtk_menu_shell_insert(GTK_MENU_SHELL(presmenu[SAVE_PRESET_LIST]), sep, 1);
3298 gtk_widget_show (sep);
3299
3300 /*-- initial preset list --*/
3301 //gx_preset::gx_refresh_preset_menus(); //FIXME: will be done in gx_engine_init()?
3302
3303 for (int i = 0; i < GX_NUM_OF_PRESET_LISTS; i++)
3304 gtk_widget_show(presMenu[i]);
3305
3306 /* ------------------- */
3307
3308 /*-- add a separator line --*/
3309 sep = gtk_separator_menu_item_new();
3310 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), sep);
3311 gtk_widget_show (sep);
3312
3313 /*-- Create patch info menu item under Options submenu --*/
3314 menuitem = gtk_menu_item_new_with_mnemonic (_("P_atch Info"));
3315 gtk_widget_add_accelerator(menuitem, "activate", fAccelGroup,
3316 GDK_a, GDK_SHIFT_MASK, GTK_ACCEL_VISIBLE);
3317 g_signal_connect (GTK_OBJECT (menuitem), "activate",
3318 G_CALLBACK (gx_patch), NULL);
3319 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuitem);
3320 gtk_widget_show (menuitem);
3321
3322 /*-- add a separator line --*/
3323 sep = gtk_separator_menu_item_new();
3324 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), sep);
3325 gtk_widget_show (sep);
3326
3327 /*-- Create load presetfile menu --*/
3328 menuitem = gtk_menu_item_new_with_mnemonic (_("Load Preset-_file"));
3329 gtk_widget_add_accelerator(menuitem, "activate", fAccelGroup,
3330 GDK_f, GDK_SHIFT_MASK, GTK_ACCEL_VISIBLE);
3331 g_signal_connect (GTK_OBJECT (menuitem), "activate",
3332 G_CALLBACK (gx_load_preset_file), NULL);
2045 void GxMainInterface::addPresetMenu() {
2046 GtkWidget* menulabel; // menu label
2047 GtkWidget* menucont; // menu container
2048 GtkWidget* menuitem; // menu item
2049
2050 menucont = fMenuList["Top"];
2051
2052 /*---------------- Create Presets menu items --------------------*/
2053 menulabel = gtk_menu_item_new_with_mnemonic(_("_Presets"));
2054 gtk_menu_bar_append(GTK_MENU_BAR(menucont), menulabel);
2055 gtk_widget_show(menulabel);
2056
2057 /*-- Create Presets submenus --*/
2058 menucont = gtk_menu_new();
2059 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menulabel), menucont);
2060 gtk_widget_show(menucont);
2061 fMenuList["Presets"] = menucont;
2062
2063 /* special treatment of preset lists, from gx_preset namespace */
2064 for (int i = 0; i < GX_NUM_OF_PRESET_LISTS; i++) {
2065 GtkWidget* menuItem =
2066 gtk_menu_item_new_with_mnemonic(gettext(gx_preset::preset_menu_name[i]));
2067 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuItem);
2068
2069 GtkWidget* menu = gtk_menu_new();
2070 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuItem), menu);
2071
2072 gtk_menu_set_accel_path(GTK_MENU(menu), gx_preset::preset_accel_path[i]);
2073
2074 gx_preset::presmenu[i] = menu;
2075 gx_preset::presMenu[i] = menuItem;
2076 }
2077
2078 GtkWidget* menuItem =
2079 gtk_menu_item_new_with_mnemonic(_("Factory Settings"));
2080 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuItem);
2081
2082 GtkWidget* menu = gtk_menu_new();
2083 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuItem), menu);
2084
2085 gx_preset::fpresmenu = menu;
2086
2087 gtk_widget_show(menuItem);
2088
2089 menuitem = gtk_menu_item_new_with_mnemonic("funkmuscle");
2090 menu = gtk_menu_new();
2091 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menu);
2092 gtk_menu_shell_insert(GTK_MENU_SHELL(gx_preset::fpresmenu), menuitem, 0);
2093 gx_preset::ffpresmenu[0] = menu;
2094
2095 gtk_widget_show(menuitem);
2096
2097 menuitem = gtk_menu_item_new_with_mnemonic("zettberlin");
2098 menu = gtk_menu_new();
2099 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menu);
2100 gtk_menu_shell_insert(GTK_MENU_SHELL(gx_preset::fpresmenu), menuitem, 0);
2101 gx_preset::ffpresmenu[1] = menu;
2102
2103 gtk_widget_show(menuitem);
2104
2105 menuitem = gtk_menu_item_new_with_mnemonic("StudioDave");
2106 menu = gtk_menu_new();
2107 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menu);
2108 gtk_menu_shell_insert(GTK_MENU_SHELL(gx_preset::fpresmenu), menuitem, 0);
2109 gx_preset::ffpresmenu[2] = menu;
2110
2111 gtk_widget_show(menuitem);
2112
2113 /*-- add New Preset saving under Save Presets menu */
2114 menuitem = gtk_menu_item_new_with_mnemonic(_("New _Preset"));
2115 g_signal_connect(GTK_OBJECT(menuitem), "activate",
2116 G_CALLBACK(gx_preset::gx_save_newpreset_dialog), NULL);
2117 gtk_widget_add_accelerator(menuitem, "activate", fAccelGroup,
2118 GDK_p, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
2119 gtk_menu_shell_insert(GTK_MENU_SHELL(gx_preset::presmenu[SAVE_PRESET_LIST]), menuitem, 0);
2120 gtk_widget_show(menuitem);
2121
2122 /*-- add a separator line --*/
2123 GtkWidget* sep = gtk_separator_menu_item_new();
2124 gtk_menu_shell_insert(GTK_MENU_SHELL(gx_preset::presmenu[SAVE_PRESET_LIST]), sep, 1);
2125 gtk_widget_show(sep);
2126
2127 /*-- initial preset list --*/
2128 // gx_preset::gx_refresh_preset_menus(); //FIXME: will be done in gx_engine_init()?
2129
2130 for (int i = 0; i < GX_NUM_OF_PRESET_LISTS; i++)
2131 gtk_widget_show(gx_preset::presMenu[i]);
2132
2133 /* ------------------- */
2134
2135 /*-- add a separator line --*/
2136 sep = gtk_separator_menu_item_new();
2137 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), sep);
2138 gtk_widget_show(sep);
2139
2140 /*-- Create patch info menu item under Options submenu --*/
2141 menuitem = gtk_menu_item_new_with_mnemonic(_("P_atch Info"));
2142 gtk_widget_add_accelerator(menuitem, "activate", fAccelGroup,
2143 GDK_a, GDK_SHIFT_MASK, GTK_ACCEL_VISIBLE);
2144 g_signal_connect(GTK_OBJECT(menuitem), "activate",
2145 G_CALLBACK(gx_patch), NULL);
33332146 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuitem);
3334 gtk_widget_show (menuitem);
3335
3336 /*-- Create save as presetfile menu--*/
3337 menuitem = gtk_menu_item_new_with_mnemonic (_("E_xport Preset-file"));
3338 gtk_widget_add_accelerator(menuitem, "activate", fAccelGroup,
3339 GDK_x, GDK_SHIFT_MASK, GTK_ACCEL_VISIBLE);
3340 g_signal_connect (GTK_OBJECT (menuitem), "activate",
3341 G_CALLBACK (gx_save_preset_file), NULL);
2147 gtk_widget_show(menuitem);
2148
2149 /*-- add a separator line --*/
2150 sep = gtk_separator_menu_item_new();
2151 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), sep);
2152 gtk_widget_show(sep);
2153
2154 /*-- Create load presetfile menu --*/
2155 menuitem = gtk_menu_item_new_with_mnemonic(_("Load Preset-_file"));
2156 gtk_widget_add_accelerator(menuitem, "activate", fAccelGroup,
2157 GDK_f, GDK_SHIFT_MASK, GTK_ACCEL_VISIBLE);
2158 g_signal_connect(GTK_OBJECT(menuitem), "activate",
2159 G_CALLBACK(gx_preset::gx_load_preset_file), NULL);
33422160 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuitem);
3343 gtk_widget_show (menuitem);
2161 gtk_widget_show(menuitem);
2162
2163 /*-- Create save as presetfile menu--*/
2164 menuitem = gtk_menu_item_new_with_mnemonic(_("E_xport Preset-file"));
2165 gtk_widget_add_accelerator(menuitem, "activate", fAccelGroup,
2166 GDK_x, GDK_SHIFT_MASK, GTK_ACCEL_VISIBLE);
2167 g_signal_connect(GTK_OBJECT(menuitem), "activate",
2168 G_CALLBACK(gx_preset::gx_save_preset_file), NULL);
2169 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuitem);
2170 gtk_widget_show(menuitem);
33442171
33452172 /*-- add a separator line --*/
3346 sep = gtk_separator_menu_item_new();
3347 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), sep);
3348 gtk_widget_show (sep);
3349
3350 /*-- Create Main setting submenu --*/
3351 menuitem = gtk_menu_item_new_with_mnemonic (_("Recall Main _Setting"));
3352 g_signal_connect (GTK_OBJECT (menuitem), "activate",
3353 G_CALLBACK (gx_recall_main_setting), NULL);
3354 gtk_widget_add_accelerator(menuitem, "activate", fAccelGroup,
3355 GDK_s, GDK_NO_MOD_MASK, GTK_ACCEL_VISIBLE);
3356 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuitem);
3357 gtk_widget_show (menuitem);
3358
3359 menuitem = gtk_menu_item_new_with_mnemonic (_("_Save As Main _Setting"));
3360 g_signal_connect (GTK_OBJECT (menuitem), "activate",
3361 G_CALLBACK (gx_save_main_setting), NULL);
3362 gtk_widget_add_accelerator(menuitem, "activate", fAccelGroup,
3363 GDK_s, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
3364 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuitem);
3365 gtk_widget_show (menuitem);
3366
3367 /*-- add a separator line --*/
3368 sep = gtk_separator_menu_item_new();
3369 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), sep);
3370 gtk_widget_show (sep);
3371
3372 /*-- Create sub menu More Preset Action --*/
3373 menulabel = gtk_menu_item_new_with_mnemonic(_("More Preset Options..."));
3374 gtk_menu_shell_append (GTK_MENU_SHELL(menucont), menulabel);
3375 gtk_widget_show(menulabel);
3376
3377 menucont = gtk_menu_new();
3378 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menulabel), menucont);
3379 gtk_widget_show(menucont);
3380 fMenuList["ExtraPresets"] = menucont;
3381
3382 /*--------------- Extra preset menu */
3383 addExtraPresetMenu();
2173 sep = gtk_separator_menu_item_new();
2174 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), sep);
2175 gtk_widget_show(sep);
2176
2177 /*-- Create Main setting submenu --*/
2178 menuitem = gtk_menu_item_new_with_mnemonic(_("Recall Main _Setting"));
2179 g_signal_connect(GTK_OBJECT(menuitem), "activate",
2180 G_CALLBACK(gx_preset::gx_recall_main_setting), NULL);
2181 gtk_widget_add_accelerator(menuitem, "activate", fAccelGroup,
2182 GDK_s, GDK_NO_MOD_MASK, GTK_ACCEL_VISIBLE);
2183 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuitem);
2184 gtk_widget_show(menuitem);
2185
2186 menuitem = gtk_menu_item_new_with_mnemonic(_("_Save As Main _Setting"));
2187 g_signal_connect(GTK_OBJECT(menuitem), "activate",
2188 G_CALLBACK(gx_preset::gx_save_main_setting), NULL);
2189 gtk_widget_add_accelerator(menuitem, "activate", fAccelGroup,
2190 GDK_s, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
2191 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuitem);
2192 gtk_widget_show(menuitem);
2193
2194 /*-- add a separator line --*/
2195 sep = gtk_separator_menu_item_new();
2196 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), sep);
2197 gtk_widget_show(sep);
2198
2199 /*-- Create sub menu More Preset Action --*/
2200 menulabel = gtk_menu_item_new_with_mnemonic(_("More Preset Options..."));
2201 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menulabel);
2202 gtk_widget_show(menulabel);
2203
2204 menucont = gtk_menu_new();
2205 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menulabel), menucont);
2206 gtk_widget_show(menucont);
2207 fMenuList["ExtraPresets"] = menucont;
2208
2209 /*--------------- Extra preset menu */
2210 addExtraPresetMenu();
33842211 }
33852212
33862213 //------------------------ extra preset menu ----------------------------
3387 void GxMainInterface::addExtraPresetMenu()
3388 {
3389 GtkWidget* menucont; // menu container
3390 GtkWidget* menuitem; // menu item
3391
3392 menucont = fMenuList["ExtraPresets"];
3393
3394 /*---------------- Create Presets menu items --------------------*/
3395
3396 /* forward preset */
3397 menuitem = gtk_menu_item_new_with_mnemonic(_("Next _Preset"));
3398 g_signal_connect (GTK_OBJECT (menuitem), "activate",
3399 G_CALLBACK (gx_next_preset), NULL);
3400 gtk_widget_add_accelerator(menuitem, "activate",
3401 fAccelGroup, GDK_Page_Down,
3402 GDK_NO_MOD_MASK, GTK_ACCEL_VISIBLE);
3403 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuitem);
3404 gtk_widget_show(menuitem);
3405
3406 /* rewind preset */
3407 menuitem = gtk_menu_item_new_with_mnemonic(_("Previous _Preset"));
3408 g_signal_connect (GTK_OBJECT (menuitem), "activate",
3409 G_CALLBACK (gx_previous_preset), NULL);
3410 gtk_widget_add_accelerator(menuitem, "activate",
3411 fAccelGroup, GDK_Page_Up,
3412 GDK_NO_MOD_MASK, GTK_ACCEL_VISIBLE);
3413 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuitem);
3414 gtk_widget_show(menuitem);
3415
3416 /*-- add a separator line --*/
3417 GtkWidget* sep = gtk_separator_menu_item_new();
3418 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), sep);
3419 gtk_widget_show (sep);
3420
3421 /*-- Create menu item Delete Active preset --*/
3422 menuitem = gtk_menu_item_new_with_mnemonic (_("_Save Active Preset"));
3423 g_signal_connect (GTK_OBJECT (menuitem), "activate",
3424 G_CALLBACK (gx_save_oldpreset), (gpointer)1);
3425 gtk_widget_add_accelerator(menuitem, "activate",
3426 fAccelGroup, GDK_s,
3427 GDK_MOD1_MASK, GTK_ACCEL_VISIBLE);
3428 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuitem);
3429 gtk_widget_show (menuitem);
3430
3431 menuitem = gtk_menu_item_new_with_mnemonic (_("_Rename Active Preset"));
3432 g_signal_connect (GTK_OBJECT (menuitem), "activate",
3433 G_CALLBACK (gx_rename_active_preset_dialog), NULL);
3434 gtk_widget_add_accelerator(menuitem, "activate",
3435 fAccelGroup, GDK_r,
3436 GDK_MOD1_MASK, GTK_ACCEL_VISIBLE);
3437 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuitem);
3438 gtk_widget_show (menuitem);
3439
3440 menuitem = gtk_menu_item_new_with_mnemonic (_("_Delete Active Preset"));
3441 g_signal_connect (GTK_OBJECT (menuitem), "activate",
3442 G_CALLBACK (gx_delete_active_preset_dialog), NULL);
3443 gtk_widget_add_accelerator(menuitem, "activate",
3444 fAccelGroup, GDK_Delete,
3445 GDK_NO_MOD_MASK, GTK_ACCEL_VISIBLE);
3446 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuitem);
3447 gtk_widget_show (menuitem);
3448
3449 /*-- add a separator line --*/
3450 sep = gtk_separator_menu_item_new();
3451 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), sep);
3452 gtk_widget_show (sep);
3453
3454 /*-- Create menu item Delete All presets --*/
3455 menuitem = gtk_menu_item_new_with_mnemonic (_("_Delete All Presets"));
3456 g_signal_connect (GTK_OBJECT (menuitem), "activate",
3457 G_CALLBACK (gx_delete_all_presets_dialog), NULL);
3458 gtk_widget_add_accelerator(menuitem, "activate",
3459 fAccelGroup, GDK_d,
3460 GdkModifierType(GDK_CONTROL_MASK|GDK_SHIFT_MASK), GTK_ACCEL_VISIBLE);
3461 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuitem);
3462 gtk_widget_show (menuitem);
3463
3464 }
3465
3466 void GxMainInterface::on_tube_activate()
3467 {
3468 if (fSelectTubeModel[0].get_active()) {
3469 fSelectTubeModel[1].set_active(false);
3470 fSelectTubeModel[2].set_active(false);
3471 fSelectTubeModel[3].set_active(false);
3472 fSelectTubeModel[4].set_active(false);
3473 fSelectTubeModel[5].set_active(false);
3474 fSelectTubeModel[6].set_active(false);
3475 gx_engine::set_tube_model(1);
3476 }
3477
3478 else if (fSelectTubeModel[1].get_active()) {
3479 fSelectTubeModel[0].set_active(false);
3480 fSelectTubeModel[2].set_active(false);
3481 fSelectTubeModel[3].set_active(false);
3482 fSelectTubeModel[4].set_active(false);
3483 fSelectTubeModel[5].set_active(false);
3484 fSelectTubeModel[6].set_active(false);
3485 gx_engine::set_tube_model(2);
3486 }
3487
3488 else if (fSelectTubeModel[2].get_active()) {
3489 fSelectTubeModel[0].set_active(false);
3490 fSelectTubeModel[1].set_active(false);
3491 fSelectTubeModel[3].set_active(false);
3492 fSelectTubeModel[4].set_active(false);
3493 fSelectTubeModel[5].set_active(false);
3494 fSelectTubeModel[6].set_active(false);
3495 gx_engine::set_tube_model(3);
3496 }
3497
3498 else if (fSelectTubeModel[3].get_active()) {
3499 fSelectTubeModel[0].set_active(false);
3500 fSelectTubeModel[1].set_active(false);
3501 fSelectTubeModel[2].set_active(false);
3502 fSelectTubeModel[4].set_active(false);
3503 fSelectTubeModel[5].set_active(false);
3504 fSelectTubeModel[6].set_active(false);
3505 gx_engine::set_tube_model(4);
3506 }
3507
3508 else if (fSelectTubeModel[4].get_active()) {
3509 fSelectTubeModel[0].set_active(false);
3510 fSelectTubeModel[1].set_active(false);
3511 fSelectTubeModel[2].set_active(false);
3512 fSelectTubeModel[3].set_active(false);
3513 fSelectTubeModel[5].set_active(false);
3514 fSelectTubeModel[6].set_active(false);
3515 gx_engine::set_tube_model(5);
3516 }
3517
3518 else if (fSelectTubeModel[5].get_active()) {
3519 fSelectTubeModel[0].set_active(false);
3520 fSelectTubeModel[1].set_active(false);
3521 fSelectTubeModel[2].set_active(false);
3522 fSelectTubeModel[3].set_active(false);
3523 fSelectTubeModel[4].set_active(false);
3524 fSelectTubeModel[6].set_active(false);
3525 gx_engine::set_tube_model(6);
3526 }
3527
3528 else if (fSelectTubeModel[6].get_active()) {
3529 fSelectTubeModel[0].set_active(false);
3530 fSelectTubeModel[1].set_active(false);
3531 fSelectTubeModel[2].set_active(false);
3532 fSelectTubeModel[3].set_active(false);
3533 fSelectTubeModel[4].set_active(false);
3534 fSelectTubeModel[5].set_active(false);
3535 gx_engine::set_tube_model(7);
3536 }
2214 void GxMainInterface::addExtraPresetMenu() {
2215 GtkWidget* menucont; // menu container
2216 GtkWidget* menuitem; // menu item
2217
2218 menucont = fMenuList["ExtraPresets"];
2219
2220 /*---------------- Create Presets menu items --------------------*/
2221
2222 /* forward preset */
2223 menuitem = gtk_menu_item_new_with_mnemonic(_("Next _Preset"));
2224 g_signal_connect(GTK_OBJECT(menuitem), "activate",
2225 G_CALLBACK(gx_preset::gx_next_preset), NULL);
2226 gtk_widget_add_accelerator(menuitem, "activate",
2227 fAccelGroup, GDK_Page_Down,
2228 GDK_NO_MOD_MASK, GTK_ACCEL_VISIBLE);
2229 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuitem);
2230 gtk_widget_show(menuitem);
2231
2232 /* rewind preset */
2233 menuitem = gtk_menu_item_new_with_mnemonic(_("Previous _Preset"));
2234 g_signal_connect(GTK_OBJECT(menuitem), "activate",
2235 G_CALLBACK(gx_preset::gx_previous_preset), NULL);
2236 gtk_widget_add_accelerator(menuitem, "activate",
2237 fAccelGroup, GDK_Page_Up,
2238 GDK_NO_MOD_MASK, GTK_ACCEL_VISIBLE);
2239 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuitem);
2240 gtk_widget_show(menuitem);
2241
2242 /*-- add a separator line --*/
2243 GtkWidget* sep = gtk_separator_menu_item_new();
2244 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), sep);
2245 gtk_widget_show(sep);
2246
2247 /*-- Create menu item Delete Active preset --*/
2248 menuitem = gtk_menu_item_new_with_mnemonic(_("_Save Active Preset"));
2249 g_signal_connect(GTK_OBJECT(menuitem), "activate",
2250 G_CALLBACK(gx_preset::gx_save_oldpreset), (gpointer)1);
2251 gtk_widget_add_accelerator(menuitem, "activate",
2252 fAccelGroup, GDK_s,
2253 GDK_MOD1_MASK, GTK_ACCEL_VISIBLE);
2254 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuitem);
2255 gtk_widget_show(menuitem);
2256
2257 menuitem = gtk_menu_item_new_with_mnemonic(_("_Rename Active Preset"));
2258 g_signal_connect(GTK_OBJECT(menuitem), "activate",
2259 G_CALLBACK(gx_preset::gx_rename_active_preset_dialog), NULL);
2260 gtk_widget_add_accelerator(menuitem, "activate",
2261 fAccelGroup, GDK_r,
2262 GDK_MOD1_MASK, GTK_ACCEL_VISIBLE);
2263 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuitem);
2264 gtk_widget_show(menuitem);
2265
2266 menuitem = gtk_menu_item_new_with_mnemonic(_("_Delete Active Preset"));
2267 g_signal_connect(GTK_OBJECT(menuitem), "activate",
2268 G_CALLBACK(gx_preset::gx_delete_active_preset_dialog), NULL);
2269 gtk_widget_add_accelerator(menuitem, "activate",
2270 fAccelGroup, GDK_Delete,
2271 GDK_NO_MOD_MASK, GTK_ACCEL_VISIBLE);
2272 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuitem);
2273 gtk_widget_show(menuitem);
2274
2275 /*-- add a separator line --*/
2276 sep = gtk_separator_menu_item_new();
2277 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), sep);
2278 gtk_widget_show(sep);
2279
2280 /*-- Create menu item Delete All presets --*/
2281 menuitem = gtk_menu_item_new_with_mnemonic(_("_Delete All Presets"));
2282 g_signal_connect(GTK_OBJECT(menuitem), "activate",
2283 G_CALLBACK(gx_preset::gx_delete_all_presets_dialog), NULL);
2284 gtk_widget_add_accelerator(menuitem, "activate",
2285 fAccelGroup, GDK_d,
2286 GdkModifierType(GDK_CONTROL_MASK|GDK_SHIFT_MASK), GTK_ACCEL_VISIBLE);
2287 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuitem);
2288 gtk_widget_show(menuitem);
2289 }
2290
2291 void GxMainInterface::on_tube_activate() {
2292 if (fSelectTubeModel[0].get_active()) {
2293 fSelectTubeModel[1].set_active(false);
2294 fSelectTubeModel[2].set_active(false);
2295 fSelectTubeModel[3].set_active(false);
2296 fSelectTubeModel[4].set_active(false);
2297 fSelectTubeModel[5].set_active(false);
2298 fSelectTubeModel[6].set_active(false);
2299 fSelectTubeModel[7].set_active(false);
2300 fSelectTubeModel[8].set_active(false);
2301 fSelectTubeModel[9].set_active(false);
2302 fSelectTubeModel[10].set_active(false);
2303 fSelectTubeModel[11].set_active(false);
2304 fSelectTubeModel[12].set_active(false);
2305 gx_engine::set_tube_model(1);
2306 } else if (fSelectTubeModel[1].get_active()) {
2307 fSelectTubeModel[0].set_active(false);
2308 fSelectTubeModel[2].set_active(false);
2309 fSelectTubeModel[3].set_active(false);
2310 fSelectTubeModel[4].set_active(false);
2311 fSelectTubeModel[5].set_active(false);
2312 fSelectTubeModel[6].set_active(false);
2313 fSelectTubeModel[7].set_active(false);
2314 fSelectTubeModel[8].set_active(false);
2315 fSelectTubeModel[9].set_active(false);
2316 fSelectTubeModel[10].set_active(false);
2317 fSelectTubeModel[11].set_active(false);
2318 fSelectTubeModel[12].set_active(false);
2319 gx_engine::set_tube_model(2);
2320 } else if (fSelectTubeModel[2].get_active()) {
2321 fSelectTubeModel[0].set_active(false);
2322 fSelectTubeModel[1].set_active(false);
2323 fSelectTubeModel[3].set_active(false);
2324 fSelectTubeModel[4].set_active(false);
2325 fSelectTubeModel[5].set_active(false);
2326 fSelectTubeModel[6].set_active(false);
2327 fSelectTubeModel[7].set_active(false);
2328 fSelectTubeModel[8].set_active(false);
2329 fSelectTubeModel[9].set_active(false);
2330 fSelectTubeModel[10].set_active(false);
2331 fSelectTubeModel[11].set_active(false);
2332 fSelectTubeModel[12].set_active(false);
2333 gx_engine::set_tube_model(3);
2334 } else if (fSelectTubeModel[3].get_active()) {
2335 fSelectTubeModel[0].set_active(false);
2336 fSelectTubeModel[1].set_active(false);
2337 fSelectTubeModel[2].set_active(false);
2338 fSelectTubeModel[4].set_active(false);
2339 fSelectTubeModel[5].set_active(false);
2340 fSelectTubeModel[6].set_active(false);
2341 fSelectTubeModel[7].set_active(false);
2342 fSelectTubeModel[8].set_active(false);
2343 fSelectTubeModel[9].set_active(false);
2344 fSelectTubeModel[10].set_active(false);
2345 fSelectTubeModel[11].set_active(false);
2346 fSelectTubeModel[12].set_active(false);
2347 gx_engine::set_tube_model(4);
2348 } else if (fSelectTubeModel[4].get_active()) {
2349 fSelectTubeModel[0].set_active(false);
2350 fSelectTubeModel[1].set_active(false);
2351 fSelectTubeModel[2].set_active(false);
2352 fSelectTubeModel[3].set_active(false);
2353 fSelectTubeModel[5].set_active(false);
2354 fSelectTubeModel[6].set_active(false);
2355 fSelectTubeModel[7].set_active(false);
2356 fSelectTubeModel[8].set_active(false);
2357 fSelectTubeModel[9].set_active(false);
2358 fSelectTubeModel[10].set_active(false);
2359 fSelectTubeModel[11].set_active(false);
2360 fSelectTubeModel[12].set_active(false);
2361 gx_engine::set_tube_model(5);
2362 } else if (fSelectTubeModel[5].get_active()) {
2363 fSelectTubeModel[0].set_active(false);
2364 fSelectTubeModel[1].set_active(false);
2365 fSelectTubeModel[2].set_active(false);
2366 fSelectTubeModel[3].set_active(false);
2367 fSelectTubeModel[4].set_active(false);
2368 fSelectTubeModel[6].set_active(false);
2369 fSelectTubeModel[7].set_active(false);
2370 fSelectTubeModel[8].set_active(false);
2371 fSelectTubeModel[9].set_active(false);
2372 fSelectTubeModel[10].set_active(false);
2373 fSelectTubeModel[11].set_active(false);
2374 fSelectTubeModel[12].set_active(false);
2375 gx_engine::set_tube_model(6);
2376 } else if (fSelectTubeModel[6].get_active()) {
2377 fSelectTubeModel[0].set_active(false);
2378 fSelectTubeModel[1].set_active(false);
2379 fSelectTubeModel[2].set_active(false);
2380 fSelectTubeModel[3].set_active(false);
2381 fSelectTubeModel[4].set_active(false);
2382 fSelectTubeModel[5].set_active(false);
2383 fSelectTubeModel[7].set_active(false);
2384 fSelectTubeModel[8].set_active(false);
2385 fSelectTubeModel[9].set_active(false);
2386 fSelectTubeModel[10].set_active(false);
2387 fSelectTubeModel[11].set_active(false);
2388 fSelectTubeModel[12].set_active(false);
2389 gx_engine::set_tube_model(7);
2390 } else if (fSelectTubeModel[7].get_active()) {
2391 fSelectTubeModel[0].set_active(false);
2392 fSelectTubeModel[1].set_active(false);
2393 fSelectTubeModel[2].set_active(false);
2394 fSelectTubeModel[3].set_active(false);
2395 fSelectTubeModel[4].set_active(false);
2396 fSelectTubeModel[5].set_active(false);
2397 fSelectTubeModel[6].set_active(false);
2398 fSelectTubeModel[8].set_active(false);
2399 fSelectTubeModel[9].set_active(false);
2400 fSelectTubeModel[10].set_active(false);
2401 fSelectTubeModel[11].set_active(false);
2402 fSelectTubeModel[12].set_active(false);
2403 gx_engine::set_tube_model(8);
2404 } else if (fSelectTubeModel[8].get_active()) {
2405 fSelectTubeModel[0].set_active(false);
2406 fSelectTubeModel[1].set_active(false);
2407 fSelectTubeModel[2].set_active(false);
2408 fSelectTubeModel[3].set_active(false);
2409 fSelectTubeModel[4].set_active(false);
2410 fSelectTubeModel[5].set_active(false);
2411 fSelectTubeModel[6].set_active(false);
2412 fSelectTubeModel[7].set_active(false);
2413 fSelectTubeModel[9].set_active(false);
2414 fSelectTubeModel[10].set_active(false);
2415 fSelectTubeModel[11].set_active(false);
2416 fSelectTubeModel[12].set_active(false);
2417 gx_engine::set_tube_model(9);
2418 } else if (fSelectTubeModel[9].get_active()) {
2419 fSelectTubeModel[0].set_active(false);
2420 fSelectTubeModel[1].set_active(false);
2421 fSelectTubeModel[2].set_active(false);
2422 fSelectTubeModel[3].set_active(false);
2423 fSelectTubeModel[4].set_active(false);
2424 fSelectTubeModel[5].set_active(false);
2425 fSelectTubeModel[6].set_active(false);
2426 fSelectTubeModel[7].set_active(false);
2427 fSelectTubeModel[8].set_active(false);
2428 fSelectTubeModel[10].set_active(false);
2429 fSelectTubeModel[11].set_active(false);
2430 fSelectTubeModel[12].set_active(false);
2431 gx_engine::set_tube_model(10);
2432 } else if (fSelectTubeModel[10].get_active()) {
2433 fSelectTubeModel[0].set_active(false);
2434 fSelectTubeModel[1].set_active(false);
2435 fSelectTubeModel[2].set_active(false);
2436 fSelectTubeModel[3].set_active(false);
2437 fSelectTubeModel[4].set_active(false);
2438 fSelectTubeModel[5].set_active(false);
2439 fSelectTubeModel[6].set_active(false);
2440 fSelectTubeModel[7].set_active(false);
2441 fSelectTubeModel[8].set_active(false);
2442 fSelectTubeModel[9].set_active(false);
2443 fSelectTubeModel[11].set_active(false);
2444 fSelectTubeModel[12].set_active(false);
2445 gx_engine::set_tube_model(11);
2446 } else if (fSelectTubeModel[11].get_active()) {
2447 fSelectTubeModel[0].set_active(false);
2448 fSelectTubeModel[1].set_active(false);
2449 fSelectTubeModel[2].set_active(false);
2450 fSelectTubeModel[3].set_active(false);
2451 fSelectTubeModel[4].set_active(false);
2452 fSelectTubeModel[5].set_active(false);
2453 fSelectTubeModel[6].set_active(false);
2454 fSelectTubeModel[7].set_active(false);
2455 fSelectTubeModel[8].set_active(false);
2456 fSelectTubeModel[9].set_active(false);
2457 fSelectTubeModel[10].set_active(false);
2458 fSelectTubeModel[12].set_active(false);
2459 gx_engine::set_tube_model(12);
2460 } else if (fSelectTubeModel[12].get_active()) {
2461 fSelectTubeModel[0].set_active(false);
2462 fSelectTubeModel[1].set_active(false);
2463 fSelectTubeModel[2].set_active(false);
2464 fSelectTubeModel[3].set_active(false);
2465 fSelectTubeModel[4].set_active(false);
2466 fSelectTubeModel[5].set_active(false);
2467 fSelectTubeModel[6].set_active(false);
2468 fSelectTubeModel[7].set_active(false);
2469 fSelectTubeModel[8].set_active(false);
2470 fSelectTubeModel[9].set_active(false);
2471 fSelectTubeModel[10].set_active(false);
2472 fSelectTubeModel[11].set_active(false);
2473 gx_engine::set_tube_model(13);
2474 }
35372475 }
35382476 //----------------------------- preset menu ----------------------------
3539 void GxMainInterface::addAmpMenu()
3540 {
3541 GtkWidget* menulabel; // menu label
3542 GtkWidget* menucont; // menu container
3543
3544 menucont = fMenuList["Top"];
3545
3546 /*---------------- Create Options menu items ------------------*/
3547 menulabel = gtk_menu_item_new_with_mnemonic (_("_Tube "));
3548 gtk_menu_bar_append (GTK_MENU_BAR(menucont), menulabel);
3549 gtk_widget_show(menulabel);
3550
3551 /*-- Create Options submenu --*/
3552 menucont = gtk_menu_new();
3553 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menulabel), menucont);
3554 gtk_widget_show(menucont);
3555
3556 /*-- Create toolbar check menu item under Options submenu --*/
3557 set_label(fSelectTubeModel[0], _("12ax7"));
3558 fSelectTubeModel[0].add_accelerator("activate", Glib::wrap(fAccelGroup, true),
3559 GDK_v, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
3560 fSelectTubeModel[0].signal_activate().connect(
3561 sigc::mem_fun(*this, &GxMainInterface::on_tube_activate));
3562 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fSelectTubeModel[0].gobj()));
3563 fSelectTubeModel[0].show();
3564
3565 fSelectTubeModel[0].set_parameter(new SwitchParameter("system.select_tube",true,false));
3566 Gtk::RadioMenuItem::Group group = fSelectTubeModel[0].get_group();
3567
3568 set_label(fSelectTubeModel[1], _("12AU7"));
3569 fSelectTubeModel[1].set_group(group);
3570
3571 fSelectTubeModel[1].add_accelerator("activate", Glib::wrap(fAccelGroup, true),
3572 GDK_u, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
3573 fSelectTubeModel[1].signal_activate().connect(
3574 sigc::mem_fun(*this, &GxMainInterface::on_tube_activate));
3575 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fSelectTubeModel[1].gobj()));
3576 fSelectTubeModel[1].show();
3577 fSelectTubeModel[1].set_parameter(new SwitchParameter("system.select_tube2",true,false));
3578 fSelectTubeModel[1].set_active(false);
3579
3580 set_label(fSelectTubeModel[5], _("6DJ8"));
3581 fSelectTubeModel[5].set_group(group);
3582
3583 fSelectTubeModel[5].add_accelerator("activate", Glib::wrap(fAccelGroup, true),
3584 GDK_e, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
3585 fSelectTubeModel[5].signal_activate().connect(
3586 sigc::mem_fun(*this, &GxMainInterface::on_tube_activate));
3587 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fSelectTubeModel[5].gobj()));
3588 fSelectTubeModel[5].show();
3589 fSelectTubeModel[5].set_parameter(new SwitchParameter("system.select_tube10",true,false));
3590 fSelectTubeModel[5].set_active(false);
3591
3592 set_label(fSelectTubeModel[2], _("6V6"));
3593 fSelectTubeModel[2].set_group(group);
3594
3595 fSelectTubeModel[2].add_accelerator("activate", Glib::wrap(fAccelGroup, true),
3596 GDK_w, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
3597 fSelectTubeModel[2].signal_activate().connect(
3598 sigc::mem_fun(*this, &GxMainInterface::on_tube_activate));
3599 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fSelectTubeModel[2].gobj()));
3600 fSelectTubeModel[2].show();
3601 fSelectTubeModel[2].set_parameter(new SwitchParameter("system.select_tube3",true,false));
3602 fSelectTubeModel[2].set_active(false);
3603
3604 set_label(fSelectTubeModel[4], _("pre 12ax7/ master 6V6"));
3605 fSelectTubeModel[4].set_group(group);
3606
3607 fSelectTubeModel[4].add_accelerator("activate", Glib::wrap(fAccelGroup, true),
3608 GDK_z, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
3609 fSelectTubeModel[4].signal_activate().connect(
3610 sigc::mem_fun(*this, &GxMainInterface::on_tube_activate));
3611 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fSelectTubeModel[4].gobj()));
3612 fSelectTubeModel[4].show();
3613 fSelectTubeModel[4].set_parameter(new SwitchParameter("system.select_tube5",true,false));
3614 fSelectTubeModel[4].set_active(false);
3615
3616 set_label(fSelectTubeModel[3], _("pre 12AU7/ master 6V6"));
3617 fSelectTubeModel[3].set_group(group);
3618
3619 fSelectTubeModel[3].add_accelerator("activate", Glib::wrap(fAccelGroup, true),
3620 GDK_y, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
3621 fSelectTubeModel[3].signal_activate().connect(
3622 sigc::mem_fun(*this, &GxMainInterface::on_tube_activate));
3623 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fSelectTubeModel[3].gobj()));
3624 fSelectTubeModel[3].show();
3625 fSelectTubeModel[3].set_parameter(new SwitchParameter("system.select_tube4",true,false));
3626 fSelectTubeModel[3].set_active(false);
3627
3628 set_label(fSelectTubeModel[6], _("pre 6DJ8/ master 6V6"));
3629 fSelectTubeModel[6].set_group(group);
3630
3631 fSelectTubeModel[6].add_accelerator("activate", Glib::wrap(fAccelGroup, true),
3632 GDK_o, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
3633 fSelectTubeModel[6].signal_activate().connect(
3634 sigc::mem_fun(*this, &GxMainInterface::on_tube_activate));
3635 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fSelectTubeModel[6].gobj()));
3636 fSelectTubeModel[6].show();
3637 fSelectTubeModel[6].set_parameter(new SwitchParameter("system.select_tube12",true,false));
3638 fSelectTubeModel[6].set_active(false);
2477 void GxMainInterface::addAmpMenu() {
2478 GtkWidget* menulabel; // menu label
2479 GtkWidget* menucont; // menu container
2480 GtkWidget* sep; // seperator
2481 menucont = fMenuList["Top"];
2482
2483 /*---------------- Create Options menu items ------------------*/
2484 menulabel = gtk_menu_item_new_with_mnemonic(_("_Tube "));
2485 gtk_menu_bar_append(GTK_MENU_BAR(menucont), menulabel);
2486 gtk_widget_show(menulabel);
2487
2488 /*-- Create Options submenu --*/
2489 menucont = gtk_menu_new();
2490 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menulabel), menucont);
2491 gtk_widget_show(menucont);
2492
2493 /*-- Create toolbar check menu item under Options submenu --*/
2494 set_label(fSelectTubeModel[0], _("12ax7"));
2495 fSelectTubeModel[0].add_accelerator("activate", Glib::wrap(fAccelGroup, true),
2496 GDK_v, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
2497 fSelectTubeModel[0].signal_activate().connect(
2498 sigc::mem_fun(*this, &GxMainInterface::on_tube_activate));
2499 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fSelectTubeModel[0].gobj()));
2500 fSelectTubeModel[0].show();
2501
2502 fSelectTubeModel[0].set_parameter(new SwitchParameter("system.select_tube", true, false));
2503 Gtk::RadioMenuItem::Group group = fSelectTubeModel[0].get_group();
2504
2505 set_label(fSelectTubeModel[1], _("12AU7"));
2506 fSelectTubeModel[1].set_group(group);
2507
2508 fSelectTubeModel[1].add_accelerator("activate", Glib::wrap(fAccelGroup, true),
2509 GDK_u, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
2510 fSelectTubeModel[1].signal_activate().connect(
2511 sigc::mem_fun(*this, &GxMainInterface::on_tube_activate));
2512 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fSelectTubeModel[1].gobj()));
2513 fSelectTubeModel[1].show();
2514 fSelectTubeModel[1].set_parameter(new SwitchParameter("system.select_tube2", true, false));
2515 fSelectTubeModel[1].set_active(false);
2516
2517 set_label(fSelectTubeModel[5], _("6DJ8"));
2518 fSelectTubeModel[5].set_group(group);
2519
2520 fSelectTubeModel[5].add_accelerator("activate", Glib::wrap(fAccelGroup, true),
2521 GDK_e, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
2522 fSelectTubeModel[5].signal_activate().connect(
2523 sigc::mem_fun(*this, &GxMainInterface::on_tube_activate));
2524 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fSelectTubeModel[5].gobj()));
2525 fSelectTubeModel[5].show();
2526 fSelectTubeModel[5].set_parameter(new SwitchParameter("system.select_tube10", true, false));
2527 fSelectTubeModel[5].set_active(false);
2528
2529 set_label(fSelectTubeModel[2], _("6V6"));
2530 fSelectTubeModel[2].set_group(group);
2531
2532 fSelectTubeModel[2].add_accelerator("activate", Glib::wrap(fAccelGroup, true),
2533 GDK_w, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
2534 fSelectTubeModel[2].signal_activate().connect(
2535 sigc::mem_fun(*this, &GxMainInterface::on_tube_activate));
2536 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fSelectTubeModel[2].gobj()));
2537 fSelectTubeModel[2].show();
2538 fSelectTubeModel[2].set_parameter(new SwitchParameter("system.select_tube3", true, false));
2539 fSelectTubeModel[2].set_active(false);
2540
2541 /*-- add a separator line --*/
2542 sep = gtk_separator_menu_item_new();
2543 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), sep);
2544 gtk_widget_show(sep);
2545
2546 set_label(fSelectTubeModel[10], _("12ax7 feedback"));
2547 fSelectTubeModel[10].set_group(group);
2548
2549 fSelectTubeModel[10].add_accelerator("activate", Glib::wrap(fAccelGroup, true),
2550 GDK_n, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
2551 fSelectTubeModel[10].signal_activate().connect(
2552 sigc::mem_fun(*this, &GxMainInterface::on_tube_activate));
2553 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fSelectTubeModel[10].gobj()));
2554 fSelectTubeModel[10].show();
2555 fSelectTubeModel[10].set_parameter(new SwitchParameter("system.select_tube9", true, false));
2556 fSelectTubeModel[10].set_active(false);
2557
2558 set_label(fSelectTubeModel[11], _("12AU7 feedback"));
2559 fSelectTubeModel[11].set_group(group);
2560
2561 fSelectTubeModel[11].add_accelerator("activate", Glib::wrap(fAccelGroup, true),
2562 GDK_r, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
2563 fSelectTubeModel[11].signal_activate().connect(
2564 sigc::mem_fun(*this, &GxMainInterface::on_tube_activate));
2565 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fSelectTubeModel[11].gobj()));
2566 fSelectTubeModel[11].show();
2567 fSelectTubeModel[11].set_parameter(new SwitchParameter("system.select_tube11", true, false));
2568 fSelectTubeModel[11].set_active(false);
2569
2570 set_label(fSelectTubeModel[12], _("6DJ8 feedback"));
2571 fSelectTubeModel[12].set_group(group);
2572
2573 fSelectTubeModel[12].add_accelerator("activate", Glib::wrap(fAccelGroup, true),
2574 GDK_q, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
2575 fSelectTubeModel[12].signal_activate().connect(
2576 sigc::mem_fun(*this, &GxMainInterface::on_tube_activate));
2577 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fSelectTubeModel[12].gobj()));
2578 fSelectTubeModel[12].show();
2579 fSelectTubeModel[12].set_parameter(new SwitchParameter("system.select_tube13", true, false));
2580 fSelectTubeModel[12].set_active(false);
2581
2582 /*-- add a separator line --*/
2583 sep = gtk_separator_menu_item_new();
2584 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), sep);
2585 gtk_widget_show(sep);
2586
2587 set_label(fSelectTubeModel[4], _("pre 12ax7/ master 6V6"));
2588 fSelectTubeModel[4].set_group(group);
2589
2590 fSelectTubeModel[4].add_accelerator("activate", Glib::wrap(fAccelGroup, true),
2591 GDK_z, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
2592 fSelectTubeModel[4].signal_activate().connect(
2593 sigc::mem_fun(*this, &GxMainInterface::on_tube_activate));
2594 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fSelectTubeModel[4].gobj()));
2595 fSelectTubeModel[4].show();
2596 fSelectTubeModel[4].set_parameter(new SwitchParameter("system.select_tube5", true, false));
2597 fSelectTubeModel[4].set_active(false);
2598
2599 set_label(fSelectTubeModel[3], _("pre 12AU7/ master 6V6"));
2600 fSelectTubeModel[3].set_group(group);
2601
2602 fSelectTubeModel[3].add_accelerator("activate", Glib::wrap(fAccelGroup, true),
2603 GDK_y, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
2604 fSelectTubeModel[3].signal_activate().connect(
2605 sigc::mem_fun(*this, &GxMainInterface::on_tube_activate));
2606 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fSelectTubeModel[3].gobj()));
2607 fSelectTubeModel[3].show();
2608 fSelectTubeModel[3].set_parameter(new SwitchParameter("system.select_tube4", true, false));
2609 fSelectTubeModel[3].set_active(false);
2610
2611 set_label(fSelectTubeModel[6], _("pre 6DJ8/ master 6V6"));
2612 fSelectTubeModel[6].set_group(group);
2613
2614 fSelectTubeModel[6].add_accelerator("activate", Glib::wrap(fAccelGroup, true),
2615 GDK_o, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
2616 fSelectTubeModel[6].signal_activate().connect(
2617 sigc::mem_fun(*this, &GxMainInterface::on_tube_activate));
2618 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fSelectTubeModel[6].gobj()));
2619 fSelectTubeModel[6].show();
2620 fSelectTubeModel[6].set_parameter(new SwitchParameter("system.select_tube12", true, false));
2621 fSelectTubeModel[6].set_active(false);
2622
2623 /*-- add a separator line --*/
2624 sep = gtk_separator_menu_item_new();
2625 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), sep);
2626 gtk_widget_show(sep);
2627
2628 set_label(fSelectTubeModel[8], _("pre 12ax7/ push-pull 6V6"));
2629 fSelectTubeModel[8].set_group(group);
2630
2631 fSelectTubeModel[8].add_accelerator("activate", Glib::wrap(fAccelGroup, true),
2632 GDK_h, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
2633 fSelectTubeModel[8].signal_activate().connect(
2634 sigc::mem_fun(*this, &GxMainInterface::on_tube_activate));
2635 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fSelectTubeModel[8].gobj()));
2636 fSelectTubeModel[8].show();
2637 fSelectTubeModel[8].set_parameter(new SwitchParameter("system.select_tube7", true, false));
2638 fSelectTubeModel[8].set_active(false);
2639
2640 set_label(fSelectTubeModel[9], _("pre 12AU7/ push-pull 6V6"));
2641 fSelectTubeModel[9].set_group(group);
2642
2643 fSelectTubeModel[9].add_accelerator("activate", Glib::wrap(fAccelGroup, true),
2644 GDK_j, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
2645 fSelectTubeModel[9].signal_activate().connect(
2646 sigc::mem_fun(*this, &GxMainInterface::on_tube_activate));
2647 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fSelectTubeModel[9].gobj()));
2648 fSelectTubeModel[9].show();
2649 fSelectTubeModel[9].set_parameter(new SwitchParameter("system.select_tube8", true, false));
2650 fSelectTubeModel[9].set_active(false);
2651
2652 set_label(fSelectTubeModel[7], _("pre 6DJ8/ push-pull 6V6"));
2653 fSelectTubeModel[7].set_group(group);
2654
2655 fSelectTubeModel[7].add_accelerator("activate", Glib::wrap(fAccelGroup, true),
2656 GDK_g, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
2657 fSelectTubeModel[7].signal_activate().connect(
2658 sigc::mem_fun(*this, &GxMainInterface::on_tube_activate));
2659 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fSelectTubeModel[7].gobj()));
2660 fSelectTubeModel[7].show();
2661 fSelectTubeModel[7].set_parameter(new SwitchParameter("system.select_tube6", true, false));
2662 fSelectTubeModel[7].set_active(false);
36392663 }
36402664
36412665 //----------------------------- preset menu ----------------------------
3642 void GxMainInterface::addPluginMenu()
3643 {
3644 GtkWidget* menulabel; // menu label
3645 GtkWidget* menucont; // menu container
3646 GtkWidget* menucontin; // menu container
3647 GtkWidget* sep; // menu separator
3648
3649 menucont = fMenuList["Top"];
3650
3651 /*---------------- Create Options menu items ------------------*/
3652 menulabel = gtk_menu_item_new_with_mnemonic (_("P_lugins"));
3653 gtk_menu_bar_append (GTK_MENU_BAR(menucont), menulabel);
3654 gtk_widget_show(menulabel);
3655
3656 /*-- Create Options submenu --*/
3657 menucont = gtk_menu_new();
3658 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menulabel), menucont);
3659 gtk_widget_show(menucont);
3660 fMenuList["PluginMenu"] = menucont;
3661
3662 /*-- Create toolbar check menu item under Options submenu --*/
3663 set_label(fShowToolBar, _("show Plugin _Bar"));
3664 fShowToolBar.add_accelerator("activate", Glib::wrap(fAccelGroup, true),
3665 GDK_b, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
3666 fShowToolBar.signal_activate().connect(
3667 sigc::mem_fun(*this, &GxMainInterface::on_toolbar_activate));
3668 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fShowToolBar.gobj()));
3669 fShowToolBar.show();
3670 fShowToolBar.set_parameter(new SwitchParameter("system.show_toolbar"));
3671
3672 /*-- Create mono rack check menu item under Options submenu --*/
3673 set_label(fShowRRack, _("show _Rack"));
3674 fShowRRack.add_accelerator("activate", Glib::wrap(fAccelGroup, true),
3675 GDK_r, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
3676 fShowRRack.signal_activate().connect(
3677 sigc::mem_fun(*this, &GxMainInterface::on_rrack_activate));
3678 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fShowRRack.gobj()));
3679 fShowRRack.show();
3680 fShowRRack.set_parameter(new SwitchParameter("system.show_rrack"));
3681
3682 sep = gtk_separator_menu_item_new();
3683 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), sep);
3684 gtk_widget_show (sep);
3685
3686 /*-- Create mono rack check menu item under Options submenu --*/
3687 set_label(fShowRack, _("show Mono_Rack"));
3688 fShowRack.add_accelerator("activate", Glib::wrap(fAccelGroup, true),
3689 GDK_m, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
3690 fShowRack.signal_activate().connect(
3691 sigc::mem_fun(*this, &GxMainInterface::on_rack_activate));
3692 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fShowRack.gobj()));
3693 fShowRack.show();
3694 fShowRack.set_parameter(new SwitchParameter("system.show_rack"));
3695 /*-- Create mono plugin menu soket item under Options submenu --*/
3696 menulabel = gtk_menu_item_new_with_mnemonic (_("_Mono Plugins"));
3697
3698 gtk_menu_append (GTK_MENU(menucont), menulabel);
3699 gtk_widget_show(menulabel);
3700
3701 menucontin = gtk_menu_new();
3702 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menulabel), menucontin);
3703 gtk_widget_show(menucontin);
3704
3705 fMenuList["PluginsMono"] = menucontin;
3706 menu_mono_rack = fMenuList["PluginsMono"];
3707 sep = gtk_separator_menu_item_new();
3708 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), sep);
3709 gtk_widget_show (sep);
3710 /*-- create midi out menu --*/
3711 set_label(fShowMidiOut, _("MIDI out"));
3712 fShowMidiOut.add_accelerator("activate", Glib::wrap(fAccelGroup, true),
3713 GDK_a, Gdk::LOCK_MASK, Gtk::ACCEL_VISIBLE);
3714 g_signal_connect (GTK_OBJECT (fShowMidiOut.gobj()), "activate",
3715 G_CALLBACK (gx_midi_out), NULL);
3716
3717 gtk_menu_shell_append(GTK_MENU_SHELL(menucontin), GTK_WIDGET(fShowMidiOut.gobj()));
3718 fShowMidiOut.show();
3719 fShowMidiOut.set_parameter(new SwitchParameter("ui.midi_out"));
3720
3721
3722 /*-- add a separator line --*/
3723 sep = gtk_separator_menu_item_new();
3724 gtk_menu_shell_append(GTK_MENU_SHELL(menuh), sep);
3725 gtk_widget_show (sep);
3726
3727 /*-- Create stereo rack check menu item under Options submenu --*/
3728 set_label(fShowSRack, _("show _StereoRack"));
3729 fShowSRack.add_accelerator("activate", Glib::wrap(fAccelGroup, true),
3730 GDK_s, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
3731 fShowSRack.signal_activate().connect(
3732 sigc::mem_fun(*this, &GxMainInterface::on_srack_activate));
3733 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fShowSRack.gobj()));
3734 fShowSRack.show();
3735 fShowSRack.set_parameter(new SwitchParameter("system.show_Srack"));
3736
3737 /*-- Create stereo plugin menu soket item under Options submenu --*/
3738 menulabel = gtk_menu_item_new_with_mnemonic (_("_Stereo Plugins"));
3739
3740 gtk_menu_append (GTK_MENU(menucont), menulabel);
3741 gtk_widget_show(menulabel);
3742
3743 menucontin = gtk_menu_new();
3744 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menulabel), menucontin);
3745 gtk_widget_show(menucontin);
3746
3747 fMenuList["PluginsStereo"] = menucontin;
3748 menu_stereo_rack = fMenuList["PluginsStereo"];
3749
3750 sep = gtk_separator_menu_item_new();
3751 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), sep);
3752 gtk_widget_show (sep);
2666 void GxMainInterface::addPluginMenu() {
2667 GtkWidget* menulabel; // menu label
2668 GtkWidget* menucont; // menu container
2669 GtkWidget* menucontin; // menu container
2670 GtkWidget* sep; // menu separator
2671
2672 menucont = fMenuList["Top"];
2673
2674 /*---------------- Create Options menu items ------------------*/
2675 menulabel = gtk_menu_item_new_with_mnemonic(_("P_lugins"));
2676 gtk_menu_bar_append(GTK_MENU_BAR(menucont), menulabel);
2677 gtk_widget_show(menulabel);
2678
2679 /*-- Create Options submenu --*/
2680 menucont = gtk_menu_new();
2681 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menulabel), menucont);
2682 gtk_widget_show(menucont);
2683 fMenuList["PluginMenu"] = menucont;
2684
2685 /*-- Create toolbar check menu item under Options submenu --*/
2686 set_label(fShowToolBar, _("Show Plugin _Bar"));
2687 fShowToolBar.add_accelerator("activate", Glib::wrap(fAccelGroup, true),
2688 GDK_b, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
2689 fShowToolBar.signal_activate().connect(
2690 sigc::mem_fun(*this, &GxMainInterface::on_toolbar_activate));
2691 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fShowToolBar.gobj()));
2692 fShowToolBar.show();
2693 fShowToolBar.set_parameter(new SwitchParameter("system.show_toolbar"));
2694
2695 /*-- Create mono rack check menu item under Options submenu --*/
2696 set_label(fShowRRack, _("Show _Rack"));
2697 fShowRRack.add_accelerator("activate", Glib::wrap(fAccelGroup, true),
2698 GDK_r, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
2699 fShowRRack.signal_activate().connect(
2700 sigc::mem_fun(*this, &GxMainInterface::on_rrack_activate));
2701 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fShowRRack.gobj()));
2702 fShowRRack.show();
2703 fShowRRack.set_parameter(new SwitchParameter("system.show_rrack"));
2704
2705 sep = gtk_separator_menu_item_new();
2706 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), sep);
2707 gtk_widget_show(sep);
2708
2709 /*-- Create mono rack check menu item under Options submenu --*/
2710 set_label(fShowRack, _("Show Mono _Rack"));
2711 fShowRack.add_accelerator("activate", Glib::wrap(fAccelGroup, true),
2712 GDK_m, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
2713 fShowRack.signal_activate().connect(
2714 sigc::mem_fun(*this, &GxMainInterface::on_rack_activate));
2715 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fShowRack.gobj()));
2716 fShowRack.show();
2717 fShowRack.set_parameter(new SwitchParameter("system.show_rack"));
2718 /*-- Create mono plugin menu soket item under Options submenu --*/
2719 menulabel = gtk_menu_item_new_with_mnemonic(_("_Mono Plugins"));
2720
2721 gtk_menu_append(GTK_MENU(menucont), menulabel);
2722 gtk_widget_show(menulabel);
2723
2724 menucontin = gtk_menu_new();
2725 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menulabel), menucontin);
2726 gtk_widget_show(menucontin);
2727
2728 fMenuList["PluginsMono"] = menucontin;
2729 gw.menu_mono_rack = fMenuList["PluginMenu"];
2730 sep = gtk_separator_menu_item_new();
2731 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), sep);
2732 gtk_widget_show(sep);
2733 /*-- create midi out menu --*/
2734 set_label(fShowMidiOut, _("MIDI out"));
2735 fShowMidiOut.add_accelerator("activate", Glib::wrap(fAccelGroup, true),
2736 GDK_a, Gdk::LOCK_MASK, Gtk::ACCEL_VISIBLE);
2737 g_signal_connect(GTK_OBJECT(fShowMidiOut.gobj()), "activate",
2738 G_CALLBACK(gx_midi_out), NULL);
2739
2740 gtk_menu_shell_append(GTK_MENU_SHELL(menucontin), GTK_WIDGET(fShowMidiOut.gobj()));
2741 fShowMidiOut.show();
2742 fShowMidiOut.set_parameter(new SwitchParameter("ui.midi_out"));
2743
2744 /*-- add a separator line --*/
2745 sep = gtk_separator_menu_item_new();
2746 gtk_menu_shell_append(GTK_MENU_SHELL(gw.menuh), sep);
2747 gtk_widget_show(sep);
2748
2749 /*-- Create stereo rack check menu item under Options submenu --*/
2750 set_label(fShowSRack, _("Show _Stereo Rack"));
2751 fShowSRack.add_accelerator("activate", Glib::wrap(fAccelGroup, true),
2752 GDK_s, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
2753 fShowSRack.signal_activate().connect(
2754 sigc::mem_fun(*this, &GxMainInterface::on_srack_activate));
2755 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fShowSRack.gobj()));
2756 fShowSRack.show();
2757 fShowSRack.set_parameter(new SwitchParameter("system.show_Srack"));
2758
2759 /*-- Create stereo plugin menu soket item under Options submenu --*/
2760 menulabel = gtk_menu_item_new_with_mnemonic(_("_Stereo Plugins"));
2761
2762 gtk_menu_append(GTK_MENU(menucont), menulabel);
2763 gtk_widget_show(menulabel);
2764
2765 menucontin = gtk_menu_new();
2766 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menulabel), menucontin);
2767 gtk_widget_show(menucontin);
2768
2769 fMenuList["PluginsStereo"] = menucontin;
2770 gw.menu_stereo_rack = fMenuList["PluginsStereo"];
2771
2772 sep = gtk_separator_menu_item_new();
2773 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), sep);
2774 gtk_widget_show(sep);
37532775 }
37542776 //----------------------------- option menu ----------------------------
37552777
3756 static void set_tooltips(bool v)
3757 {
3758 gtk_settings_set_long_property(
3759 gtk_settings_get_default(),"gtk-enable-tooltips",v,
3760 "gx_head menu-option");
3761 }
3762
3763 void reset_all_parameters(GtkWidget*, gpointer)
3764 {
3765 for (ParamMap::iterator i = parameter_map.begin(); i != parameter_map.end(); i++) {
3766 i->second->set_std_value();
3767 }
3768 }
3769
3770 void GxMainInterface::addOptionMenu()
3771 {
3772 GtkWidget* menulabel; // menu label
3773 GtkWidget* menucont; // menu container
3774 GtkWidget* menuitem; // menu item
3775
3776 menucont = fMenuList["Top"];
3777
3778 /*---------------- Create Options menu items ------------------*/
3779 menulabel = gtk_menu_item_new_with_mnemonic (_("_Options"));
3780 gtk_menu_bar_append (GTK_MENU_BAR(menucont), menulabel);
3781 gtk_widget_show(menulabel);
3782
3783 /*-- Create Options submenu --*/
3784 menucont = gtk_menu_new();
3785 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menulabel), menucont);
3786 gtk_widget_show(menucont);
3787 fMenuList["Options"] = menucont;
3788
3789 /*-- Create Open check menu item under Options submenu --*/
3790 menuitem = gtk_check_menu_item_new_with_mnemonic (_("_Meterbridge"));
3791 gtk_widget_add_accelerator(menuitem, "activate", fAccelGroup,
3792 GDK_m, GDK_MOD1_MASK, GTK_ACCEL_VISIBLE);
3793 g_signal_connect (GTK_OBJECT (menuitem), "activate",
3794 G_CALLBACK (Meterbridge::start_stop), NULL);
3795 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuitem);
3796 gtk_widget_show (menuitem);
3797
3798 /*-- Create tuner check menu item under Options submenu --*/
3799 set_label(fShowTuner, _("_Tuner"));
3800 fShowTuner.add_accelerator("activate", Glib::wrap(fAccelGroup, true),
3801 GDK_t, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
3802 fShowTuner.signal_activate().connect(
3803 sigc::mem_fun(*this, &GxMainInterface::on_tuner_activate));
3804 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fShowTuner.gobj()));
3805 fShowTuner.show();
3806 fShowTuner.set_parameter(new SwitchParameter("system.show_tuner"));
3807
3808 /*-- Create skin menu under Options submenu--*/
3809 addGuiSkinMenu();
3810
3811 set_label(fSetMouse, _("set _Knobs linear"));
3812 fSetMouse.add_accelerator("activate", Glib::wrap(fAccelGroup, true),
3813 GDK_k, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
3814 fSetMouse.signal_activate().connect(
3815 sigc::mem_fun(*this, &GxMainInterface::set_mouse_mode));
3816 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fSetMouse.gobj()));
3817 fSetMouse.show();
3818 fSetMouse.set_parameter(new SwitchParameter("system.set_mouse"));
3819
3820 /*-- Create logbox check menu item under Options submenu --*/
3821 set_label(fShowLogger, _("show _Logging Box"));
3822 fShowLogger.add_accelerator("activate", Glib::wrap(fAccelGroup, true),
3823 GDK_l, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
3824 fShowLogger.signal_activate().connect(
3825 sigc::mem_fun(*this, &GxMainInterface::on_log_activate));
3826 gtk_menu_shell_append(GTK_MENU_SHELL(fMenuList["Options"]), GTK_WIDGET(fShowLogger.gobj()));
3827 fShowLogger.show();
3828 fShowLogger.set_parameter(new SwitchParameter("system.show_logger"));
3829
3830 /*-- Create menu item to control tooltip display --*/
3831 set_label(fShowTooltips, _("Show _Tooltips"));
3832 fShowTooltips.show();
3833 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fShowTooltips.gobj()));
3834 SwitchParameter *p = new SwitchParameter("system.show_tooltips");
3835 fShowTooltips.set_parameter(p);
3836 fShowTooltips.set_active(true);
3837 p->changed.connect(ptr_fun(set_tooltips));
3838
3839 /*-- create option for saving midi controller settings in presets --*/
3840 set_label(fMidiInPreset, _("Include MIDI in _presets"));
3841 fMidiInPreset.show();
3842 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fMidiInPreset.gobj()));
3843 fMidiInPreset.set_parameter(new SwitchParameter("system.midi_in_preset"));
3844
3845 /*-- create option for resetting gx_head settings --*/
3846 menuitem = gtk_menu_item_new_with_mnemonic (_("Reset _All Parameters"));
3847 gtk_widget_show (menuitem);
3848 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuitem);
3849 g_signal_connect(GTK_OBJECT(menuitem), "activate",
3850 G_CALLBACK(reset_all_parameters), NULL);
2778 static void set_tooltips(bool v) {
2779 gtk_settings_set_long_property(
2780 gtk_settings_get_default(), "gtk-enable-tooltips", v,
2781 "gx_head menu-option");
2782 }
2783
2784 void reset_all_parameters(GtkWidget*, gpointer) {
2785 for (ParamMap::iterator i = parameter_map.begin(); i != parameter_map.end(); i++) {
2786 i->second->set_std_value();
2787 }
2788 }
2789
2790 void GxMainInterface::addOptionMenu() {
2791 GtkWidget* menulabel; // menu label
2792 GtkWidget* menucont; // menu container
2793 GtkWidget* menuitem; // menu item
2794
2795 menucont = fMenuList["Top"];
2796
2797 /*---------------- Create Options menu items ------------------*/
2798 menulabel = gtk_menu_item_new_with_mnemonic(_("_Options"));
2799 gtk_menu_bar_append(GTK_MENU_BAR(menucont), menulabel);
2800 gtk_widget_show(menulabel);
2801
2802 /*-- Create Options submenu --*/
2803 menucont = gtk_menu_new();
2804 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menulabel), menucont);
2805 gtk_widget_show(menucont);
2806 fMenuList["Options"] = menucont;
2807
2808 /*-- Create Open check menu item under Options submenu --*/
2809 menuitem = gtk_check_menu_item_new_with_mnemonic(_("_Meterbridge"));
2810 gtk_widget_add_accelerator(menuitem, "activate", fAccelGroup,
2811 GDK_m, GDK_MOD1_MASK, GTK_ACCEL_VISIBLE);
2812 g_signal_connect(GTK_OBJECT(menuitem), "activate",
2813 G_CALLBACK(gx_child_process::Meterbridge::start_stop), NULL);
2814 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuitem);
2815 gtk_widget_show(menuitem);
2816
2817 /*-- Create tuner check menu item under Options submenu --*/
2818 set_label(fShowTuner, _("_Tuner"));
2819 fShowTuner.add_accelerator("activate", Glib::wrap(fAccelGroup, true),
2820 GDK_t, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
2821 fShowTuner.signal_activate().connect(
2822 sigc::mem_fun(*this, &GxMainInterface::on_tuner_activate));
2823 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fShowTuner.gobj()));
2824 fShowTuner.show();
2825 fShowTuner.set_parameter(new SwitchParameter("system.show_tuner"));
2826
2827 /*-- Create skin menu under Options submenu--*/
2828 addGuiSkinMenu();
2829
2830 set_label(fSetMouse, _("Set _Knobs Linear"));
2831 fSetMouse.add_accelerator("activate", Glib::wrap(fAccelGroup, true),
2832 GDK_k, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
2833 fSetMouse.signal_activate().connect(
2834 sigc::mem_fun(*this, &GxMainInterface::set_mouse_mode));
2835 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fSetMouse.gobj()));
2836 fSetMouse.show();
2837 fSetMouse.set_parameter(new SwitchParameter("system.set_mouse"));
2838
2839 /*-- Create logbox check menu item under Options submenu --*/
2840 set_label(fShowLogger, _("Show _Logging Box"));
2841 fShowLogger.add_accelerator("activate", Glib::wrap(fAccelGroup, true),
2842 GDK_l, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
2843 fShowLogger.signal_activate().connect(
2844 sigc::mem_fun(*this, &GxMainInterface::on_log_activate));
2845 gtk_menu_shell_append(GTK_MENU_SHELL(fMenuList["Options"]), GTK_WIDGET(fShowLogger.gobj()));
2846 fShowLogger.show();
2847 fShowLogger.set_parameter(new SwitchParameter("system.show_logger"));
2848
2849 /*-- Create menu item to control tooltip display --*/
2850 set_label(fShowTooltips, _("Show _Tooltips"));
2851 fShowTooltips.show();
2852 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fShowTooltips.gobj()));
2853 SwitchParameter *p = new SwitchParameter("system.show_tooltips");
2854 fShowTooltips.set_parameter(p);
2855 fShowTooltips.set_active(true);
2856 p->changed.connect(ptr_fun(set_tooltips));
2857
2858 /*-- create option for saving midi controller settings in presets --*/
2859 set_label(fMidiInPreset, _("Include MIDI in _presets"));
2860 fMidiInPreset.show();
2861 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), GTK_WIDGET(fMidiInPreset.gobj()));
2862 fMidiInPreset.set_parameter(new SwitchParameter("system.midi_in_preset"));
2863
2864 /*-- create option for resetting gx_head settings --*/
2865 menuitem = gtk_menu_item_new_with_mnemonic(_("Reset _All Parameters"));
2866 gtk_widget_show(menuitem);
2867 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuitem);
2868 g_signal_connect(GTK_OBJECT(menuitem), "activate",
2869 G_CALLBACK(reset_all_parameters), NULL);
38512870 }
38522871
38532872
38542873 //----------------------------- skin menu ----------------------------
3855 void GxMainInterface::addGuiSkinMenu()
3856 {
3857 GtkWidget* menulabel; // menu label
3858 GtkWidget* menucont; // menu container
3859 GtkWidget* menuitem; // menu item
3860 GSList * group = NULL;
3861
3862 menucont = fMenuList["Options"];
3863
3864 /*---------------- Create skin menu items ------------------*/
3865 menulabel = gtk_menu_item_new_with_mnemonic (_("_Skin..."));
3866 gtk_menu_append (GTK_MENU(menucont), menulabel);
3867 gtk_widget_show(menulabel);
3868
3869 menucont = gtk_menu_new();
3870 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menulabel), menucont);
3871 gtk_widget_show(menucont);
3872 fMenuList["Skin"] = menucont;
3873
3874 /* Create black skin item under skin submenu --*/
3875 guint idx = 0;
3876
3877 while (idx < skin_list.size())
3878 {
3879 menuitem =
3880 gtk_radio_menu_item_new_with_label (group, skin_list[idx].c_str());
3881
3882 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
3883
3884 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM (menuitem), FALSE);
3885 g_signal_connect (GTK_OBJECT (menuitem), "activate",
3886 G_CALLBACK (gx_change_skin), GINT_TO_POINTER(idx));
3887 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuitem);
3888 gtk_widget_show (menuitem);
3889 idx++;
3890 }
3891
3892 menucont = fMenuList["Options"];
3893
3894 menuitem = gtk_menu_item_new();
3895 gtk_widget_add_accelerator(menuitem, "activate", fAccelGroup,
3896 GDK_s, GDK_SHIFT_MASK, GTK_ACCEL_VISIBLE);
3897 g_signal_connect (GTK_OBJECT (menuitem), "activate",
3898 G_CALLBACK (gx_cycle_through_skin), NULL);
3899 gtk_menu_append (GTK_MENU(menucont), menuitem);
3900 gtk_widget_show (menuitem);
3901
3902 /*-- End skin menu declarations --*/
3903 }
3904
3905 //----------------------------- about menu ----------------------------
3906
3907
3908 void GxMainInterface::addAboutMenu()
3909 {
3910 GtkWidget* menulabel; // menu label
3911 GtkWidget* menucont; // menu container
3912 GtkWidget* menuitem; // menu item
3913
3914 menucont = fMenuList["Top"];
3915
3916 /*---------------- Start About menu declarations ----------------*/
3917 menulabel = gtk_menu_item_new_with_mnemonic (_("_About"));
3918 gtk_menu_bar_append (GTK_MENU_BAR(menucont), menulabel);
3919 gtk_widget_show(menulabel);
3920
3921 /*-- Create About submenu --*/
3922 menucont = gtk_menu_new();
3923 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menulabel), menucont);
3924
3925 /*-- Create About menu item under About submenu --*/
3926 menuitem = gtk_menu_item_new_with_mnemonic (_("_About"));
3927 gtk_widget_add_accelerator(menuitem, "activate", fAccelGroup,
3928 GDK_a, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
3929 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuitem);
3930 g_signal_connect(GTK_OBJECT (menuitem), "activate",
3931 G_CALLBACK (gx_show_about), NULL);
3932 gtk_widget_show (menuitem);
3933
3934 /*-- Create Help menu item under About submenu --*/
3935 menuitem = gtk_menu_item_new_with_mnemonic (_("_Help"));
3936 gtk_widget_add_accelerator(menuitem, "activate", fAccelGroup,
3937 GDK_h, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
3938 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuitem);
3939 // g_signal_connect(GTK_OBJECT (menuitem), "activate", G_CALLBACK (gx_show_about), NULL);
3940 gtk_widget_show (menuitem);
3941 /*---------------- End About menu declarations ----------------*/
2874 void GxMainInterface::addGuiSkinMenu() {
2875 GtkWidget* menulabel; // menu label
2876 GtkWidget* menucont; // menu container
2877 GtkWidget* menuitem; // menu item
2878 GSList * group = NULL;
2879
2880 menucont = fMenuList["Options"];
2881
2882 /*---------------- Create skin menu items ------------------*/
2883 menulabel = gtk_menu_item_new_with_mnemonic(_("_Skin..."));
2884 gtk_menu_append(GTK_MENU(menucont), menulabel);
2885 gtk_widget_show(menulabel);
2886
2887 menucont = gtk_menu_new();
2888 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menulabel), menucont);
2889 gtk_widget_show(menucont);
2890 fMenuList["Skin"] = menucont;
2891
2892 /* Create black skin item under skin submenu --*/
2893 guint idx = 0;
2894
2895 while (idx < skin.skin_list.size()) {
2896 menuitem =
2897 gtk_radio_menu_item_new_with_label(group, skin.skin_list[idx].c_str());
2898
2899 group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(menuitem));
2900
2901 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), FALSE);
2902 g_signal_connect(GTK_OBJECT(menuitem), "activate",
2903 G_CALLBACK(gx_change_skin), GINT_TO_POINTER(idx));
2904 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuitem);
2905 gtk_widget_show(menuitem);
2906 idx++;
2907 }
2908
2909 menucont = fMenuList["Options"];
2910
2911 menuitem = gtk_menu_item_new();
2912 gtk_widget_add_accelerator(menuitem, "activate", fAccelGroup,
2913 GDK_s, GDK_SHIFT_MASK, GTK_ACCEL_VISIBLE);
2914 g_signal_connect(GTK_OBJECT(menuitem), "activate",
2915 G_CALLBACK(gx_cycle_through_skin), NULL);
2916 gtk_menu_append(GTK_MENU(menucont), menuitem);
2917 gtk_widget_show(menuitem);
2918
2919 /*-- End skin menu declarations --*/
2920 }
2921
2922 // ----------------------------- about menu ----------------------------
2923
2924
2925 void GxMainInterface::addAboutMenu() {
2926 GtkWidget* menulabel; // menu label
2927 GtkWidget* menucont; // menu container
2928 GtkWidget* menuitem; // menu item
2929
2930 menucont = fMenuList["Top"];
2931
2932 /*---------------- Start About menu declarations ----------------*/
2933 menulabel = gtk_menu_item_new_with_mnemonic(_("_About"));
2934 gtk_menu_bar_append(GTK_MENU_BAR(menucont), menulabel);
2935 gtk_widget_show(menulabel);
2936
2937 /*-- Create About submenu --*/
2938 menucont = gtk_menu_new();
2939 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menulabel), menucont);
2940
2941 /*-- Create About menu item under About submenu --*/
2942 menuitem = gtk_menu_item_new_with_mnemonic(_("_About"));
2943 gtk_widget_add_accelerator(menuitem, "activate", fAccelGroup,
2944 GDK_a, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
2945 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuitem);
2946 g_signal_connect(GTK_OBJECT(menuitem), "activate",
2947 G_CALLBACK(gx_show_about), NULL);
2948 gtk_widget_show(menuitem);
2949
2950 /*-- Create Help menu item under About submenu --*/
2951 menuitem = gtk_menu_item_new_with_mnemonic(_("_Help"));
2952 gtk_widget_add_accelerator(menuitem, "activate", fAccelGroup,
2953 GDK_h, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
2954 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuitem);
2955 // g_signal_connect(GTK_OBJECT (menuitem), "activate", G_CALLBACK (gx_show_about), NULL);
2956 gtk_widget_show(menuitem);
2957 /*---------------- End About menu declarations ----------------*/
39422958 }
39432959
39442960 /*---------------- Jack Server Menu ----------------*/
3945 void GxMainInterface::addJackServerMenu()
3946 {
3947 GtkWidget* menulabel; // menu label
3948 GtkWidget* menucont; // menu container
3949 GtkWidget* menuitem; // menu item
3950 GSList * group = NULL;
3951
3952 menucont = fMenuList["Engine"];
3953
3954 /*-- Create Jack Connection toggle button --*/
3955 menuitem = gtk_check_menu_item_new_with_mnemonic (_("Jack Server _Connection "));
3956 gtk_widget_add_accelerator(menuitem, "activate", fAccelGroup,
3957 GDK_c, GDK_SHIFT_MASK, GTK_ACCEL_VISIBLE);
3958 g_signal_connect (GTK_OBJECT (menuitem), "activate",
3959 G_CALLBACK (gx_jack::gx_jack_connection), NULL);
3960 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuitem);
3961
3962 gtk_widget_show (menuitem);
3963 fJackConnectItem = menuitem;
3964
3965 /*-- create Jack Ports menu item --*/
3966 menuitem = gtk_check_menu_item_new_with_mnemonic (_("Jack _Ports "));
3967 gtk_widget_add_accelerator(menuitem, "activate", fAccelGroup,
3968 GDK_p, GDK_SHIFT_MASK, GTK_ACCEL_VISIBLE);
3969 g_signal_connect (GTK_OBJECT (menuitem), "activate",
3970 G_CALLBACK (PortMapWindow::toggle), menuitem);
3971 gtk_menu_shell_append(GTK_MENU_SHELL(menuh), menuitem);
3972 gtk_widget_show (menuitem);
3973
3974 /*-- Create Latency submenu under Jack Server submenu --*/
3975 menulabel = gtk_menu_item_new_with_mnemonic (_("_Latency"));
3976 gtk_menu_append (GTK_MENU(menucont), menulabel);
3977 gtk_widget_show(menulabel);
3978
3979 menucont = gtk_menu_new();
3980 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menulabel), menucont);
3981
3982 /*-- Create menu item under Latency submenu --*/
3983 gchar buf_size[8];
3984 const int min_pow = 5; // 2**5 = 32
3985 const int max_pow = 13; // 2**13 = 8192
3986 group = NULL;
3987
3988 for (int i = min_pow; i <= max_pow; i++)
3989 {
3990 int jack_buffer_size = (int)pow(2.,i);
3991 (void)snprintf(buf_size, 5, "%d", jack_buffer_size);
3992 menuitem = gtk_radio_menu_item_new_with_label (group, buf_size);
3993 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
3994 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menuitem), FALSE);
3995
3996 g_signal_connect (GTK_OBJECT (menuitem), "activate",
3997 G_CALLBACK (gx_jack::gx_set_jack_buffer_size),
3998 GINT_TO_POINTER(jack_buffer_size));
3999
4000 // display actual buffer size as default
4001 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuitem);
4002 gtk_widget_show (menuitem);
4003
4004 fJackLatencyItem[i-min_pow] = menuitem;
4005 }
4006 }
4007
4008
4009 void GxMainInterface::set_waveview_buffer()
4010 {
4011 fWaveView.set_frame(gx_engine::result, gx_jack::jack_bs);
4012 }
4013
4014 //---- show main GUI
4015 void GxMainInterface::show()
4016 {
2961 void GxMainInterface::addJackServerMenu() {
2962 GtkWidget* menulabel; // menu label
2963 GtkWidget* menucont; // menu container
2964 GtkWidget* menuitem; // menu item
2965 GSList * group = NULL;
2966
2967 menucont = fMenuList["Engine"];
2968
2969 /*-- Create Jack Connection toggle button --*/
2970 menuitem = gtk_check_menu_item_new_with_mnemonic(_("Jack Server _Connection "));
2971 gtk_widget_add_accelerator(menuitem, "activate", fAccelGroup,
2972 GDK_c, GDK_SHIFT_MASK, GTK_ACCEL_VISIBLE);
2973 g_signal_connect(GTK_OBJECT(menuitem), "activate",
2974 G_CALLBACK(gx_jack::gx_jack_connection), NULL);
2975 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuitem);
2976
2977 gtk_widget_show(menuitem);
2978 fJackConnectItem = menuitem;
2979
2980 /*-- create Jack Ports menu item --*/
2981 menuitem = gtk_check_menu_item_new_with_mnemonic(_("Jack _Ports "));
2982 gtk_widget_add_accelerator(menuitem, "activate", fAccelGroup,
2983 GDK_p, GDK_SHIFT_MASK, GTK_ACCEL_VISIBLE);
2984 g_signal_connect(GTK_OBJECT(menuitem), "activate",
2985 G_CALLBACK(gx_portmap::PortMapWindow::toggle), menuitem);
2986 gtk_menu_shell_append(GTK_MENU_SHELL(gw.menuh), menuitem);
2987 gtk_widget_show(menuitem);
2988
2989 /*-- Create Latency submenu under Jack Server submenu --*/
2990 menulabel = gtk_menu_item_new_with_mnemonic(_("_Latency"));
2991 gtk_menu_append(GTK_MENU(menucont), menulabel);
2992 gtk_widget_show(menulabel);
2993
2994 menucont = gtk_menu_new();
2995 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menulabel), menucont);
2996
2997 /*-- Create menu item under Latency submenu --*/
2998 gchar buf_size[8];
2999 const int min_pow = 5; // 2**5 = 32
3000 const int max_pow = 13; // 2**13 = 8192
3001 group = NULL;
3002
3003 for (int i = min_pow; i <= max_pow; i++) {
3004 int jack_buffer_size = static_cast<int>(pow(2., i));
3005 (void)snprintf(buf_size, sizeof(buf_size), "%d", jack_buffer_size);
3006 menuitem = gtk_radio_menu_item_new_with_label(group, buf_size);
3007 group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(menuitem));
3008 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), FALSE);
3009
3010 g_signal_connect(GTK_OBJECT(menuitem), "activate",
3011 G_CALLBACK(gx_jack::gx_set_jack_buffer_size),
3012 GINT_TO_POINTER(jack_buffer_size));
3013
3014 // display actual buffer size as default
3015 gtk_menu_shell_append(GTK_MENU_SHELL(menucont), menuitem);
3016 gtk_widget_show(menuitem);
3017
3018 fJackLatencyItem[i-min_pow] = menuitem;
3019 }
3020 }
3021
3022
3023 void GxMainInterface::set_waveview_buffer() {
3024 fWaveView.set_frame(gx_engine::result, gx_jack::gxjack.jack_bs);
3025 }
3026
3027 // ---- show main GUI
3028 void GxMainInterface::show() {
40173029 #ifndef NDEBUG
4018 ui_thread = pthread_self();
3030 ui_thread = pthread_self();
40193031 #endif
4020 assert(fTop == 0);
4021 gx_init_pixmaps();
4022 fInitialized = true;
4023
4024 if (gx_jack::client) {
4025 // refresh some GUI stuff
4026 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(fJackConnectItem), TRUE);
4027
4028 GtkWidget* wd = getJackLatencyItem(gx_jack::jack_bs);
4029 if (wd) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(wd), TRUE);
4030
4031 //string window_name = "gx_head"; FIXME is set by recall settings
4032 //gtk_window_set_title (GTK_WINDOW (fWindow), window_name.c_str());
4033
4034 } else {
4035 gtk_widget_hide(gx_gui::gx_jackd_on_image);
4036 gtk_widget_show(gx_gui::gx_jackd_off_image);
4037 }
4038
4039 gint mainxorg = gx_set_mx_oriantation();
4040 gint mainyorg = gx_set_my_oriantation();
4041 gtk_window_move(GTK_WINDOW(fWindow), mainxorg, mainyorg);
4042 gtk_widget_show (fBox[0]);
4043 gtk_widget_show (fWindow);
4044 }
4045
4046 //---- show main GUI thread and more
4047 void GxMainInterface::run()
4048 {
4049 //----- set the state for the latency change warning widget
4050 gx_engine::set_latency_warning_change();
4051
4052 //----- set the last used skin when no cmd is given
4053 int skin_index = gx_current_skin;
4054 if (no_opt_skin == 1)
4055 skin_index = (int)gx_engine::audio.fskin;
4056
4057 gx_set_skin_change(skin_index);
4058 gx_update_skin_menu_item(skin_index);
4059
4060 /* timeout in milliseconds */
4061 g_threads[0] = g_timeout_add(40, gx_update_all_gui, 0);
4062 // Note: meter display timeout is a global var in gx_gui namespace
4063 g_threads[1] = g_timeout_add(meter_display_timeout, gx_refresh_meter_level, 0);
4064 // watch tread for cabinet switch
4065 g_threads[3] = g_timeout_add(200, gx_check_cab_state, 0);
4066
4067 GError* err = NULL;
4068 // -------------- start helper thread for ladi signal USR1 ------------
4069 if (g_thread_create(gx_signal_helper_thread, NULL, FALSE, &err) == NULL) {
4070 gx_print_fatal(_("system startup"), string(_("Thread create failed (signal): ")) + err->message);
4071 g_error_free(err);
4072 return;
4073 }
4074
4075 // -------------- start helper thread for midi control ------------
4076 sem_init (&program_change_sem, 0, 0);
4077
4078 if (g_thread_create(gx_program_change_helper_thread, NULL, FALSE, &err) == NULL) {
4079 gx_print_fatal(_("system startup"), string(_("Thread create failed (midi): ")) + err->message);
4080 g_error_free(err);
4081 return;
4082 }
4083
4084 set_waveview_buffer();
4085 gtk_main();
3032 assert(fTop == 0);
3033 gx_cairo::gx_init_pixmaps();
3034 fInitialized = true;
3035
3036 if (gx_jack::gxjack.client) {
3037 // refresh some GUI stuff
3038 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(fJackConnectItem), TRUE);
3039
3040 GtkWidget* wd = getJackLatencyItem(gx_jack::gxjack.jack_bs);
3041 if (wd) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(wd), TRUE);
3042
3043 // string window_name = "gx_head"; FIXME is set by recall settings
3044 // gtk_window_set_title (GTK_WINDOW (gw.fWindow), window_name.c_str());
3045
3046 } else {
3047 gtk_widget_hide(gx_gui::gw.gx_jackd_on_image);
3048 gtk_widget_show(gx_gui::gw.gx_jackd_off_image);
3049 }
3050
3051 gint mainxorg = gx_set_mx_oriantation();
3052 gint mainyorg = gx_set_my_oriantation();
3053 gtk_window_move(GTK_WINDOW(gw.fWindow), mainxorg, mainyorg);
3054 gtk_widget_show(fBox[0]);
3055 gtk_widget_show(gw.fWindow);
3056 }
3057
3058 // ---- show main GUI thread and more
3059 void GxMainInterface::run() {
3060 // ----- set the state for the latency change warning widget
3061 gx_engine::set_latency_warning_change();
3062
3063 // ----- set the last used skin when no cmd is given
3064 int skin_index = skin.gx_current_skin;
3065 if (skin.no_opt_skin == 1)
3066 skin_index = static_cast<int>(gx_engine::audio.fskin);
3067
3068 gx_set_skin_change(skin_index);
3069 gx_update_skin_menu_item(skin_index);
3070
3071 /* timeout in milliseconds */
3072 g_threads[0] = g_timeout_add(40, gx_threads::gx_update_all_gui, 0);
3073 // Note: meter display timeout is a global var in gx_gui namespace
3074 g_threads[1] = g_timeout_add(meter_display_timeout, gx_threads::gx_refresh_meter_level, 0);
3075 // watch tread for cabinet switch
3076 g_threads[3] = g_timeout_add(200, gx_threads::gx_check_cab_state, 0);
3077
3078 GError* err = NULL;
3079 // -------------- start helper thread for ladi signal USR1 ------------
3080 if (g_thread_create(gx_threads::gx_signal_helper_thread, NULL, FALSE, &err) == NULL) {
3081 gx_system::gx_print_fatal(_("system startup"),
3082 string(_("Thread create failed (signal): ")) + err->message);
3083 g_error_free(err);
3084 return;
3085 }
3086 #ifndef IS_MACOSX
3087 // -------------- start helper thread for midi control ------------
3088 int semaphor = sem_init(&program_change_sem, 0, 0);
3089 if (semaphor != 0) {
3090 gx_system::gx_print_error(_("system startup"),
3091 string(_("create semaphor failed (midi): preset switch disabled")));
3092 } else {
3093 if (g_thread_create(gx_threads::gx_program_change_helper_thread,
3094 NULL, FALSE, &err) == NULL) {
3095 gx_system::gx_print_fatal(_("system startup"),
3096 string(_("Thread create failed (midi): ")) + err->message);
3097 g_error_free(err);
3098 return;
3099 }
3100 }
3101 #endif
3102 set_waveview_buffer();
3103 gtk_main();
40863104 }
40873105
40883106 } /* end of gx_gui namespace */
+0
-399
src/gx_head/gx_main_midi.cc less more
0 /*
1 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * ---------------------------------------------------------------------------
17 *
18 * This file is part of the guitarix GUI main class
19 *
20 * ----------------------------------------------------------------------------
21 */
22
23
24 /****************************************************************
25 ** MidiControllerTable
26 */
27
28 class MidiControllerTable: public sigc::trackable
29 {
30 private:
31 enum {RESPONSE_DELETE_SELECTED};
32 static GtkWidget *window; // there can only be 1 window
33 GtkToggleButton *togglebutton;
34 GtkTreeSelection *selection;
35 GtkListStore *store;
36 GtkCheckMenuItem *menuitem;
37 static void response_cb(GtkWidget *widget, gint response_id, gpointer data);
38 static void edited_cb(GtkCellRendererText *renderer, gchar *path, gchar *new_text, gpointer data);
39 static void destroy_cb(GtkWidget*, gpointer data);
40 static void toggleButtonSetSwitch(GtkWidget *w, gpointer data);
41 void set(bool);
42 void load();
43 MidiControllerTable(GtkCheckMenuItem *item);
44 ~MidiControllerTable();
45 public:
46 static void toggle(GtkWidget* widget, gpointer data);
47 };
48
49 GtkWidget *MidiControllerTable::window = 0;
50
51 void MidiControllerTable::response_cb(GtkWidget *widget, gint response_id, gpointer data)
52 {
53 MidiControllerTable& m = *(MidiControllerTable*)data;
54 if (response_id == RESPONSE_DELETE_SELECTED) {
55 GtkTreeModel *model;
56 GList *list = gtk_tree_selection_get_selected_rows(m.selection, &model);
57 gtk_tree_selection_unselect_all(m.selection);
58 for (GList *p = g_list_last(list); p; p = g_list_previous(p)) {
59 GtkTreeIter iter;
60 gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, (GtkTreePath*)p->data);
61 const char* id;
62 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 7, &id, -1);
63 controller_map.deleteParameter(parameter_map[id], true);
64 gtk_tree_path_free((GtkTreePath*)p->data);
65 }
66 g_list_free (list);
67 m.load();
68 return;
69 }
70 gtk_check_menu_item_set_active(m.menuitem, FALSE);
71 }
72
73 void MidiControllerTable::destroy_cb(GtkWidget*, gpointer data)
74 {
75 delete (MidiControllerTable*)data;
76 }
77
78 void MidiControllerTable::edited_cb(
79 GtkCellRendererText *renderer, gchar *path, gchar *new_text, gpointer data)
80 {
81 GtkListStore *store = GTK_LIST_STORE(data);
82 GtkTreeIter iter;
83 gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(store), &iter, path);
84 int ctrl;
85 gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, 0, &ctrl, -1);
86 midi_std_ctr.replace(ctrl, new_text);
87 bool valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter);
88 const char *name = midi_std_ctr[ctrl].c_str();
89 while (valid) {
90 int n;
91 gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, 0, &n, -1);
92 if (n == ctrl) {
93 gtk_list_store_set(store, &iter, 1, name, -1);
94 }
95 valid = gtk_tree_model_iter_next (GTK_TREE_MODEL(store), &iter);
96 }
97 }
98
99 void MidiControllerTable::toggleButtonSetSwitch(GtkWidget *w, gpointer data)
100 {
101 SwitchParameter *p = (SwitchParameter*)data;
102 p->set(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)));
103 }
104
105 void MidiControllerTable::set(bool v)
106 {
107 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(togglebutton), v);
108 }
109
110 void MidiControllerTable::load()
111 {
112 GtkTreeIter iter;
113 gtk_list_store_clear(store);
114 for (int i = 0; i < controller_map.size(); i++) {
115 midi_controller_list& cl = controller_map[i];
116 for (midi_controller_list::iterator j = cl.begin(); j != cl.end(); j++) {
117 Parameter& p = j->getParameter();
118 string low, up;
119 const char *tp;
120 float step = p.getStepAsFloat();
121 if (p.getControlType() == Parameter::Continuous) {
122 tp = "Scale";
123 low = fformat(j->lower(), step);
124 up = fformat(j->upper(), step);
125 } else if (p.getControlType() == Parameter::Enum) {
126 tp = "Select";
127 low = fformat(j->lower(), step);
128 up = fformat(j->upper(), step);
129 } else if (p.getControlType() == Parameter::Switch) {
130 tp = "Switch";
131 low = up = "";
132 } else {
133 tp = "??";
134 assert(false);
135 }
136 gtk_list_store_append(store, &iter);
137 gtk_list_store_set(store, &iter,
138 0, i,
139 1, midi_std_ctr[i].c_str(),
140 2, p.group().c_str(),
141 3, p.name().c_str(),
142 4, tp,
143 5, low.c_str(),
144 6, up.c_str(),
145 7, p.id().c_str(),
146 -1);
147 }
148 }
149 }
150
151 void MidiControllerTable::toggle(GtkWidget* widget, gpointer data)
152 {
153 if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(data))) {
154 if (window) {
155 gtk_widget_destroy(window);
156 }
157 } else {
158 if (!window) {
159 new MidiControllerTable(GTK_CHECK_MENU_ITEM(data));
160 }
161 }
162 }
163
164 MidiControllerTable::~MidiControllerTable()
165 {
166 window = NULL;
167 gtk_widget_unref(GTK_WIDGET(menuitem));
168 }
169
170 MidiControllerTable::MidiControllerTable(GtkCheckMenuItem *item)
171 {
172 menuitem = item;
173 gtk_widget_ref(GTK_WIDGET(item));
174
175 GtkBuilder * builder = gtk_builder_new();
176 window = load_toplevel(builder, "midi.glade", "MidiControllerTable");
177 store = GTK_LIST_STORE(gtk_builder_get_object(builder, "liststore1"));
178 togglebutton = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "save_controller"));
179
180 SwitchParameter& param = parameter_map["system.midi_in_preset"].getSwitch();
181 gtk_toggle_button_set_active(togglebutton, param.get());
182 param.changed.connect(sigc::mem_fun(*this, &MidiControllerTable::set));
183 g_signal_connect(GTK_OBJECT(togglebutton), "toggled",
184 G_CALLBACK(toggleButtonSetSwitch), (gpointer)&param);
185 selection = gtk_tree_view_get_selection(
186 GTK_TREE_VIEW(gtk_builder_get_object(builder, "treeview1")));
187 gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE);
188
189 load();
190
191 g_signal_connect(window, "destroy", G_CALLBACK(destroy_cb), this);
192 g_signal_connect(window, "response", G_CALLBACK(response_cb), this);
193 g_signal_connect(G_OBJECT(gtk_builder_get_object(builder, "cellrenderertext2")),
194 "edited", G_CALLBACK(edited_cb), store);
195
196 gtk_window_add_accel_group(GTK_WINDOW(window),
197 GxMainInterface::instance()->fAccelGroup);
198
199 gtk_widget_show(window);
200 g_object_unref(G_OBJECT(builder));
201 controller_map.changed.connect(sigc::mem_fun(*this, &MidiControllerTable::load));
202 }
203
204
205 /*****************************************************************
206 ** Midi Control
207 */
208
209 class MidiConnect
210 {
211 private:
212 enum { RESPONSE_DELETE = 1 };
213 Parameter &param;
214 GtkAdjustment* adj_lower;
215 GtkAdjustment* adj_upper;
216 GtkWidget* dialog;
217 GtkWidget* entry_new;
218 GtkWidget* label_desc;
219 int current_control;
220 static string ctr_desc(int ctr);
221 static const char *ctl_to_str(int n);
222 public:
223 MidiConnect(GdkEventButton *event, Parameter& param);
224 static void midi_response_cb(GtkWidget *widget, gint response_id, gpointer data);
225 static void midi_destroy_cb(GtkWidget *widget, gpointer data);
226 static gboolean check_midi_cb(gpointer);
227 static void changed_text_handler (GtkEditable *entry, gpointer data);
228 };
229
230 string MidiConnect::ctr_desc(int ctr)
231 {
232 string p = midi_std_ctr[ctr];
233 if (p.empty())
234 return p;
235 return "(" + p + ")";
236 }
237
238
239 void MidiConnect::midi_response_cb(GtkWidget *widget, gint response_id, gpointer data)
240 {
241 MidiConnect* m = (MidiConnect*)data;
242 switch (response_id) {
243 case GTK_RESPONSE_OK:
244 if (m->param.getControlType() == Parameter::Continuous ||
245 m->param.getControlType() == Parameter::Enum) {
246 assert(m->adj_lower);
247 assert(m->adj_upper);
248 float lower = gtk_adjustment_get_value(m->adj_lower);
249 float upper = gtk_adjustment_get_value(m->adj_upper);
250 controller_map.modifyCurrent(m->param, lower, upper);
251 } else {
252 controller_map.modifyCurrent(m->param, 0, 0);
253 }
254 break;
255 case RESPONSE_DELETE:
256 controller_map.deleteParameter(m->param);
257 break;
258 }
259 gtk_widget_destroy(m->dialog);
260 }
261
262 void MidiConnect::midi_destroy_cb(GtkWidget *widget, gpointer data)
263 {
264 MidiConnect *m = (MidiConnect*)data;
265 controller_map.set_config_mode(false);
266 delete m;
267 }
268
269 const char* MidiConnect::ctl_to_str(int n)
270 {
271 static char buf[12];
272 if (n < 0)
273 strcpy(buf, "---");
274 else
275 snprintf(buf, sizeof(buf), "%3d", n);
276 return buf;
277 }
278
279 gboolean MidiConnect::check_midi_cb(gpointer data)
280 {
281 MidiConnect *m = (MidiConnect*)data;
282 if (!controller_map.get_config_mode())
283 return FALSE;
284 int ctl = controller_map.get_current_control();
285 if (m->current_control == ctl)
286 return TRUE;
287 m->current_control = ctl;
288 gtk_entry_set_text(GTK_ENTRY(m->entry_new), ctl_to_str(ctl));
289 return TRUE;
290 }
291
292 void MidiConnect::changed_text_handler (GtkEditable *editable, gpointer data)
293 {
294 MidiConnect *m = (MidiConnect*)data;
295 gchar *p = gtk_editable_get_chars(editable, 0, -1);
296 ostringstream buf;
297 for (const char *q = p; *q; q++) {
298 if (isdigit(*q)) {
299 buf << *q;
300 }
301 }
302 string str = buf.str();
303 int n = -1;
304 if (!str.empty()) {
305 istringstream i(buf.str());
306 i >> n;
307 if (n > 127) {
308 n = 127;
309 }
310 ostringstream b;
311 b << n;
312 str = b.str().substr(0,3);
313 }
314 // prevent infinite loop because after it has changed the text
315 // the handler will be called again (and make sure the text
316 // tranformation in this handler is idempotent!)
317 if (str == p) {
318 if (str.empty()) {
319 gtk_dialog_set_response_sensitive(GTK_DIALOG(m->dialog), GTK_RESPONSE_OK, FALSE);
320 gtk_dialog_set_default_response(GTK_DIALOG(m->dialog), GTK_RESPONSE_CANCEL);
321 } else {
322 gtk_dialog_set_response_sensitive(GTK_DIALOG(m->dialog), GTK_RESPONSE_OK, TRUE);
323 gtk_dialog_set_default_response(GTK_DIALOG(m->dialog), GTK_RESPONSE_OK);
324 }
325 gtk_label_set_text(GTK_LABEL(m->label_desc), ctr_desc(n).c_str());
326 controller_map.set_current_control(n);
327 m->current_control = n;
328 return;
329 }
330 gtk_editable_delete_text(editable, 0, -1);
331 gint position = 0;
332 gtk_editable_insert_text(editable, str.c_str(), str.size(), &position);
333 }
334
335
336 MidiConnect::MidiConnect(GdkEventButton *event, Parameter &param):
337 param(param),
338 current_control(-1)
339 {
340 GtkBuilder * builder = gtk_builder_new();
341 dialog = load_toplevel(builder, "midi.glade", "MidiConnect");
342 GtkWidget *zn = GTK_WIDGET(gtk_builder_get_object(builder, "zone_name"));
343 GtkStyle *style = gtk_widget_get_style(zn);
344 pango_font_description_set_size(style->font_desc, 12*PANGO_SCALE);
345 pango_font_description_set_weight(style->font_desc, PANGO_WEIGHT_BOLD);
346 gtk_widget_modify_font(zn, style->font_desc);
347 gtk_label_set_text(GTK_LABEL(zn), (param.group() + ": " + param.name()).c_str());
348 const MidiController *pctrl;
349 int nctl = controller_map.param2controller(param, &pctrl);
350 if (param.getControlType() == Parameter::Continuous ||
351 param.getControlType() == Parameter::Enum) {
352 float lower = param.getLowerAsFloat();
353 float upper = param.getUpperAsFloat();
354 float step = param.getStepAsFloat();
355 GtkSpinButton *spinner;
356 adj_lower = GTK_ADJUSTMENT(gtk_adjustment_new(lower, lower, upper, step, 10*step, 0));
357 spinner = GTK_SPIN_BUTTON(gtk_builder_get_object(builder, "lower"));
358 float climb_rate = 0.0;
359 gtk_spin_button_configure(spinner, adj_lower, climb_rate, precision(step));
360 adj_upper = GTK_ADJUSTMENT(gtk_adjustment_new(upper, lower, upper, step, 10*step, 0));
361 spinner = GTK_SPIN_BUTTON(gtk_builder_get_object(builder, "upper"));
362 gtk_spin_button_configure(spinner, adj_upper, climb_rate, precision(step));
363 if (nctl != -1) {
364 gtk_adjustment_set_value(adj_lower, pctrl->lower());
365 gtk_adjustment_set_value(adj_upper, pctrl->upper());
366 }
367 } else {
368 adj_lower = adj_upper = 0;
369 gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object(builder, "range_label")));
370 gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object(builder, "range_box")));
371 }
372 entry_new = GTK_WIDGET(gtk_builder_get_object(builder, "new"));
373 label_desc = GTK_WIDGET(gtk_builder_get_object(builder, "new_desc"));
374 g_signal_connect(dialog, "response", G_CALLBACK(midi_response_cb), this);
375 g_signal_connect(dialog, "destroy", G_CALLBACK(midi_destroy_cb), this);
376 g_signal_connect(entry_new, "changed", G_CALLBACK(changed_text_handler), this);
377 if (nctl == -1) {
378 gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), RESPONSE_DELETE, FALSE);
379 gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), GTK_RESPONSE_OK, FALSE);
380 gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_CANCEL);
381 }
382 controller_map.set_config_mode(true, nctl);
383 check_midi_cb(this);
384 gtk_widget_show(dialog);
385 g_timeout_add(40, check_midi_cb, this);
386 g_object_unref(G_OBJECT(builder));
387 return;
388 }
389
390 gboolean button_press_cb (GtkWidget *widget, GdkEventButton *event, gpointer data)
391 {
392 if (event->button != 2)
393 return FALSE;
394 if (controller_map.get_config_mode())
395 return TRUE;
396 new MidiConnect(event, *(Parameter*)data);
397 return TRUE;
398 }
0 /*
1 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17 * ---------------------------------------------------------------------------
18 *
19 * This file is part of the guitarix GUI main class
20 *
21 * ----------------------------------------------------------------------------
22 */
23
24 #include "guitarix.h" // NOLINT
25
26 #include <string> // NOLINT
27
28 /****************************************************************
29 ** MidiControllerTable
30 */
31 namespace gx_main_midi {
32
33 GtkWidget *MidiControllerTable::window = 0;
34
35 void MidiControllerTable::response_cb(GtkWidget *widget, gint response_id, gpointer data) {
36 MidiControllerTable& m = *reinterpret_cast<MidiControllerTable*>(data);
37 if (response_id == RESPONSE_DELETE_SELECTED) {
38 GtkTreeModel *model;
39 GList *list = gtk_tree_selection_get_selected_rows(m.selection, &model);
40 gtk_tree_selection_unselect_all(m.selection);
41 for (GList *p = g_list_last(list); p; p = g_list_previous(p)) {
42 GtkTreeIter iter;
43 gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter,
44 reinterpret_cast<GtkTreePath*>(p->data));
45 const char* id;
46 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 7, &id, -1);
47 gx_gui::controller_map.deleteParameter(gx_gui::parameter_map[id], true);
48 gtk_tree_path_free(reinterpret_cast<GtkTreePath*>(p->data));
49 }
50 g_list_free(list);
51 m.load();
52 return;
53 }
54 gtk_check_menu_item_set_active(m.menuitem, FALSE);
55 }
56
57 void MidiControllerTable::destroy_cb(GtkWidget*, gpointer data) {
58 delete reinterpret_cast<MidiControllerTable*>(data);
59 }
60
61 void MidiControllerTable::edited_cb(
62 GtkCellRendererText *renderer, gchar *path, gchar *new_text, gpointer data) {
63 GtkListStore *store = GTK_LIST_STORE(data);
64 GtkTreeIter iter;
65 gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(store), &iter, path);
66 int ctrl;
67 gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, 0, &ctrl, -1);
68 gx_gui::midi_std_ctr.replace(ctrl, new_text);
69 bool valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter);
70 const char *name = gx_gui::midi_std_ctr[ctrl].c_str();
71 while (valid) {
72 int n;
73 gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, 0, &n, -1);
74 if (n == ctrl) {
75 gtk_list_store_set(store, &iter, 1, name, -1);
76 }
77 valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter);
78 }
79 }
80
81 void MidiControllerTable::toggleButtonSetSwitch(GtkWidget *w, gpointer data) {
82 gx_gui::SwitchParameter *p = (gx_gui::SwitchParameter*)data;
83 p->set(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)));
84 }
85
86 void MidiControllerTable::set(bool v) {
87 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(togglebutton), v);
88 }
89
90 void MidiControllerTable::load() {
91 GtkTreeIter iter;
92 gtk_list_store_clear(store);
93 for (int i = 0; i < gx_gui::controller_map.size(); i++) {
94 gx_gui::midi_controller_list& cl = gx_gui::controller_map[i];
95 for (gx_gui::midi_controller_list::iterator j = cl.begin(); j != cl.end(); j++) {
96 gx_gui::Parameter& p = j->getParameter();
97 string low, up;
98 const char *tp;
99 float step = p.getStepAsFloat();
100 if (p.getControlType() == gx_gui::Parameter::Continuous) {
101 tp = "Scale";
102 low = gx_gui::fformat(j->lower(), step);
103 up = gx_gui::fformat(j->upper(), step);
104 } else if (p.getControlType() == gx_gui::Parameter::Enum) {
105 tp = "Select";
106 low = gx_gui::fformat(j->lower(), step);
107 up = gx_gui::fformat(j->upper(), step);
108 } else if (p.getControlType() == gx_gui::Parameter::Switch) {
109 tp = "Switch";
110 low = up = "";
111 } else {
112 tp = "??";
113 assert(false);
114 }
115 gtk_list_store_append(store, &iter);
116 gtk_list_store_set(store, &iter,
117 0, i,
118 1, gx_gui::midi_std_ctr[i].c_str(),
119 2, p.group().c_str(),
120 3, p.name().c_str(),
121 4, tp,
122 5, low.c_str(),
123 6, up.c_str(),
124 7, p.id().c_str(),
125 -1);
126 }
127 }
128 }
129
130 void MidiControllerTable::toggle(GtkWidget* widget, gpointer data) {
131 if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(data))) {
132 if (window) {
133 gtk_widget_destroy(window);
134 }
135 } else {
136 if (!window) {
137 new MidiControllerTable(GTK_CHECK_MENU_ITEM(data));
138 }
139 }
140 }
141
142 MidiControllerTable::~MidiControllerTable() {
143 window = NULL;
144 gtk_widget_unref(GTK_WIDGET(menuitem));
145 }
146
147 MidiControllerTable::MidiControllerTable(GtkCheckMenuItem *item) {
148 menuitem = item;
149 gtk_widget_ref(GTK_WIDGET(item));
150
151 GtkBuilder * builder = gtk_builder_new();
152 window = gx_gui::load_toplevel(builder, "midi.glade", "MidiControllerTable");
153 store = GTK_LIST_STORE(gtk_builder_get_object(builder, "liststore1"));
154 togglebutton = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "save_controller"));
155
156 gx_gui::SwitchParameter& param = gx_gui::parameter_map["system.midi_in_preset"].getSwitch();
157 gtk_toggle_button_set_active(togglebutton, param.get());
158 param.changed.connect(sigc::mem_fun(*this, &MidiControllerTable::set));
159 g_signal_connect(GTK_OBJECT(togglebutton), "toggled",
160 G_CALLBACK(toggleButtonSetSwitch), (gpointer)&param);
161 selection = gtk_tree_view_get_selection(
162 GTK_TREE_VIEW(gtk_builder_get_object(builder, "treeview1")));
163 gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE);
164
165 load();
166
167 g_signal_connect(window, "destroy", G_CALLBACK(destroy_cb), this);
168 g_signal_connect(window, "response", G_CALLBACK(response_cb), this);
169 g_signal_connect(G_OBJECT(gtk_builder_get_object(builder, "cellrenderertext2")),
170 "edited", G_CALLBACK(edited_cb), store);
171
172 gtk_window_add_accel_group(GTK_WINDOW(window),
173 gx_gui::GxMainInterface::instance()->fAccelGroup);
174
175 gtk_widget_show(window);
176 g_object_unref(G_OBJECT(builder));
177 gx_gui::controller_map.changed.connect(sigc::mem_fun(*this, &MidiControllerTable::load));
178 }
179
180
181 /*****************************************************************
182 ** Midi Control
183 */
184
185
186 string MidiConnect::ctr_desc(int ctr) {
187 string p = gx_gui::midi_std_ctr[ctr];
188 if (p.empty())
189 return p;
190 return "(" + p + ")";
191 }
192
193
194 void MidiConnect::midi_response_cb(GtkWidget *widget, gint response_id, gpointer data) {
195 MidiConnect* m = reinterpret_cast<MidiConnect*>(data);
196 switch (response_id) {
197 case GTK_RESPONSE_OK:
198 if (m->param.getControlType() == gx_gui::Parameter::Continuous ||
199 m->param.getControlType() == gx_gui::Parameter::Enum) {
200 assert(m->adj_lower);
201 assert(m->adj_upper);
202 float lower = gtk_adjustment_get_value(m->adj_lower);
203 float upper = gtk_adjustment_get_value(m->adj_upper);
204 gx_gui::controller_map.modifyCurrent(m->param, lower, upper);
205 } else {
206 gx_gui::controller_map.modifyCurrent(m->param, 0, 0);
207 }
208 break;
209 case RESPONSE_DELETE:
210 gx_gui::controller_map.deleteParameter(m->param);
211 break;
212 }
213 gtk_widget_destroy(m->dialog);
214 }
215
216 void MidiConnect::midi_destroy_cb(GtkWidget *widget, gpointer data) {
217 MidiConnect *m = reinterpret_cast<MidiConnect*>(data);
218 gx_gui::controller_map.set_config_mode(false);
219 delete m;
220 }
221
222 const char* MidiConnect::ctl_to_str(int n) {
223 static char buf[12];
224 if (n < 0)
225 strcpy(buf, "---"); // NOLINT
226 else
227 snprintf(buf, sizeof(buf), "%3d", n);
228 return buf;
229 }
230
231 gboolean MidiConnect::check_midi_cb(gpointer data) {
232 MidiConnect *m = reinterpret_cast<MidiConnect*>(data);
233 if (!gx_gui::controller_map.get_config_mode())
234 return FALSE;
235 int ctl = gx_gui::controller_map.get_current_control();
236 if (m->current_control == ctl)
237 return TRUE;
238 m->current_control = ctl;
239 gtk_entry_set_text(GTK_ENTRY(m->entry_new), ctl_to_str(ctl));
240 return TRUE;
241 }
242
243 void MidiConnect::changed_text_handler(GtkEditable *editable, gpointer data) {
244 MidiConnect *m = reinterpret_cast<MidiConnect*>(data);
245 gchar *p = gtk_editable_get_chars(editable, 0, -1);
246 ostringstream buf;
247 for (const char *q = p; *q; q++) {
248 if (isdigit(*q)) {
249 buf << *q;
250 }
251 }
252 string str = buf.str();
253 int n = -1;
254 if (!str.empty()) {
255 istringstream i(buf.str());
256 i >> n;
257 if (n > 127) {
258 n = 127;
259 }
260 ostringstream b;
261 b << n;
262 str = b.str().substr(0, 3);
263 }
264 // prevent infinite loop because after it has changed the text
265 // the handler will be called again (and make sure the text
266 // tranformation in this handler is idempotent!)
267 if (str == p) {
268 if (str.empty()) {
269 gtk_dialog_set_response_sensitive(GTK_DIALOG(m->dialog), GTK_RESPONSE_OK, FALSE);
270 gtk_dialog_set_default_response(GTK_DIALOG(m->dialog), GTK_RESPONSE_CANCEL);
271 } else {
272 gtk_dialog_set_response_sensitive(GTK_DIALOG(m->dialog), GTK_RESPONSE_OK, TRUE);
273 gtk_dialog_set_default_response(GTK_DIALOG(m->dialog), GTK_RESPONSE_OK);
274 }
275 gtk_label_set_text(GTK_LABEL(m->label_desc), ctr_desc(n).c_str());
276 gx_gui::controller_map.set_current_control(n);
277 m->current_control = n;
278 return;
279 }
280 gtk_editable_delete_text(editable, 0, -1);
281 gint position = 0;
282 gtk_editable_insert_text(editable, str.c_str(), str.size(), &position);
283 }
284
285
286 MidiConnect::MidiConnect(GdkEventButton *event, gx_gui::Parameter &param)
287 : param(param),
288 current_control(-1) {
289 GtkBuilder * builder = gtk_builder_new();
290 dialog = gx_gui::load_toplevel(builder, "midi.glade", "MidiConnect");
291 GtkWidget *zn = GTK_WIDGET(gtk_builder_get_object(builder, "zone_name"));
292 GtkStyle *style = gtk_widget_get_style(zn);
293 pango_font_description_set_size(style->font_desc, 12*PANGO_SCALE);
294 pango_font_description_set_weight(style->font_desc, PANGO_WEIGHT_BOLD);
295 gtk_widget_modify_font(zn, style->font_desc);
296 gtk_label_set_text(GTK_LABEL(zn), (param.group() + ": " + param.name()).c_str());
297 const gx_gui::MidiController *pctrl;
298 int nctl = gx_gui::controller_map.param2controller(param, &pctrl);
299 if (param.getControlType() == gx_gui::Parameter::Continuous ||
300 param.getControlType() == gx_gui::Parameter::Enum) {
301 float lower = param.getLowerAsFloat();
302 float upper = param.getUpperAsFloat();
303 float step = param.getStepAsFloat();
304 GtkSpinButton *spinner;
305 adj_lower = GTK_ADJUSTMENT(gtk_adjustment_new(lower, lower, upper, step, 10*step, 0));
306 spinner = GTK_SPIN_BUTTON(gtk_builder_get_object(builder, "lower"));
307 float climb_rate = 0.0;
308 gtk_spin_button_configure(spinner, adj_lower, climb_rate, gx_gui::precision(step));
309 adj_upper = GTK_ADJUSTMENT(gtk_adjustment_new(upper, lower, upper, step, 10*step, 0));
310 spinner = GTK_SPIN_BUTTON(gtk_builder_get_object(builder, "upper"));
311 gtk_spin_button_configure(spinner, adj_upper, climb_rate, gx_gui::precision(step));
312 if (nctl != -1) {
313 gtk_adjustment_set_value(adj_lower, pctrl->lower());
314 gtk_adjustment_set_value(adj_upper, pctrl->upper());
315 }
316 } else {
317 adj_lower = adj_upper = 0;
318 gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object(builder, "range_label")));
319 gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object(builder, "range_box")));
320 }
321 entry_new = GTK_WIDGET(gtk_builder_get_object(builder, "new"));
322 label_desc = GTK_WIDGET(gtk_builder_get_object(builder, "new_desc"));
323 g_signal_connect(dialog, "response", G_CALLBACK(midi_response_cb), this);
324 g_signal_connect(dialog, "destroy", G_CALLBACK(midi_destroy_cb), this);
325 g_signal_connect(entry_new, "changed", G_CALLBACK(changed_text_handler), this);
326 if (nctl == -1) {
327 gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), RESPONSE_DELETE, FALSE);
328 gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), GTK_RESPONSE_OK, FALSE);
329 gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_CANCEL);
330 }
331 gx_gui::controller_map.set_config_mode(true, nctl);
332 check_midi_cb(this);
333 gtk_widget_show(dialog);
334 g_timeout_add(40, check_midi_cb, this);
335 g_object_unref(G_OBJECT(builder));
336 return;
337 }
338 } // end namespace
339
00 /*
1 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
1 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * ---------------------------------------------------------------------------
1718 *
1819 * This file is a part ofthe gx_head interface builder
2223 * ----------------------------------------------------------------------------
2324 */
2425
25 #include "guitarix.h"
26 #include <glibmm/i18n.h>
27
28 //-------- the gx_head user interface build instruktions
26 #include "guitarix.h" // NOLINT
27
28 #include <glibmm/i18n.h> // NOLINT
29
30 // -------- the gx_head user interface build instruktions
2931
3032 namespace gx_gui {
3133
32 void GxMainInterface::gx_build_mono_rack()
33 {
34
35 openHorizontalTableBox("");
36 {
37 openVerticalBox("");
38 {
39 openPaintBox("");
40 {
41
42 openVerticalBox(" noise gate ");
43 {
44 openHorizontalBox("");
45 {
46 create_switch_no_caption(sw_switchit, "noise_gate.on_off");
47 openpaintampBox("noise gate");
48 {
49 create_wheel("noise_gate.threshold");
50 }
51 closeBox();
52
53 }
54 closeBox();
55 }
56 closeBox();
57
58 openVerticalBox(_("noise shaper "));
59 {
60 openHorizontalBox("");
61 {
62
63 create_switch_no_caption(sw_switchit, "shaper.on_off");
64
65 openpaintampBox("shaper");
66 {
67 create_wheel("shaper.sharper");
68 }
69 closeBox();
70
71 }
72 closeBox();
73 }
74 closeBox();
75
76 openVerticalBox(_("mono level out "));
77 {
78 openHorizontalBox("");
79 {
80
81 create_switch_no_caption(sw_switchit, "amp.on_off");
82
83 openpaintampBox("level");
84 {
85 create_spin_value("amp.out_amp");
86 create_wheel("amp.out_amp");
87 }
88 closeBox();
89 }
90 closeBox();
91 }
92 closeBox();
93
94 openVerticalBox(_("clip "));
95 {
96 openHorizontalBox("");
97 {
98
99 create_switch_no_caption(sw_switchit, "amp.clip.on_off");
100
101 openpaintampBox("level");
102 {
103 create_wheel("amp.fuzz");
104 }
105 closeBox();
106 }
107 closeBox();
108 }
109 closeBox();
110
111 }
112 closeBox();
113 }
114 closeBox();
115 //low high pass filter
116 openHorizontalOrderBox(_("l/h/filter"), &gx_engine::audio.posit14);
117 {
118 openVerticalBox(_("l/h/filter"));
119 {
120 openHorizontalBox("");
121 {
122 openPaintBox1("");
123 {
124 create_switch_no_caption(sw_switchit, "low_highpass.on_off");
125 create_selector("low_highpass.pp");
126 }
127 closeBox();
128
129 openDialogBox("low_highpass.dialog", "low_highpass.on_off","RackBox_expose");
130 {
131 openHorizontalBox("");
132 {
133
134 openHorizontalBox("");
135 {
136 create_small_rackknob("low_high_pass.lhp.high_freq",_("high-pass "));
137 create_small_rackknob("low_high_pass.lhp.low_freq",_(" low-pass "));
138 create_switch_no_caption(sw_switchit, "low_high_pass.lhp.on_off");
139 }
140 closeBox();
141
142 openSpaceBox("");
143 closeBox();
144
145 openHorizontalBox("");
146 {
147 create_small_rackknob("low_high_pass.lhc.low_freq",_("low-cut "));
148 create_small_rackknob("low_high_pass.lhc.high_freq",_("high-cut "));
149 create_switch_no_caption(sw_switchit, "low_high_pass.lhc.on_off");
150 }
151 closeBox();
152
153 }
154 closeBox();
155 }
156 closeBox();
157 }
158 closeBox();
159 }
160 closeBox();
161 }
162 closeBox();
163 // EQ
164 openHorizontalOrderBox(_("EQ"), &gx_engine::audio.posit10);
165 {
166 openVerticalBox(_("EQ"));
167 {
168 openHorizontalBox("");
169 {
170 openPaintBox1("");
171 {
172 create_switch_no_caption(sw_switchit, "eqs.on_off");
173 create_selector("eqs.pp");
174 }
175 closeBox();
176
177 openDialogBox("eqs.dialog", "eqs.on_off","RackBox_expose");
178 {
179 openVerticalBox("");
180 {
181 openHorizontalTableBox("");
182 {
183 create_simple_spin_value("eqs.freq31_25");
184 create_simple_spin_value("eqs.freq62_5");
185 create_simple_spin_value("eqs.freq125");
186 create_simple_spin_value("eqs.freq250");
187 create_simple_spin_value("eqs.freq500");
188 create_simple_spin_value("eqs.freq1k");
189 create_simple_spin_value("eqs.freq2k");
190 create_simple_spin_value("eqs.freq4k");
191 create_simple_spin_value("eqs.freq8k");
192 create_simple_spin_value("eqs.freq16k");
193 }
194 closeBox();
195 openHorizontalTableBox("");
196 {
197 create_eq_rackslider_no_caption("eqs.fs31_25");
198 create_eq_rackslider_no_caption("eqs.fs62_5");
199 create_eq_rackslider_no_caption("eqs.fs125");
200 create_eq_rackslider_no_caption("eqs.fs250");
201 create_eq_rackslider_no_caption("eqs.fs500");
202 create_eq_rackslider_no_caption("eqs.fs1k");
203 create_eq_rackslider_no_caption("eqs.fs2k");
204 create_eq_rackslider_no_caption("eqs.fs4k");
205 create_eq_rackslider_no_caption("eqs.fs8k");
206 create_eq_rackslider_no_caption("eqs.fs16k");
207 }
208 closeBox();
209 openHorizontalTableBox("");
210 {
211 create_small_rackknob("eqs.Qs31_25","Q");
212 create_small_rackknob("eqs.Qs62_5","Q");
213 create_small_rackknob("eqs.Qs125","Q");
214 create_small_rackknob("eqs.Qs250","Q");
215 create_small_rackknob("eqs.Qs500","Q");
216 create_small_rackknob("eqs.Qs1k","Q");
217 create_small_rackknob("eqs.Qs2k","Q");
218 create_small_rackknob("eqs.Qs4k","Q");
219 create_small_rackknob("eqs.Qs8k","Q");
220 create_small_rackknob("eqs.Qs16k","Q");
221 }
222 closeBox();
223 }
224 closeBox();
225 }
226 closeBox();
227 }
228 closeBox();
229 }
230 closeBox();
231 }
232 closeBox();
233 //----- crybaby
234 openHorizontalOrderBox(_("crybaby"), &gx_engine::audio.posit0);
235 {
236 openVerticalBox(_("crybaby"));
237 {
238
239 openHorizontalBox("");
240 {
241 openPaintBox1("");
242 {
243 create_switch_no_caption(sw_switchit, "crybaby.on_off");
244 create_selector("crybaby.pp");
245 }
246 closeBox();
247
248 openDialogBox("crybaby.dialog", "crybaby.on_off","RackBox_expose");
249 {
250 openHorizontalBox("");
251 {
252
253 openSpaceBox("");
254 closeBox();
255 create_selector("crybaby.autowah");
256 openSpaceBox("");
257 closeBox();
258 openSpaceBox("");
259 closeBox();
260 openHorizontalTableBox("");
261 {
262 create_small_rackknobr("crybaby.wah",_(" wah "));
263 create_small_rackknob("crybaby.level",_(" level "));
264 create_small_rackknob("crybaby.wet_dry",_(" dry/wet "));
265 }
266 closeBox();
267 openSpaceBox("");
268 closeBox();
269 }
270 closeBox();
271 }
272 closeBox();
273 }
274 closeBox();
275 }
276 closeBox();
277 }
278 closeBox();
279 //----- distortion
280 openHorizontalOrderBox(_("distortion"), &gx_engine::audio.posit2);
281 {
282 openVerticalBox(_("distortion"));
283 {
284
285 openHorizontalBox("");
286 {
287 openPaintBox1("");
288 {
289 create_switch_no_caption(sw_switchit, "gx_distortion.on_off");
290 create_selector("gx_distortion.pp");
291 }
292 closeBox();
293
294 openDialogBox("gx_distortion.dialog", "gx_distortion.on_off","RackBox_expose");
295 {
296 openHorizontalBox("");
297 {
298 openVerticalBox("");
299 {
300
301 openVerticalBox("");
302 {
303 openFlipLabelBox(_(" drive "));
304 {
305 openHorizontalBox("");
306 {
307 create_small_rackknobr("gx_distortion.drive",_(" drive "));
308 create_small_rackknobr("gx_distortion.low_drive",_(" low "));
309 create_small_rackknobr("gx_distortion.middle_l_drive",_(" middle l. "));
310 create_small_rackknobr("gx_distortion.middle_h_drive",_(" middle h. "));
311 create_small_rackknobr("gx_distortion.high_drive",_(" high "));
312 }
313 closeBox();
314 }
315 closeBox();
316 openFlipLabelBox(_(" gain "));
317 {
318 openHorizontalBox("");
319 {
320 create_small_rackknob("gx_distortion.gain",_(" gain "));
321 create_small_rackknob("gx_distortion.low_gain",_(" low "));
322 create_small_rackknob("gx_distortion.middle_l_gain",_(" middle l. "));
323 create_small_rackknob("gx_distortion.middle_h_gain",_(" middle h. "));
324 create_small_rackknob("gx_distortion.high_gain",_(" high "));
325 }
326 closeBox();
327
328 }
329 closeBox();
330 }
331 closeBox();
332
333 openHorizontalBox("");
334 {
335 create_small_rackknob("gx_distortion.level",_(" level "));
336 openVerticalBox(_("frequency split Hz"));
337 {
338 openpaintampBox("");
339 {
340 openHorizontalBox("");
341 {
342 openSpaceBox("");
343 closeBox();
344 create_wheel("gx_distortion.split_low_freq", _("split low freq"));
345 openSpaceBox("");
346 closeBox();
347 create_wheel("gx_distortion.split_middle_freq",_( "split m. freq"));
348 openSpaceBox("");
349 closeBox();
350 create_wheel("gx_distortion.split_high_freq", _("split high freq"));
351 openSpaceBox("");
352 closeBox();
353
354 }
355 closeBox();
356 }
357 closeBox();
358 }
359 closeBox();
360 }
361 closeBox();
362
363 }
364 closeBox();
365
366 openVerticalBox(_("resonator"));
367 {
368 create_small_rackknob("gx_distortion.trigger",_("trigger "));
369 create_small_rackknob("gx_distortion.vibrato",_(" vibrato "));
370 create_switch_no_caption(sw_switchit, "gx_distortion.resonator.on_off");
371 }
372 closeBox();
373 }
374 closeBox();
375 }
376 closeBox();
377 }
378 closeBox();
379 }
380 closeBox();
381 }
382 closeBox();
383 //----- IR
384 openHorizontalOrderBox(_("IR"), &gx_engine::audio.posit4);
385 {
386 openVerticalBox(_("IR"));
387 {
388 openHorizontalBox("");
389 {
390 openPaintBox1("");
391 {
392 create_switch_no_caption(sw_switchit, "IR.on_off");
393 create_selector("IR.pp");
394 }
395 closeBox();
396
397 openDialogBox("IR.dialog", "IR.on_off","RackBox_expose");
398 {
399 openVerticalBox1("");
400 {
401 openHorizontalBox("");
402 {
403 openSpaceBox("");
404 closeBox();
405 create_selector("IR.auto_freq");
406 openSpaceBox("");
407 closeBox();
408
409 openHorizontalTableBox("");
410 {
411 create_small_rackknob("IR.freq",_(" freq "));
412 create_small_rackknob("IR.peak",_(" peak "));
413 create_small_rackknob("IR.bandwidth",_(" bandwidth "));
414 }
415 closeBox();
416 }
417 closeBox();
418 }
419 closeBox();
420 }
421 closeBox();
422 }
423 closeBox();
424 }
425 closeBox();
426 }
427 closeBox();
428 //----- the compressor
429 openHorizontalOrderBox(_("Compr."), &gx_engine::audio.posit5);
430 {
431 openVerticalBox(_("Compr."));
432 {
433 openHorizontalBox("");
434 {
435 openPaintBox1("");
436 {
437 create_switch_no_caption(sw_switchit, "compressor.on_off");
438 create_selector("compressor.pp");
439 }
440 closeBox();
441 openDialogBox("compressor.dialog", "compressor.on_off","RackBox_expose");
442 {
443
444 openHorizontalTableBox("");
445 {
446 create_small_rackknob("compressor.knee",_("knee"));
447 create_small_rackknobr("compressor.ratio", _("ratio"));
448 create_small_rackknob("compressor.threshold", _("threshold"));
449
450
451 create_small_rackknob("compressor.attack", _( "attack"));
452 create_small_rackknob("compressor.release", _("release"));
453 }
454 closeBox();
455
456
457 }
458 closeBox();
459 }
460 closeBox();
461 }
462 closeBox();
463 }
464 closeBox();
465 //-----overdrive
466 openHorizontalOrderBox(_("overdrive"), &gx_engine::audio.posit1);
467 {
468 openVerticalBox(_("overdrive"));
469 {
470 openHorizontalBox("");
471 {
472 openPaintBox1("");
473 {
474 create_switch_no_caption(sw_switchit, "overdrive.on_off");
475 create_selector("overdrive.pp");
476 }
477 closeBox();
478 openDialogBox("overdrive.dialog", "overdrive.on_off","RackBox_expose");
479 {
480 openHorizontalTableBox("");
481 {
482
483 openSpaceBox("");
484 closeBox();
485 create_small_rackknobr("overdrive.drive", _(" drive "));
486
487 openSpaceBox("");
488 closeBox();
489 }
490 closeBox();
491 }
492 closeBox();
493 }
494 closeBox();
495 }
496 closeBox();
497 }
498 closeBox();
499 //----- echo
500 openHorizontalOrderBox(_("echo"), &gx_engine::audio.posit6);
501 {
502 openVerticalBox(_("echo"));
503 {
504 openHorizontalBox("");
505 {
506 openPaintBox1("");
507 {
508 create_switch_no_caption(sw_switchit, "echo.on_off");
509 create_selector("echo.pp");
510 }
511 closeBox();
512
513 openDialogBox("echo.dialog", "echo.on_off","RackBox_expose");
514 {
515 openVerticalBox("");
516 {
517 openHorizontalTableBox("");
518 {
519
520 create_small_rackknobr("echo.time", _(" time "));
521
522 create_small_rackknob("echo.percent", _(" % "));
523 }
524 closeBox();
525 }
526 closeBox();
527 }
528 closeBox();
529
530 }
531 closeBox();
532 }
533 closeBox();
534 }
535 closeBox();
536 //-----delay
537 openHorizontalOrderBox(_("delay"), &gx_engine::audio.posit7);
538 {
539 openVerticalBox(_("delay"));
540 {
541 openHorizontalBox("");
542 {
543 openPaintBox1("");
544 {
545 create_switch_no_caption(sw_switchit, "delay.on_off");
546 create_selector("delay.pp");
547 }
548 closeBox();
549
550 openDialogBox("delay.dialog", "delay.on_off","RackBox_expose");
551 {
552 openVerticalBox("");
553 {
554 openHorizontalTableBox("");
555 {
556
557 create_small_rackknobr("delay.delay", _(" delay "));
558
559 create_small_rackknob("delay.gain", _(" gain "));
560 }
561 closeBox();
562 }
563 closeBox();
564 }
565 closeBox();
566
567 }
568 closeBox();
569 }
570 closeBox();
571 }
572 closeBox();
573 //----- freeverb
574 openHorizontalOrderBox(_("freeverb"), &gx_engine::audio.posit3);
575 {
576 openVerticalBox( _("freeverb"));
577 {
578 openHorizontalBox("");
579 {
580 openPaintBox1("");
581 {
582 create_switch_no_caption(sw_switchit, "freeverb.on_off");
583 create_selector("freeverb.pp");
584 }
585 closeBox();
586 openDialogBox("freeverb.dialog", "freeverb.on_off","RackBox_expose");
587 {
588
589 openFrameBox("");
590 closeBox();
591 openFrameBox("");
592 closeBox();
593 openHorizontalTableBox("");
594 {
595 create_small_rackknobr("freeverb.RoomSize", _("RoomSize"));
596 create_small_rackknob("freeverb.damp", _("damp"));
597 create_small_rackknob("freeverb.wet_dry", _("dry/wet"));
598 }
599 closeBox();
600 openFrameBox("");
601 closeBox();
602 openFrameBox("");
603 closeBox();
604 }
605 closeBox();
606 }
607 closeBox();
608 }
609 closeBox();
610 }
611 closeBox();
612
613 //-----osc
614 openHorizontalOrderBox(_("oscilloscope"), &gx_engine::audio.posit17);
615 {
616 openVerticalBox(_("osc"));
617 {
618 openHorizontalBox("");
619 {
620 openPaintBox1("");
621 {
622 create_switch_no_caption(sw_switchit, "oscilloscope.on_off");
623 create_selector("oscilloscope.pp");
624 }
625 closeBox();
626
627 openDialogBox("oscilloscope.dialog", "oscilloscope.on_off","RackBox_expose");
628 {
629 openVerticalBox("");
630 {
631 openFrameBox("");
632 closeBox();
633 openHorizontalBox("");
634 {
635 openFrameBox("");
636 closeBox();
637 addLiveWaveDisplay(" ", &gx_engine::audio.viv , &gx_engine::audio.vivi);
638 openFrameBox("");
639 closeBox();
640 }
641 closeBox();
642 openFrameBox("");
643 closeBox();
644 }
645 closeBox();
646 }
647 closeBox();
648
649 }
650 closeBox();
651 }
652 closeBox();
653 }
654 closeBox();
655
656 openHorizontalOrderBox(_("biquad"), &gx_engine::audio.posit18);
657 {
658 openVerticalBox(_("biquad"));
659 {
660 openHorizontalBox("");
661 {
662 openPaintBox1("");
663 {
664 create_switch_no_caption(sw_switchit, "biquad.on_off");
665 create_selector("biquad.pp");
666 }
667 closeBox();
668
669 openDialogBox("biquad.dialog", "biquad.on_off","RackBox_expose");
670 {
671 openVerticalBox("");
672 {
673 openHorizontalBox("");
674 {
675 create_small_rackknobr("biquad.Freq", _("Freq"));
676 }
677 closeBox();
678 }
679 closeBox();
680 }
681 closeBox();
682
683 }
684 closeBox();
685 }
686 closeBox();
687 }
688 closeBox();
689
690 openHorizontalOrderBox(_("tremolo"), &gx_engine::audio.posit21);
691 {
692 openVerticalBox(_("tremolo"));
693 {
694 openHorizontalBox("");
695 {
696 openPaintBox1("");
697 {
698 create_switch_no_caption(sw_switchit, "tremolo.on_off");
699 create_selector("tremolo.pp");
700 }
701 closeBox();
702
703 openDialogBox("tremolo.dialog", "tremolo.on_off","RackBox_expose");
704 {
705 openVerticalBox("");
706 {
707 openHorizontalBox("");
708 {
709 openSpaceBox("");
710 closeBox();
711 create_selector("tremolo.SINE");
712 openSpaceBox("");
713 closeBox();
714 openSpaceBox("");
715 closeBox();
716 openHorizontalTableBox("");
717 {
718
719 create_small_rackknobr("tremolo.freq", _("Freq"));
720 openSpaceBox("");
721 closeBox();
722 create_small_rackknobr("tremolo.depth", _("Depth"));
723 openSpaceBox("");
724 closeBox();
725 create_small_rackknob("tremolo.wet_dry", _("dry/wet"));
726 }
727 closeBox();
728 }
729 closeBox();
730 }
731 closeBox();
732 }
733 closeBox();
734
735 }
736 closeBox();
737 }
738 closeBox();
739 }
740 closeBox();
741
742 openHorizontalOrderBox(_("phaser"), &gx_engine::audio.posit22);
743 {
744 openVerticalBox(_("phaser"));
745 {
746 openHorizontalBox("");
747 {
748 openPaintBox1("");
749 {
750 create_switch_no_caption(sw_switchit, "phaser_mono.on_off");
751 create_selector("phaser_mono.pp");
752 }
753 closeBox();
754
755 openDialogBox("phaser_mono.dialog", "phaser_mono.on_off","RackBox_expose");
756 {
757 openVerticalBox("");
758 {
759 openHorizontalBox("");
760 {
761 create_small_rackknobr("phaser_mono.level", _("level"));
762 create_small_rackknob("phaser_mono.Speed", _("speed"));
763 create_small_rackknob("phaser_mono.wet_dry", _("dry/wet"));
764 }
765 closeBox();
766 }
767 closeBox();
768 }
769 closeBox();
770
771 }
772 closeBox();
773 }
774 closeBox();
775 }
776 closeBox();
777
778 openHorizontalOrderBox(_("chorus"), &gx_engine::audio.posit23);
779 {
780 openVerticalBox(_("chorus"));
781 {
782 openHorizontalBox("");
783 {
784 openPaintBox1("");
785 {
786 create_switch_no_caption(sw_switchit, "chorus_mono.on_off");
787 create_selector("chorus_mono.pp");
788 }
789 closeBox();
790
791 openDialogBox("chorus_mono.dialog", "chorus_mono.on_off","RackBox_expose");
792 {
793 openVerticalBox("");
794 {
795 openHorizontalBox("");
796 {
797 create_small_rackknobr("chorus_mono.level", _("level"));
798 create_small_rackknob("chorus_mono.freq", _("speed"));
799 create_small_rackknob("chorus_mono.wet_dry", _("dry/wet"));
800 }
801 closeBox();
802 }
803 closeBox();
804 }
805 closeBox();
806
807 }
808 closeBox();
809 }
810 closeBox();
811 }
812 closeBox();
813
814 openHorizontalOrderBox(_("flanger"), &gx_engine::audio.posit24);
815 {
816 openVerticalBox(_("flanger"));
817 {
818 openHorizontalBox("");
819 {
820 openPaintBox1("");
821 {
822 create_switch_no_caption(sw_switchit, "flanger_mono.on_off");
823 create_selector("flanger_mono.pp");
824 }
825 closeBox();
826
827 openDialogBox("flanger_mono.dialog", "flanger_mono.on_off","RackBox_expose");
828 {
829 openVerticalBox("");
830 {
831 openHorizontalBox("");
832 {
833 create_small_rackknobr("flanger_mono.level", _("level"));
834 create_small_rackknob("flanger_mono.freq", _("speed"));
835 create_small_rackknob("flanger_mono.wet_dry", _("dry/wet"));
836 }
837 closeBox();
838 }
839 closeBox();
840 }
841 closeBox();
842
843 }
844 closeBox();
845 }
846 closeBox();
847 }
848 closeBox();
849
850 openHorizontalOrderBox(_("feedback"), &gx_engine::audio.posit25);
851 {
852 openVerticalBox(_("feedback"));
853 {
854 openHorizontalBox("");
855 {
856 openPaintBox1("");
857 {
858 create_switch_no_caption(sw_switchit, "feedback.on_off");
859 create_selector("feedback.pp");
860 }
861 closeBox();
862
863 openDialogBox("feedback.dialog", "feedback.on_off","RackBox_expose");
864 {
865 openVerticalBox("");
866 {
867 openHorizontalBox("");
868 {
869 create_small_rackknobr("feedback.feedback", _("feedback"));
870 create_small_rackknob("feedback.wet_dry", _("dry/wet"));
871 }
872 closeBox();
873 }
874 closeBox();
875 }
876 closeBox();
877
878 }
879 closeBox();
880 }
881 closeBox();
882 }
883 closeBox();
884
885 openHorizontalOrderBox(_("tonestack"), &gx_engine::audio.posit26);
886 {
887 openVerticalBox(_("tonestack"));
888 {
889 openHorizontalBox("");
890 {
891 openPaintBox1("");
892 {
893 create_switch_no_caption(sw_switchit, "amp.tonestack.on_off");
894 create_selector("amp.tonestack.pp");
895 }
896 closeBox();
897
898 openDialogBox("amp.tonestack.dialog", "amp.tonestack.on_off","RackBox_expose");
899 {
900 openVerticalBox("");
901 {
902
903 openHorizontalBox("");
904 {
905
906 create_selector("amp.tonestack.select");
907
908 create_small_rackknob("amp.tonestack.Bass",_("Bass"));
909
910 create_small_rackknob("amp.tonestack.Middle",_("Middle"));
911
912 create_small_rackknob("amp.tonestack.Treble",_("Treble"));
913
914 }
915 closeBox();
916 }
917 closeBox();
918 }
919 closeBox();
920
921 }
922 closeBox();
923 }
924 closeBox();
925 }
926 closeBox();
927
928 openHorizontalOrderBox(_("cabinet"), &gx_engine::audio.posit27);
929 {
930 openVerticalBox(_("cabinet"));
931 {
932 openHorizontalBox("");
933 {
934 openPaintBox1("");
935 {
936 create_switch_no_caption(sw_switchit, "cab.on_off");
937 create_selector("cab.pp");
938 }
939 closeBox();
940
941 openDialogBox("cab.dialog", "cab.on_off","RackBox_expose");
942 {
943 openVerticalBox("");
944 {
945 openHorizontalBox("");
946 {
947 create_selector("cab.select");
948 create_small_rackknob("cab.bass","bass");
949 create_small_rackknob("cab.treble","treble");
950 create_small_rackknobr("cab.Level","level");
951 }
952 closeBox();
953 }
954 closeBox();
955 }
956 closeBox();
957
958 }
959 closeBox();
960 }
961 closeBox();
962 }
963 closeBox();
964
965 openVerticalMidiBox(_(" MIDI out "));
966 {
967 openHorizontalBox("");
968 {
969 openVerticalBox(_(" MIDI out "));
970 {
971 create_switch_no_caption(sw_switchit, "midi_out.on_off");
972 openFrameBox("");
973 closeBox();
974 openHorizontalBox("");
975 {
976 openFrameBox("");
977 closeBox();
978 openPaintBox2("gree_box");
979 {
980 create_switch_no_caption(sw_led,"midi_out.midistat");
981 }
982 closeBox();
983 openFrameBox("");
984 closeBox();
985 }
986 closeBox();
987 openFrameBox("");
988 closeBox();
989
990 }
991 closeBox();
992 //----- create the midi settings dialog
993 openVerticalBox("");
994 {
995 openTabBox("");
996 {
997
998 openVerticalBox(_("channel1"));
999 {
1000 openpaintampBox("MIDI OUT");
1001 {
1002 openVerticalBox("");
1003 {
1004 openHorizontalBox("");
1005 {
1006 create_small_rackknob("midi_out.channel_1.velocity",_("velocity"));
1007 openVerticalBox("");
1008 {
1009 openPaintBox2("dark_box");
1010 {
1011 create_small_rackknob("midi_out.channel_1.volume",_("volume"));
1012 }
1013 closeBox();
1014 addCheckButton("midi_out.channel_1.autogain",_("autogain"));
1015 }
1016 closeBox();
1017 openVerticalBox("");
1018 {
1019 addNumEntry("midi_out.channel_1.channel",_("channel"));
1020 addNumEntry("midi_out.channel_1.program",_("program"));
1021 }
1022 closeBox();
1023 create_small_rackknob("midi_out.channel_1.oktave",_("oktave"));
1024 create_small_rackknob("midi_out.channel_1.sensity",_("sensity"));
1025 }
1026 closeBox();
1027 openHorizontalBox("");
1028 {
1029 openHorizontalBox(" ");
1030 closeBox();
1031 openFrameBox("");
1032 closeBox();
1033 openVerticalBox("");
1034 {
1035 openFrameBox("");
1036 closeBox();
1037 openPaintBox2("darker_box");
1038 {
1039 create_switch_no_caption(sw_led,"midi_out.midistat1");
1040 }
1041 closeBox();
1042 openFrameBox("");
1043 closeBox();
1044 }
1045 closeBox();
1046 openFrameBox("");
1047 closeBox();
1048 openHorizontalBox(" ");
1049 {
1050 addMToggleButton("midi_out.channel_1.auto_pitch",_("auto_pitch"));
1051 }
1052 closeBox();
1053 }
1054 closeBox();
1055 }
1056 closeBox();
1057 }
1058 closeBox();
1059 }
1060 closeBox();
1061
1062 openVerticalBox(_("channel2"));
1063 {
1064 openpaintampBox("MIDI OUT");
1065 {
1066 openVerticalBox("");
1067 {
1068 openHorizontalBox("");
1069 {
1070 create_small_rackknob("midi_out.channel_2.velocity",_("velocity"));
1071 openVerticalBox("");
1072 {
1073 openPaintBox2("dark_box");
1074 {
1075 create_small_rackknob("midi_out.channel_2.volume",_("volume"));
1076 }
1077 closeBox();
1078 addCheckButton("midi_out.channel_2.autogain",_("autogain"));
1079 }
1080 closeBox();
1081 openVerticalBox("");
1082 {
1083 addNumEntry("midi_out.channel_2.channel",_("channel"));
1084 addNumEntry("midi_out.channel_2.program",_("program"));
1085 }
1086 closeBox();
1087 create_small_rackknob("midi_out.channel_2.oktave",_("oktave"));
1088 create_small_rackknob("midi_out.channel_2.sensity",_("sensity"));
1089 }
1090 closeBox();
1091 openHorizontalBox("");
1092 {
1093 create_switch_no_caption(sw_switchit, "midi_out.channel_2.on_off");
1094 openFrameBox("");
1095 closeBox();
1096 openVerticalBox("");
1097 {
1098 openFrameBox("");
1099 closeBox();
1100 openPaintBox2("darker_box");
1101 {
1102 create_switch_no_caption(sw_led,"midi_out.midistat2");
1103 }
1104 closeBox();
1105 openFrameBox("");
1106 closeBox();
1107 }
1108 closeBox();
1109 openFrameBox("");
1110 closeBox();
1111
1112 openHorizontalBox(" ");
1113 {
1114 addMToggleButton("midi_out.channel_2.auto_pitch",_("auto_pitch"));
1115 }
1116 closeBox();
1117
1118 }
1119 closeBox();
1120 }
1121 closeBox();
1122 }
1123 closeBox();
1124 }
1125 closeBox();
1126
1127 openVerticalBox(_("channel3"));
1128 {
1129 openpaintampBox("MIDI OUT");
1130 {
1131 openVerticalBox("");
1132 {
1133 openHorizontalBox("");
1134 {
1135 create_small_rackknob("midi_out.channel_3.velocity",_("velocity"));
1136 openVerticalBox("");
1137 {
1138 openPaintBox2("dark_box");
1139 {
1140 create_small_rackknob("midi_out.channel_3.volume",_("volume"));
1141 }
1142 closeBox();
1143 addCheckButton("midi_out.channel_3.autogain",_("autogain"));
1144 }
1145 closeBox();
1146 openVerticalBox("");
1147 {
1148 addNumEntry("midi_out.channel_3.channel",_("channel"));
1149 addNumEntry("midi_out.channel_3.program",_("program"));
1150 }
1151 closeBox();
1152 create_small_rackknob("midi_out.channel_3.oktave",_("oktave"));
1153 create_small_rackknob("midi_out.channel_3.sensity",_("sensity"));
1154 }
1155 closeBox();
1156 openHorizontalBox("");
1157 {
1158 create_switch_no_caption(sw_switchit, "midi_out.channel_3.on_off");
1159 openFrameBox("");
1160 closeBox();
1161 openVerticalBox("");
1162 {
1163 openFrameBox("");
1164 closeBox();
1165 openPaintBox2("darker_box");
1166 {
1167 create_switch_no_caption(sw_led,"midi_out.midistat3");
1168 }
1169 closeBox();
1170 openFrameBox("");
1171 closeBox();
1172 }
1173 closeBox();
1174
1175 openFrameBox("");
1176 closeBox();
1177 openHorizontalBox(" ");
1178 {
1179 addMToggleButton("midi_out.channel_3.auto_pitch",_("auto_pitch"));
1180 }
1181 closeBox();
1182 }
1183 closeBox();
1184 }
1185 closeBox();
1186 }
1187 closeBox();
1188 }
1189 closeBox();
1190
1191 openVerticalBox(_("beat_detector"));
1192 {
1193 openpaintampBox("MIDI OUT");
1194 {
1195 openVerticalBox("");
1196 {
1197
1198 openHorizontalBox("");
1199 {
1200 create_small_rackknob("beat_detector.stepper",_("stepper"));
1201 create_small_rackknob("beat_detector.note_off",_("note_off"));
1202 create_small_rackknob("beat_detector.atack_gain",_("atack_gain"));
1203 create_small_rackknob("beat_detector.beat_gain",_("beat_gain"));
1204 }
1205 closeBox();
1206 addStatusDisplay("", &gx_engine::audio.midistat);
1207 openHorizontalBox("");
1208 {
1209 openFrameBox("");
1210 closeBox();
1211 openPaintBox2("darker_box");
1212 {
1213 create_switch_no_caption(sw_led,"midi_out.midistat1");
1214 }
1215 closeBox();
1216 openFrameBox("");
1217 closeBox();
1218 openPaintBox2("darker_box");
1219 {
1220 create_switch_no_caption(sw_led,"midi_out.midistat2");
1221 }
1222 closeBox();
1223 openFrameBox("");
1224 closeBox();
1225 openPaintBox2("darker_box");
1226 {
1227 create_switch_no_caption(sw_led,"midi_out.midistat3");
1228 }
1229 closeBox();
1230 openFrameBox("");
1231 closeBox();
1232 }
1233 closeBox();
1234
1235 openVerticalBox(_("Midi gain"));
1236 {
1237 create_wheel("beat_detector.midi_gain");
1238 }
1239 closeBox();
1240 }
1241 closeBox();
1242 }
1243 closeBox();
1244 }
1245 closeBox();
1246 }
1247 closeBox();
1248
1249 }
1250 closeBox();
1251 }
1252 closeBox();
1253 }
1254 closeBox();
1255
1256
1257 }
1258 closeBox();
1259
1260 }
1261
1262 }
1263
34 void GxMainInterface::gx_build_mono_rack() {
35 /** This is the fixed box on top of the mono rack, it include fixed effect modules
36 * witch can't move (make no sense to move them arround). Right now it is the noisegate,
37 * and the noisesharper, witch are fixed at the beginning of the process callback, and the
38 * mono level out and the clipper, witch are fixed at the end of the mono callback.
39 **/
40 openHorizontalTableBox("");
41 {
42 openVerticalBox("");
43 {
44 openPaintBox("");
45 {
46 openVerticalBox(" noise gate ");
47 {
48 openHorizontalBox("");
49 {
50 create_switch_no_caption(sw_switchit, "noise_gate.on_off");
51 openpaintampBox("noise gate");
52 {
53 create_wheel("noise_gate.threshold");
54 }
55 closeBox();
56 }
57 closeBox();
58 }
59 closeBox();
60
61 openVerticalBox(_("noise shaper "));
62 {
63 openHorizontalBox("");
64 {
65 create_switch_no_caption(sw_switchit, "shaper.on_off");
66
67 openpaintampBox("shaper");
68 {
69 create_wheel("shaper.sharper");
70 }
71 closeBox();
72 }
73 closeBox();
74 }
75 closeBox();
76
77 openVerticalBox(_("mono level out "));
78 {
79 openHorizontalBox("");
80 {
81 create_switch_no_caption(sw_switchit, "amp.on_off");
82
83 openpaintampBox("level");
84 {
85 create_spin_value("amp.out_amp");
86 create_wheel("amp.out_amp");
87 }
88 closeBox();
89 }
90 closeBox();
91 }
92 closeBox();
93
94 openVerticalBox(_("clip "));
95 {
96 openHorizontalBox("");
97 {
98 create_switch_no_caption(sw_switchit, "amp.clip.on_off");
99
100 openpaintampBox("level");
101 {
102 create_wheel("amp.fuzz");
103 }
104 closeBox();
105 }
106 closeBox();
107 }
108 closeBox();
109 }
110 closeBox();
111 }
112 closeBox();
113
114 /** The moveable mono effects. Main box of a mono effect modul is the HorizontalOrderBox
115 * witch present the move buttons. Inside the HorizontalOrderBox we need a DialogBox witch
116 * register the effect to a counter and insert a menu entry as well a button to the toolbar
117 **/
118 // low high pass filter
119 openHorizontalOrderBox(_("l/h/filter"), &gx_engine::audio.posit[14]);
120 {
121 openVerticalBox(_("l/h/filter"));
122 {
123 openHorizontalBox("");
124 {
125 openPaintBox1("");
126 {
127 create_switch_no_caption(sw_switchit, "low_highpass.on_off");
128 create_selector("low_highpass.pp");
129 }
130 closeBox();
131
132 openDialogBox("low_highpass.dialog", "low_highpass.on_off", "RackBox_expose");
133 {
134 openHorizontalBox("");
135 {
136
137 openHorizontalBox("");
138 {
139 create_small_rackknob("low_high_pass.lhp.high_freq", _("high-pass "));
140 create_small_rackknob("low_high_pass.lhp.low_freq", _(" low-pass "));
141 create_switch_no_caption(sw_switchit, "low_high_pass.lhp.on_off");
142 }
143 closeBox();
144 openSpaceBox("");
145 closeBox();
146 openHorizontalBox("");
147 {
148 create_small_rackknob("low_high_pass.lhc.low_freq", _("low-cut "));
149 create_small_rackknob("low_high_pass.lhc.high_freq", _("high-cut "));
150 create_switch_no_caption(sw_switchit, "low_high_pass.lhc.on_off");
151 }
152 closeBox();
153 }
154 closeBox();
155 }
156 closeBox();
157 }
158 closeBox();
159 }
160 closeBox();
161 }
162 closeBox();
163 // EQ
164 openHorizontalOrderBox(_("EQ"), &gx_engine::audio.posit[10]);
165 {
166 openVerticalBox(_("EQ"));
167 {
168 openHorizontalBox("");
169 {
170 openPaintBox1("");
171 {
172 create_switch_no_caption(sw_switchit, "eqs.on_off");
173 create_selector("eqs.pp");
174 }
175 closeBox();
176
177 openDialogBox("eqs.dialog", "eqs.on_off", "RackBox_expose");
178 {
179 openVerticalBox("");
180 {
181 openHorizontalTableBox("");
182 {
183 create_simple_spin_value("eqs.freq31_25");
184 create_simple_spin_value("eqs.freq62_5");
185 create_simple_spin_value("eqs.freq125");
186 create_simple_spin_value("eqs.freq250");
187 create_simple_spin_value("eqs.freq500");
188 create_simple_spin_value("eqs.freq1k");
189 create_simple_spin_value("eqs.freq2k");
190 create_simple_spin_value("eqs.freq4k");
191 create_simple_spin_value("eqs.freq8k");
192 create_simple_spin_value("eqs.freq16k");
193 }
194 closeBox();
195 openHorizontalTableBox("");
196 {
197 create_eq_rackslider_no_caption("eqs.fs31_25");
198 create_eq_rackslider_no_caption("eqs.fs62_5");
199 create_eq_rackslider_no_caption("eqs.fs125");
200 create_eq_rackslider_no_caption("eqs.fs250");
201 create_eq_rackslider_no_caption("eqs.fs500");
202 create_eq_rackslider_no_caption("eqs.fs1k");
203 create_eq_rackslider_no_caption("eqs.fs2k");
204 create_eq_rackslider_no_caption("eqs.fs4k");
205 create_eq_rackslider_no_caption("eqs.fs8k");
206 create_eq_rackslider_no_caption("eqs.fs16k");
207 }
208 closeBox();
209 openHorizontalTableBox("");
210 {
211 create_small_rackknob("eqs.Qs31_25", "Q");
212 create_small_rackknob("eqs.Qs62_5", "Q");
213 create_small_rackknob("eqs.Qs125", "Q");
214 create_small_rackknob("eqs.Qs250", "Q");
215 create_small_rackknob("eqs.Qs500", "Q");
216 create_small_rackknob("eqs.Qs1k", "Q");
217 create_small_rackknob("eqs.Qs2k", "Q");
218 create_small_rackknob("eqs.Qs4k", "Q");
219 create_small_rackknob("eqs.Qs8k", "Q");
220 create_small_rackknob("eqs.Qs16k", "Q");
221 }
222 closeBox();
223 }
224 closeBox();
225 }
226 closeBox();
227 }
228 closeBox();
229 }
230 closeBox();
231 }
232 closeBox();
233 // ----- crybaby
234 openHorizontalOrderBox(_("crybaby"), &gx_engine::audio.posit[0]);
235 {
236 openVerticalBox(_("crybaby"));
237 {
238 openHorizontalBox("");
239 {
240 openPaintBox1("");
241 {
242 create_switch_no_caption(sw_switchit, "crybaby.on_off");
243 create_selector("crybaby.pp");
244 }
245 closeBox();
246
247 openDialogBox("crybaby.dialog", "crybaby.on_off", "RackBox_expose");
248 {
249 openHorizontalBox("");
250 {
251 openSpaceBox("");
252 closeBox();
253 create_selector("crybaby.autowah");
254 openSpaceBox("");
255 closeBox();
256 openSpaceBox("");
257 closeBox();
258 openHorizontalTableBox("");
259 {
260 create_small_rackknobr("crybaby.wah", _(" wah "));
261 create_small_rackknob("crybaby.level", _(" level "));
262 create_small_rackknob("crybaby.wet_dry", _(" dry/wet "));
263 }
264 closeBox();
265 openSpaceBox("");
266 closeBox();
267 }
268 closeBox();
269 }
270 closeBox();
271 }
272 closeBox();
273 }
274 closeBox();
275 }
276 closeBox();
277 // ----- distortion
278 openHorizontalOrderBox(_("distortion"), &gx_engine::audio.posit[2]);
279 {
280 openVerticalBox(_("distortion"));
281 {
282 openHorizontalBox("");
283 {
284 openPaintBox1("");
285 {
286 create_switch_no_caption(sw_switchit, "gx_distortion.on_off");
287 create_selector("gx_distortion.pp");
288 }
289 closeBox();
290
291 openDialogBox("gx_distortion.dialog", "gx_distortion.on_off", "RackBox_expose");
292 {
293 openHorizontalBox("");
294 {
295 openVerticalBox("");
296 {
297 openVerticalBox("");
298 {
299 openFlipLabelBox(_(" drive "));
300 {
301 openHorizontalBox("");
302 {
303 create_small_rackknobr("gx_distortion.drive", _(" drive "));
304 create_small_rackknobr("gx_distortion.low_drive", _(" low "));
305 create_small_rackknobr("gx_distortion.middle_l_drive", _(" middle l. "));
306 create_small_rackknobr("gx_distortion.middle_h_drive", _(" middle h. "));
307 create_small_rackknobr("gx_distortion.high_drive", _(" high "));
308 }
309 closeBox();
310 }
311 closeBox();
312 openFlipLabelBox(_(" gain "));
313 {
314 openHorizontalBox("");
315 {
316 create_small_rackknob("gx_distortion.gain", _(" gain "));
317 create_small_rackknob("gx_distortion.low_gain", _(" low "));
318 create_small_rackknob("gx_distortion.middle_l_gain", _(" middle l. "));
319 create_small_rackknob("gx_distortion.middle_h_gain", _(" middle h. "));
320 create_small_rackknob("gx_distortion.high_gain", _(" high "));
321 }
322 closeBox();
323 }
324 closeBox();
325 }
326 closeBox();
327
328 openHorizontalBox("");
329 {
330 create_small_rackknob("gx_distortion.level", _(" level "));
331 openVerticalBox(_("frequency split Hz"));
332 {
333 openpaintampBox("");
334 {
335 openHorizontalBox("");
336 {
337 openSpaceBox("");
338 closeBox();
339 create_wheel("gx_distortion.split_low_freq", _("split low freq"));
340 openSpaceBox("");
341 closeBox();
342 create_wheel("gx_distortion.split_middle_freq", _("split m. freq"));
343 openSpaceBox("");
344 closeBox();
345 create_wheel("gx_distortion.split_high_freq", _("split high freq"));
346 openSpaceBox("");
347 closeBox();
348 }
349 closeBox();
350 }
351 closeBox();
352 }
353 closeBox();
354 }
355 closeBox();
356 }
357 closeBox();
358
359 openVerticalBox(_("resonator"));
360 {
361 create_small_rackknob("gx_distortion.trigger", _("trigger "));
362 create_small_rackknob("gx_distortion.vibrato", _(" vibrato "));
363 create_switch_no_caption(sw_switchit, "gx_distortion.resonator.on_off");
364 }
365 closeBox();
366 }
367 closeBox();
368 }
369 closeBox();
370 }
371 closeBox();
372 }
373 closeBox();
374 }
375 closeBox();
376 // ----- IR
377 openHorizontalOrderBox(_("IR"), &gx_engine::audio.posit[4]);
378 {
379 openVerticalBox(_("IR"));
380 {
381 openHorizontalBox("");
382 {
383 openPaintBox1("");
384 {
385 create_switch_no_caption(sw_switchit, "IR.on_off");
386 create_selector("IR.pp");
387 }
388 closeBox();
389
390 openDialogBox("IR.dialog", "IR.on_off", "RackBox_expose");
391 {
392 openVerticalBox1("");
393 {
394 openHorizontalBox("");
395 {
396 openSpaceBox("");
397 closeBox();
398 create_selector("IR.auto_freq");
399 openSpaceBox("");
400 closeBox();
401
402 openHorizontalTableBox("");
403 {
404 create_small_rackknob("IR.freq", _(" freq "));
405 create_small_rackknob("IR.peak", _(" peak "));
406 create_small_rackknob("IR.bandwidth", _(" bandwidth "));
407 }
408 closeBox();
409 }
410 closeBox();
411 }
412 closeBox();
413 }
414 closeBox();
415 }
416 closeBox();
417 }
418 closeBox();
419 }
420 closeBox();
421 // ----- the compressor
422 openHorizontalOrderBox(_("Compr."), &gx_engine::audio.posit[5]);
423 {
424 openVerticalBox(_("Compr."));
425 {
426 openHorizontalBox("");
427 {
428 openPaintBox1("");
429 {
430 create_switch_no_caption(sw_switchit, "compressor.on_off");
431 create_selector("compressor.pp");
432 }
433 closeBox();
434
435 openDialogBox("compressor.dialog", "compressor.on_off", "RackBox_expose");
436 {
437 openHorizontalTableBox("");
438 {
439 create_small_rackknob("compressor.knee", _("knee"));
440 create_small_rackknobr("compressor.ratio", _("ratio"));
441 create_small_rackknob("compressor.threshold", _("threshold"));
442
443
444 create_small_rackknob("compressor.attack", _("attack"));
445 create_small_rackknob("compressor.release", _("release"));
446 }
447 closeBox();
448 }
449 closeBox();
450 }
451 closeBox();
452 }
453 closeBox();
454 }
455 closeBox();
456 // -----overdrive
457 openHorizontalOrderBox(_("overdrive"), &gx_engine::audio.posit[1]);
458 {
459 openVerticalBox(_("overdrive"));
460 {
461 openHorizontalBox("");
462 {
463 openPaintBox1("");
464 {
465 create_switch_no_caption(sw_switchit, "overdrive.on_off");
466 create_selector("overdrive.pp");
467 }
468 closeBox();
469
470 openDialogBox("overdrive.dialog", "overdrive.on_off", "RackBox_expose");
471 {
472 openHorizontalTableBox("");
473 {
474 openSpaceBox("");
475 closeBox();
476 create_small_rackknobr("overdrive.drive", _(" drive "));
477 openSpaceBox("");
478 closeBox();
479 }
480 closeBox();
481 }
482 closeBox();
483 }
484 closeBox();
485 }
486 closeBox();
487 }
488 closeBox();
489 // ----- echo
490 openHorizontalOrderBox(_("echo"), &gx_engine::audio.posit[6]);
491 {
492 openVerticalBox(_("echo"));
493 {
494 openHorizontalBox("");
495 {
496 openPaintBox1("");
497 {
498 create_switch_no_caption(sw_switchit, "echo.on_off");
499 create_selector("echo.pp");
500 }
501 closeBox();
502
503 openDialogBox("echo.dialog", "echo.on_off", "RackBox_expose");
504 {
505 openVerticalBox("");
506 {
507 openHorizontalTableBox("");
508 {
509 create_small_rackknobr("echo.time", _(" time "));
510
511 create_small_rackknob("echo.percent", _(" % "));
512 }
513 closeBox();
514 }
515 closeBox();
516 }
517 closeBox();
518 }
519 closeBox();
520 }
521 closeBox();
522 }
523 closeBox();
524 // -----delay
525 openHorizontalOrderBox(_("delay"), &gx_engine::audio.posit[7]);
526 {
527 openVerticalBox(_("delay"));
528 {
529 openHorizontalBox("");
530 {
531 openPaintBox1("");
532 {
533 create_switch_no_caption(sw_switchit, "delay.on_off");
534 create_selector("delay.pp");
535 }
536 closeBox();
537
538 openDialogBox("delay.dialog", "delay.on_off", "RackBox_expose");
539 {
540 openVerticalBox("");
541 {
542 openHorizontalTableBox("");
543 {
544 create_small_rackknobr("delay.delay", _(" delay "));
545
546 create_small_rackknob("delay.gain", _(" gain "));
547 }
548 closeBox();
549 }
550 closeBox();
551 }
552 closeBox();
553 }
554 closeBox();
555 }
556 closeBox();
557 }
558 closeBox();
559 // ----- freeverb
560 openHorizontalOrderBox(_("freeverb"), &gx_engine::audio.posit[3]);
561 {
562 openVerticalBox(_("freeverb"));
563 {
564 openHorizontalBox("");
565 {
566 openPaintBox1("");
567 {
568 create_switch_no_caption(sw_switchit, "freeverb.on_off");
569 create_selector("freeverb.pp");
570 }
571 closeBox();
572 openDialogBox("freeverb.dialog", "freeverb.on_off", "RackBox_expose");
573 {
574 openFrameBox("");
575 closeBox();
576 openFrameBox("");
577 closeBox();
578 openHorizontalTableBox("");
579 {
580 create_small_rackknobr("freeverb.RoomSize", _("RoomSize"));
581 create_small_rackknob("freeverb.damp", _("damp"));
582 create_small_rackknob("freeverb.wet_dry", _("dry/wet"));
583 }
584 closeBox();
585 openFrameBox("");
586 closeBox();
587 openFrameBox("");
588 closeBox();
589 }
590 closeBox();
591 }
592 closeBox();
593 }
594 closeBox();
595 }
596 closeBox();
597
598 // -----osc
599 openHorizontalOrderBox(_("oscilloscope"), &gx_engine::audio.posit[17]);
600 {
601 openVerticalBox(_("osc"));
602 {
603 openHorizontalBox("");
604 {
605 openPaintBox1("");
606 {
607 create_switch_no_caption(sw_switchit, "oscilloscope.on_off");
608 create_selector("oscilloscope.pp");
609 }
610 closeBox();
611
612 openDialogBox("oscilloscope.dialog", "oscilloscope.on_off", "RackBox_expose");
613 {
614 openVerticalBox("");
615 {
616 openFrameBox("");
617 closeBox();
618 openHorizontalBox("");
619 {
620 openFrameBox("");
621 closeBox();
622 addLiveWaveDisplay(" ", &gx_engine::audio.viv , &gx_engine::audio.vivi);
623 openFrameBox("");
624 closeBox();
625 }
626 closeBox();
627 openFrameBox("");
628 closeBox();
629 }
630 closeBox();
631 }
632 closeBox();
633 }
634 closeBox();
635 }
636 closeBox();
637 }
638 closeBox();
639
640 openHorizontalOrderBox(_("biquad"), &gx_engine::audio.posit[18]);
641 {
642 openVerticalBox(_("biquad"));
643 {
644 openHorizontalBox("");
645 {
646 openPaintBox1("");
647 {
648 create_switch_no_caption(sw_switchit, "biquad.on_off");
649 create_selector("biquad.pp");
650 }
651 closeBox();
652
653 openDialogBox("biquad.dialog", "biquad.on_off", "RackBox_expose");
654 {
655 openVerticalBox("");
656 {
657 openHorizontalBox("");
658 {
659 create_small_rackknobr("biquad.Freq", _("Freq"));
660 }
661 closeBox();
662 }
663 closeBox();
664 }
665 closeBox();
666 }
667 closeBox();
668 }
669 closeBox();
670 }
671 closeBox();
672
673 openHorizontalOrderBox(_("tremolo"), &gx_engine::audio.posit[21]);
674 {
675 openVerticalBox(_("tremolo"));
676 {
677 openHorizontalBox("");
678 {
679 openPaintBox1("");
680 {
681 create_switch_no_caption(sw_switchit, "tremolo.on_off");
682 create_selector("tremolo.pp");
683 }
684 closeBox();
685
686 openDialogBox("tremolo.dialog", "tremolo.on_off", "RackBox_expose");
687 {
688 openVerticalBox("");
689 {
690 openHorizontalBox("");
691 {
692 openSpaceBox("");
693 closeBox();
694 create_selector("tremolo.SINE");
695 openSpaceBox("");
696 closeBox();
697 openSpaceBox("");
698 closeBox();
699 openHorizontalTableBox("");
700 {
701 create_small_rackknobr("tremolo.freq", _("Freq"));
702 openSpaceBox("");
703 closeBox();
704 create_small_rackknobr("tremolo.depth", _("Depth"));
705 openSpaceBox("");
706 closeBox();
707 create_small_rackknob("tremolo.wet_dry", _("dry/wet"));
708 }
709 closeBox();
710 }
711 closeBox();
712 }
713 closeBox();
714 }
715 closeBox();
716 }
717 closeBox();
718 }
719 closeBox();
720 }
721 closeBox();
722
723 openHorizontalOrderBox(_("phaser"), &gx_engine::audio.posit[22]);
724 {
725 openVerticalBox(_("phaser"));
726 {
727 openHorizontalBox("");
728 {
729 openPaintBox1("");
730 {
731 create_switch_no_caption(sw_switchit, "phaser_mono.on_off");
732 create_selector("phaser_mono.pp");
733 }
734 closeBox();
735
736 openDialogBox("phaser_mono.dialog", "phaser_mono.on_off", "RackBox_expose");
737 {
738 openVerticalBox("");
739 {
740 openHorizontalBox("");
741 {
742 create_small_rackknobr("phaser_mono.level", _("level"));
743 create_small_rackknob("phaser_mono.Speed", _("speed"));
744 create_small_rackknob("phaser_mono.wet_dry", _("dry/wet"));
745 }
746 closeBox();
747 }
748 closeBox();
749 }
750 closeBox();
751 }
752 closeBox();
753 }
754 closeBox();
755 }
756 closeBox();
757
758 openHorizontalOrderBox(_("chorus"), &gx_engine::audio.posit[23]);
759 {
760 openVerticalBox(_("chorus"));
761 {
762 openHorizontalBox("");
763 {
764 openPaintBox1("");
765 {
766 create_switch_no_caption(sw_switchit, "chorus_mono.on_off");
767 create_selector("chorus_mono.pp");
768 }
769 closeBox();
770
771 openDialogBox("chorus_mono.dialog", "chorus_mono.on_off", "RackBox_expose");
772 {
773 openVerticalBox("");
774 {
775 openHorizontalBox("");
776 {
777 create_small_rackknobr("chorus_mono.level", _("level"));
778 create_small_rackknob("chorus_mono.freq", _("speed"));
779 create_small_rackknob("chorus_mono.wet_dry", _("dry/wet"));
780 }
781 closeBox();
782 }
783 closeBox();
784 }
785 closeBox();
786 }
787 closeBox();
788 }
789 closeBox();
790 }
791 closeBox();
792
793 openHorizontalOrderBox(_("flanger"), &gx_engine::audio.posit[24]);
794 {
795 openVerticalBox(_("flanger"));
796 {
797 openHorizontalBox("");
798 {
799 openPaintBox1("");
800 {
801 create_switch_no_caption(sw_switchit, "flanger_mono.on_off");
802 create_selector("flanger_mono.pp");
803 }
804 closeBox();
805
806 openDialogBox("flanger_mono.dialog", "flanger_mono.on_off", "RackBox_expose");
807 {
808 openVerticalBox("");
809 {
810 openHorizontalBox("");
811 {
812 create_small_rackknobr("flanger_mono.level", _("level"));
813 create_small_rackknob("flanger_mono.freq", _("speed"));
814 create_small_rackknob("flanger_mono.wet_dry", _("dry/wet"));
815 }
816 closeBox();
817 }
818 closeBox();
819 }
820 closeBox();
821 }
822 closeBox();
823 }
824 closeBox();
825 }
826 closeBox();
827
828 openHorizontalOrderBox(_("feedback"), &gx_engine::audio.posit[25]);
829 {
830 openVerticalBox(_("feedback"));
831 {
832 openHorizontalBox("");
833 {
834 openPaintBox1("");
835 {
836 create_switch_no_caption(sw_switchit, "feedback.on_off");
837 create_selector("feedback.pp");
838 }
839 closeBox();
840
841 openDialogBox("feedback.dialog", "feedback.on_off", "RackBox_expose");
842 {
843 openVerticalBox("");
844 {
845 openHorizontalBox("");
846 {
847 create_small_rackknobr("feedback.feedback", _("feedback"));
848 create_small_rackknob("feedback.wet_dry", _("dry/wet"));
849 }
850 closeBox();
851 }
852 closeBox();
853 }
854 closeBox();
855 }
856 closeBox();
857 }
858 closeBox();
859 }
860 closeBox();
861
862 openHorizontalOrderBox(_("tonestack"), &gx_engine::audio.posit[26]);
863 {
864 openVerticalBox(_("tonestack"));
865 {
866 openHorizontalBox("");
867 {
868 openPaintBox1("");
869 {
870 create_switch_no_caption(sw_switchit, "amp.tonestack.on_off");
871 create_selector("amp.tonestack.pp");
872 }
873 closeBox();
874
875 openDialogBox("amp.tonestack.dialog", "amp.tonestack.on_off", "RackBox_expose");
876 {
877 openVerticalBox("");
878 {
879 openHorizontalBox("");
880 {
881 create_selector("amp.tonestack.select");
882
883 create_small_rackknob("amp.tonestack.Bass", _("bass"));
884
885 create_small_rackknob("amp.tonestack.Middle", _("middle"));
886
887 create_small_rackknob("amp.tonestack.Treble", _("treble"));
888 }
889 closeBox();
890 }
891 closeBox();
892 }
893 closeBox();
894 }
895 closeBox();
896 }
897 closeBox();
898 }
899 closeBox();
900
901 openHorizontalOrderBox(_("cabinet"), &gx_engine::audio.posit[27]);
902 {
903 openVerticalBox(_("cabinet"));
904 {
905 openHorizontalBox("");
906 {
907 openPaintBox1("");
908 {
909 create_switch_no_caption(sw_switchit, "cab.on_off");
910 create_selector("cab.pp");
911 }
912 closeBox();
913
914 openDialogBox("cab.dialog", "cab.on_off", "RackBox_expose");
915 {
916 openVerticalBox("");
917 {
918 openHorizontalBox("");
919 {
920 create_selector("cab.select");
921 create_small_rackknob("cab.bass", "bass");
922 create_small_rackknob("cab.treble", "treble");
923 create_small_rackknobr("cab.Level", "level");
924 }
925 closeBox();
926 }
927 closeBox();
928 }
929 closeBox();
930 }
931 closeBox();
932 }
933 closeBox();
934 }
935 closeBox();
936
937 openVerticalMidiBox(_(" MIDI out "));
938 {
939 openHorizontalBox("");
940 {
941 openVerticalBox(_(" MIDI out "));
942 {
943 create_switch_no_caption(sw_switchit, "midi_out.on_off");
944 openFrameBox("");
945 closeBox();
946 openHorizontalBox("");
947 {
948 openFrameBox("");
949 closeBox();
950 openPaintBox2("gree_box");
951 {
952 create_switch_no_caption(sw_led, "midi_out.midistat");
953 }
954 closeBox();
955 openFrameBox("");
956 closeBox();
957 }
958 closeBox();
959 openFrameBox("");
960 closeBox();
961 }
962 closeBox();
963 // ----- create the midi settings dialog
964 openVerticalBox("");
965 {
966 openTabBox("");
967 {
968 openVerticalBox(_("channel1"));
969 {
970 openpaintampBox("MIDI OUT");
971 {
972 openVerticalBox("");
973 {
974 openHorizontalBox("");
975 {
976 create_small_rackknob("midi_out.channel_1.velocity", _("velocity"));
977 openVerticalBox("");
978 {
979 openPaintBox2("dark_box");
980 {
981 create_small_rackknob("midi_out.channel_1.volume", _("volume"));
982 }
983 closeBox();
984 addCheckButton("midi_out.channel_1.autogain", _("autogain"));
985 }
986 closeBox();
987 openVerticalBox("");
988 {
989 addNumEntry("midi_out.channel_1.channel", _("channel"));
990 addNumEntry("midi_out.channel_1.program", _("program"));
991 }
992 closeBox();
993 create_small_rackknob("midi_out.channel_1.oktave", _("oktave"));
994 create_small_rackknob("midi_out.channel_1.sensity", _("sensity"));
995 }
996 closeBox();
997 openHorizontalBox("");
998 {
999 openHorizontalBox(" ");
1000 closeBox();
1001 openFrameBox("");
1002 closeBox();
1003 openVerticalBox("");
1004 {
1005 openFrameBox("");
1006 closeBox();
1007 openPaintBox2("darker_box");
1008 {
1009 create_switch_no_caption(sw_led, "midi_out.midistat1");
1010 }
1011 closeBox();
1012 openFrameBox("");
1013 closeBox();
1014 }
1015 closeBox();
1016 openFrameBox("");
1017 closeBox();
1018 openHorizontalBox(" ");
1019 {
1020 addMToggleButton("midi_out.channel_1.auto_pitch", _("auto_pitch"));
1021 }
1022 closeBox();
1023 }
1024 closeBox();
1025 }
1026 closeBox();
1027 }
1028 closeBox();
1029 }
1030 closeBox();
1031
1032 openVerticalBox(_("channel2"));
1033 {
1034 openpaintampBox("MIDI OUT");
1035 {
1036 openVerticalBox("");
1037 {
1038 openHorizontalBox("");
1039 {
1040 create_small_rackknob("midi_out.channel_2.velocity", _("velocity"));
1041 openVerticalBox("");
1042 {
1043 openPaintBox2("dark_box");
1044 {
1045 create_small_rackknob("midi_out.channel_2.volume", _("volume"));
1046 }
1047 closeBox();
1048 addCheckButton("midi_out.channel_2.autogain", _("autogain"));
1049 }
1050 closeBox();
1051 openVerticalBox("");
1052 {
1053 addNumEntry("midi_out.channel_2.channel", _("channel"));
1054 addNumEntry("midi_out.channel_2.program", _("program"));
1055 }
1056 closeBox();
1057 create_small_rackknob("midi_out.channel_2.oktave", _("oktave"));
1058 create_small_rackknob("midi_out.channel_2.sensity", _("sensity"));
1059 }
1060 closeBox();
1061 openHorizontalBox("");
1062 {
1063 create_switch_no_caption(sw_switchit, "midi_out.channel_2.on_off");
1064 openFrameBox("");
1065 closeBox();
1066 openVerticalBox("");
1067 {
1068 openFrameBox("");
1069 closeBox();
1070 openPaintBox2("darker_box");
1071 {
1072 create_switch_no_caption(sw_led, "midi_out.midistat2");
1073 }
1074 closeBox();
1075 openFrameBox("");
1076 closeBox();
1077 }
1078 closeBox();
1079 openFrameBox("");
1080 closeBox();
1081
1082 openHorizontalBox(" ");
1083 {
1084 addMToggleButton("midi_out.channel_2.auto_pitch", _("auto_pitch"));
1085 }
1086 closeBox();
1087 }
1088 closeBox();
1089 }
1090 closeBox();
1091 }
1092 closeBox();
1093 }
1094 closeBox();
1095
1096 openVerticalBox(_("channel3"));
1097 {
1098 openpaintampBox("MIDI OUT");
1099 {
1100 openVerticalBox("");
1101 {
1102 openHorizontalBox("");
1103 {
1104 create_small_rackknob("midi_out.channel_3.velocity", _("velocity"));
1105 openVerticalBox("");
1106 {
1107 openPaintBox2("dark_box");
1108 {
1109 create_small_rackknob("midi_out.channel_3.volume", _("volume"));
1110 }
1111 closeBox();
1112 addCheckButton("midi_out.channel_3.autogain", _("autogain"));
1113 }
1114 closeBox();
1115 openVerticalBox("");
1116 {
1117 addNumEntry("midi_out.channel_3.channel", _("channel"));
1118 addNumEntry("midi_out.channel_3.program", _("program"));
1119 }
1120 closeBox();
1121 create_small_rackknob("midi_out.channel_3.oktave", _("oktave"));
1122 create_small_rackknob("midi_out.channel_3.sensity", _("sensity"));
1123 }
1124 closeBox();
1125 openHorizontalBox("");
1126 {
1127 create_switch_no_caption(sw_switchit, "midi_out.channel_3.on_off");
1128 openFrameBox("");
1129 closeBox();
1130 openVerticalBox("");
1131 {
1132 openFrameBox("");
1133 closeBox();
1134 openPaintBox2("darker_box");
1135 {
1136 create_switch_no_caption(sw_led, "midi_out.midistat3");
1137 }
1138 closeBox();
1139 openFrameBox("");
1140 closeBox();
1141 }
1142 closeBox();
1143
1144 openFrameBox("");
1145 closeBox();
1146 openHorizontalBox(" ");
1147 {
1148 addMToggleButton("midi_out.channel_3.auto_pitch", _("auto_pitch"));
1149 }
1150 closeBox();
1151 }
1152 closeBox();
1153 }
1154 closeBox();
1155 }
1156 closeBox();
1157 }
1158 closeBox();
1159
1160 openVerticalBox(_("beat_detector"));
1161 {
1162 openpaintampBox("MIDI OUT");
1163 {
1164 openVerticalBox("");
1165 {
1166
1167 openHorizontalBox("");
1168 {
1169 create_small_rackknob("beat_detector.stepper", _("stepper"));
1170 create_small_rackknob("beat_detector.note_off", _("note_off"));
1171 create_small_rackknob("beat_detector.atack_gain", _("atack_gain"));
1172 create_small_rackknob("beat_detector.beat_gain", _("beat_gain"));
1173 }
1174 closeBox();
1175 addStatusDisplay("", &gx_engine::audio.midistat);
1176 openHorizontalBox("");
1177 {
1178 openFrameBox("");
1179 closeBox();
1180 openPaintBox2("darker_box");
1181 {
1182 create_switch_no_caption(sw_led, "midi_out.midistat1");
1183 }
1184 closeBox();
1185 openFrameBox("");
1186 closeBox();
1187 openPaintBox2("darker_box");
1188 {
1189 create_switch_no_caption(sw_led, "midi_out.midistat2");
1190 }
1191 closeBox();
1192 openFrameBox("");
1193 closeBox();
1194 openPaintBox2("darker_box");
1195 {
1196 create_switch_no_caption(sw_led, "midi_out.midistat3");
1197 }
1198 closeBox();
1199 openFrameBox("");
1200 closeBox();
1201 }
1202 closeBox();
1203
1204 openVerticalBox(_("Midi gain"));
1205 {
1206 create_wheel("beat_detector.midi_gain");
1207 }
1208 closeBox();
1209 }
1210 closeBox();
1211 }
1212 closeBox();
1213 }
1214 closeBox();
1215 }
1216 closeBox();
1217 }
1218 closeBox();
1219 }
1220 closeBox();
1221 }
1222 closeBox();
1223 }
1224 closeBox();
1225 } // close mono rack
1226 } // end namespace gx_gui
1227
00 /*
1 * Copyright (C) 2010 Hermann Meyer, James Warden, Andreas Degert
1 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * ---------------------------------------------------------------------------
1718 *
1819 * parameter and midi data
2021 * ----------------------------------------------------------------------------
2122 */
2223
23 #include <set>
24 #include "guitarix.h"
25 #include <glibmm/i18n.h>
26
27 namespace gx_gui
28 {
24 #include "guitarix.h" // NOLINT
25
26 #include <glibmm/i18n.h> // NOLINT
27
28 #include <set> // NOLINT
29 #include <map> // NOLINT
30 #include <utility> // NOLINT
31 #include <algorithm> // NOLINT
32 #include <string> // NOLINT
33
34
35 namespace gx_gui {
2936
3037 /****************************************************************
3138 ** Global Variables
4451 */
4552
4653 static struct midi_std_init {
47 int ctrl;
48 const char *name;
54 int ctrl;
55 const char *name;
4956 } midi_std_itab[] = {
50 { 0, "Bank Select MSB"},
51 { 1, "Modulation MSB"},
52 { 2, "Breath Contoller"},
53
54 { 4, "Foot Controller MSB"},
55 { 5, "Portamento Time MSB"},
56 { 6, "Data Entry MSB"},
57 { 7, "Main Volume"},
58 { 8, "Balance"},
59
60 {10, "Pan"},
61 {11, "Expression"},
62 {12, "Effect Control 1"},
63 {13, "Effect Control 2"},
64
65 {32, "Bank Select LSB"},
66
67 {64, "Sustain"},
68 {65, "Portamento"},
69 {66, "Sostenuto"},
70 {67, "Soft Pedal"},
71 {68, "Legato Footswitch"},
72 {69, "Hold 2"},
73 {70, "Sound Contr. 1"}, // default: Sound Variation
74 {71, "Sound Contr. 2"}, // default: Timbre/Harmonic Content
75 {72, "Sound Contr. 3"}, // default: Release Time
76 {73, "Sound Contr. 4"}, // default: Attack Time
77 {74, "Sound Contr. 5"}, // default: Brightness
78 {75, "Sound Contr. 6"},
79 {76, "Sound Contr. 7"},
80 {77, "Sound Contr. 8"},
81 {78, "Sound Contr. 9"},
82 {79, "Sound Contr. 10"},
83
84 {84, "Portamento Control"},
85
86 {91, "Eff. 1 Depth"},
87 {92, "Eff. 2 Depth"},
88 {93, "Eff. 3 Depth"},
89 {94, "Eff. 4 Depth"},
90 {95, "Eff. 5 Depth"},
91 {96, "Data Inc"},
92 {97, "Data Dec"},
93 {98, "NRPN LSB"},
94 {99, "NRPN MSB"},
95 {100, "RPN LSB"},
96 {101, "RPN MSB"},
97
98 {120, "All Sounds Off"},
99 {121, "Controller Reset"},
100 {122, "Local Control"},
101 {123, "All Notes Off"},
102 {124, "Omni Off"},
103 {125, "Omni On"},
104 {126, "Mono On (Poly Off)"},
105 {127, "Poly On (Mono Off)"},
57 { 0, "Bank Select MSB"},
58 { 1, "Modulation MSB"},
59 { 2, "Breath Contoller"},
60
61 { 4, "Foot Controller MSB"},
62 { 5, "Portamento Time MSB"},
63 { 6, "Data Entry MSB"},
64 { 7, "Main Volume"},
65 { 8, "Balance"},
66
67 {10, "Pan"},
68 {11, "Expression"},
69 {12, "Effect Control 1"},
70 {13, "Effect Control 2"},
71
72 {32, "Bank Select LSB"},
73
74 {64, "Sustain"},
75 {65, "Portamento"},
76 {66, "Sostenuto"},
77 {67, "Soft Pedal"},
78 {68, "Legato Footswitch"},
79 {69, "Hold 2"},
80 {70, "Sound Contr. 1"}, // default: Sound Variation
81 {71, "Sound Contr. 2"}, // default: Timbre/Harmonic Content
82 {72, "Sound Contr. 3"}, // default: Release Time
83 {73, "Sound Contr. 4"}, // default: Attack Time
84 {74, "Sound Contr. 5"}, // default: Brightness
85 {75, "Sound Contr. 6"},
86 {76, "Sound Contr. 7"},
87 {77, "Sound Contr. 8"},
88 {78, "Sound Contr. 9"},
89 {79, "Sound Contr. 10"},
90
91 {84, "Portamento Control"},
92
93 {91, "Eff. 1 Depth"},
94 {92, "Eff. 2 Depth"},
95 {93, "Eff. 3 Depth"},
96 {94, "Eff. 4 Depth"},
97 {95, "Eff. 5 Depth"},
98 {96, "Data Inc"},
99 {97, "Data Dec"},
100 {98, "NRPN LSB"},
101 {99, "NRPN MSB"},
102 {100, "RPN LSB"},
103 {101, "RPN MSB"},
104
105 {120, "All Sounds Off"},
106 {121, "Controller Reset"},
107 {122, "Local Control"},
108 {123, "All Notes Off"},
109 {124, "Omni Off"},
110 {125, "Omni On"},
111 {126, "Mono On (Poly Off)"},
112 {127, "Poly On (Mono Off)"},
106113 };
107114
108 MidiStandardControllers::MidiStandardControllers()
109 {
110 for (unsigned int i = 0; i < sizeof(midi_std_itab)/sizeof(midi_std_itab[0]); i++) {
111 m.insert(pair<int, modstring>(midi_std_itab[i].ctrl, modstring(midi_std_itab[i].name)));
112 }
113 }
114
115 void MidiStandardControllers::replace(int ctr, string name)
116 {
117 map<int,modstring>::iterator i = m.find(ctr);
118 if (name.empty()) {
119 if (i != m.end()) {
120 if (i->second.modified) {
121 if (i->second.std) {
122 i->second.name = m[ctr].std;
123 m[ctr].modified = false;
124 } else {
125 m.erase(i);
126 }
127 }
128 }
129 } else {
130 if (i == m.end()) {
131 m[ctr] = modstring(name, true, 0);
132 } else {
133 i->second.modified = true;
134 i->second.name = name;
135 }
136 }
137 }
138
139 void MidiStandardControllers::writeJSON(gx_system::JsonWriter& jw) const
140 {
141 jw.begin_object(true);
142 for (map<int,modstring>::const_iterator i = m.begin(); i != m.end(); i++) {
143 if (i->second.modified) {
144 ostringstream ostr;
145 ostr << i->first;
146 jw.write_key(ostr.str());
147 jw.write(i->second.name, true);
148 }
149 }
150 jw.end_object(true);
151 }
152
153 void MidiStandardControllers::readJSON(gx_system::JsonParser& jp)
154 {
155 jp.next(gx_system::JsonParser::begin_object);
156 while (jp.peek() == gx_system::JsonParser::value_key) {
157 jp.next();
158 istringstream istr(jp.current_value());
159 int ctl;
160 istr >> ctl;
161 if (istr.fail()) {
162 throw gx_system::JsonException(_("midi standard controllers: number expected"));
163 }
164 jp.next();
165 replace(ctl, jp.current_value());
166 }
167 jp.next(gx_system::JsonParser::end_object);
168 }
169
170 void MidiController::writeJSON(gx_system::JsonWriter& jw) const
171 {
172 jw.begin_array();
173 jw.write(param.id());
174 if (param.getControlType() == Parameter::Continuous ||
175 param.getControlType() == Parameter::Enum) {
176 jw.write(_lower);
177 jw.write(_upper);
178 } else {
179 assert(param.getControlType() == Parameter::Switch);
180 }
181 jw.end_array();
182 }
183
184 MidiController *MidiController::readJSON(gx_system::JsonParser& jp)
185 {
186 jp.next(gx_system::JsonParser::begin_array);
187 jp.next(gx_system::JsonParser::value_string);
188 string id = jp.current_value();
189 if (!parameter_map.hasId(id)) {
190 gx_system::gx_print_warning(_("Midi controller settings"),
191 _("unknown parameter: ") + id);
192 while (jp.next() != gx_system::JsonParser::end_array);
193 return 0;
194 }
195 Parameter& param = parameter_map[id];
196 float lower = 0, upper = 0;
197 bool bad = false;
198 bool chg = false;
199 if (param.getControlType() == Parameter::Continuous ||
200 param.getControlType() == Parameter::Enum) {
201 if (jp.peek() != gx_system::JsonParser::end_array) {
202 float pmin, pmax;
203 if (param.hasRange()) {
204 pmin = param.getLowerAsFloat();
205 pmax = param.getUpperAsFloat();
206 } else {
207 bad = true;
208 pmin = pmax = 0;
209 }
210 jp.next(gx_system::JsonParser::value_number);
211 lower = jp.current_value_float();
212 jp.next(gx_system::JsonParser::value_number);
213 upper = jp.current_value_float();
214 if (lower > pmax) {
215 lower = pmax;
216 chg = true;
217 } else if (lower < pmin) {
218 lower = pmin;
219 chg = true;
220 }
221 if (upper > pmax) {
222 upper = pmax;
223 chg = true;
224 } else if (upper < pmin) {
225 upper = pmin;
226 chg = true;
227 }
228 } else {
229 bad = true;
230 }
231 } else {
232 if (param.getControlType() != Parameter::Switch) {
233 bad = true;
234 }
235 }
236 while (jp.next() != gx_system::JsonParser::end_array); // be tolerant
237 if (bad) {
238 gx_system::gx_print_warning(
239 _("recall MIDI state"),
240 _("invalid format, Parameter skipped: ") + id);
241 return 0;
242 }
243 if (chg) {
244 gx_system::gx_print_warning(
245 _("recall MIDI state"),
246 _("Parameter range outside bounds, changed: ") + id);
247 }
248 return new MidiController(param, lower, upper);
249 }
250
251 MidiControllerList::MidiControllerList():
252 map(controller_array_size),
253 midi_config_mode(false),
254 last_midi_control(-1)
255 {
256 }
257
258 void MidiControllerList::set_config_mode(bool mode, int ctl)
259 {
260 assert(mode != midi_config_mode);
261 if (mode)
262 last_midi_control = ctl;
263 midi_config_mode = mode;
264 }
265
266 int MidiControllerList::param2controller(Parameter& param, const MidiController** p)
267 {
268 for (controller_array::size_type n = 0; n < map.size(); n++) {
269 const midi_controller_list& cl = map[n];
270 for (midi_controller_list::const_iterator i = cl.begin(); i != cl.end(); i++) {
271 if (i->hasParameter(param)) {
272 if (p) {
273 *p = &(*i);
274 }
275 return n;
276 }
277 }
278 }
279 return -1;
280 }
281
282 void MidiControllerList::deleteParameter(Parameter& p, bool quiet)
283 {
284 bool mode = get_config_mode();
285 if (!mode) {
286 set_config_mode(true); // keep rt thread away from table
287 }
288 bool found = false;
289 for (controller_array::iterator pctr = map.begin(); pctr != map.end(); pctr++) {
290 for (midi_controller_list::iterator i = pctr->begin(); i != pctr->end(); i++) {
291 if (i->hasParameter(p)) {
292 pctr->erase(i);
293 found = true;
294 break;
295 }
296 }
297 }
298 if (found && !quiet) {
299 changed();
300 }
301 if (!mode) {
302 set_config_mode(false);
303 }
115 MidiStandardControllers::MidiStandardControllers() {
116 for (unsigned int i = 0; i < sizeof(midi_std_itab)/sizeof(midi_std_itab[0]); i++) {
117 m.insert(pair<int, modstring>(midi_std_itab[i].ctrl, modstring(midi_std_itab[i].name)));
118 }
119 }
120
121 void MidiStandardControllers::replace(int ctr, string name) {
122 map<int, modstring>::iterator i = m.find(ctr);
123 if (name.empty()) {
124 if (i != m.end()) {
125 if (i->second.modified) {
126 if (i->second.std) {
127 i->second.name = m[ctr].std;
128 m[ctr].modified = false;
129 } else {
130 m.erase(i);
131 }
132 }
133 }
134 } else {
135 if (i == m.end()) {
136 m[ctr] = modstring(name, true, 0);
137 } else {
138 i->second.modified = true;
139 i->second.name = name;
140 }
141 }
142 }
143
144 void MidiStandardControllers::writeJSON(gx_system::JsonWriter& jw) const {
145 jw.begin_object(true);
146 for (map<int, modstring>::const_iterator i = m.begin(); i != m.end(); i++) {
147 if (i->second.modified) {
148 ostringstream ostr;
149 ostr << i->first;
150 jw.write_key(ostr.str());
151 jw.write(i->second.name, true);
152 }
153 }
154 jw.end_object(true);
155 }
156
157 void MidiStandardControllers::readJSON(gx_system::JsonParser& jp) {
158 jp.next(gx_system::JsonParser::begin_object);
159 while (jp.peek() == gx_system::JsonParser::value_key) {
160 jp.next();
161 istringstream istr(jp.current_value());
162 int ctl;
163 istr >> ctl;
164 if (istr.fail()) {
165 throw gx_system::JsonException(_("midi standard controllers: number expected"));
166 }
167 jp.next();
168 replace(ctl, jp.current_value());
169 }
170 jp.next(gx_system::JsonParser::end_object);
171 }
172
173 void MidiController::writeJSON(gx_system::JsonWriter& jw) const {
174 jw.begin_array();
175 jw.write(param.id());
176 if (param.getControlType() == Parameter::Continuous ||
177 param.getControlType() == Parameter::Enum) {
178 jw.write(_lower);
179 jw.write(_upper);
180 } else {
181 assert(param.getControlType() == Parameter::Switch);
182 }
183 jw.end_array();
184 }
185
186 MidiController *MidiController::readJSON(gx_system::JsonParser& jp) {
187 jp.next(gx_system::JsonParser::begin_array);
188 jp.next(gx_system::JsonParser::value_string);
189 string id = jp.current_value();
190 if (!parameter_map.hasId(id)) {
191 gx_system::gx_print_warning(_("Midi controller settings"),
192 _("unknown parameter: ") + id);
193 while (jp.next() != gx_system::JsonParser::end_array);
194 return 0;
195 }
196 Parameter& param = parameter_map[id];
197 float lower = 0, upper = 0;
198 bool bad = false;
199 bool chg = false;
200 if (param.getControlType() == Parameter::Continuous ||
201 param.getControlType() == Parameter::Enum) {
202 if (jp.peek() != gx_system::JsonParser::end_array) {
203 float pmin, pmax;
204 if (param.hasRange()) {
205 pmin = param.getLowerAsFloat();
206 pmax = param.getUpperAsFloat();
207 } else {
208 bad = true;
209 pmin = pmax = 0;
210 }
211 jp.next(gx_system::JsonParser::value_number);
212 lower = jp.current_value_float();
213 jp.next(gx_system::JsonParser::value_number);
214 upper = jp.current_value_float();
215 if (lower > pmax) {
216 lower = pmax;
217 chg = true;
218 } else if (lower < pmin) {
219 lower = pmin;
220 chg = true;
221 }
222 if (upper > pmax) {
223 upper = pmax;
224 chg = true;
225 } else if (upper < pmin) {
226 upper = pmin;
227 chg = true;
228 }
229 } else {
230 bad = true;
231 }
232 } else {
233 if (param.getControlType() != Parameter::Switch) {
234 bad = true;
235 }
236 }
237 while (jp.next() != gx_system::JsonParser::end_array); // be tolerant
238 if (bad) {
239 gx_system::gx_print_warning(
240 _("recall MIDI state"),
241 _("invalid format, Parameter skipped: ") + id);
242 return 0;
243 }
244 if (chg) {
245 gx_system::gx_print_warning(
246 _("recall MIDI state"),
247 _("Parameter range outside bounds, changed: ") + id);
248 }
249 return new MidiController(param, lower, upper);
250 }
251
252 MidiControllerList::MidiControllerList()
253 : map(controller_array_size),
254 midi_config_mode(false),
255 last_midi_control(-1) {}
256
257 void MidiControllerList::set_config_mode(bool mode, int ctl) {
258 assert(mode != midi_config_mode);
259 if (mode)
260 last_midi_control = ctl;
261 midi_config_mode = mode;
262 }
263
264 int MidiControllerList::param2controller(Parameter& param, const MidiController** p) {
265 for (controller_array::size_type n = 0; n < map.size(); n++) {
266 const midi_controller_list& cl = map[n];
267 for (midi_controller_list::const_iterator i = cl.begin(); i != cl.end(); i++) {
268 if (i->hasParameter(param)) {
269 if (p) {
270 *p = &(*i);
271 }
272 return n;
273 }
274 }
275 }
276 return -1;
277 }
278
279 void MidiControllerList::deleteParameter(Parameter& p, bool quiet) {
280 bool mode = get_config_mode();
281 if (!mode) {
282 set_config_mode(true); // keep rt thread away from table
283 }
284 bool found = false;
285 for (controller_array::iterator pctr = map.begin(); pctr != map.end(); pctr++) {
286 for (midi_controller_list::iterator i = pctr->begin(); i != pctr->end(); i++) {
287 if (i->hasParameter(p)) {
288 pctr->erase(i);
289 found = true;
290 break;
291 }
292 }
293 }
294 if (found && !quiet) {
295 changed();
296 }
297 if (!mode) {
298 set_config_mode(false);
299 }
304300 }
305301
306302 void MidiControllerList::modifyCurrent(Parameter &param,
307 float lower, float upper)
308 {
309 assert(midi_config_mode == true); // keep rt thread away from table
310 // maximal one controller for a zone allowed
311 deleteParameter(param);
312 if (last_midi_control == -1)
313 return;
314 // add zone to controller
315 map[last_midi_control].push_front(MidiController(param, lower, upper));
316 changed();
317 }
318
319 void MidiControllerList::set(int ctr, int val)
320 {
321 if (midi_config_mode)
322 {
323 last_midi_control = ctr;
324 last_midi_control_value = val;
325 }
326 else {
327 midi_controller_list& ctr_list = map[ctr];
328 for (midi_controller_list::iterator i = ctr_list.begin(); i != ctr_list.end(); i++)
329 i->set(val);
330 }
331 }
332
333 void MidiControllerList::writeJSON(gx_system::JsonWriter& w)
334 {
335 w.begin_array(true);
336 for (unsigned int n = 0; n < map.size(); n++)
337 {
338 const midi_controller_list& cl = map[n];
339 if (cl.empty())
340 continue;
341 w.write(n);
342 w.begin_array();
343 for (midi_controller_list::const_iterator i = cl.begin(); i != cl.end(); i++)
344 i->writeJSON(w);
345 w.end_array(true);
346 }
347 w.newline();
348 w.end_array(true);
349 }
350
351 void MidiControllerList::readJSON(gx_system::JsonParser& jp, controller_array& m)
352 {
353 jp.next(gx_system::JsonParser::begin_array);
354 while (jp.peek() != gx_system::JsonParser::end_array) {
355 jp.next(gx_system::JsonParser::value_number);
356 midi_controller_list& l = m[jp.current_value_int()];
357 jp.next(gx_system::JsonParser::begin_array);
358 while (jp.peek() != gx_system::JsonParser::end_array) {
359 MidiController *p = MidiController::readJSON(jp);
360 if (p) {
361 l.push_front(*p);
362 }
363 }
364 jp.next(gx_system::JsonParser::end_array);
365 }
366 jp.next(gx_system::JsonParser::end_array);
367 }
368
369 void MidiControllerList::set_controller_array(const controller_array& m)
370 {
371 bool mode = get_config_mode();
372 if (!mode) {
373 set_config_mode(true); // keep rt thread away from table
374 }
375 map = m;
376 if (!mode) {
377 set_config_mode(false);
378 }
379 changed();
380 }
381
382 void MidiControllerList::remove_controlled_parameters(paramlist& plist, const controller_array *new_m)
383 {
384 std::set<Parameter*> pset;
385 for (unsigned int i = 0; i < map.size(); i++) {
386 midi_controller_list& ctr = map[i];
387 for (midi_controller_list::iterator j = ctr.begin(); j != ctr.end(); j++) {
388 if (new_m) {
389 const midi_controller_list& ctr_new = (*new_m)[i];
390 for (midi_controller_list::const_iterator jn = ctr_new.begin(); jn != ctr_new.end(); jn++) {
391 if (j->getParameter() == jn->getParameter()) {
392 pset.insert(&j->getParameter());
393 break;
394 }
395 }
396 } else {
397 pset.insert(&j->getParameter());
398 }
399 }
400 }
401 for (paramlist::iterator n = plist.begin(); n != plist.end(); ) {
402 paramlist::iterator n1 = n++;
403 if (pset.find(*n1) != pset.end()) {
404 plist.erase(n1);
405 }
406 }
303 float lower, float upper) {
304 assert(midi_config_mode == true); // keep rt thread away from table
305 // maximal one controller for a zone allowed
306 deleteParameter(param);
307 if (last_midi_control == -1)
308 return;
309 // add zone to controller
310 map[last_midi_control].push_front(MidiController(param, lower, upper));
311 changed();
312 }
313
314 void MidiControllerList::set(int ctr, int val) {
315 if (midi_config_mode) {
316 last_midi_control = ctr;
317 last_midi_control_value = val;
318 } else {
319 midi_controller_list& ctr_list = map[ctr];
320 for (midi_controller_list::iterator i = ctr_list.begin(); i != ctr_list.end(); i++)
321 i->set(val);
322 }
323 }
324
325 void MidiControllerList::writeJSON(gx_system::JsonWriter& w) {
326 w.begin_array(true);
327 for (unsigned int n = 0; n < map.size(); n++) {
328 const midi_controller_list& cl = map[n];
329 if (cl.empty())
330 continue;
331 w.write(n);
332 w.begin_array();
333 for (midi_controller_list::const_iterator i = cl.begin(); i != cl.end(); i++)
334 i->writeJSON(w);
335 w.end_array(true);
336 }
337 w.newline();
338 w.end_array(true);
339 }
340
341 void MidiControllerList::readJSON(gx_system::JsonParser& jp, controller_array& m) {
342 jp.next(gx_system::JsonParser::begin_array);
343 while (jp.peek() != gx_system::JsonParser::end_array) {
344 jp.next(gx_system::JsonParser::value_number);
345 midi_controller_list& l = m[jp.current_value_int()];
346 jp.next(gx_system::JsonParser::begin_array);
347 while (jp.peek() != gx_system::JsonParser::end_array) {
348 MidiController *p = MidiController::readJSON(jp);
349 if (p) {
350 l.push_front(*p);
351 }
352 }
353 jp.next(gx_system::JsonParser::end_array);
354 }
355 jp.next(gx_system::JsonParser::end_array);
356 }
357
358 void MidiControllerList::set_controller_array(const controller_array& m) {
359 bool mode = get_config_mode();
360 if (!mode) {
361 set_config_mode(true); // keep rt thread away from table
362 }
363 map = m;
364 if (!mode) {
365 set_config_mode(false);
366 }
367 changed();
368 }
369
370 void MidiControllerList::remove_controlled_parameters(paramlist& plist,
371 const controller_array *new_m) {
372 std::set<Parameter*> pset;
373 for (unsigned int i = 0; i < map.size(); i++) {
374 midi_controller_list& ctr = map[i];
375 for (midi_controller_list::iterator j = ctr.begin(); j != ctr.end(); j++) {
376 if (new_m) {
377 const midi_controller_list& ctr_new = (*new_m)[i];
378 for (midi_controller_list::const_iterator jn = ctr_new.begin();
379 jn != ctr_new.end(); jn++) {
380 if (j->getParameter() == jn->getParameter()) {
381 pset.insert(&j->getParameter());
382 break;
383 }
384 }
385 } else {
386 pset.insert(&j->getParameter());
387 }
388 }
389 }
390 for (paramlist::iterator n = plist.begin(); n != plist.end(); ) {
391 paramlist::iterator n1 = n++;
392 if (pset.find(*n1) != pset.end()) {
393 plist.erase(n1);
394 }
395 }
407396 }
408397
409398 /****************************************************************
410399 ** Parameter Groups
411400 */
412401
413 class ParameterGroups
414 {
415 private:
416 map<string,string> groups;
402 class ParameterGroups {
403 private:
404 map<string, string> groups;
417405
418406 #ifndef NDEBUG
419 map<string,bool> used;
420
421 void group_exists(string id)
422 {
423 if (groups.find(id) == groups.end()) {
424 gx_system::gx_print_error("Debug Check", "Group does not exist: " + id);
425 } else {
426 used[id] = true;
427 }
428 }
429 void group_is_new(string id)
430 {
431 if (groups.find(id) != groups.end()) {
432 gx_system::gx_print_error("Debug Check", "Group already exists: " + id);
433 }
434 }
435
436 ~ParameterGroups()
437 {
438 for (map<string,bool>::iterator i = used.begin(); i != used.end(); i++) {
439 if (!i->second) {
440 gx_system::gx_print_error("Debug Check", "Group not used: " + i->first);
441 }
442 }
443 }
444 friend string param_group(string id, bool nowarn);
407 map<string, bool> used;
408
409 void group_exists(string id) {
410 if (groups.find(id) == groups.end()) {
411 gx_system::gx_print_error("Debug Check", "Group does not exist: " + id);
412 } else {
413 used[id] = true;
414 }
415 }
416 void group_is_new(string id) {
417 if (groups.find(id) != groups.end()) {
418 gx_system::gx_print_error("Debug Check", "Group already exists: " + id);
419 }
420 }
421
422 ~ParameterGroups() {
423 for (map<string, bool>::iterator i = used.begin(); i != used.end(); i++) {
424 if (!i->second) {
425 gx_system::gx_print_error("Debug Check", "Group not used: " + i->first);
426 }
427 }
428 }
429 friend string param_group(string id, bool nowarn);
445430 #endif
446431
447 public:
448 ParameterGroups();
449
450 inline string get(string id) { return groups[id]; }
451 inline string operator[](string id)
452 {
453 debug_check(group_exists, id); return groups[id];
454 }
455 inline void insert(string id, string group)
456 {
457 debug_check(group_is_new, id);
458 groups.insert(pair<string,string>(id, group));
459 }
432 public:
433 ParameterGroups();
434
435 inline string get(string id) { return groups[id]; }
436 inline string operator[](string id) {
437 debug_check(group_exists, id);
438 return groups[id];
439 }
440 inline void insert(string id, string group) {
441 debug_check(group_is_new, id);
442 groups.insert(pair<string, string>(id, group));
443 }
460444 };
461445
462 ParameterGroups::ParameterGroups()
463 {
464 insert("jconv",N_("Convolver"));
465 insert("eq", N_("EQ"));
466 insert("eqs", N_("Scaleable EQ"));
467
468 insert("amp",N_("Amplifier"));
469 insert("amp2",N_("Amplifier2"));
470 insert("amp2.preamp",N_("Preamp"));
471 insert("amp2.stage1",N_("Tube1"));
472 insert("amp2.stage2",N_("Tube2"));
473 insert("stage3",N_("Amplifier2"));
474 insert("stage3.gain3",N_("Tube3"));
475 insert("shaper",N_("Shaper"));
476 insert("noise_gate",N_("Noise Gate"));
477 insert("amp.bass_boost",N_("Bass Boost"));
478 insert("convolve",N_("Amp Model"));
479 insert("drive",N_("Drive"));
480 insert("tube",N_("Tube 1"));
481 insert("amp.tonestack",N_("Tonestack"));
482 insert("compressor",N_("Compressor"));
483 insert("overdrive",N_("Overdrive"));
484 insert("gxdistortion",N_("Multi Band Distortion"));
485 insert("gx_distortion",N_("Multi Band Distortion"));
486 insert("low_high_pass.lhp",N_("low_highpass"));
487 insert("low_high_pass.lhc",N_("low_highcutoff"));
488 insert("low_highpass",N_("low high pass"));
489 insert("gx_distortion.resonator",N_("Distortion resonator"));
490 insert("freeverb",N_("Freeverb"));
491 insert("IR",N_("ImpulseResponse"));
492 insert("crybaby",N_("Crybaby"));
493 insert("echo",N_("Echo"));
494 insert("delay",N_("Delay"));
495 insert("stereodelay",N_("Stereo Delay"));
496 insert("stereoecho",N_("Stereo Echo"));
497 insert("chorus",N_("Chorus"));
498 insert("MultiBandFilter",N_("Multiband Filter"));
499 insert("moog",N_("Moog Filter"));
500 insert("biquad",N_("BiQuad Filter"));
501 insert("flanger",N_("Flanger"));
502 insert("cab",N_("Cabinet"));
503 insert("phaser",N_("Phaser"));
504 insert("midi_out",N_("Midi Out"));
505 insert("midi_out.channel_1",N_("Midi Out 1"));
506 insert("midi_out.channel_2",N_("Midi Out 2"));
507 insert("midi_out.channel_3",N_("Midi Out 3"));
508 insert("beat_detector",N_("Beat Detector"));
509 insert("ui",N_("User Interface"));
510 insert("system", N_("System"));
511 insert("oscilloscope", N_("Oscilloscope"));
512 insert("ampmodul", N_("Postamp"));
513 insert("ampmodul.amp2.stage1", N_("Postamp Tube1"));
514 insert("ampmodul.amp2.stage2", N_("Postamp Tube2"));
515 insert("amp.clip", N_("clipper"));
516 insert("tonemodul", N_("3 Band EQ"));
517 insert("tremolo", N_("Tremolo"));
518 insert("phaser_mono", N_("Phaser Mono"));
519 insert("chorus_mono", N_("Chorus Mono"));
520 insert("flanger_mono", N_("Flanger Mono"));
521 insert("con", N_("Contrast convolver"));
522 insert("feedback", N_("Feedback"));
523
524 }
525
526 string param_group(string id, bool nowarn)
527 {
528 static ParameterGroups groups = ParameterGroups();
529 const string& group_id = id.substr(0, id.find_last_of("."));
530 if (nowarn) {
531 return groups.get(group_id);
532 } else {
533 return groups[group_id];
534 }
446 ParameterGroups::ParameterGroups() {
447 insert("jconv", N_("Convolver"));
448 insert("eq", N_("EQ"));
449 insert("eqs", N_("Scaleable EQ"));
450
451 insert("amp", N_("Amplifier"));
452 insert("amp2", N_("Amplifier2"));
453 insert("amp2.preamp", N_("Preamp"));
454 insert("amp2.stage1", N_("Tube1"));
455 insert("amp2.stage2", N_("Tube2"));
456 insert("stage3", N_("Amplifier2"));
457 insert("stage3.gain3", N_("Tube3"));
458 insert("shaper", N_("Shaper"));
459 insert("noise_gate", N_("Noise Gate"));
460 insert("amp.bass_boost", N_("Bass Boost"));
461 insert("convolve", N_("Amp Model"));
462 insert("drive", N_("Drive"));
463 insert("tube", N_("Tube 1"));
464 insert("amp.tonestack", N_("Tonestack"));
465 insert("compressor", N_("Compressor"));
466 insert("overdrive", N_("Overdrive"));
467 insert("gxdistortion", N_("Multi Band Distortion"));
468 insert("gx_distortion", N_("Multi Band Distortion"));
469 insert("low_high_pass.lhp", N_("low_highpass"));
470 insert("low_high_pass.lhc", N_("low_highcutoff"));
471 insert("low_highpass", N_("low high pass"));
472 insert("gx_distortion.resonator", N_("Distortion resonator"));
473 insert("freeverb", N_("Freeverb"));
474 insert("IR", N_("ImpulseResponse"));
475 insert("crybaby", N_("Crybaby"));
476 insert("echo", N_("Echo"));
477 insert("delay", N_("Delay"));
478 insert("stereodelay", N_("Stereo Delay"));
479 insert("stereoecho", N_("Stereo Echo"));
480 insert("chorus", N_("Chorus"));
481 insert("MultiBandFilter", N_("Multiband Filter"));
482 insert("moog", N_("Moog Filter"));
483 insert("biquad", N_("BiQuad Filter"));
484 insert("flanger", N_("Flanger"));
485 insert("cab", N_("Cabinet"));
486 insert("phaser", N_("Phaser"));
487 insert("midi_out", N_("Midi Out"));
488 insert("midi_out.channel_1", N_("Midi Out 1"));
489 insert("midi_out.channel_2", N_("Midi Out 2"));
490 insert("midi_out.channel_3", N_("Midi Out 3"));
491 insert("beat_detector", N_("Beat Detector"));
492 insert("ui", N_("User Interface"));
493 insert("system", N_("System"));
494 insert("oscilloscope", N_("Oscilloscope"));
495 insert("ampmodul", N_("Postamp"));
496 insert("ampmodul.amp2.stage1", N_("Postamp Tube1"));
497 insert("ampmodul.amp2.stage2", N_("Postamp Tube2"));
498 insert("amp.clip", N_("clipper"));
499 insert("tonemodul", N_("3 Band EQ"));
500 insert("tremolo", N_("Tremolo"));
501 insert("phaser_mono", N_("Phaser Mono"));
502 insert("chorus_mono", N_("Chorus Mono"));
503 insert("flanger_mono", N_("Flanger Mono"));
504 insert("con", N_("Contrast convolver"));
505 insert("feedback", N_("Feedback"));
506 }
507
508 string param_group(string id, bool nowarn) {
509 static ParameterGroups groups = ParameterGroups();
510 const string& group_id = id.substr(0, id.find_last_of("."));
511 if (nowarn) {
512 return groups.get(group_id);
513 } else {
514 return groups[group_id];
515 }
535516 }
536517
537518 /****************************************************************
538519 ** Parameter
539520 */
540521
541 Parameter::~Parameter()
542 {
543 }
544
545 static int get_upper(const char **vn)
546 {
547 for (int n = 0; ; n++) {
548 if (!vn[n]) {
549 return n - 1;
550 }
551 }
552 }
553
554 bool Parameter::hasRange() const
555 {
556 return false;
557 }
558
559 float Parameter::getStepAsFloat() const
560 {
561 return 1;
562 }
563
564 float Parameter::getLowerAsFloat() const
565 {
566 return 0;
567 }
568
569 float Parameter::getUpperAsFloat() const
570 {
571 return 0;
572 }
573
574 const char **Parameter::getValueNames() const
575 {
576 return 0;
522 Parameter::~Parameter() {
523 }
524
525 static int get_upper(const char **vn) {
526 for (int n = 0; ; n++) {
527 if (!vn[n]) {
528 return n - 1;
529 }
530 }
531 }
532
533 bool Parameter::hasRange() const {
534 return false;
535 }
536
537 float Parameter::getStepAsFloat() const {
538 return 1;
539 }
540
541 float Parameter::getLowerAsFloat() const {
542 return 0;
543 }
544
545 float Parameter::getUpperAsFloat() const {
546 return 0;
547 }
548
549 const char **Parameter::getValueNames() const {
550 return 0;
577551 }
578552
579553
580554 /* FloatParameter */
581555
582 void *FloatParameter::zone()
583 {
584 return &value;
585 }
586
587 void FloatParameter::set(int n, int high, float llimit, float ulimit)
588 {
589 switch (c_type) {
590 case Continuous:
591 assert(n >= 0 && n <= high);
592 value = llimit + ((float)(n) / (high)) * (ulimit - llimit);
593 break;
594 case Switch:
595 value = (2*n > high ? 1.0 : 0.0);
596 break;
597 case Enum:
598 value = lower + min((float)n, upper-lower);
599 break;
600 default:
601 assert(false);
602 break;
603 }
604 }
605
606 void FloatParameter::set_std_value()
607 {
608 value = std_value;
609 }
610
611 void FloatParameter::writeJSON(gx_system::JsonWriter& jw)
612 {
613 jw.write_key(_id.c_str());
614 jw.write(value);
615 }
616
617 void FloatParameter::readJSON_value(gx_system::JsonParser& jp)
618 {
619 jp.next(gx_system::JsonParser::value_number);
620 json_value = jp.current_value_float();
621 }
622
623 void FloatParameter::setJSON_value()
624 {
625 set(json_value);
626 }
627
628 void FloatParameter::convert_from_range(float low, float up)
629 {
630 json_value = lower + (json_value - low) / (up - low) * (upper - lower);
631 }
632
633 bool FloatParameter::hasRange() const
634 {
635 return true;
636 }
637
638 float FloatParameter::getLowerAsFloat() const
639 {
640 return lower;
641 }
642
643 float FloatParameter::getUpperAsFloat() const
644 {
645 return upper;
646 }
647
648 float FloatParameter::getStepAsFloat() const
649 {
650 return step;
556 void *FloatParameter::zone() {
557 return &value;
558 }
559
560 void FloatParameter::set(int n, int high, float llimit, float ulimit) {
561 switch (c_type) {
562 case Continuous:
563 assert(n >= 0 && n <= high);
564 value = llimit + (static_cast<float>(n) / (high)) * (ulimit - llimit);
565 break;
566 case Switch:
567 value = (2*n > high ? 1.0 : 0.0);
568 break;
569 case Enum:
570 value = lower + min(static_cast<float>(n), upper-lower);
571 break;
572 default:
573 assert(false);
574 break;
575 }
576 }
577
578 void FloatParameter::set_std_value() {
579 value = std_value;
580 }
581
582 void FloatParameter::writeJSON(gx_system::JsonWriter& jw) {
583 jw.write_key(_id.c_str());
584 jw.write(value);
585 }
586
587 void FloatParameter::readJSON_value(gx_system::JsonParser& jp) {
588 jp.next(gx_system::JsonParser::value_number);
589 json_value = jp.current_value_float();
590 }
591
592 void FloatParameter::setJSON_value() {
593 set(json_value);
594 }
595
596 void FloatParameter::convert_from_range(float low, float up) {
597 json_value = lower + (json_value - low) / (up - low) * (upper - lower);
598 }
599
600 bool FloatParameter::hasRange() const {
601 return true;
602 }
603
604 float FloatParameter::getLowerAsFloat() const {
605 return lower;
606 }
607
608 float FloatParameter::getUpperAsFloat() const {
609 return upper;
610 }
611
612 float FloatParameter::getStepAsFloat() const {
613 return step;
651614 }
652615
653616
655618
656619 FloatEnumParameter::FloatEnumParameter(string id, string name, const char** vn, bool preset,
657620 float &v, int sv, bool ctrl, bool exp):
658 FloatParameter(id, name, Enum, preset, v, sv, 0, get_upper(vn), 1, ctrl, exp),
659 value_names(vn)
660 {
661 }
662
663 const char **FloatEnumParameter::getValueNames() const
664 {
665 return value_names;
666 }
667
668 void FloatEnumParameter::writeJSON(gx_system::JsonWriter& jw)
669 {
670 jw.write_key(_id.c_str());
671 jw.write(value_names[(int)round(value)]);
672 }
673
674 void FloatEnumParameter::readJSON_value(gx_system::JsonParser& jp)
675 {
676 gx_system::JsonParser::token tok = jp.next();
677 if (tok == gx_system::JsonParser::value_number) {
678 // old version compatability
679 json_value = jp.current_value_int();
680 return;
681 }
682 jp.check_expect(gx_system::JsonParser::value_string);
683 int up = int(round(upper));
684 int n = 0;
685 for (; n <= up; n++) {
686 if (jp.current_value() == value_names[n]) {
687 break;
688 }
689 }
690 if (n > up) {
691 gx_system::gx_print_warning(
692 _("read parameter"), (boost::format(_("parameter %1%: unknown enum value: %2%"))
693 % _id % jp.current_value()).str());
694 n = 0;
695 }
696 json_value = n;
621 FloatParameter(id, name, Enum, preset, v, sv, 0, get_upper(vn), 1, ctrl, exp),
622 value_names(vn) {}
623
624 const char **FloatEnumParameter::getValueNames() const {
625 return value_names;
626 }
627
628 void FloatEnumParameter::writeJSON(gx_system::JsonWriter& jw) {
629 jw.write_key(_id.c_str());
630 jw.write(value_names[static_cast<int>(round(value))]);
631 }
632
633 void FloatEnumParameter::readJSON_value(gx_system::JsonParser& jp) {
634 gx_system::JsonParser::token tok = jp.next();
635 if (tok == gx_system::JsonParser::value_number) {
636 // old version compatability
637 json_value = jp.current_value_int();
638 return;
639 }
640 jp.check_expect(gx_system::JsonParser::value_string);
641 int up = static_cast<int>(round(upper));
642 int n = 0;
643 for (; n <= up; n++) {
644 if (jp.current_value() == value_names[n]) {
645 break;
646 }
647 }
648 if (n > up) {
649 gx_system::gx_print_warning(
650 _("read parameter"), (boost::format(_("parameter %1%: unknown enum value: %2%"))
651 % _id % jp.current_value()).str());
652 n = 0;
653 }
654 json_value = n;
697655 }
698656
699657 /* IntParameter */
700658
701 void *IntParameter::zone()
702 {
703 return &value;
704 }
705
706 void IntParameter::set(int n, int high, float llimit, float ulimit)
707 {
708 switch (c_type) {
709 case Continuous:
710 assert(false); // not implemented
711 break;
712 case Switch:
713 value = (2*n > high ? 1065353216 : 0); // FIXME float/int problem
714 break;
715 case Enum:
716 assert(false); // not implemented
717 break;
718 default:
719 assert(false);
720 break;
721 }
722 }
723
724 void IntParameter::set_std_value()
725 {
726 value = std_value;
727 }
728
729 void IntParameter::writeJSON(gx_system::JsonWriter& jw)
730 {
731 jw.write_key(_id.c_str());
732 jw.write(value);
733 }
734
735 void IntParameter::readJSON_value(gx_system::JsonParser& jp)
736 {
737 jp.next(gx_system::JsonParser::value_number);
738 json_value = jp.current_value_int();
739 }
740
741 void IntParameter::setJSON_value()
742 {
743 set(json_value);
744 }
745
746 bool IntParameter::hasRange() const
747 {
748 return true;
749 }
750
751 float IntParameter::getLowerAsFloat() const
752 {
753 return lower;
754 }
755
756 float IntParameter::getUpperAsFloat() const
757 {
758 return upper;
759 }
760
659 void *IntParameter::zone() {
660 return &value;
661 }
662
663 void IntParameter::set(int n, int high, float llimit, float ulimit) {
664 switch (c_type) {
665 case Continuous:
666 assert(false); // not implemented
667 break;
668 case Switch:
669 value = (2*n > high ? 1065353216 : 0); // FIXME float/int problem
670 break;
671 case Enum:
672 assert(false); // not implemented
673 break;
674 default:
675 assert(false);
676 break;
677 }
678 }
679
680 void IntParameter::set_std_value() {
681 value = std_value;
682 }
683
684 void IntParameter::writeJSON(gx_system::JsonWriter& jw) {
685 jw.write_key(_id.c_str());
686 jw.write(value);
687 }
688
689 void IntParameter::readJSON_value(gx_system::JsonParser& jp) {
690 jp.next(gx_system::JsonParser::value_number);
691 json_value = jp.current_value_int();
692 }
693
694 void IntParameter::setJSON_value() {
695 set(json_value);
696 }
697
698 bool IntParameter::hasRange() const {
699 return true;
700 }
701
702 float IntParameter::getLowerAsFloat() const {
703 return lower;
704 }
705
706 float IntParameter::getUpperAsFloat() const {
707 return upper;
708 }
761709
762710 /* EnumParameter */
763711
764712 EnumParameter::EnumParameter(string id, string name, const char** vn, bool preset,
765713 int &v, int sv, bool ctrl, bool exp):
766 IntParameter(id, name, Enum, preset, v, sv, 0, get_upper(vn), ctrl, exp),
767 value_names(vn)
768 {
769 }
770
771 const char **EnumParameter::getValueNames() const
772 {
773 return value_names;
774 }
775
776 void EnumParameter::writeJSON(gx_system::JsonWriter& jw)
777 {
778 jw.write_key(_id.c_str());
779 jw.write(value_names[value]);
780 }
781
782 void EnumParameter::readJSON_value(gx_system::JsonParser& jp)
783 {
784 gx_system::JsonParser::token tok = jp.next();
785 if (tok == gx_system::JsonParser::value_number) {
786 // old version compatability
787 json_value = jp.current_value_int();
788 return;
789 }
790 jp.check_expect(gx_system::JsonParser::value_string);
791 int n = 0;
792 for (; n <= upper; n++) {
793 if (jp.current_value() == value_names[n]) {
794 break;
795 }
796 }
797 if (n > upper) {
798 gx_system::gx_print_warning(
799 _("read parameter"), (boost::format(_("parameter %1%: unknown enum value: %2%"))
800 % _id % jp.current_value()).str());
801 n = 0;
802 }
803 json_value = n;
714 IntParameter(id, name, Enum, preset, v, sv, 0, get_upper(vn), ctrl, exp),
715 value_names(vn) {}
716
717 const char **EnumParameter::getValueNames() const {
718 return value_names;
719 }
720
721 void EnumParameter::writeJSON(gx_system::JsonWriter& jw) {
722 jw.write_key(_id.c_str());
723 jw.write(value_names[value]);
724 }
725
726 void EnumParameter::readJSON_value(gx_system::JsonParser& jp) {
727 gx_system::JsonParser::token tok = jp.next();
728 if (tok == gx_system::JsonParser::value_number) {
729 // old version compatability
730 json_value = jp.current_value_int();
731 return;
732 }
733 jp.check_expect(gx_system::JsonParser::value_string);
734 int n = 0;
735 for (; n <= upper; n++) {
736 if (jp.current_value() == value_names[n]) {
737 break;
738 }
739 }
740 if (n > upper) {
741 gx_system::gx_print_warning(
742 _("read parameter"), (boost::format(_("parameter %1%: unknown enum value: %2%"))
743 % _id % jp.current_value()).str());
744 n = 0;
745 }
746 json_value = n;
747 }
748
749 /* unsigned IntParameter */
750
751 void *UIntParameter::zone() {
752 return &value;
753 }
754
755 void UIntParameter::set(int n, int high, float llimit, float ulimit) {
756 switch (c_type) {
757 case Continuous:
758 assert(false); // not implemented
759 break;
760 case Switch:
761 value = (2*n > high ? 65535 : 0); // FIXME float/int problem
762 break;
763 case Enum:
764 assert(false); // not implemented
765 break;
766 default:
767 assert(false);
768 break;
769 }
770 }
771
772 void UIntParameter::set_std_value() {
773 value = std_value;
774 }
775
776 void UIntParameter::writeJSON(gx_system::JsonWriter& jw) {
777 jw.write_key(_id.c_str());
778 jw.write(value);
779 }
780
781 void UIntParameter::readJSON_value(gx_system::JsonParser& jp) {
782 jp.next(gx_system::JsonParser::value_number);
783 json_value = jp.current_value_uint();
784 }
785
786 void UIntParameter::setJSON_value() {
787 set(json_value);
788 }
789
790 bool UIntParameter::hasRange() const {
791 return true;
792 }
793
794 float UIntParameter::getLowerAsFloat() const {
795 return lower;
796 }
797
798 float UIntParameter::getUpperAsFloat() const {
799 return upper;
800 }
801
802 /* UEnumParameter */
803
804 UEnumParameter::UEnumParameter(string id, string name, const char** vn, bool preset,
805 unsigned int &v, unsigned int sv, bool ctrl, bool exp):
806 UIntParameter(id, name, Enum, preset, v, sv, 0, get_upper(vn), ctrl, exp),
807 value_names(vn) {}
808
809 const char **UEnumParameter::getValueNames() const {
810 return value_names;
811 }
812
813 void UEnumParameter::writeJSON(gx_system::JsonWriter& jw) {
814 jw.write_key(_id.c_str());
815 jw.write(value_names[value]);
816 }
817
818 void UEnumParameter::readJSON_value(gx_system::JsonParser& jp) {
819 gx_system::JsonParser::token tok = jp.next();
820 if (tok == gx_system::JsonParser::value_number) {
821 // old version compatability
822 json_value = jp.current_value_uint();
823 return;
824 }
825 jp.check_expect(gx_system::JsonParser::value_string);
826 unsigned int n = 0;
827 for (; n <= upper; n++) {
828 if (jp.current_value() == value_names[n]) {
829 break;
830 }
831 }
832 if (n > upper) {
833 gx_system::gx_print_warning(
834 _("read parameter"), (boost::format(_("parameter %1%: unknown enum value: %2%"))
835 % _id % jp.current_value()).str());
836 n = 0;
837 }
838 json_value = n;
804839 }
805840
806841
807842 /* BoolParameter */
808843
809 void *BoolParameter::zone()
810 {
811 return &value;
812 }
813
814 void BoolParameter::set(int n, int high, float llimit, float ulimit)
815 {
816 switch (c_type) {
817 case Switch:
818 value = (2*n > high);
819 default:
820 assert(false);
821 break;
822 }
823 }
824
825 void BoolParameter::set_std_value()
826 {
827 value = std_value;
828 }
829
830 void BoolParameter::writeJSON(gx_system::JsonWriter& jw)
831 {
832 jw.write_key(_id.c_str());
833 jw.write(value);
834 }
835
836 void BoolParameter::readJSON_value(gx_system::JsonParser& jp)
837 {
838 jp.next(gx_system::JsonParser::value_number);
839 json_value = jp.current_value_int();
840 }
841
842 void BoolParameter::setJSON_value()
843 {
844 set(json_value);
844 void *BoolParameter::zone() {
845 return &value;
846 }
847
848 void BoolParameter::set(int n, int high, float llimit, float ulimit) {
849 switch (c_type) {
850 case Switch:
851 value = (2*n > high);
852 default:
853 assert(false);
854 break;
855 }
856 }
857
858 void BoolParameter::set_std_value() {
859 value = std_value;
860 }
861
862 void BoolParameter::writeJSON(gx_system::JsonWriter& jw) {
863 jw.write_key(_id.c_str());
864 jw.write(value);
865 }
866
867 void BoolParameter::readJSON_value(gx_system::JsonParser& jp) {
868 jp.next(gx_system::JsonParser::value_number);
869 json_value = jp.current_value_int();
870 }
871
872 void BoolParameter::setJSON_value() {
873 set(json_value);
845874 }
846875
847876
848877 /* SwitchParameter */
849878
850 void SwitchParameter::set(bool val)
851 {
852 if (val != value){
853 value = val;
854 changed(value);
855 }
856 }
857
858 void *SwitchParameter::zone()
859 {
860 return &value;
861 }
862
863 void SwitchParameter::set_std_value()
864 {
865 set(std_value);
866 }
867
868 void SwitchParameter::set(int n, int high, float llimit, float ulimit)
869 {
870 assert(false);
871 }
872
873 void SwitchParameter::writeJSON(gx_system::JsonWriter& jw)
874 {
875 jw.write_key(_id.c_str());
876 jw.write(value);
877 }
878
879 void SwitchParameter::readJSON_value(gx_system::JsonParser& jp)
880 {
881 jp.next(gx_system::JsonParser::value_number);
882 json_value = jp.current_value_int();
883 }
884
885 void SwitchParameter::setJSON_value()
886 {
887 set(json_value);
879 void SwitchParameter::set(bool val) {
880 if (val != value) {
881 value = val;
882 changed(value);
883 }
884 }
885
886 void *SwitchParameter::zone() {
887 return &value;
888 }
889
890 void SwitchParameter::set_std_value() {
891 set(std_value);
892 }
893
894 void SwitchParameter::set(int n, int high, float llimit, float ulimit) {
895 assert(false);
896 }
897
898 void SwitchParameter::writeJSON(gx_system::JsonWriter& jw) {
899 jw.write_key(_id.c_str());
900 jw.write(value);
901 }
902
903 void SwitchParameter::readJSON_value(gx_system::JsonParser& jp) {
904 jp.next(gx_system::JsonParser::value_number);
905 json_value = jp.current_value_int();
906 }
907
908 void SwitchParameter::setJSON_value() {
909 set(json_value);
888910 }
889911
890912
891913 /* FileParameter */
892914
893 void FileParameter::set_path(const string& path)
894 {
895 value = Gio::File::create_for_path(path);
896 }
897
898 void FileParameter::set(const Glib::RefPtr<Gio::File>& val)
899 {
900 value = val;
901 }
902
903 void FileParameter::set_standard(const string& filename)
904 {
905 std_value = Gio::File::create_for_path(filename);
906 if (!value) {
907 value = std_value->dup();
908 }
909 }
910
911 void FileParameter::set_std_value()
912 {
913 set(std_value->dup());
914 }
915
916 void *FileParameter::zone()
917 {
918 return &value;
919 }
920
921 void FileParameter::set(int n, int high, float llimit, float ulimit)
922 {
923 assert(false);
924 }
925
926 void FileParameter::writeJSON(gx_system::JsonWriter& jw)
927 {
928 jw.write_key(_id.c_str());
929 jw.write(get_path());
930 }
931
932 void FileParameter::readJSON_value(gx_system::JsonParser& jp)
933 {
934 jp.next(gx_system::JsonParser::value_string);
935 json_value = Gio::File::create_for_path(jp.current_value());
936 }
937
938 void FileParameter::setJSON_value()
939 {
940 set(json_value);
941 }
942
943 static string get_file_id(const Glib::RefPtr<Gio::File>& f)
944 {
945 return f->query_info(G_FILE_ATTRIBUTE_ID_FILE)->get_attribute_string(G_FILE_ATTRIBUTE_ID_FILE);
946 }
947
948 bool FileParameter::is_standard() const
949 {
950 string id;
951 try {
952 id = get_file_id(value);
953 } catch (Gio::Error ex) {
954 return false; // FIXME check type of exception
955 }
956 return id == get_file_id(std_value);
957 }
958
959 string FileParameter::get_path()
960 {
961 return value->get_path();
962 }
963
964 string FileParameter::get_directory_path()
965 {
966 return value->get_parent()->get_path();
967 }
968
969 string FileParameter::get_parse_name()
970 {
971 return value->get_parse_name();
972 }
973
974 string FileParameter::get_display_name()
975 {
976 return value->query_info(G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME)->get_display_name();
977 }
978
979 void FileParameter::copy(const string& destination)
980 {
981 value->copy(Gio::File::create_for_path(destination));
915 void FileParameter::set_path(const string& path) {
916 value = Gio::File::create_for_path(path);
917 }
918
919 void FileParameter::set(const Glib::RefPtr<Gio::File>& val) {
920 value = val;
921 }
922
923 void FileParameter::set_standard(const string& filename) {
924 std_value = Gio::File::create_for_path(filename);
925 if (!value) {
926 value = std_value->dup();
927 }
928 }
929
930 void FileParameter::set_std_value() {
931 set(std_value->dup());
932 }
933
934 void *FileParameter::zone() {
935 return &value;
936 }
937
938 void FileParameter::set(int n, int high, float llimit, float ulimit) {
939 assert(false);
940 }
941
942 void FileParameter::writeJSON(gx_system::JsonWriter& jw) {
943 jw.write_key(_id.c_str());
944 jw.write(get_path());
945 }
946
947 void FileParameter::readJSON_value(gx_system::JsonParser& jp) {
948 jp.next(gx_system::JsonParser::value_string);
949 json_value = Gio::File::create_for_path(jp.current_value());
950 }
951
952 void FileParameter::setJSON_value() {
953 set(json_value);
954 }
955
956 static string get_file_id(const Glib::RefPtr<Gio::File>& f) {
957 return f->query_info(G_FILE_ATTRIBUTE_ID_FILE)->get_attribute_string(G_FILE_ATTRIBUTE_ID_FILE);
958 }
959
960 bool FileParameter::is_standard() const {
961 string id;
962 try {
963 id = get_file_id(value);
964 } catch(Gio::Error ex) {
965 return false; // FIXME check type of exception
966 }
967 return id == get_file_id(std_value);
968 }
969
970 string FileParameter::get_path() {
971 return value->get_path();
972 }
973
974 string FileParameter::get_directory_path() {
975 return value->get_parent()->get_path();
976 }
977
978 string FileParameter::get_parse_name() {
979 return value->get_parse_name();
980 }
981
982 string FileParameter::get_display_name() {
983 return value->query_info(G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME)->get_display_name();
984 }
985
986 void FileParameter::copy(const string& destination) {
987 value->copy(Gio::File::create_for_path(destination));
982988 }
983989
984990 /****************************************************************
986992 */
987993
988994 #ifndef NDEBUG
989 void ParamMap::unique_zone(Parameter* param)
990 {
991 if (addr_map.find(param->zone()) != addr_map.end()) {
992 gx_system::gx_print_error("Debug Check", "zone registered twice (id: " + param->id() +")");
993 }
994 }
995
996 void ParamMap::unique_id(Parameter* param)
997 {
998 if (id_map.find(param->id()) != id_map.end()) {
999 gx_system::gx_print_error("Debug Check", "id registered twice: " + param->id());
1000 }
1001 }
1002
1003 void ParamMap::check_addr(const void *p)
1004 {
1005 if (!hasZone(p)) {
1006 cerr << "zone not found: " << p << endl;
1007 }
1008 }
1009 void ParamMap::check_id(string id)
1010 {
1011 if (!hasId(id)) {
1012 cerr << "string-id not found: " << id << endl;
1013 }
1014 }
1015
1016 void ParamMap::check_p(const char *p)
1017 {
1018 if (!hasId(p)) {
1019 cerr << "char-id not found: " << p << endl;
1020 }
995 void ParamMap::unique_zone(Parameter* param) {
996 if (addr_map.find(param->zone()) != addr_map.end()) {
997 gx_system::gx_print_error("Debug Check", "zone registered twice (id: " + param->id() +")");
998 }
999 }
1000
1001 void ParamMap::unique_id(Parameter* param) {
1002 if (id_map.find(param->id()) != id_map.end()) {
1003 gx_system::gx_print_error("Debug Check", "id registered twice: " + param->id());
1004 }
1005 }
1006
1007 void ParamMap::check_addr(const void *p) {
1008 if (!hasZone(p)) {
1009 cerr << "zone not found: " << p << endl;
1010 }
1011 }
1012 void ParamMap::check_id(string id) {
1013 if (!hasId(id)) {
1014 cerr << "string-id not found: " << id << endl;
1015 }
1016 }
1017
1018 void ParamMap::check_p(const char *p) {
1019 if (!hasId(p)) {
1020 cerr << "char-id not found: " << p << endl;
1021 }
10211022 }
10221023 #endif
10231024
1024 void ParamMap::insert(Parameter* param)
1025 {
1026 debug_check(unique_zone, param);
1027 addr_map.insert(pair<const void*, Parameter*>(param->zone(), param));
1028 debug_check(unique_id, param);
1029 id_map.insert(pair<string, Parameter*>(param->id(), param));
1030 }
1031
1032 void ParamMap::set_init_values()
1033 {
1034 for (iterator i = id_map.begin(); i != id_map.end(); i++) {
1035 i->second->set_std_value();
1036 }
1037 }
1038
1025 void ParamMap::insert(Parameter* param) {
1026 debug_check(unique_zone, param);
1027 addr_map.insert(pair<const void*, Parameter*>(param->zone(), param));
1028 debug_check(unique_id, param);
1029 id_map.insert(pair<string, Parameter*>(param->id(), param));
1030 }
1031
1032 void ParamMap::set_init_values() {
1033 for (iterator i = id_map.begin(); i != id_map.end(); i++) {
1034 i->second->set_std_value();
1035 }
1036 }
10391037 } // namespace gx_gui
1038
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * --------------------------------------------------------------------------
1718 */
1819
1920 /* ------- This is the guitarix tuner, part of gx_engine_audio.cpp ------- */
2021
21 #include <cstring>
22 #include <jack/jack.h>
23 #include "guitarix.h"
22 #include "guitarix.h" // NOLINT
23
24 #include <jack/jack.h> // NOLINT
25
26 #include <cstring> // NOLINT
27
2428
2529 /****************************************************************
2630 ** Pitch Tracker
3034 */
3135
3236 namespace gx_engine {
33
34 const int DOWNSAMPLE = 16; // downsampling factor
35 const int ZERO_PADDING_FACTOR = 64; // Number of times that the FFT is zero-padded to increase frequency resolution.
36 const float SIGNAL_THRESHOLD_ON = 0.001; // Value of the threshold above which the processing is activated.
37 const float SIGNAL_THRESHOLD_OFF = 0.0009; // Value of the threshold below which the input audio signal is deactivated.
38 const float TRACKER_PERIOD = 0.1; // Time between frequency estimates (in seconds)
39
40 void *PitchTracker::static_run(void *p)
41 {
42 ((PitchTracker *)p)->run();
43 return NULL;
44 }
45
46 PitchTracker::PitchTracker():
47 error(false),
48 busy(false),
49 tick(0),
50 m_pthr(0),
51 m_buffer(new float[MAX_FFT_SIZE]),
52 m_bufferIndex(0),
53 m_audioLevel(false),
54 m_fftwPlanFFT(0),
55 m_fftwPlanIFFT(0)
56 {
57 const int fftw_buffer_size = MAX_FFT_SIZE * ZERO_PADDING_FACTOR;
58 m_fftwBufferTime = (float*)fftwf_malloc(fftw_buffer_size * sizeof(float));
59 m_fftwBufferFreq = (fftwf_complex*)fftwf_malloc(fftw_buffer_size * sizeof(fftwf_complex));
60
61 memset(m_buffer, 0, MAX_FFT_SIZE * sizeof(float));
62 memset(m_fftwBufferTime, 0, fftw_buffer_size * sizeof(float));
63 memset(m_fftwBufferFreq, 0, fftw_buffer_size * sizeof(fftwf_complex));
37 // downsampling factor
38 const int DOWNSAMPLE = 16;
39 // Number of times that the FFT is zero-padded to increase frequency resolution.
40 const int ZERO_PADDING_FACTOR = 64;
41 // Value of the threshold above which the processing is activated.
42 const float SIGNAL_THRESHOLD_ON = 0.001;
43 // Value of the threshold below which the input audio signal is deactivated.
44 const float SIGNAL_THRESHOLD_OFF = 0.0009;
45 // Time between frequency estimates (in seconds)
46 const float TRACKER_PERIOD = 0.1;
47
48 void *PitchTracker::static_run(void *p) {
49 (reinterpret_cast<PitchTracker *>(p))->run();
50 return NULL;
51 }
52
53 PitchTracker::PitchTracker()
54 : error(false),
55 busy(false),
56 tick(0),
57 m_pthr(0),
58 m_buffer(new float[MAX_FFT_SIZE]),
59 m_bufferIndex(0),
60 m_audioLevel(false),
61 m_fftwPlanFFT(0),
62 m_fftwPlanIFFT(0) {
63 const int fftw_buffer_size = MAX_FFT_SIZE * ZERO_PADDING_FACTOR;
64 m_fftwBufferTime = reinterpret_cast<float*>
65 (fftwf_malloc(fftw_buffer_size * sizeof(float)));
66 m_fftwBufferFreq = reinterpret_cast<fftwf_complex*>
67 (fftwf_malloc(fftw_buffer_size * sizeof(fftwf_complex)));
68
69 memset(m_buffer, 0, MAX_FFT_SIZE * sizeof(float));
70 memset(m_fftwBufferTime, 0, fftw_buffer_size * sizeof(float));
71 memset(m_fftwBufferFreq, 0, fftw_buffer_size * sizeof(fftwf_complex));
6472
6573 sem_init(&m_trig, 0, 0);
6674
67 if (!m_buffer || !m_fftwBufferTime || !m_fftwBufferFreq) {
68 error = true;
69 }
70 }
71
72
73 PitchTracker::~PitchTracker()
74 {
75 fftwf_destroy_plan(m_fftwPlanFFT);
76 fftwf_destroy_plan(m_fftwPlanIFFT);
77 fftwf_free(m_fftwBufferTime);
78 fftwf_free(m_fftwBufferFreq);
79 delete[] m_buffer;
80 }
81
82
83 bool PitchTracker::setParameters(int sampleRate, int fftSize)
84 {
85 assert(fftSize <= MAX_FFT_SIZE);
86
87 if (error) {
88 return false;
89 }
90 m_sampleRate = sampleRate / DOWNSAMPLE;
91 resamp.setup(sampleRate, m_sampleRate, 1, 16); // 16 == least quality
92
93 if (m_fftSize != fftSize) {
94 m_fftSize = fftSize;
95 fftwf_destroy_plan(m_fftwPlanFFT);
96 fftwf_destroy_plan(m_fftwPlanIFFT);
97 m_fftwPlanFFT = fftwf_plan_dft_r2c_1d(
98 m_fftSize, m_fftwBufferTime, m_fftwBufferFreq, FFTW_ESTIMATE); // FFT
99 m_fftwPlanIFFT = fftwf_plan_dft_c2r_1d(
100 ZERO_PADDING_FACTOR * m_fftSize, m_fftwBufferFreq, m_fftwBufferTime, FFTW_ESTIMATE); // IFFT zero-padded
101 }
102
103 if (!m_fftwPlanFFT || !m_fftwPlanIFFT) {
104 error = true;
105 return false;
106 }
107
108 if (!m_pthr) {
109 start_thread();
110 }
111 pt_initialized = true;
112 return !error;
113 }
114
115 void PitchTracker::start_thread()
116 {
75 if (!m_buffer || !m_fftwBufferTime || !m_fftwBufferFreq) {
76 error = true;
77 }
78 }
79
80
81 PitchTracker::~PitchTracker() {
82 fftwf_destroy_plan(m_fftwPlanFFT);
83 fftwf_destroy_plan(m_fftwPlanIFFT);
84 fftwf_free(m_fftwBufferTime);
85 fftwf_free(m_fftwBufferFreq);
86 delete[] m_buffer;
87 }
88
89
90 bool PitchTracker::setParameters(int sampleRate, int fftSize) {
91 assert(fftSize <= MAX_FFT_SIZE);
92
93 if (error) {
94 return false;
95 }
96 m_sampleRate = sampleRate / DOWNSAMPLE;
97 resamp.setup(sampleRate, m_sampleRate, 1, 16); // 16 == least quality
98
99 if (m_fftSize != fftSize) {
100 m_fftSize = fftSize;
101 fftwf_destroy_plan(m_fftwPlanFFT);
102 fftwf_destroy_plan(m_fftwPlanIFFT);
103 m_fftwPlanFFT = fftwf_plan_dft_r2c_1d(
104 m_fftSize, m_fftwBufferTime, m_fftwBufferFreq, FFTW_ESTIMATE); // FFT
105 m_fftwPlanIFFT = fftwf_plan_dft_c2r_1d(
106 ZERO_PADDING_FACTOR * m_fftSize, m_fftwBufferFreq,
107 m_fftwBufferTime, FFTW_ESTIMATE); // IFFT zero-padded
108 }
109
110 if (!m_fftwPlanFFT || !m_fftwPlanIFFT) {
111 error = true;
112 return false;
113 }
114
115 if (!m_pthr) {
116 start_thread();
117 }
118 pt_initialized = true;
119 return !error;
120 }
121
122 void PitchTracker::start_thread() {
117123 int min, max;
118124 pthread_attr_t attr;
119125 struct sched_param spar;
120126 int priority, policy;
121 pthread_getschedparam(jack_client_thread_id(gx_jack::client), &policy, &spar);
127 pthread_getschedparam(jack_client_thread_id(gx_jack::gxjack.client), &policy, &spar);
122128 priority = spar.sched_priority;
123129 min = sched_get_priority_min(policy);
124130 max = sched_get_priority_max(policy);
126132 if (priority > max) priority = max;
127133 if (priority < min) priority = min;
128134 spar.sched_priority = priority;
129 pthread_attr_init (&attr);
130 pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
131 pthread_attr_setschedpolicy (&attr, policy);
132 pthread_attr_setschedparam (&attr, &spar);
133 pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM);
134 pthread_attr_setinheritsched (&attr, PTHREAD_EXPLICIT_SCHED);
135 //pthread_attr_setstacksize (&attr, 0x10000);
136 if (pthread_create (&m_pthr, &attr, static_run, (void*)this)) {
137 error = true;
138 }
139 pthread_attr_destroy (&attr);
140 }
141
142 int PitchTracker::find_minimum()
143 {
144 const int peakwidth = 3;
145 float *p = &m_fftwBufferTime[peakwidth];
146 for ( ; p < &m_fftwBufferTime[ZERO_PADDING_FACTOR * m_fftSize / 2 + 1 - peakwidth]; p++) {
147 int i;
148 for (i = -peakwidth; i <= peakwidth; i++) {
149 if (*p > p[i]) {
150 break;
151 }
152 }
153 if (i > peakwidth) {
154 break;
155 }
156 }
157 return (int)(p - m_fftwBufferTime);
158 }
159
160 int PitchTracker::find_maximum(int l)
161 {
162 float maxAutocorr = 0.0;
163 int maxAutocorrIndex = 0;
164 while ( l < ZERO_PADDING_FACTOR * m_fftSize / 2 + 1) {
165 if (m_fftwBufferTime[l] > maxAutocorr) {
166 maxAutocorr = m_fftwBufferTime[l];
167 maxAutocorrIndex = l;
168 }
169 ++l;
170 }
171 if (maxAutocorr == 0.0) {
172 return -1;
173 }
174 return maxAutocorrIndex;
175 }
176
177 float show_level(int n, float *buf)
178 {
179 float sum = 0.0;
180 for (int k = 0; k < n; ++k) {
181 sum += fabs(buf[k]);
182 }
183 return sum;
184 }
185
186 void PitchTracker::add(int count, float* input)
187 {
188 if (error) {
189 return;
190 }
191 resamp.inp_count = count;
192 resamp.inp_data = input;
193 for (;;) {
194 resamp.out_data = &m_buffer[m_bufferIndex];
195 int n = MAX_FFT_SIZE - m_bufferIndex;
196 resamp.out_count = n;
197 resamp.process();
198 n -= resamp.out_count; // n := number of output samples
199 if (!n) { // all soaked up by filter
200 return;
201 }
202 m_bufferIndex = (m_bufferIndex + n) % MAX_FFT_SIZE;
203 if (resamp.inp_count == 0) {
204 break;
205 }
206 }
207 if (++tick * count >= m_sampleRate * DOWNSAMPLE * TRACKER_PERIOD) {
208 if (busy) {
209 return;
210 }
211 tick = 0;
212 copy();
213 sem_post(&m_trig);
214 }
215 }
216
217 void PitchTracker::copy()
218 {
219 int start = (MAX_FFT_SIZE + m_bufferIndex - m_fftSize) % MAX_FFT_SIZE;
220 int end = (MAX_FFT_SIZE + m_bufferIndex) % MAX_FFT_SIZE;
221 int cnt = 0;
222 if (start >= end) {
223 cnt = MAX_FFT_SIZE - start;
224 memcpy(m_fftwBufferTime, &m_buffer[start], cnt * sizeof(float));
225 start = 0;
226 }
227 memcpy(&m_fftwBufferTime[cnt], &m_buffer[start], (end - start) * sizeof(float));
228 }
229
230 void PitchTracker::run()
231 {
232 for (;;) {
233 busy = false;
234 sem_wait(&m_trig);
235 busy = true;
236 if (error) {
237 continue;
238 }
239 float sum = 0.0;
240 for (int k = 0; k < m_fftSize; ++k) {
241 sum += fabs(m_fftwBufferTime[k]);
242 }
243 float threshold = (m_audioLevel ? SIGNAL_THRESHOLD_OFF : SIGNAL_THRESHOLD_ON);
244 m_audioLevel = (sum / m_fftSize >= threshold);
245 if ( m_audioLevel == false ) {
246 setEstimatedFrequency(0.0);
247 continue;
248 }
249
250 /* Compute the transform of the autocorrelation given in time domain by
251 * k=-N
252 * r[t] = sum( x[k] * x[t-k] )
253 * N
254 * or in the frequency domain (for a real signal) by
255 * R[f] = X[f] * X[f]' = |X[f]|^2 = Re(X[f])^2 + Im(X[f])^2
256 * When computing the FFT with fftwf_plan_dft_r2c_1d there are only N/2+1
257 * significant samples, so |.|^2 is computed for m_fftSize/2+1 samples only
258 */
259 int fftRSize = m_fftSize/2 + 1;
260 fftwf_execute(m_fftwPlanFFT);
261 for (int k = 0; k < fftRSize; ++k) {
262 fftwf_complex& v = m_fftwBufferFreq[k];
263 v[0] = v[0]*v[0] + v[1]*v[1];
264 v[1] = 0.0;
265 }
266
267 // pad the FFT with zeros to increase resolution in time domain after IFFT
268 int size_with_padding = ZERO_PADDING_FACTOR * m_fftSize - fftRSize;
269 memset(&m_fftwBufferFreq[fftRSize][0], 0, size_with_padding * sizeof(fftwf_complex));
270 fftwf_execute(m_fftwPlanIFFT);
271
272 // search for a minimum and then for the next maximum to get the estimated frequency
273 int maxAutocorrIndex = find_maximum(find_minimum());
274
275 // compute the frequency of the maximum considering the padding factor
276 if (maxAutocorrIndex >= 0) {
277 setEstimatedFrequency(ZERO_PADDING_FACTOR * m_sampleRate / (float)maxAutocorrIndex);
278 } else {
279 setEstimatedFrequency(0.0);
280 }
281 busy = false;
282 }
283 }
284
285 void PitchTracker::setEstimatedFrequency(float freq)
286 {
287 midi.fConsta4 = freq;
288 audio.fConsta1t = (freq == 0.0 ? 1000.0 : 12 * log2f(2.272727e-03f * freq));
135 pthread_attr_init(&attr);
136 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
137 pthread_attr_setschedpolicy(&attr, policy);
138 pthread_attr_setschedparam(&attr, &spar);
139 pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
140 pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
141 // pthread_attr_setstacksize(&attr, 0x10000);
142 if (pthread_create(&m_pthr, &attr, static_run, reinterpret_cast<void*>(this))) {
143 error = true;
144 }
145 pthread_attr_destroy(&attr);
146 }
147
148 int PitchTracker::find_minimum() {
149 const int peakwidth = 3;
150 float *p = &m_fftwBufferTime[peakwidth];
151 for ( ; p < &m_fftwBufferTime[ZERO_PADDING_FACTOR * m_fftSize / 2 + 1 - peakwidth]; p++) {
152 int i;
153 for (i = -peakwidth; i <= peakwidth; i++) {
154 if (*p > p[i]) {
155 break;
156 }
157 }
158 if (i > peakwidth) {
159 break;
160 }
161 }
162 return static_cast<int>((p - m_fftwBufferTime));
163 }
164
165 int PitchTracker::find_maximum(int l) {
166 float maxAutocorr = 0.0;
167 int maxAutocorrIndex = 0;
168 while (l < ZERO_PADDING_FACTOR * m_fftSize / 2 + 1) {
169 if (m_fftwBufferTime[l] > maxAutocorr) {
170 maxAutocorr = m_fftwBufferTime[l];
171 maxAutocorrIndex = l;
172 }
173 ++l;
174 }
175 if (maxAutocorr == 0.0) {
176 return -1;
177 }
178 return maxAutocorrIndex;
179 }
180
181 float show_level(int n, float *buf) {
182 float sum = 0.0;
183 for (int k = 0; k < n; ++k) {
184 sum += fabs(buf[k]);
185 }
186 return sum;
187 }
188
189 void PitchTracker::add(int count, float* input) {
190 if (error) {
191 return;
192 }
193 resamp.inp_count = count;
194 resamp.inp_data = input;
195 for (;;) {
196 resamp.out_data = &m_buffer[m_bufferIndex];
197 int n = MAX_FFT_SIZE - m_bufferIndex;
198 resamp.out_count = n;
199 resamp.process();
200 n -= resamp.out_count; // n := number of output samples
201 if (!n) { // all soaked up by filter
202 return;
203 }
204 m_bufferIndex = (m_bufferIndex + n) % MAX_FFT_SIZE;
205 if (resamp.inp_count == 0) {
206 break;
207 }
208 }
209 if (++tick * count >= m_sampleRate * DOWNSAMPLE * TRACKER_PERIOD) {
210 if (busy) {
211 return;
212 }
213 tick = 0;
214 copy();
215 sem_post(&m_trig);
216 }
217 }
218
219 void PitchTracker::copy() {
220 int start = (MAX_FFT_SIZE + m_bufferIndex - m_fftSize) % MAX_FFT_SIZE;
221 int end = (MAX_FFT_SIZE + m_bufferIndex) % MAX_FFT_SIZE;
222 int cnt = 0;
223 if (start >= end) {
224 cnt = MAX_FFT_SIZE - start;
225 memcpy(m_fftwBufferTime, &m_buffer[start], cnt * sizeof(float));
226 start = 0;
227 }
228 memcpy(&m_fftwBufferTime[cnt], &m_buffer[start], (end - start) * sizeof(float));
229 }
230
231 void PitchTracker::run() {
232 for (;;) {
233 busy = false;
234 sem_wait(&m_trig);
235 busy = true;
236 if (error) {
237 continue;
238 }
239 float sum = 0.0;
240 for (int k = 0; k < m_fftSize; ++k) {
241 sum += fabs(m_fftwBufferTime[k]);
242 }
243 float threshold = (m_audioLevel ? SIGNAL_THRESHOLD_OFF : SIGNAL_THRESHOLD_ON);
244 m_audioLevel = (sum / m_fftSize >= threshold);
245 if ( m_audioLevel == false ) {
246 setEstimatedFrequency(0.0);
247 continue;
248 }
249
250 /* Compute the transform of the autocorrelation given in time domain by
251 * k=-N
252 * r[t] = sum( x[k] * x[t-k] )
253 * N
254 * or in the frequency domain (for a real signal) by
255 * R[f] = X[f] * X[f]' = |X[f]|^2 = Re(X[f])^2 + Im(X[f])^2
256 * When computing the FFT with fftwf_plan_dft_r2c_1d there are only N/2+1
257 * significant samples, so |.|^2 is computed for m_fftSize/2+1 samples only
258 */
259 int fftRSize = m_fftSize/2 + 1;
260 fftwf_execute(m_fftwPlanFFT);
261 for (int k = 0; k < fftRSize; ++k) {
262 fftwf_complex& v = m_fftwBufferFreq[k];
263 v[0] = v[0]*v[0] + v[1]*v[1];
264 v[1] = 0.0;
265 }
266
267 // pad the FFT with zeros to increase resolution in time domain after IFFT
268 int size_with_padding = ZERO_PADDING_FACTOR * m_fftSize - fftRSize;
269 memset(&m_fftwBufferFreq[fftRSize][0], 0, size_with_padding * sizeof(fftwf_complex));
270 fftwf_execute(m_fftwPlanIFFT);
271
272 // search for a minimum and then for the next maximum to get the estimated frequency
273 int maxAutocorrIndex = find_maximum(find_minimum());
274
275 // compute the frequency of the maximum considering the padding factor
276 if (maxAutocorrIndex >= 0) {
277 setEstimatedFrequency(ZERO_PADDING_FACTOR * m_sampleRate
278 / static_cast<float>(maxAutocorrIndex));
279 } else {
280 setEstimatedFrequency(0.0);
281 }
282 busy = false;
283 }
284 }
285
286 void PitchTracker::setEstimatedFrequency(float freq) {
287 midi.fConsta4 = freq;
288 audio.fConsta1t = (freq == 0.0 ? 1000.0 : 12 * log2f(2.272727e-03f * freq));
289289 }
290290
291291 PitchTracker pitch_tracker;
292
293 }
294
295
292 }
293
294
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * ---------------------------------------------------------------------------
1718 *
1819 * gx_head portmap window
2021 * ----------------------------------------------------------------------------
2122 */
2223
23 #include <cstring>
24 #include <jack/jack.h>
25 #include "guitarix.h"
24 #include "guitarix.h" // NOLINT
25
26 #include <cstring> // NOLINT
27 #include <list> // NOLINT
28 #include <string> // NOLINT
2629
2730 /****************************************************************
2831 ** PortMapWindow
2932 */
3033
31 namespace gx_gui
32 {
34 namespace gx_portmap {
3335
3436 PortAttr gx_head_ports[] = {
35 //client_num, is_insert, port_name, is_input, port_type
36 { 0, false, "in_0", true, JACK_DEFAULT_AUDIO_TYPE },
37 { 1, false, "out_0", false, JACK_DEFAULT_AUDIO_TYPE },
38 { 1, false, "out_1", false, JACK_DEFAULT_AUDIO_TYPE },
39 { 0, false, "midi_in_1", true, JACK_DEFAULT_MIDI_TYPE },
40 { 0, false, "midi_out_1", false, JACK_DEFAULT_MIDI_TYPE },
41 { 1, true, "in_0", true, JACK_DEFAULT_AUDIO_TYPE },
42 { 0, true, "out_0", false, JACK_DEFAULT_AUDIO_TYPE },
37 // client_num, is_insert, port_name, is_input, port_type
38 { 0, false, "in_0", true, JACK_DEFAULT_AUDIO_TYPE },
39 { 1, false, "out_0", false, JACK_DEFAULT_AUDIO_TYPE },
40 { 1, false, "out_1", false, JACK_DEFAULT_AUDIO_TYPE },
41 { 0, false, "midi_in_1", true, JACK_DEFAULT_MIDI_TYPE },
42 { 0, false, "midi_out_1", false, JACK_DEFAULT_MIDI_TYPE },
43 { 1, true, "in_0", true, JACK_DEFAULT_AUDIO_TYPE },
44 { 0, true, "out_0", false, JACK_DEFAULT_AUDIO_TYPE },
4345 };
4446
45 #define ALSA_PCM "alsa_pcm" // special alsa sequencer client
47 #define ALSA_PCM "alsa_pcm" // special alsa sequencer gxjack.client
4648
4749
4850 /****************************************************************
5254 */
5355
5456 struct ClientPortList {
55 const char *client;
56 int len;
57 list<const char*> ports;
58 ClientPortList(const char *p);
59 inline void add(const char *p) { ports.push_back(p); }
60 inline bool sameclient(const char *p) { return strncmp(client, p, len) == 0; }
61 string clientname() { return string(*ports.begin()).substr(0,len-1); }
57 const char *client;
58 int len;
59 list<const char*> ports;
60 explicit ClientPortList(const char *p);
61 inline void add(const char *p) { ports.push_back(p); }
62 inline bool sameclient(const char *p) { return strncmp(client, p, len) == 0; }
63 string clientname() { return string(*ports.begin()).substr(0, len-1); }
6264 };
6365
64 ClientPortList::ClientPortList(const char *p)
65 {
66 client = p;
67 const char *q = strchr(p, ':');
68 if (q) {
69 len = (q - p) + 1;
70 if (strncmp(p, (ALSA_PCM ":"), 9) == 0) {
71 q = strchr(p+len, '/');
72 if (q) {
73 len = (q - p) + 1;
74 } else {
75 len = strlen(p);
76 }
77 }
78 } else { // should not happen
79 len = strlen(p);
80 }
81 }
82
83 struct ClientList: list<ClientPortList*>
84 {
85 static bool str_compare(const char *a, const char *b);
86 ClientList(const char**);
87 ~ClientList();
88 void remove(string excl);
66 ClientPortList::ClientPortList(const char *p) {
67 client = p;
68 const char *q = strchr(p, ':');
69 if (q) {
70 len = (q - p) + 1;
71 if (strncmp(p, (ALSA_PCM ":"), 9) == 0) {
72 q = strchr(p+len, '/');
73 if (q) {
74 len = (q - p) + 1;
75 } else {
76 len = strlen(p);
77 }
78 }
79 } else { // should not happen
80 len = strlen(p);
81 }
82 }
83
84 struct ClientList: list<ClientPortList*> {
85 static bool str_compare(const char *a, const char *b);
86 explicit ClientList(const char**);
87 ~ClientList();
88 void remove(string excl);
8989 };
9090
91 bool ClientList::str_compare(const char *a, const char *b)
92 {
93 return strcmp(b, a) > 0;
94 }
95
96 ClientList::ClientList(const char **ports)
97 {
98 list<const char*> l;
99 for (int i = 0; ports[i]; i++) {
100 l.push_back(ports[i]);
101 }
102 l.sort(str_compare);
103 if (l.empty()) {
104 return;
105 }
106 ClientPortList *cp = new ClientPortList(*l.begin());
107 for (list<const char*>::iterator j = l.begin(); j != l.end(); j++) {
108 if (!cp->sameclient(*j)) {
109 push_back(cp);
110 cp = new ClientPortList(*j);
111 }
112 cp->add(*j);
113 }
114 push_back(cp);
115 }
116
117 ClientList::~ClientList()
118 {
119 for (list<ClientPortList*>::iterator i = begin(); i != end(); i++) {
120 delete *i;
121 }
122 }
123
124 void ClientList::remove(string excl)
125 {
126 for (list<ClientPortList*>::iterator i = begin(); i != end();) {
127 if ((*i)->sameclient(excl.c_str())) {
128 list<ClientPortList*>::iterator n = i++;
129 delete *n;
130 erase(n);
131 break;
132 } else {
133 i++;
134 }
135 }
91 bool ClientList::str_compare(const char *a, const char *b) {
92 return strcmp(b, a) > 0;
93 }
94
95 ClientList::ClientList(const char **ports) {
96 list<const char*> l;
97 for (int i = 0; ports[i]; i++) {
98 l.push_back(ports[i]);
99 }
100 l.sort(str_compare);
101 if (l.empty()) {
102 return;
103 }
104 ClientPortList *cp = new ClientPortList(*l.begin());
105 for (list<const char*>::iterator j = l.begin(); j != l.end(); j++) {
106 if (!cp->sameclient(*j)) {
107 push_back(cp);
108 cp = new ClientPortList(*j);
109 }
110 cp->add(*j);
111 }
112 push_back(cp);
113 }
114
115 ClientList::~ClientList() {
116 for (list<ClientPortList*>::iterator i = begin(); i != end(); i++) {
117 delete *i;
118 }
119 }
120
121 void ClientList::remove(string excl) {
122 for (list<ClientPortList*>::iterator i = begin(); i != end();) {
123 if ((*i)->sameclient(excl.c_str())) {
124 list<ClientPortList*>::iterator n = i++;
125 delete *n;
126 erase(n);
127 break;
128 } else {
129 i++;
130 }
131 }
136132 }
137133
138134
147143 ** port registration / removal
148144 */
149145
150 static string client_from_port(const string& port)
151 {
152 size_t pos = port.find_first_of(':');
153 if (pos == string::npos) {
154 return port;
155 }
156 string s = port.substr(0, pos);
157 if (s.compare(ALSA_PCM) != 0) {
158 return s;
159 }
160 size_t p2 = port.find_first_of('/', 9);
161 if (p2 == string::npos) {
162 return port;
163 }
164 return port.substr(0, p2);
165 }
166
167 static bool compare_client(const string& name, const char *p)
168 {
169 if (name.compare(0, name.size(), p, name.size()) == 0) {
170 if (p[name.size()] == ':' || p[name.size()] == '\0') {
171 return true;
172 }
173 }
174 if (strncmp(p, (ALSA_PCM ":"), 9) == 0) {
175 p += 9;
176 if (name.compare(0, name.size(), p, name.size()) == 0) {
177 if (p[name.size()] == '/' || p[name.size()] == '\0') {
178 return true;
179 }
180 }
181 }
182 return false;
183 }
184
185 static bool compare_port(const string& name, const char *p)
186 {
187 return name.compare(p) == 0;
188 }
189
190 bool PortMapWindow::walk_remove(GtkTreeStore *ts, bool (*compare)(const string&, const char*), string data)
191 {
192 bool changed = false;
193 GtkTreeIter p_iter;
194 if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(ts), &p_iter)) {
195 return changed;
196 }
197 while (true) {
198 gboolean is_port;
199 gtk_tree_model_get(GTK_TREE_MODEL(ts), &p_iter, 2, &is_port, -1);
200 if (is_port) {
201 gchararray p;
202 gtk_tree_model_get(GTK_TREE_MODEL(ts), &p_iter, 0, &p, -1);
203 if (compare(data, p)) {
204 changed = true;
205 if (!gtk_tree_store_remove(ts, &p_iter)) {
206 break;
207 }
208 continue;
209 }
210 } else {
211 GtkTreeIter c_iter;
212 gtk_tree_model_iter_children(GTK_TREE_MODEL(ts), &c_iter, &p_iter);
213 while (true) {
214 gchararray p;
215 gtk_tree_model_get(GTK_TREE_MODEL(ts), &c_iter, 0, &p, -1);
216 if (compare(data, p)) {
217 changed = true;
218 if (!gtk_tree_store_remove(ts, &c_iter)) {
219 break;
220 }
221 continue;
222 }
223 if (!gtk_tree_model_iter_next(GTK_TREE_MODEL(ts), &c_iter)) {
224 break;
225 }
226 }
227 if (!gtk_tree_model_iter_has_child(GTK_TREE_MODEL(ts), &p_iter)) {
228 changed = true;
229 if (!gtk_tree_store_remove(ts, &p_iter)) {
230 break;
231 }
232 continue;
233 }
234 }
235 if (!gtk_tree_model_iter_next(GTK_TREE_MODEL(ts), &p_iter)) {
236 break;
237 }
238 }
239 return changed;
240 }
241
242 void PortMapWindow::walk_insert(GtkTreeStore *ts, string name)
243 {
244 GtkTreeIter p_iter; // clients and ports on top level
245 if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(ts), &p_iter)) {
246 while (true) {
247 gboolean is_port;
248 gchararray p;
249 gtk_tree_model_get(GTK_TREE_MODEL(ts), &p_iter, 0, &p, 2, &is_port, -1);
250 if (name.compare(p) == 0) {
251 return;
252 }
253 if (!is_port && compare_client(client_from_port(name), p)) {
254 GtkTreeIter c_iter; // ports of a client, 2nd level
255 if (gtk_tree_model_iter_children(GTK_TREE_MODEL(ts), &c_iter, &p_iter)) {
256 while (true) {
257 // if we already have the port get out
258 gtk_tree_model_get(GTK_TREE_MODEL(ts), &c_iter, 0, &p, -1);
259 if (name.compare(p) == 0) {
260 return;
261 }
262 if (!gtk_tree_model_iter_next(GTK_TREE_MODEL(ts), &c_iter)) {
263 break;
264 }
265 }
266 }
267 gtk_tree_store_insert_with_values(ts, 0, &p_iter, 0,
268 0, name.c_str(),
269 1, false,
270 2, true,
271 -1);
272 return;
273 }
274 if (!gtk_tree_model_iter_next(GTK_TREE_MODEL(ts), &p_iter)) {
275 break;
276 }
277 }
278 }
279 gtk_tree_store_insert_with_values(ts, 0, 0, 0,
280 0, name.c_str(),
281 1, false,
282 2, true,
283 -1);
284 }
285
286 void PortMapWindow::port_changed(string name, const char *tp, int flags, bool reg)
287 {
288 if (reg == 0) {
289 for (int i = 0; i < number_of_ports; i++) {
290 PortSection *p = &portsection[i];
291 if (walk_remove(p->treestore, compare_port, name)) {
292 update_summary(p);
293 }
294 }
295 } else {
296 for (list<string>::iterator j = excluded_clients.begin(); j != excluded_clients.end(); j++) {
297 if (name.compare(0, j->size(), *j) == 0) {
298 return;
299 }
300 }
301 for (int i = 0; i < number_of_ports; i++) {
302 PortSection *p = &portsection[i];
303 if (strcmp(p->port_attr->port_type, tp) != 0) {
304 continue;
305 }
306 if (p->port_attr->is_input) {
307 if (! (flags & JackPortIsOutput)) {
308 continue;
309 }
310 } else {
311 if (! (flags & JackPortIsInput)) {
312 continue;
313 }
314 }
315 walk_insert(p->treestore, name);
316 }
317 }
146 static string client_from_port(const string& port) {
147 size_t pos = port.find_first_of(':');
148 if (pos == string::npos) {
149 return port;
150 }
151 string s = port.substr(0, pos);
152 if (s.compare(ALSA_PCM) != 0) {
153 return s;
154 }
155 size_t p2 = port.find_first_of('/', 9);
156 if (p2 == string::npos) {
157 return port;
158 }
159 return port.substr(0, p2);
160 }
161
162 static bool compare_client(const string& name, const char *p) {
163 if (name.compare(0, name.size(), p, name.size()) == 0) {
164 if (p[name.size()] == ':' || p[name.size()] == '\0') {
165 return true;
166 }
167 }
168 if (strncmp(p, (ALSA_PCM ":"), 9) == 0) {
169 p += 9;
170 if (name.compare(0, name.size(), p, name.size()) == 0) {
171 if (p[name.size()] == '/' || p[name.size()] == '\0') {
172 return true;
173 }
174 }
175 }
176 return false;
177 }
178
179 static bool compare_port(const string& name, const char *p) {
180 return name.compare(p) == 0;
181 }
182
183 bool PortMapWindow::walk_remove(GtkTreeStore *ts, bool (*compare) // NOLINT
184 (const string&, const char*), string data) {
185 bool changed = false;
186 GtkTreeIter p_iter;
187 if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(ts), &p_iter)) {
188 return changed;
189 }
190 while (true) {
191 gboolean is_port;
192 gtk_tree_model_get(GTK_TREE_MODEL(ts), &p_iter, 2, &is_port, -1);
193 if (is_port) {
194 gchararray p;
195 gtk_tree_model_get(GTK_TREE_MODEL(ts), &p_iter, 0, &p, -1);
196 if (compare(data, p)) {
197 changed = true;
198 if (!gtk_tree_store_remove(ts, &p_iter)) {
199 break;
200 }
201 continue;
202 }
203 } else {
204 GtkTreeIter c_iter;
205 gtk_tree_model_iter_children(GTK_TREE_MODEL(ts), &c_iter, &p_iter);
206 while (true) {
207 gchararray p;
208 gtk_tree_model_get(GTK_TREE_MODEL(ts), &c_iter, 0, &p, -1);
209 if (compare(data, p)) {
210 changed = true;
211 if (!gtk_tree_store_remove(ts, &c_iter)) {
212 break;
213 }
214 continue;
215 }
216 if (!gtk_tree_model_iter_next(GTK_TREE_MODEL(ts), &c_iter)) {
217 break;
218 }
219 }
220 if (!gtk_tree_model_iter_has_child(GTK_TREE_MODEL(ts), &p_iter)) {
221 changed = true;
222 if (!gtk_tree_store_remove(ts, &p_iter)) {
223 break;
224 }
225 continue;
226 }
227 }
228 if (!gtk_tree_model_iter_next(GTK_TREE_MODEL(ts), &p_iter)) {
229 break;
230 }
231 }
232 return changed;
233 }
234
235 void PortMapWindow::walk_insert(GtkTreeStore *ts, string name) {
236 GtkTreeIter p_iter; // clients and ports on top level
237 if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(ts), &p_iter)) {
238 while (true) {
239 gboolean is_port;
240 gchararray p;
241 gtk_tree_model_get(GTK_TREE_MODEL(ts), &p_iter, 0, &p, 2, &is_port, -1);
242 if (name.compare(p) == 0) {
243 return;
244 }
245 if (!is_port && compare_client(client_from_port(name), p)) {
246 GtkTreeIter c_iter; // ports of a gxjack.client, 2nd level
247 if (gtk_tree_model_iter_children(GTK_TREE_MODEL(ts), &c_iter, &p_iter)) {
248 while (true) {
249 // if we already have the port get out
250 gtk_tree_model_get(GTK_TREE_MODEL(ts), &c_iter, 0, &p, -1);
251 if (name.compare(p) == 0) {
252 return;
253 }
254 if (!gtk_tree_model_iter_next(GTK_TREE_MODEL(ts), &c_iter)) {
255 break;
256 }
257 }
258 }
259 gtk_tree_store_insert_with_values(ts, 0, &p_iter, 0,
260 0, name.c_str(),
261 1, false,
262 2, true,
263 -1);
264 return;
265 }
266 if (!gtk_tree_model_iter_next(GTK_TREE_MODEL(ts), &p_iter)) {
267 break;
268 }
269 }
270 }
271 gtk_tree_store_insert_with_values(ts, 0, 0, 0,
272 0, name.c_str(),
273 1, false,
274 2, true,
275 -1);
276 }
277
278 void PortMapWindow::port_changed(string name, const char *tp, int flags, bool reg) {
279 if (reg == 0) {
280 for (int i = 0; i < number_of_ports; i++) {
281 PortSection *p = &portsection[i];
282 if (walk_remove(p->treestore, compare_port, name)) {
283 update_summary(p);
284 }
285 }
286 } else {
287 for (list<string>::iterator j = excluded_clients.begin();
288 j != excluded_clients.end(); j++) {
289 if (name.compare(0, j->size(), *j) == 0) {
290 return;
291 }
292 }
293 for (int i = 0; i < number_of_ports; i++) {
294 PortSection *p = &portsection[i];
295 if (strcmp(p->port_attr->port_type, tp) != 0) {
296 continue;
297 }
298 if (p->port_attr->is_input) {
299 if (!(flags & JackPortIsOutput)) {
300 continue;
301 }
302 } else {
303 if (!(flags & JackPortIsInput)) {
304 continue;
305 }
306 }
307 walk_insert(p->treestore, name);
308 }
309 }
318310 }
319311
320312
322314 ** port connection change
323315 */
324316
325 list<string> PortMapWindow::walk(GtkTreeStore *ts, string *port, int connect)
326 {
327 list<string> l;
328 GtkTreeIter p_iter;
329 if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(ts), &p_iter)) {
330 return l;
331 }
332 do {
333 gboolean is_port, is_connected;
334 gchararray p;
335 gtk_tree_model_get(GTK_TREE_MODEL(ts), &p_iter, 0, &p, 1, &is_connected, 2, &is_port, -1);
336 if (is_port) {
337 if (port && port->compare(p) == 0) {
338 is_connected = connect;
339 gtk_tree_store_set(ts, &p_iter, 1, is_connected, -1);
340 }
341 if (is_connected) {
342 l.push_back(p);
343 }
344 } else {
345 GtkTreeIter c_iter;
346 gtk_tree_model_iter_children(GTK_TREE_MODEL(ts), &c_iter, &p_iter);
347 do {
348 gchararray p;
349 gtk_tree_model_get(GTK_TREE_MODEL(ts), &c_iter, 0, &p, 1, &is_connected, -1);
350 if (port && port->compare(p) == 0) {
351 is_connected = connect;
352 gtk_tree_store_set(ts, &c_iter, 1, is_connected, -1);
353 }
354 if (is_connected) {
355 l.push_back(p);
356 }
357 } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(ts), &c_iter));
358 }
359 } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(ts), &p_iter));
360 return l;
361 }
362
363 void PortMapWindow::update_summary(PortSection *p, string *port, bool conn)
364 {
365 list<string> l = walk(p->treestore, port, conn);
366 if (!p->expander) {
367 return;
368 }
369 string q;
370 list<string>::iterator i = l.begin();
371 if (i != l.end()) {
372 q = *i++;
373 }
374 for (; i != l.end(); i++) {
375 q += "\n" + *i;
376 }
377 gtk_label_set_text(p->label, q.c_str());
378 g_idle_add(redraw_expander, p->expander);
379 }
380
381 void PortMapWindow::connection_changed(string port1, string port2, bool conn)
382 {
383 for (int i = 0; i < number_of_ports; i++) {
384 PortSection *p = &portsection[i];
385
386 string s = (p->port_attr->client_num == 0 ? gx_jack::client_name : gx_jack::client_insert_name)
387 + ":" + p->port_attr->port_name;
388 if (s.compare(port1) == 0) {
389 update_summary(p, &port2, conn);
390 }
391 else if (s.compare(port2) == 0) {
392 update_summary(p, &port1, conn);
393 }
394 }
317 list<string> PortMapWindow::walk(GtkTreeStore *ts, string *port, int connect) {
318 list<string> l;
319 GtkTreeIter p_iter;
320 if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(ts), &p_iter)) {
321 return l;
322 }
323 do {
324 gboolean is_port, is_connected;
325 gchararray p;
326 gtk_tree_model_get(GTK_TREE_MODEL(ts), &p_iter, 0, &p, 1, &is_connected, 2, &is_port, -1);
327 if (is_port) {
328 if (port && port->compare(p) == 0) {
329 is_connected = connect;
330 gtk_tree_store_set(ts, &p_iter, 1, is_connected, -1);
331 }
332 if (is_connected) {
333 l.push_back(p);
334 }
335 } else {
336 GtkTreeIter c_iter;
337 gtk_tree_model_iter_children(GTK_TREE_MODEL(ts), &c_iter, &p_iter);
338 do {
339 gchararray p;
340 gtk_tree_model_get(GTK_TREE_MODEL(ts), &c_iter, 0, &p, 1, &is_connected, -1);
341 if (port && port->compare(p) == 0) {
342 is_connected = connect;
343 gtk_tree_store_set(ts, &c_iter, 1, is_connected, -1);
344 }
345 if (is_connected) {
346 l.push_back(p);
347 }
348 } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(ts), &c_iter));
349 }
350 } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(ts), &p_iter));
351 return l;
352 }
353
354 void PortMapWindow::update_summary(PortSection *p, string *port, bool conn) {
355 list<string> l = walk(p->treestore, port, conn);
356 if (!p->expander) {
357 return;
358 }
359 string q;
360 list<string>::iterator i = l.begin();
361 if (i != l.end()) {
362 q = *i++;
363 }
364 for (; i != l.end(); i++) {
365 q += "\n" + *i;
366 }
367 gtk_label_set_text(p->label, q.c_str());
368 g_idle_add(redraw_expander, p->expander);
369 }
370
371 void PortMapWindow::connection_changed(string port1, string port2, bool conn) {
372 for (int i = 0; i < number_of_ports; i++) {
373 PortSection *p = &portsection[i];
374
375 string s = (p->port_attr->client_num == 0 ?
376 gx_jack::client_name : gx_jack::client_insert_name)
377 + ":" + p->port_attr->port_name;
378 if (s.compare(port1) == 0) {
379 update_summary(p, &port2, conn);
380 } else if (s.compare(port2) == 0) {
381 update_summary(p, &port1, conn);
382 }
383 }
395384 }
396385
397386
399388 ** gtk callback functions
400389 */
401390
402 void PortMapWindow::on_check_resize(GtkWidget *widget, gpointer data)
403 {
404 // cf. comment at the end of on_expander()
405 PortMapWindow *p = (PortMapWindow*)data;
406 if (p->monitored_expander_child &&
407 !gtk_widget_get_child_visible(p->monitored_expander_child)) {
408 p->monitored_expander_child = 0;
409 gint width;
410 gdk_window_get_geometry(window->window, 0, 0, &width, 0, 0);
411 gtk_window_resize(GTK_WINDOW(window), width, 1);
412 }
413 }
414
415 void PortMapWindow::on_expander(GtkWidget *widget, gpointer data)
416 {
417 PortMapWindow *p = (PortMapWindow*)data;
418 gboolean expanded = gtk_expander_get_expanded(GTK_EXPANDER(widget));
419 if (expanded) {
420 // close all other expanders and unset their expand child property
421 for (int i = 0; i < number_of_ports; i++) {
422 GtkWidget *w = GTK_WIDGET(p->portsection[i].expander);
423 if (widget != w) {
424 GValue v = {0};
425 g_value_init(&v, G_TYPE_BOOLEAN);
426 g_value_set_boolean(&v, FALSE);
427 gtk_container_child_set_property(GTK_CONTAINER(gtk_widget_get_parent(w)), w, "expand", &v);
428 gtk_expander_set_expanded(GTK_EXPANDER(w), FALSE);
429 }
430 }
431 }
432 // set the expand child property of the current expander if its expanded
433 GValue value = {0};
434 g_value_init(&value, G_TYPE_BOOLEAN);
435 g_value_set_boolean(&value, expanded);
436 gtk_container_child_set_property(GTK_CONTAINER(gtk_widget_get_parent(widget)), widget, "expand", &value);
437 if (!expanded) {
438 // when the expander is explicitely closed (so all expanders are
439 // closed now) we want to shrink the portmap window with
440 // gtk_window_resize().
441 // But GtkExpander uses a timer before the child is made
442 // unvisible and a resize of the window is triggered.
443 // So we defer resizing to the "check-resize"-signal handler
444 p->monitored_expander_child = gtk_bin_get_child(GTK_BIN(widget));
445 }
446 }
447
448 void PortMapWindow::response_cb(GtkWidget *widget, gint response_id, gpointer data)
449 {
450 PortMapWindow& m = *(PortMapWindow*)data;
451 gtk_check_menu_item_set_active(m.menuitem, FALSE);
452 }
453
454 void PortMapWindow::destroy_cb(GtkWidget*, gpointer data)
455 {
456 delete (PortMapWindow*)data;
457 }
458
459 void PortMapWindow::toggle(GtkWidget* widget, gpointer data)
460 {
461 if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(data))) {
462 if (window) {
463 gtk_widget_destroy(window);
464 }
465 } else {
466 if (!window) {
467 new PortMapWindow(GTK_CHECK_MENU_ITEM(data));
468 }
469 }
470 }
471
472 gboolean PortMapWindow::redraw_expander(gpointer data)
473 {
474 gtk_widget_queue_draw(GTK_WIDGET(data));
475 return FALSE;
476 }
477
478 void PortMapWindow::on_cell_toggle(GtkCellRendererToggle *widget, gchar *path, gpointer data)
479 {
480 PortSection *p = (PortSection*)data;
481
482 GtkTreeIter iter;
483 gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(p->treestore), &iter, path);
484 gboolean v;
485 const char *q1, *q2;
486 gtk_tree_model_get(GTK_TREE_MODEL(p->treestore), &iter, 0, &q1, 1, &v, -1);
487 string gcln;
488 jack_client_t *gcl;
489 if (p->port_attr->client_num == 0) {
490 gcl = gx_jack::client;
491 gcln = gx_jack::client_name;
492 } else {
493 gcl = gx_jack::client_insert;
494 gcln = gx_jack::client_insert_name;
495 }
496 string s = gcln + ":" + p->port_attr->port_name;
391 void PortMapWindow::on_check_resize(GtkWidget *widget, gpointer data) {
392 // cf. comment at the end of on_expander()
393 PortMapWindow *p = reinterpret_cast<PortMapWindow*>(data);
394 if (p->monitored_expander_child &&
395 !gtk_widget_get_child_visible(p->monitored_expander_child)) {
396 p->monitored_expander_child = 0;
397 gint width;
398 gdk_window_get_geometry(window->window, 0, 0, &width, 0, 0);
399 gtk_window_resize(GTK_WINDOW(window), width, 1);
400 }
401 }
402
403 void PortMapWindow::on_expander(GtkWidget *widget, gpointer data) {
404 PortMapWindow *p = reinterpret_cast<PortMapWindow*>(data);
405 gboolean expanded = gtk_expander_get_expanded(GTK_EXPANDER(widget));
406 if (expanded) {
407 // close all other expanders and unset their expand child property
408 for (int i = 0; i < number_of_ports; i++) {
409 GtkWidget *w = GTK_WIDGET(p->portsection[i].expander);
410 if (widget != w) {
411 GValue v = {0};
412 g_value_init(&v, G_TYPE_BOOLEAN);
413 g_value_set_boolean(&v, FALSE);
414 gtk_container_child_set_property(GTK_CONTAINER(gtk_widget_get_parent(w)),
415 w, "expand", &v);
416 gtk_expander_set_expanded(GTK_EXPANDER(w), FALSE);
417 }
418 }
419 }
420 // set the expand child property of the current expander if its expanded
421 GValue value = {0};
422 g_value_init(&value, G_TYPE_BOOLEAN);
423 g_value_set_boolean(&value, expanded);
424 gtk_container_child_set_property(GTK_CONTAINER(gtk_widget_get_parent(widget)),
425 widget, "expand", &value);
426 if (!expanded) {
427 // when the expander is explicitely closed (so all expanders are
428 // closed now) we want to shrink the portmap window with
429 // gtk_window_resize().
430 // But GtkExpander uses a timer before the child is made
431 // unvisible and a resize of the window is triggered.
432 // So we defer resizing to the "check-resize"-signal handler
433 p->monitored_expander_child = gtk_bin_get_child(GTK_BIN(widget));
434 }
435 }
436
437 void PortMapWindow::response_cb(GtkWidget *widget, gint response_id, gpointer data) {
438 PortMapWindow& m = *reinterpret_cast<PortMapWindow*>(data);
439 gtk_check_menu_item_set_active(m.menuitem, FALSE);
440 }
441
442 void PortMapWindow::destroy_cb(GtkWidget*, gpointer data) {
443 delete reinterpret_cast<PortMapWindow*>(data);
444 }
445
446 void PortMapWindow::toggle(GtkWidget* widget, gpointer data) {
447 if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(data))) {
448 if (window) {
449 gtk_widget_destroy(window);
450 }
451 } else {
452 if (!window) {
453 new PortMapWindow(GTK_CHECK_MENU_ITEM(data));
454 }
455 }
456 }
457
458 gboolean PortMapWindow::redraw_expander(gpointer data) {
459 gtk_widget_queue_draw(GTK_WIDGET(data));
460 return FALSE;
461 }
462
463 void PortMapWindow::on_cell_toggle(GtkCellRendererToggle *widget,
464 gchar *path, gpointer data) {
465 PortSection *p = reinterpret_cast<PortSection*>(data);
466
467 GtkTreeIter iter;
468 gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(p->treestore), &iter, path);
469 gboolean v;
470 const char *q1, *q2;
471 gtk_tree_model_get(GTK_TREE_MODEL(p->treestore), &iter, 0, &q1, 1, &v, -1);
472 string gcln;
473 jack_client_t *gcl;
474 if (p->port_attr->client_num == 0) {
475 gcl = gx_jack::gxjack.client;
476 gcln = gx_jack::client_name;
477 } else {
478 gcl = gx_jack::gxjack.client_insert;
479 gcln = gx_jack::client_insert_name;
480 }
481 string s = gcln + ":" + p->port_attr->port_name;
497482 q2 = s.c_str();
498483 if (!p->port_attr->is_input) {
499 const char *sw = q1;
500 q1 = q2;
501 q2 = sw;
502 }
503
504 v = !v;
505 int ret;
484 const char *sw = q1;
485 q1 = q2;
486 q2 = sw;
487 }
488
489 v = !v;
490 int ret;
506491
507492 if (v) {
508493 ret = jack_connect(gcl, q1, q2);
510495 ret = jack_disconnect(gcl, q1, q2);
511496 }
512497
513 if (ret != 0) {
514 ostringstream buf;
515 buf << "couldn't " << (v ? "" : "dis") << "connect " << q2 << " -> " << q1;
516 gx_system::gx_print_error("port connection", buf.str());
517 return;
518 }
519 gtk_tree_store_set(GTK_TREE_STORE(p->treestore), &iter, 1, v, -1);
520 update_summary(p);
498 if (ret != 0) {
499 ostringstream buf;
500 buf << "couldn't " << (v ? "" : "dis") << "connect " << q2 << " -> " << q1;
501 gx_system::gx_print_error("port connection", buf.str());
502 return;
503 }
504 gtk_tree_store_set(GTK_TREE_STORE(p->treestore), &iter, 1, v, -1);
505 update_summary(p);
521506 }
522507
523508
525510 ** constuctor / destructor
526511 */
527512
528 inline bool getnumber(gchararray p, long *pi)
529 {
530 char *q;
531 *pi = strtol(p, &q, 10);
532 return !*q;
533 }
534
535 static gint sort_func(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user_data)
536 {
537 gchararray pa, pb;
538 gtk_tree_model_get(model, a, 0, &pa, -1);
539 gtk_tree_model_get(model, b, 0, &pb, -1);
540 int i = 0;
541 for (; ; i++) {
542 if (pa[i] != pb[i]) {
543 break;
544 }
545 if (!pa[i]) {
546 return 0;
547 }
548 }
549 long ia, ib;
550 if (getnumber(&pa[i],&ia) && getnumber(&pb[i],&ib)) {
551 return ia - ib;
552 }
553 return strcmp(pa, pb);
554 }
555
556 void PortMapWindow::load(int sect, jack_port_t *jack_port)
557 {
558 if (gx_jack::client) {
513 inline bool getnumber(gchararray p, long *pi) { // NOLINT
514 char *q;
515 *pi = strtol(p, &q, 10);
516 return !*q;
517 }
518
519 static gint sort_func(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b,
520 gpointer user_data) {
521 gchararray pa, pb;
522 gtk_tree_model_get(model, a, 0, &pa, -1);
523 gtk_tree_model_get(model, b, 0, &pb, -1);
524 int i = 0;
525 for (; ; i++) {
526 if (pa[i] != pb[i]) {
527 break;
528 }
529 if (!pa[i]) {
530 return 0;
531 }
532 }
533 long ia, ib; // NOLINT
534 if (getnumber(&pa[i], &ia) && getnumber(&pb[i], &ib)) {
535 return ia - ib;
536 }
537 return strcmp(pa, pb);
538 }
539
540 void PortMapWindow::load(int sect, jack_port_t *jack_port) {
541 if (gx_jack::gxjack.client) {
559542 const unsigned int max_items_unfolded = 1;
560543 PortSection& ps = portsection[sect];
561544 GtkTreeStore *tree = ps.treestore;
565548 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(tree), 0, GTK_SORT_ASCENDING);
566549 gtk_tree_store_clear(tree);
567550 const char **ports;
568 jack_client_t *gcl = (ps.port_attr->client_num == 0 ? gx_jack::client : gx_jack::client_insert);
551 jack_client_t *gcl = (ps.port_attr->client_num == 0 ? gx_jack::gxjack.client
552 : gx_jack::gxjack.client_insert);
569553 ports = jack_get_ports(gcl, NULL, ps.port_attr->port_type,
570554 (ps.port_attr->is_input ? JackPortIsOutput : JackPortIsInput));
571555 if (!ports) {
572 return;
556 return;
573557 }
574558 const char** conn_ports = jack_port_get_connections(jack_port);
575559 ClientList cl(ports);
576 // the following loop depends on the first 2 entries being client_name and client_insert_name
560 // the following loop depends on the first 2 entries being
561 // client_name and client_insert_name
577562 int idx = 0;
578 for (list<string>::iterator j = excluded_clients.begin(); j != excluded_clients.end(); j++, idx++) {
579 if (!ps.port_attr->is_insert || ps.port_attr->client_num != idx) {
580 cl.remove(*j);
581 }
563 for (list<string>::iterator j = excluded_clients.begin(); j !=
564 excluded_clients.end(); j++, idx++) {
565 if (!ps.port_attr->is_insert || ps.port_attr->client_num != idx) {
566 cl.remove(*j);
567 }
582568 }
583569 GtkTreeIter iter, parent, *parentp;
584570 for (ClientList::iterator i = cl.begin(); i != cl.end(); i++) {
618604 }
619605 }
620606
621 void PortMapWindow::load_all()
622 {
607 void PortMapWindow::load_all() {
623608 #define uslp() usleep(10); // prevents xruns?? (bug in jackd?)
624 load(0, gx_jack::input_ports[0]);
625 uslp();
626 load(1, gx_jack::output_ports[2]);
627 uslp();
628 load(2, gx_jack::output_ports[3]);
629 uslp();
630 load(3, gx_jack::midi_input_port);
631 uslp();
632 load(4, gx_jack::midi_output_ports);
633 uslp();
634 load(5, gx_jack::input_ports[1]);
635 uslp();
636 load(6, gx_jack::output_ports[0]);
609 load(0, gx_jack::gxjack.input_ports[0]);
610 uslp();
611 load(1, gx_jack::gxjack.output_ports[2]);
612 uslp();
613 load(2, gx_jack::gxjack.output_ports[3]);
614 uslp();
615 load(3, gx_jack::gxjack.midi_input_port);
616 uslp();
617 load(4, gx_jack::gxjack.midi_output_ports);
618 uslp();
619 load(5, gx_jack::gxjack.input_ports[1]);
620 uslp();
621 load(6, gx_jack::gxjack.output_ports[0]);
637622 #undef uslp
638623 }
639624
640 PortMapWindow::PortMapWindow(GtkCheckMenuItem *item)
641 {
642 monitored_expander_child = 0;
643 menuitem = item;
644 gtk_widget_ref(GTK_WIDGET(item));
645
646 // order of first 2 entries is important (check load())
647 excluded_clients.push_back(string(gx_jack::client_insert_name) + ":");
648 excluded_clients.push_back(string(gx_jack::client_name) + ":");
649 excluded_clients.push_back(string(gx_jack::client_instance) + "_meterbridge:");
650 excluded_clients.push_back(string("jack_capture:"));
651
652 GtkBuilder * builder = gtk_builder_new();
653 window = load_toplevel(builder, "ports.glade", "PortMapWindow");
654 gtk_window_set_icon(GTK_WINDOW (window), GDK_PIXBUF(ib));
655 GObject *b = gtk_builder_get_object(builder, "button1");
656 if (b) gtk_widget_set_name(GTK_WIDGET(b),"rack_button");
657 memset(portsection, 0, sizeof(portsection));
658 for (int i = 0; i < number_of_ports; i++) {
659 portsection[i].port_attr = &gx_head_ports[i];
660 char name[30];
661 snprintf(name, sizeof(name), "scrolledwindow%d", i+1);
662 portsection[i].scrolled_window = GTK_SCROLLED_WINDOW(gtk_builder_get_object(builder, name));
663 snprintf(name, sizeof(name), "treestore%d", i+1);
664 portsection[i].treestore = GTK_TREE_STORE(gtk_builder_get_object(builder, name));
665 snprintf(name, sizeof(name), "cellrenderertoggle%d", i+1);
666 g_signal_connect(gtk_builder_get_object(builder, name), "toggled", G_CALLBACK(on_cell_toggle), &portsection[i]);
667 snprintf(name, sizeof(name), "expander%d", i+1);
668 GObject *w = gtk_builder_get_object(builder, name);
669 if (w) {
670 portsection[i].expander = GTK_EXPANDER(w);
671 g_signal_connect_after(portsection[i].expander, "activate", G_CALLBACK(on_expander), this);
672 snprintf(name, sizeof(name), "port%d", i+1);
673 portsection[i].label = GTK_LABEL(gtk_builder_get_object(builder, name));
674 }
675 }
676
677 load_all();
678
679 g_signal_connect(window, "destroy", G_CALLBACK(destroy_cb), this);
680 g_signal_connect(window, "response", G_CALLBACK(response_cb), this);
681 gtk_window_add_accel_group(GTK_WINDOW(window),
682 GxMainInterface::instance()->fAccelGroup);
683 g_signal_connect_after(window, "check-resize", G_CALLBACK(on_check_resize), this);
684 gtk_widget_show(window);
685 g_object_unref(G_OBJECT(builder));
686 instance = this;
625 PortMapWindow::PortMapWindow(GtkCheckMenuItem *item) {
626 monitored_expander_child = 0;
627 menuitem = item;
628 gtk_widget_ref(GTK_WIDGET(item));
629
630 // order of first 2 entries is important (check load())
631 excluded_clients.push_back(string(gx_jack::client_insert_name) + ":");
632 excluded_clients.push_back(string(gx_jack::client_name) + ":");
633 excluded_clients.push_back(string(gx_jack::client_instance) + "_meterbridge:");
634 excluded_clients.push_back(string("jack_capture:"));
635
636 GtkBuilder * builder = gtk_builder_new();
637 window = gx_gui::load_toplevel(builder, "ports.glade", "PortMapWindow");
638 gtk_window_set_icon(GTK_WINDOW(window), GDK_PIXBUF(gx_gui::gw.ib));
639 GObject *b = gtk_builder_get_object(builder, "button1");
640 if (b) gtk_widget_set_name(GTK_WIDGET(b), "rack_button");
641 memset(portsection, 0, sizeof(portsection));
642 for (int i = 0; i < number_of_ports; i++) {
643 portsection[i].port_attr = &gx_head_ports[i];
644 char name[30];
645 snprintf(name, sizeof(name), "scrolledwindow%d", i+1);
646 portsection[i].scrolled_window = GTK_SCROLLED_WINDOW(gtk_builder_get_object(
647 builder, name));
648 snprintf(name, sizeof(name), "treestore%d", i+1);
649 portsection[i].treestore = GTK_TREE_STORE(gtk_builder_get_object(builder, name));
650 snprintf(name, sizeof(name), "cellrenderertoggle%d", i+1);
651 g_signal_connect(gtk_builder_get_object(builder, name), "toggled",
652 G_CALLBACK(on_cell_toggle), &portsection[i]);
653 snprintf(name, sizeof(name), "expander%d", i+1);
654 GObject *w = gtk_builder_get_object(builder, name);
655 if (w) {
656 portsection[i].expander = GTK_EXPANDER(w);
657 g_signal_connect_after(portsection[i].expander, "activate",
658 G_CALLBACK(on_expander), this);
659 snprintf(name, sizeof(name), "port%d", i+1);
660 portsection[i].label = GTK_LABEL(gtk_builder_get_object(builder, name));
661 }
662 }
663
664 load_all();
665
666 g_signal_connect(window, "destroy", G_CALLBACK(destroy_cb), this);
667 g_signal_connect(window, "response", G_CALLBACK(response_cb), this);
668 gtk_window_add_accel_group(GTK_WINDOW(window),
669 gx_gui::GxMainInterface::instance()->fAccelGroup);
670 g_signal_connect_after(window, "check-resize", G_CALLBACK(on_check_resize), this);
671 gtk_widget_show(window);
672 g_object_unref(G_OBJECT(builder));
673 instance = this;
687674 }
688675
689676 // refresh portmap widget when connect/disconnect with jack server
690 void PortMapWindow::refresh()
691 {
692 if(window) {
693 if(!gx_jack::client) {
694 for(int i = 0; i< number_of_ports;i++){
677 void PortMapWindow::refresh() {
678 if (window) {
679 if (!gx_jack::gxjack.client) {
680 for (int i = 0; i< number_of_ports;i++) {
695681 PortSection& ps = portsection[i];
696682 GtkTreeStore *tree = ps.treestore;
697683 assert(tree);
698684 assert(GTK_IS_TREE_STORE(tree));
699 gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(tree), 0, sort_func, 0, 0);
700 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(tree), 0, GTK_SORT_ASCENDING);
685 gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(tree),
686 0, sort_func, 0, 0);
687 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(tree),
688 0, GTK_SORT_ASCENDING);
701689 gtk_tree_store_clear(tree);
702690 update_summary(&portsection[i]);
703691 }
704692 } else {
705 load_all();
706 }
707 }
708 }
709
710 PortMapWindow::~PortMapWindow()
711 {
712 instance = 0;
713 window = NULL;
714 monitored_expander_child = 0;
715 gtk_widget_unref(GTK_WIDGET(menuitem));
716 }
717
693 load_all();
694 }
695 }
696 }
697
698 PortMapWindow::~PortMapWindow() {
699 instance = 0;
700 window = NULL;
701 monitored_expander_child = 0;
702 gtk_widget_unref(GTK_WIDGET(menuitem));
703 }
718704 } // namespace gui
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * --------------------------------------------------------------------------
1718 */
1819
2223
2324 ---------------------------------------------------------------------------*/
2425
25 #include <fstream>
26 #include <gdk/gdkkeysyms.h>
27 #include <gtkmm/filechooserdialog.h>
28 #include "guitarix.h"
29 #include <glibmm/i18n.h>
30
31 using namespace gx_system;
32
33 //#define _(x) (x)
34
35 namespace gx_preset
36 {
26 #include "guitarix.h" // NOLINT
27
28 #include <gdk/gdkkeysyms.h> // NOLINT
29 #include <gtkmm/filechooserdialog.h> // NOLINT
30 #include <glibmm/i18n.h> // NOLINT
31
32 #include <fstream> // NOLINT
33 #include <string> // NOLINT
34 #include <vector> // NOLINT
35
36 using namespace gx_system; // NOLINT
37
38 // #define _(x) (x)
39
40 namespace gx_preset {
3741
3842 /* get the accel path to connect the mnemonic key on the fly
3943 this is a replacement for gtk_widget_get_accel_path()
4044 witch is not avaluable in <= Gtk+2.12 */
41 string gx_get_accel_path(int lindex)
42 {
43
44 // set accel_path
45 string label ;
46 switch (lindex)
47 {
48 case 0:
49 label = _("Load");
50 break;
51 case 1:
52 label = _("Save");
53 break;
54 case 2:
55 label = _("Rename");
56 break;
57 case 3:
58 label = _("Delete");
59 break;
60
61 }
62 //string acc_path = gtk_menu_get_accel_path(GTK_MENU(menu));
63 string acc_path = "<gx_head>/";
64 acc_path += label;
65 acc_path += "/";
66
67 return acc_path;
68 }
69
70 //----- create a empty preset file
71 void gx_empty_preset_file(const char* filename)
72 {
73 ofstream nfile(filename);
74 JsonWriter jw(nfile);
75 jw.begin_array();
76 writeHeader(jw);
77 jw.end_array(true);
78 jw.close();
79 nfile.close();
80 }
81
82 //----- modify (add/sub/change) a existing preset file
83 bool gx_modify_preset(const char* presname, const char* newname=0, bool remove=false, bool rewrite=false)
84 {
85 string tmpfile = gx_preset_file.get_path() + "_tmp";
86 ifstream ofile(gx_preset_file.get_path().c_str());
87 ofstream nfile(tmpfile.c_str());
88 JsonParser jp(ofile);
89 JsonWriter jw(nfile);
90
91 bool found = false;
92 try {
93 jp.next(JsonParser::begin_array);
94 jw.begin_array();
95 int major, minor;
96 if (!readHeader(jp, &major, &minor)) {
97 if (rewrite) {
98 if (major == 0 && minor == 0) {
99 gx_print_info(_("loading presets"),_("rewriting convertet presets"));
100 } else {
101 const char *s;
102 if (major != majorversion) {
103 s = _("major version mismatch in %1%: found %2%.%3%, expected %4%.%5%");
104 } else {
105 assert(minor != minorversion);
106 s = _("minor version mismatch in %1%: found %2%.%3%, expected %4%.%5%");
107 }
108 gx_print_warning(
109 _("recall settings"),
110 (boost::format(s) % gx_preset_file.get_parse_name() % major % minor % majorversion % minorversion).str());
111 }
112 }
113 }
114 writeHeader(jw);
115
116 while (jp.peek() != JsonParser::end_array) {
117 jp.next(JsonParser::value_string);
118 if (rewrite) {
119 jw.write(jp.current_value());
120 gx_gui::parameter_map.set_init_values();
121 bool has_midi;
122 read_preset(jp, &has_midi, major, minor);
123 write_preset(jw,false,has_midi);
124 } else if (jp.current_value() == presname) {
125 found = true;
126 if (newname) {
127 jw.write(newname);
128 jp.copy_object(jw);
129 } else if (remove) {
130 jp.skip_object();
131 } else {
132 jw.write(presname);
133 write_preset(jw);
134 jp.skip_object();
135 }
136 } else {
137 jw.write(jp.current_value().c_str());
138 jp.copy_object(jw);
139 }
140 }
141 jp.next(JsonParser::end_array);
142 jp.next(JsonParser::end_token);
143
144 if (!found && !remove && !newname && !rewrite) {
145 jw.write(presname);
146 write_preset(jw);
147 }
148 jw.end_array(true);
149 jw.close();
150 nfile.close();
151 ofile.close();
152 if (!nfile.good()) {
153 gx_print_error(_("save preset"),_("couldn't write ") + tmpfile);
154 return false;
155 }
156
157 int rc = rename(tmpfile.c_str(), gx_preset_file.get_path().c_str());
158 if (rc != 0) {
159 gx_print_error(_("save preset"),_("couldn't rename ")
160 + tmpfile + " to " + gx_preset_file.get_parse_name());
161 return false;
162 }
163 } catch (gx_system::JsonException& e) {
164 gx_print_error(_("save/modify preset"), _("invalid preset file: ") + gx_preset_file.get_parse_name());
165 }
166 return found;
167 }
168
169 //---- parsing preset file to build up a string vector of preset names
170 static bool gx_build_preset_list()
171 {
172 // initialize list
173 plist.clear();
174 // initialize menu pointer list
175 for (int i = 0; i < GX_NUM_OF_PRESET_LISTS; i++)
45 string gx_get_accel_path(int lindex) {
46
47 // set accel_path
48 string label;
49 switch (lindex) {
50 case 0:
51 label = _("Load");
52 break;
53 case 1:
54 label = _("Save");
55 break;
56 case 2:
57 label = _("Rename");
58 break;
59 case 3:
60 label = _("Delete");
61 break;
62 }
63 // string acc_path = gtk_menu_get_accel_path(GTK_MENU(menu));
64 string acc_path = "<gx_head>/";
65 acc_path += label;
66 acc_path += "/";
67
68 return acc_path;
69 }
70
71 // ----- create a empty preset file
72 void gx_empty_preset_file(const char* filename) {
73 ofstream nfile(filename);
74 JsonWriter jw(nfile);
75 jw.begin_array();
76 writeHeader(jw);
77 jw.end_array(true);
78 jw.close();
79 nfile.close();
80 }
81
82 // ----- modify (add/sub/change) a existing preset file
83 bool gx_modify_preset(const char* presname, const char* newname = 0,
84 bool remove = false, bool rewrite = false) {
85 string tmpfile = gx_preset_file.get_path() + "_tmp";
86 ifstream ofile(gx_preset_file.get_path().c_str());
87 ofstream nfile(tmpfile.c_str());
88 JsonParser jp(ofile);
89 JsonWriter jw(nfile);
90
91 bool found = false;
92 try {
93 jp.next(JsonParser::begin_array);
94 jw.begin_array();
95 int major, minor;
96 if (!readHeader(jp, &major, &minor)) {
97 if (rewrite) {
98 if (major == 0 && minor == 0) {
99 gx_print_info(_("loading presets"), _("rewriting convertet presets"));
100 } else {
101 const char *s;
102 if (major != majorversion) {
103 s = _("major version mismatch in %1%: found %2%.%3%, expected %4%.%5%");
104 } else {
105 assert(minor != minorversion);
106 s = _("minor version mismatch in %1%: found %2%.%3%, expected %4%.%5%");
107 }
108 gx_print_warning(
109 _("recall settings"),
110 (boost::format(s) % gx_preset_file.get_parse_name()
111 % major % minor % majorversion % minorversion).str());
112 }
113 }
114 }
115 writeHeader(jw);
116
117 while (jp.peek() != JsonParser::end_array) {
118 jp.next(JsonParser::value_string);
119 if (rewrite) {
120 jw.write(jp.current_value());
121 gx_gui::parameter_map.set_init_values();
122 bool has_midi;
123 read_preset(jp, &has_midi, major, minor);
124 write_preset(jw, false, has_midi);
125 } else if (jp.current_value() == presname) {
126 found = true;
127 if (newname) {
128 jw.write(newname);
129 jp.copy_object(jw);
130 } else if (remove) {
131 jp.skip_object();
132 } else {
133 jw.write(presname);
134 write_preset(jw);
135 jp.skip_object();
136 }
137 } else {
138 jw.write(jp.current_value().c_str());
139 jp.copy_object(jw);
140 }
141 }
142 jp.next(JsonParser::end_array);
143 jp.next(JsonParser::end_token);
144
145 if (!found && !remove && !newname && !rewrite) {
146 jw.write(presname);
147 write_preset(jw);
148 }
149 jw.end_array(true);
150 jw.close();
151 nfile.close();
152 ofile.close();
153 if (!nfile.good()) {
154 gx_print_error(_("save preset"), _("couldn't write ") + tmpfile);
155 return false;
156 }
157
158 int rc = rename(tmpfile.c_str(), gx_preset_file.get_path().c_str());
159 if (rc != 0) {
160 gx_print_error(_("save preset"), _("couldn't rename ")
161 + tmpfile + " to " + gx_preset_file.get_parse_name());
162 return false;
163 }
164 } catch(gx_system::JsonException& e) {
165 gx_print_error(_("save/modify preset"), _("invalid preset file: ")
166 + gx_preset_file.get_parse_name());
167 }
168 return found;
169 }
170
171 // ---- parsing preset file to build up a string vector of preset names
172 static bool gx_build_preset_list() {
173 // initialize list
174 plist.clear();
175 // initialize menu pointer list
176 for (int i = 0; i < GX_NUM_OF_PRESET_LISTS; i++)
176177 pm_list[i].clear();
177178
178 // parse it if any
179 ifstream f(gx_preset_file.get_path().c_str());
180 if (f.good()) {
181 try {
182 JsonParser jp(f);
183 jp.next(JsonParser::begin_array);
184 int samevers = readHeader(jp);
185 while (jp.peek() == JsonParser::value_string) {
186 jp.next();
187 plist.push_back(jp.current_value());
188 jp.skip_object();
189 }
190 jp.next(JsonParser::end_array);
191 jp.next(JsonParser::end_token);
192 f.close();
193 // ---- how many did we get ?
194 gx_print_info(_("Preset List Building"),
195 gx_i2a(plist.size()) + string(_(" presets found")));
196 if (!samevers && gx_preset_file.is_standard()) {
197 gx_modify_preset(0,0,false,true);
198 gx_system::recallState(gx_user_dir + gx_jack::client_instance + "_rc"); //FIXME
199 }
200 return true;
201 } catch (gx_system::JsonException& e) {
202 gx_system::gx_print_warning(gx_preset_file.get_parse_name().c_str(), _("parse error"));
203 return false;
204 }
205 }
206 if (gx_preset_file.is_standard()) {
207 gx_print_info(_("empty preset File "), gx_preset_file.get_display_name());
208 gx_empty_preset_file(gx_preset_file.get_path().c_str());
209 return true;
210 } else {
211 string msg = (boost::format(_("preset File %1% doesn't exist"))
212 % gx_preset_file.get_parse_name()).str();
213 gx_print_error(_("Load preset file"), msg);
214 gx_gui::gx_message_popup(msg.c_str());
215 return false;
216 }
179 // parse it if any
180 ifstream f(gx_preset_file.get_path().c_str());
181 if (f.good()) {
182 try {
183 JsonParser jp(f);
184 jp.next(JsonParser::begin_array);
185 int samevers = readHeader(jp);
186 while (jp.peek() == JsonParser::value_string) {
187 jp.next();
188 plist.push_back(jp.current_value());
189 jp.skip_object();
190 }
191 jp.next(JsonParser::end_array);
192 jp.next(JsonParser::end_token);
193 f.close();
194 // ---- how many did we get ?
195 gx_print_info(_("Preset List Building"),
196 gx_i2a(plist.size()) + string(_(" presets found")));
197 if (!samevers && gx_preset_file.is_standard()) {
198 gx_modify_preset(0 , 0, false, true);
199 gx_system::recallState(gx_user_dir + gx_jack::client_instance + "_rc"); // FIXME
200 }
201 return true;
202 } catch(gx_system::JsonException& e) {
203 gx_system::gx_print_warning(gx_preset_file.get_parse_name().c_str(), _("parse error"));
204 return false;
205 }
206 }
207 if (gx_preset_file.is_standard()) {
208 gx_print_info(_("empty preset File "), gx_preset_file.get_display_name());
209 gx_empty_preset_file(gx_preset_file.get_path().c_str());
210 return true;
211 } else {
212 string msg = (boost::format(_("preset File %1% doesn't exist"))
213 % gx_preset_file.get_parse_name()).str();
214 gx_print_error(_("Load preset file"), msg);
215 gx_gui::gx_message_popup(msg.c_str());
216 return false;
217 }
217218 }
218219
219220 // ----------- add new preset to menus
220 void gx_add_preset_to_menus(const string& presname)
221 {
222 for (int i = 0; i < GX_NUM_OF_PRESET_LISTS; i++)
223 gx_add_single_preset_menu_item(presname, i, preset_action_func[i]);
224 }
225
226 //---- add a single preset to a given preset menu
221 void gx_add_preset_to_menus(const string& presname) {
222 for (int i = 0; i < GX_NUM_OF_PRESET_LISTS; i++)
223 gx_add_single_preset_menu_item(presname, i, preset_action_func[i]);
224 }
225
226 // ---- add a single preset to a given preset menu
227227 void gx_add_single_preset_menu_item(const string& presname,
228228 const gint lindex,
229 GCallback func)
230 {
231 // menu
232 GtkWidget* menu = presmenu[lindex];
233
234 // index for keyboard shortcut (can take any list)
229 GCallback func) {
230 // menu
231 GtkWidget* menu = presmenu[lindex];
232
233 // index for keyboard shortcut (can take any list)
235234 vector<GtkMenuItem*>::iterator its;
236235 int pos = 0;
237 for (its = pm_list[lindex].begin() ; its != pm_list[lindex].end(); its++ )
238 {
236 for (its = pm_list[lindex].begin(); its != pm_list[lindex].end(); its++) {
239237 pos++;
240238 }
241239 pos += 1;
242240
243 // add small mnemonic
244 string name("_");
245 if (pos > 9) name = "";
246 name += gx_i2a(pos) + " ";
247 name += presname;
248
249 // GDK numbers
250 guint accel_key = GDK_1 + pos - 1;
251
252 // create item
253 GtkWidget* menuitem = gtk_menu_item_new_with_mnemonic (name.c_str());
254 g_signal_connect (GTK_OBJECT (menuitem), "activate",
255 G_CALLBACK (func),
256 NULL);
257
258 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
259
260 // get accel_path for menuitem
261 string acc_path = gx_get_accel_path(lindex);
262 acc_path += gx_i2a(accel_key);
263
264 if (pos < 10)
265 {
266 if (!gtk_accel_map_lookup_entry(acc_path.c_str(), NULL))
267 gtk_accel_map_add_entry(acc_path.c_str(), accel_key, list_mod[lindex]);
268
269 gtk_widget_set_accel_path(menuitem, acc_path.c_str(),
270 gx_gui::GxMainInterface::instance()->fAccelGroup);
271 }
272
273 its = pm_list[lindex].end();
274 // add a pointer to the menuitem to the preset menu list
275 pm_list[lindex].insert(its,GTK_MENU_ITEM(menuitem));
276 gtk_widget_show (menuitem);
277 }
278
279
280 //----- get the preset number by name from preset list
281 int gx_get_single_preset_menu_pos(const string& presname, const gint lindex)
282 {
241 // add small mnemonic
242 string name("_");
243 if (pos > 9) name = "";
244 name += gx_i2a(pos) + " ";
245 name += presname;
246
247 // GDK numbers
248 guint accel_key = GDK_1 + pos - 1;
249
250 // create item
251 GtkWidget* menuitem = gtk_menu_item_new_with_mnemonic(name.c_str());
252 g_signal_connect(GTK_OBJECT(menuitem), "activate",
253 G_CALLBACK(func),
254 NULL);
255
256 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
257
258 // get accel_path for menuitem
259 string acc_path = gx_get_accel_path(lindex);
260 acc_path += gx_i2a(accel_key);
261
262 if (pos < 10) {
263 if (!gtk_accel_map_lookup_entry(acc_path.c_str(), NULL))
264 gtk_accel_map_add_entry(acc_path.c_str(), accel_key, list_mod[lindex]);
265
266 gtk_widget_set_accel_path(menuitem, acc_path.c_str(),
267 gx_gui::GxMainInterface::instance()->fAccelGroup);
268 }
269
270 its = pm_list[lindex].end();
271 // add a pointer to the menuitem to the preset menu list
272 pm_list[lindex].insert(its, GTK_MENU_ITEM(menuitem));
273 gtk_widget_show(menuitem);
274 }
275
276
277 // ----- get the preset number by name from preset list
278 int gx_get_single_preset_menu_pos(const string& presname, const gint lindex) {
283279 vector<string>::iterator its;
284280 int pos = 0;
285 for (its = plist.begin() ; its != plist.end(); its++ )
286 {
281 for (its = plist.begin(); its != plist.end(); its++) {
287282 pos++;
288 if( presname == *its)
289 return pos;
290 }
291 return 0;
292 }
293
294 //----- get pointer to the menuitem
295 GtkMenuItem* const gx_get_preset_item_from_name(int lindex, const string& name)
296 {
283 if (presname == *its)
284 return pos;
285 }
286 return 0;
287 }
288
289 // ----- get pointer to the menuitem
290 GtkMenuItem* const gx_get_preset_item_from_name(int lindex, const string& name) {
297291 vector<string>::iterator its;
298292 vector<GtkMenuItem*>::iterator it = pm_list[lindex].begin();
299293 int pos = 0;
300 for (its = plist.begin() ; its != plist.end(); its++ )
301 {
294 for (its = plist.begin(); its != plist.end(); its++) {
302295 pos++;
303 if( name == *its)
304 return *it;
305 it++;
306 }
307 return NULL;
296 if (name == *its)
297 return *it;
298 it++;
299 }
300 return NULL;
308301 }
309302
310303 // ----------- update preset numbering in menus
311 void gx_refresh_preset_menus()
312 {
304 void gx_refresh_preset_menus() {
313305 for (int i = 0; i < GX_NUM_OF_PRESET_LISTS; i++) {
314306 vector<GtkMenuItem*>::iterator it = pm_list[i].begin();
315307 for (it = pm_list[i].begin(); it != pm_list[i].end(); it++) {
316 gtk_widget_destroy(GTK_WIDGET(*it));
308 gtk_widget_destroy(GTK_WIDGET(*it));
317309 }
318310 }
319311
320312 if (!gx_build_preset_list()) {
321 gx_print_warning(_("Load preset file"), _("selecting default preset bank"));
322 gx_preset_file.set_std_value();
323 gx_build_preset_list();
313 gx_print_warning(_("Load preset file"), _("selecting default preset bank"));
314 gx_preset_file.set_std_value();
315 gx_build_preset_list();
324316 }
325317 vector<string>::iterator its;
326318 for (its = plist.begin() ; its != plist.end(); its++) {
327 gx_add_preset_to_menus(*its);
319 gx_add_preset_to_menus(*its);
328320 }
329321 }
330322
331323 // ---------- load nth preset (return true if successful)
332 bool gx_nth_preset(unsigned char n)
333 {
334 // check that we do have presets
335 if (!pm_list[LOAD_PRESET_LIST].size())
336 {
337 gx_print_warning(_("Preset Switching"),
338 _("Preset list is empty, make some :)"));
339 return false;
340 }
324 bool gx_nth_preset(unsigned char n) {
325 // check that we do have presets
326 if (!pm_list[LOAD_PRESET_LIST].size()) {
327 gx_print_warning(_("Preset Switching"),
328 _("Preset list is empty, make some :)"));
329 return false;
330 }
341331 vector<GtkMenuItem*>::iterator it = pm_list[LOAD_PRESET_LIST].begin();
342 while (n > 0) {
343 it++;
344 if (it == pm_list[LOAD_PRESET_LIST].end())
345 return false;
346 n--;
347 }
348
349 // load the preset
350 gx_load_preset(*it, NULL);
351 return true;
332 while (n > 0) {
333 it++;
334 if (it == pm_list[LOAD_PRESET_LIST].end())
335 return false;
336 n--;
337 }
338
339 // load the preset
340 gx_load_preset(*it, NULL);
341 return true;
352342 }
353343
354344 // ---------- switch to next preset in queue
355 void gx_next_preset(GtkWidget* item, gpointer arg)
356 {
357 // check that we do have presets
358 if (!pm_list[LOAD_PRESET_LIST].size())
359 {
360 gx_print_warning(_("Preset Switching"),
361 _("Preset list is empty, make some :)"));
362 return;
363 }
364
365 // start from this element
366 vector<GtkMenuItem*>::iterator it = pm_list[LOAD_PRESET_LIST].begin();
367 if (setting_is_preset)
368 {
369 GtkMenuItem* const itemi =
370 gx_get_preset_item_from_name(LOAD_PRESET_LIST, gx_current_preset);
371 for (it = pm_list[LOAD_PRESET_LIST].begin() ; it != pm_list[LOAD_PRESET_LIST].end(); it++ )
372 {
373 if( itemi == *it)
345 void gx_next_preset(GtkWidget* item, gpointer arg) {
346 // check that we do have presets
347 if (!pm_list[LOAD_PRESET_LIST].size()) {
348 gx_print_warning(_("Preset Switching"),
349 _("Preset list is empty, make some :)"));
350 return;
351 }
352
353 // start from this element
354 vector<GtkMenuItem*>::iterator it = pm_list[LOAD_PRESET_LIST].begin();
355 if (setting_is_preset) {
356 GtkMenuItem* const itemi =
357 gx_get_preset_item_from_name(LOAD_PRESET_LIST, gx_current_preset);
358 for (it = pm_list[LOAD_PRESET_LIST].begin();
359 it != pm_list[LOAD_PRESET_LIST].end();it++ ) {
360 if (itemi == *it)
374361 break;
375362 }
376363 it++;
377 }
378 // check if we are on edge
379 if (it == pm_list[LOAD_PRESET_LIST].end())
380 it = pm_list[LOAD_PRESET_LIST].begin();
381
382 // load the preset
383 gx_load_preset(*it, NULL);
364 }
365 // check if we are on edge
366 if (it == pm_list[LOAD_PRESET_LIST].end())
367 it = pm_list[LOAD_PRESET_LIST].begin();
368
369 // load the preset
370 gx_load_preset(*it, NULL);
384371 }
385372
386373 // ---------- switch to next preset in queue
387 void gx_previous_preset(GtkWidget* item, gpointer arg)
388 {
374 void gx_previous_preset(GtkWidget* item, gpointer arg) {
389375 // check that we do have presets
390 if (!pm_list[LOAD_PRESET_LIST].size())
391 {
392 gx_print_warning(_("Preset Switching"),
393 _("Preset list is empty, make some :)"));
394 return;
395 }
396
397 // start from this element
398 vector<GtkMenuItem*>::iterator it = pm_list[LOAD_PRESET_LIST].end();
399 if (setting_is_preset)
400 {
401 GtkMenuItem* const itemi =
402 gx_get_preset_item_from_name(LOAD_PRESET_LIST, gx_current_preset);
403 for (it = pm_list[LOAD_PRESET_LIST].begin() ; it != pm_list[LOAD_PRESET_LIST].end(); it++ )
404 {
405 if( itemi == *it)
376 if (!pm_list[LOAD_PRESET_LIST].size()) {
377 gx_print_warning(_("Preset Switching"),
378 _("Preset list is empty, make some :)"));
379 return;
380 }
381
382 // start from this element
383 vector<GtkMenuItem*>::iterator it = pm_list[LOAD_PRESET_LIST].end();
384 if (setting_is_preset) {
385 GtkMenuItem* const itemi =
386 gx_get_preset_item_from_name(LOAD_PRESET_LIST, gx_current_preset);
387 for (it = pm_list[LOAD_PRESET_LIST].begin();
388 it != pm_list[LOAD_PRESET_LIST].end(); it++) {
389 if (itemi == *it)
406390 break;
407391 }
408 }
409
410 // check if we are on edge
411 if (it == pm_list[LOAD_PRESET_LIST].begin())
412 it = pm_list[LOAD_PRESET_LIST].end();
413
414 // decrement iterator and load preset
415 it--;
416
417 // load the preset
418 gx_load_preset(*it, NULL);
392 }
393
394 // check if we are on edge
395 if (it == pm_list[LOAD_PRESET_LIST].begin())
396 it = pm_list[LOAD_PRESET_LIST].end();
397
398 // decrement iterator and load preset
399 it--;
400
401 // load the preset
402 gx_load_preset(*it, NULL);
419403 }
420404
421405 // ----------
422 void gx_delete_active_preset_dialog(GtkWidget* item, gpointer arg)
423 {
424 if (!setting_is_preset || gx_current_preset.empty())
425 {
426 gx_print_warning(_("Deleting Active Preset"),
427 _("No active preset, this is the main setting"));
428 return;
429 }
430
431 // tmp store
432 string presname = gx_current_preset;
433
434 // call dialog
435 gx_delete_preset_dialog (NULL, NULL);
436
437 if (gx_current_preset.empty() && !setting_is_preset)
438 gx_print_info(_("Deleting Active Preset"),
439 string(_("Deleted preset ")) + presname +
440 string(_(", recalled main setting")));
441 }
442
443
444 //----preset deletion dialog
445 void gx_delete_preset_dialog (GtkMenuItem *menuitem, gpointer arg)
446 {
447 string presname = gx_current_preset;
448
449 string msg =_( " Are you sure you want to delete preset ");
450 msg += presname;
451 msg += " ?? ";
452
453 string title =_( "Deleting preset ");
454 title += presname;
455
456 //--- run dialog and check response
457 gint response =
458 gx_gui::gx_choice_dialog_without_entry (
459 title.c_str(), msg.c_str(),
460 _("Delete Preset"), _("Keep Preset"),
461 GTK_RESPONSE_YES, GTK_RESPONSE_CANCEL, GTK_RESPONSE_YES
462 );
463
464 // we are cancelling
465 if (response == GTK_RESPONSE_CANCEL)
466 {
467 gx_print_warning(_("Preset Deleting"),
468 string(_(" Deletion of preset ")) + presname +
469 string(_(" has been cancelled")));
470 return;
471 }
472
473 // we want to delete the bugger!
474 gx_delete_preset (menuitem, arg);
475 }
476
477 //----delete all presets dialog
478 void gx_delete_all_presets_dialog (GtkMenuItem *menuitem, gpointer arg)
479 {
480 //--- if no presets, then just pop up some info
481 if (pm_list[LOAD_PRESET_LIST].empty()) {
482 gx_print_warning(_("Delete All Presets Dialog"),
483 string(_("There is no presets to delete")));
484 return;
485 }
486
487 //--- run dialog and check response
488 gint response =
489 gx_gui::gx_choice_dialog_without_entry (
490 _("Deleting ALL Presets! "),
491 _(" Are you sure you want to delete ALL your cool presets ? "),
492 _("Yes, DO IT NOW!"), _("Maybe Later ..."),
493 GTK_RESPONSE_YES, GTK_RESPONSE_CANCEL, GTK_RESPONSE_YES
494 );
495
496 // we are cancelling
497 if (response == GTK_RESPONSE_CANCEL)
498 {
499 gx_print_warning(_("Delete All Presets Dialog"),
500 _("All Presets deletion has been cancelled"));
501 return;
502 }
503 // we want to delete all the buggers!
504 gx_delete_all_presets ();
505 }
506
507 //----delete all presets
508 void gx_delete_all_presets()
509 {
510 // this function will simply delete the preset file,
511 // clear the preset list and refresh the menus
512
513 // write empty preset file
514 ofstream f(gx_preset_file.get_path().c_str());
515 JsonWriter jw(f);
516 jw.begin_array();
517 writeHeader(jw);
518 jw.end_array(true);
519 jw.close();
520 f.close();
521
522 // clear list
523 gx_refresh_preset_menus();
524 gx_print_info(_("All Presets Deleting"), string(_("deleted ALL presets!")));
525 }
526
527 bool gx_load_preset_from_file(const char* presname)
528 {
529 ifstream ofile(gx_preset_file.get_path().c_str());
530 JsonParser jp(ofile);
531
532 try {
533 jp.next(JsonParser::begin_array);
534 int major, minor;
535 readHeader(jp, &major, &minor);
536
537 bool found = false;
538 while (jp.peek() != JsonParser::end_array) {
539 jp.next(JsonParser::value_string);
540 if (jp.current_value() == presname) {
541 found = true;
542 read_preset(jp, 0, major, minor);
543 return true;
544 } else {
545 jp.skip_object();
546 }
547 }
548 jp.next(JsonParser::end_array);
549 jp.next(JsonParser::end_token);
550 } catch (JsonException& e) {
551 gx_print_error(_("load preset"), _("invalid preset file: ") + gx_preset_file.get_parse_name());
552 }
553 return false;
554 }
555
556 //----preset deletion
557 void gx_delete_preset (GtkMenuItem* item, gpointer arg)
558 {
559
560 // delete it via interface
561 const string presname = gx_current_preset;
562
563 (void)gx_modify_preset(presname.c_str(), NULL, true);
564
565 // update menu
566 gx_refresh_preset_menus();
567
568 // recalling main setting
569 gx_recall_settings_file(); // FIXME (wrong when loaded with -f ?)
570
571 gx_print_warning(_("Preset Deleting"),
572 string(_("Deleted preset ")) +
573 presname + string(_(", recalled main setting")));
406 void gx_delete_active_preset_dialog(GtkWidget* item, gpointer arg) {
407 if (!setting_is_preset || gx_current_preset.empty()) {
408 gx_print_warning(_("Deleting Active Preset"),
409 _("No active preset, this is the main setting"));
410 return;
411 }
412
413 // tmp store
414 string presname = gx_current_preset;
415
416 // call dialog
417 gx_delete_preset_dialog(NULL, NULL);
418
419 if (gx_current_preset.empty() && !setting_is_preset)
420 gx_print_info(_("Deleting Active Preset"),
421 string(_("Deleted preset ")) + presname +
422 string(_(", recalled main setting")));
423 }
424
425
426 // ----preset deletion dialog
427 void gx_delete_preset_dialog(GtkMenuItem *menuitem, gpointer arg) {
428 string presname = gx_current_preset;
429
430 string msg = _(" Are you sure you want to delete preset ");
431 msg += presname;
432 msg += " ?? ";
433
434 string title =_("Deleting preset ");
435 title += presname;
436
437 // --- run dialog and check response
438 gint response =
439 gx_gui::gx_choice_dialog_without_entry(
440 title.c_str(), msg.c_str(),
441 _("Delete Preset"), _("Keep Preset"),
442 GTK_RESPONSE_YES, GTK_RESPONSE_CANCEL, GTK_RESPONSE_YES
443 );
444
445 // we are cancelling
446 if (response == GTK_RESPONSE_CANCEL) {
447 gx_print_warning(_("Preset Deleting"),
448 string(_(" Deletion of preset ")) + presname +
449 string(_(" has been cancelled")));
450 return;
451 }
452
453 // we want to delete the bugger!
454 gx_delete_preset(menuitem, arg);
455 }
456
457 // ----delete all presets dialog
458 void gx_delete_all_presets_dialog(GtkMenuItem *menuitem, gpointer arg) {
459 // --- if no presets, then just pop up some info
460 if (pm_list[LOAD_PRESET_LIST].empty()) {
461 gx_print_warning(_("Delete All Presets Dialog"),
462 string(_("There is no presets to delete")));
463 return;
464 }
465
466 // --- run dialog and check response
467 gint response =
468 gx_gui::gx_choice_dialog_without_entry(
469 _("Deleting ALL Presets! "),
470 _(" Are you sure you want to delete ALL your cool presets ? "),
471 _("Yes, DO IT NOW!"), _("Maybe Later ..."),
472 GTK_RESPONSE_YES, GTK_RESPONSE_CANCEL, GTK_RESPONSE_YES
473 );
474
475 // we are cancelling
476 if (response == GTK_RESPONSE_CANCEL) {
477 gx_print_warning(_("Delete All Presets Dialog"),
478 _("All Presets deletion has been cancelled"));
479 return;
480 }
481 // we want to delete all the buggers!
482 gx_delete_all_presets();
483 }
484
485 // ----delete all presets
486 void gx_delete_all_presets() {
487 // this function will simply delete the preset file,
488 // clear the preset list and refresh the menus
489
490 // write empty preset file
491 ofstream f(gx_preset_file.get_path().c_str());
492 JsonWriter jw(f);
493 jw.begin_array();
494 writeHeader(jw);
495 jw.end_array(true);
496 jw.close();
497 f.close();
498
499 // clear list
500 gx_refresh_preset_menus();
501 gx_print_info(_("All Presets Deleting"), string(_("deleted ALL presets!")));
502 }
503
504 bool gx_load_preset_from_file(const char* presname) {
505 ifstream ofile(gx_preset_file.get_path().c_str());
506 JsonParser jp(ofile);
507
508 try {
509 jp.next(JsonParser::begin_array);
510 int major, minor;
511 readHeader(jp, &major, &minor);
512
513 bool found = false;
514 while (jp.peek() != JsonParser::end_array) {
515 jp.next(JsonParser::value_string);
516 if (jp.current_value() == presname) {
517 found = true;
518 read_preset(jp, 0, major, minor);
519 return true;
520 } else {
521 jp.skip_object();
522 }
523 }
524 jp.next(JsonParser::end_array);
525 jp.next(JsonParser::end_token);
526 } catch(JsonException& e) {
527 gx_print_error(_("load preset"), _("invalid preset file: ")
528 + gx_preset_file.get_parse_name());
529 }
530 return false;
531 }
532
533 // ----preset deletion
534 void gx_delete_preset(GtkMenuItem* item, gpointer arg) {
535
536 // delete it via interface
537 const string presname = gx_current_preset;
538
539 (void)gx_modify_preset(presname.c_str(), NULL, true);
540
541 // update menu
542 gx_refresh_preset_menus();
543
544 // recalling main setting
545 gx_recall_settings_file(); // FIXME (wrong when loaded with -f ?)
546
547 gx_print_warning(_("Preset Deleting"),
548 string(_("Deleted preset ")) +
549 presname + string(_(", recalled main setting")));
574550 }
575551
576552 // ----------
577 void gx_rename_active_preset_dialog(GtkWidget* item, gpointer arg)
578 {
579 if (!setting_is_preset || gx_current_preset.empty())
580 {
581 gx_print_warning(_("Renaming Active Preset"),
582 _("This is the main setting, "
583 "load a preset first"));
584 return;
585 }
586
587 string presname = gx_current_preset;
588
589 // get current preset menu item
590 GtkMenuItem* const rnm_item =
591 gx_get_preset_item_from_name(RENAME_PRESET_LIST, presname);
592
593 // call delete dialog
594 if (rnm_item)
595 gx_rename_preset_dialog (rnm_item, NULL);
596
597 if (presname == gx_current_preset)
598 {
599 gx_print_warning(_("Renaming Active Preset"),
600 _("The preset name is unchanged"));
601 return;
602 }
603
604 if (!gx_current_preset.empty() && setting_is_preset)
605 gx_print_info(_("Renaming Active Preset"),
606 string(_("Renamed preset ")) + presname +
607 string(_(" to ")) + gx_current_preset);
608 }
609
610 static gboolean gx_convolver_restart(gpointer data)
611 {
553 void gx_rename_active_preset_dialog(GtkWidget* item, gpointer arg) {
554 if (!setting_is_preset || gx_current_preset.empty()) {
555 gx_print_warning(_("Renaming Active Preset"),
556 _("This is the main setting, "
557 "load a preset first"));
558 return;
559 }
560
561 string presname = gx_current_preset;
562
563 // get current preset menu item
564 GtkMenuItem* const rnm_item =
565 gx_get_preset_item_from_name(RENAME_PRESET_LIST, presname);
566
567 // call delete dialog
568 if (rnm_item)
569 gx_rename_preset_dialog(rnm_item, NULL);
570
571 if (presname == gx_current_preset) {
572 gx_print_warning(_("Renaming Active Preset"),
573 _("The preset name is unchanged"));
574 return;
575 }
576
577 if (!gx_current_preset.empty() && setting_is_preset)
578 gx_print_info(_("Renaming Active Preset"),
579 string(_("Renamed preset ")) + presname +
580 string(_(" to ")) + gx_current_preset);
581 }
582
583 static gboolean gx_convolver_restart(gpointer data) {
612584 gx_engine::conv.stop();
613585 while (gx_engine::conv.is_runnable()) gx_engine::conv.checkstate();
614586 gx_jconv::GxJConvSettings* jcset = gx_jconv::GxJConvSettings::instance();
615587 bool rc = gx_engine::conv.configure(
616 gx_jack::jack_bs, gx_jack::jack_sr, jcset->getFullIRPath(),
617 jcset->getGain(), jcset->getGain(), jcset->getDelay(), jcset->getDelay(),
618 jcset->getOffset(), jcset->getLength(), 0, 0, jcset->getGainline());
588 gx_jack::gxjack.jack_bs, gx_jack::gxjack.jack_sr, jcset->getFullIRPath(),
589 jcset->getGain(), jcset->getGain(), jcset->getDelay(), jcset->getDelay(),
590 jcset->getOffset(), jcset->getLength(), 0, 0, jcset->getGainline());
619591 if (!rc || !gx_engine::conv.start()) {
620592 gx_jconv::GxJConvSettings::checkbutton7 = 0;
621593 }
622594 return false;
623595 }
624596
625 static gboolean gx_rename_main_widget(gpointer data)
626 {
597 static gboolean gx_rename_main_widget(gpointer data) {
627598 // refresh main window name
628599 string title = string("gx_head ");
629 if(setting_is_factory){
630 title += gx_factory_preset;
600 if (setting_is_factory) {
601 title += gx_factory_preset;
631602 } else {
632 title += gx_current_preset;
633 }
634 gtk_window_set_title (GTK_WINDOW (gx_gui::fWindow), title.c_str());
635 // reload convolver settings widget
636 //gx_jconv::gx_reload_jcgui();
603 title += gx_current_preset;
604 }
605 gtk_window_set_title(GTK_WINDOW(gx_gui::gw.fWindow), title.c_str());
606 // reload convolver settings widget
607 // gx_jconv::gx_reload_jcgui();
637608 return false;
638609 }
639610
640 //----menu funktion load
641 void gx_load_preset (GtkMenuItem *menuitem, gpointer load_preset)
642 {
643 // check that we do have presets
644 if (!pm_list[LOAD_PRESET_LIST].size())
645 {
646 gx_print_warning(_("Preset Loading"),
647 _("Preset list is empty, make some :)"));
648 return;
649 }
650
651 // retrieve preset name
611 // ----menu funktion load
612 void gx_load_preset(GtkMenuItem *menuitem, gpointer load_preset) {
613 // check that we do have presets
614 if (!pm_list[LOAD_PRESET_LIST].size()) {
615 gx_print_warning(_("Preset Loading"),
616 _("Preset list is empty, make some :)"));
617 return;
618 }
619
620 // retrieve preset name
652621 vector<GtkMenuItem*>::iterator it = pm_list[LOAD_PRESET_LIST].begin();
653 vector<string>::iterator its = plist.begin() ;;
654 for (it = pm_list[LOAD_PRESET_LIST].begin() ; it != pm_list[LOAD_PRESET_LIST].end(); it++ )
655 {
656 if( menuitem == *it)
657 break;
658 its++;
659 }
660
661 string preset_name = *its;
662
663 // recall preset by name
664 // Note: the UI does not know anything about gx_head's directory stuff
665 // Need to pass it on
666 bool preset_ok = gx_load_preset_from_file(preset_name.c_str());
667
668 // check result
669 if (!preset_ok)
670 {
671 gx_print_error(_("Preset Loading"), string(_("Could not load preset ")) + preset_name);
672 return;
673 }
674
675 // print out info
676 gx_print_info(_("Preset Loading"), string(_("loaded preset ")) + preset_name);
677 setting_is_preset = true;
678 setting_is_factory = false;
679
680 gx_current_preset = preset_name;
681
682 gx_jconv::gx_reload_jcgui();
683
684 /* do some GUI stuff*/
685 g_idle_add(gx_rename_main_widget,NULL);
686
687 /* reset convolver buffer for preset change*/
688 if (gx_engine::conv.is_runnable() && gx_jconv::GxJConvSettings::checkbutton7 == 1) {
689 gx_engine::conv.stop();
690 gx_gui::g_threads[3] = g_idle_add_full(G_PRIORITY_HIGH_IDLE+20,gx_convolver_restart,NULL,NULL);
691 }
692
693 /* collect info for stage info display*/
694 gx_gui::show_patch_info = gx_get_single_preset_menu_pos(gx_current_preset, 0);
695 }
696
697 //---- funktion save
698 void gx_save_preset (const char* presname, bool expand_menu)
699 {
700 bool found = gx_modify_preset(presname);
701
702 // update preset menus if needed
703 if (expand_menu == found) {
704 assert(false);
705 }
706 if (expand_menu)
707 gx_add_preset_to_menus(string(presname));
622 vector<string>::iterator its = plist.begin();
623 for (it = pm_list[LOAD_PRESET_LIST].begin(); it != pm_list[LOAD_PRESET_LIST].end(); it++) {
624 if (menuitem == *it)
625 break;
626 its++;
627 }
628
629 string preset_name = *its;
630
631 // recall preset by name
632 // Note: the UI does not know anything about gx_head's directory stuff
633 // Need to pass it on
634 bool preset_ok = gx_load_preset_from_file(preset_name.c_str());
635
636 // check result
637 if (!preset_ok) {
638 gx_print_error(_("Preset Loading"), string(_("Could not load preset ")) + preset_name);
639 return;
640 }
641
642 // print out info
643 gx_print_info(_("Preset Loading"), string(_("loaded preset ")) + preset_name);
644 setting_is_preset = true;
645 setting_is_factory = false;
646
647 gx_current_preset = preset_name;
648
649 gx_jconv::gx_reload_jcgui();
650
651 /* do some GUI stuff*/
652 g_idle_add(gx_rename_main_widget, NULL);
653
654 /* reset convolver buffer for preset change*/
655 if (gx_engine::conv.is_runnable() && gx_jconv::GxJConvSettings::checkbutton7 == 1) {
656 gx_engine::conv.stop();
657 gx_gui::g_threads[3] = g_idle_add_full(G_PRIORITY_HIGH_IDLE+20,
658 gx_convolver_restart, NULL, NULL);
659 }
660
661 /* collect info for stage info display*/
662 gx_gui::show_patch_info = gx_get_single_preset_menu_pos(gx_current_preset, 0);
663 }
664
665 // ---- funktion save
666 void gx_save_preset(const char* presname, bool expand_menu) {
667 bool found = gx_modify_preset(presname);
668
669 // update preset menus if needed
670 if (expand_menu == found) {
671 assert(false);
672 }
673 if (expand_menu)
674 gx_add_preset_to_menus(string(presname));
708675
709676 gx_refresh_preset_menus();
710677
711 // refresh display
712 string ttle = string("gx_head ") + presname;
713 gtk_window_set_title (GTK_WINDOW (gx_gui::fWindow), (gchar*)ttle.c_str());
714
715 // we are now in a preset setting
716 setting_is_preset = true;
717 setting_is_factory = false;
718 gx_current_preset = presname;
719
720 gx_print_info(_("Preset Saving"), string(_("saved preset ")) + string(presname));
721 gx_jconv::gx_reload_jcgui(); //FIXME why reload after saving?
678 // refresh display
679 string ttle = string("gx_head ") + presname;
680 gtk_window_set_title(GTK_WINDOW(gx_gui::gw.fWindow), (gchar*)ttle.c_str()); // NOLINT
681
682 // we are now in a preset setting
683 setting_is_preset = true;
684 setting_is_factory = false;
685 gx_current_preset = presname;
686
687 gx_print_info(_("Preset Saving"), string(_("saved preset ")) + string(presname));
688 gx_jconv::gx_reload_jcgui(); // FIXME why reload after saving?
722689 }
723690
724691 ///------factory presets--------///
725692 // set factory preset file and path
726 void gx_set_factory_file(int i)
727 {
728 switch (i)
729 {
730 case 0:
731 gx_factory_preset_file.set_path(gx_system::gx_style_dir +"funkmuscle_rc");
732 break;
733 case 1:
734 gx_factory_preset_file.set_path(gx_system::gx_style_dir +"zettberlin_rc");
735 break;
736 case 2:
737 gx_factory_preset_file.set_path(gx_system::gx_style_dir +"dlp_ae_rc");
738 break;
739 }
740 }
741
742 bool gx_load_preset_from_factory(const char* presname, int i)
743 {
744 gx_set_factory_file(i);
745 ifstream ofile(gx_factory_preset_file.get_path().c_str());
746
747 JsonParser jp(ofile);
748
749 try {
750 jp.next(JsonParser::begin_array);
751 int major, minor;
752 readHeader(jp, &major, &minor);
753
754 bool found = false;
755 while (jp.peek() != JsonParser::end_array) {
756 jp.next(JsonParser::value_string);
757 if (jp.current_value() == presname) {
758 found = true;
759 read_preset(jp, 0, major, minor);
760 return true;
761 } else {
762 jp.skip_object();
763 }
764 }
765 jp.next(JsonParser::end_array);
766 jp.next(JsonParser::end_token);
767 } catch (JsonException& e) {
768 //gx_print_error(_("load preset"), _("invalid factory file: ") + factory_file.get_parse_name());
769 }
770
771 return false;
772 }
773
774 //----menu funktion load preset from factory
775 void gx_load_factory_preset (GtkMenuItem *menuitem, gpointer load_preset)
776 {
777 // retrieve preset name
778 int i = GPOINTER_TO_INT(load_preset);
693 void gx_set_factory_file(int i) {
694 switch (i) {
695 case 0:
696 gx_factory_preset_file.set_path(gx_system::gx_style_dir +"funkmuscle_rc");
697 break;
698 case 1:
699 gx_factory_preset_file.set_path(gx_system::gx_style_dir +"zettberlin_rc");
700 break;
701 case 2:
702 gx_factory_preset_file.set_path(gx_system::gx_style_dir +"dlp_ae_rc");
703 break;
704 }
705 }
706
707 bool gx_load_preset_from_factory(const char* presname, int i) {
708 gx_set_factory_file(i);
709 ifstream ofile(gx_factory_preset_file.get_path().c_str());
710
711 JsonParser jp(ofile);
712
713 try {
714 jp.next(JsonParser::begin_array);
715 int major, minor;
716 readHeader(jp, &major, &minor);
717
718 bool found = false;
719 while (jp.peek() != JsonParser::end_array) {
720 jp.next(JsonParser::value_string);
721 if (jp.current_value() == presname) {
722 found = true;
723 read_preset(jp, 0, major, minor);
724 return true;
725 } else {
726 jp.skip_object();
727 }
728 }
729 jp.next(JsonParser::end_array);
730 jp.next(JsonParser::end_token);
731 } catch(JsonException& e) {
732 // gx_print_error(_("load preset"), _("invalid factory file: ")
733 // + factory_file.get_parse_name());
734 }
735
736 return false;
737 }
738
739 // ----menu funktion load preset from factory
740 void gx_load_factory_preset(GtkMenuItem *menuitem, gpointer load_preset) {
741 // retrieve preset name
742 int i = GPOINTER_TO_INT(load_preset);
779743 vector<GtkMenuItem*>::iterator it = fpm_list[i].begin();
780 vector<string>::iterator its = fplist[i].begin() ;;
781 for (it = fpm_list[i].begin() ; it != fpm_list[i].end(); it++ )
782 {
783 if( menuitem == *it)
784 break;
785 its++;
786 }
787
788 string preset_name = *its;
789 // recall preset by name
790 // Note: the UI does not know anything about gx_head's directory stuff
791 // Need to pass it on
792 bool preset_ok = gx_load_preset_from_factory(preset_name.c_str(),i);
793
794 // check result
795 if (!preset_ok)
796 {
797 gx_print_error(_("Preset Loading"), string(_("Could not load preset ")) + preset_name);
798 return;
799 }
800
801 // print out info
802 gx_print_info(_("Preset Loading"), string(_("loaded preset ")) + preset_name);
803
804 gx_factory_preset = preset_name;
805 setting_is_factory = true;
806 gx_jconv::gx_reload_jcgui();
807
808 /* do some GUI stuff*/
809 g_idle_add(gx_rename_main_widget,NULL);
810
811 /* reset convolver buffer for preset change*/
812 if (gx_engine::conv.is_runnable() && gx_jconv::GxJConvSettings::checkbutton7 == 1) {
813 gx_engine::conv.stop();
814 gx_gui::g_threads[3] = g_idle_add_full(G_PRIORITY_HIGH_IDLE+20,gx_convolver_restart,NULL,NULL);
815 }
816
744 vector<string>::iterator its = fplist[i].begin();
745 for (it = fpm_list[i].begin(); it != fpm_list[i].end(); it++) {
746 if (menuitem == *it)
747 break;
748 its++;
749 }
750
751 string preset_name = *its;
752 // recall preset by name
753 // Note: the UI does not know anything about gx_head's directory stuff
754 // Need to pass it on
755 bool preset_ok = gx_load_preset_from_factory(preset_name.c_str(), i);
756
757 // check result
758 if (!preset_ok) {
759 gx_print_error(_("Preset Loading"), string(_("Could not load preset ")) + preset_name);
760 return;
761 }
762
763 // print out info
764 gx_print_info(_("Preset Loading"), string(_("loaded preset ")) + preset_name);
765
766 gx_factory_preset = preset_name;
767 setting_is_factory = true;
768 gx_jconv::gx_reload_jcgui();
769
770 /* do some GUI stuff*/
771 g_idle_add(gx_rename_main_widget, NULL);
772
773 /* reset convolver buffer for preset change*/
774 if (gx_engine::conv.is_runnable() && gx_jconv::GxJConvSettings::checkbutton7 == 1) {
775 gx_engine::conv.stop();
776 gx_gui::g_threads[3] = g_idle_add_full(G_PRIORITY_HIGH_IDLE+20,
777 gx_convolver_restart, NULL, NULL);
778 }
817779 }
818780
819781 // load the factory preset file
820 void gx_load_factory_file(int i)
821 {
822 // initialize list
823 fplist[i].clear();
824 // initialize menu pointer list
782 void gx_load_factory_file(int i) {
783 // initialize list
784 fplist[i].clear();
785 // initialize menu pointer list
825786 fpm_list[i].clear();
826787
827 gx_set_factory_file(i);
828 ifstream f(gx_factory_preset_file.get_path().c_str());
829
830 if (f.good()) {
831 JsonParser jp(f);
832 jp.next(JsonParser::begin_array);
833 readHeader(jp);
834 while (jp.peek() == JsonParser::value_string) {
835 jp.next();
836 fplist[i].push_back(jp.current_value());
837 jp.skip_object();
838 }
839 jp.next(JsonParser::end_array);
840 jp.next(JsonParser::end_token);
841 f.close();
842 }
843
788 gx_set_factory_file(i);
789 ifstream f(gx_factory_preset_file.get_path().c_str());
790
791 if (f.good()) {
792 JsonParser jp(f);
793 jp.next(JsonParser::begin_array);
794 readHeader(jp);
795 while (jp.peek() == JsonParser::value_string) {
796 jp.next();
797 fplist[i].push_back(jp.current_value());
798 jp.skip_object();
799 }
800 jp.next(JsonParser::end_array);
801 jp.next(JsonParser::end_token);
802 f.close();
803 }
804
844805 vector<string>::iterator it;
845806 for (it = fplist[i].begin() ; it != fplist[i].end(); it++) {
846 // menu
847 GtkWidget* menu = ffpresmenu[i];
848 vector<GtkMenuItem*>::iterator its;
849 // create item
850 string presna = *it;
851 GtkWidget* menuitem = gtk_menu_item_new_with_mnemonic (presna.c_str());
852 g_signal_connect (GTK_OBJECT (menuitem), "activate",
853 G_CALLBACK (gx_load_factory_preset), // FIXME LOAD FACTORY SETTINGS
854 GINT_TO_POINTER(i));
855
856 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
857 its = fpm_list[i].end();
858 // add a pointer to the menuitem to the preset menu list
859 fpm_list[i].insert(its,GTK_MENU_ITEM(menuitem));
860 gtk_widget_show (menuitem);
861 }
807 // menu
808 GtkWidget* menu = ffpresmenu[i];
809 vector<GtkMenuItem*>::iterator its;
810 // create item
811 string presna = *it;
812 GtkWidget* menuitem = gtk_menu_item_new_with_mnemonic(presna.c_str());
813 g_signal_connect(GTK_OBJECT(menuitem), "activate",
814 G_CALLBACK(gx_load_factory_preset), // FIXME LOAD FACTORY SETTINGS
815 GINT_TO_POINTER(i));
816
817 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
818 its = fpm_list[i].end();
819 // add a pointer to the menuitem to the preset menu list
820 fpm_list[i].insert(its, GTK_MENU_ITEM(menuitem));
821 gtk_widget_show(menuitem);
822 }
862823 }
863824
864825 ///------ user preset handling------///
865826 // load a preset file
866 void gx_recall_settings_file(const string *filename)
867 {
868 if (!filename) {
869 string fname = gx_user_dir + gx_jack::client_instance + "_rc";
870 gx_system::recallState(fname);
871 gx_jconv::gx_reload_jcgui();
872 gx_print_info(
873 _("Main Setting recalling"),
874 (boost::format(_("Called back main setting %1%")) % fname).str());
875 } else {
876 gx_system::recallState(*filename);
877 gx_print_info(
878 _("loading Settings file"),
879 (boost::format(_("loaded settings file %1%")) % *filename).str());
880 }
881 gtk_window_set_title(GTK_WINDOW(gx_gui::fWindow), gx_jack::client_instance.c_str());
882 setting_is_preset = false;
883 setting_is_factory = false;
884 gx_current_preset = "";
885 gx_gui::show_patch_info = 0;
827 void gx_recall_settings_file(const string *filename) {
828 if (!filename) {
829 string fname = gx_user_dir + gx_jack::client_instance + "_rc";
830 gx_system::recallState(fname);
831 gx_jconv::gx_reload_jcgui();
832 gx_print_info(
833 _("Main Setting recalling"),
834 (boost::format(_("Called back main setting %1%")) % fname).str());
835 } else {
836 gx_system::recallState(*filename);
837 gx_print_info(
838 _("loading Settings file"),
839 (boost::format(_("loaded settings file %1%")) % *filename).str());
840 }
841 gtk_window_set_title(GTK_WINDOW(gx_gui::gw.fWindow), gx_jack::client_instance.c_str());
842 setting_is_preset = false;
843 setting_is_factory = false;
844 gx_current_preset = "";
845 gx_gui::show_patch_info = 0;
886846 gx_refresh_preset_menus();
887847 }
888848
889849 // ----- select a external preset file
890 void gx_load_preset_file(const char* presname, bool expand_menu)
891 {
892 Gtk::FileChooserDialog file_chooser(
893 *Glib::wrap(GTK_WINDOW(gx_gui::fWindow)),
894 _("Select a preset *_rc file"),
895 Gtk::FILE_CHOOSER_ACTION_OPEN);
896 file_chooser.add_button(GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
897 file_chooser.add_button(GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT);
898 file_chooser.set_filename(gx_preset_file.get_path());
850 void gx_load_preset_file(const char* presname, bool expand_menu) {
851 Gtk::FileChooserDialog file_chooser(
852 *Glib::wrap(GTK_WINDOW(gx_gui::gw.fWindow)),
853 _("Select a preset *_rc file"),
854 Gtk::FILE_CHOOSER_ACTION_OPEN);
855 file_chooser.add_button(GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
856 file_chooser.add_button(GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT);
857 file_chooser.set_filename(gx_preset_file.get_path());
899858 file_chooser.set_show_hidden(true);
900859 file_chooser.set_select_multiple(false);
901860 Gtk::FileFilter filter;
902 filter.add_pattern("*_rc");
903 filter.set_name("*_rc");
904 file_chooser.add_filter(filter);
905 Gtk::FileFilter filter1;
906 filter1.add_pattern("*");
907 filter1.set_name("all");
908 file_chooser.add_filter(filter1);
861 filter.add_pattern("*_rc");
862 filter.set_name("*_rc");
863 file_chooser.add_filter(filter);
864 Gtk::FileFilter filter1;
865 filter1.add_pattern("*");
866 filter1.set_name("all");
867 file_chooser.add_filter(filter1);
909868 file_chooser.set_filter(filter);
910 if (file_chooser.run() == Gtk::RESPONSE_ACCEPT) {
911 gx_preset_file.set_path(file_chooser.get_filename());
912 setting_is_preset = false;
913 setting_is_factory = false;
914 gx_current_preset = "";
915 gx_gui::show_patch_info = 0;
916 gx_refresh_preset_menus();
869 if (file_chooser.run() == Gtk::RESPONSE_ACCEPT) {
870 gx_preset_file.set_path(file_chooser.get_filename());
871 setting_is_preset = false;
872 setting_is_factory = false;
873 gx_current_preset = "";
874 gx_gui::show_patch_info = 0;
875 gx_refresh_preset_menus();
917876 }
918877 }
919878
920879 // ----- export preset file
921 void gx_save_preset_file(const char* presname, bool expand_menu)
922 {
923 Gtk::FileChooserDialog file_chooser(
924 *Glib::wrap(GTK_WINDOW(gx_gui::fWindow)),
925 _("Save a preset *_rc File"),
926 Gtk::FILE_CHOOSER_ACTION_SAVE);
927 file_chooser.add_button(GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
928 file_chooser.add_button(GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT);
929 file_chooser.set_do_overwrite_confirmation(true);
880 void gx_save_preset_file(const char* presname, bool expand_menu) {
881 Gtk::FileChooserDialog file_chooser(
882 *Glib::wrap(GTK_WINDOW(gx_gui::gw.fWindow)),
883 _("Save a preset *_rc File"),
884 Gtk::FILE_CHOOSER_ACTION_SAVE);
885 file_chooser.add_button(GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
886 file_chooser.add_button(GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT);
887 file_chooser.set_do_overwrite_confirmation(true);
930888 file_chooser.set_show_hidden(true);
931889 Gtk::FileFilter filter;
932890 filter.add_pattern("*_rc");
936894 if (file_chooser.run() == Gtk::RESPONSE_ACCEPT) {
937895 string save_file = file_chooser.get_filename();
938896 int n = save_file.length() - 3;
939 if (!(n >= 0 && save_file.substr(n) == "_rc")) { //FIXME: use a real extension
940 save_file += "_rc";
897 if (!(n >= 0 && save_file.substr(n) == "_rc")) { // FIXME: use a real extension
898 save_file += "_rc";
941899 }
942900 try {
943 gx_preset_file.copy(save_file);
901 gx_preset_file.copy(save_file);
944902 } catch(const Glib::Exception& ex) {
945 gx_print_error(_("Export preset"), ex.what());
946 }
947 }
948 }
949
950 //----menu funktion save
951 void gx_save_oldpreset (GtkMenuItem *menuitem, gpointer arg)
952 {
953 guint save_active = GPOINTER_TO_UINT(arg);
954 string presname;
955 vector<string>::iterator its = plist.begin() ;
956
957 // are saving an active preset
958 if (save_active) {
959 if (gx_current_preset.empty()) {
960 gx_print_warning(_("Saving Active Preset"),
961 _("We are in main setting, load a preset first"));
962 return;
963 }
964 presname = gx_current_preset;
965
966 } else { // we are saving another preset from the menu
903 gx_print_error(_("Export preset"), ex.what());
904 }
905 }
906 }
907
908 // ----menu funktion save
909 void gx_save_oldpreset(GtkMenuItem *menuitem, gpointer arg) {
910 guint save_active = GPOINTER_TO_UINT(arg);
911 string presname;
912 vector<string>::iterator its = plist.begin();
913
914 // are saving an active preset
915 if (save_active) {
916 if (gx_current_preset.empty()) {
917 gx_print_warning(_("Saving Active Preset"),
918 _("We are in main setting, load a preset first"));
919 return;
920 }
921 presname = gx_current_preset;
922
923 } else { // we are saving another preset from the menu
967924
968925 vector<GtkMenuItem*>::iterator it;
969926
970 for (it = pm_list[SAVE_PRESET_LIST].begin() ; it != pm_list[SAVE_PRESET_LIST].end(); it++ ) {
971 if( menuitem == *it) {
972 break;
973 }
974 its++;
975 }
976 presname = *its;
977 }
978 gx_save_preset(presname.c_str(), false);
979 }
980
981 //----clean up preset name given by user
982 void gx_cleanup_preset_name(string& presname)
983 {
984 gx_nospace_in_name(presname, "-");
985 }
986
987 //----menu funktion save
988 void gx_save_newpreset (GtkEntry* entry)
989 {
990 string presname;
991 gx_gui::gx_get_text_entry(entry, presname);
992
993 // no text ?
994 if (presname.empty())
995 {
996 gx_print_error(_("Saving new preset"), _("no preset name given"));
997 return;
998 }
999
1000 // replace spaces by -
1001 gx_cleanup_preset_name(presname);
1002
1003 // is the name alrady taken ?
1004 vector<string>::iterator its;
927 for (it = pm_list[SAVE_PRESET_LIST].begin();
928 it != pm_list[SAVE_PRESET_LIST].end(); it++) {
929 if (menuitem == *it) {
930 break;
931 }
932 its++;
933 }
934 presname = *its;
935 }
936 gx_save_preset(presname.c_str(), false);
937 }
938
939 // ----clean up preset name given by user
940 void gx_cleanup_preset_name(string& presname) {
941 gx_nospace_in_name(presname, "-");
942 }
943
944 // ----menu funktion save
945 void gx_save_newpreset(GtkEntry* entry) {
946 string presname;
947 gx_gui::gx_get_text_entry(entry, presname);
948
949 // no text ?
950 if (presname.empty()) {
951 gx_print_error(_("Saving new preset"), _("no preset name given"));
952 return;
953 }
954
955 // replace spaces by -
956 gx_cleanup_preset_name(presname);
957
958 // is the name alrady taken ?
959 vector<string>::iterator its;
1005960 vector<GtkMenuItem*>::iterator it = pm_list[SAVE_PRESET_LIST].begin();
1006961
1007 for (its = plist.begin() ; its != plist.end(); its++ )
1008 {
1009 // found a match
1010 if (presname == *its)
1011 {
1012 gx_print_error(_("New Preset Saving"),
1013 string(_("preset name ")) +
1014 presname +
1015 string(_(" already in use, choose another one")));
1016 gx_save_newpreset_dialog(*it, NULL);
1017 return;
1018 }
1019 it++;
1020 }
1021
1022 // finally save to preset file
1023 gx_save_preset(presname.c_str(), true);
1024 gx_jconv::gx_reload_jcgui();
962 for (its = plist.begin(); its != plist.end(); its++) {
963 // found a match
964 if (presname == *its) {
965 gx_print_error(_("New Preset Saving"),
966 string(_("preset name ")) +
967 presname +
968 string(_(" already in use, choose another one")));
969 gx_save_newpreset_dialog(*it, NULL);
970 return;
971 }
972 it++;
973 }
974
975 // finally save to preset file
976 gx_save_preset(presname.c_str(), true);
977 gx_jconv::gx_reload_jcgui();
1025978 }
1026979
1027980 // read name for preset
1028 void gx_recall_main_setting(GtkMenuItem* item, gpointer)
1029 {
1030 gx_recall_settings_file(); // FIXME (wrong when loaded with -f ?)
981 void gx_recall_main_setting(GtkMenuItem* item, gpointer) {
982 gx_recall_settings_file(); // FIXME (wrong when loaded with -f ?)
1031983 }
1032984
1033985 // ----- save current setting as main setting
1034 void gx_save_main_setting(GtkMenuItem* item, gpointer arg)
1035 {
1036 if (! saveStateToFile(gx_user_dir + gx_jack::client_instance + "_rc")) {
1037 gx_print_error(_("Main Setting"),_("can't save main setting"));
1038 } else if (setting_is_preset) {
1039 gx_print_info(_("Main Setting"),
1040 _("Saved current preset into main setting"));
1041 } else {
1042 gx_print_info(_("Main Setting"), _("Saved main setting"));
1043 }
1044 gtk_window_set_title(GTK_WINDOW(gx_gui::fWindow), gx_jack::client_instance.c_str());
1045 setting_is_preset = false;
1046 setting_is_factory = false;
1047 gx_jconv::gx_reload_jcgui();
1048 }
1049
1050 //----menu function save new preset
1051 void gx_save_newpreset_dialog (GtkMenuItem *menuitem, gpointer save_preset)
1052 {
1053 // preset name to save
1054 string presname;
1055
1056 // running dialog and get response
1057 gint response =
1058 gx_gui::gx_choice_dialog_with_text_entry (
1059 _("Save new preset ... "),
1060 _("\n Please enter a valid preset name: \n"),
1061 _("Save Preset"), _("Cancel"),
1062 GTK_RESPONSE_YES, GTK_RESPONSE_CANCEL, GTK_RESPONSE_YES,
1063 G_CALLBACK(gx_save_newpreset)
1064 );
1065
1066 // check response
1067 if (response == GTK_RESPONSE_CANCEL)
1068 {
1069 gx_print_warning(_("Saving New Preset Dialog"),
1070 _(" Preset saving has been cancelled"));
1071 return;
1072 }
1073 }
1074
1075
1076 //----preset renaming
1077 void gx_rename_preset (GtkEntry* entry)
1078 {
1079 // rename preset
1080 string newname;
1081 gx_gui::gx_get_text_entry(entry, newname);
1082
1083 if (newname.empty())
1084 {
1085 gx_print_error(_("Preset Renaming"), _("no preset name given"));
1086 old_preset_name = "";
1087 return;
1088 }
1089
1090 // replace spaces by -
1091 gx_cleanup_preset_name(newname);
1092
1093 // get the UI to manipulate the preset file
1094 if (!gx_modify_preset(old_preset_name.c_str(), newname.c_str())) {
1095 gx_print_error(_("Preset Renaming"),
1096 string(_("Could not rename preset ")) + old_preset_name);
1097 old_preset_name = "";
1098 return;
1099 }
1100
1101 // if jconv file
1102 string jc_preset = gx_user_dir + string("jconv_") + old_preset_name + ".conf ";
1103 string jc_file = gx_user_dir + string("jconv_") + newname + ".conf ";
1104 string file_move = jc_preset + jc_file;
1105 (void)gx_system_call("mv", file_move.c_str(), true);
1106
1107 // refresh the menus
986 void gx_save_main_setting(GtkMenuItem* item, gpointer arg) {
987 if (!saveStateToFile(gx_user_dir + gx_jack::client_instance + "_rc")) {
988 gx_print_error(_("Main Setting"), _("can't save main setting"));
989 } else if (setting_is_preset) {
990 gx_print_info(_("Main Setting"),
991 _("Saved current preset into main setting"));
992 } else {
993 gx_print_info(_("Main Setting"), _("Saved main setting"));
994 }
995 gtk_window_set_title(GTK_WINDOW(gx_gui::gw.fWindow), gx_jack::client_instance.c_str());
996 setting_is_preset = false;
997 setting_is_factory = false;
998 gx_jconv::gx_reload_jcgui();
999 }
1000
1001 // ----menu function save new preset
1002 void gx_save_newpreset_dialog(GtkMenuItem *menuitem, gpointer save_preset) {
1003 // preset name to save
1004 string presname;
1005
1006 // running dialog and get response
1007 gint response =
1008 gx_gui::gx_choice_dialog_with_text_entry(
1009 _("Save new preset ... "),
1010 _("\n Please enter a valid preset name: \n"),
1011 _("Save Preset"), _("Cancel"),
1012 GTK_RESPONSE_YES, GTK_RESPONSE_CANCEL, GTK_RESPONSE_YES,
1013 G_CALLBACK(gx_save_newpreset)
1014 );
1015
1016 // check response
1017 if (response == GTK_RESPONSE_CANCEL) {
1018 gx_print_warning(_("Saving New Preset Dialog"),
1019 _(" Preset saving has been cancelled"));
1020 return;
1021 }
1022 }
1023
1024
1025 // ----preset renaming
1026 void gx_rename_preset(GtkEntry* entry) {
1027 // rename preset
1028 string newname;
1029 gx_gui::gx_get_text_entry(entry, newname);
1030
1031 if (newname.empty()) {
1032 gx_print_error(_("Preset Renaming"), _("no preset name given"));
1033 old_preset_name = "";
1034 return;
1035 }
1036
1037 // replace spaces by -
1038 gx_cleanup_preset_name(newname);
1039
1040 // get the UI to manipulate the preset file
1041 if (!gx_modify_preset(old_preset_name.c_str(), newname.c_str())) {
1042 gx_print_error(_("Preset Renaming"),
1043 string(_("Could not rename preset ")) + old_preset_name);
1044 old_preset_name = "";
1045 return;
1046 }
1047
1048 // if jconv file
1049 string jc_preset = gx_user_dir + string("jconv_") + old_preset_name + ".conf ";
1050 string jc_file = gx_user_dir + string("jconv_") + newname + ".conf ";
1051 string file_move = jc_preset + jc_file;
1052 (void)gx_system_call("mv", file_move.c_str(), true);
1053
1054 // refresh the menus
11081055 gx_refresh_preset_menus();
11091056
1110 if (setting_is_preset)
1111 {
1057 if (setting_is_preset) {
11121058 string jname = "gx_head ";
11131059 string title = jname + newname;
1114 gtk_window_set_title (GTK_WINDOW (gx_gui::fWindow), title.c_str());
1060 gtk_window_set_title(GTK_WINDOW(gx_gui::gw.fWindow), title.c_str());
11151061
11161062 gx_current_preset = newname;
11171063 }
1118 gx_jconv::gx_reload_jcgui();
1119 }
1120
1121 //----preset renaming dialog
1122 void gx_rename_preset_dialog (GtkMenuItem *menuitem, gpointer arg)
1123 {
1064 gx_jconv::gx_reload_jcgui();
1065 }
1066
1067 // ----preset renaming dialog
1068 void gx_rename_preset_dialog(GtkMenuItem *menuitem, gpointer arg) {
11241069 vector<string>::iterator its = plist.begin();
11251070 vector<GtkMenuItem*>::iterator it = pm_list[RENAME_PRESET_LIST].begin();
1126 for (it = pm_list[RENAME_PRESET_LIST].begin() ; it != pm_list[RENAME_PRESET_LIST].end(); it++ )
1127 {
1128 if( menuitem == *it)
1129 break;
1130 its++;
1131 }
1132
1133 static string title;
1134 if (menuitem)
1135 {
1136 title = _("Renaming preset ");
1137 title += *its;
1138 }
1071 for (it = pm_list[RENAME_PRESET_LIST].begin(); it != pm_list[RENAME_PRESET_LIST].end(); it++) {
1072 if ( menuitem == *it)
1073 break;
1074 its++;
1075 }
1076
1077 static string title;
1078 if (menuitem) {
1079 title = _("Renaming preset ");
1080 title += *its;
1081 }
11391082
11401083 old_preset_name = *its;
1141 // running dialog and get response
1142 gint response = gx_gui::gx_choice_dialog_with_text_entry (
1143 title.c_str(),
1144 _(" Please enter a valid preset name: "),
1145 _("Validate"), _("Cancel"),
1146 GTK_RESPONSE_YES, GTK_RESPONSE_CANCEL, GTK_RESPONSE_YES,
1147 G_CALLBACK(gx_rename_preset)
1148 );
1149
1150 if (response == GTK_RESPONSE_CANCEL)
1151 {
1152 gx_print_warning(_("Rename Preset Dialog"),
1153 _(" Preset renaming has been cancelled"));
1154 old_preset_name = "";
1155 return;
1156 }
1157 }
1158
1159 void init()
1160 {
1161 gx_preset_file.set_standard(gx_system::gx_user_dir + "gx_headpre_rc");
1162 //gx_factory_preset_file.set_standard(gx_system::gx_style_dir +"funkmuscle_rc");
1163
1164 gx_gui::parameter_map.insert(&gx_preset_file);
1165 //gx_gui::parameter_map.insert(&gx_factory_preset_file);
1166 }
1167
1084 // running dialog and get response
1085 gint response = gx_gui::gx_choice_dialog_with_text_entry(
1086 title.c_str(),
1087 _(" Please enter a valid preset name: "),
1088 _("Validate"), _("Cancel"),
1089 GTK_RESPONSE_YES, GTK_RESPONSE_CANCEL, GTK_RESPONSE_YES,
1090 G_CALLBACK(gx_rename_preset)
1091 );
1092
1093 if (response == GTK_RESPONSE_CANCEL) {
1094 gx_print_warning(_("Rename Preset Dialog"),
1095 _(" Preset renaming has been cancelled"));
1096 old_preset_name = "";
1097 return;
1098 }
1099 }
1100
1101 void init() {
1102 gx_preset_file.set_standard(gx_system::gx_user_dir + "gx_headpre_rc");
1103 // gx_factory_preset_file.set_standard(gx_system::gx_style_dir +"funkmuscle_rc");
1104
1105 gx_gui::parameter_map.insert(&gx_preset_file);
1106 // gx_gui::parameter_map.insert(&gx_factory_preset_file);
1107 }
11681108 /* ----------------------------------------------------------------*/
11691109 } /* end of gx_preset namespace */
00 /*
1 * Copyright (C) 2009-2010 Hermann Meyer, James Warden, Andreas Degert
1 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * --------------------------------------------------------------------------
1718 *
1819 *
00 /*
1 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
1 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * ---------------------------------------------------------------------------
1718 *
1819 * This file is a part ofthe gx_head interface builder
2324 */
2425
2526
26 #include "guitarix.h"
27 #include <glibmm/i18n.h>
28
29 //-------- the gx_head user interface build instruktions
27 #include "guitarix.h" // NOLINT
28
29 #include <glibmm/i18n.h> // NOLINT
30
31 // -------- the gx_head user interface build instruktions
3032
3133 namespace gx_gui {
32
33 void GxMainInterface::gx_build_stereo_rack()
34 {
35
36 openHorizontalTableBox("");
37 {
38 // add controllers without show them
39 openHorizontalhideBox("");
40 {
41 create_small_rackknob("jconv.balance");
42 create_small_rackknob("jconv.diff_delay");
43 create_small_rackknob("jconv.gain");
44 create_small_rackknob("jconv.wet_dry");
45 create_hslider("amp.balance", "balance");
46
47 }
48 closeBox();
49
50 //----- chorus
51 openHorizontalRestetBox(_("chorus"), &gx_engine::audio.posit8);
52 {
53 openVerticalBox(_("chorus"));
54 {
55
56 openHorizontalTableBox("");
57 {
58 openPaintBox1("");
59 {
60 create_switch_no_caption(sw_switchit, "chorus.on_off");
61 }
62 closeBox();
63
64 opensDialogBox("chorus.dialog", "chorus.on_off","RackBox_expose");
65 {
66
67 openVerticalBox("");
68 {
69 openHorizontalBox("");
70 {
71 create_small_rackknobr("chorus.level",_(" level "));
72 create_small_rackknob("chorus.delay",_(" delay "));
73 create_small_rackknob("chorus.depth",_(" depth "));
74 create_small_rackknob("chorus.freq",_(" freq "));
75 }
76 closeBox();
77 }
78 closeBox();
79 }
80 closeBox();
81
82 }
83 closeBox();
84 }
85 closeBox();
86 }
87 closeBox();
88 //end chorus
89
90 openHorizontalRestetBox(_("flanger"), &gx_engine::audio.posit9);
91 {
92 openVerticalBox(_("flanger"));
93 {
94
95 openHorizontalTableBox("");
96 {
97 openPaintBox1("");
98 {
99 create_switch_no_caption(sw_switchit, "flanger.on_off");
100 }
101 closeBox();
102 opensDialogBox("flanger.dialog", "flanger.on_off","RackBox_expose");
103 {
104
105 openHorizontalBox("");
106 {
107 openHorizontalBox("");
108 {
109 create_small_rackknobr("flanger.level",_(" level "));
110 }
111 closeBox();
112 openVerticalBox("");
113 {
114 openHorizontalBox("");
115 {
116 create_small_rackknob("flanger.feedback gain",_(" feedback "));
117 create_small_rackknob("flanger.depth",_(" depth "));
118 create_small_rackknob("flanger.flange delay",_(" delay "));
119 create_small_rackknob("flanger.flange delay offset",_(" delay offset"));
120 create_small_rackknob("flanger.LFO freq",_(" LFO "));
121
122 }
123 closeBox();
124 openSpaceBox("");
125 closeBox();
126 openHorizontalBox("");
127 {
128 openSpaceBox("");
129 closeBox();
130 create_selector("flanger.invert");
131 openSpaceBox("");
132 closeBox();
133 openSpaceBox("");
134 closeBox();
135 openSpaceBox("");
136 closeBox();
137 openSpaceBox("");
138 closeBox();
139 openSpaceBox("");
140 closeBox();
141 openSpaceBox("");
142 closeBox();
143 }
144 closeBox();
145 openFrameBox("");
146 closeBox();
147 }
148 closeBox();
149
150 }
151 closeBox();
152 }
153 closeBox();
154
155 }
156 closeBox();
157 }
158 closeBox();
159 }
160 closeBox();
161
162
163
164 openHorizontalRestetBox(_("phaser"), &gx_engine::audio.posit12);
165 {
166 openVerticalBox(_("phaser"));
167 {
168
169 openHorizontalTableBox("");
170 {
171 openPaintBox1("");
172 {
173 create_switch_no_caption(sw_switchit, "phaser.on_off");
174 }
175 closeBox();
176 opensDialogBox("phaser.dialog", "phaser.on_off","RackBox_expose");
177 {
178 openHorizontalBox("");
179 {
180 openHorizontalBox("");
181 {
182 create_small_rackknobr("phaser.level",_(" level "));
183 }
184 closeBox();
185 openVerticalBox("");
186 {
187 openHorizontalBox("");
188 {
189 create_small_rackknob("phaser.feedback gain",_(" feedback "));
190 create_small_rackknob("phaser.depth", _("depth"));
191 create_small_rackknob("phaser.Notch width", _("width"));
192 create_small_rackknob("phaser.NotchFreq", _("freq"));
193 create_small_rackknob("phaser.MaxNotch1Freq", _("max Hz"));
194 create_small_rackknob("phaser.MinNotch1Freq", _("min Hz"));
195 create_small_rackknob("phaser.Speed", _("speed"));
196 }
197 closeBox();
198 openSpaceBox("");
199 closeBox();
200 openHorizontalBox("");
201 {
202 openSpaceBox("");
203 closeBox();
204 create_selector("phaser.invert");
205 openSpaceBox("");
206 closeBox();
207 create_selector("phaser.VibratoMode");
208 openSpaceBox("");
209 closeBox();
210 openSpaceBox("");
211 closeBox();
212 openSpaceBox("");
213 closeBox();
214 openSpaceBox("");
215 closeBox();
216 openSpaceBox("");
217 closeBox();
218 }
219 closeBox();
220 openFrameBox("");
221 closeBox();
222 }
223 closeBox();
224 }
225 closeBox();
226 }
227 closeBox();
228 }
229 closeBox();
230 }
231 closeBox();
232 }
233 closeBox();
234
235 openHorizontalRestetBox(_("delay"), &gx_engine::audio.posit15);
236 {
237 openVerticalBox(_("delay"));
238 {
239
240 openHorizontalTableBox("");
241 {
242 openPaintBox1("");
243 {
244 create_switch_no_caption(sw_switchit, "stereodelay.on_off");
245 }
246 closeBox();
247 opensDialogBox("stereodelay.dialog", "stereodelay.on_off","RackBox_expose");
248 {
249
250 openVerticalBox("");
251 {
252 openHorizontalBox("");
253 {
254 create_small_rackknob("stereodelay.l_gain",_("left gain"));
255 create_small_rackknob("stereodelay.l_delay",_("left delay"));
256 openVerticalBox("");
257 {
258 create_small_rackknobr("stereodelay.LFO freq",_("LFO"));
259 openSpaceBox("");
260 closeBox();
261 create_selector("stereodelay.invert");
262 openFrameBox("");
263 closeBox();
264 }
265 closeBox();
266
267 create_small_rackknob("stereodelay.r_gain",_("right gain"));
268 create_small_rackknob("stereodelay.r_delay",_("right delay"));
269
270 }
271 closeBox();
272 }
273 closeBox();
274 }
275 closeBox();
276 }
277 closeBox();
278 }
279 closeBox();
280 }
281 closeBox();
282
283 openHorizontalRestetBox(_("echo"), &gx_engine::audio.posit16);
284 {
285 openVerticalBox(_("echo"));
286 {
287
288 openHorizontalTableBox("");
289 {
290 openPaintBox1("");
291 {
292 create_switch_no_caption(sw_switchit, "stereoecho.on_off");
293 }
294 closeBox();
295 opensDialogBox("stereoecho.dialog", "stereoecho.on_off","RackBox_expose");
296 {
297
298 openVerticalBox("");
299 {
300 openHorizontalBox("");
301 {
302 create_small_rackknob("stereoecho.percent_l",_("left %"));
303 create_small_rackknob("stereoecho.time_l",_("left time"));
304 create_small_rackknob("stereoecho.percent_r",_("right %"));
305 create_small_rackknob("stereoecho.time_r",_("right time"));
306
307 }
308 closeBox();
309 }
310 closeBox();
311 }
312 closeBox();
313 }
314 closeBox();
315 }
316 closeBox();
317 }
318 closeBox();
319
320 openHorizontalRestetBox(_("moog"), &gx_engine::audio.posit11);
321 {
322 openVerticalBox(_("moog"));
323 {
324
325 openHorizontalTableBox("");
326 {
327 openPaintBox1("");
328 {
329 create_switch_no_caption(sw_switchit, "moog.on_off");
330 }
331 closeBox();
332 opensDialogBox("moog.dialog", "moog.on_off","RackBox_expose");
333 {
334
335 openVerticalBox("");
336 {
337 openHorizontalTableBox("");
338 {
339 create_small_rackknob("moog.Q",_(" Q "));
340
341 create_small_rackknob("moog.fr",_(" Hz "));
342
343 }
344 closeBox();
345 }
346 closeBox();
347 }
348 closeBox();
349 }
350 closeBox();
351 }
352 closeBox();
353 }
354 closeBox();
355
356 openHorizontalRestetBox(_("amp"), &gx_engine::audio.posit19);
357 {
358 openVerticalBox(_("reamp"));
359 {
360
361 openHorizontalTableBox("");
362 {
363 openPaintBox1("");
364 {
365 create_switch_no_caption(sw_switchit, "ampmodul.on_off");
366 }
367 closeBox();
368 opensDialogBox("ampmodul.dialog", "ampmodul.on_off","RackBox_expose");
369 {
370
371 openVerticalBox("");
372 {
373 openHorizontalBox("");
374 {
375 openSpaceBox("");
376 closeBox();
377 create_small_rackknobr("ampmodul.feedbac",_("dry/feedback "));
378 create_small_rackknob("ampmodul.wet_dry",_("dry/wet"));
379 create_small_rackknob("ampmodul.level",_("level"));
380 create_small_rackknob("ampmodul.amp2.stage1.tube1",_("tube1"));
381 create_small_rackknob("ampmodul.amp2.stage2.tube2",_("tube2"));
382 create_small_rackknobr("ampmodul.feedback",_(" wet/feedback"));
383 openSpaceBox("");
384 closeBox();
385
386 }
387 closeBox();
388 }
389 closeBox();
390 }
391 closeBox();
392 }
393 closeBox();
394 }
395 closeBox();
396 }
397 closeBox();
398
399 openHorizontalRestetBox(_("tone"), &gx_engine::audio.posit20);
400 {
401 openVerticalBox(_("tone"));
402 {
403
404 openHorizontalTableBox("");
405 {
406 openPaintBox1("");
407 {
408 create_switch_no_caption(sw_switchit, "tonemodul.on_off");
409 }
410 closeBox();
411 opensDialogBox("tonemodul.dialog", "tonemodul.on_off","RackBox_expose");
412 {
413
414 openVerticalBox("");
415 {
416 openHorizontalBox("");
417 {
418 create_small_rackknob("tonemodul.Bass",_("bass"));
419 create_small_rackknob("tonemodul.Middle",_("middle"));
420 create_small_rackknob("tonemodul.Treble",_("treble"));
421 openSpaceBox("");
422 closeBox();
423 create_switch_no_caption(sw_switchit, "tonemodul.ON");
424 create_small_rackknob("tonemodul.sharper",_("sharp"));
425 }
426 closeBox();
427 }
428 closeBox();
429 }
430 closeBox();
431 }
432 closeBox();
433 }
434 closeBox();
435 }
436 closeBox();
437
438 openHorizontalhideBox1("");
439 {
440 create_hslider("amp.balance", "balance");
441 }
442 closeBox();
443
444 }
445 closeBox();
446
447 }
448
449 }
450
34
35 void GxMainInterface::gx_build_stereo_rack() {
36
37 openHorizontalTableBox("");
38 {
39 // add controllers without show them
40 openHorizontalhideBox("");
41 {
42 create_small_rackknob("jconv.balance");
43 create_small_rackknob("jconv.diff_delay");
44 create_small_rackknob("jconv.gain");
45 create_small_rackknob("jconv.wet_dry");
46 create_hslider("amp.balance", "balance");
47 }
48 closeBox();
49
50 // ----- chorus
51 openHorizontalRestetBox(_("chorus"), &gx_engine::audio.posit[8]);
52 {
53 openVerticalBox(_("chorus"));
54 {
55 openHorizontalTableBox("");
56 {
57 openPaintBox1("");
58 {
59 openHorizontalBox("");
60 {
61 openSpaceBox("");
62 closeBox();
63 create_switch_no_caption(sw_switchit, "chorus.on_off");
64 openSpaceBox("");
65 closeBox();
66 }
67 closeBox();
68 }
69 closeBox();
70
71 opensDialogBox("chorus.dialog", "chorus.on_off", "RackBox_expose");
72 {
73 openVerticalBox("");
74 {
75 openHorizontalBox("");
76 {
77 create_small_rackknobr("chorus.level", _(" level "));
78 create_small_rackknob("chorus.delay", _(" delay "));
79 create_small_rackknob("chorus.depth", _(" depth "));
80 create_small_rackknob("chorus.freq", _(" freq "));
81 }
82 closeBox();
83 }
84 closeBox();
85 }
86 closeBox();
87 }
88 closeBox();
89 }
90 closeBox();
91 }
92 closeBox();
93 // flanger
94 openHorizontalRestetBox(_("flanger"), &gx_engine::audio.posit[9]);
95 {
96 openVerticalBox(_("flanger"));
97 {
98 openHorizontalTableBox("");
99 {
100 openPaintBox1("");
101 {
102 openHorizontalBox("");
103 {
104 openSpaceBox("");
105 closeBox();
106 create_switch_no_caption(sw_switchit, "flanger.on_off");
107 openSpaceBox("");
108 closeBox();
109 }
110 closeBox();
111 }
112 closeBox();
113 opensDialogBox("flanger.dialog", "flanger.on_off", "RackBox_expose");
114 {
115 openHorizontalBox("");
116 {
117 openHorizontalBox("");
118 {
119 create_small_rackknobr("flanger.level", _(" level "));
120 }
121 closeBox();
122 openVerticalBox("");
123 {
124 openHorizontalBox("");
125 {
126 create_small_rackknob("flanger.feedback gain", _(" feedback "));
127 create_small_rackknob("flanger.depth", _(" depth "));
128 create_small_rackknob("flanger.flange delay", _(" delay "));
129 create_small_rackknob("flanger.flange delay offset", _(" delay offset"));
130 create_small_rackknob("flanger.LFO freq", _(" LFO "));
131 }
132 closeBox();
133 openSpaceBox("");
134 closeBox();
135 openHorizontalBox("");
136 {
137 openSpaceBox("");
138 closeBox();
139 create_selector("flanger.invert");
140 openSpaceBox("");
141 closeBox();
142 openSpaceBox("");
143 closeBox();
144 openSpaceBox("");
145 closeBox();
146 openSpaceBox("");
147 closeBox();
148 openSpaceBox("");
149 closeBox();
150 openSpaceBox("");
151 closeBox();
152 }
153 closeBox();
154 openFrameBox("");
155 closeBox();
156 }
157 closeBox();
158 }
159 closeBox();
160 }
161 closeBox();
162 }
163 closeBox();
164 }
165 closeBox();
166 }
167 closeBox();
168 // phaser
169 openHorizontalRestetBox(_("phaser"), &gx_engine::audio.posit[12]);
170 {
171 openVerticalBox(_("phaser"));
172 {
173 openHorizontalTableBox("");
174 {
175 openPaintBox1("");
176 {
177 openHorizontalBox("");
178 {
179 openSpaceBox("");
180 closeBox();
181 create_switch_no_caption(sw_switchit, "phaser.on_off");
182 openSpaceBox("");
183 closeBox();
184 }
185 closeBox();
186 }
187 closeBox();
188 opensDialogBox("phaser.dialog", "phaser.on_off", "RackBox_expose");
189 {
190 openHorizontalBox("");
191 {
192 openHorizontalBox("");
193 {
194 create_small_rackknobr("phaser.level", _(" level "));
195 }
196 closeBox();
197 openVerticalBox("");
198 {
199 openHorizontalBox("");
200 {
201 create_small_rackknob("phaser.feedback gain", _(" feedback "));
202 create_small_rackknob("phaser.depth", _("depth"));
203 create_small_rackknob("phaser.Notch width", _("width"));
204 create_small_rackknob("phaser.NotchFreq", _("freq"));
205 create_small_rackknob("phaser.MaxNotch1Freq", _("max Hz"));
206 create_small_rackknob("phaser.MinNotch1Freq", _("min Hz"));
207 create_small_rackknob("phaser.Speed", _("speed"));
208 }
209 closeBox();
210 openSpaceBox("");
211 closeBox();
212 openHorizontalBox("");
213 {
214 openSpaceBox("");
215 closeBox();
216 create_selector("phaser.invert");
217 openSpaceBox("");
218 closeBox();
219 create_selector("phaser.VibratoMode");
220 openSpaceBox("");
221 closeBox();
222 openSpaceBox("");
223 closeBox();
224 openSpaceBox("");
225 closeBox();
226 openSpaceBox("");
227 closeBox();
228 openSpaceBox("");
229 closeBox();
230 }
231 closeBox();
232 openFrameBox("");
233 closeBox();
234 }
235 closeBox();
236 }
237 closeBox();
238 }
239 closeBox();
240 }
241 closeBox();
242 }
243 closeBox();
244 }
245 closeBox();
246 // stereo delay
247 openHorizontalRestetBox(_("delay"), &gx_engine::audio.posit[15]);
248 {
249 openVerticalBox(_("delay"));
250 {
251 openHorizontalTableBox("");
252 {
253 openPaintBox1("");
254 {
255 openHorizontalBox("");
256 {
257 openSpaceBox("");
258 closeBox();
259 create_switch_no_caption(sw_switchit, "stereodelay.on_off");
260 openSpaceBox("");
261 closeBox();
262 }
263 closeBox();
264 }
265 closeBox();
266 opensDialogBox("stereodelay.dialog", "stereodelay.on_off", "RackBox_expose");
267 {
268
269 openVerticalBox("");
270 {
271 openHorizontalBox("");
272 {
273 create_small_rackknob("stereodelay.l_gain", _("left gain"));
274 create_small_rackknob("stereodelay.l_delay", _("left delay"));
275 openVerticalBox("");
276 {
277 create_small_rackknobr("stereodelay.LFO freq", _("LFO"));
278 openSpaceBox("");
279 closeBox();
280 create_selector("stereodelay.invert");
281 openFrameBox("");
282 closeBox();
283 }
284 closeBox();
285 create_small_rackknob("stereodelay.r_gain", _("right gain"));
286 create_small_rackknob("stereodelay.r_delay", _("right delay"));
287 }
288 closeBox();
289 }
290 closeBox();
291 }
292 closeBox();
293 }
294 closeBox();
295 }
296 closeBox();
297 }
298 closeBox();
299 // echo
300 openHorizontalRestetBox(_("echo"), &gx_engine::audio.posit[16]);
301 {
302 openVerticalBox(_("echo"));
303 {
304 openHorizontalTableBox("");
305 {
306 openPaintBox1("");
307 {
308 openHorizontalBox("");
309 {
310 openSpaceBox("");
311 closeBox();
312 create_switch_no_caption(sw_switchit, "stereoecho.on_off");
313 openSpaceBox("");
314 closeBox();
315 }
316 closeBox();
317 }
318 closeBox();
319 opensDialogBox("stereoecho.dialog", "stereoecho.on_off", "RackBox_expose");
320 {
321 openVerticalBox("");
322 {
323 openHorizontalBox("");
324 {
325 create_small_rackknob("stereoecho.percent_l", _("left %"));
326 create_small_rackknob("stereoecho.time_l", _("left time"));
327 create_small_rackknob("stereoecho.percent_r", _("right %"));
328 create_small_rackknob("stereoecho.time_r", _("right time"));
329 }
330 closeBox();
331 }
332 closeBox();
333 }
334 closeBox();
335 }
336 closeBox();
337 }
338 closeBox();
339 }
340 closeBox();
341 // moog filter
342 openHorizontalRestetBox(_("moog"), &gx_engine::audio.posit[11]);
343 {
344 openVerticalBox(_("moog"));
345 {
346 openHorizontalTableBox("");
347 {
348 openPaintBox1("");
349 {
350 openHorizontalBox("");
351 {
352 openSpaceBox("");
353 closeBox();
354 create_switch_no_caption(sw_switchit, "moog.on_off");
355 openSpaceBox("");
356 closeBox();
357 }
358 closeBox();
359 }
360 closeBox();
361 opensDialogBox("moog.dialog", "moog.on_off", "RackBox_expose");
362 {
363 openVerticalBox("");
364 {
365 openHorizontalTableBox("");
366 {
367 create_small_rackknob("moog.Q", _(" Q "));
368 create_small_rackknob("moog.fr", _(" Hz "));
369 }
370 closeBox();
371 }
372 closeBox();
373 }
374 closeBox();
375 }
376 closeBox();
377 }
378 closeBox();
379 }
380 closeBox();
381 // postamp
382 openHorizontalRestetBox(_("amp"), &gx_engine::audio.posit[19]);
383 {
384 openVerticalBox(_("postamp"));
385 {
386 openHorizontalTableBox("");
387 {
388 openPaintBox1("");
389 {
390 openHorizontalBox("");
391 {
392 openSpaceBox("");
393 closeBox();
394 create_switch_no_caption(sw_switchit, "ampmodul.on_off");
395 openSpaceBox("");
396 closeBox();
397 }
398 closeBox();
399 }
400 closeBox();
401 opensDialogBox("ampmodul.dialog", "ampmodul.on_off", "RackBox_expose");
402 {
403 openVerticalBox("");
404 {
405 openHorizontalBox("");
406 {
407 openSpaceBox("");
408 closeBox();
409 create_small_rackknobr("ampmodul.feedbac", _("dry/feedback "));
410 create_small_rackknob("ampmodul.wet_dry", _("dry/wet"));
411 create_small_rackknob("ampmodul.level", _("level"));
412 create_small_rackknob("ampmodul.amp2.stage1.tube1", _("tube1"));
413 create_small_rackknob("ampmodul.amp2.stage2.tube2", _("tube2"));
414 create_small_rackknobr("ampmodul.feedback", _(" wet/feedback"));
415 openSpaceBox("");
416 closeBox();
417 }
418 closeBox();
419 }
420 closeBox();
421 }
422 closeBox();
423 }
424 closeBox();
425 }
426 closeBox();
427 }
428 closeBox();
429 // 3 band eq
430 openHorizontalRestetBox(_("tone"), &gx_engine::audio.posit[20]);
431 {
432 openVerticalBox(_("tone"));
433 {
434 openHorizontalTableBox("");
435 {
436 openPaintBox1("");
437 {
438 openHorizontalBox("");
439 {
440 openSpaceBox("");
441 closeBox();
442 create_switch_no_caption(sw_switchit, "tonemodul.on_off");
443 openSpaceBox("");
444 closeBox();
445 }
446 closeBox();
447 }
448 closeBox();
449 opensDialogBox("tonemodul.dialog", "tonemodul.on_off", "RackBox_expose");
450 {
451 openVerticalBox("");
452 {
453 openHorizontalBox("");
454 {
455 create_small_rackknob("tonemodul.Bass", _("bass"));
456 create_small_rackknob("tonemodul.Middle", _("middle"));
457 create_small_rackknob("tonemodul.Treble", _("treble"));
458 openSpaceBox("");
459 closeBox();
460 create_switch_no_caption(sw_switchit, "tonemodul.ON");
461 create_small_rackknob("tonemodul.sharper", _("sharp"));
462 }
463 closeBox();
464 }
465 closeBox();
466 }
467 closeBox();
468 }
469 closeBox();
470 }
471 closeBox();
472 }
473 closeBox();
474 openHorizontalhideBox1("");
475 {
476 create_hslider("amp.balance", "balance");
477 }
478 closeBox();
479 }
480 closeBox();
481 } // close stereo rack
482 } // end namespace gx_gui
483
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * ---------------------------------------------------------------------------
1718 *
1819 * This is the gx_head system interface
2021 * ----------------------------------------------------------------------------
2122 */
2223
23 #include <sys/stat.h>
24 #include <cstring>
25 #include <fstream>
26 #include <iomanip>
27 #include <jack/jack.h>
28 #include <glibmm/optioncontext.h>
29 #include "guitarix.h"
30 #include <glibmm/i18n.h>
31
32 using namespace gx_engine;
33 using namespace gx_jack;
34 using namespace gx_preset;
35
36 namespace gx_system
37 {
24 #include "guitarix.h" // NOLINT
25
26 #include <sys/stat.h> // NOLINT
27 #include <jack/jack.h> // NOLINT
28 #include <glibmm/optioncontext.h> // NOLINT
29 #include <glibmm/i18n.h> // NOLINT
30
31 #include <cstring> // NOLINT
32 #include <string> // NOLINT
33 #include <fstream> // NOLINT
34 #include <iostream> // NOLINT
35 #include <iomanip> // NOLINT
36 #include <list> // NOLINT
37 #include <vector> // NOLINT
38
39 namespace gx_system {
3840
3941 /****************************************************************
4042 ** JsonWriter
4143 */
4244
43 JsonWriter::JsonWriter(ostream &o):
44 os(o),
45 first(true),
46 deferred_nl(false),
47 indent("")
48 {
49 }
50
51 inline void JsonWriter::komma()
52 {
53 if (first)
54 first = false;
55 else if (!deferred_nl)
56 os << ", ";
57 else
58 os << ",";
59 flush();
60 }
61
62 inline void JsonWriter::space()
63 {
64 if (first)
65 first = false;
66 else if (!deferred_nl)
67 os << " ";
68 flush();
69 }
70
71 inline void JsonWriter::iplus()
72 {
73 indent += " ";
74 }
75
76 inline void JsonWriter::iminus()
77 {
78 if (!indent.empty()) {
79 indent = indent.substr(0, indent.size() - 2);
80 }
81 }
82
83 void JsonWriter::write(float v, bool nl)
84 {
85 komma();
86 os << v;
87 snl(nl);
88 }
89
90 void JsonWriter::write(double v, bool nl)
91 {
92 komma();
93 os << v;
94 snl(nl);
95 }
96
97 void JsonWriter::write(int i, bool nl)
98 {
99 komma();
100 os << i;
101 snl(nl);
102 }
103
104 void JsonWriter::write(unsigned int i, bool nl)
105 {
106 komma();
107 os << i;
108 snl(nl);
109 }
110
111 void JsonWriter::write_lit(string s, bool nl)
112 {
113 komma();
114 os << s;
115 snl(nl);
116 }
117
118 void JsonWriter::write(const char* p, bool nl)
119 {
120 komma();
121 os << '"';
122 while (*p) {
123 switch (*p) {
124 case '\\': case '"': os << '\\'; break;
125 case '\b': os << '\\'; os << 'b'; continue;
126 case '\f': os << '\\'; os << 'f'; continue;
127 case '\n': os << '\\'; os << 'n'; continue;
128 case '\r': os << '\\'; os << 'r'; continue;
129 case '\t': os << '\\'; os << 't'; continue;
130 }
131 os << *p++;
132 }
133 os << '"';
134 snl(nl);
135 }
136
137 void JsonWriter::begin_object(bool nl)
138 {
139 komma();
140 os << '{';
141 snl(nl);
142 first = true;
143 iplus();
144 }
145
146 void JsonWriter::end_object(bool nl)
147 {
148 iminus();
149 flush();
150 os << '}';
151 snl(nl);
152 }
153
154 void JsonWriter::begin_array(bool nl)
155 {
156 komma();
157 os << '[';
158 snl(nl);
159 first = true;
160 iplus();
161 }
162
163 void JsonWriter::end_array(bool nl)
164 {
165 iminus();
166 flush();
167 first = false;
168 os << ']';
169 snl(nl);
170 }
171
172 void JsonWriter::write_key(const char* p, bool nl)
173 {
174 write(p, nl);
175 os << ": ";
176 first = true;
177 }
178
179 void JsonWriter::write_key(string p, bool nl)
180 {
181 write(p, nl);
182 os << ": ";
183 first = true;
45 JsonWriter::JsonWriter(ostream &o)
46 : os(o),
47 first(true),
48 deferred_nl(false),
49 indent("") {}
50
51 inline void JsonWriter::komma() {
52 if (first)
53 first = false;
54 else if (!deferred_nl)
55 os << ", ";
56 else
57 os << ",";
58 flush();
59 }
60
61 inline void JsonWriter::space() {
62 if (first)
63 first = false;
64 else if (!deferred_nl)
65 os << " ";
66 flush();
67 }
68
69 inline void JsonWriter::iplus() {
70 indent += " ";
71 }
72
73 inline void JsonWriter::iminus() {
74 if (!indent.empty()) {
75 indent = indent.substr(0, indent.size() - 2);
76 }
77 }
78
79 void JsonWriter::write(float v, bool nl) {
80 komma();
81 os << v;
82 snl(nl);
83 }
84
85 void JsonWriter::write(double v, bool nl) {
86 komma();
87 os << v;
88 snl(nl);
89 }
90
91 void JsonWriter::write(int i, bool nl) {
92 komma();
93 os << i;
94 snl(nl);
95 }
96
97 void JsonWriter::write(unsigned int i, bool nl) {
98 komma();
99 os << i;
100 snl(nl);
101 }
102
103 void JsonWriter::write_lit(string s, bool nl) {
104 komma();
105 os << s;
106 snl(nl);
107 }
108
109 void JsonWriter::write(const char* p, bool nl) {
110 komma();
111 os << '"';
112 while (*p) {
113 switch (*p) {
114 case '\\': case '"': os << '\\'; break;
115 case '\b': os << '\\'; os << 'b'; continue; // NOLINT
116 case '\f': os << '\\'; os << 'f'; continue; // NOLINT
117 case '\n': os << '\\'; os << 'n'; continue; // NOLINT
118 case '\r': os << '\\'; os << 'r'; continue; // NOLINT
119 case '\t': os << '\\'; os << 't'; continue; // NOLINT
120 }
121 os << *p++;
122 }
123 os << '"';
124 snl(nl);
125 }
126
127 void JsonWriter::begin_object(bool nl) {
128 komma();
129 os << '{';
130 snl(nl);
131 first = true;
132 iplus();
133 }
134
135 void JsonWriter::end_object(bool nl) {
136 iminus();
137 flush();
138 os << '}';
139 snl(nl);
140 }
141
142 void JsonWriter::begin_array(bool nl) {
143 komma();
144 os << '[';
145 snl(nl);
146 first = true;
147 iplus();
148 }
149
150 void JsonWriter::end_array(bool nl) {
151 iminus();
152 flush();
153 first = false;
154 os << ']';
155 snl(nl);
156 }
157
158 void JsonWriter::write_key(const char* p, bool nl) {
159 write(p, nl);
160 os << ": ";
161 first = true;
162 }
163
164 void JsonWriter::write_key(string p, bool nl) {
165 write(p, nl);
166 os << ": ";
167 first = true;
184168 }
185169
186170 // called before output of next element
187 void JsonWriter::flush()
188 {
189 if (deferred_nl) {
190 os << endl;
191 deferred_nl = false;
192 os << indent;
193 }
171 void JsonWriter::flush() {
172 if (deferred_nl) {
173 os << endl;
174 deferred_nl = false;
175 os << indent;
176 }
194177 }
195178
196179
199182 */
200183
201184 const char* JsonParser::token_names[] = {
202 "no_token", "end_token", "begin_object", "end_object",
203 "begin_array", "end_array", "value_string", "value_number",
204 "value_key" };
205
206 JsonException::JsonException(const char* desc)
207 {
208 what_str = string("Json parse error: ") + desc;
209 }
210
211 JsonParser::JsonParser(istream& i):
212 is(i),
213 depth(0),
214 cur_tok(no_token),
215 nl(false),
216 next_depth(0),
217 next_tok(no_token)
218 {
219 }
220
221 void JsonParser::throw_unexpected(token expect)
222 {
223 ostringstream b;
224 b << "unexpected token: " << token_names[cur_tok]
225 << " (expected: " << token_names[expect] << ")"
226 << endl;
227 throw JsonException(b.str().c_str());
228 }
229
230 const char* unicode2utf8(unsigned int input)
231 {
232 const int maskbits = 0x3F;
233 const int maskbyte = 0x80;
234 const int mask2bytes = 0xC0;
235 const int mask3bytes = 0xE0;
236 static char result[4];
237 int n = 0;
238 // 0xxxxxxx
239 if (input < 0x80) {
240 result[n++] = (char)input;
241 }
242 // 110xxxxx 10xxxxxx
243 else if (input < 0x800) {
244 result[n++] = ((char)(mask2bytes | (input >> 6)));
245 result[n++] = ((char)(maskbyte | (input & maskbits)));
246 }
247 // 1110xxxx 10xxxxxx 10xxxxxx
248 else {
249 result[n++] = ((char)(mask3bytes | (input >> 12)));
250 result[n++] = ((char)(maskbyte | ((input >> 6) & maskbits)));
251 result[n++] = ((char)(maskbyte | (input & maskbits)));
252 }
253 result[n++] = '\0';
254 return result;
255 }
256
257 const char* JsonParser::readcode()
258 {
259 int code = 0;
260 for (int i = 0; i < 4; i++) {
261 int n = is.get();
262 if (!is.good())
263 throw JsonException("eof");
264 if ('0' <= n && n <= '9')
265 n = n - '0';
266 else
267 n = 10 + (toupper(n) - 'A');
268 code = code * 16 + n;
269 }
270 return unicode2utf8(code);
271 }
272
273 string JsonParser::readstring()
274 {
275 ostringstream os("");
276 char c;
277 do {
278 is.get(c);
279 if (!is.good())
280 return "";
281 if (c == '\\') {
282 is.get(c);
283 if (!is.good())
284 return "";
285 switch (c) {
286 case 'b': os << '\b'; break;
287 case 'f': os << '\f'; break;
288 case 'n': os << '\n'; break;
289 case 'r': os << '\r'; break;
290 case 't': os << '\t'; break;
291 case 'u': os << readcode(); break;
292 default: is.get(c); os << c; break;
293 }
294 }
295 else if (c == '"')
296 return os.str();
297 else
298 os << c;
299 } while (true);
300 }
301
302 string JsonParser::readnumber(char c)
303 {
304 ostringstream os("");
305 do {
306 os << c;
307 c = is.peek();
308 switch (c) {
309 case '+': case '-': case '0': case '1': case '2': case '3': case '4':
310 case '5': case '6': case '7': case '8': case '9': case 'e': case 'E':
311 case '.':
312 break;
313 default:
314 return os.str();
315 }
316 is.get(c);
317 } while (is.good());
318 return "";
319 }
320
321 void JsonParser::read_next()
322 {
323 if (next_tok == end_token)
324 return;
325 if (next_tok != no_token and next_depth == 0) {
326 next_tok = end_token;
327 return;
328 }
329 char c;
330 nl = false;
331 while (true) {
332 do {
333 is.get(c);
334 if (!is.good())
335 throw JsonException("eof");
336 if (c == '\n')
337 nl = true;
338 } while (c == ' ' || c == '\t' || c == '\r' || c == '\n');
339 switch (c) {
340 case '[': next_tok = begin_array; next_depth++; break;
341
342 case ']': next_tok = end_array; next_depth--; break;
343
344 case '{': next_tok = begin_object; next_depth++; break;
345
346 case '}': next_tok = end_object; next_depth--; break;
347
348 case ',': continue;
349
350 case '"':
351 next_str = readstring();
352 is >> c;
353 if (!is.good())
354 throw JsonException("eof");
355 if (c == ':')
356 next_tok = value_key;
357 else {
358 is.unget();
359 next_tok = value_string;
360 }
361 break;
362
363 case '-': case '0': case '1': case '2': case '3': case '4':
364 case '5': case '6': case '7': case '8': case '9':
365 next_str = readnumber(c);
366 next_tok = value_number;
367 break;
368
369 default:
370 throw JsonException("bad token");
371 }
372 break;
373 }
374 }
375
376 JsonParser::token JsonParser::next(token expect)
377 {
378 if (cur_tok != end_token) {
379 if (next_tok == no_token)
380 read_next();
381 depth = next_depth;
382 cur_tok = next_tok;
383 str = next_str;
384 if (next_tok != end_token)
385 read_next();
386 }
387 if (expect != no_token)
388 check_expect(expect);
389 return cur_tok;
390 }
391
392
393 void JsonParser::copy_object(JsonWriter& jw)
394 {
395 int curdepth = depth;
396 do {
397 switch (next()) {
398 case begin_object:
399 jw.begin_object(nl);
400 break;
401 case end_object:
402 jw.end_object(nl);
403 break;
404 case begin_array:
405 jw.begin_array(nl);
406 break;
407 case end_array:
408 jw.end_array(nl);
409 break;
410 case value_string:
411 jw.write(current_value(),nl);
412 break;
413 case value_number:
414 jw.write_lit(current_value(),nl);
415 break;
416 case value_key:
417 jw.write_key(current_value().c_str(),nl);
418 break;
419 default:
420 throw JsonException("unexpected token");
421 }
422 } while (curdepth != depth);
423 }
424
425 void JsonParser::skip_object()
426 {
427 int curdepth = depth;
428 do {
429 if (next() == end_token) {
430 throw JsonException("unexpected eof");
431 }
432 } while (curdepth != depth);
185 "no_token", "end_token", "begin_object", "end_object",
186 "begin_array", "end_array", "value_string", "value_number",
187 "value_key" };
188
189 JsonException::JsonException(const char* desc) {
190 what_str = string("Json parse error: ") + desc;
191 }
192
193 JsonParser::JsonParser(istream& i)
194 : is(i),
195 depth(0),
196 cur_tok(no_token),
197 nl(false),
198 next_depth(0),
199 next_tok(no_token) {}
200
201 void JsonParser::throw_unexpected(token expect) {
202 ostringstream b;
203 b << "unexpected token: " << token_names[cur_tok]
204 << " (expected: " << token_names[expect] << ")"
205 << endl;
206 throw JsonException(b.str().c_str());
207 }
208
209 const char* unicode2utf8(unsigned int input) {
210 const int maskbits = 0x3F;
211 const int maskbyte = 0x80;
212 const int mask2bytes = 0xC0;
213 const int mask3bytes = 0xE0;
214 static char result[4];
215 int n = 0;
216 // 0xxxxxxx
217 if (input < 0x80) {
218 result[n++] = static_cast<char>(input);
219
220 // 110xxxxx 10xxxxxx
221 } else if (input < 0x800) {
222 result[n++] = (static_cast<char>(mask2bytes | (input >> 6)));
223 result[n++] = (static_cast<char>(maskbyte | (input & maskbits)));
224
225 // 1110xxxx 10xxxxxx 10xxxxxx
226 } else {
227 result[n++] = (static_cast<char>(mask3bytes | (input >> 12)));
228 result[n++] = (static_cast<char>(maskbyte | ((input >> 6) & maskbits)));
229 result[n++] = (static_cast<char>(maskbyte | (input & maskbits)));
230 }
231 result[n++] = '\0';
232 return result;
233 }
234
235 const char* JsonParser::readcode() {
236 int code = 0;
237 for (int i = 0; i < 4; i++) {
238 int n = is.get();
239 if (!is.good())
240 throw JsonException("eof");
241 if ('0' <= n && n <= '9')
242 n = n - '0';
243 else
244 n = 10 + (toupper(n) - 'A');
245 code = code * 16 + n;
246 }
247 return unicode2utf8(code);
248 }
249
250 string JsonParser::readstring() {
251 ostringstream os("");
252 char c;
253 do {
254 is.get(c);
255 if (!is.good())
256 return "";
257 if (c == '\\') {
258 is.get(c);
259 if (!is.good())
260 return "";
261 switch (c) {
262 case 'b': os << '\b'; break;
263 case 'f': os << '\f'; break;
264 case 'n': os << '\n'; break;
265 case 'r': os << '\r'; break;
266 case 't': os << '\t'; break;
267 case 'u': os << readcode(); break;
268 default: is.get(c); os << c; break;
269 }
270 } else if (c == '"') {
271 return os.str();
272 } else {
273 os << c;
274 }
275 } while (true);
276 }
277
278 string JsonParser::readnumber(char c) {
279 ostringstream os("");
280 do {
281 os << c;
282 c = is.peek();
283 switch (c) {
284 case '+': case '-': case '0': case '1': case '2': case '3': case '4':
285 case '5': case '6': case '7': case '8': case '9': case 'e': case 'E':
286 case '.':
287 break;
288 default:
289 return os.str();
290 }
291 is.get(c);
292 } while (is.good());
293 return "";
294 }
295
296 void JsonParser::read_next() {
297 if (next_tok == end_token)
298 return;
299 if (next_tok != no_token and next_depth == 0) {
300 next_tok = end_token;
301 return;
302 }
303 char c;
304 nl = false;
305 while (true) {
306 do {
307 is.get(c);
308 if (!is.good())
309 throw JsonException("eof");
310 if (c == '\n')
311 nl = true;
312 } while (c == ' ' || c == '\t' || c == '\r' || c == '\n');
313 switch (c) {
314 case '[': next_tok = begin_array; next_depth++; break;
315
316 case ']': next_tok = end_array; next_depth--; break;
317
318 case '{': next_tok = begin_object; next_depth++; break;
319
320 case '}': next_tok = end_object; next_depth--; break;
321
322 case ',': continue;
323
324 case '"':
325 next_str = readstring();
326 is >> c;
327 if (!is.good())
328 throw JsonException("eof");
329 if (c == ':') {
330 next_tok = value_key;
331 } else {
332 is.unget();
333 next_tok = value_string;
334 }
335 break;
336
337 case '-': case '0': case '1': case '2': case '3': case '4':
338 case '5': case '6': case '7': case '8': case '9':
339 next_str = readnumber(c);
340 next_tok = value_number;
341 break;
342
343 default:
344 throw JsonException("bad token");
345 }
346 break;
347 }
348 }
349
350 JsonParser::token JsonParser::next(token expect) {
351 if (cur_tok != end_token) {
352 if (next_tok == no_token)
353 read_next();
354 depth = next_depth;
355 cur_tok = next_tok;
356 str = next_str;
357 if (next_tok != end_token)
358 read_next();
359 }
360 if (expect != no_token)
361 check_expect(expect);
362 return cur_tok;
363 }
364
365
366 void JsonParser::copy_object(JsonWriter& jw) {
367 int curdepth = depth;
368 do {
369 switch (next()) {
370 case begin_object:
371 jw.begin_object(nl);
372 break;
373 case end_object:
374 jw.end_object(nl);
375 break;
376 case begin_array:
377 jw.begin_array(nl);
378 break;
379 case end_array:
380 jw.end_array(nl);
381 break;
382 case value_string:
383 jw.write(current_value(), nl);
384 break;
385 case value_number:
386 jw.write_lit(current_value(), nl);
387 break;
388 case value_key:
389 jw.write_key(current_value().c_str(), nl);
390 break;
391 default:
392 throw JsonException("unexpected token");
393 }
394 } while (curdepth != depth);
395 }
396
397 void JsonParser::skip_object() {
398 int curdepth = depth;
399 do {
400 if (next() == end_token) {
401 throw JsonException("unexpected eof");
402 }
403 } while (curdepth != depth);
433404 }
434405
435406
437408 ** loading of saving application data
438409 */
439410
440 static void write_parameters(JsonWriter &w, bool preset)
441 {
442 w.begin_object(true);
443 for (gx_gui::ParamMap::iterator i = gx_gui::parameter_map.begin(); i != gx_gui::parameter_map.end(); i++) {
444 gx_gui::Parameter *param = i->second;
445 if ((preset and param->isInPreset()) or (!preset and !param->isInPreset())) {
446 param->writeJSON(w);
447 w.newline();
448 }
449 }
450 w.end_object(true);
451 }
452
453 static void read_parameters(JsonParser &jp, gx_gui::paramlist& plist, bool preset)
454 {
455 jp.next(JsonParser::begin_object);
456 do {
457 jp.next(JsonParser::value_key);
458 if (!gx_gui::parameter_map.hasId(jp.current_value())) {
459 gx_print_warning(_("recall settings"), _("unknown parameter: ")+jp.current_value());
460 jp.skip_object();
461 continue;
462 }
463 gx_gui::Parameter& param = gx_gui::parameter_map[jp.current_value()];
464 if (!preset and param.isInPreset()) {
465 gx_print_warning(_("recall settings"), _("preset-parameter ")+param.id()+_(" in settings"));
466 jp.skip_object();
467 continue;
468 } else if (preset and !param.isInPreset()) {
469 gx_print_warning(_("recall settings"), _("non preset-parameter ")+param.id()+_(" in preset"));
470 jp.skip_object();
471 continue;
472 }
473 param.readJSON_value(jp);
474 plist.push_back(&param);
475 } while (jp.peek() == JsonParser::value_key);
476 jp.next(JsonParser::end_object);
477 }
478
479 void write_preset(JsonWriter &w, bool write_midi, bool force_midi)
480 {
481 w.begin_object(true);
482 w.write_key("engine");
483 write_parameters(w, true);
484 w.write_key("jconv");
485 gx_jconv::GxJConvSettings::instance()->writeJSON(w);
486 if (force_midi || (write_midi && gx_gui::parameter_map["system.midi_in_preset"].getSwitch().get())) {
487 w.write_key("midi_controller");
488 gx_gui::controller_map.writeJSON(w);
489 }
490 w.newline();
491 w.end_object(true);
492 }
493
494 void fixup_parameters(int major, int minor)
495 {
496 assert(gx_gui::parameter_map.hasId("jconv.wet_dry"));
497 if (major == majorversion && minor == minorversion) {
498 return;
499 }
500 if (major == 1 && minor < 2) {
501 if (gx_gui::parameter_map.hasId("jconv.wet_dry")) {
502 gx_gui::Parameter& p = gx_gui::parameter_map["jconv.wet_dry"];
503 if (p.isFloat()) {
504 p.getFloat().convert_from_range(-1,1);
505 }
506 }
507 }
508 }
509
510 void read_preset(JsonParser &jp, bool *has_midi, int major, int minor)
511 {
512 gx_gui::paramlist plist;
513 if (has_midi) {
514 *has_midi = false;
515 }
516 gx_gui::MidiControllerList::controller_array *m = 0;
517 jp.next(JsonParser::begin_object);
518 do {
519 jp.next(JsonParser::value_key);
520 if (jp.current_value() == "engine") {
521 read_parameters(jp, plist, true);
522 } else if (jp.current_value() == "jconv") {
523 *gx_jconv::GxJConvSettings::instance() = gx_jconv::GxJConvSettings(jp);
524 } else if (jp.current_value() == "midi_controller") {
525 if (has_midi || gx_gui::parameter_map["system.midi_in_preset"].getSwitch().get()) {
526 m = new gx_gui::MidiControllerList::controller_array(gx_gui::MidiControllerList::controller_array_size);
527 gx_gui::controller_map.readJSON(jp, *m);
528 if (has_midi) {
529 *has_midi = true;
530 }
531 } else {
532 jp.skip_object();
533 }
534 } else {
535 gx_print_warning(_("recall settings"),
536 _("unknown preset section: ") + jp.current_value());
537 }
538 } while (jp.peek() == JsonParser::value_key);
539 jp.next(JsonParser::end_object);
540 gx_gui::controller_map.remove_controlled_parameters(plist, m);
541 fixup_parameters(major,minor);
542 for (gx_gui::paramlist::iterator i = plist.begin(); i != plist.end(); i++) {
543 (*i)->setJSON_value();
544 }
545 if (m) {
546 gx_gui::controller_map.set_controller_array(*m);
547 delete m;
548 }
549 }
550
551 void writeHeader(JsonWriter& jw)
552 {
553 jw.write("gx_head_file_version");
554 jw.begin_array();
555 jw.write(majorversion); // major format version
556 jw.write(minorversion); // minor format version
557 jw.write(GX_VERSION);
558 jw.end_array(true);
559 }
560
561 bool readHeader(JsonParser& jp, int *major, int *minor)
562 {
563 jp.next(JsonParser::value_string);
564 if (jp.current_value() != "gx_head_file_version") {
565 throw JsonException("invalid gx_head file header");
566 }
567 jp.next(JsonParser::begin_array);
568 jp.next(JsonParser::value_number);
569 int m = jp.current_value_int();
570 if (major) {
571 *major = m;
572 }
573 jp.next(JsonParser::value_number); // minorversion
574 int n = jp.current_value_int();
575 if (minor) {
576 *minor = n;
577 }
578 jp.next(JsonParser::value_string); // gx_head version
579 jp.next(JsonParser::end_array);
580 return m == majorversion && n == minorversion;
581 }
582
583 static void write_jack_port_connections(JsonWriter& w, const char *key, jack_port_t *port)
584 {
585 w.write_key(key);
586 w.begin_array();
587 const char** pl = jack_port_get_connections(port);
588 if (pl) {
589 for (const char **p = pl; *p; p++) {
590 w.write(*p);
591 }
592 free(pl);
593 }
594 w.end_array(true);
595 }
596
597 void write_jack_connections(JsonWriter& w)
598 {
599 w.begin_object(true);
600 write_jack_port_connections(w, "input", input_ports[0]);
601 write_jack_port_connections(w, "output1", output_ports[2]);
602 write_jack_port_connections(w, "output2", output_ports[3]);
603 write_jack_port_connections(w, "midi_input", midi_input_port);
604 write_jack_port_connections(w, "midi_output", midi_output_ports);
605 write_jack_port_connections(w, "insert_out", output_ports[0]);
606 write_jack_port_connections(w, "insert_in", input_ports[1]);
607 w.end_object(true);
411 static void write_parameters(JsonWriter &w, bool preset) {
412 w.begin_object(true);
413 for (gx_gui::ParamMap::iterator i = gx_gui::parameter_map.begin();
414 i != gx_gui::parameter_map.end(); i++) {
415 gx_gui::Parameter *param = i->second;
416 if ((preset and param->isInPreset()) or(!preset and !param->isInPreset())) {
417 param->writeJSON(w);
418 w.newline();
419 }
420 }
421 w.end_object(true);
422 }
423
424 static void read_parameters(JsonParser &jp, gx_gui::paramlist& plist, bool preset) {
425 jp.next(JsonParser::begin_object);
426 do {
427 jp.next(JsonParser::value_key);
428 if (!gx_gui::parameter_map.hasId(jp.current_value())) {
429 gx_print_warning(_("recall settings"),
430 _("unknown parameter: ")+jp.current_value());
431 jp.skip_object();
432 continue;
433 }
434 gx_gui::Parameter& param = gx_gui::parameter_map[jp.current_value()];
435 if (!preset and param.isInPreset()) {
436 gx_print_warning(_("recall settings"),
437 _("preset-parameter ")+param.id()+_(" in settings"));
438 jp.skip_object();
439 continue;
440 } else if (preset and !param.isInPreset()) {
441 gx_print_warning(_("recall settings"),
442 _("non preset-parameter ")+param.id()+_(" in preset"));
443 jp.skip_object();
444 continue;
445 }
446 param.readJSON_value(jp);
447 plist.push_back(&param);
448 } while (jp.peek() == JsonParser::value_key);
449 jp.next(JsonParser::end_object);
450 }
451
452 void write_preset(JsonWriter &w, bool write_midi, bool force_midi) {
453 w.begin_object(true);
454 w.write_key("engine");
455 write_parameters(w, true);
456 w.write_key("jconv");
457 gx_jconv::GxJConvSettings::instance()->writeJSON(w);
458 if (force_midi || (write_midi &&
459 gx_gui::parameter_map["system.midi_in_preset"].getSwitch().get())) {
460 w.write_key("midi_controller");
461 gx_gui::controller_map.writeJSON(w);
462 }
463 w.newline();
464 w.end_object(true);
465 }
466
467 void fixup_parameters(int major, int minor) {
468 assert(gx_gui::parameter_map.hasId("jconv.wet_dry"));
469 if (major == majorversion && minor == minorversion) {
470 return;
471 }
472 if (major == 1 && minor < 2) {
473 if (gx_gui::parameter_map.hasId("jconv.wet_dry")) {
474 gx_gui::Parameter& p = gx_gui::parameter_map["jconv.wet_dry"];
475 if (p.isFloat()) {
476 p.getFloat().convert_from_range(-1, 1);
477 }
478 }
479 }
480 }
481
482 void read_preset(JsonParser &jp, bool *has_midi, int major, int minor) {
483 gx_gui::paramlist plist;
484 if (has_midi) {
485 *has_midi = false;
486 }
487 gx_gui::MidiControllerList::controller_array *m = 0;
488 jp.next(JsonParser::begin_object);
489 do {
490 jp.next(JsonParser::value_key);
491 if (jp.current_value() == "engine") {
492 read_parameters(jp, plist, true);
493 } else if (jp.current_value() == "jconv") {
494 *gx_jconv::GxJConvSettings::instance() = gx_jconv::GxJConvSettings(jp);
495 } else if (jp.current_value() == "midi_controller") {
496 if (has_midi || gx_gui::parameter_map["system.midi_in_preset"].getSwitch().get()) {
497 m = new gx_gui::MidiControllerList::controller_array
498 (gx_gui::MidiControllerList::controller_array_size);
499 gx_gui::controller_map.readJSON(jp, *m);
500 if (has_midi) {
501 *has_midi = true;
502 }
503 } else {
504 jp.skip_object();
505 }
506 } else {
507 gx_print_warning(_("recall settings"),
508 _("unknown preset section: ") + jp.current_value());
509 }
510 } while (jp.peek() == JsonParser::value_key);
511 jp.next(JsonParser::end_object);
512 gx_gui::controller_map.remove_controlled_parameters(plist, m);
513 fixup_parameters(major, minor);
514 for (gx_gui::paramlist::iterator i = plist.begin(); i != plist.end(); i++) {
515 (*i)->setJSON_value();
516 }
517 if (m) {
518 gx_gui::controller_map.set_controller_array(*m);
519 delete m;
520 }
521 }
522
523 void writeHeader(JsonWriter& jw) {
524 jw.write("gx_head_file_version");
525 jw.begin_array();
526 jw.write(majorversion); // major format version
527 jw.write(minorversion); // minor format version
528 jw.write(GX_VERSION);
529 jw.end_array(true);
530 }
531
532 bool readHeader(JsonParser& jp, int *major, int *minor) {
533 jp.next(JsonParser::value_string);
534 if (jp.current_value() != "gx_head_file_version") {
535 throw JsonException("invalid gx_head file header");
536 }
537 jp.next(JsonParser::begin_array);
538 jp.next(JsonParser::value_number);
539 int m = jp.current_value_int();
540 if (major) {
541 *major = m;
542 }
543 jp.next(JsonParser::value_number); // minorversion
544 int n = jp.current_value_int();
545 if (minor) {
546 *minor = n;
547 }
548 jp.next(JsonParser::value_string); // gx_head version
549 jp.next(JsonParser::end_array);
550 return m == majorversion && n == minorversion;
551 }
552
553 static void write_jack_port_connections(JsonWriter& w, const char *key, jack_port_t *port) {
554 w.write_key(key);
555 w.begin_array();
556 const char** pl = jack_port_get_connections(port);
557 if (pl) {
558 for (const char **p = pl; *p; p++) {
559 w.write(*p);
560 }
561 free(pl);
562 }
563 w.end_array(true);
564 }
565
566 void write_jack_connections(JsonWriter& w) {
567 w.begin_object(true);
568 write_jack_port_connections(w, "input", gx_jack::gxjack.input_ports[0]);
569 write_jack_port_connections(w, "output1", gx_jack::gxjack.output_ports[2]);
570 write_jack_port_connections(w, "output2", gx_jack::gxjack.output_ports[3]);
571 write_jack_port_connections(w, "midi_input", gx_jack::gxjack.midi_input_port);
572 write_jack_port_connections(w, "midi_output", gx_jack::gxjack.midi_output_ports);
573 write_jack_port_connections(w, "insert_out", gx_jack::gxjack.output_ports[0]);
574 write_jack_port_connections(w, "insert_in", gx_jack::gxjack.input_ports[1]);
575 w.end_object(true);
608576 }
609577
610578 // -- save state including current preset data
611 bool saveStateToFile( const string &filename )
612 {
613 gx_print_info( _("wrinting to "), filename.c_str() );
614 string tmpfile = filename + "_tmp";
615 ofstream f(tmpfile.c_str());
616 JsonWriter w(f);
617
618 w.begin_array();
619 writeHeader(w);
620
621 w.write("settings");
622 write_parameters(w, false);
623
624 w.write("midi_controller");
625 gx_gui::controller_map.writeJSON(w);
626
627 w.write("midi_ctrl_names");
628 gx_gui::midi_std_ctr.writeJSON(w);
629
630 w.write("current_preset");
631 write_preset(w, false);
632
633 w.write("jack_connections");
634 write_jack_connections(w);
635
636 w.newline();
637 w.end_array(true);
638 w.close();
639 f.close();
640 if (!f.good()) {
641 return false;
642 }
643 int rc = rename(tmpfile.c_str(), filename.c_str());
644 return rc == 0;
579 bool saveStateToFile(const string &filename) {
580 gx_print_info(_("wrinting to "), filename.c_str());
581 string tmpfile = filename + "_tmp";
582 ofstream f(tmpfile.c_str());
583 JsonWriter w(f);
584
585 w.begin_array();
586 writeHeader(w);
587
588 w.write("settings");
589 write_parameters(w, false);
590
591 w.write("midi_controller");
592 gx_gui::controller_map.writeJSON(w);
593
594 w.write("midi_ctrl_names");
595 gx_gui::midi_std_ctr.writeJSON(w);
596
597 w.write("current_preset");
598 write_preset(w, false);
599
600 w.write("jack_connections");
601 write_jack_connections(w);
602
603 w.newline();
604 w.end_array(true);
605 w.close();
606 f.close();
607 if (!f.good()) {
608 return false;
609 }
610 int rc = rename(tmpfile.c_str(), filename.c_str());
611 return rc == 0;
645612 }
646613
647614 list<string> jack_connection_lists[7];
648615
649 static void read_jack_connections(JsonParser& jp)
650 {
651 jp.next(JsonParser::begin_object);
652 while (jp.peek() == JsonParser::value_key) {
653 int i;
654 jp.next(JsonParser::value_key);
655 if (jp.current_value() == "input") {
656 i = kAudioInput;
657 } else if (jp.current_value() == "output1") {
658 i = kAudioOutput1;
659 } else if (jp.current_value() == "output2") {
660 i = kAudioOutput2;
661 } else if (jp.current_value() == "midi_input") {
662 i = kMidiInput;
663 } else if (jp.current_value() == "midi_output") {
664 i = kMidiOutput;
665 } else if (jp.current_value() == "insert_out") {
666 i = kAudioInsertOut;
667 } else if (jp.current_value() == "insert_in") {
668 i = kAudioInsertIn;
669 } else {
670 gx_print_warning(_("recall state"),_("unknown jack ports sections") + jp.current_value());
671 jp.skip_object();
672 continue;
673 }
674 jp.next(JsonParser::begin_array);
675 while (jp.peek() == JsonParser::value_string) {
676 jp.next();
677 jack_connection_lists[i].push_back(jp.current_value());
678 }
679 jp.next(JsonParser::end_array);
680 }
681 jp.next(JsonParser::end_object);
616 static void read_jack_connections(JsonParser& jp) {
617 jp.next(JsonParser::begin_object);
618 while (jp.peek() == JsonParser::value_key) {
619 int i;
620 jp.next(JsonParser::value_key);
621 if (jp.current_value() == "input") {
622 i = gx_jack::kAudioInput;
623 } else if (jp.current_value() == "output1") {
624 i = gx_jack::kAudioOutput1;
625 } else if (jp.current_value() == "output2") {
626 i = gx_jack::kAudioOutput2;
627 } else if (jp.current_value() == "midi_input") {
628 i = gx_jack::kMidiInput;
629 } else if (jp.current_value() == "midi_output") {
630 i = gx_jack::kMidiOutput;
631 } else if (jp.current_value() == "insert_out") {
632 i = gx_jack::kAudioInsertOut;
633 } else if (jp.current_value() == "insert_in") {
634 i = gx_jack::kAudioInsertIn;
635 } else {
636 gx_print_warning(_("recall state"),
637 _("unknown jack ports sections") + jp.current_value());
638 jp.skip_object();
639 continue;
640 }
641 jp.next(JsonParser::begin_array);
642 while (jp.peek() == JsonParser::value_string) {
643 jp.next();
644 jack_connection_lists[i].push_back(jp.current_value());
645 }
646 jp.next(JsonParser::end_array);
647 }
648 jp.next(JsonParser::end_object);
682649 }
683650
684651 // -- recallState(filename) : load state from file
685 bool recallState( const string &filename )
686 {
687 ifstream f(filename.c_str());
688 if (!f.good()) {
689 return false;
690 }
691 gx_gui::paramlist plist;
692 gx_gui::MidiControllerList::controller_array m(gx_gui::MidiControllerList::controller_array_size);
693 gx_system::JsonParser jp(f);
694 try {
695 jp.next(JsonParser::begin_array);
696
697 int major, minor;
698 readHeader(jp, &major, &minor);
699 if (major != majorversion) {
700 if (major == 0) {
701 gx_print_info(_("recall settings"), _("loading converted state"));
702 } else {
703 stringstream s;
704 s << _("major version mismatch in ")+filename+_(": found ")
705 << major << _(", expected ") << majorversion << endl;
706 gx_print_warning(_("recall settings"), s.str());
707 }
708 }
709
710 // other sections (settings, current_preset)
711 do {
712 jp.next(JsonParser::value_string);
713 if (jp.current_value() == "settings") {
714 read_parameters(jp, plist, false);
715 } else if (jp.current_value() == "current_preset") {
716 read_preset(jp, 0, major, minor);
717 } else if (jp.current_value() == "midi_controller") {
718 gx_gui::controller_map.readJSON(jp, m);
719 } else if (jp.current_value() == "midi_ctrl_names") {
720 gx_gui::midi_std_ctr.readJSON(jp);
721 } else if (jp.current_value() == "jack_connections") {
722 read_jack_connections(jp);
723 } else {
724 gx_print_warning(_("recall settings"),
725 _("unknown section: ") + jp.current_value());
726 jp.skip_object();
727 }
728 } while (jp.peek() == JsonParser::value_string);
729 jp.next(JsonParser::end_array);
730 jp.next(JsonParser::end_token);
731 } catch (JsonException& e) {
732 gx_print_error(_("recall settings"), _("invalid settings file: ") + filename);
733 return false;
734 }
735 for (gx_gui::paramlist::iterator i = plist.begin(); i != plist.end(); i++) {
736 (*i)->setJSON_value();
737 }
738 gx_gui::controller_map.set_controller_array(m);
739 return true;
652 bool recallState(const string &filename) {
653 ifstream f(filename.c_str());
654 if (!f.good()) {
655 return false;
656 }
657 gx_gui::paramlist plist;
658 gx_gui::MidiControllerList::controller_array m
659 (gx_gui::MidiControllerList::controller_array_size);
660 gx_system::JsonParser jp(f);
661 try {
662 jp.next(JsonParser::begin_array);
663
664 int major, minor;
665 readHeader(jp, &major, &minor);
666 if (major != majorversion) {
667 if (major == 0) {
668 gx_print_info(_("recall settings"), _("loading converted state"));
669 } else {
670 stringstream s;
671 s << _("major version mismatch in ")+filename+_(": found ")
672 << major << _(", expected ") << majorversion << endl;
673 gx_print_warning(_("recall settings"), s.str());
674 }
675 }
676
677 // other sections (settings, current_preset)
678 do {
679 jp.next(JsonParser::value_string);
680 if (jp.current_value() == "settings") {
681 read_parameters(jp, plist, false);
682 } else if (jp.current_value() == "current_preset") {
683 read_preset(jp, 0, major, minor);
684 } else if (jp.current_value() == "midi_controller") {
685 gx_gui::controller_map.readJSON(jp, m);
686 } else if (jp.current_value() == "midi_ctrl_names") {
687 gx_gui::midi_std_ctr.readJSON(jp);
688 } else if (jp.current_value() == "jack_connections") {
689 read_jack_connections(jp);
690 } else {
691 gx_print_warning(_("recall settings"),
692 _("unknown section: ") + jp.current_value());
693 jp.skip_object();
694 }
695 } while (jp.peek() == JsonParser::value_string);
696 jp.next(JsonParser::end_array);
697 jp.next(JsonParser::end_token);
698 } catch(JsonException& e) {
699 gx_print_error(_("recall settings"), _("invalid settings file: ") + filename);
700 return false;
701 }
702 for (gx_gui::paramlist::iterator i = plist.begin(); i != plist.end(); i++) {
703 (*i)->setJSON_value();
704 }
705 gx_gui::controller_map.set_controller_array(m);
706 return true;
740707 }
741708
742709 /****************************************************************
746713 #ifndef NDEBUG
747714
748715 /* return time difference in ns, fail if > sec (doesn't fit int 32 bit int) */
749 int Measure::ts_diff(struct timespec ts1, struct timespec ts2)
750 {
751 time_t df = ts1.tv_sec - ts2.tv_sec;
752 if (abs(df) > 2) {
753 return -1; // failed
754 }
755 return df * 1000000000 + (ts1.tv_nsec - ts2.tv_nsec);
756 }
757
758 void Measure::print_accum(Accum& accum, const char* prefix, bool verbose, int total)
759 {
760 cout << prefix << "mean: " << fixed << setprecision(4) << ns2ms(accum.mean());
761 if (total > 0) {
762 cout << " (" << setprecision(2) << 100.0*accum.mean()/float(total) << "%)";
763 }
764 cout << ", min: " << setprecision(4) << ns2ms(accum.minimum())
765 << ", max: " << ns2ms(accum.maximum());
766 if (total > 0) {
767 cout << " (" << setprecision(2) << 100.0*accum.maximum()/float(total) << "%)";
768 }
769 if (verbose) {
770 cout << ", stddev: " << setprecision(4) << ns2ms(accum.stddev())
771 << ", n: " << accum.count();
772 }
773 cout << endl;
774 }
775
776 void Measure::print(bool verbose)
777 {
778 if (verbose) {
779 print_accum(period, "period ", verbose);
780 }
781 print_accum(duration, "duration ", verbose, period.mean());
782 }
783
784 void MeasureThreadsafe::print(bool verbose)
785 {
786 Measure *p = pmeasure;
787 Measure *pn;
788 if (p == m) {
789 pn = m+1;
790 } else {
791 pn = m;
792 }
793 g_atomic_pointer_set(&pmeasure, pn);
794 p->print(verbose);
795 p->reset();
716 int Measure::ts_diff(struct timespec ts1, struct timespec ts2) {
717 time_t df = ts1.tv_sec - ts2.tv_sec;
718 if (abs(df) > 2) {
719 return -1; // failed
720 }
721 return df * 1000000000 + (ts1.tv_nsec - ts2.tv_nsec);
722 }
723
724 void Measure::print_accum(Accum& accum, const char* prefix, bool verbose, int total) {
725 cout << prefix << "mean: " << fixed << setprecision(4) << ns2ms(accum.mean());
726 if (total > 0) {
727 cout << " (" << setprecision(2) << 100.0*accum.mean()/static_cast<float>(total) << "%)";
728 }
729 cout << ", min: " << setprecision(4) << ns2ms(accum.minimum())
730 << ", max: " << ns2ms(accum.maximum());
731 if (total > 0) {
732 cout << " (" << setprecision(2) << 100.0*accum.maximum()/static_cast<float>(total) << "%)";
733 }
734 if (verbose) {
735 cout << ", stddev: " << setprecision(4) << ns2ms(accum.stddev())
736 << ", n: " << accum.count();
737 }
738 cout << endl;
739 }
740
741 void Measure::print(bool verbose) {
742 if (verbose) {
743 print_accum(period, "period ", verbose);
744 }
745 print_accum(duration, "duration ", verbose, period.mean());
746 }
747
748 void MeasureThreadsafe::print(bool verbose) {
749 Measure *p = pmeasure;
750 Measure *pn;
751 if (p == m) {
752 pn = m+1;
753 } else {
754 pn = m;
755 }
756 g_atomic_pointer_set(&pmeasure, pn);
757 p->print(verbose);
758 p->reset();
796759 }
797760
798761 MeasureThreadsafe measure;
799762
800 static int print_measures(gpointer data)
801 {
802 bool verbose = GPOINTER_TO_INT(data);
803 measure.print(verbose);
804 return TRUE;
805 }
806
807 void add_time_measurement()
808 {
809 char *p = getenv("GUITARIX_MEASURE");
810 if (!p) {
811 return;
812 }
813 bool verbose = false;
814 if (strcmp(p, "1") == 0) {
815 verbose = true;
816 }
817 g_timeout_add(1000, print_measures, (gpointer)verbose);
763 static int print_measures(gpointer data) {
764 bool verbose = GPOINTER_TO_INT(data);
765 measure.print(verbose);
766 return TRUE;
767 }
768
769 void add_time_measurement() {
770 char *p = getenv("GUITARIX_MEASURE");
771 if (!p) {
772 return;
773 }
774 bool verbose = false;
775 if (strcmp(p, "1") == 0) {
776 verbose = true;
777 }
778 g_timeout_add(1000, print_measures, (gpointer)verbose);
818779 }
819780
820781 #endif
825786 */
826787
827788 // ---- retrieve and store the shell variable if not NULL
828 void gx_assign_shell_var(const char* name, string& value)
829 {
830 const char* val = getenv(name);
831 value = (val != NULL) ? val : "" ;
789 void gx_assign_shell_var(const char* name, string& value) {
790 const char* val = getenv(name);
791 value = (val != NULL) ? val : "";
832792 }
833793
834794 // ---- OS signal handler -----
835 void gx_signal_handler(int sig)
836 {
837 // print out a warning
838 string msg = string(_("signal ")) + gx_i2a(sig) + _(" received, exiting ...");
839 gx_print_warning(_("signal_handler"), msg);
840
841 gx_clean_exit(NULL, NULL);
795 void gx_signal_handler(int sig) {
796 // print out a warning
797 string msg = string(_("signal ")) + gx_i2a(sig) + _(" received, exiting ...");
798 gx_print_warning(_("signal_handler"), msg);
799
800 gx_clean_exit(NULL, NULL);
842801 }
843802
844803 // ---- ladi signal handler -----
845 gboolean gx_ladi_handler(gpointer)
846 {
847 gx_print_warning(_("signal_handler"), _("signal USR1 received, save settings"));
848
849 saveStateToFile(gx_user_dir + client_instance + "_rc");
850 return false;
804 gboolean gx_ladi_handler(gpointer) {
805 gx_print_warning(_("signal_handler"), _("signal USR1 received, save settings"));
806
807 saveStateToFile(gx_user_dir + gx_jack::client_instance + "_rc");
808 return false;
851809 }
852810
853811 bool terminal = true; // make messages before main() appear on terminal
854812
855813 // ---- command line options
856 void gx_process_cmdline_options(int& argc, char**& argv, string* optvar)
857 {
858 // store shell variable content
859 for (int i = 0; i < NUM_SHELL_VAR; i++) {
860 gx_assign_shell_var(shell_var_name[i], optvar[i]);
861 }
862 // initialize number of skins. We just count the number of rc files
863 unsigned int n = gx_gui::gx_fetch_available_skins();
864 if (n < 1) {
865 gx_print_error(_("main"), string(_("number of skins is 0, aborting ...")));
866 exit(1);
867 }
868
869 // ---- parse command line arguments
870 bool version = false;
871 Glib::OptionContext opt_context;
872 opt_context.set_summary(
873 "All parameters are optional. Examples:\n"
874 "\tgx_head\n"
875 "\tgx_head -r black -i system:capture_3\n"
876 "\tgx_head -c -o system:playback_1 -o system:playback_2");
877 Glib::OptionEntry opt_version;
878 opt_version.set_short_name('v');
879 opt_version.set_long_name("version");
880 opt_version.set_description("Print version string and exit");
881 Glib::OptionGroup main_group("bla1","bla2","bla3");
882 main_group.add_entry(opt_version, version);
883 opt_context.set_main_group(main_group);
884
885 // GTK options: rc style (aka skin)
886 string opskin("Style to use");
887
888 vector<string>::iterator it;
889
890 for (it = gx_gui::skin_list.begin(); it != gx_gui::skin_list.end(); it++) {
891 opskin += ", '" + *it + "'";
892 }
893
894 bool clear = false;
895 Glib::ustring rcset;
896 Glib::OptionGroup optgroup_gtk(
897 "gtk",
898 "\033[1;32mGTK configuration options\033[0m",
899 "\033[1;32mGTK configuration options\033[0m");
900 Glib::OptionEntry opt_clear;
901 opt_clear.set_short_name('c');
902 opt_clear.set_long_name("clear");
903 opt_clear.set_description("Use 'default' GTK style");
904 Glib::OptionEntry opt_rcset;
905 opt_rcset.set_short_name('r');
906 opt_rcset.set_long_name("rcset");
907 opt_rcset.set_description(opskin);
908 opt_rcset.set_arg_description("STYLE");
909 optgroup_gtk.add_entry(opt_clear, clear);
910 optgroup_gtk.add_entry(opt_rcset, rcset);
911
912 // JACK options: input and output ports
913 Glib::ustring jack_input;
914 Glib::ustring jack_midi;
915 vector<Glib::ustring> jack_outputs;
916 Glib::ustring jack_uuid;
917 Glib::OptionGroup optgroup_jack(
918 "jack",
919 "\033[1;32mJACK configuration options\033[0m",
920 "\033[1;32mJACK configuration options\033[0m");
921 Glib::OptionEntry opt_jack_input;
922 opt_jack_input.set_short_name('i');
923 opt_jack_input.set_long_name("jack-input");
924 opt_jack_input.set_description("Guitarix JACK input");
925 opt_jack_input.set_arg_description("PORT");
926 Glib::OptionEntry opt_jack_output;
927 opt_jack_output.set_short_name('o');
928 opt_jack_output.set_long_name("jack-output");
929 opt_jack_output.set_description("Guitarix JACK outputs");
930 opt_jack_output.set_arg_description("PORT");
931 Glib::OptionEntry opt_jack_midi;
932 opt_jack_midi.set_short_name('m');
933 opt_jack_midi.set_long_name("jack-midi");
934 opt_jack_midi.set_description("Guitarix JACK midi control");
935 opt_jack_midi.set_arg_description("PORT");
936 Glib::OptionEntry opt_jack_uuid;
937 opt_jack_uuid.set_short_name('U');
938 opt_jack_uuid.set_long_name("jack-uuid");
939 opt_jack_uuid.set_description("JackSession ID");
940 optgroup_jack.add_entry(opt_jack_input, jack_input);
941 optgroup_jack.add_entry(opt_jack_output, jack_outputs);
942 optgroup_jack.add_entry(opt_jack_midi, jack_midi);
943 optgroup_jack.add_entry(opt_jack_uuid, jack_uuid);
944
945 // FILE options
946 string load_file;
947
948 Glib::OptionGroup optgroup_file(
949 "file",
950 "\033[1;32mFile options\033[0m",
951 "\033[1;32mFile options\033[0m");
952 Glib::OptionEntry opt_load_file;
953 opt_load_file.set_short_name('f');
954 opt_load_file.set_long_name("load-file");
955 opt_load_file.set_description(_("load state file on startup"));
956 opt_load_file.set_arg_description("FILE");
957 optgroup_file.add_entry_filename(opt_load_file, load_file);
958
959 // DEBUG options
960 string builder_dir;
961 string style_dir;
962 bool lterminal = false;
963 Glib::OptionGroup optgroup_debug(
964 "debug",
965 "\033[1;32mDebug options\033[0m",
966 "\033[1;32mDebug options\033[0m");
967 Glib::OptionEntry opt_builder_dir;
968 opt_builder_dir.set_short_name('B');
969 opt_builder_dir.set_long_name("builder-dir");
970 opt_builder_dir.set_description(_("directory from which .glade files are loaded"));
971 opt_builder_dir.set_arg_description("DIR");
972 optgroup_debug.add_entry_filename(opt_builder_dir, builder_dir);
973 Glib::OptionEntry opt_style_dir;
974 opt_style_dir.set_short_name('S');
975 opt_style_dir.set_long_name("style-dir");
976 opt_style_dir.set_description(_("directory with skin style definitions (.rc files)"));
977 opt_style_dir.set_arg_description("DIR");
978 optgroup_debug.add_entry_filename(opt_style_dir, style_dir);
979 Glib::OptionEntry opt_log_terminal;
980 opt_log_terminal.set_short_name('t');
981 opt_log_terminal.set_long_name("log-terminal");
982 opt_log_terminal.set_description(_("print log on terminal"));
983 optgroup_debug.add_entry(opt_log_terminal, lterminal);
984
985 // collecting all option groups
986 opt_context.add_group(optgroup_gtk);
987 opt_context.add_group(optgroup_jack);
988 opt_context.add_group(optgroup_file);
989 opt_context.add_group(optgroup_debug);
990
991 // parsing command options
992 try {
993 opt_context.parse(argc, argv);
994 } catch (Glib::OptionError ex) {
995 gx_print_error(_("main"), _("Error in user options! ") + ex.what());
996 exit(1);
997 }
998
999
1000 // ----------- processing user options -----------
1001
1002 terminal = lterminal;
1003
1004 // *** display version if requested
1005 if (version) {
1006 cout << "Guitarix version \033[1;32m"
1007 << GX_VERSION << endl
1008 << "\033[0m Copyright " << (char)0x40 << " 2010 "
1009 << "Hermman Meyer - James Warden - Andreas Degert"
1010 << endl;
1011 exit(0);
1012 }
1013
1014 // *** process GTK rc style
1015 bool previous_conflict = false;
1016 if (!rcset.empty()) {
1017 // retrieve user value
1018 string tmp = rcset;
1019
1020 // check contradiction (clear and rcset cannot be used in the same call)
1021 if (clear) {
1022 gx_print_error(_("main"),
1023 string(_("-c and -r cannot be used together, defaulting to 'default' style")));
1024 tmp = "default";
1025 previous_conflict = true;
1026 }
1027
1028 // if garbage, let's initialize to gx_head_default.rc
1029 guint s = 0;
1030 while (s < gx_gui::skin_list.size()) {
1031 if (tmp == gx_gui::skin_list[s])
1032 break;
1033 s++;
1034 }
1035
1036 if (s == gx_gui::skin_list.size()) {
1037 gx_print_error(_("main"),
1038 string(_("rcset value is garbage, defaulting to 'default' style")));
1039 tmp = "default";
1040 }
1041 optvar[RC_STYLE] = tmp;
1042 }
1043
1044 // else, if no shell var defined for it, defaulting to gx_head_default.rc
1045 else if (optvar[RC_STYLE].empty()) {
1046 optvar[RC_STYLE] = "default";
1047 // enable set last used skin
1048 gx_gui::no_opt_skin = 1;
1049 }
1050
1051 // *** process GTK clear
1052 if (clear) {
1053 // check contradiction (clear and rcset cannot be used in the same call)
1054 if (rcset != NULL && !previous_conflict)
1055 gx_print_error(_("main"),
1056 string(_("-c and -r cannot be used together, defaulting to 'default' style")));
1057
1058 optvar[RC_STYLE] = "default";
1059 }
1060
1061 // *** process builder_dir
1062 if (!builder_dir.empty()) {
1063 gx_builder_dir = builder_dir;
1064 if (gx_builder_dir[gx_builder_dir.size()-1] != '/') {
1065 gx_builder_dir += "/";
1066 }
1067 }
1068
1069 // *** process style_dir
1070 if (!style_dir.empty()) {
1071 gx_style_dir = style_dir;
1072 if (gx_style_dir[gx_style_dir.size()-1] != '/') {
1073 gx_style_dir += "/";
1074 }
1075 }
1076
1077 // *** process jack input
1078 if (!jack_input.empty()) {
1079 optvar[JACK_INP] = jack_input;
1080 }
1081
1082 // *** process jack midi
1083 if (!jack_midi.empty()) {
1084 optvar[JACK_MIDI] = jack_midi;
1085 }
1086
1087 optvar[JACK_UUID] = jack_uuid;
1088
1089 // *** process jack outputs
1090 if (!jack_outputs.empty()) {
1091 int idx = JACK_OUT1;
1092 for (unsigned int i = 0; i < jack_outputs.size(); i++, idx++) {
1093 if (i >= 2) {
1094 gx_print_warning(_("main"),
1095 _("Warning --> provided more than 2 output ports, ignoring extra ports"));
1096 break;
1097 }
1098 optvar[idx] = jack_outputs[i];
1099 }
1100 } else {
1101 if (optvar[JACK_OUT1].empty()) {
1102 optvar[JACK_OUT1] = "";
1103 }
1104 if (optvar[JACK_OUT2].empty()) {
1105 optvar[JACK_OUT2] = "";
1106 }
1107 }
1108
1109 optvar[LOAD_FILE] = load_file;
1110
1111 rcpath = gx_style_dir + string("gx_head_") + optvar[RC_STYLE] + ".rc";
1112 }
1113
1114 void gx_set_override_options(string* optvar)
1115 {
1116 if (!gx_gui::no_opt_skin) {
1117 gx_gui::gx_actualize_skin_index(optvar[RC_STYLE]);
1118 audio.fskin = gx_gui::last_skin = gx_gui::gx_current_skin;
1119 }
814 void gx_process_cmdline_options(int& argc, char**& argv, string* optvar) {
815 // store shell variable content
816 for (int i = 0; i < NUM_SHELL_VAR; i++) {
817 gx_assign_shell_var(shell_var_name[i], optvar[i]);
818 }
819 // initialize number of skins. We just count the number of rc files
820 unsigned int n = gx_gui::gx_fetch_available_skins();
821 if (n < 1) {
822 gx_print_error(_("main"), string(_("number of skins is 0, aborting ...")));
823 exit(1);
824 }
825
826 // ---- parse command line arguments
827 bool version = false;
828 Glib::OptionContext opt_context;
829 opt_context.set_summary(
830 "All parameters are optional. Examples:\n"
831 "\tgx_head\n"
832 "\tgx_head -r black -i system:capture_3\n"
833 "\tgx_head -c -o system:playback_1 -o system:playback_2");
834 Glib::OptionEntry opt_version;
835 opt_version.set_short_name('v');
836 opt_version.set_long_name("version");
837 opt_version.set_description("Print version string and exit");
838 Glib::OptionGroup main_group("bla1", "bla2", "bla3");
839 main_group.add_entry(opt_version, version);
840 opt_context.set_main_group(main_group);
841
842 // GTK options: rc style (aka skin)
843 string opskin("Style to use");
844
845 vector<string>::iterator it;
846
847 for (it = gx_gui::skin.skin_list.begin(); it != gx_gui::skin.skin_list.end(); it++) {
848 opskin += ", '" + *it + "'";
849 }
850
851 bool clear = false;
852 Glib::ustring rcset;
853 Glib::OptionGroup optgroup_gtk(
854 "gtk",
855 "\033[1;32mGTK configuration options\033[0m",
856 "\033[1;32mGTK configuration options\033[0m");
857 Glib::OptionEntry opt_clear;
858 opt_clear.set_short_name('c');
859 opt_clear.set_long_name("clear");
860 opt_clear.set_description("Use 'default' GTK style");
861 Glib::OptionEntry opt_rcset;
862 opt_rcset.set_short_name('r');
863 opt_rcset.set_long_name("rcset");
864 opt_rcset.set_description(opskin);
865 opt_rcset.set_arg_description("STYLE");
866 optgroup_gtk.add_entry(opt_clear, clear);
867 optgroup_gtk.add_entry(opt_rcset, rcset);
868
869 // JACK options: input and output ports
870 Glib::ustring jack_input;
871 Glib::ustring jack_midi;
872 vector<Glib::ustring> jack_outputs;
873 Glib::ustring jack_uuid;
874 Glib::OptionGroup optgroup_jack(
875 "jack",
876 "\033[1;32mJACK configuration options\033[0m",
877 "\033[1;32mJACK configuration options\033[0m");
878 Glib::OptionEntry opt_jack_input;
879 opt_jack_input.set_short_name('i');
880 opt_jack_input.set_long_name("jack-input");
881 opt_jack_input.set_description("Guitarix JACK input");
882 opt_jack_input.set_arg_description("PORT");
883 Glib::OptionEntry opt_jack_output;
884 opt_jack_output.set_short_name('o');
885 opt_jack_output.set_long_name("jack-output");
886 opt_jack_output.set_description("Guitarix JACK outputs");
887 opt_jack_output.set_arg_description("PORT");
888 Glib::OptionEntry opt_jack_midi;
889 opt_jack_midi.set_short_name('m');
890 opt_jack_midi.set_long_name("jack-midi");
891 opt_jack_midi.set_description("Guitarix JACK midi control");
892 opt_jack_midi.set_arg_description("PORT");
893 Glib::OptionEntry opt_jack_uuid;
894 opt_jack_uuid.set_short_name('U');
895 opt_jack_uuid.set_long_name("jack-uuid");
896 opt_jack_uuid.set_description("JackSession ID");
897 optgroup_jack.add_entry(opt_jack_input, jack_input);
898 optgroup_jack.add_entry(opt_jack_output, jack_outputs);
899 optgroup_jack.add_entry(opt_jack_midi, jack_midi);
900 optgroup_jack.add_entry(opt_jack_uuid, jack_uuid);
901
902 // FILE options
903 string load_file;
904
905 Glib::OptionGroup optgroup_file(
906 "file",
907 "\033[1;32mFile options\033[0m",
908 "\033[1;32mFile options\033[0m");
909 Glib::OptionEntry opt_load_file;
910 opt_load_file.set_short_name('f');
911 opt_load_file.set_long_name("load-file");
912 opt_load_file.set_description(_("load state file on startup"));
913 opt_load_file.set_arg_description("FILE");
914 optgroup_file.add_entry_filename(opt_load_file, load_file);
915
916 // DEBUG options
917 string builder_dir;
918 string style_dir;
919 bool lterminal = false;
920 Glib::OptionGroup optgroup_debug(
921 "debug",
922 "\033[1;32mDebug options\033[0m",
923 "\033[1;32mDebug options\033[0m");
924 Glib::OptionEntry opt_builder_dir;
925 opt_builder_dir.set_short_name('B');
926 opt_builder_dir.set_long_name("builder-dir");
927 opt_builder_dir.set_description(_("directory from which .glade files are loaded"));
928 opt_builder_dir.set_arg_description("DIR");
929 optgroup_debug.add_entry_filename(opt_builder_dir, builder_dir);
930 Glib::OptionEntry opt_style_dir;
931 opt_style_dir.set_short_name('S');
932 opt_style_dir.set_long_name("style-dir");
933 opt_style_dir.set_description(_("directory with skin style definitions (.rc files)"));
934 opt_style_dir.set_arg_description("DIR");
935 optgroup_debug.add_entry_filename(opt_style_dir, style_dir);
936 Glib::OptionEntry opt_log_terminal;
937 opt_log_terminal.set_short_name('t');
938 opt_log_terminal.set_long_name("log-terminal");
939 opt_log_terminal.set_description(_("print log on terminal"));
940 optgroup_debug.add_entry(opt_log_terminal, lterminal);
941
942 // collecting all option groups
943 opt_context.add_group(optgroup_gtk);
944 opt_context.add_group(optgroup_jack);
945 opt_context.add_group(optgroup_file);
946 opt_context.add_group(optgroup_debug);
947
948 // parsing command options
949 try {
950 opt_context.parse(argc, argv);
951 } catch(Glib::OptionError ex) {
952 gx_print_error(_("main"), _("Error in user options! ") + ex.what());
953 exit(1);
954 }
955
956
957 // ----------- processing user options -----------
958
959 terminal = lterminal;
960
961 // *** display version if requested
962 if (version) {
963 std::cout << "Guitarix version \033[1;32m"
964 << GX_VERSION << endl
965 << "\033[0m Copyright " << static_cast<char>(0x40) << " 2010 "
966 << "Hermman Meyer - James Warden - Andreas Degert"
967 << endl;
968 exit(0);
969 }
970
971 // *** process GTK rc style
972 bool previous_conflict = false;
973 if (!rcset.empty()) {
974 // retrieve user value
975 string tmp = rcset;
976
977 // check contradiction (clear and rcset cannot be used in the same call)
978 if (clear) {
979 gx_print_error(_("main"),
980 string(_("-c and -r cannot be used together, defaulting to 'default' style")));
981 tmp = "default";
982 previous_conflict = true;
983 }
984
985 // if garbage, let's initialize to gx_head_default.rc
986 guint s = 0;
987 while (s < gx_gui::skin.skin_list.size()) {
988 if (tmp == gx_gui::skin.skin_list[s])
989 break;
990 s++;
991 }
992
993 if (s == gx_gui::skin.skin_list.size()) {
994 gx_print_error(_("main"),
995 string(_("rcset value is garbage, defaulting to 'default' style")));
996 tmp = "default";
997 }
998 optvar[RC_STYLE] = tmp;
999
1000 // else, if no shell var defined for it, defaulting to gx_head_default.rc
1001 } else if (optvar[RC_STYLE].empty()) {
1002 optvar[RC_STYLE] = "default";
1003 // enable set last used skin
1004 gx_gui::skin.no_opt_skin = 1;
1005 }
1006
1007 // *** process GTK clear
1008 if (clear) {
1009 // check contradiction (clear and rcset cannot be used in the same call)
1010 if (rcset != NULL && !previous_conflict)
1011 gx_print_error(_("main"),
1012 string(_("-c and -r cannot be used together, defaulting to 'default' style")));
1013
1014 optvar[RC_STYLE] = "default";
1015 }
1016
1017 // *** process builder_dir
1018 if (!builder_dir.empty()) {
1019 gx_builder_dir = builder_dir;
1020 if (gx_builder_dir[gx_builder_dir.size()-1] != '/') {
1021 gx_builder_dir += "/";
1022 }
1023 }
1024
1025 // *** process style_dir
1026 if (!style_dir.empty()) {
1027 gx_style_dir = style_dir;
1028 if (gx_style_dir[gx_style_dir.size()-1] != '/') {
1029 gx_style_dir += "/";
1030 }
1031 }
1032
1033 // *** process jack input
1034 if (!jack_input.empty()) {
1035 optvar[JACK_INP] = jack_input;
1036 }
1037
1038 // *** process jack midi
1039 if (!jack_midi.empty()) {
1040 optvar[JACK_MIDI] = jack_midi;
1041 }
1042
1043 optvar[JACK_UUID] = jack_uuid;
1044
1045 // *** process jack outputs
1046 if (!jack_outputs.empty()) {
1047 int idx = JACK_OUT1;
1048 for (unsigned int i = 0; i < jack_outputs.size(); i++, idx++) {
1049 if (i >= 2) {
1050 gx_print_warning(_("main"),
1051 _("Warning --> provided more than 2 output ports, ignoring extra ports"));
1052 break;
1053 }
1054 optvar[idx] = jack_outputs[i];
1055 }
1056 } else {
1057 if (optvar[JACK_OUT1].empty()) {
1058 optvar[JACK_OUT1] = "";
1059 }
1060 if (optvar[JACK_OUT2].empty()) {
1061 optvar[JACK_OUT2] = "";
1062 }
1063 }
1064
1065 optvar[LOAD_FILE] = load_file;
1066
1067 rcpath = gx_style_dir + string("gx_head_") + optvar[RC_STYLE] + ".rc";
1068 }
1069
1070 void gx_set_override_options(string* optvar) {
1071 if (!gx_gui::skin.no_opt_skin) {
1072 gx_gui::gx_actualize_skin_index(optvar[RC_STYLE]);
1073 gx_engine::audio.fskin = gx_gui::skin.last_skin = gx_gui::skin.gx_current_skin;
1074 }
11201075 }
11211076
11221077 struct logmsg {
1123 string msg;
1124 GxMsgType msgtype;
1125 logmsg(string m, GxMsgType t): msg(m), msgtype(t) {}
1078 string msg;
1079 GxMsgType msgtype;
1080 logmsg(string m, GxMsgType t): msg(m), msgtype(t) {}
11261081 };
11271082
11281083 // ---- log message handler
1129 void gx_print_logmsg(const char* func, const string& msg, GxMsgType msgtype)
1130 {
1131 static list<logmsg> msglist;
1132
1133 // timestamp
1134 time_t now;
1135 time(&now);
1136 struct tm *tm_now = localtime (&now);
1137 ostringstream msgbuf;
1138 msgbuf << "[" << setfill('0')
1139 << setw(2) << tm_now->tm_hour << ":"
1140 << setw(2) << tm_now->tm_min << ":"
1141 << setw(2) << tm_now->tm_sec << "]"
1142 << " " << func << " *** " << msg;
1143
1144 // log the stuff to the log message window if possible
1145 bool written = false;
1146 if (gx_gui::GxMainInterface::fInitialized) {
1147 gx_gui::GxMainInterface* interface = gx_gui::GxMainInterface::instance();
1148
1149 if (interface->getLoggingWindow()) {
1150 if (!msglist.empty()) {
1151 for (list<logmsg>::iterator i = msglist.begin(); i != msglist.end(); i++) {
1152 interface->show_msg(i->msg, i->msgtype);
1153 }
1154 msglist.clear();
1155 }
1156 interface->show_msg(msgbuf.str(), msgtype);
1157 written = true;
1158 }
1159 }
1160
1161 if (!written) { // queue the messages
1162 msglist.push_back(logmsg(msgbuf.str(), msgtype));
1163 }
1164 if (terminal) {
1165 cerr << msgbuf.str() << endl;
1166 }
1084 void gx_print_logmsg(const char* func, const string& msg, GxMsgType msgtype) {
1085 static list<logmsg> msglist;
1086
1087 // timestamp
1088 time_t now;
1089 time(&now);
1090 struct tm *tm_now = localtime(&now);
1091 ostringstream msgbuf;
1092 msgbuf << "[" << setfill('0')
1093 << setw(2) << tm_now->tm_hour << ":"
1094 << setw(2) << tm_now->tm_min << ":"
1095 << setw(2) << tm_now->tm_sec << "]"
1096 << " " << func << " *** " << msg;
1097
1098 // log the stuff to the log message window if possible
1099 bool written = false;
1100 if (gx_gui::GxMainInterface::fInitialized) {
1101 gx_gui::GxMainInterface* interface = gx_gui::GxMainInterface::instance();
1102
1103 if (interface->getLoggingWindow()) {
1104 if (!msglist.empty()) {
1105 for (list<logmsg>::iterator i = msglist.begin(); i != msglist.end(); i++) {
1106 interface->show_msg(i->msg, i->msgtype);
1107 }
1108 msglist.clear();
1109 }
1110 interface->show_msg(msgbuf.str(), msgtype);
1111 written = true;
1112 }
1113 }
1114
1115 if (!written) { // queue the messages
1116 msglist.push_back(logmsg(msgbuf.str(), msgtype));
1117 }
1118 if (terminal) {
1119 std::cerr << msgbuf.str() << endl;
1120 }
11671121 }
11681122
11691123
11701124 // warning
1171 void gx_print_warning(const char* func, const string& msg)
1172 {
1173 gx_print_logmsg(func, msg, kWarning);
1125 void gx_print_warning(const char* func, const string& msg) {
1126 gx_print_logmsg(func, msg, kWarning);
11741127 }
11751128
11761129 // error
1177 void gx_print_error(const char* func, const string& msg)
1178 {
1179 gx_print_logmsg(func, msg, kError);
1130 void gx_print_error(const char* func, const string& msg) {
1131 gx_print_logmsg(func, msg, kError);
11801132 }
11811133
11821134 // fatal error
1183 void gx_print_fatal(const char* func, const string& msg)
1184 {
1185 string msgbuf = string(_("fatal system error: ")) + func + " *** " + msg + "\n";
1186 cerr << msgbuf;
1187 GtkWidget* widget = gtk_message_dialog_new(NULL,
1188 GtkDialogFlags(GTK_DIALOG_MODAL|
1189 GTK_DIALOG_DESTROY_WITH_PARENT),
1190 GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
1191 "%s", msgbuf.c_str());
1192 gtk_window_set_title(GTK_WINDOW(widget), "gx_head");
1193 gtk_dialog_run(GTK_DIALOG(widget));
1194 gx_clean_exit(NULL, (gpointer)1);
1135 void gx_print_fatal(const char* func, const string& msg) {
1136 string msgbuf = string(_("fatal system error: ")) + func + " *** " + msg + "\n";
1137 std::cerr << msgbuf;
1138 GtkWidget* widget = gtk_message_dialog_new(NULL,
1139 GtkDialogFlags(GTK_DIALOG_MODAL|
1140 GTK_DIALOG_DESTROY_WITH_PARENT),
1141 GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
1142 "%s", msgbuf.c_str());
1143 gtk_window_set_title(GTK_WINDOW(widget), "gx_head");
1144 gtk_dialog_run(GTK_DIALOG(widget));
1145 gx_clean_exit(NULL, (gpointer)1);
11951146 }
11961147
11971148 // info
1198 void gx_print_info(const char* func, const string& msg)
1199 {
1200 gx_print_logmsg(func, msg, kInfo);
1149 void gx_print_info(const char* func, const string& msg) {
1150 gx_print_logmsg(func, msg, kInfo);
12011151 }
12021152
12031153
12041154 // ---- check version and if directory exists and create it if it not exist
1205 bool gx_version_check()
1206 {
1207 struct stat my_stat;
1208
1209 //----- this check dont need to be against real version, we only need to know
1210 //----- if the presethandling is working with the courent version, we only count this
1211 //----- string when we must remove the old preset files.
1212 string rcfilename =
1213 gx_user_dir + string("version-") + string("0.03.3") ;
1214
1215 if (stat(gx_user_dir.c_str(), &my_stat) == 0) // directory exists
1216 {
1217 // check which version we're dealing with
1218 if (stat(rcfilename.c_str(), &my_stat) != 0)
1219 {
1220 // current version not there, let's create it and refresh the whole shebang
1221 string oldfiles = gx_user_dir + string("gx_head*rc");
1222 (void)gx_system_call ("rm -f", oldfiles.c_str(), false);
1223
1224 oldfiles = gx_user_dir + string("version*");
1225 (void)gx_system_call ("rm -f", oldfiles.c_str(), false);
1226
1227 oldfiles = gx_user_dir + string("*.conf");
1228 (void)gx_system_call ("rm -f", oldfiles.c_str(), false);
1229
1230 // setting file for current version
1231 ofstream f(rcfilename.c_str());
1232 string cim = string("gx_head-") + GX_VERSION;
1233 f << cim <<endl;
1234 f.close();
1235
1236 // --- create jack_capture setting file
1237 /*string tmpstr = gx_user_dir + jcapsetup_file;
1238
1239 (void)gx_system_call("touch", tmpstr.c_str(), false);
1240 (void)gx_system_call(
1241 "echo 'jack_capture -c 2 --silent --disable-meter --port gx_head:out* ' >",
1242 tmpstr.c_str(),
1243 false
1244 ); */
1245 }
1246 }
1247 else // directory does not exist
1248 {
1249 // create .gx_head directory
1250 (void)gx_system_call("mkdir -p", gx_user_dir.c_str(), false);
1251
1252 // setting file for current version
1253 ofstream f(rcfilename.c_str());
1254 string cim = string("gx_head-") + GX_VERSION;
1255 f << cim <<endl;
1256 f.close();
1257
1258 // --- create jack_capture setting file
1259 string tmpstr = gx_user_dir + jcapsetup_file;
1260
1261 /* (void)gx_system_call("touch", tmpstr.c_str(), false);
1262 (void)gx_system_call(
1263 "echo 'jack_capture -c 2 --silent --disable-meter --port gx_head:out* ' >",
1264 tmpstr.c_str(),
1265 false
1266 ); */
1267
1268 // --- version file
1269 //same here, we only change this file, when the presethandling is broken,
1270 // otherwise we can let it untouched
1271 tmpstr = gx_user_dir + string("version-") + string("0.03.3");
1272 (void)gx_system_call("touch", tmpstr.c_str(), false);
1273
1274 cim = string("echo 'gx_head-") + string(GX_VERSION) + "' >";
1275 (void)gx_system_call(cim.c_str(), tmpstr.c_str(), false);
1155 bool gx_version_check() {
1156 struct stat my_stat;
1157
1158 // ----- this check dont need to be against real version, we only need to know
1159 // ----- if the presethandling is working with the courent version, we only count this
1160 // ----- string when we must remove the old preset files.
1161 string rcfilename =
1162 gx_user_dir + string("version-") + string("0.03.3");
1163
1164 if (stat(gx_user_dir.c_str(), &my_stat) == 0) { // directory exists
1165 // check which version we're dealing with
1166 if (stat(rcfilename.c_str(), &my_stat) != 0) {
1167 // current version not there, let's create it and refresh the whole shebang
1168 string oldfiles = gx_user_dir + string("gx_head*rc");
1169 (void)gx_system_call("rm -f", oldfiles.c_str(), false);
1170
1171 oldfiles = gx_user_dir + string("version*");
1172 (void)gx_system_call("rm -f", oldfiles.c_str(), false);
1173
1174 oldfiles = gx_user_dir + string("*.conf");
1175 (void)gx_system_call("rm -f", oldfiles.c_str(), false);
1176
1177 // setting file for current version
1178 ofstream f(rcfilename.c_str());
1179 string cim = string("gx_head-") + GX_VERSION;
1180 f << cim <<endl;
1181 f.close();
1182
1183 // --- create jack_capture setting file
1184 /*string tmpstr = gx_user_dir + jcapsetup_file;
1185
1186 (void)gx_system_call("touch", tmpstr.c_str(), false);
1187 (void)gx_system_call(
1188 "echo 'jack_capture -c 2 --silent --disable-meter --port gx_head:out* ' >",
1189 tmpstr.c_str(),
1190 false
1191 ); */
1192 }
1193 } else { // directory does not exist
1194 // create .gx_head directory
1195 (void)gx_system_call("mkdir -p", gx_user_dir.c_str(), false);
1196
1197 // setting file for current version
1198 ofstream f(rcfilename.c_str());
1199 string cim = string("gx_head-") + GX_VERSION;
1200 f << cim <<endl;
1201 f.close();
1202
1203 // --- create jack_capture setting file
1204 string tmpstr = gx_user_dir + jcapsetup_file;
1205
1206 /* (void)gx_system_call("touch", tmpstr.c_str(), false);
1207 (void)gx_system_call(
1208 "echo 'jack_capture -c 2 --silent --disable-meter --port gx_head:out* ' >",
1209 tmpstr.c_str(),
1210 false
1211 ); */
1212
1213 // --- version file
1214 // same here, we only change this file, when the presethandling is broken,
1215 // otherwise we can let it untouched
1216 tmpstr = gx_user_dir + string("version-") + string("0.03.3");
1217 (void)gx_system_call("touch", tmpstr.c_str(), false);
1218
1219 cim = string("echo 'gx_head-") + string(GX_VERSION) + "' >";
1220 (void)gx_system_call(cim.c_str(), tmpstr.c_str(), false);
12761221
12771222 // create empty preset file
12781223 tmpstr = gx_user_dir + string("gx_headpre_rc");
12831228 jw.end_array(true);
12841229 jw.close();
12851230 nfile.close();
1286
1287 }
1288
1289 return TRUE;
1290 }
1291
1292 //----- we must make sure that the images for the status icon be there
1293 int gx_pixmap_check()
1294 {
1295 struct stat my_stat;
1296
1297 string gx_pix = gx_pixmap_dir + "gx_head.png";
1298 string midi_pix = gx_pixmap_dir + "gx_head-midi.png";
1299 string warn_pix = gx_pixmap_dir + "gx_head-warn.png";
1300
1301 if ((stat(gx_pix.c_str(), &my_stat) != 0) ||
1302 (stat(midi_pix.c_str(), &my_stat) != 0) ||
1303 (stat(warn_pix.c_str(), &my_stat) != 0))
1304
1305 {
1306 gx_print_error(_("Pixmap Check"), _(" cannot find installed pixmaps! giving up ..."));
1307
1308 // giving up
1309 return 1;
1310 }
1311
1312 GtkWidget *ibf = gtk_image_new_from_file (gx_pix.c_str());
1313 gx_gui::ib = gtk_image_get_pixbuf (GTK_IMAGE(ibf));
1314
1315 GtkWidget *stim = gtk_image_new_from_file (midi_pix.c_str());
1316 gx_gui::ibm = gtk_image_get_pixbuf (GTK_IMAGE(stim));
1317
1318 GtkWidget *stir = gtk_image_new_from_file (warn_pix.c_str());
1319 gx_gui::ibr = gtk_image_get_pixbuf (GTK_IMAGE(stir));
1320
1321 return 0;
1322 }
1323
1324 //----convert int to string
1325 void gx_IntToString(int i, string & s)
1326 {
1327 s = "";
1328
1329 int abs_i = abs(i);
1330 do {
1331 // note: using base 10 since 10 digits (0123456789)
1332 char c = static_cast<char>(ASCII_START+abs_i%10);
1333 s.insert(0, &c, 1);
1334 }
1335 while ((abs_i /= 10) > 0);
1336 if (i < 0) s.insert(0, "-");
1337 }
1338
1339 const string& gx_i2a(int i)
1340 {
1341 static string str;
1342 gx_IntToString(i, str);
1343
1344 return str;
1345 }
1346
1347 //----clean up preset name given by user
1348 void gx_nospace_in_name(string& name, const char* subs)
1349 {
1350 int p = name.find(' ', 0);
1351 while (p != -1)
1352 {
1353 name.replace(p++, 1, subs);
1354 p = name.find(' ', p);
1355 }
1356 }
1357
1358 //----abort gx_head
1359 void gx_abort(void* arg)
1360 {
1361 gx_print_warning(_("gx_abort"), _("Aborting gx_head, ciao!"));
1362 exit(1);
1363 }
1364
1365 //---- gx_head system function
1231 }
1232
1233 return TRUE;
1234 }
1235
1236 // ----- we must make sure that the images for the status icon be there
1237 int gx_pixmap_check() {
1238 struct stat my_stat;
1239
1240 string gx_pix = gx_pixmap_dir + "gx_head.png";
1241 string midi_pix = gx_pixmap_dir + "gx_head-midi.png";
1242 string warn_pix = gx_pixmap_dir + "gx_head-warn.png";
1243
1244 if ((stat(gx_pix.c_str(), &my_stat) != 0) ||
1245 (stat(midi_pix.c_str(), &my_stat) != 0) ||
1246 (stat(warn_pix.c_str(), &my_stat) != 0)) {
1247 gx_print_error(_("Pixmap Check"), _(" cannot find installed pixmaps! giving up ..."));
1248
1249 // giving up
1250 return 1;
1251 }
1252
1253 GtkWidget *ibf = gtk_image_new_from_file(gx_pix.c_str());
1254 gx_gui::gw.ib = gtk_image_get_pixbuf(GTK_IMAGE(ibf));
1255
1256 GtkWidget *stim = gtk_image_new_from_file(midi_pix.c_str());
1257 gx_gui::gw.ibm = gtk_image_get_pixbuf(GTK_IMAGE(stim));
1258
1259 GtkWidget *stir = gtk_image_new_from_file(warn_pix.c_str());
1260 gx_gui::gw.ibr = gtk_image_get_pixbuf(GTK_IMAGE(stir));
1261
1262 return 0;
1263 }
1264
1265 // ----convert int to string
1266 void gx_IntToString(int i, string & s) {
1267 s = "";
1268
1269 int abs_i = abs(i);
1270 do {
1271 // note: using base 10 since 10 digits (0123456789)
1272 char c = static_cast<char>(ASCII_START+abs_i%10);
1273 s.insert(0, &c, 1);
1274 }
1275 while ((abs_i /= 10) > 0);
1276 if (i < 0) s.insert(0, "-");
1277 }
1278
1279 const string& gx_i2a(int i) {
1280 static string str;
1281 gx_IntToString(i, str);
1282
1283 return str;
1284 }
1285
1286 // ----clean up preset name given by user
1287 void gx_nospace_in_name(string& name, const char* subs) {
1288 int p = name.find(' ', 0);
1289 while (p != -1) {
1290 name.replace(p++, 1, subs);
1291 p = name.find(' ', p);
1292 }
1293 }
1294
1295 // ----abort gx_head
1296 void gx_abort(void* arg) {
1297 gx_print_warning(_("gx_abort"), _("Aborting gx_head, ciao!"));
1298 exit(1);
1299 }
1300
1301 // ---- gx_head system function
13661302 int gx_system_call(const char* name1,
13671303 const char* name2,
13681304 const bool devnull,
1369 const bool escape)
1370 {
1371 string str(name1);
1372 str.append(" ");
1373 str.append(name2);
1374
1375 if (devnull)
1376 str.append(" 1>/dev/null 2>&1");
1377
1378 if (escape)
1379 str.append("&");
1380
1381 // cerr << " ********* \n system command = " << str.c_str() << endl;
1382
1383 sigset_t waitset;
1384 sigemptyset(&waitset);
1385 sigaddset(&waitset, SIGCHLD);
1386 sigprocmask(SIG_UNBLOCK, &waitset, NULL);
1387 int rc = system(str.c_str());
1388 sigprocmask(SIG_BLOCK, &waitset, NULL);
1389 return rc;
1305 const bool escape) {
1306 string str(name1);
1307 str.append(" ");
1308 str.append(name2);
1309
1310 if (devnull)
1311 str.append(" 1>/dev/null 2>&1");
1312
1313 if (escape)
1314 str.append("&");
1315
1316 // cerr << " ********* \n system command = " << str.c_str() << endl;
1317
1318 sigset_t waitset;
1319 sigemptyset(&waitset);
1320 sigaddset(&waitset, SIGCHLD);
1321 sigprocmask(SIG_UNBLOCK, &waitset, NULL);
1322 int rc = system(str.c_str());
1323 sigprocmask(SIG_BLOCK, &waitset, NULL);
1324 return rc;
13901325 }
13911326
13921327 // polymorph1
13931328 int gx_system_call(const char* name1,
13941329 const string& name2,
13951330 const bool devnull,
1396 const bool escape)
1397 {
1398 return gx_system_call(name1, name2.c_str(), devnull, escape);
1331 const bool escape) {
1332 return gx_system_call(name1, name2.c_str(), devnull, escape);
13991333 }
14001334
14011335 // polymorph2
14021336 // int gx_system_call(const string& name1,
1403 // const string& name2,
1404 // const bool devnull,
1405 // const bool escape)
1337 // const string& name2,
1338 // const bool devnull,
1339 // const bool escape)
14061340 // {
14071341 // return gx_system_call(name1.c_str(), name2.c_str(), devnull, escape);
14081342 // }
14111345 int gx_system_call(const string& name1,
14121346 const char* name2,
14131347 const bool devnull,
1414 const bool escape)
1415 {
1416 return gx_system_call(name1.c_str(), name2, devnull, escape);
1417 }
1418
1419
1420 //----- clean up when shut down
1421 void gx_destroy_event()
1422 {
1423 // remove image buffers
1424 if (G_IS_OBJECT(gx_gui::ib))
1425 g_object_unref(gx_gui::ib);
1426
1427 if (G_IS_OBJECT(gx_gui::ibm))
1428 g_object_unref(gx_gui::ibm);
1429
1430 if (G_IS_OBJECT(gx_gui::ibr))
1431 g_object_unref(gx_gui::ibr);
1432
1433 if (G_IS_OBJECT(gx_cairo::tribeimage))
1434 g_object_unref(gx_cairo::tribeimage);
1435
1436 if (G_IS_OBJECT(gx_cairo::tribeimage1))
1437 g_object_unref(gx_cairo::tribeimage1);
1438
1439 if (G_IS_OBJECT(gx_cairo::tribeimage2))
1440 g_object_unref(gx_cairo::tribeimage2);
1441
1442 // remove threads from main GTK thread
1443 for (unsigned int i = 0; i < sizeof(gx_gui::g_threads)/sizeof(gx_gui::g_threads[0]); i++) {
1444 if(gx_gui::g_threads[i] > 0) {
1445 g_source_remove(gx_gui::g_threads[i]);
1446 }
1447 }
1448
1449 gtk_main_quit();
1450 }
1451
1452 //-----Function that must be called before complete shutdown
1453 void gx_clean_exit(GtkWidget* widget, gpointer data)
1454 {
1455 // save DSP state
1456 if (isInitialized()) {
1457 get_latency_warning_change();
1458 gx_gui::gx_get_skin_change(&audio.fskin);
1459
1460 // save rack state when needed
1461 /*if( gtk_widget_get_visible(GTK_WIDGET (gx_gui::rack_widget))) {
1462 gint rxorg,ryorg,rhight;
1463 gtk_window_get_position (GTK_WINDOW(gx_gui::rack_widget), &rxorg, &ryorg);
1464 gtk_widget_get_size_request (GTK_WIDGET(gx_gui::rack_widget),NULL, &rhight);
1465 gx_gui::r_xorg = (float)rxorg;
1466 gx_gui::r_yorg = (float)ryorg;
1467 gx_gui::r_hight = (float)rhight;
1468 }
1469
1470 if( gtk_widget_get_visible(GTK_WIDGET (gx_gui::srack_widget))) {
1471 gint srxorg,sryorg,srhight;
1472 gtk_window_get_position (GTK_WINDOW(gx_gui::srack_widget), &srxorg,&sryorg);
1473 gtk_widget_get_size_request (GTK_WIDGET(gx_gui::srack_widget),NULL, &srhight);
1474 gx_gui::sr_xorg = (float)srxorg;
1475 gx_gui::sr_yorg = (float)sryorg;
1476 gx_gui::sr_hight = (float)srhight;
1477 }
1478
1479 if( gtk_widget_get_visible(GTK_WIDGET (gx_gui::rack_tool_bar))) {
1480 gint prxorg,pryorg,prhight;
1481 gtk_window_get_position (GTK_WINDOW(gx_gui::rack_tool_bar), &prxorg,&pryorg);
1482 gtk_widget_get_size_request (GTK_WIDGET(gx_gui::rack_tool_bar),NULL, &prhight);
1483 gx_gui::pr_xorg = (float)prxorg;
1484 gx_gui::pr_yorg = (float)pryorg;
1485 gx_gui::pr_hight = (float)prhight;
1486 }*/
1487
1488 if( gtk_widget_get_visible(GTK_WIDGET (gx_gui::fWindow))) {
1489 gint mainxorg,mainyorg;
1490 gtk_window_get_position (GTK_WINDOW(gx_gui::fWindow), &mainxorg,&mainyorg);
1491 gx_gui::main_xorg = (float)mainxorg;
1492 gx_gui::main_yorg = (float)mainyorg;
1493 }
1494
1495 // only save if we are not in a preset context
1496 if (!setting_is_preset && !setting_is_factory && gx_jack::client) {
1497 saveStateToFile(gx_user_dir + client_instance + "_rc");
1498 }
1499 }
1500
1501 gx_gui::shownote = -1;
1502 gx_gui::showwave = 0;
1503 gx_jack::NO_CONNECTION = 1;
1504
1505 turnOffMidi();
1506
1507 // clean jack client stuff
1508 gx_jack_cleanup();
1509
1510 // clean GTK stuff
1511 if (gx_gui::fWindow) {
1512 gx_destroy_event();
1513 }
1514 // delete the locked mem buffers
1515 if (checkfreq) {
1516 delete[] checkfreq;
1517 checkfreq = NULL;
1518 }
1519 if (get_frame) {
1520 delete[] get_frame;
1521 get_frame = NULL;
1522 }
1523 if (get_frame1) {
1524 delete[] get_frame1;
1525 get_frame1 = NULL;
1526 }
1527 if (oversample) {
1528 delete[] oversample;
1529 oversample = NULL;
1530 }
1531 if (result) {
1532 delete[] result;
1533 result = NULL;
1534 }
1535
1536 printf(_(" gx_head exit *** ciao . . \n"));
1537 exit(GPOINTER_TO_INT(data));
1538 }
1539
1540
1348 const bool escape) {
1349 return gx_system_call(name1.c_str(), name2, devnull, escape);
1350 }
1351
1352
1353 // ----- clean up when shut down
1354 void gx_destroy_event() {
1355 // remove image buffers
1356 if (G_IS_OBJECT(gx_gui::gw.ib))
1357 g_object_unref(gx_gui::gw.ib);
1358
1359 if (G_IS_OBJECT(gx_gui::gw.ibm))
1360 g_object_unref(gx_gui::gw.ibm);
1361
1362 if (G_IS_OBJECT(gx_gui::gw.ibr))
1363 g_object_unref(gx_gui::gw.ibr);
1364
1365 if (G_IS_OBJECT(gx_cairo::tribeimage))
1366 g_object_unref(gx_cairo::tribeimage);
1367
1368 if (G_IS_OBJECT(gx_cairo::tribeimage1))
1369 g_object_unref(gx_cairo::tribeimage1);
1370
1371 if (G_IS_OBJECT(gx_cairo::tribeimage2))
1372 g_object_unref(gx_cairo::tribeimage2);
1373
1374 // remove threads from main GTK thread
1375 for (unsigned int i = 0; i < sizeof(gx_gui::g_threads)/sizeof(gx_gui::g_threads[0]); i++) {
1376 if (gx_gui::g_threads[i] > 0) {
1377 g_source_remove(gx_gui::g_threads[i]);
1378 }
1379 }
1380
1381 gtk_main_quit();
1382 }
1383
1384 // -----Function that must be called before complete shutdown
1385 void gx_clean_exit(GtkWidget* widget, gpointer data) {
1386 // save DSP state
1387 if (gx_engine::isInitialized()) {
1388 gx_engine::get_latency_warning_change();
1389 gx_gui::gx_get_skin_change(&gx_engine::audio.fskin);
1390
1391 if (gtk_widget_get_visible(GTK_WIDGET(gx_gui::gw.fWindow))) {
1392 gint mainxorg, mainyorg;
1393 gtk_window_get_position(GTK_WINDOW(gx_gui::gw.fWindow), &mainxorg, &mainyorg);
1394 gx_gui::main_xorg = static_cast<float>(mainxorg);
1395 gx_gui::main_yorg = static_cast<float>(mainyorg);
1396 }
1397
1398 // only save if we are not in a preset or session context
1399 if (!gx_preset::setting_is_preset && !gx_preset::setting_is_factory
1400 && !is_session
1401 && gx_jack::gxjack.client) {
1402 saveStateToFile(gx_user_dir + gx_jack::client_instance + "_rc");
1403 }
1404 }
1405
1406 gx_gui::shownote = -1;
1407 gx_gui::showwave = 0;
1408 gx_jack::NO_CONNECTION = 1;
1409
1410 gx_engine::turnOffMidi();
1411
1412 // clean jack gxjack.client stuff
1413 gx_jack::gx_jack_cleanup();
1414
1415 // clean GTK stuff
1416 if (gx_gui::gw.fWindow) {
1417 gx_destroy_event();
1418 }
1419 // delete the locked mem buffers
1420 if (gx_engine::checkfreq) {
1421 delete[] gx_engine::checkfreq;
1422 gx_engine::checkfreq = NULL;
1423 }
1424 if (gx_engine::get_frame) {
1425 delete[] gx_engine::get_frame;
1426 gx_engine::get_frame = NULL;
1427 }
1428 if (gx_engine::get_frame1) {
1429 delete[] gx_engine::get_frame1;
1430 gx_engine::get_frame1 = NULL;
1431 }
1432 if (gx_engine::oversample) {
1433 delete[] gx_engine::oversample;
1434 gx_engine::oversample = NULL;
1435 }
1436 if (gx_engine::result) {
1437 delete[] gx_engine::result;
1438 gx_engine::result = NULL;
1439 }
1440 if (is_session) {
1441 printf(_(" gx_head session exit *** ciao . . \n"));
1442 return;
1443 } else {
1444 printf(_(" gx_head exit *** ciao . . \n"));
1445 }
1446 exit(GPOINTER_TO_INT(data));
1447 }
15411448 } /* end of gx_system namespace */
1449
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * ---------------------------------------------------------------------------
1718 *
1819 * This are the guitarix multithreads related functionality
2021 * ----------------------------------------------------------------------------
2122 */
2223
23 #include <errno.h>
24 #include <cstring>
25 #include "guitarix.h"
26
27 using namespace gx_system;
28 using namespace gx_child_process;
29 using namespace gx_gui;
30
31 namespace gx_threads
32 {
33 static const float falloff = meter_falloff * meter_display_timeout * 0.001;
24 #include "guitarix.h" // NOLINT
25
26 #include <errno.h> // NOLINT
27 #include <cstring> // NOLINT
28 #include <algorithm> // NOLINT
29
30
31 namespace gx_threads {
32 static const float falloff = gx_gui::meter_falloff * gx_gui::meter_display_timeout * 0.001;
3433
3534 /* ----------------- refresh GX level display function ---------------- */
36 gboolean gx_refresh_meter_level(gpointer args)
37 {
38 if (gx_jack::client && gx_engine::buffers_ready) {
39 gx_gui::GxMainInterface* gui = gx_gui::GxMainInterface::instance();
40
41 // data holders for meters
42 // Note: removed RMS calculation, we will only focus on max peaks
43 float max_level[2];
44 (void)memset(max_level, 0, sizeof(max_level));
45
46 static float old_peak_db[2] = {-INFINITY, -INFINITY};
47
48 jack_nframes_t nframes = gx_jack::jack_bs;
49
50 // fill up from engine buffers
51 for (int c = 0; c < 2; c++) {
52 // guitarix output levels
53 float data[nframes];
54
55 // need to differentiate between channels due to stereo
56 switch (c) {
57 default:
58 case 0:
59 (void)memcpy(data, gx_engine::get_frame, sizeof(data));
60 break;
61
62 case 1:
63 (void)memcpy(data, gx_engine::get_frame1, sizeof(data));
64 break;
65 }
66
67 // calculate max peak
68 for (guint f = 0; f < nframes; f++) {
69 max_level[c] = max(max_level[c], abs(data[f]));
70 }
71
72 // update meters (consider falloff as well)
73 // calculate peak dB and translate into meter
74 float peak_db = -INFINITY;
75 if (max_level[c] > 0.) {
76 peak_db = power2db(max_level[c]);
77 }
78
79 // retrieve old meter value and consider falloff
80 if (peak_db < old_peak_db[c]) {
81 peak_db = old_peak_db[c] - falloff;
82 }
83 gui->getLevelMeter(c).set(log_meter(peak_db));
84 old_peak_db[c] = max(peak_db, -INFINITY);
85 }
86 }
87 // run thread again
88 return TRUE;
35 gboolean gx_refresh_meter_level(gpointer args) {
36 if (gx_jack::gxjack.client && gx_engine::buffers_ready) {
37 gx_gui::GxMainInterface* gui = gx_gui::GxMainInterface::instance();
38
39 // data holders for meters
40 // Note: removed RMS calculation, we will only focus on max peaks
41 float max_level[2];
42 (void)memset(max_level, 0, sizeof(max_level));
43
44 static float old_peak_db[2] = {-INFINITY, -INFINITY};
45
46 jack_nframes_t nframes = gx_jack::gxjack.jack_bs;
47
48 // fill up from engine buffers
49 for (int c = 0; c < 2; c++) {
50 // guitarix output levels
51 float data[nframes];
52
53 // need to differentiate between channels due to stereo
54 switch (c) {
55 default:
56 case 0:
57 (void)memcpy(data, gx_engine::get_frame, sizeof(data));
58 break;
59
60 case 1:
61 (void)memcpy(data, gx_engine::get_frame1, sizeof(data));
62 break;
63 }
64
65 // calculate max peak
66 for (guint f = 0; f < nframes; f++) {
67 max_level[c] = max(max_level[c], abs(data[f]));
68 }
69
70 // update meters (consider falloff as well)
71 // calculate peak dB and translate into meter
72 float peak_db = -INFINITY;
73 if (max_level[c] > 0.) {
74 peak_db = power2db(max_level[c]);
75 }
76
77 // retrieve old meter value and consider falloff
78 if (peak_db < old_peak_db[c]) {
79 peak_db = old_peak_db[c] - falloff;
80 }
81 gui->getLevelMeter(c).set(log_meter(peak_db));
82 old_peak_db[c] = max(peak_db, -INFINITY);
83 }
84 }
85 // run thread again
86 return TRUE;
8987 }
9088
9189 /* -------------- refresh oscilloscope function -------------- */
92 gboolean gx_xrun_report(gpointer arg)
93 {
94 usleep(40);
95 ostringstream s;
96 s << " delay of at least " << gx_jack::xdel << " microsecs";
97 gx_print_warning("Jack XRun", s.str());
98
99 return FALSE;
90 gboolean gx_xrun_report(gpointer arg) {
91 usleep(40);
92 ostringstream s;
93 s << " delay of at least " << gx_jack::gxjack.xdel << " microsecs";
94 gx_system::gx_print_warning("Jack XRun", s.str());
95
96 return FALSE;
10097 }
10198
10299 /* --------- load preset triggered by midi program change --------- */
103 gboolean gx_do_program_change(gpointer arg)
104 {
105 int pgm = GPOINTER_TO_INT(arg);
106 gx_engine::GxEngineState estate = gx_engine::checky;
107 if (gx_preset::gx_nth_preset(pgm))
108 {
109 if (estate == gx_engine::kEngineBypass)
110 // engine bypass but preset found -> engine on
111 gx_engine_switch ((GtkWidget*)0, (gpointer)1);
112 }
113 else
114 {
115 if (estate == gx_engine::kEngineOn)
116 // engine on but preset not found -> engine bypass
117 gx_engine_switch ((GtkWidget*)0, (gpointer)1);
118 }
119 // mainloop idle callback: do not call again
120 return FALSE;
100 gboolean gx_do_program_change(gpointer arg) {
101 int pgm = GPOINTER_TO_INT(arg);
102 gx_engine::GxEngineState estate = gx_engine::checky;
103 if (gx_preset::gx_nth_preset(pgm)) {
104 if (estate == gx_engine::kEngineBypass)
105 // engine bypass but preset found -> engine on
106 gx_gui::gx_engine_switch(reinterpret_cast<GtkWidget*>(0), (gpointer)1);
107 } else {
108 if (estate == gx_engine::kEngineOn)
109 // engine on but preset not found -> engine bypass
110 gx_gui::gx_engine_switch(reinterpret_cast<GtkWidget*>(0), (gpointer)1);
111 }
112 // mainloop idle callback: do not call again
113 return FALSE;
121114 }
122115
123116 /* -------------- for thread that checks jackd liveliness -------------- */
124 gboolean gx_survive_jack_shutdown(gpointer arg)
125 {
126 GtkWidget* wd = gx_gui::GxMainInterface::instance()->getJackConnectItem();
127
128 // return if jack is not down
129 if (gx_system_call("pgrep", "jackd", true) == SYSTEM_OK)
130 {
131 if (gx_jack::jack_is_down)
132 {
133 // let's make sure we get out of here
134 if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(wd)))
135 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(wd), TRUE);
136
137 // run only one time whem jackd is running
138 return false;
139 }
140 }
141 else
142 {
143 // set jack client to NULL
144 gx_jack::client = 0;
145
146 // refresh some stuff. Note that it can be executed
147 // more than once, no harm here
148 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(wd), FALSE);
149 gx_jconv::GxJConvSettings::checkbutton7 = 0;
150 gx_jack::jack_is_down = true;
151 }
152 // run as long jackd is down
153 return true;
117 gboolean gx_survive_jack_shutdown(gpointer arg) {
118 GtkWidget* wd = gx_gui::GxMainInterface::instance()->getJackConnectItem();
119
120 // return if jack is not down
121 if (gx_system::gx_system_call("pgrep", "jackd", true) == gx_system::SYSTEM_OK) {
122 if (gx_jack::jack_is_down) {
123 // let's make sure we get out of here
124 if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(wd)))
125 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(wd), TRUE);
126
127 // run only one time whem jackd is running
128 return false;
129 }
130 } else {
131 // set jack gxjack.client to NULL
132 gx_jack::gxjack.client = 0;
133
134 // refresh some stuff. Note that it can be executed
135 // more than once, no harm here
136 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(wd), FALSE);
137 gx_jconv::GxJConvSettings::checkbutton7 = 0;
138 gx_jack::jack_is_down = true;
139 }
140 // run as long jackd is down
141 return true;
154142 }
155143
156144 /* Update all user items reflecting zone z */
157 gboolean gx_update_all_gui(gpointer)
158 {
159 // the general Gui update handler
160 gx_ui::GxUI::updateAllGuis();
161 return TRUE;
162 }
163
164 gboolean gx_check_cab_state(gpointer)
165 {
166 if(gx_engine::audio.fcab) {
167 if(gx_engine::audio.cab_switched != gx_engine::audio.cabinet
168 ||fabs( gx_engine::audio.cab_sum -(gx_engine::audio.cab_level+gx_engine::audio.cab_bass+gx_engine::audio.cab_treble))<-0.01
169 || fabs( gx_engine::audio.cab_sum -(gx_engine::audio.cab_level+gx_engine::audio.cab_bass+gx_engine::audio.cab_treble))>0.01) {
170
171 gx_engine::cab_conv.stop();
172 gx_gui::cab_conv_restart();
173 }
174 }
175 return TRUE;
145 gboolean gx_update_all_gui(gpointer) {
146 // the general Gui update handler
147 gx_ui::GxUI::updateAllGuis();
148 return TRUE;
149 }
150
151 gboolean gx_check_cab_state(gpointer) {
152 if (gx_engine::audio.fcab) {
153 if (gx_engine::audio.cab_switched != gx_engine::audio.cabinet
154 || fabs(gx_engine::audio.cab_sum - (gx_engine::audio.cab_level
155 + gx_engine::audio.cab_bass + gx_engine::audio.cab_treble)) < -0.01
156 || fabs(gx_engine::audio.cab_sum - (gx_engine::audio.cab_level
157 + gx_engine::audio.cab_bass + gx_engine::audio.cab_treble)) > 0.01) {
158
159 gx_engine::cab_conv.stop();
160 gx_gui::cab_conv_restart();
161 }
162 }
163 return TRUE;
176164 }
177165
178166 /** ----------- Glibc THREADS RUNNING BY GUITARIX ----------------- **/
179167 /** ----------- -------------------------------- ------------------ **/
180168
181169
182 //--- wait for USR1 signal to arrive and invoke ladi handler via mainloop
183 gpointer gx_signal_helper_thread(gpointer data)
184 {
185 int sig;
186 int ret;
187 sigset_t waitset;
188 guint source_id = 0;
189 sigemptyset(&waitset);
190 sigaddset(&waitset, SIGUSR1);
191 sigaddset(&waitset, SIGCHLD);
192 sigprocmask(SIG_BLOCK, &waitset, NULL);
193 while (true) {
194 ret = sigwait(&waitset, &sig);
195 if (ret == 0) {
196 if (sig == SIGUSR1) {
197 // do not add a new call if another one is already pending
198 if (source_id == 0 || g_main_context_find_source_by_id(NULL, source_id) == NULL)
199 source_id = g_idle_add(gx_ladi_handler, NULL);
200 } else {
201 assert(sig == SIGCHLD);
202 source_id = g_idle_add(gx_child_process::gx_sigchld_handler, NULL);
203 }
204 } else {
205 assert(errno == EINTR);
206 }
207 }
208 //notreached
209 return NULL;
210 }
211
212 //---- feed a midi program change from realtime thread to ui thread
213 gpointer gx_program_change_helper_thread(gpointer data)
214 {
215 gint pgm;
216 while (TRUE)
217 {
218 // wait for a semaphore post from jack realtime thread
219 sem_wait(&program_change_sem);
220 // atomic read and reset the variable
221 do
222 {
223 pgm = g_atomic_int_get(&program_change);
224 }
225 while (!g_atomic_int_compare_and_exchange(&program_change, pgm, -1));
226 assert(pgm != -1);
227 // get the work done by ui thread
228 g_idle_add(gx_do_program_change, (gpointer)pgm);
229 }
230 //notreached
231 return NULL;
170 // --- wait for USR1 signal to arrive and invoke ladi handler via mainloop
171 gpointer gx_signal_helper_thread(gpointer data) {
172 int sig;
173 int ret;
174 sigset_t waitset;
175 guint source_id = 0;
176 sigemptyset(&waitset);
177 sigaddset(&waitset, SIGUSR1);
178 sigaddset(&waitset, SIGCHLD);
179 sigprocmask(SIG_BLOCK, &waitset, NULL);
180 while (true) {
181 ret = sigwait(&waitset, &sig);
182 if (ret == 0) {
183 if (sig == SIGUSR1) {
184 // do not add a new call if another one is already pending
185 if (source_id == 0 || g_main_context_find_source_by_id(NULL, source_id) == NULL)
186 source_id = g_idle_add(gx_system::gx_ladi_handler, NULL);
187 } else {
188 assert(sig == SIGCHLD);
189 source_id = g_idle_add(gx_child_process::gx_sigchld_handler, NULL);
190 }
191 } else {
192 assert(errno == EINTR);
193 }
194 }
195 // notreached
196 return NULL;
197 }
198
199 // ---- feed a midi program change from realtime thread to ui thread
200 gpointer gx_program_change_helper_thread(gpointer data) {
201 gint pgm;
202 while (TRUE) {
203 // wait for a semaphore post from jack realtime thread
204 sem_wait(&gx_gui::program_change_sem);
205 // atomic read and reset the variable
206 do {
207 pgm = g_atomic_int_get(&gx_gui::program_change);
208 } while (!g_atomic_int_compare_and_exchange(&gx_gui::program_change, pgm, -1));
209 assert(pgm != -1);
210 // get the work done by ui thread
211 g_idle_add(gx_do_program_change, (gpointer)pgm);
212 }
213 // notreached
214 return NULL;
232215 }
233216
234217 /** ------------------- Glibc THREADS END ------------------------- **/
235218 /** ----------- -------------------------------- ------------------ **/
236
237 }
219 }
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * --------------------------------------------------------------------------
1718 *
1819 *
2425 * --------------------------------------------------------------------------
2526 */
2627
27 using namespace std;
28 #include "gx_ui.h"
29 #include <limits.h>
28 using namespace std; // NOLINT
29 #include "gx_ui.h" // NOLINT
3030
31 namespace gx_ui
32 {
31 #include <limits.h> // NOLINT
32 #include <list> // NOLINT
33
34 namespace gx_ui {
3335 list<GxUI*> GxUI::fGuiList;
3436
3537 // constructor
36 GxUI::GxUI()
37 {
38 fGuiList.push_back(this);
38 GxUI::GxUI() {
39 fGuiList.push_back(this);
3940 }
4041
4142 // -- registerZone(z,c) : zone management
42 void GxUI::registerZone(void* z, GxUiItem* c)
43 {
44 if (fZoneMap.find(z) == fZoneMap.end()) fZoneMap[z] = new clist();
45 fZoneMap[z]->push_back(c);
43 void GxUI::registerZone(void* z, GxUiItem* c) {
44 if (fZoneMap.find(z) == fZoneMap.end()) fZoneMap[z] = new clist();
45 fZoneMap[z]->push_back(c);
4646 }
4747
48 void GxUI::updateAllGuis()
49 {
50 list<GxUI*>::iterator g;
51 for (g = fGuiList.begin(); g != fGuiList.end(); g++)
52 {
53 (*g)->updateAllZones();
54 }
48 void GxUI::updateAllGuis() {
49 list<GxUI*>::iterator g;
50 for (g = fGuiList.begin(); g != fGuiList.end(); g++) {
51 (*g)->updateAllZones();
52 }
5553 }
5654
5755 // Update all user items reflecting zone z
58 inline void GxUI::updateZone(void* z)
59 {
60 clist* l = fZoneMap[z];
61 for (clist::iterator c = l->begin(); c != l->end(); c++)
62 if ((*c)->hasChanged()) (*c)->reflectZone();
56 inline void GxUI::updateZone(void* z) {
57 clist* l = fZoneMap[z];
58 for (clist::iterator c = l->begin(); c != l->end(); c++)
59 if ((*c)->hasChanged()) (*c)->reflectZone();
6360 }
6461
6562 // Update all user items not up to date
66 inline void GxUI::updateAllZones()
67 {
68 for (zmap::iterator m = fZoneMap.begin(); m != fZoneMap.end(); m++)
69 {
70 clist* l = m->second;
71 for (clist::iterator c = l->begin(); c != l->end(); c++) {
72 if ((*c)->hasChanged()) (*c)->reflectZone();
73 }
74 }
63 inline void GxUI::updateAllZones() {
64 for (zmap::iterator m = fZoneMap.begin(); m != fZoneMap.end(); m++) {
65 clist* l = m->second;
66 for (clist::iterator c = l->begin(); c != l->end(); c++) {
67 if ((*c)->hasChanged()) (*c)->reflectZone();
68 }
69 }
7570 }
7671
7772 /* ---------------- GxUiItem stuff --------------- */
78 GxUiItem::~GxUiItem()
79 {
73 GxUiItem::~GxUiItem() {
8074 }
8175
8276 GxUiItemFloat::GxUiItemFloat(GxUI* ui, float* zone)
83 : GxUiItem(ui), fZone(zone), fCache(-123456.654321)
84 {
85 ui->registerZone(zone, this);
77 : GxUiItem(ui), fZone(zone), fCache(-123456.654321) {
78 ui->registerZone(zone, this);
8679 }
8780
8881 GxUiItemInt::GxUiItemInt(GxUI* ui, int* zone)
89 : GxUiItem(ui), fZone(zone), fCache(INT_MAX)
90 {
91 ui->registerZone(zone, this);
82 : GxUiItem(ui), fZone(zone), fCache(INT_MAX) {
83 ui->registerZone(zone, this);
9284 }
9385
94 bool GxUiItemInt::hasChanged()
95 {
96 return *fZone != fCache;
86 bool GxUiItemInt::hasChanged() {
87 return *fZone != fCache;
9788 }
9889
99 void GxUiItemInt::modifyZone(int v)
100 {
101 fCache = v;
102 if (*fZone != v) {
103 *fZone = v;
104 fGUI->updateZone(fZone);
105 }
90 void GxUiItemInt::modifyZone(int v) {
91 fCache = v;
92 if (*fZone != v) {
93 *fZone = v;
94 fGUI->updateZone(fZone);
95 }
10696 }
10797
10898 GxUiItemBool::GxUiItemBool(GxUI* ui, bool* zone)
109 : GxUiItem(ui), fZone(zone), fCache(0)
110 {
111 ui->registerZone(zone, this);
99 : GxUiItem(ui), fZone(zone), fCache(0) {
100 ui->registerZone(zone, this);
112101 }
113102
114 bool GxUiItemBool::hasChanged()
115 {
116 return *fZone != fCache;
103 bool GxUiItemBool::hasChanged() {
104 return *fZone != fCache;
117105 }
118106
119 void GxUiItemBool::modifyZone(bool v)
120 {
121 fCache = v;
122 if (*fZone != v) {
123 *fZone = v;
124 fGUI->updateZone(fZone);
125 }
107 void GxUiItemBool::modifyZone(bool v) {
108 fCache = v;
109 if (*fZone != v) {
110 *fZone = v;
111 fGUI->updateZone(fZone);
112 }
126113 }
127114
128 bool GxUiItemFloat::hasChanged()
129 {
130 return *fZone != fCache;
115 bool GxUiItemFloat::hasChanged() {
116 return *fZone != fCache;
131117 }
132118
133119 // modify zone
134 void GxUiItemFloat::modifyZone(float v)
135 {
136 fCache = v;
137 if (*fZone != v) {
138 *fZone = v;
139 fGUI->updateZone(fZone);
140 }
120 void GxUiItemFloat::modifyZone(float v) {
121 fCache = v;
122 if (*fZone != v) {
123 *fZone = v;
124 fGUI->updateZone(fZone);
125 }
141126 }
142127
143128 /* ----------------- GxUiCallbackItem stuff ---------------- */
144129 GxUiCallbackItemFloat::GxUiCallbackItemFloat(GxUI* ui, float* zone, GxUiCallback foo, void* data)
145 : GxUiItemFloat(ui, zone), fCallback(foo), fData(data) {}
130 : GxUiItemFloat(ui, zone), fCallback(foo), fData(data) {}
146131
147132 // reflect zone
148 void GxUiCallbackItemFloat::reflectZone()
149 {
150 float v = *fZone;
151 fCache = v;
152 fCallback(v, fData);
133 void GxUiCallbackItemFloat::reflectZone() {
134 float v = *fZone;
135 fCache = v;
136 fCallback(v, fData);
153137 }
154138
155139 } /* end of guitarix namespace */
0 /*
1 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17 * ---------------------------------------------------------------------------
18 *
19 * This file is part of the gx_head GUI main class
20 *
21 * ----------------------------------------------------------------------------
22 */
23
24 #include <glibmm/i18n.h>
25
26 #include <string>
27
28 #include "guitarix.h"
29
30
31
32 namespace gx_gui
33 {
34 // -------------------------- gxwmm library controlers -----------------------------------
35
36 void set_osilloscope_mode(GtkWidget *widget, gpointer data) {
37 gx_gui::GxMainInterface* gui = gx_gui::GxMainInterface::instance();
38 if (gx_engine::audio.effect_pre_post[10]) {
39 gui->getWaveView().set_multiplicator(150.,250.);
40 } else {
41 gui->getWaveView().set_multiplicator(20.,60.);
42 }
43 }
44
45 void set_accessible(GtkWidget *widget,GtkLabel *label) {
46 AtkObject *atk_widget, *atk_label;
47 AtkRelationSet *relation_set;
48 AtkRelation *relation;
49 AtkObject *targets[1];
50
51 atk_widget = gtk_widget_get_accessible (widget);
52 atk_label = gtk_widget_get_accessible (GTK_WIDGET(label));
53
54 relation_set = atk_object_ref_relation_set (atk_label);
55 targets[0] = atk_widget;
56
57 relation = atk_relation_new(targets,1, ATK_RELATION_LABEL_FOR);
58 atk_relation_set_add(relation_set,relation);
59 g_object_unref(G_OBJECT(relation));
60
61 relation_set = atk_object_ref_relation_set (atk_widget);
62 targets[0] = atk_label;
63
64 relation = atk_relation_new (targets, 1, ATK_RELATION_LABELLED_BY);
65 atk_relation_set_add (relation_set, relation);
66 g_object_unref (G_OBJECT (relation));
67 }
68
69
70 /****************************************************************
71 ** UiRegler, UiSwitch
72 */
73
74 void UiRegler::on_value_changed() {
75 modifyZone(get_value());
76 }
77
78 void UiRegler::reflectZone() {
79 float v = *fZone;
80 fCache = v;
81 set_value(v);
82 }
83
84 GtkWidget *UiRegler::create(gx_ui::GxUI& ui, Gxw::Regler *regler, string id, bool show_value) {
85 if (!parameter_map.hasId(id)) {
86 return 0;
87 }
88 return (new UiRegler(ui, parameter_map[id].getFloat(), regler, show_value))->get_widget();
89 }
90
91 UiRegler::UiRegler(gx_ui::GxUI &ui, FloatParameter &param, Gxw::Regler *regler, bool show_value):
92 gx_ui::GxUiItemFloat(&ui, &param.value),
93 Gtk::Adjustment(param.std_value, param.lower, param.upper, param.step, 10*param.step, 0),
94 m_regler(regler) {
95 m_regler->set_show_value(show_value);
96 m_regler->set_name("regler");
97 m_regler->set_has_tooltip();
98 m_regler->set_tooltip_text(param.id().substr( param.id().find_last_of(".")+1).c_str());
99 m_regler->cp_set_var(param.id());
100 m_regler->set_adjustment(*this);
101 m_regler->show();
102 m_regler->get_accessible()->set_description (param.id().c_str());
103 m_regler->get_accessible()->set_name (param.id().substr( param.id().find_last_of(".")+1).c_str());
104
105 param.value = param.std_value;
106 connect_midi_controller(GTK_WIDGET(m_regler->gobj()), &param.value);
107 }
108
109 UiRegler::~UiRegler() {
110 delete m_regler;
111 }
112
113 UiSelector::UiSelector() {
114 m_selector.show();
115 }
116
117 void UiSelectorFloat::on_value_changed() {
118 modifyZone(get_value());
119 }
120
121 void UiSelectorInt::on_value_changed() {
122 modifyZone((int)get_value());
123 }
124
125 GtkWidget* UiSelector::create(gx_ui::GxUI& ui, string id) {
126 Parameter& p = parameter_map[id];
127 UiSelector *s;
128 if (p.isFloat()) {
129 s = new UiSelectorFloat(ui, p.getFloat());
130 } else {
131 s = new UiSelectorInt(ui, p.getInt());
132 }
133 return s->get_widget();
134 }
135
136 void UiSelector::init(Parameter& param) {
137 m_selector.cp_set_var(param.id());
138 Gtk::TreeModelColumn<Glib::ustring> label;
139 Gtk::TreeModelColumnRecord rec;
140 rec.add(label);
141 Glib::RefPtr<Gtk::ListStore> ls = Gtk::ListStore::create(rec);
142 for (const char **p = param.getValueNames(); *p; p++) {
143 ls->append()->set_value(0, Glib::ustring(*p));
144 }
145 m_selector.set_model(ls);
146 if (strcmp(param.group().c_str(),"Oscilloscope")==0) {
147 g_signal_connect (GTK_OBJECT (m_selector.gobj()), "value_changed", G_CALLBACK(set_osilloscope_mode), NULL);
148 }
149 }
150
151 UiSelectorFloat::UiSelectorFloat(gx_ui::GxUI& ui, FloatParameter &param)
152 : gx_ui::GxUiItemFloat(&ui, &param.value),
153 Gtk::Adjustment(param.std_value, param.lower, param.upper, param.step, 10*param.step, 0) {
154 m_selector.set_adjustment(*this);
155 init(param);
156 m_selector.get_accessible()->set_description (param.id().c_str());
157 m_selector.get_accessible()->set_name (param.id().substr( param.id().find_last_of(".")+1).c_str());
158 connect_midi_controller(GTK_WIDGET(m_selector.gobj()), fZone);
159 }
160
161 void UiSelectorFloat::reflectZone() {
162 float v = *fZone;
163 fCache = v;
164 set_value(v);
165 }
166
167 void UiSelectorInt::reflectZone() {
168 int v = *fZone;
169 fCache = v;
170 set_value(v);
171 }
172
173 UiSelectorInt::UiSelectorInt(gx_ui::GxUI& ui, IntParameter &param)
174 : gx_ui::GxUiItemInt(&ui, &param.value),
175 Gtk::Adjustment(param.std_value, param.lower, param.upper, 1, 5, 0) {
176 m_selector.set_adjustment(*this);
177 init(param);
178 m_selector.get_accessible()->set_description (param.id().c_str());
179 m_selector.get_accessible()->set_name (param.id().substr( param.id().find_last_of(".")+1).c_str());
180 connect_midi_controller(GTK_WIDGET(m_selector.gobj()), fZone);
181 }
182
183 GtkWidget* UiReglerWithCaption::create(gx_ui::GxUI& ui, Gxw::Regler *regler,
184 string id, bool show_value) {
185 if (!parameter_map.hasId(id)) {
186 return 0;
187 }
188 return create(ui, regler, id, parameter_map[id].name(), show_value);
189 }
190
191 GtkWidget* UiReglerWithCaption::create(gx_ui::GxUI& ui, Gxw::Regler *regler,
192 string id, Glib::ustring label, bool show_value) {
193 if (!parameter_map.hasId(id)) {
194 return 0;
195 }
196 return (new UiReglerWithCaption(ui, parameter_map[id].getFloat(), regler, label, show_value))->get_widget();
197 }
198
199 GtkWidget* UiRackReglerWithCaption::create(gx_ui::GxUI& ui, Gxw::Regler *regler, string id) {
200 if (!parameter_map.hasId(id)) {
201 return 0;
202 }
203 return create(ui, regler, id, parameter_map[id].name());
204 }
205
206 GtkWidget* UiRackReglerWithCaption::create(gx_ui::GxUI& ui, Gxw::Regler *regler,
207 string id, Glib::ustring label) {
208 if (!parameter_map.hasId(id)) {
209 return 0;
210 }
211 return (new UiRackReglerWithCaption(ui, parameter_map[id].getFloat(), regler,
212 label))->get_widget();
213 }
214
215 GtkWidget* UiRackRegler::create(gx_ui::GxUI& ui, Gxw::Regler *regler, string id) {
216 if (!parameter_map.hasId(id)) {
217 return 0;
218 }
219 return create(ui, regler, id, parameter_map[id].name());
220 }
221
222 GtkWidget* UiRackRegler::create(gx_ui::GxUI& ui, Gxw::Regler *regler,
223 string id, Glib::ustring label) {
224 if (!parameter_map.hasId(id)) {
225 return 0;
226 }
227 return (new UiRackRegler(ui, parameter_map[id].getFloat(), regler, label))->get_widget();
228 }
229 UiReglerWithCaption::UiReglerWithCaption(gx_ui::GxUI &ui,
230 FloatParameter &param, Gxw::Regler *regler,
231 Glib::ustring label, bool show_value)
232 : UiRegler(ui, param, regler, show_value) {
233 m_label.set_text(label);
234 m_label.set_name("effekt_label");
235 m_box.set_name(param.id());
236 m_box.pack_start(m_label, Gtk::PACK_SHRINK);
237 m_box.pack_start(*m_regler, Gtk::PACK_SHRINK);
238 set_accessible(GTK_WIDGET(m_regler->gobj()),m_label.gobj());
239 m_box.show_all();
240 }
241
242 UiRackReglerWithCaption::UiRackReglerWithCaption(gx_ui::GxUI &ui,
243 FloatParameter &param, Gxw::Regler *regler,
244 Glib::ustring label)
245 : UiRegler(ui, param, regler, true) {
246 m_label.set_text(label);
247 m_label.set_name("rack_label");
248 m_box.set_name(param.id());
249 m_box.pack_start(m_label, Gtk::PACK_SHRINK);
250 m_box.pack_start(*m_regler, Gtk::PACK_SHRINK);
251 set_accessible(GTK_WIDGET(m_regler->gobj()),m_label.gobj());
252 m_box.show_all();
253 }
254
255 UiRackRegler::UiRackRegler(gx_ui::GxUI &ui, FloatParameter &param, Gxw::Regler *regler,
256 Glib::ustring label)
257 : UiRegler(ui, param, regler, true) {
258 m_box.set_name(param.id());
259 m_box.pack_start(*m_regler, Gtk::PACK_SHRINK);
260 m_regler->set_name("rack_regler");
261 m_regler->get_accessible()->set_description (param.id().c_str());
262 m_regler->get_accessible()->set_name (param.id().substr(
263 param.id().find_last_of(".")+1).c_str());
264 m_box.show_all();
265 }
266
267 UiSwitch::UiSwitch(const char *sw_type):
268 Switch(sw_type) {
269 }
270
271 UiSwitch *UiSwitch::new_switch(gx_ui::GxUI& ui, const char* sw_type, Parameter& param) {
272 if (param.isFloat()) {
273 return new UiSwitchFloat(ui, sw_type, param.getFloat());
274 } else {
275 return new UiSwitchBool(ui, sw_type, param.getBool());
276 }
277 }
278
279 void UiSwitchFloat::on_toggled() {
280 modifyZone(get_active());
281 }
282
283 void UiSwitchFloat::reflectZone() {
284 float v = *fZone;
285 fCache = v;
286 set_active(v != 0.0);
287 }
288
289 UiSwitchFloat::UiSwitchFloat(gx_ui::GxUI& ui, const char *sw_type, FloatParameter &param)
290 : UiSwitch(sw_type),
291 gx_ui::GxUiItemFloat(&ui, &param.value) {
292 param.set_std_value();
293 set_active(param.value != 0.0);
294 cp_set_var(param.id());
295 this->set_tooltip_text(param.id().substr( param.id().find_last_of(".")+1).c_str());
296 this->get_accessible()->set_description (param.id().c_str());
297 this->get_accessible()->set_name (param.id().substr(
298 param.id().find_last_of(".")+1).c_str());
299 connect_midi_controller(GTK_WIDGET(gobj()), fZone);
300 show();
301 }
302
303 void UiSwitchBool::on_toggled() {
304 modifyZone(get_active());
305 }
306
307 void UiSwitchBool::reflectZone() {
308 bool v = *fZone;
309 fCache = v;
310 set_active(v != 0);
311 }
312
313 UiSwitchBool::UiSwitchBool(gx_ui::GxUI& ui, const char *sw_type, BoolParameter &param)
314 : UiSwitch(sw_type),
315 gx_ui::GxUiItemBool(&ui, &param.value) {
316 param.set_std_value();
317 set_active(param.value);
318 cp_set_var(param.id());
319 char s[64];
320 snprintf(s, 63, _("%s on/off"),param.group().c_str());
321 this->set_tooltip_text(s);
322 this->get_accessible()->set_description (param.id().c_str());
323 this->get_accessible()->set_name
324 (param.id().substr( param.id().find_last_of(".")+1).c_str());
325 connect_midi_controller(GTK_WIDGET(gobj()), fZone);
326 show();
327 }
328
329 GtkWidget* UiSwitchWithCaption::create(
330 gx_ui::GxUI& ui, const char *sw_type, string id, Gtk::PositionType pos) {
331 if (!parameter_map.hasId(id)) {
332 return 0;
333 }
334 return create(ui, sw_type, id, parameter_map[id].name(), pos);
335 }
336
337 GtkWidget* UiSwitchWithCaption::create(
338 gx_ui::GxUI& ui, const char *sw_type, string id,
339 Glib::ustring label, Gtk::PositionType pos) {
340 if (!parameter_map.hasId(id)) {
341 return 0;
342 }
343 return (new UiSwitchWithCaption(ui, sw_type, parameter_map[id],
344 label, pos))->get_widget();
345 }
346
347 UiSwitchWithCaption::UiSwitchWithCaption(gx_ui::GxUI &ui,
348 const char *sw_type, Parameter &param,
349 Glib::ustring label, Gtk::PositionType pos):
350 m_switch(UiSwitch::new_switch(ui, sw_type, param)) {
351 m_label.set_text(label);
352 m_label.set_name("effekt_label");
353 if (pos == Gtk::POS_LEFT || pos == Gtk::POS_RIGHT) {
354 m_box = new Gtk::HBox();
355 } else {
356 m_box = new Gtk::VBox();
357 }
358 if (pos == Gtk::POS_LEFT || pos == Gtk::POS_TOP) {
359 m_box->pack_start(m_label, Gtk::PACK_SHRINK);
360 m_box->pack_start(*m_switch, Gtk::PACK_SHRINK);
361 } else {
362 m_box->pack_start(*m_switch, Gtk::PACK_SHRINK);
363 m_box->pack_start(m_label, Gtk::PACK_SHRINK);
364 }
365 m_box->set_name(param.id());
366 set_accessible(GTK_WIDGET(m_switch->gobj()),m_label.gobj());
367 m_box->show_all();
368 }
369
370 UiSwitchWithCaption::~UiSwitchWithCaption() {
371 delete m_switch;
372 delete m_box;
373 }
374
375 UiCabSwitch::UiCabSwitch(gx_ui::GxUI &ui, Parameter &param, Glib::ustring label)
376 : UiSwitchWithCaption(ui, sw_minitoggle, param, label, Gtk::POS_RIGHT) {
377 m_switch->signal_toggled().connect(sigc::mem_fun(*this, &UiCabSwitch::on_switch_toggled));
378 }
379
380 GtkWidget* UiCabSwitch::create(gx_ui::GxUI& ui, string id, Glib::ustring label) {
381 if (!parameter_map.hasId(id)) {
382 return 0;
383 }
384 return (new UiCabSwitch(ui, parameter_map[id], label))->get_widget();
385 }
386
387 UiContrastSwitch::UiContrastSwitch(gx_ui::GxUI &ui, Parameter &param, Glib::ustring label)
388 : UiSwitchWithCaption(ui, sw_minitoggle, param, label, Gtk::POS_RIGHT) {
389 m_switch->signal_toggled().connect(sigc::mem_fun
390 (*this, &UiContrastSwitch::on_switch_toggled));
391 }
392
393 GtkWidget* UiContrastSwitch::create(gx_ui::GxUI& ui, string id, Glib::ustring label) {
394 if (!parameter_map.hasId(id)) {
395 return 0;
396 }
397 return (new UiContrastSwitch(ui, parameter_map[id], label))->get_widget();
398 }
399
400 }/* end of gx_gui namespace */
401
3838 &lt;span font_desc="Sans 12" foreground="#991A1A"&gt;Please open an impulse
3939 response file with the
4040 &lt;b&gt;File:&lt;/b&gt; button&lt;/span&gt;</property>
41 <signal name="scale_min_reached" handler="on_min_scale_reached"/>
42 <signal name="offset_changed" handler="on_offset_changed"/>
43 <signal name="length_changed" handler="on_length_changed"/>
4144 <signal name="delay_changed" handler="on_delay_changed"/>
4245 <signal name="scale_max_reached" handler="on_max_scale_reached"/>
43 <signal name="length_changed" handler="on_length_changed"/>
44 <signal name="scale_min_reached" handler="on_min_scale_reached"/>
45 <signal name="offset_changed" handler="on_offset_changed"/>
4646 </object>
4747 </child>
4848 </object>
315315 <property name="left_padding">12</property>
316316 <property name="right_padding">4</property>
317317 <child>
318 <object class="GtkTable" id="table1">
318 <object class="GtkVBox" id="vbox12">
319319 <property name="visible">True</property>
320 <property name="n_rows">5</property>
321 <property name="n_columns">3</property>
322 <property name="column_spacing">5</property>
323 <child>
324 <object class="GtkLabel" id="label9">
325 <property name="visible">True</property>
326 <property name="xalign">0</property>
327 <property name="label" translatable="yes">Delay</property>
320 <property name="orientation">vertical</property>
321 <child>
322 <object class="GtkTable" id="table1">
323 <property name="visible">True</property>
324 <property name="n_rows">5</property>
325 <property name="n_columns">3</property>
326 <property name="column_spacing">5</property>
327 <child>
328 <object class="GtkLabel" id="label9">
329 <property name="visible">True</property>
330 <property name="xalign">0</property>
331 <property name="label" translatable="yes">Delay</property>
332 </object>
333 <packing>
334 <property name="top_attach">1</property>
335 <property name="bottom_attach">2</property>
336 <property name="x_options">GTK_FILL</property>
337 <property name="y_options">GTK_FILL</property>
338 </packing>
339 </child>
340 <child>
341 <object class="GtkLabel" id="label10">
342 <property name="visible">True</property>
343 <property name="xalign">0</property>
344 <property name="label" translatable="yes">Offset</property>
345 </object>
346 <packing>
347 <property name="top_attach">2</property>
348 <property name="bottom_attach">3</property>
349 <property name="x_options">GTK_FILL</property>
350 <property name="y_options">GTK_FILL</property>
351 </packing>
352 </child>
353 <child>
354 <object class="GtkLabel" id="label11">
355 <property name="visible">True</property>
356 <property name="xalign">0</property>
357 <property name="label" translatable="yes">Length</property>
358 </object>
359 <packing>
360 <property name="top_attach">3</property>
361 <property name="bottom_attach">4</property>
362 <property name="x_options">GTK_FILL</property>
363 <property name="y_options">GTK_FILL</property>
364 </packing>
365 </child>
366 <child>
367 <object class="GxValueDisplay" id="delay">
368 <property name="visible">True</property>
369 <property name="can_focus">True</property>
370 <property name="receives_default">True</property>
371 <property name="adjustment">adjustment1</property>
372 <property name="round_digits">0</property>
373 <property name="value_xalign">1</property>
374 <signal name="value_changed" handler="on_m_delay_changed"/>
375 </object>
376 <packing>
377 <property name="left_attach">1</property>
378 <property name="right_attach">2</property>
379 <property name="top_attach">1</property>
380 <property name="bottom_attach">2</property>
381 </packing>
382 </child>
383 <child>
384 <object class="GxValueDisplay" id="offset">
385 <property name="visible">True</property>
386 <property name="can_focus">True</property>
387 <property name="receives_default">True</property>
388 <property name="adjustment">adjustment2</property>
389 <property name="round_digits">0</property>
390 <property name="value_xalign">1</property>
391 <signal name="value_changed" handler="on_m_offset_changed"/>
392 </object>
393 <packing>
394 <property name="left_attach">1</property>
395 <property name="right_attach">2</property>
396 <property name="top_attach">2</property>
397 <property name="bottom_attach">3</property>
398 </packing>
399 </child>
400 <child>
401 <object class="GxValueDisplay" id="irlength">
402 <property name="visible">True</property>
403 <property name="can_focus">True</property>
404 <property name="receives_default">True</property>
405 <property name="adjustment">adjustment3</property>
406 <property name="round_digits">0</property>
407 <property name="value_xalign">1</property>
408 <signal name="value_changed" handler="on_m_length_changed"/>
409 </object>
410 <packing>
411 <property name="left_attach">1</property>
412 <property name="right_attach">2</property>
413 <property name="top_attach">3</property>
414 <property name="bottom_attach">4</property>
415 </packing>
416 </child>
417 <child>
418 <object class="GtkButton" id="apply_button">
419 <property name="label">App_ly</property>
420 <property name="visible">True</property>
421 <property name="can_focus">True</property>
422 <property name="receives_default">True</property>
423 <property name="use_underline">True</property>
424 <signal name="clicked" handler="on_apply_button_clicked"/>
425 </object>
426 <packing>
427 <property name="right_attach">3</property>
428 <property name="top_attach">4</property>
429 <property name="bottom_attach">5</property>
430 <property name="x_options"></property>
431 <property name="y_options"></property>
432 <property name="y_padding">8</property>
433 </packing>
434 </child>
435 <child>
436 <object class="GxValueDisplay" id="delay_ms">
437 <property name="visible">True</property>
438 <property name="can_focus">True</property>
439 <property name="receives_default">True</property>
440 <property name="adjustment">adjustment5</property>
441 <property name="round_digits">0</property>
442 <property name="value_xalign">1</property>
443 <signal name="value_changed" handler="on_ms_delay_changed"/>
444 </object>
445 <packing>
446 <property name="left_attach">2</property>
447 <property name="right_attach">3</property>
448 <property name="top_attach">1</property>
449 <property name="bottom_attach">2</property>
450 </packing>
451 </child>
452 <child>
453 <object class="GxValueDisplay" id="offset_ms">
454 <property name="visible">True</property>
455 <property name="can_focus">True</property>
456 <property name="receives_default">True</property>
457 <property name="adjustment">adjustment6</property>
458 <property name="round_digits">0</property>
459 <property name="value_xalign">1</property>
460 <signal name="value_changed" handler="on_ms_offset_changed"/>
461 </object>
462 <packing>
463 <property name="left_attach">2</property>
464 <property name="right_attach">3</property>
465 <property name="top_attach">2</property>
466 <property name="bottom_attach">3</property>
467 </packing>
468 </child>
469 <child>
470 <object class="GxValueDisplay" id="irlength_ms">
471 <property name="visible">True</property>
472 <property name="can_focus">True</property>
473 <property name="receives_default">True</property>
474 <property name="adjustment">adjustment7</property>
475 <property name="round_digits">0</property>
476 <property name="value_xalign">1</property>
477 <signal name="value_changed" handler="on_ms_length_changed"/>
478 </object>
479 <packing>
480 <property name="left_attach">2</property>
481 <property name="right_attach">3</property>
482 <property name="top_attach">3</property>
483 <property name="bottom_attach">4</property>
484 </packing>
485 </child>
486 <child>
487 <object class="GtkLabel" id="label15">
488 <property name="visible">True</property>
489 <property name="xalign">1</property>
490 <property name="label" translatable="yes">&lt;small&gt;Samples&lt;/small&gt;</property>
491 <property name="use_markup">True</property>
492 </object>
493 <packing>
494 <property name="left_attach">1</property>
495 <property name="right_attach">2</property>
496 <property name="x_options">GTK_FILL</property>
497 <property name="y_options">GTK_FILL</property>
498 </packing>
499 </child>
500 <child>
501 <object class="GtkLabel" id="label16">
502 <property name="visible">True</property>
503 <property name="label" translatable="yes">&lt;small&gt;MSec&lt;/small&gt;</property>
504 <property name="use_markup">True</property>
505 </object>
506 <packing>
507 <property name="left_attach">2</property>
508 <property name="right_attach">3</property>
509 </packing>
510 </child>
511 <child>
512 <placeholder/>
513 </child>
328514 </object>
329515 <packing>
330 <property name="top_attach">1</property>
331 <property name="bottom_attach">2</property>
332 <property name="x_options">GTK_FILL</property>
333 <property name="y_options">GTK_FILL</property>
516 <property name="position">0</property>
334517 </packing>
335518 </child>
336519 <child>
337 <object class="GtkLabel" id="label10">
338 <property name="visible">True</property>
339 <property name="xalign">0</property>
340 <property name="label" translatable="yes">Offset</property>
341 </object>
342 <packing>
343 <property name="top_attach">2</property>
344 <property name="bottom_attach">3</property>
345 <property name="x_options">GTK_FILL</property>
346 <property name="y_options">GTK_FILL</property>
347 </packing>
348 </child>
349 <child>
350 <object class="GtkLabel" id="label11">
351 <property name="visible">True</property>
352 <property name="xalign">0</property>
353 <property name="label" translatable="yes">Length</property>
354 </object>
355 <packing>
356 <property name="top_attach">3</property>
357 <property name="bottom_attach">4</property>
358 <property name="x_options">GTK_FILL</property>
359 <property name="y_options">GTK_FILL</property>
360 </packing>
361 </child>
362 <child>
363 <object class="GxValueDisplay" id="delay">
520 <object class="GtkToggleButton" id="gain_button">
521 <property name="label" translatable="yes">Auto _Gain correction</property>
364522 <property name="visible">True</property>
365523 <property name="can_focus">True</property>
366524 <property name="receives_default">True</property>
367 <property name="tooltip_text" translatable="yes">delay of the processed signal</property>
368 <property name="adjustment">adjustment1</property>
369 <property name="value_xalign">1</property>
370 <signal name="value_changed" handler="on_m_delay_changed"/>
525 <property name="use_underline">True</property>
371526 </object>
372527 <packing>
373 <property name="left_attach">1</property>
374 <property name="right_attach">2</property>
375 <property name="top_attach">1</property>
376 <property name="bottom_attach">2</property>
528 <property name="expand">False</property>
529 <property name="fill">False</property>
530 <property name="position">1</property>
377531 </packing>
378 </child>
379 <child>
380 <object class="GxValueDisplay" id="offset">
381 <property name="visible">True</property>
382 <property name="can_focus">True</property>
383 <property name="receives_default">True</property>
384 <property name="tooltip_text" translatable="yes">number of samples to skip at the
385 beginning of the IR file</property>
386 <property name="adjustment">adjustment2</property>
387 <property name="value_xalign">1</property>
388 <signal name="value_changed" handler="on_m_offset_changed"/>
389 </object>
390 <packing>
391 <property name="left_attach">1</property>
392 <property name="right_attach">2</property>
393 <property name="top_attach">2</property>
394 <property name="bottom_attach">3</property>
395 </packing>
396 </child>
397 <child>
398 <object class="GxValueDisplay" id="irlength">
399 <property name="visible">True</property>
400 <property name="can_focus">True</property>
401 <property name="receives_default">True</property>
402 <property name="tooltip_text" translatable="yes">number of samples used for convolution</property>
403 <property name="adjustment">adjustment3</property>
404 <property name="value_xalign">1</property>
405 <signal name="value_changed" handler="on_m_length_changed"/>
406 </object>
407 <packing>
408 <property name="left_attach">1</property>
409 <property name="right_attach">2</property>
410 <property name="top_attach">3</property>
411 <property name="bottom_attach">4</property>
412 </packing>
413 </child>
414 <child>
415 <object class="GtkButton" id="apply_button">
416 <property name="label">_Apply</property>
417 <property name="visible">True</property>
418 <property name="can_focus">True</property>
419 <property name="receives_default">False</property>
420 <property name="tooltip_text" translatable="yes">restart convolver with current settings</property>
421 <property name="use_underline">True</property>
422 <signal name="clicked" handler="on_apply_button_clicked"/>
423 </object>
424 <packing>
425 <property name="right_attach">3</property>
426 <property name="top_attach">4</property>
427 <property name="bottom_attach">5</property>
428 <property name="x_options"></property>
429 <property name="y_options"></property>
430 <property name="y_padding">8</property>
431 </packing>
432 </child>
433 <child>
434 <object class="GxValueDisplay" id="delay_ms">
435 <property name="visible">True</property>
436 <property name="can_focus">True</property>
437 <property name="receives_default">True</property>
438 <property name="tooltip_text" translatable="yes">delay in milliseconds</property>
439 <property name="adjustment">adjustment5</property>
440 <property name="value_xalign">1</property>
441 <signal name="value_changed" handler="on_ms_delay_changed"/>
442 </object>
443 <packing>
444 <property name="left_attach">2</property>
445 <property name="right_attach">3</property>
446 <property name="top_attach">1</property>
447 <property name="bottom_attach">2</property>
448 </packing>
449 </child>
450 <child>
451 <object class="GxValueDisplay" id="offset_ms">
452 <property name="visible">True</property>
453 <property name="can_focus">True</property>
454 <property name="receives_default">True</property>
455 <property name="tooltip_text" translatable="yes">offset in milliseconds</property>
456 <property name="adjustment">adjustment6</property>
457 <property name="value_xalign">1</property>
458 <signal name="value_changed" handler="on_ms_offset_changed"/>
459 </object>
460 <packing>
461 <property name="left_attach">2</property>
462 <property name="right_attach">3</property>
463 <property name="top_attach">2</property>
464 <property name="bottom_attach">3</property>
465 </packing>
466 </child>
467 <child>
468 <object class="GxValueDisplay" id="irlength_ms">
469 <property name="visible">True</property>
470 <property name="can_focus">True</property>
471 <property name="receives_default">True</property>
472 <property name="tooltip_text" translatable="yes">length in milliseconds</property>
473 <property name="adjustment">adjustment7</property>
474 <property name="value_xalign">1</property>
475 <signal name="value_changed" handler="on_ms_length_changed"/>
476 </object>
477 <packing>
478 <property name="left_attach">2</property>
479 <property name="right_attach">3</property>
480 <property name="top_attach">3</property>
481 <property name="bottom_attach">4</property>
482 </packing>
483 </child>
484 <child>
485 <object class="GtkLabel" id="label15">
486 <property name="visible">True</property>
487 <property name="xalign">1</property>
488 <property name="label" translatable="yes">&lt;small&gt;Samples&lt;/small&gt;</property>
489 <property name="use_markup">True</property>
490 </object>
491 <packing>
492 <property name="left_attach">1</property>
493 <property name="right_attach">2</property>
494 <property name="x_options">GTK_FILL</property>
495 <property name="y_options">GTK_FILL</property>
496 </packing>
497 </child>
498 <child>
499 <object class="GtkLabel" id="label16">
500 <property name="visible">True</property>
501 <property name="label" translatable="yes">&lt;small&gt;MSec&lt;/small&gt;</property>
502 <property name="use_markup">True</property>
503 </object>
504 <packing>
505 <property name="left_attach">2</property>
506 <property name="right_attach">3</property>
507 </packing>
508 </child>
509 <child>
510 <placeholder/>
511532 </child>
512533 </object>
513534 </child>
797818 <property name="visible">True</property>
798819 <property name="can_focus">True</property>
799820 <property name="receives_default">True</property>
800 <property name="tooltip_text" translatable="yes">reset to standard values</property>
801821 <signal name="clicked" handler="on_reset_clicked"/>
802822 </object>
803823 </child>
12611281 </data>
12621282 </object>
12631283 <object class="GtkListStore" id="liststore3"/>
1284 <object class="GtkRadioButton" id="radiobutton1">
1285 <property name="label" translatable="yes">radiobutton</property>
1286 <property name="visible">True</property>
1287 <property name="can_focus">True</property>
1288 <property name="receives_default">False</property>
1289 <property name="active">True</property>
1290 <property name="draw_indicator">True</property>
1291 </object>
12641292 </interface>
66 def build(bld):
77 sources = [
88 'gx_jconv_settings.cpp',
9 'gx_main_midi.cpp',
910 'gx_main_interface.cpp',
11 'gx_main_boxes.cpp',
12 'gxw_mm_controllers.cpp',
1013 'gx_interface_builder.cpp',
1114 'gx_mono_rack_builder.cpp',
1215 'gx_stereo_rack_builder.cpp',
1316 'gx_globals.cpp',
1417 'gx_child_process.cpp',
18 'gx_engine_tubetable.cpp',
1519 'gx_engine.cpp',
1620 'gx_engine_midi.cpp',
1721 'gx_convolver.cpp',
+0
-109
src/headers/GtkFastMeter.h less more
0 /*
1 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 *
17 * --------------------------------------------------------------------------
18 *
19 * Class declaration for a level display
20 *
21 * (Code shamelessly stolen from Ardour by Paul Davis, thanks man!)
22 *
23 * --------------------------------------------------------------------------
24 */
25
26 #ifndef __GTK_FAST_METER_H__
27 #define __GTK_FAST_METER_H__
28
29
30 #include <gdk/gdk.h>
31 #include <gtk/gtkdrawingarea.h>
32
33
34 #ifdef __cplusplus
35 extern "C" {
36 #endif /* __cplusplus */
37
38 #define GTK_TYPE_FAST_METER (gtk_fast_meter_get_type())
39 #define GTK_FAST_METER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GTK_TYPE_FAST_METER, GtkFastMeter))
40 #define GTK_IS_FAST_METER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GTK_TYPE_FAST_METER))
41 #define GTK_FAST_METER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GTK_TYPE_FAST_METER, GtkFastMeterClass))
42 #define GTK_IS_FAST_METER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GTK_TYPE_FAST_METER))
43
44
45 typedef struct _GtkFastMeter GtkFastMeter;
46 typedef struct _GtkFastMeterClass GtkFastMeterClass;
47
48 struct _GtkFastMeter
49 {
50 GtkWidget widget;
51
52 GdkPixbuf* pixbuf;
53 gint pixheight;
54 gint pixwidth;
55
56 GdkRectangle pixrect;
57 GdkRectangle last_peak_rect;
58
59 gint request_width;
60 gint request_height;
61
62 unsigned long hold_cnt;
63 unsigned long hold_state;
64
65 float current_level;
66 float current_peak;
67 float current_user_level;
68
69 static int min_v_pixbuf_size;
70 static int max_v_pixbuf_size;
71 static int rgb0, rgb1, rgb2, rgb3;
72
73 };
74
75 struct _GtkFastMeterClass
76 {
77 GtkWidgetClass parent_class;
78 };
79
80 GType gtk_fast_meter_get_type (void);
81
82 /* --------- public exposed API --------- */
83 GtkWidget* gtk_fast_meter_new (long,
84 unsigned long,
85 int,
86 int,
87 int,
88 int,
89 int);
90
91 void gtk_fast_meter_destroy (GtkObject* object);
92
93 void gtk_fast_meter_set (GtkFastMeter*, float);
94 void gtk_fast_meter_clear (GtkFastMeter*);
95
96 float gtk_fast_meter_get_level (GtkFastMeter*);
97 float gtk_fast_meter_get_user_level (GtkFastMeter*);
98 float gtk_fast_meter_get_peak (GtkFastMeter*);
99
100 long gtk_fast_meter_hold_count (GtkFastMeter*);
101 void gtk_fast_meter_set_hold_count (GtkFastMeter*, long);
102
103 #ifdef __cplusplus
104 }
105 #endif /* __cplusplus */
106
107
108 #endif /* __GTK_FAST_METER_H__ */
+0
-58
src/headers/GtkRegler.h less more
0 /*
1 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 */
17
18 // ***** GtkRegler.h *****
19 /******************************************************************************
20 part of guitarix, use knobs with Gtk
21 ******************************************************************************/
22 #pragma once
23
24 class GtkRegler
25 {
26 private:
27
28 public:
29 GtkRange parent;
30 int regler_type;
31 int last_quadrant;
32 const char* labels[12];
33 double start_x, start_y, max_value;
34
35 GtkRegler();
36 ~GtkRegler();
37
38 static void gtk_regler_destroy ( );
39 static void gtk_regler_init_pixmaps(int change_knob);
40 GtkWidget *gtk_hslider_new_with_adjustment(GtkAdjustment *_adjustment);
41 GtkWidget *gtk_vslider_new_with_adjustment(GtkAdjustment *_adjustment);
42 GtkWidget *gtk_mini_slider_new_with_adjustment(GtkAdjustment *_adjustment);
43 GtkWidget *gtk_eq_slider_new_with_adjustment(GtkAdjustment *_adjustment);
44 GtkWidget *gtk_toggle_new_with_adjustment(GtkAdjustment *_adjustment);
45 GtkWidget *gtk_switch_new_with_adjustment(GtkAdjustment *_adjustment);
46 GtkWidget *gtk_regler_new_with_adjustment(GtkAdjustment *_adjustment);
47 GtkWidget *gtk_big_regler_new_with_adjustment(GtkAdjustment *_adjustment);
48 GtkWidget *gtk_mini_toggle_new_with_adjustment(GtkAdjustment *_adjustment);
49 GtkWidget *gtk_wheel_new_with_adjustment(GtkAdjustment *_adjustment);
50 GtkWidget *gtk_button_toggle_new_with_adjustment(GtkAdjustment *_adjustment);
51 GtkWidget *gtk_led_new_with_adjustment(GtkAdjustment *_adjustment);
52 GtkWidget *gtk_value_display(GtkAdjustment *_adjustment);
53 GtkWidget *gtk_button_rec_new_with_adjustment(GtkAdjustment *_adjustment);
54 GtkWidget *gtk_button_play_new_with_adjustment(GtkAdjustment *_adjustment);
55 GtkWidget *gtk_selector_new_with_adjustment(GtkAdjustment *_adjustment,int maxv, const char* []);
56 };
57
+0
-65
src/headers/GtkWaveView.h less more
0 /*
1 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 */
17
18 // ***** GtkWaveView.h *****
19 /******************************************************************************
20 part of guitarix, plot a wave with Gtk
21 ******************************************************************************/
22 #pragma once
23
24 /* internal enum sets */
25 typedef enum {
26 kWvTypeJConv = 0,
27 kWvTypeLive,
28 kWvTypeTuner
29 } GxWaveviewType;
30
31 class GtkWaveView
32 {
33 private:
34
35 public:
36 inline GtkWaveView() {};
37 inline ~GtkWaveView() {};
38
39 GtkRange parent;
40 double start_x, start_y, start_value;
41 GxWaveviewType waveview_type;
42
43
44 virtual void gtk_waveview_destroy (GtkWidget*, gpointer);
45 virtual gboolean gtk_waveview_refresh (GtkWidget*, gpointer);
46 virtual gboolean gtk_waveview_set_value (GtkWidget*, gpointer);
47 virtual gboolean gtk_tuner_refresh (GtkWidget*, gpointer);
48
49
50 virtual GtkWidget* gtk_wave_view();
51 virtual GtkWidget* gtk_wave_live_view(float*, float*, GtkAdjustment*);
52 virtual GtkWidget* gtk_tuner_view();
53 };
54
55
56 /* prototype functions wrapping around class methods */
57 void gx_waveview_set_value(GtkWidget*, gpointer);
58 void gx_waveview_destroy(GtkWidget*, gpointer);
59 void gx_waveview_refresh(GtkWidget*, gpointer);
60 void gx_tuner_refresh(GtkWidget*, gpointer);
61
62 GtkWidget* gx_wave_view();
63 GtkWidget* gx_tuner_view();
64 GtkWidget* gx_wave_live_view(float*, float*, GtkAdjustment*);
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * --------------------------------------------------------------------------
1718 *
1819 *
2728
2829 #pragma once
2930
31 #ifndef SRC_HEADERS_GUITARIX_H_
32 #define SRC_HEADERS_GUITARIX_H_
33
3034 /* system header files */
3135 #include <boost/format.hpp>
3236
3337 /* waf generated defines */
34 #include "config.h"
38 #include "../config.h"
3539
3640 using namespace std;
3741
3842 /* guitarix declarations */
39 #include "gx_globals.h"
40 #include "gx_system.h"
41 #include "gx_jack.h"
42 #include "gx_child_process.h"
43 #include "gx_sndfile.h"
44 #include "gx_ui.h"
45 #include "gx_convolver.h"
46 #include "gx_pitch_tracker.h"
47 #include "gx_resampler.h"
48 #include "gx_engine.h"
49 #include "gx_parameter.h"
50 #include "gx_preset.h"
51 #include "gx_jconv_settings.h"
52 #include "gx_threads.h"
53 #include "gx_cairo_callbacks.h"
54 #include "gx_gui_helpers.h"
55 #include "gx_main_interface.h"
43 #include "./gx_globals.h"
44 #include "./gx_system.h"
45 #include "./gx_jack.h"
46 #include "./gx_portmap.h"
47 #include "./gx_child_process.h"
48 #include "./gx_convolver.h"
49 #include "./gx_pitch_tracker.h"
50 #include "./gx_resampler.h"
51 #include "./gx_threads.h"
52 #include "./gx_cairo_callbacks.h"
53 #include "./gx_parameter.h"
54 #include "./gx_preset.h"
55 #include "./gx_jconv_settings.h"
56 #include "./gx_engine_tubetable.h"
57 #include "./gx_engine.h"
58 #include "./gx_gui_helpers.h"
59 #include "./gx_main_midi.h"
60
61 #include "./gx_ui.h"
62 #include "./gx_main_interface.h"
63 #include "./gx_main_boxes.h"
64
65 #endif // SRC_HEADERS_GUITARIX_H_
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * --------------------------------------------------------------------------
1718 */
1819
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * --------------------------------------------------------------------------
1718 */
1819
2021
2122 #pragma once
2223
24 #ifndef SRC_HEADERS_GX_CHILD_PROCESS_H_
25 #define SRC_HEADERS_GX_CHILD_PROCESS_H_
26
2327 #include <sigc++/sigc++.h>
2428
25 namespace gx_child_process
26 {
29 #include <string>
30 #include <list>
2731
28 class GxChild
29 {
30 public:
31 sigc::signal<void, bool> terminated;
32 bool kill();
33 bool hasPid(pid_t pid) { return pid == m_pid; }
34 bool hasName(string name) { return name == m_name; }
32 namespace gx_child_process {
3533
36 private:
37 string m_name;
38 int m_killsignal;
39 int m_pid;
40 GxChild(string name, int killsignal, int pid): m_name(name), m_killsignal(killsignal), m_pid(pid) {}
41 friend class GxChildProcs;
34 class GxChild {
35 public:
36 sigc::signal<void, bool> terminated;
37 bool kill();
38 bool hasPid(pid_t pid) { return pid == m_pid; }
39 bool hasName(string name) { return name == m_name; }
40
41 private:
42 string m_name;
43 int m_killsignal;
44 int m_pid;
45 GxChild(string name, int killsignal, int pid):
46 m_name(name), m_killsignal(killsignal), m_pid(pid) {}
47 friend class GxChildProcs;
4248 };
4349
44 class GxChildProcs
45 {
46 private:
47 list<GxChild*> children;
50 class GxChildProcs {
51 private:
52 list<GxChild*> children;
4853
49 public:
50 ~GxChildProcs();
51 bool killall();
52 bool kill(string name);
53 GxChild *find(string name);
54 GxChild *launch(string name, const char* const args[], int killsignal);
55 GxChild *launch(string name, list<string> args, int killsignal);
56 friend gboolean gx_sigchld_handler(gpointer);
54 public:
55 ~GxChildProcs();
56 bool killall();
57 bool kill(string name);
58 GxChild *find(string name);
59 GxChild *launch(string name, const char* const args[], int killsignal);
60 GxChild *launch(string name, list<string> args, int killsignal);
61 friend gboolean gx_sigchld_handler(gpointer);
5762 };
5863
5964 extern GxChildProcs childprocs;
6469 ** classes for UI callbacks
6570 */
6671
67 class JackCaptureGui: public sigc::trackable
68 {
69 private:
70 GtkCheckMenuItem *item;
71 void terminated(bool pgm_found);
72 JackCaptureGui(GxChild *p, GtkCheckMenuItem *i);
73 public:
74 static void start_stop(GtkCheckMenuItem *menuitem, gpointer);
72 class JackCaptureGui: public sigc::trackable {
73 private:
74 GtkCheckMenuItem *item;
75 void terminated(bool pgm_found);
76 JackCaptureGui(GxChild *p, GtkCheckMenuItem *i);
77 public:
78 static void start_stop(GtkCheckMenuItem *menuitem, gpointer);
7579 };
7680
77 class JackCapture: public sigc::trackable
78 {
79 private:
80 GtkToggleButton *button;
81 void terminated(bool pgm_found);
82 static string make_fname(string buf, size_t j, size_t i, int n);
83 static list<string> capture_command(int& seq);
84 JackCapture(GxChild *p, GtkToggleButton *b);
85 public:
86 static void start_stop(GtkWidget *widget, gpointer data);
87 static void stop();
81 class JackCapture: public sigc::trackable {
82 private:
83 GtkToggleButton *button;
84 void terminated(bool pgm_found);
85 static string make_fname(string buf, size_t j, size_t i, int n);
86 static list<string> capture_command(int& seq);
87 JackCapture(GxChild *p, GtkToggleButton *b);
88 public:
89 static void start_stop(GtkWidget *widget, gpointer data);
90 static void stop();
8891 };
8992
90 class Meterbridge: public sigc::trackable
91 {
92 private:
93 GtkCheckMenuItem *item;
94 void terminated(bool pgm_found);
95 Meterbridge(GxChild *p, GtkCheckMenuItem *i);
96 public:
97 static void start_stop(GtkCheckMenuItem *menuitem, gpointer);
98 static void stop();
93 class Meterbridge: public sigc::trackable {
94 private:
95 GtkCheckMenuItem *item;
96 void terminated(bool pgm_found);
97 Meterbridge(GxChild *p, GtkCheckMenuItem *i);
98 public:
99 static void start_stop(GtkCheckMenuItem *menuitem, gpointer);
100 static void stop();
99101 };
100102
101103 /* -------------------------------------------------------------------------- */
102104 } /* end of gx_child_process namespace */
105 #endif // SRC_HEADERS_GX_CHILD_PROCESS_H_
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * --------------------------------------------------------------------------
1718 */
1819
2021
2122 #pragma once
2223
24 #ifndef SRC_HEADERS_GX_CONVOLVER_H_
25 #define SRC_HEADERS_GX_CONVOLVER_H_
26
2327 #include <zita-convolver.h>
2428 #include <gxwmm/gainline.h>
2529
26 namespace gx_engine
27 {
30 #include <sndfile.hh>
31
32 #include <string>
33
34 namespace gx_engine {
2835
2936 /* GxConvolver */
3037
31 class Audiofile
32 {
33 public:
38 class Audiofile {
39 public:
3440
35 enum {
36 TYPE_OTHER,
37 TYPE_CAF,
38 TYPE_WAV,
39 TYPE_AMB
40 };
41 enum {
42 TYPE_OTHER,
43 TYPE_CAF,
44 TYPE_WAV,
45 TYPE_AMB
46 };
4147
42 enum {
43 FORM_OTHER,
44 FORM_16BIT,
45 FORM_24BIT,
46 FORM_32BIT,
47 FORM_FLOAT
48 };
48 enum {
49 FORM_OTHER,
50 FORM_16BIT,
51 FORM_24BIT,
52 FORM_32BIT,
53 FORM_FLOAT
54 };
4955
50 enum {
51 ERR_NONE = 0,
52 ERR_MODE = -1,
53 ERR_TYPE = -2,
54 ERR_FORM = -3,
55 ERR_OPEN = -4,
56 ERR_SEEK = -5,
57 ERR_DATA = -6,
58 ERR_READ = -7,
59 ERR_WRITE = -8
60 };
56 enum {
57 ERR_NONE = 0,
58 ERR_MODE = -1,
59 ERR_TYPE = -2,
60 ERR_FORM = -3,
61 ERR_OPEN = -4,
62 ERR_SEEK = -5,
63 ERR_DATA = -6,
64 ERR_READ = -7,
65 ERR_WRITE = -8
66 };
6167
62 Audiofile (void);
63 ~Audiofile (void);
68 Audiofile(void);
69 ~Audiofile(void);
6470
65 //int mode(void) const { return _mode; }
66 int type(void) const { return _type; }
67 int form(void) const { return _form; }
68 int rate(void) const { return _rate; }
69 int chan(void) const { return _chan; }
70 uint32_t size(void) const { return _size; }
71 // int mode(void) const { return _mode; }
72 int type(void) const { return _type; }
73 int form(void) const { return _form; }
74 int rate(void) const { return _rate; }
75 int chan(void) const { return _chan; }
76 uint32_t size(void) const { return _size; }
7177
72 int open_read (string name);
73 int close (void);
78 int open_read(string name);
79 int close(void);
7480
75 int seek(uint32_t posit);
76 int read(float *data, uint32_t frames);
81 int seek(uint32_t posit);
82 int read(float *data, uint32_t frames);
7783
78 private:
84 private:
7985
80 void reset(void);
86 void reset(void);
8187
82 SNDFILE *_sndfile;
83 int _mode;
84 int _type;
85 int _form;
86 int _rate;
87 int _chan;
88 uint32_t _size;
88 SNDFILE *_sndfile;
89 int _mode;
90 int _type;
91 int _form;
92 int _rate;
93 int _chan;
94 uint32_t _size;
8995 };
9096
91 class GxConvolverBase: protected Convproc
92 {
93 protected:
94 volatile bool ready;
95 void adjust_values(unsigned int audio_size, unsigned int& count, unsigned int& offset,
96 unsigned int& delay, unsigned int& ldelay, unsigned int& length,
97 unsigned int& size, unsigned int& bufsize);
98 GxConvolverBase(): ready(false) {}
99 public:
100 bool checkstate();
101 void set_not_runnable() { ready = false; }
102 bool is_runnable() { return ready; }
103 bool start();
104 void stop() { stop_process(); }
97 class GxConvolverBase: protected Convproc {
98 protected:
99 volatile bool ready;
100 void adjust_values(unsigned int audio_size, unsigned int& count, unsigned int& offset,
101 unsigned int& delay, unsigned int& ldelay, unsigned int& length,
102 unsigned int& size, unsigned int& bufsize);
103 GxConvolverBase(): ready(false) {}
104 public:
105 bool checkstate();
106 void set_not_runnable() { ready = false; }
107 bool is_runnable() { return ready; }
108 bool start();
109 void stop() { stop_process(); }
105110 };
106111
107 class GxConvolver: public GxConvolverBase
108 {
109 private:
110 bool read_sndfile (Audiofile& audio, int nchan, int samplerate, const float *gain,
111 unsigned int *delay, unsigned int offset, unsigned int length,
112 const Gainline& points);
113 public:
114 bool configure(
115 unsigned int count, int samplerate, string fname, float gain, float lgain,
116 unsigned int delay, unsigned int ldelay, unsigned int offset,
117 unsigned int length, unsigned int size, unsigned int bufsize,
118 const Gainline& gainline);
119 bool compute(int count, float* input1, float *input2, float *output1, float *output2);
112 class GxConvolver: public GxConvolverBase {
113 private:
114 bool read_sndfile(Audiofile& audio, int nchan, int samplerate, const float *gain,
115 unsigned int *delay, unsigned int offset, unsigned int length,
116 const Gainline& points);
117 public:
118 bool configure(
119 unsigned int count, int samplerate, string fname, float gain, float lgain,
120 unsigned int delay, unsigned int ldelay, unsigned int offset,
121 unsigned int length, unsigned int size, unsigned int bufsize,
122 const Gainline& gainline);
123 bool compute(int count, float* input1, float *input2, float *output1, float *output2);
120124 };
121125
122126 extern GxConvolver conv;
123127
124 class GxSimpleConvolver: public GxConvolverBase
125 {
126 private:
127 public:
128 bool configure(int count, float *impresp, unsigned int samplerate);
129 bool compute(int count, float* input, float *output);
130 bool compute(int count, float* buffer) { return is_runnable() ? compute(count, buffer, buffer) : true; }
128 class GxSimpleConvolver: public GxConvolverBase {
129 private:
130
131 public:
132 bool configure(int count, float *impresp, unsigned int samplerate);
133 bool compute(int count, float* input, float *output);
134 bool compute(int count, float* buffer) {
135 return is_runnable() ? compute(count, buffer, buffer) : true;
136 }
131137 };
132138
133139 extern GxSimpleConvolver cab_conv;
134140 extern GxSimpleConvolver contrast_conv;
135141 } /* end of gx_engine namespace */
142 #endif // SRC_HEADERS_GX_CONVOLVER_H_
136143
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * --------------------------------------------------------------------------
1718 */
1819
1920 /* ------- This is the guitarix Engine namespace ------- */
2021
2122 #pragma once
23
24 #ifndef SRC_HEADERS_GX_ENGINE_H_
25 #define SRC_HEADERS_GX_ENGINE_H_
26
27 #include <string>
2228
2329 // --- defines the processing type
2430 #define ZEROIZE_BUFFERS (0)
2531 #define JUSTCOPY_BUFFERS (1)
2632 #define PROCESS_BUFFERS (2)
2733
28 namespace gx_engine
29 {
30
34 namespace gx_engine {
3135
3236 /* -- guitarix main engine -- */
3337
34 class AudioVariables
35 {
36 public:
37 GxMidiState midistate;
38
39 bool fnoise_g;
40 bool fng;
41 bool foverdrive4;
42 bool fcheckbox4;
43 bool fcheckbox5;
44 bool fcheckbox6;
45 bool fcheckbox8;
46 bool ftube;
47 bool fboost;
48 bool fcheckboxcom1;
49 bool midistat1;
50 bool midistat2;
51 bool midistat3;
52 bool feq;
53 bool fmoog;
54 bool fflanger;
55 bool fbiquad;
56 bool fcab;
57 bool fcon;
58 bool flh;
59 bool fmi;
60 bool fwv;
61 bool fwv_on;
62 bool famp;
63 bool fampout;
64 bool ftone;
65 bool ftremolo;
66 bool fpm;
67 bool fflanger_mono;
68 bool ffeedback;
69 bool ftonestack;
70
71
72 int fcheckbox7;
73 int fdelay;
74 int fchorus;
75 int fchorus_mono;
76 int fphaser;
77 int tonestack;
78 int cabinet;
79 int cab_switched;
80 int crybabypp;
81 int overdrivepp;
82 int distortionpp;
83 int freeverbpp;
84 int IRpp;
85 int compressorpp;
86 int echopp;
87 int delaypp;
88 int eqpp;
89 int lhpp;
90 int wvpp;
91 int bipp;
92 int trpp;
93 int pmpp;
94 int chpp;
95 int flpp;
96 int ffb;
97 int fsd;
98 int fse;
99 int fts;
100 int fcb;
101 int gxtube;
102 int mono_plug_counter;
103 int stereo_plug_counter;
104
105 float posit1;
106 float posit2;
107 float posit3;
108 float posit4;
109 float posit5;
110 float posit6;
111 float posit7;
112 float posit8;
113 float posit9;
114 float posit10;
115 float posit11;
116 float posit12;
117 float posit14;
118 float posit15;
119 float posit16;
120 float posit17;
121 float posit18;
122 float posit19;
123 float posit20;
124 float posit21;
125 float posit22;
126 float posit23;
127 float posit24;
128 float posit25;
129 float posit26;
130 float posit27;
131 float posit00;
132 float fnglevel;
133 float posit0;
134 float fautowah;
135 float ffuse;
136 float fwarn;
137 float fwarn_swap;
138 float fskin;
139 float viv;
140 float vivi;
141 float filebutton;
142 float fConsta1t;
143 float midistat;
144 float fampexpand;
145 float cab_level;
146 float cab_bass;
147 float cab_treble;
148 float cab_sum;
149
150
151 void register_parameter();
38 /****************************************************************/
39
40 class AudioVariables {
41 public:
42 GxMidiState midistate;
43
44 bool fnoise_g;
45 bool fng;
46 bool foverdrive4;
47 bool fcheckbox4;
48 bool fcheckbox5;
49 bool fcheckbox6;
50 bool fcheckbox8;
51 bool ftube;
52 bool fboost;
53 bool fcheckboxcom1;
54 bool midistat1;
55 bool midistat2;
56 bool midistat3;
57 bool feq;
58 bool fmoog;
59 bool fflanger;
60 bool fbiquad;
61 bool fcab;
62 bool fcon;
63 bool flh;
64 bool fmi;
65 bool fwv;
66 bool fwv_on;
67 bool famp;
68 bool fampout;
69 bool ftone;
70 bool ftremolo;
71 bool fpm;
72 bool fflanger_mono;
73 bool ffeedback;
74 bool ftonestack;
75
76 unsigned int effect_pre_post[20];
77
78 int fcheckbox7;
79 int fdelay;
80 int fchorus;
81 int fchorus_mono;
82 int fphaser;
83 int tonestack;
84 int cabinet;
85 int cab_switched;
86 int fsd;
87 int fse;
88 int gxtube;
89 int mono_plug_counter;
90 int stereo_plug_counter;
91
92 float posit[30];
93
94 float fnglevel;
95 float fautowah;
96 float ffuse;
97 float fwarn;
98 float fwarn_swap;
99 float fskin;
100 float viv;
101 float vivi;
102 float filebutton;
103 float fConsta1t;
104 float midistat;
105 float fampexpand;
106 float cab_level;
107 float cab_bass;
108 float cab_treble;
109 float cab_sum;
110
111 void register_parameter();
152112 };
153113
154114 extern AudioVariables audio;
155115
116 /****************************************************************/
156117
157118 class MidiVariables {
158 public:
159 float fslider45;
160 float fslider38;
161 float fslider31;
162 float fslider27;
163 float fslider29;
164 float fslider30;
165 float fslider26;
166 float fslider33;
167 float fslider34;
168 float fslider35;
169 float fslider36;
170 float fslider42;
171 float fslider43;
172 float fslider40;
173 float fslider41;
174 float fslider44;
175 float fslider37;
176 float fslider39;
177 float fslider46;
178 float fslider47;
179 float fslider48;
180 float fConsta4;
181 float fConstlog;
182 float fConstlog2;
183 float beat0;
184 float midi_gain;
185 float fConstun0;
186 float fautogain;
187 float fpitch;
188 float fslider32;
189 float fautogain1;
190 float fpitch1;
191 float fpitch2;
192 float fautogain2;
193 float BeatFilter1;
194 float BeatFilter2;
195 float BeatFilterk;
196
197 int weg;
198 int program;
199 int program2;
200 int volume2;
201 int Beat_is;
202 int send;
203 int volume;
204 int noten;
205 int program1;
206 int send1;
207 int noten1;
208 int volume1;
209 int send2;
210 int noten2;
211
212 bool fcheckbox10;
213 bool fcheckbox11;
214
215 unsigned char* midi_send;
216 unsigned char* midi_send1;
217 unsigned char* midi_send2;
218
219 void register_parameter();
220 void init(int samplingFreq);
119 public:
120 float fslider45;
121 float fslider38;
122 float fslider31;
123 float fslider27;
124 float fslider29;
125 float fslider30;
126 float fslider26;
127 float fslider33;
128 float fslider34;
129 float fslider35;
130 float fslider36;
131 float fslider42;
132 float fslider43;
133 float fslider40;
134 float fslider41;
135 float fslider44;
136 float fslider37;
137 float fslider39;
138 float fslider46;
139 float fslider47;
140 float fslider48;
141 float fConsta4;
142 float fConstlog;
143 float fConstlog2;
144 float beat0;
145 float midi_gain;
146 float fConstun0;
147 float fautogain;
148 float fpitch;
149 float fslider32;
150 float fautogain1;
151 float fpitch1;
152 float fpitch2;
153 float fautogain2;
154 float BeatFilter1;
155 float BeatFilter2;
156 float BeatFilterk;
157
158 int weg;
159 int program;
160 int program2;
161 int volume2;
162 int Beat_is;
163 int send;
164 int volume;
165 int noten;
166 int program1;
167 int send1;
168 int noten1;
169 int volume1;
170 int send2;
171 int noten2;
172
173 bool fcheckbox10;
174 bool fcheckbox11;
175
176 unsigned char* midi_send;
177 unsigned char* midi_send1;
178 unsigned char* midi_send2;
179
180 void register_parameter();
181 void init(int samplingFreq);
221182 };
222183
223184 extern MidiVariables midi;
224185
186 /****************************************************************/
225187
226188 /* square function */
227189 inline double sqrf(float x) { return x * x; }
240202 inline void set_mono_plug_counter(int x) {audio.mono_plug_counter = x;}
241203 inline void set_stereo_plug_counter(int x) {audio.stereo_plug_counter = x;}
242204
205 /****************************************************************/
243206
244207 /* function declarations */
245208 void register_faust_parameters();
246 void gx_engine_init( const string *optvar );
209 void gx_engine_init(const string *optvar);
247210 void gx_engine_reset();
248211 void faust_init(int samplingFreq);
249212 void compute_midi(int len);
250213 void compute_midi_in(void* midi_input_port_buf);
251214 void process_midi(int count);
252 void compute (int count, float* input, float* output0);
253 void compute_insert (int count, float* input1, float* output2, float* output3);
215 void compute(int count, float* input, float* output0);
216 void compute_insert(int count, float* input1, float* output2, float* output3);
254217
255218 void convolver_filter(float* input, float* output, int sf, int iconvolvefilter);
256219 void moving_filter(float* input, float* output, int sf);
257220 void process_buffers(int count, float* input, float* output0);
258 void process_insert_buffers (int count, float* input1, float* output0, float* output1);
221 void process_insert_buffers(int count, float* input1, float* output0, float* output1);
259222
260223 void init_non_rt_processing();
261224 void non_rt_processing(int count, float* input, float* output0);
262225
263 #ifdef EXPERIMENTAL
264 void faust_setup();
265 void toggle_exp_window(bool v);
266 #endif
267
268226 /* ------------------------------------------------------------------- */
269227 } /* end of gx_engine namespace */
228 #endif // SRC_HEADERS_GX_ENGINE_H_
0 /*
1 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17 * --------------------------------------------------------------------------
18 *
19 *
20 * This file is part of the Guitarix Audio Engine
21 *
22 *
23 * --------------------------------------------------------------------------
24 */
25 #pragma once
26
27 #ifndef SRC_HEADERS_GX_ENGINE_TUBETABLE_H_
28 #define SRC_HEADERS_GX_ENGINE_TUBETABLE_H_
29
30 #define TAB_SIZE (2001)
31
32 namespace gx_tubes {
33
34 struct tabled {
35 float low;
36 float high;
37 float istep;
38 float data[TAB_SIZE];
39 };
40
41 extern struct tabled tubetable[];
42 extern struct tabled tubetable2[];
43 extern struct tabled tubetable3[];
44 extern struct tabled tubetable4[];
45 } // end namespace
46 #endif // SRC_HEADERS_GX_ENGINE_TUBETABLE_H_
47
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * --------------------------------------------------------------------------
1718 *
1819 * This is the guitarix global variable declarations for all namespaces
2223 */
2324
2425 #pragma once
26
27 #ifndef SRC_HEADERS_GX_GLOBALS_H_
28 #define SRC_HEADERS_GX_GLOBALS_H_
2529
2630 #include <semaphore.h>
2731 #include <jack/midiport.h>
2832 #include <gtk/gtk.h>
2933
34 #include <string>
35 #include <vector>
36
3037 /* ----- main engine ----- */
31 namespace gx_engine
32 {
38 namespace gx_engine {
3339 /* engine state : can be on or off or bypassed */
3440 typedef enum {
35 kEngineOff = 0,
36 kEngineOn = 1,
37 kEngineBypass = 2
41 kEngineOff = 0,
42 kEngineOn = 1,
43 kEngineBypass = 2
3844 } GxEngineState;
3945
4046 typedef enum {
41 kMidiOff = 0,
42 kMidiOn = 1
47 kMidiOff = 0,
48 kMidiOn = 1
4349 } GxMidiState;
4450
4551 /* global var declarations */
6268
6369 /* buffer ready state */
6470 extern bool buffers_ready;
65
6671 }
6772
6873 /* -------------------------------------------------------------------------- */
6974
7075 /* ----- jack namespace ----- */
71 namespace gx_jack
72 {
76 namespace gx_jack {
7377 /* latency change confirmation */
7478 typedef enum {
75 kChangeLatency = 1,
76 kKeepLatency = 2
79 kChangeLatency = 1,
80 kKeepLatency = 2
7781 } GxJackLatencyChange;
7882
79 extern const int nIPorts; // mono input
80 extern const int nOPorts; // stereo output + jconv
83
8184 extern int NO_CONNECTION;
82
83 /* variables */
84 extern jack_nframes_t jack_sr; // jack sample rate
85 extern jack_nframes_t jack_bs; // jack buffer size
86 extern float jcpu_load; // jack cpu_load
87 extern float xdel; // last xrun delay
88 extern int is_rt; // jack is realtime ?
89
90 extern jack_client_t* client ;
91 extern jack_client_t* client_insert ;
92 extern jack_port_t* output_ports[];
93 extern jack_port_t* input_ports [];
94
95 extern void* midi_input_port_buf;
96 extern void* midi_port_buf;
9785
9886 extern GxJackLatencyChange change_latency;
9987
10189 extern struct MidiMessage ev;
10290 extern jack_ringbuffer_t* jack_ringbuffer;
10391 #endif
104
105 extern jack_port_t* midi_input_port;
106 extern jack_port_t* midi_output_ports;
107 extern jack_nframes_t time_is;
92 extern void* midi_input_port_buf;
93 extern void* midi_port_buf;
10894 extern bool jack_is_down;
10995 extern bool jack_is_exit;
11096 extern string client_name;
116102
117103 /* lists of jack port types for menu items */
118104 enum {
119 kAudioInput = 0,
120 kAudioOutput1 = 1,
121 kAudioOutput2 = 2,
122 kMidiInput = 3,
123 kMidiOutput = 4,
124 kAudioInsertIn = 5,
125 kAudioInsertOut= 6
105 kAudioInput = 0,
106 kAudioOutput1 = 1,
107 kAudioOutput2 = 2,
108 kMidiInput = 3,
109 kMidiOutput = 4,
110 kAudioInsertIn = 5,
111 kAudioInsertOut= 6
126112 };
127113 }
128114
129115 /* -------------------------------------------------------------------------- */
130116
131117 /* ----- preset namespace ----- */
132 namespace gx_preset
133 {
118 namespace gx_preset {
134119 /* global var declarations */
135120 extern GdkModifierType list_mod[];
136121 extern const char* preset_accel_path[];
137122 extern const char* preset_menu_name[];
138 //extern map<GtkMenuItem*, string> preset_list[];
123 // extern map<GtkMenuItem*, string> preset_list[];
139124
140125 extern string gx_current_preset;
141126 extern string gx_factory_preset;
161146 /* -------------------------------------------------------------------------- */
162147
163148 /* ----- system namespace ----- */
164 namespace gx_system
165 {
166 /* message handling */
167 typedef enum {
168 kInfo,
169 kWarning,
170 kError,
171 kMessageTypeCount // just count, must be last
172 } GxMsgType;
149 namespace gx_system {
173150
174151 /* variables and constants */
175152 extern const int SYSTEM_OK;
153
154 extern bool is_session;
176155
177156 extern string rcpath;
178157
190169 /* -------------------------------------------------------------------------- */
191170
192171 /* ----- GUI namespace ----- */
193 namespace gx_gui
194 {
195
196 /* global GUI widgets */
197 extern GtkWidget* fWindow;
198 extern GtkWidget* menuh;
199 extern GtkWidget* midibox;
200 extern GtkWidget* patch_info;
201 extern GtkWidget* tuner_widget;
202 extern GtkWidget* rack_widget;
203 extern GtkWidget* menu_mono_rack;
204 extern GtkWidget* srack_widget;
205 extern GtkWidget* menu_stereo_rack;
206 extern GtkWidget* rack_tool_bar;
207
208 /* icon widgets */
209 extern GdkPixbuf* ib;
210 extern GdkPixbuf* ibm;
211 extern GdkPixbuf* ibr;
212
213 /* jack server status */
214 extern GtkWidget* gx_jackd_on_image;
215 extern GtkWidget* gx_jackd_off_image;
216
217 /* engine status images */
218 extern GtkWidget* gx_engine_on_image;
219 extern GtkWidget* gx_engine_off_image;
220 extern GtkWidget* gx_engine_bypass_image;
221 extern GtkWidget* gx_engine_item;
222
223 /* some more widgets */
224
225 extern GtkStatusIcon* status_icon;
172 namespace gx_gui {
226173
227174 /* tuner and osilloscope*/
228175 extern int showwave;
229176 extern int shownote;
230177 extern float show_patch_info;
231178
232 /* skin handling */
233 extern vector<string> skin_list;
234 extern gint gx_current_skin;
235 extern int last_skin;
236 extern int no_opt_skin;
237 extern int set_knob;
238
239179 /* rack handlig */
240180 extern int mono_plugs;
241181 extern int stereo_plugs;
245185 extern float main_xorg;
246186 extern float main_yorg;
247187
248 /* Effect moduls box*/
249
250
251
252188 /* for level display */
253189 extern int meter_falloff;
254190 extern int meter_display_timeout;
258194 extern sem_t program_change_sem;
259195
260196 extern int g_threads[10];
261
262197 }
263198
264199 /* -------------------------------------------------------------------------- */
265200
266201 /* ----- cairo namespace ----- */
267 namespace gx_cairo
268 {
202 namespace gx_cairo {
269203 extern GdkPixbuf *tribeimage;
270204 extern GdkPixbuf *tribeimage1;
271205 extern GdkPixbuf *tribeimage2;
272206 }
207 #endif // SRC_HEADERS_GX_GLOBALS_H_
208
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * --------------------------------------------------------------------------
1718 */
1819
2021
2122 #pragma once
2223
23 #include <gtkmm/checkmenuitem.h>
24 #include <gtkmm/radiomenuitem.h>
25 namespace gx_gui
26 {
24 #ifndef SRC_HEADERS_GX_GUI_HELPERS_H_
25 #define SRC_HEADERS_GX_GUI_HELPERS_H_
2726
28 /* ---- linking menu items and parameter ---- */
29 class MenuCheckItem: public Gtk::CheckMenuItem
30 {
31 private:
32 SwitchParameter* param;
33 void on_my_activate();
34 public:
35 //FIXME not gtk-2.12: MenuCheckItem() { set_use_underline(); }
36 MenuCheckItem(): Gtk::CheckMenuItem("", true) {}
37 void set_parameter(SwitchParameter *p);
38 void add_parameter(SwitchParameter *p);
39 SwitchParameter * get_parameter();
40 };
27 #include <string>
4128
42 /* ---- linking menu items and parameter ---- */
43 class RadioCheckItem: public Gtk::RadioMenuItem
44 {
45 private:
46
47 SwitchParameter* param;
48 void on_my_toggled();
49 public:
50 Gtk::RadioMenuItem::Group Group;
51 //FIXME not gtk-2.12: MenuCheckItem() { set_use_underline(); }
52 RadioCheckItem(): Gtk::RadioMenuItem(Group,"", true) {}
53 void set_parameter(SwitchParameter *p);
54 SwitchParameter * get_parameter();
55 };
29 namespace gx_gui {
30
5631 /* -------------- function declarations ---------------- */
5732 GtkWidget *load_toplevel(GtkBuilder *builder, const char* filename, const char* windowname);
58 gboolean gx_hide_eq( GtkWidget *widget, gpointer data );
33 gboolean gx_hide_eq(GtkWidget *widget, gpointer data );
5934
6035 /* guitarix skin related functions */
6136 unsigned int gx_fetch_available_skins();
7146
7247 /* engine status and switch */
7348 void gx_refresh_engine_status_display();
74 void gx_engine_switch (GtkWidget* widget, gpointer arg);
49 void gx_engine_switch(GtkWidget* widget, gpointer arg);
7550
7651 /* jack client and port mapping functions */
7752 void gx_jack_is_down();
8055 /* choice dialog windows */
8156 void gx_get_text_entry(GtkEntry*, string&);
8257
83 gint gx_choice_dialog_with_text_entry (
58 gint gx_choice_dialog_with_text_entry(
8459 const char* window_title,
8560 const char* msg,
8661 const char* label1,
9166 GCallback func
9267 );
9368
94 gint gx_choice_dialog_without_entry (
69 gint gx_choice_dialog_without_entry(
9570 const char* window_title,
9671 const char* msg,
9772 const char* label1,
10176 const gint default_response
10277 );
10378
104 gint gx_nchoice_dialog_without_entry (
79 gint gx_nchoice_dialog_without_entry(
10580 const char* window_title,
10681 const char* msg,
10782 const guint nchoice,
11186 );
11287
11388 /* extra GUI helpers */
114 void gx_midi_out (GtkCheckMenuItem*, gpointer);
115 void gx_log_window (GtkWidget*, gpointer);
116 void gx_patch (GtkCheckMenuItem*, gpointer );
89 void gx_midi_out(GtkCheckMenuItem*, gpointer);
90 void gx_log_window(GtkWidget*, gpointer);
91 void gx_patch(GtkCheckMenuItem*, gpointer );
11792
118 void gx_systray_menu (GtkWidget*, gpointer);
119 void gx_reset_units (Glib::ustring group_id);
120 void gx_reset_effects (GtkWidget*, gpointer);
121 void gx_show_about (GtkWidget*, gpointer);
93 void gx_systray_menu(GtkWidget*, gpointer);
94 void gx_reset_units(Glib::ustring group_id);
95 void gx_reset_effects(GtkWidget*, gpointer);
96 void gx_show_about(GtkWidget*, gpointer);
12297
12398 void cab_conv_restart();
12499 void contrast_conv_restart();
125100
126 void gx_show_extended_settings (GtkWidget*, gpointer);
127 void gx_hide_extended_settings (GtkWidget*, gpointer);
128 void gx_show_menu_settings (GtkWidget*, gpointer);
129 void gx_user_disable_latency_warn (GtkWidget*, gpointer);
130 gint gx_wait_latency_warn ();
131 int gx_message_popup (const char*);
101 void gx_show_extended_settings(GtkWidget*, gpointer);
102 void gx_hide_extended_settings(GtkWidget*, gpointer);
103 void gx_show_menu_settings(GtkWidget*, gpointer);
104 void gx_user_disable_latency_warn(GtkWidget*, gpointer);
105 gint gx_wait_latency_warn();
106 int gx_message_popup(const char*);
132107
133 gboolean gx_delete_event (GtkWidget*, gpointer);
134 gboolean gx_set_default_size (gpointer data);
135 gboolean gx_set_default_ssize (gpointer data);
136 gboolean gx_set_sresizeable (gpointer data);
137 gboolean gx_set_default (gpointer data);
138 gboolean gx_set_resizeable (gpointer data);
108 gboolean gx_delete_event(GtkWidget*, gpointer);
109 gboolean gx_set_default_size(gpointer data);
110 gboolean gx_set_default_ssize(gpointer data);
111 gboolean gx_set_sresizeable(gpointer data);
112 gboolean gx_set_default(gpointer data);
113 gboolean gx_set_resizeable(gpointer data);
139114
140115 /* -------------------------------------------------------------------------- */
141116 } /* end of gx_gui namespace */
142
117 #endif // SRC_HEADERS_GX_GUI_HELPERS_H_
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * --------------------------------------------------------------------------
1718 */
1819
1920 /* ------- This is the JACK namespace ------- */
2021
2122 #pragma once
23
24 #ifndef SRC_HEADERS_GX_JACK_H_
25 #define SRC_HEADERS_GX_JACK_H_
2226
2327 /* On Intel set FZ (Flush to Zero) and DAZ (Denormals Are Zero)
2428 flags to avoid costly denormals */
3741 #include <jack/session.h>
3842 #endif
3943
40 namespace gx_jack
41 {
42 #ifdef USE_RINGBUFFER
43 typedef struct
44 {
45 jack_nframes_t time;
46 int len; /* Length of MIDI message, in bytes. */
47 unsigned char data[3];
48 } MidiMessage;
49 #endif
44 #include <string>
45
46 namespace gx_jack {
47
48 class GxJack {
49 public:
50 static const int nIPorts = 3; // mono input + jconv
51 static const int nOPorts = 4; // stereo output + jconv
52 /* variables */
53 jack_nframes_t jack_sr; // jack sample rate
54 jack_nframes_t jack_bs; // jack buffer size
55 float jcpu_load; // jack cpu_load
56 float xdel; // last xrun delay
57 int is_rt;
58
59 jack_client_t* client;
60 jack_client_t* client_insert;
61 jack_port_t* output_ports[nOPorts];
62 jack_port_t* input_ports[nIPorts];
63 jack_port_t* midi_input_port;
64 jack_port_t* midi_output_ports;
65
66 jack_nframes_t time_is;
67 };
68 extern GxJack gxjack;
5069
5170 extern sem_t jack_sync_sem;
5271
5372 /* -------- functions ---------- */
54 bool gx_jack_init( const string *optvar );
73 bool gx_jack_init(const string *optvar );
5574 void gx_jack_callbacks_and_activate();
56
5775 bool gx_start_jack_dialog();
5876 bool gx_start_jack(void* arg);
59
6077 void gx_set_jack_buffer_size(GtkCheckMenuItem*, gpointer);
6178 void gx_jack_connection(GtkCheckMenuItem*, gpointer);
6279 void gx_jack_cleanup();
6380
6481 /* client callbacks */
65 int gx_jack_srate_callback (jack_nframes_t, void*);
66 void gx_jack_shutdown_callback (void*);
67 int gx_jack_xrun_callback (void*);
68 int gx_jack_buffersize_callback (jack_nframes_t, void*);
69 void gx_jack_portreg_callback (jack_port_id_t, int, void*);
82 int gx_jack_srate_callback(jack_nframes_t, void* arg);
83 void gx_jack_shutdown_callback(void* arg);
84 int gx_jack_xrun_callback(void* arg);
85 int gx_jack_buffersize_callback(jack_nframes_t, void* arg);
86 void gx_jack_portreg_callback(jack_port_id_t, int, void* arg);
7087 void gx_jack_init_port_connection(const string*);
7188 #ifdef HAVE_JACK_SESSION
7289 void gx_jack_session_callback(jack_session_event_t *event, void *arg);
7390 #endif
7491
7592 /* processing */
76 int gx_jack_process (jack_nframes_t, void*);
77 int gx_jack_insert_process (jack_nframes_t, void*);
78
79 #ifndef USE_RINGBUFFER
80 int gx_jack_midi_process(jack_nframes_t, void*);
81 #else
82 int gx_jack_midi_process_ringbuffer(jack_nframes_t, void*);
83 #endif
84 int gx_jack_midi_input_process(jack_nframes_t, void*);
85
93 int gx_jack_process(jack_nframes_t, void* arg);
94 int gx_jack_insert_process(jack_nframes_t, void* arg);
95 int gx_jack_midi_process(jack_nframes_t, void* arg);
96 int gx_jack_midi_input_process(jack_nframes_t, void* arg);
8697 } /* end of jack namespace */
98 #endif // SRC_HEADERS_GX_JACK_H_
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * --------------------------------------------------------------------------
1718 *
1819 * This is the JConv settings handler class used by guitarix
3031
3132 #pragma once
3233
34 #ifndef SRC_HEADERS_GX_JCONV_SETTINGS_H_
35 #define SRC_HEADERS_GX_JCONV_SETTINGS_H_
36
3337 #include <gxwmm/gainline.h>
3438
35 namespace gx_jconv
36 {
39 #include <string>
40
41 namespace gx_jconv {
3742
3843 /* GUI stuff */
3944 void gx_reload_jcgui();
4045 void gx_save_jcgui();
41 void gx_show_jconv_dialog_gui (GtkWidget *, gpointer );
46 void gx_show_jconv_dialog_gui(GtkWidget *, gpointer);
4247
4348 /* main class */
44 class GxJConvSettings
45 {
46 private:
47 // main jconv setting
48 string fIRFile;
49 string fIRDir;
49 class GxJConvSettings {
50 private:
51 // main jconv setting
52 string fIRFile;
53 string fIRDir;
5054
51 float fGain; // jconv gain
52 guint fOffset; // offset in IR where to start comvolution
53 guint fLength; // length of the IR to use for convolution
54 guint fDelay; // delay when to apply reverb
55 Gainline gainline;
55 float fGain; // jconv gain
56 guint fOffset; // offset in IR where to start comvolution
57 guint fLength; // length of the IR to use for convolution
58 guint fDelay; // delay when to apply reverb
59 Gainline gainline;
60 guint fGainCor;
5661
57 void read_gainline(gx_system::JsonParser& jp);
58 //inline string getIRDir () const { return fIRDir; }
59 inline void setIRFile (string name) { fIRFile = name; }
60 inline void setIRDir (string name) { fIRDir = name; }
62 void read_gainline(gx_system::JsonParser& jp);
63 // inline string getIRDir () const { return fIRDir; }
64 inline void setIRFile(string name) { fIRFile = name; }
65 inline void setIRDir(string name) { fIRDir = name; }
6166
62 // private constructor (don't call it, call instance())
63 GxJConvSettings();
67 // private constructor (don't call it, call instance())
68 GxJConvSettings();
6469
65 // invalid IR
66 bool fValidSettings;
70 // invalid IR
71 bool fValidSettings;
6772
68 public:
69 GxJConvSettings(gx_system::JsonParser& jp);
73 public:
74 explicit GxJConvSettings(gx_system::JsonParser& jp);
7075
71 // getters and setters
72 inline string getIRFile() const { return fIRFile; }
73 string getFullIRPath() const;
74 inline float getGain () const { return fGain; }
75 inline guint getOffset () const { return fOffset; }
76 inline guint getLength () const { return fLength; }
77 inline guint getDelay () const { return fDelay; }
78 inline const Gainline& getGainline () const { return gainline; }
79 inline string getIRDir () const { return fIRDir; }
80 inline void setFullIRPath(string name);
81
82 inline void setGain (float gain) { fGain = gain; }
83 inline void setOffset (guint offs) { fOffset = offs; }
84 inline void setLength (guint leng) { fLength = leng; }
85 inline void setDelay (guint del) { fDelay = del; }
86 inline void setGainline (const Gainline& gain){ gainline = gain; }
76 // getters and setters
77 inline string getIRFile() const { return fIRFile; }
78 string getFullIRPath() const;
79 inline float getGain() const { return fGain; }
80 inline guint getOffset() const { return fOffset; }
81 inline guint getLength() const { return fLength; }
82 inline guint getDelay() const { return fDelay; }
83 inline guint getGainCor() const { return fGainCor; }
84 inline const Gainline& getGainline() const { return gainline; }
85 inline string getIRDir() const { return fIRDir; }
86 inline void setFullIRPath(string name);
8787
88 // internal setting manipulation
89 private:
90 inline bool isValid() { return fValidSettings; }
91 public:
88 inline void setGain(float gain) { fGain = gain; }
89 inline void setGainCor(guint gain) { fGainCor = gain; }
90 inline void setOffset(guint offs) { fOffset = offs; }
91 inline void setLength(guint leng) { fLength = leng; }
92 inline void setDelay(guint del) { fDelay = del; }
93 inline void setGainline(const Gainline& gain) { gainline = gain; }
9294
93 // --------------- instanciation of jconv handler
94 static inline GxJConvSettings* instance()
95 {
96 static GxJConvSettings jcset;
95 // internal setting manipulation
96 private:
97 inline bool isValid() { return fValidSettings; }
98 public:
9799
98 // return static instance
99 return &jcset;
100 }
100 // --------------- instanciation of jconv handler
101 static inline GxJConvSettings* instance() {
102 static GxJConvSettings jcset;
103
104 // return static instance
105 return &jcset;
106 }
101107
102108
103 // checkbutton state
104 static float checkbutton7;
109 // checkbutton state
110 static float checkbutton7;
105111
106 void writeJSON(gx_system::JsonWriter& w);
112 void writeJSON(gx_system::JsonWriter& w);
107113 };
108114 } /* end of gx_jconv namespace*/
115 #endif // SRC_HEADERS_GX_JCONV_SETTINGS_H_
0 /*
1 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17 * --------------------------------------------------------------------------
18 *
19 * This file is part of the guitarix GUI main class
20 * Note: this header file depends on gx_ui.h and
21 * gx_main_interface.h
22 *
23 * ----------------------------------------------------------------------------
24 */
25
26 /* ------- This is part of the GUI namespace ------- */
27
28
29 #pragma once
30
31 #ifndef SRC_HEADERS_GX_MAIN_BOXES_H_
32 #define SRC_HEADERS_GX_MAIN_BOXES_H_
33
34 #ifndef SRC_HEADERS_GX_UI_H_
35 #include "./gx_ui.h"
36 #endif
37
38 #ifndef SRC_HEADERS_GX_MAIN_INTERFACE_H_
39 #include "./gx_main_interface.h"
40 #endif
41
42 #include <gtkmm/liststore.h>
43 #include <gtkmm/window.h>
44 #include <gtkmm/frame.h>
45 #include <gtkmm/accelgroup.h>
46 #include <gtkmm/scrolledwindow.h>
47 #include <gtkmm/fixed.h>
48 #include <gtkmm/eventbox.h>
49 #include <gtkmm/notebook.h>
50 #include <gxwmm/paintbox.h>
51 #include <gtkmm/radiomenuitem.h>
52 #include <gtkmm/paned.h>
53
54 namespace gx_gui {
55 /****************************************************************/
56
57 class GxTBox {
58 public:
59 Gtk::VBox m_box;
60 ToggleCheckButton m_tcb;
61 explicit GxTBox(gx_ui::GxUI& ui);
62 virtual ~GxTBox();
63 };
64
65 /****************************************************************/
66
67 class GxVBox {
68 public:
69 Gtk::VBox m_box;
70 Gtk::Label m_label;
71 explicit GxVBox(gx_ui::GxUI& ui);
72 virtual ~GxVBox();
73 };
74
75 /****************************************************************/
76
77 class GxHBox {
78 public:
79 Gtk::HBox m_box;
80 Gtk::Label m_label;
81 Gtk::Frame m_frame;
82 explicit GxHBox(gx_ui::GxUI& ui);
83 virtual ~GxHBox();
84 };
85
86 /****************************************************************/
87
88 class GxFixedBox {
89 public:
90 Gtk::Fixed m_fixed;
91 Gtk::VBox m_box;
92 explicit GxFixedBox(gx_ui::GxUI& ui);
93 virtual ~GxFixedBox();
94 };
95
96 /****************************************************************/
97
98 class GxPaintBox {
99 public:
100 Gtk::HBox m_box;
101 Gxw::PaintBox m_paintbox;
102 GxPaintBox(gx_ui::GxUI& ui, const char *expose_funk);
103 ~GxPaintBox();
104 };
105
106 /****************************************************************/
107
108 class GxEventBox {
109 public:
110 Gtk::HBox m_box;
111 Gtk::HBox m_hbox;
112 Gtk::HBox m_pbox;
113 Gtk::HBox m_tbox;
114 Gtk::EventBox m_eventbox;
115 Gtk::HBox m_fbox;
116 Gtk::HBox m_fixedbox;
117 Gtk::Label m_label;
118 explicit GxEventBox(gx_ui::GxUI& ui);
119 virtual ~GxEventBox();
120 };
121
122 /****************************************************************/
123
124 class GxMainBox {
125 public:
126 Gtk::HBox m_box;
127 Gtk::HBox m_hbox;
128 Gtk::HBox m_pbox;
129 Gtk::HBox m_tbox;
130 Gtk::HBox m_fbox;
131 Gtk::EventBox m_eventbox;
132 Gtk::Fixed m_fixedbox;
133 Gtk::Label m_label;
134 Gxw::PaintBox m_paintbox;
135 GxMainBox(gx_ui::GxUI& ui, const char *expose_funk);
136 virtual ~GxMainBox();
137 };
138
139 /****************************************************************/
140
141 class GxMidiBox {
142 public:
143 Gtk::HBox m_box;
144 Gtk::EventBox m_eventbox;
145 Gxw::PaintBox m_paintbox;
146 ToggleCheckButton m_tcb;
147 UiSwitch* unit_on_off;
148 Gtk::HBox m_bbox;
149 Gtk::Fixed m_fixedbox;
150 GxMidiBox(gx_ui::GxUI& ui, const char *expose_funk);
151 virtual ~GxMidiBox();
152 };
153
154 /****************************************************************/
155
156 class GxNotebookBox {
157 public:
158 Gtk::Notebook m_box;
159 explicit GxNotebookBox(gx_ui::GxUI& ui);
160 virtual ~GxNotebookBox();
161 };
162
163 /****************************************************************/
164
165 class GxMoveBox {
166 public:
167 Gtk::Label m_label;
168 Gtk::Label m_label1;
169 Gtk::Fixed m_fixed;
170 Gxw::PaintBox m_paintbox;
171 Gtk::Button m_button;
172 Gtk::Button m_button1;
173 explicit GxMoveBox(gx_ui::GxUI& ui);
174 virtual ~GxMoveBox();
175 };
176
177 /****************************************************************/
178
179 class GxDialogButtonBox {
180 public:
181 Gtk::HBox box;
182 UiSwitchBool show_dialog;
183 GxDialogButtonBox(gx_ui::GxUI& ui, Parameter& param_dialog);
184 };
185
186 /****************************************************************/
187
188 class GxDialogWindowBox {
189 private:
190 void on_dialog_button_toggled();
191 void on_reset_button_pressed();
192 void on_dialog_menu_activate();
193 bool on_window_delete_event(GdkEventAny* event);
194 Glib::ustring group_id;
195 public:
196 Gtk::HBox box;
197 Gtk::HBox box1;
198 Gxw::PaintBox paintbox;
199 Gtk::HBox box4;
200 Gtk::HBox box5;
201 Gtk::HBox box6;
202 UiSwitch* unit_on_off;
203 MenuCheckItem menuitem;
204 Gtk::Button reset_button;
205 Gtk::Button reset_button1;
206 ToggleCheckButton m_tcb;
207 Gtk::ToggleButton& dialog_button;
208 Gtk::Window m_regler_tooltip_window;
209 GxDialogWindowBox(gx_ui::GxUI& ui,
210 const char *expose_funk, Parameter& param_dialog,
211 Parameter& param_switch, Gtk::ToggleButton& button,
212 GtkWidget * Caller);
213 ~GxDialogWindowBox();
214 };
215
216 /****************************************************************/
217
218 class GxWindowBox {
219 private:
220 bool on_window_delete_event(GdkEventAny* event, gpointer d);
221 bool on_button_pressed(GdkEventButton* event);
222
223 public:
224 Gtk::HBox window;
225 Gtk::HBox box;
226 Gtk::HBox box1;
227 Gtk::VBox rbox;
228 Gtk::Window m_regler_tooltip_window;
229 ToggleCheckButton m_tmono_rack;
230 ToggleCheckButton m_tstereo_rack;
231 GxWindowBox(gx_ui::GxUI& ui,
232 Glib::ustring titl, GtkWidget * d);
233 ~GxWindowBox();
234 };
235
236 /****************************************************************/
237
238 class GxScrollBox {
239 private:
240 bool on_window_delete_event(GdkEventAny* event, gpointer d);
241 bool on_button_pressed(GdkEventButton* event);
242 void on_rack_reorder_vertical();
243 void on_rack_reorder_horizontal();
244 public:
245 Gtk::HBox window;
246 Gtk::ScrolledWindow m_scrolled_window;
247 Gtk::ScrolledWindow m_scrolled_window2;
248 Gtk::HBox box;
249 Gtk::HBox box1;
250 Gxw::PaintBox paintbox1;
251 Gtk::VBox rbox;
252 Gtk::VBox vbox;
253 RadioCheckItem fOrderhRack;
254 RadioCheckItem fOrdervRack;
255 Gtk::RadioMenuItem::Group group;
256 GxScrollBox(gx_ui::GxUI& ui,
257 const char *pb_2, Glib::ustring titl, GtkWidget * d);
258 ~GxScrollBox();
259 };
260
261 /****************************************************************/
262
263 class GxToolBox {
264 private:
265 bool on_window_delete_event(GdkEventAny* event, gpointer d );
266 bool on_button_pressed(GdkEventButton* event);
267 public:
268 Gtk::VBox window;
269 Gtk::ScrolledWindow m_scrolled_window;
270 Gtk::HBox box;
271 Gtk::HBox box1;
272 Gxw::PaintBox paintbox;
273 Gxw::PaintBox paintbox1;
274 Gtk::VBox rbox;
275 Gtk::Window m_regler_tooltip_window;
276 ToggleCheckButton m_tmono_rack;
277 ToggleCheckButton m_tstereo_rack;
278 GxToolBox(gx_ui::GxUI& ui,
279 const char *pb_2, Glib::ustring titl, GtkWidget * d);
280 ~GxToolBox();
281 };
282
283 /****************************************************************/
284
285 }/* end of gx_gui namespace */
286
287 #endif // SRC_HEADERS_GX_MAIN_BOXES_H_
288
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * --------------------------------------------------------------------------
18 *
19 * This file is part of the guitarix GUI main class
20 * Note: this header file depends on gx_ui.h
21 * and is the base for gx_main_boxes.h
22 *
23 * ----------------------------------------------------------------------------
1724 */
1825
1926 /* ------- This is the GUI namespace ------- */
20 // Note: this header file depends on gx_engine.h
2127
2228 #pragma once
2329
24 #include <iostream>
30 #ifndef SRC_HEADERS_GX_MAIN_INTERFACE_H_
31 #define SRC_HEADERS_GX_MAIN_INTERFACE_H_
32
33 #ifndef SRC_HEADERS_GX_UI_H_
34 #include "./gx_ui.h"
35 #endif
36
37 #ifndef GX_MAIN_INTERFACE
38 #define GX_MAIN_INTERFACE
39
40
2541 #include <gxwmm/bigknob.h>
2642 #include <gxwmm/smallknob.h>
2743 #include <gxwmm/smallknobr.h>
3955 #include <gxwmm/waveview.h>
4056 #include <gtkmm/box.h>
4157 #include <gtkmm/alignment.h>
42
43 #ifndef NJACKLAT
44 #define NJACKLAT (9)
45 #endif
46
47 namespace gx_gui
48 {
49
50 /****************************************************************
51 ** PortMapWindow
52 */
53
54 enum {
55 number_of_ports = 7
56 };
57
58 struct PortAttr {
59 const int client_num;
60 const bool is_insert;
61 const char *port_name;
62 bool is_input;
63 const char *port_type;
64 };
65
66 extern PortAttr guitarix_ports[number_of_ports];
67
68 struct PortSection
69 {
70 GtkTreeStore *treestore;
71 GtkScrolledWindow *scrolled_window;
72 GtkExpander *expander;
73 GtkLabel *label;
74 PortAttr *port_attr;
75 };
76
77 class PortMapWindow
78 {
79 private:
80 PortSection portsection[number_of_ports];
81 GtkCheckMenuItem *menuitem;
82 list<string> excluded_clients;
83 GtkWidget *monitored_expander_child;
84 static void on_expander(GtkWidget *widget, gpointer data);
85 static void on_check_resize(GtkWidget *widget, gpointer data);
86 static void response_cb(GtkWidget *widget, gint response_id, gpointer data);
87 static void destroy_cb(GtkWidget*, gpointer data);
88 static void on_cell_toggle(GtkCellRendererToggle *widget, gchar *path, gpointer data);
89 static void update_summary(PortSection* p, string *port=0, bool connect=false);
90 static gboolean redraw_expander(gpointer data);
91 static list<string> walk(GtkTreeStore *ts, string *port, int connect);
92 bool walk_remove(GtkTreeStore *ts, bool (*compare)(const string&, const char*), string data);
93 void walk_insert(GtkTreeStore *ts, string data);
94 void load(int sect, jack_port_t*);
95 void load_all();
96 PortMapWindow(GtkCheckMenuItem *item);
97 ~PortMapWindow();
98 public:
99 static GtkWidget *window; // there can only be 1 window
100 static PortMapWindow* instance;
101 void client_removed(string name);
102 void refresh();
103 void port_changed(string name, const char *tp, int flags, bool reg);
104 void connection_changed(string port1, string port2, bool conn);
105 static void toggle(GtkWidget* widget, gpointer data);
106 };
58 #include <gtkmm/checkmenuitem.h>
59 #include <gtkmm/radiomenuitem.h>
60
61 // #include <iostream>
62 #include <map>
63 #include <string>
64 #include <vector>
65
66 namespace gx_gui {
10767
10868 /****************************************************************
10969 **
11070 ** ---------------- the main GUI class ----------------
11171 **
11272 */
113
114 class GuiVariables
115 {
116 public:
117
118 bool fdialogbox1;
119 bool fdialogbox2;
120 bool fdialogbox3;
121 bool fdialogbox4;
122 bool fdialogbox6;
123 bool fdialogbox8;
124 bool fdialogbox_eq;
125 bool fdialogbox_eqs;
126 bool fdialogbox_mbf;
127 bool fdialogbox_moo;
128 bool fdialogbox_pha;
129 bool fdialogbox_se;
130 bool fdialogbox_wv;
131 bool fdialogbox_echo;
132 bool fdialogbox_delay;
133 bool fdialogbox_ovd;
134 bool fdialogbox_lh;
135 bool fdialogbox_sd;
136 bool fchorusbox;
137 bool fflangerbox;
138 bool fampmodul;
139 bool ftonemodule;
140 bool ftremolo_dialog;
141 bool fbiquadbox;
142 bool fphaser_mono_dialog;
143 bool fchorus_mono_dialog;
144 bool fflanger_mono_dialog;
145 bool ffeedback_dialog;
146 bool ftonestack_dialog;
147 bool fcabinet_dialog;
148
149 void register_gui_parameter();
73
74 class GuiVariables {
75 public:
76 bool dialogbox[30];
77 void register_gui_parameter();
15078 };
15179
15280 extern GuiVariables guivar;
15381
82 /****************************************************************/
83
84 /* global GUI widgets */
85 class GlobalWidgets {
86 public:
87 /* global GUI widgets */
88 GtkWidget* fWindow;
89 GtkWidget* menuh;
90 GtkWidget* midibox;
91 GtkWidget* patch_info;
92 GtkWidget* tuner_widget;
93 GtkWidget* rack_widget;
94 GtkWidget* srack_widget;
95 GtkWidget* menu_mono_rack;
96 GtkWidget* menu_stereo_rack;
97 GtkWidget* rack_tool_bar;
98
99 /* icon widgets */
100 GdkPixbuf* ib;
101 GdkPixbuf* ibm;
102 GdkPixbuf* ibr;
103
104 /* jack server status icons */
105 GtkWidget* gx_jackd_on_image;
106 GtkWidget* gx_jackd_off_image;
107
108 /* engine status images */
109 GtkWidget* gx_engine_on_image;
110 GtkWidget* gx_engine_off_image;
111 GtkWidget* gx_engine_bypass_image;
112 GtkWidget* gx_engine_item;
113 GtkStatusIcon* status_icon;
114 };
115
116 extern GlobalWidgets gw;
117
118 /****************************************************************/
119
120 class SkinHandling {
121 public:
122 /* skin handling */
123 vector<string> skin_list;
124 gint gx_current_skin;
125 int last_skin;
126 int no_opt_skin;
127 int set_knob;
128 SkinHandling();
129 };
130
131 extern SkinHandling skin;
132
133 /****************************************************************/
134
154135 void gx_start_stop_jconv(GtkWidget*, gpointer);
155136
156 class UiRegler: gx_ui::GxUiItemFloat, protected Gtk::Adjustment
157 {
158 protected:
159 Gxw::Regler *m_regler;
160 void on_value_changed();
161 virtual void reflectZone();
162 public:
163 static GtkWidget* create(gx_ui::GxUI& ui, Gxw::Regler *regler, string id, bool show_value);
164 UiRegler(gx_ui::GxUI &ui, FloatParameter &param, Gxw::Regler *regler, bool show_value);
165 virtual ~UiRegler();
166 GtkWidget *get_widget() { return GTK_WIDGET(m_regler->gobj()); }
167 };
168
169 class UiSelector
170 {
171 protected:
172 Gxw::Selector m_selector;
173 void init(Parameter& param);
174 public:
175 UiSelector();
176 static GtkWidget* create(gx_ui::GxUI& ui, string id);
177 GtkWidget *get_widget() { return GTK_WIDGET(m_selector.gobj()); }
178 };
179
180 class UiSelectorFloat: public UiSelector, gx_ui::GxUiItemFloat, protected Gtk::Adjustment
181 {
182 protected:
183 virtual void reflectZone();
184 void on_value_changed();
185 public:
186 UiSelectorFloat(gx_ui::GxUI& ui, FloatParameter &param);
187 };
188
189 class UiSelectorInt: public UiSelector, gx_ui::GxUiItemInt, protected Gtk::Adjustment
190 {
191 protected:
192 virtual void reflectZone();
193 void on_value_changed();
194 public:
195 UiSelectorInt(gx_ui::GxUI& ui, IntParameter &param);
196 };
197
198 class UiReglerWithCaption: public UiRegler
199 {
200 private:
201 Gtk::Label m_label;
202 Gtk::VBox m_box;
203 public:
204 static GtkWidget* create(gx_ui::GxUI& ui, Gxw::Regler *regler, string id, bool show_value);
205 static GtkWidget* create(gx_ui::GxUI& ui, Gxw::Regler *regler, string id, Glib::ustring label, bool show_value);
206
207 UiReglerWithCaption(gx_ui::GxUI &ui, FloatParameter &param, Gxw::Regler *regler, Glib::ustring label, bool show_value);
208 GtkWidget *get_widget() { return GTK_WIDGET(m_box.gobj()); }
209 };
210
211 class UiRackReglerWithCaption: public UiRegler
212 {
213 private:
214 Gtk::Label m_label;
215 Gtk::VBox m_box;
216 public:
217 static GtkWidget* create(gx_ui::GxUI& ui, Gxw::Regler *regler, string id);
218 static GtkWidget* create(gx_ui::GxUI& ui, Gxw::Regler *regler, string id, Glib::ustring label);
219
220 UiRackReglerWithCaption(gx_ui::GxUI &ui, FloatParameter &param, Gxw::Regler *regler, Glib::ustring label);
221 GtkWidget *get_widget() { return GTK_WIDGET(m_box.gobj()); }
222 };
223
224 class UiRackRegler: public UiRegler
225 {
226 private:
227 Gtk::Label m_label;
228 Gtk::VBox m_box;
229 public:
230 static GtkWidget* create(gx_ui::GxUI& ui, Gxw::Regler *regler, string id);
231 static GtkWidget* create(gx_ui::GxUI& ui, Gxw::Regler *regler, string id, Glib::ustring label);
232
233 UiRackRegler(gx_ui::GxUI &ui, FloatParameter &param, Gxw::Regler *regler, Glib::ustring label);
234 GtkWidget *get_widget() { return GTK_WIDGET(m_box.gobj()); }
235 };
236
237 class UiSwitch: public Gxw::Switch
238 {
239 public:
240 UiSwitch(const char *sw_type);
241 GtkWidget *get_widget() { return GTK_WIDGET(gobj()); }
242 static UiSwitch *new_switch(gx_ui::GxUI& ui, const char *sw_type, Parameter &param);
243 static UiSwitch *new_switch(gx_ui::GxUI& ui, const char *sw_type, string id)
244 {
245 if (!parameter_map.hasId(id)) return 0;
246 return new_switch(ui, sw_type, parameter_map[id]);
247 }
248 static GtkWidget *create(gx_ui::GxUI& ui, const char *sw_type, string id)
249 { return new_switch(ui, sw_type, id)->get_widget(); }
250 };
251
252 class UiSwitchFloat: public UiSwitch, gx_ui::GxUiItemFloat
253 {
254 protected:
255 void on_toggled();
256 virtual void reflectZone();
257 public:
258 UiSwitchFloat(gx_ui::GxUI& ui, const char *sw_type, FloatParameter &param);
259 };
260
261 class UiSwitchBool: public UiSwitch, gx_ui::GxUiItemBool
262 {
263 protected:
264 void on_toggled();
265 virtual void reflectZone();
266 public:
267 UiSwitchBool(gx_ui::GxUI& ui, const char *sw_type, BoolParameter &param);
268 };
269
270 class UiSwitchWithCaption
271 {
272 private:
273 Gtk::Label m_label;
274 Gtk::Box *m_box;
275 protected:
276 UiSwitch *m_switch;
277 public:
278 static GtkWidget* create(gx_ui::GxUI& ui, const char *sw_type, string id,
279 Gtk::PositionType pos);
280 static GtkWidget* create(gx_ui::GxUI& ui, const char *sw_type, string id,
281 Glib::ustring label, Gtk::PositionType pos);
282 UiSwitchWithCaption(gx_ui::GxUI &ui, const char *sw_type, Parameter &param,
283 Glib::ustring label, Gtk::PositionType pos);
284 ~UiSwitchWithCaption();
285 GtkWidget *get_widget() { return GTK_WIDGET(m_box->gobj()); }
286 };
287
288 class UiCabSwitch: public UiSwitchWithCaption
289 {
290 private:
291 void on_switch_toggled();
292 public:
293 static GtkWidget* create(gx_ui::GxUI& ui, string id, Glib::ustring label);
294 UiCabSwitch(gx_ui::GxUI &ui, Parameter &param, Glib::ustring label);
295 };
296
297 class UiContrastSwitch: public UiSwitchWithCaption
298 {
299 private:
300 void on_switch_toggled();
301 public:
302 static GtkWidget* create(gx_ui::GxUI& ui, string id, Glib::ustring label);
303 UiContrastSwitch(gx_ui::GxUI &ui, Parameter &param, Glib::ustring label);
304 };
305
306 struct uiTuner : public gx_ui::GxUiItemFloat, public Gtk::Alignment
307 {
308 private:
309 Gxw::Tuner fTuner;
310 public:
311 void set_freq(double freq) { fTuner.set_freq(freq); }
312 uiTuner(gx_ui::GxUI* ui, float* zone);
313 virtual void reflectZone();
314 };
315
316 class GxMainInterface : public gx_ui::GxUI
317 {
318 private:
319 // private constructor
320 GxMainInterface(const char* name);
321
322 void addMainMenu();
323
324 void addEngineMenu();
325 void addJackServerMenu();
326
327 void addPresetMenu();
328 void addExtraPresetMenu();
329
330 void addPluginMenu();
331 void addAmpMenu();
332
333 void addOptionMenu();
334 void addGuiSkinMenu();
335
336 void addAboutMenu();
337
338 bool on_meter_button_release(GdkEventButton* ev);
339 void on_tuner_activate();
340 void gx_show_menu_settings(GtkWidget *widget, gpointer data);
341 void on_log_activate();
342 void on_rack_activate();
343 void on_rrack_activate();
344 void on_srack_activate();
345 void on_toolbar_activate();
346 void on_tube_activate();
347 void set_mouse_mode();
348 void on_show_oscilloscope();
349 bool on_refresh_oscilloscope();
350
351 protected :
352 int fTop;
353 GtkWidget* fBox[stackSize];
354 GtkWidget* rBox;
355 GtkWidget* sBox;
356 GtkWidget* tBox;
357
358
359 int fMode[stackSize];
360 bool fStopped;
361 GtkTextView* fLoggingWindow;
362 GtkExpander* fLoggingBox;
363 GtkAdjustment* fLoggingVAdjustment;
364 Gxw::FastMeter fLevelMeters[2];
365 uiTuner fTuner;
366 Gxw::WaveView fWaveView;
367
368 GtkWidget* fSignalLevelBar;
369
370 // menu items
371 map<string, GtkWidget*> fMenuList;
372 MenuCheckItem fMidiInPreset;
373 MenuCheckItem fShowTooltips;
374 MenuCheckItem fShowTuner;
375
376 MenuCheckItem fShowWaveView;
377 MenuCheckItem fSetMouse;
378 #ifdef EXPERIMENTAL
379 MenuCheckItem fShowExpWindow;
380 #endif
381
382 // jack menu widgets
383 GtkWidget* fJackConnectItem;
384 GtkWidget* fJackLatencyItem[NJACKLAT];
385
386 GtkWidget* addWidget(const char* label, GtkWidget* w);
387 virtual void pushBox(int mode, GtkWidget* w);
388
389 public :
390 MenuCheckItem fShowRack;
391 MenuCheckItem fShowRRack;
392 MenuCheckItem fShowSRack;
393 MenuCheckItem fShowLogger;
394 MenuCheckItem fShowMidiOut;
395 MenuCheckItem fShowToolBar;
396 RadioCheckItem fSelectTubeModel[12];
397
398 GtkWidget* logger;
399 GtkWidget* RBox;
400
401 static bool fInitialized;
402 int highest_unseen_msg_level;
403
404 static const gboolean expand = TRUE;
405 static const gboolean fill = TRUE;
406 static const gboolean homogene = FALSE;
407
408 static GxMainInterface* instance(const char* name = "");
409
410 // for key acclerators
411 GtkAccelGroup* fAccelGroup;
412
413 // -- acquire a pointer to the logging window
414 GtkTextView* const getLoggingWindow() const { return fLoggingWindow; }
415 GtkExpander* const getLoggingBox() const { return fLoggingBox; }
416 GtkWidget* const getJackConnectItem() const { return fJackConnectItem; }
417 void set_waveview_buffer();
137 /****************************************************************/
138
139 /* ---- linking menu items and parameter ---- */
140 class MenuCheckItem: public Gtk::CheckMenuItem {
141 private:
142 SwitchParameter* param;
143 void on_my_activate();
144 public:
145 // FIXME not gtk-2.12: MenuCheckItem() { set_use_underline(); }
146 MenuCheckItem(): Gtk::CheckMenuItem("", true) {}
147 void set_parameter(SwitchParameter *p);
148 void add_parameter(SwitchParameter *p);
149 SwitchParameter * get_parameter();
150 };
151
152 /****************************************************************/
153
154 /* ---- linking menu items and parameter ---- */
155 class RadioCheckItem: public Gtk::RadioMenuItem {
156 private:
157 SwitchParameter* param;
158 void on_my_toggled();
159 public:
160 Gtk::RadioMenuItem::Group Group;
161 // FIXME not gtk-2.12: MenuCheckItem() { set_use_underline(); }
162 RadioCheckItem(): Gtk::RadioMenuItem(Group, "", true) {}
163 void set_parameter(SwitchParameter *p);
164 SwitchParameter * get_parameter();
165 };
166
167 /****************************************************************/
168
169 class ToggleCheckButton: public Gtk::ToggleButton {
170 private:
171 SwitchParameter* param;
172 void on_my_toggled();
173 public:
174 Gtk::Label m_label;
175 void set_parameter(SwitchParameter *p);
176 SwitchParameter * get_parameter();
177 ToggleCheckButton();
178 ~ToggleCheckButton();
179 };
180
181 /****************************************************************/
182
183 class UiRegler: gx_ui::GxUiItemFloat, protected Gtk::Adjustment {
184 protected:
185 Gxw::Regler *m_regler;
186 void on_value_changed();
187 virtual void reflectZone();
188 public:
189 static GtkWidget* create(gx_ui::GxUI& ui, Gxw::Regler *regler, string id, bool show_value);
190 UiRegler(gx_ui::GxUI &ui, FloatParameter &param, Gxw::Regler *regler, bool show_value);
191 virtual ~UiRegler();
192 GtkWidget *get_widget() { return GTK_WIDGET(m_regler->gobj()); }
193 };
194
195 /****************************************************************/
196
197 class UiSelector {
198 protected:
199 Gxw::Selector m_selector;
200 void init(Parameter& param);
201 public:
202 UiSelector();
203 static GtkWidget* create(gx_ui::GxUI& ui, string id);
204 GtkWidget *get_widget() { return GTK_WIDGET(m_selector.gobj()); }
205 };
206
207 /****************************************************************/
208
209 class UiSelectorFloat: public UiSelector, gx_ui::GxUiItemFloat, protected Gtk::Adjustment {
210 protected:
211 virtual void reflectZone();
212 void on_value_changed();
213 public:
214 UiSelectorFloat(gx_ui::GxUI& ui, FloatParameter &param);
215 };
216
217 /****************************************************************/
218
219 class UiSelectorInt: public UiSelector, gx_ui::GxUiItemInt, protected Gtk::Adjustment {
220 protected:
221 virtual void reflectZone();
222 void on_value_changed();
223 public:
224 UiSelectorInt(gx_ui::GxUI& ui, IntParameter &param);
225 };
226
227 /****************************************************************/
228
229 class UiReglerWithCaption: public UiRegler {
230 private:
231 Gtk::Label m_label;
232 Gtk::VBox m_box;
233 public:
234 static GtkWidget* create(gx_ui::GxUI& ui, Gxw::Regler *regler, string id, bool show_value);
235 static GtkWidget* create(gx_ui::GxUI& ui, Gxw::Regler *regler, string id,
236 Glib::ustring label, bool show_value);
237 UiReglerWithCaption(gx_ui::GxUI &ui, FloatParameter &param, Gxw::Regler *regler,
238 Glib::ustring label, bool show_value);
239 GtkWidget *get_widget() { return GTK_WIDGET(m_box.gobj());}
240 };
241
242 /****************************************************************/
243
244 class UiRackReglerWithCaption: public UiRegler {
245 private:
246 Gtk::Label m_label;
247 Gtk::VBox m_box;
248 public:
249 static GtkWidget* create(gx_ui::GxUI& ui, Gxw::Regler *regler, string id);
250 static GtkWidget* create(gx_ui::GxUI& ui, Gxw::Regler *regler, string id,
251 Glib::ustring label);
252 UiRackReglerWithCaption(gx_ui::GxUI &ui, FloatParameter &param, Gxw::Regler *regler,
253 Glib::ustring label);
254 GtkWidget *get_widget() { return GTK_WIDGET(m_box.gobj());}
255 };
256
257 /****************************************************************/
258
259 class UiRackRegler: public UiRegler {
260 private:
261 Gtk::Label m_label;
262 Gtk::VBox m_box;
263 public:
264 static GtkWidget* create(gx_ui::GxUI& ui, Gxw::Regler *regler, string id);
265 static GtkWidget* create(gx_ui::GxUI& ui, Gxw::Regler *regler, string id,
266 Glib::ustring label);
267 UiRackRegler(gx_ui::GxUI &ui, FloatParameter &param, Gxw::Regler *regler,
268 Glib::ustring label);
269 GtkWidget *get_widget() { return GTK_WIDGET(m_box.gobj());}
270 };
271
272 /****************************************************************/
273
274 class UiSwitch: public Gxw::Switch {
275 public:
276 explicit UiSwitch(const char *sw_type);
277 GtkWidget *get_widget() { return GTK_WIDGET(gobj());}
278 static UiSwitch *new_switch(gx_ui::GxUI& ui, const char *sw_type, Parameter &param);
279 static UiSwitch *new_switch(gx_ui::GxUI& ui, const char *sw_type, string id) {
280 if (!parameter_map.hasId(id)) return 0;
281 return new_switch(ui, sw_type, parameter_map[id]);
282 }
283 static GtkWidget *create(gx_ui::GxUI& ui, const char *sw_type, string id) {
284 return new_switch(ui, sw_type, id)->get_widget();}
285 };
286
287 /****************************************************************/
288
289 class UiSwitchFloat: public UiSwitch, gx_ui::GxUiItemFloat {
290 protected:
291 void on_toggled();
292 virtual void reflectZone();
293 public:
294 UiSwitchFloat(gx_ui::GxUI& ui, const char *sw_type, FloatParameter &param);
295 };
296
297 /****************************************************************/
298
299 class UiSwitchBool: public UiSwitch, gx_ui::GxUiItemBool {
300 protected:
301 void on_toggled();
302 virtual void reflectZone();
303 public:
304 UiSwitchBool(gx_ui::GxUI& ui, const char *sw_type, BoolParameter &param);
305 };
306
307 /****************************************************************/
308
309 class UiSwitchWithCaption {
310 private:
311 Gtk::Label m_label;
312 Gtk::Box *m_box;
313 protected:
314 UiSwitch *m_switch;
315 public:
316 static GtkWidget* create(gx_ui::GxUI& ui, const char *sw_type, string id,
317 Gtk::PositionType pos);
318 static GtkWidget* create(gx_ui::GxUI& ui, const char *sw_type, string id,
319 Glib::ustring label, Gtk::PositionType pos);
320 UiSwitchWithCaption(gx_ui::GxUI &ui, const char *sw_type, Parameter &param,
321 Glib::ustring label, Gtk::PositionType pos);
322 ~UiSwitchWithCaption();
323 GtkWidget *get_widget() { return GTK_WIDGET(m_box->gobj()); }
324 };
325
326 /****************************************************************/
327
328 class UiCabSwitch: public UiSwitchWithCaption {
329 private:
330 void on_switch_toggled();
331 public:
332 static GtkWidget* create(gx_ui::GxUI& ui, string id, Glib::ustring label);
333 UiCabSwitch(gx_ui::GxUI &ui, Parameter &param, Glib::ustring label);
334 };
335
336 /****************************************************************/
337
338 class UiContrastSwitch: public UiSwitchWithCaption {
339 private:
340 void on_switch_toggled();
341 public:
342 static GtkWidget* create(gx_ui::GxUI& ui, string id, Glib::ustring label);
343 UiContrastSwitch(gx_ui::GxUI &ui, Parameter &param, Glib::ustring label);
344 };
345
346 /****************************************************************/
347
348 struct uiTuner : public gx_ui::GxUiItemFloat, public Gtk::Alignment {
349 private:
350 Gxw::Tuner fTuner;
351 public:
352 void set_freq(double freq) { fTuner.set_freq(freq); }
353 uiTuner(gx_ui::GxUI* ui, float* zone);
354 virtual void reflectZone();
355 };
356
357 /****************************************************************/
358
359 class GxMainInterface : public gx_ui::GxUI {
360 private:
361 // private constructor
362 explicit GxMainInterface(const char* name);
363
364 void addMainMenu();
365 void addEngineMenu();
366 void addJackServerMenu();
367 void addPresetMenu();
368 void addExtraPresetMenu();
369 void addPluginMenu();
370 void addAmpMenu();
371 void addOptionMenu();
372 void addGuiSkinMenu();
373 void addAboutMenu();
374
375 bool on_meter_button_release(GdkEventButton* ev);
376 void on_tuner_activate();
377 void gx_show_menu_settings(GtkWidget *widget, gpointer data);
378 void on_log_activate();
379 void on_rack_activate();
380 void on_rrack_activate();
381 void on_srack_activate();
382 void on_toolbar_activate();
383 void on_tube_activate();
384 void set_mouse_mode();
385 void on_show_oscilloscope();
386 bool on_refresh_oscilloscope();
387
388 protected :
389 int fTop;
390 GtkWidget* fBox[stackSize];
391 GtkWidget* rBox;
392 GtkWidget* sBox;
393 GtkWidget* tBox;
394
395 int fMode[stackSize];
396 bool fStopped;
397 GtkTextView* fLoggingWindow;
398 GtkExpander* fLoggingBox;
399 GtkAdjustment* fLoggingVAdjustment;
400 Gxw::FastMeter fLevelMeters[2];
401 uiTuner fTuner;
402 Gxw::WaveView fWaveView;
403 GtkWidget* fSignalLevelBar;
404
405 // menu items
406 map<string, GtkWidget*> fMenuList;
407 MenuCheckItem fMidiInPreset;
408 MenuCheckItem fShowTooltips;
409 MenuCheckItem fShowTuner;
410 MenuCheckItem fShowWaveView;
411 MenuCheckItem fSetMouse;
412
413 // jack menu widgets
414 GtkWidget* fJackConnectItem;
415 GtkWidget* fJackLatencyItem[NJACKLAT];
416
417 GtkWidget* addWidget(const char* label, GtkWidget* w);
418 virtual void pushBox(int mode, GtkWidget* w);
419
420 public :
421 MenuCheckItem fShowRack;
422 MenuCheckItem fShowRRack;
423 MenuCheckItem fShowSRack;
424 MenuCheckItem fShowLogger;
425 MenuCheckItem fShowMidiOut;
426 MenuCheckItem fShowToolBar;
427 RadioCheckItem fSelectTubeModel[14];
428
429 GtkWidget* logger;
430 GtkWidget* RBox;
431
432 static bool fInitialized;
433 int highest_unseen_msg_level;
434
435 static const gboolean expand = TRUE;
436 static const gboolean fill = TRUE;
437 static const gboolean homogene = FALSE;
438
439 static GxMainInterface* instance(const char* name = "");
440
441 // for key acclerators
442 GtkAccelGroup* fAccelGroup;
443
444 // -- acquire a pointer to the logging window
445 GtkTextView* const getLoggingWindow() const { return fLoggingWindow; }
446 GtkExpander* const getLoggingBox() const { return fLoggingBox; }
447 GtkWidget* const getJackConnectItem() const { return fJackConnectItem; }
448 void set_waveview_buffer();
418449
419450 Gxw::WaveView& getWaveView() { return fWaveView; }
420451
421 Gxw::FastMeter& getLevelMeter(unsigned int i)
422 { assert(i < sizeof(fLevelMeters)/sizeof(fLevelMeters[0])); return fLevelMeters[i]; }
423
424 GtkWidget* const getJackLatencyItem(const jack_nframes_t bufsize) const;
425
426 GtkWidget* const getMenu(const string name) { return fMenuList[name]; }
427
428 // -- layout groups
429 void gx_build_mono_rack();
430 void gx_build_stereo_rack();
431 void openHorizontalOrderBox(const char* label, float* posit);
432 void openHorizontalTableBox(const char* label);
433 void openHorizontalRestetBox(const char* label, float* posit);
434 void openFrameBox(const char* label);
435 void openHorizontalBox(const char* label = "");
436 void openHorizontalhideBox(const char* label = "");
437 void openHorizontalhideBox1(const char* label = "");
438 void openVerticalBox(const char* label = "");
439 void openVerticalBox1(const char* label = "");
440 void openFlipLabelBox(const char* = "");
441 void openVerticalSwitchBox(const char* label, int state, int wit, float* zone);
442 void openVerticalMidiBox(const char* label = "");
443 void openDialogBox(const char *id_dialog, const char *id_switch);
444 void opensDialogBox(const char *id_dialog, const char *id_switch);
445 void openDialogBox(const char *id_dialog, const char *id_switch,const char *expose_funk);
446 void opensDialogBox(const char *id_dialog, const char *id_switch,const char *expose_funk);
447 void openPatchInfoBox(float* zone);
448 void openWarningBox(const char* label, float* zone);
449 void openEventBox(const char* label = "");
450 void openHandleBox(const char* label = "");
451 void openExpanderBox(const char* label, float* zone);
452 void openTabBox(const char* label = "");
453 void openSpaceBox(const char* label = "");
454 void openAmpBox(const char* label = "");
455 void openSlooperBox(const char* label = "");
456 void openPlugBox(const char* label = "");
457 void openpaintampBox(const char* label = "");
458 void openPaintBox(const char* label = "", const char* name = NULL);
459 void openPaintBox1(const char* label = "");
460 void openPaintBox2(const char* label = "");
461 void openScrollBox(const char* label = "");
462 void openTextLoggingBox(const char* label = "");
463 void openLevelMeterBox(const char* label);
464 void openToolBar(const char* label = "");
465 void setSkinBox(const char* label, float* zone);
466 void closeBox();
467
468 // -- active widgets
469 void addJConvButton(const char* label, float* zone);
470 void addToggleButton(const char* label, float* zone);
471 void addJToggleButton(const char* label, float* zone);
472 void addPToggleButton(const char* label, float* zone);
473 void addMToggleButton(const char* label, float* zone);
474 void addCheckButton(const char* label, float* zone);
475 void addNumEntry(const char* label, float* zone, float init, float min, float max, float step);
476 void addNumDisplay();
477 void addLiveWaveDisplay(const char* label, float* zone , float* zone1);
478 void addStatusDisplay(const char* label, float* zone );
479 //void addselector(const char* label, float* zone,int maxv, const char* []);
480 void addSpinValueBox(string id, const char* label=0);
481 //void addselector(string id, const char* label=0, int nvalues=0, const char **pvalues=0);
482 void addCheckButton(string id, const char* label=0);
483 void addNumEntry(string id, const char* label=0);
484 void addPToggleButton(string id, const char* label=0);
485 void addMToggleButton(string id, const char* label=0);
486
487 // -- other
488 void show_msg(string msgbuf, gx_system::GxMsgType msgtype);
489 void set_logging_expander_color(const char *color);
490
491 void setup();
492 void show();
493 void run();
494
495 // widget creation
496 void addwidget(GtkWidget *widget) { if (widget) gtk_container_add(GTK_CONTAINER(fBox[fTop]), widget); }
497 void create_bigknob(string id)
498 {
499 addwidget(UiReglerWithCaption::create(*this, new Gxw::BigKnob(), id, true));
500 }
501 void create_bigknob(string id, Glib::ustring label)
502 {
503 addwidget(UiReglerWithCaption::create(*this, new Gxw::BigKnob(), id, label, true));
504 }
505 void create_smallknob(string id)
506 {
507 addwidget(UiReglerWithCaption::create(*this, new Gxw::SmallKnob(), id, true));
508 }
509 void create_smallknob(string id, Glib::ustring label)
510 {
511 addwidget(UiReglerWithCaption::create(*this, new Gxw::SmallKnob(), id, label, true));
512 }
513 void create_smallknob_no_caption(string id)
514 {
515 addwidget(UiRegler::create(*this, new Gxw::SmallKnob(), id, true));
516 }
517
518 void create_small_rackknob(string id)
519 {
520 addwidget(UiRackReglerWithCaption::create(*this, new Gxw::SmallKnob(), id));
521 }
522 void create_small_rackknob(string id, Glib::ustring label)
523 {
524 addwidget(UiRackReglerWithCaption::create(*this, new Gxw::SmallKnob(), id, label));
525 }
526
527 void create_smallknob_no_value(string id)
528 {
529 addwidget(UiReglerWithCaption::create(*this, new Gxw::SmallKnob(), id, false));
530 }
531 void create_smallknob_no_value(string id, Glib::ustring label)
532 {
533 addwidget(UiReglerWithCaption::create(*this, new Gxw::SmallKnob(), id, label, false));
534 }
535 void create_smallknob_no_caption_no_value(string id)
536 {
537 addwidget(UiRegler::create(*this, new Gxw::SmallKnob(), id, false));
538 }
539
540 void create_smallknobr(string id)
541 {
542 addwidget(UiReglerWithCaption::create(*this, new Gxw::SmallKnobR(), id, true));
543 }
544 void create_smallknobr(string id, Glib::ustring label)
545 {
546 addwidget(UiReglerWithCaption::create(*this, new Gxw::SmallKnobR(), id, label, true));
547 }
548
549 void create_small_rackknobr(string id)
550 {
551 addwidget(UiRackReglerWithCaption::create(*this, new Gxw::SmallKnobR(), id));
552 }
553 void create_small_rackknobr(string id, Glib::ustring label)
554 {
555 addwidget(UiRackReglerWithCaption::create(*this, new Gxw::SmallKnobR(), id, label));
556 }
557
558 void create_smallknobr_no_caption(string id)
559 {
560 addwidget(UiRegler::create(*this, new Gxw::SmallKnobR(), id, true));
561 }
562 void create_wheel(string id, bool show_value = false)
563 {
564 addwidget(UiRegler::create(*this, new Gxw::Wheel(), id, show_value));
565 }
566 void create_wheel_with_value(string id, bool show_value = true)
567 {
568 addwidget(UiRegler::create(*this, new Gxw::Wheel(), id, show_value));
569 }
570 void create_hslider(string id)
571 {
572 addwidget(UiReglerWithCaption::create(*this, new Gxw::HSlider(), id, true));
573 }
574 void create_hslider(string id, Glib::ustring(label))
575 {
576 addwidget(UiReglerWithCaption::create(*this, new Gxw::HSlider(), id, label, true));
577 }
578 void create_minislider(string id)
579 {
580 addwidget(UiRegler::create(*this, new Gxw::MiniSlider(), id, false));
581 }
582 void create_minislider(string id, Glib::ustring(label))
583 {
584 addwidget(UiReglerWithCaption::create(*this, new Gxw::MiniSlider(), id, label, true));
585 }
586
587 void create_eqslider_no_caption(string id, bool show_value = true)
588 {
589 addwidget(UiRegler::create(*this, new Gxw::EqSlider(), id, show_value));
590 }
591 void create_eqslider(string id, bool show_value = true)
592 {
593 addwidget(UiReglerWithCaption::create(*this, new Gxw::EqSlider(), id, show_value));
594 }
595 void create_eqslider(string id, Glib::ustring label, bool show_value = true)
596 {
597 addwidget(UiReglerWithCaption::create(*this, new Gxw::EqSlider(), id, label, show_value));
598 }
599 void create_eqslider(string id, const char *label, bool show_value = true)
600 {
601 addwidget(UiReglerWithCaption::create(*this, new Gxw::EqSlider(), id, label, show_value));
602 }
603 // levelslider
604 void create_levelslider_no_caption(string id, bool show_value = true)
605 {
606 addwidget(UiRegler::create(*this, new Gxw::LevelSlider(), id, show_value));
607 }
608 void create_levelslider(string id, bool show_value = true)
609 {
610 addwidget(UiReglerWithCaption::create(*this, new Gxw::LevelSlider(), id, show_value));
611 }
612 void create_levelslider(string id, Glib::ustring label, bool show_value = true)
613 {
614 addwidget(UiReglerWithCaption::create(*this, new Gxw::LevelSlider(), id, label, show_value));
615 }
616 void create_levelslider(string id, const char *label, bool show_value = true)
617 {
618 addwidget(UiReglerWithCaption::create(*this, new Gxw::LevelSlider(), id, label, show_value));
619 }
620 //rack
621 void create_eq_rackslider_no_caption(string id)
622 {
623 addwidget(UiRackRegler::create(*this, new Gxw::EqSlider(), id));
624 }
625 void create_eq_rackslider(string id)
626 {
627 addwidget(UiRackReglerWithCaption::create(*this, new Gxw::EqSlider(), id));
628 }
629 void create_eq_rackslider(string id, Glib::ustring label)
630 {
631 addwidget(UiRackReglerWithCaption::create(*this, new Gxw::EqSlider(), id, label));
632 }
633 void create_eq_rackslider(string id, const char *label)
634 {
635 addwidget(UiRackReglerWithCaption::create(*this, new Gxw::EqSlider(), id, label));
636 }
637
638 void create_spin_value(string id)
639 {
640 addwidget(UiRegler::create(*this, new Gxw::ValueDisplay(), id, true));
641 }
642 void create_simple_spin_value(string id)
643 {
644 addwidget(UiRegler::create(*this, new Gxw::SimpleValueDisplay(), id, true));
645 }
646
647 void create_selector(string id)
648 {
649 addwidget(UiSelector::create(*this, id));
650 }
651 void create_switch_no_caption(const char *sw_type, string id)
652 {
653 addwidget(UiSwitch::create(*this, sw_type, id));
654 }
655 void create_switch(const char *sw_type, string id, Gtk::PositionType pos = Gtk::POS_TOP)
656 {
657 addwidget(UiSwitchWithCaption::create(*this, sw_type, id, pos));
658 }
659 void create_switch(const char *sw_type, string id, Glib::ustring label, Gtk::PositionType pos = Gtk::POS_TOP)
660 {
661 addwidget(UiSwitchWithCaption::create(*this, sw_type, id, label, pos));
662 }
663 void create_cab_switch(string id, Glib::ustring label, Gtk::PositionType pos = Gtk::POS_TOP)
664 {
665 addwidget(UiCabSwitch::create(*this, id, label));
666 }
667 void create_contrast_switch(string id, Glib::ustring label, Gtk::PositionType pos = Gtk::POS_TOP)
668 {
669 addwidget(UiContrastSwitch::create(*this, id, label));
670 }
671 };
672
673 struct uiAdjustment : public gx_ui::GxUiItemFloat
674 {
675 GtkAdjustment* fAdj;
676 uiAdjustment(gx_ui::GxUI* ui, float* zone, GtkAdjustment* adj) : gx_ui::GxUiItemFloat(ui, zone), fAdj(adj) {}
677 static void changed (GtkAdjustment *adj, gpointer data)
678 {
679 float v = adj->value;
680 ((gx_ui::GxUiItemFloat*)data)->modifyZone(v);
681 }
682
683 virtual void reflectZone()
684 {
685 float v = *fZone;
686 fCache = v;
687 gtk_adjustment_set_value(fAdj, v);
688 }
689
690 };
691
452 Gxw::FastMeter& getLevelMeter(unsigned int i) {
453 assert(i < sizeof(fLevelMeters)/sizeof(fLevelMeters[0]));
454 return fLevelMeters[i];
455 }
456
457 GtkWidget* const getJackLatencyItem(const jack_nframes_t bufsize) const;
458
459 GtkWidget* const getMenu(const string name) { return fMenuList[name]; }
460
461 // -- layout groups
462 void gx_build_mono_rack();
463 void gx_build_stereo_rack();
464 void openHorizontalOrderBox(const char* label, float* posit);
465 void openHorizontalTableBox(const char* label);
466 void openHorizontalRestetBox(const char* label, float* posit);
467 void openFrameBox(const char* label);
468 void openHorizontalBox(const char* label = "");
469 void openHorizontalhideBox(const char* label = "");
470 void openHorizontalhideBox1(const char* label = "");
471 void openVerticalBox(const char* label = "");
472 void openVerticalBox1(const char* label = "");
473 void openFlipLabelBox(const char* = "");
474 void openVerticalSwitchBox(const char* label, int state, int wit, float* zone);
475 void openVerticalMidiBox(const char* label = "");
476 void openDialogBox(const char *id_dialog, const char *id_switch);
477 void opensDialogBox(const char *id_dialog, const char *id_switch);
478 void openDialogBox(const char *id_dialog, const char *id_switch, const char *expose_funk);
479 void opensDialogBox(const char *id_dialog, const char *id_switch, const char *expose_funk);
480 void openPatchInfoBox(float* zone);
481 void openWarningBox(const char* label, float* zone);
482 void openEventBox(const char* label = "");
483 void openMainBox(const char* label = "", const char *expose_funk= NULL);
484 void openHandleBox(const char* label = "");
485 void openExpanderBox(const char* label, float* zone);
486 void openTabBox(const char* label = "");
487 void openSpaceBox(const char* label = "");
488 void openAmpBox(const char* label = "");
489 void openSlooperBox(const char* label = "");
490 void openPlugBox(const char* label = "");
491 void openpaintampBox(const char* label = "");
492 void openPaintBox(const char* label = "", const char* name = NULL);
493 void openPaintBox1(const char* label = "");
494 void openPaintBox2(const char* label = "");
495 void openScrollBox(const char* label = "");
496 void openTextLoggingBox(const char* label = "");
497 void openLevelMeterBox(const char* label);
498 void openToolBar(const char* label = "");
499 void setSkinBox(const char* label, float* zone);
500 void closeBox();
501
502 // -- active widgets
503 void addJConvButton(const char* label, float* zone);
504 void addToggleButton(const char* label, float* zone);
505 void addJToggleButton(const char* label, float* zone);
506 void addPToggleButton(const char* label, float* zone);
507 void addMToggleButton(const char* label, float* zone);
508 void addCheckButton(const char* label, float* zone);
509 void addNumEntry(const char* label, float* zone, float init, float min, float max, float step);
510 void addNumDisplay();
511 void addLiveWaveDisplay(const char* label, float* zone , float* zone1);
512 void addStatusDisplay(const char* label, float* zone );
513 // void addselector(const char* label, float* zone,int maxv, const char* []);
514 void addSpinValueBox(string id, const char* label = 0);
515 // void addselector(string id, const char* label=0, int nvalues=0, const char **pvalues=0);
516 void addCheckButton(string id, const char* label = 0);
517 void addNumEntry(string id, const char* label = 0);
518 void addPToggleButton(string id, const char* label = 0);
519 void addMToggleButton(string id, const char* label = 0);
520
521 // -- other
522 void show_msg(string msgbuf, gx_system::GxMsgType msgtype);
523 void set_logging_expander_color(const char *color);
524
525 void setup();
526 void show();
527 void run();
528
529 // widget creation
530 void addwidget(GtkWidget *widget) {
531 if (widget) gtk_container_add(GTK_CONTAINER(fBox[fTop]), widget);
532 }
533 void create_bigknob(string id) {
534 addwidget(UiReglerWithCaption::create(*this, new Gxw::BigKnob(), id, true));
535 }
536 void create_bigknob(string id, Glib::ustring label) {
537 addwidget(UiReglerWithCaption::create(*this, new Gxw::BigKnob(), id, label, true));
538 }
539 void create_smallknob(string id) {
540 addwidget(UiReglerWithCaption::create(*this, new Gxw::SmallKnob(), id, true));
541 }
542 void create_smallknob(string id, Glib::ustring label) {
543 addwidget(UiReglerWithCaption::create(*this, new Gxw::SmallKnob(), id, label, true));
544 }
545 void create_smallknob_no_caption(string id) {
546 addwidget(UiRegler::create(*this, new Gxw::SmallKnob(), id, true));
547 }
548
549 void create_small_rackknob(string id) {
550 addwidget(UiRackReglerWithCaption::create(*this, new Gxw::SmallKnob(), id));
551 }
552 void create_small_rackknob(string id, Glib::ustring label) {
553 addwidget(UiRackReglerWithCaption::create(*this, new Gxw::SmallKnob(), id, label));
554 }
555
556 void create_smallknob_no_value(string id) {
557 addwidget(UiReglerWithCaption::create(*this, new Gxw::SmallKnob(), id, false));
558 }
559 void create_smallknob_no_value(string id, Glib::ustring label) {
560 addwidget(UiReglerWithCaption::create(*this, new Gxw::SmallKnob(), id, label, false));
561 }
562 void create_smallknob_no_caption_no_value(string id) {
563 addwidget(UiRegler::create(*this, new Gxw::SmallKnob(), id, false));
564 }
565
566 void create_smallknobr(string id) {
567 addwidget(UiReglerWithCaption::create(*this, new Gxw::SmallKnobR(), id, true));
568 }
569 void create_smallknobr(string id, Glib::ustring label) {
570 addwidget(UiReglerWithCaption::create(*this, new Gxw::SmallKnobR(), id, label, true));
571 }
572
573 void create_small_rackknobr(string id) {
574 addwidget(UiRackReglerWithCaption::create(*this, new Gxw::SmallKnobR(), id));
575 }
576 void create_small_rackknobr(string id, Glib::ustring label) {
577 addwidget(UiRackReglerWithCaption::create(*this, new Gxw::SmallKnobR(), id, label));
578 }
579
580 void create_smallknobr_no_caption(string id) {
581 addwidget(UiRegler::create(*this, new Gxw::SmallKnobR(), id, true));
582 }
583 void create_wheel(string id, bool show_value = false) {
584 addwidget(UiRegler::create(*this, new Gxw::Wheel(), id, show_value));
585 }
586 void create_wheel_with_value(string id, bool show_value = true) {
587 addwidget(UiRegler::create(*this, new Gxw::Wheel(), id, show_value));
588 }
589 void create_hslider(string id) {
590 addwidget(UiReglerWithCaption::create(*this, new Gxw::HSlider(), id, true));
591 }
592 void create_hslider(string id, Glib::ustring(label)) {
593 addwidget(UiReglerWithCaption::create(*this, new Gxw::HSlider(), id, label, true));
594 }
595 void create_minislider(string id) {
596 addwidget(UiRegler::create(*this, new Gxw::MiniSlider(), id, false));
597 }
598 void create_minislider(string id, Glib::ustring(label)) {
599 addwidget(UiReglerWithCaption::create(*this, new Gxw::MiniSlider(), id, label, true));
600 }
601
602 void create_eqslider_no_caption(string id, bool show_value = true) {
603 addwidget(UiRegler::create(*this, new Gxw::EqSlider(), id, show_value));
604 }
605 void create_eqslider(string id, bool show_value = true) {
606 addwidget(UiReglerWithCaption::create(*this, new Gxw::EqSlider(), id, show_value));
607 }
608 void create_eqslider(string id, Glib::ustring label, bool show_value = true) {
609 addwidget(UiReglerWithCaption::create(*this, new Gxw::EqSlider(),
610 id, label, show_value));
611 }
612 void create_eqslider(string id, const char *label, bool show_value = true) {
613 addwidget(UiReglerWithCaption::create(*this, new Gxw::EqSlider(),
614 id, label, show_value));
615 }
616 // levelslider
617 void create_levelslider_no_caption(string id, bool show_value = true) {
618 addwidget(UiRegler::create(*this, new Gxw::LevelSlider(), id, show_value));
619 }
620 void create_levelslider(string id, bool show_value = true) {
621 addwidget(UiReglerWithCaption::create(*this, new Gxw::LevelSlider(),
622 id, show_value));
623 }
624 void create_levelslider(string id, Glib::ustring label, bool show_value = true) {
625 addwidget(UiReglerWithCaption::create(*this, new Gxw::LevelSlider(),
626 id, label, show_value));
627 }
628 void create_levelslider(string id, const char *label, bool show_value = true) {
629 addwidget(UiReglerWithCaption::create(*this, new Gxw::LevelSlider(),
630 id, label, show_value));
631 }
632 // rack
633 void create_eq_rackslider_no_caption(string id) {
634 addwidget(UiRackRegler::create(*this, new Gxw::EqSlider(), id));
635 }
636 void create_eq_rackslider(string id) {
637 addwidget(UiRackReglerWithCaption::create(*this, new Gxw::EqSlider(), id));
638 }
639 void create_eq_rackslider(string id, Glib::ustring label) {
640 addwidget(UiRackReglerWithCaption::create(*this, new Gxw::EqSlider(), id, label));
641 }
642 void create_eq_rackslider(string id, const char *label) {
643 addwidget(UiRackReglerWithCaption::create(*this, new Gxw::EqSlider(), id, label));
644 }
645
646 void create_spin_value(string id) {
647 addwidget(UiRegler::create(*this, new Gxw::ValueDisplay(), id, true));
648 }
649 void create_simple_spin_value(string id) {
650 addwidget(UiRegler::create(*this, new Gxw::SimpleValueDisplay(), id, true));
651 }
652
653 void create_selector(string id) {
654 addwidget(UiSelector::create(*this, id));
655 }
656 void create_switch_no_caption(const char *sw_type, string id) {
657 addwidget(UiSwitch::create(*this, sw_type, id));
658 }
659 void create_switch(const char *sw_type, string id, Gtk::PositionType pos = Gtk::POS_TOP) {
660 addwidget(UiSwitchWithCaption::create(*this, sw_type, id, pos));
661 }
662 void create_switch(const char *sw_type, string id, Glib::ustring label,
663 Gtk::PositionType pos = Gtk::POS_TOP) {
664 addwidget(UiSwitchWithCaption::create(*this, sw_type, id, label, pos));
665 }
666 void create_cab_switch(string id, Glib::ustring label,
667 Gtk::PositionType pos = Gtk::POS_TOP) {
668 addwidget(UiCabSwitch::create(*this, id, label));
669 }
670 void create_contrast_switch(string id, Glib::ustring label,
671 Gtk::PositionType pos = Gtk::POS_TOP) {
672 addwidget(UiContrastSwitch::create(*this, id, label));
673 }
674 };
675
676 /****************************************************************/
677
678 struct uiAdjustment : public gx_ui::GxUiItemFloat {
679 GtkAdjustment* fAdj;
680 uiAdjustment(gx_ui::GxUI* ui, float* zone, GtkAdjustment* adj) :
681 gx_ui::GxUiItemFloat(ui, zone), fAdj(adj) {}
682 static void changed(GtkAdjustment *adj, gpointer data) {
683 float v = adj->value;
684 ((gx_ui::GxUiItemFloat*)data)->modifyZone(v);
685 }
686
687 virtual void reflectZone() {
688 float v = *fZone;
689 fCache = v;
690 gtk_adjustment_set_value(fAdj, v);
691 }
692 };
693
694 /****************************************************************/
692695
693696 extern const char *sw_led;
694697 extern const char *sw_switch;
698701 extern const char *sw_pbutton;
699702 extern const char *sw_rbutton;
700703
701 gboolean button_press_cb (GtkWidget *widget, GdkEventButton *event, gpointer data);
704
705 extern const char *pb_rectangle_skin_color_expose;
706
707 gboolean button_press_cb(GtkWidget *widget, GdkEventButton *event, gpointer data);
708
709 extern void set_label(MenuCheckItem& item , const char *label);
710
711 extern void set_label(RadioCheckItem& item , const char *label);
702712
703713 int gx_set_mx_oriantation();
704714 int gx_set_my_oriantation();
705715
716 int precision(double n);
717 string fformat(float value, float step);
718
719 /****************************************************************/
720
706721 #ifndef NDEBUG
707722 // debug_check
708 inline void check_zone(GtkWidget *w, void *zone)
709 {
710 if (!parameter_map.hasZone(zone)) {
711 gchar *p;
712 gtk_widget_path(w, NULL, &p, NULL);
713 cerr << "zone not found in definition of widget: "
714 << p << endl;
715 g_free(p);
716 assert(false);
717 }
718 parameter_map[zone].setUsed();
723 inline void check_zone(GtkWidget *w, void *zone) {
724 if (!parameter_map.hasZone(zone)) {
725 gchar *p;
726 gtk_widget_path(w, NULL, &p, NULL);
727 cerr << "zone not found in definition of widget: "
728 << p << endl;
729 g_free(p);
730 assert(false);
731 }
732 parameter_map[zone].setUsed();
719733 }
720734 #endif
721735
722 inline void connect_midi_controller(GtkWidget *w, void *zone)
723 {
724 debug_check(check_zone, w, zone);
725 g_signal_connect(w, "button_press_event", G_CALLBACK (button_press_cb), (gpointer)&parameter_map[zone]);
736 /****************************************************************/
737
738 inline void connect_midi_controller(GtkWidget *w, void *zone) {
739 debug_check(check_zone, w, zone);
740 g_signal_connect(w, "button_press_event", G_CALLBACK(button_press_cb),
741 (gpointer)&parameter_map[zone]);
726742 }
727743
744 /****************************************************************/
745
728746 void conv_restart();
747
729748
730749 /* -------------------------------------------------------------------------- */
731750 } /* end of gx_gui namespace */
732751
752 #endif
753
754 #endif // SRC_HEADERS_GX_MAIN_INTERFACE_H_
0 /*
1 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17 * ---------------------------------------------------------------------------
18 *
19 * This file is part of the guitarix GUI main class
20 * Note: this header file depends on gx_parameter.h
21 * and make use of the gx_gui namespace
22 *
23 * ----------------------------------------------------------------------------
24 */
25
26 #pragma once
27
28 #ifndef SRC_HEADERS_GX_MAIN_MIDI_H_
29 #define SRC_HEADERS_GX_MAIN_MIDI_H_
30
31 #ifndef SRC_HEADERS_GX_PARAMETER_H_
32 #include "./gx_parameter.h"
33 #endif
34
35 #include <glibmm.h>
36 #include <gtk/gtk.h>
37
38 #include <iomanip>
39 #include <cstring>
40 #include <string>
41
42 namespace gx_main_midi {
43 /****************************************************************
44 ** MidiControllerTable
45 */
46
47 class MidiControllerTable: public sigc::trackable {
48 private:
49 enum {RESPONSE_DELETE_SELECTED};
50 static GtkWidget *window; // there can only be 1 window
51 GtkToggleButton *togglebutton;
52 GtkTreeSelection *selection;
53 GtkListStore *store;
54 GtkCheckMenuItem *menuitem;
55 static void response_cb(GtkWidget *widget, gint response_id, gpointer data);
56 static void edited_cb(GtkCellRendererText *renderer, gchar *path,
57 gchar *new_text, gpointer data);
58 static void destroy_cb(GtkWidget*, gpointer data);
59 static void toggleButtonSetSwitch(GtkWidget *w, gpointer data);
60 void set(bool v);
61 void load();
62 explicit MidiControllerTable(GtkCheckMenuItem *item);
63 ~MidiControllerTable();
64 public:
65 static void toggle(GtkWidget* widget, gpointer data);
66 };
67
68 /*****************************************************************
69 ** Midi Control
70 */
71
72 class MidiConnect {
73 private:
74 enum { RESPONSE_DELETE = 1 };
75 gx_gui::Parameter &param;
76 GtkAdjustment* adj_lower;
77 GtkAdjustment* adj_upper;
78 GtkWidget* dialog;
79 GtkWidget* entry_new;
80 GtkWidget* label_desc;
81 int current_control;
82 static string ctr_desc(int ctr);
83 static const char *ctl_to_str(int n);
84 public:
85 MidiConnect(GdkEventButton *event, gx_gui::Parameter& param);
86 static void midi_response_cb(GtkWidget *widget, gint response_id, gpointer data);
87 static void midi_destroy_cb(GtkWidget *widget, gpointer data);
88 static gboolean check_midi_cb(gpointer);
89 static void changed_text_handler(GtkEditable *entry, gpointer data);
90 };
91
92 } // end namespace
93 #endif // SRC_HEADERS_GX_MAIN_MIDI_H_
94
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * --------------------------------------------------------------------------
18 *
19 * This file is part of the guitarix GUI main class
20 * Note: this header file depends on gx_system.h
21 *
22 * ----------------------------------------------------------------------------
1723 */
1824
1925 #pragma once
2026
27 #ifndef SRC_HEADERS_GX_PARAMETER_H_
28 #define SRC_HEADERS_GX_PARAMETER_H_
29
30 #ifndef SRC_HEADERS_GX_SYSTEM_H_
31 #include "./gx_system.h"
32 #endif
33
2134 #include <giomm/file.h>
2235
23 namespace gx_gui
24 {
36 #include <algorithm>
37 #include <string>
38 #include <list>
39 #include <vector>
40 #include <map>
41
42 namespace gx_gui {
2543
2644 #ifndef NDEBUG
2745 #define debug_check(func, ...) func(__VA_ARGS__)
3553 **
3654 */
3755
38 string param_group(string id, bool nowarn=false);
56 string param_group(string id, bool nowarn = false);
3957
4058 /****************************************************************
4159 ** Parameter
4462 class FloatParameter;
4563 class FloatEnumParameter;
4664 class IntParameter;
65 class UIntParameter;
4766 class EnumParameter;
4867 class BoolParameter;
4968 class SwitchParameter;
5069 class FileParameter;
5170
52 class Parameter
53 {
54 public:
55 enum ctrl_type { None, Continuous, Switch, Enum };
56
57 protected:
58 enum value_type { tp_float, tp_int, tp_bool, tp_switch, tp_file };
59 string _id;
60 string _name, _group, _desc;
61 enum value_type v_type : 3;
62 enum ctrl_type c_type : 3;
63 bool save_in_preset : 1;
64 bool controllable : 1;
65 bool used : 1; // debug
66 bool experimental : 1; // experimental faust code, suppress warnings
67
68 public:
69 Parameter(string id, string name, value_type vtp, ctrl_type ctp, bool preset, bool ctrl, bool exp=false):
70 _id(id),
71 _name(name),
72 _group(param_group(id, exp)),
73 v_type(vtp),
74 c_type(ctp),
75 save_in_preset(preset),
76 controllable(ctrl),
77 used(false),
78 experimental(exp)
79 {}
80 virtual ~Parameter();
71 /****************************************************************/
72
73 class Parameter {
74 public:
75 enum ctrl_type { None, Continuous, Switch, Enum };
76
77 protected:
78 enum value_type { tp_float, tp_int, tp_uint, tp_bool, tp_switch, tp_file };
79 string _id;
80 string _name, _group, _desc;
81 enum value_type v_type : 3;
82 enum ctrl_type c_type : 3;
83 bool save_in_preset : 1;
84 bool controllable : 1;
85 bool used : 1; // debug
86 bool experimental : 1; // experimental faust code, suppress warnings
87
88 public:
89 Parameter(string id, string name, value_type vtp, ctrl_type ctp, bool preset,
90 bool ctrl, bool exp = false):
91 _id(id),
92 _name(name),
93 _group(param_group(id, exp)),
94 v_type(vtp),
95 c_type(ctp),
96 save_in_preset(preset),
97 controllable(ctrl),
98 used(false),
99 experimental(exp)
100 {}
101 virtual ~Parameter();
81102
82103 #ifndef NDEBUG
83 bool isUsed() const { return used; }
84 void setUsed() { used = true; }
104 bool isUsed() const { return used; }
105 void setUsed() { used = true; }
85106 #endif
86107
87 bool isFloat() const { return v_type == tp_float; }
88 bool isInt() const { return v_type == tp_int; }
89 bool isBool() const { return v_type == tp_bool; }
90 bool isSwitch() const { return v_type == tp_switch; }
91 bool isFile() const { return v_type == tp_file; }
92 ctrl_type getControlType() const { return c_type; }
93 bool isControllable() const { return controllable; }
94 bool isInPreset() const { return save_in_preset; }
95 bool isExperimental() const { return experimental; }
96 string id() const { return _id; }
97 string group() const { return _group; }
98 string name() const { return _name; }
99 string desc() const { return _desc; }
100 void set_desc(string desc) { _desc = desc; }
101 bool operator==(const Parameter& p) const { return &p == this; }
102 virtual void *zone() = 0;
103 virtual void set_std_value() = 0;
104 virtual void set(int n, int high, float llimit, float ulimit) = 0;
105 virtual void writeJSON(gx_system::JsonWriter& jw) = 0;
106 virtual void readJSON_value(gx_system::JsonParser& jp) = 0;
107 virtual void setJSON_value() = 0;
108 virtual bool hasRange() const;
109 virtual float getLowerAsFloat() const;
110 virtual float getUpperAsFloat() const;
111 virtual float getStepAsFloat() const;
112 virtual const char **getValueNames() const;
113 FloatParameter& getFloat();
114 IntParameter& getInt();
115 BoolParameter& getBool();
116 SwitchParameter& getSwitch();
117 FileParameter &getFile();
118 };
108 bool isFloat() const { return v_type == tp_float; }
109 bool isInt() const { return v_type == tp_int; }
110 bool isUInt() const { return v_type == tp_uint; }
111 bool isBool() const { return v_type == tp_bool; }
112 bool isSwitch() const { return v_type == tp_switch; }
113 bool isFile() const { return v_type == tp_file; }
114 ctrl_type getControlType() const { return c_type; }
115 bool isControllable() const { return controllable; }
116 bool isInPreset() const { return save_in_preset; }
117 bool isExperimental() const { return experimental; }
118 string id() const { return _id; }
119 string group() const { return _group; }
120 string name() const { return _name; }
121 string desc() const { return _desc; }
122 void set_desc(string desc) { _desc = desc; }
123 bool operator==(const Parameter& p) const { return &p == this; }
124 virtual void *zone() = 0;
125 virtual void set_std_value() = 0;
126 virtual void set(int n, int high, float llimit, float ulimit) = 0;
127 virtual void writeJSON(gx_system::JsonWriter& jw) = 0;
128 virtual void readJSON_value(gx_system::JsonParser& jp) = 0;
129 virtual void setJSON_value() = 0;
130 virtual bool hasRange() const;
131 virtual float getLowerAsFloat() const;
132 virtual float getUpperAsFloat() const;
133 virtual float getStepAsFloat() const;
134 virtual const char **getValueNames() const;
135 FloatParameter& getFloat();
136 IntParameter& getInt();
137 UIntParameter& getUInt();
138 BoolParameter& getBool();
139 SwitchParameter& getSwitch();
140 FileParameter &getFile();
141 };
142
143 /****************************************************************/
119144
120145 typedef list<gx_gui::Parameter*> paramlist;
121146
122
123 class FloatParameter: public Parameter
124 {
125 protected:
126 float json_value;
127 public:
128 float &value;
129 float std_value;
130 float lower, upper, step;
131 void set(float val) const { value = min(max(val, lower), upper); }
132 void convert_from_range(float low, float up);
133 virtual void *zone();
134 virtual void set_std_value();
135 virtual void set(int n, int high, float llimit, float ulimit);
136 virtual void writeJSON(gx_system::JsonWriter& jw);
137 virtual void readJSON_value(gx_system::JsonParser& jp);
138 virtual void setJSON_value();
139 virtual bool hasRange() const;
140 virtual float getLowerAsFloat() const;
141 virtual float getUpperAsFloat() const;
142 virtual float getStepAsFloat() const;
143 FloatParameter(string id, string name, ctrl_type ctp, bool preset,
144 float &v, float sv, float lv, float uv, float tv, bool ctrl, bool exp=false):
145 Parameter(id, name, tp_float, ctp, preset, ctrl, exp),
146 value(v), std_value(sv), lower(lv), upper(uv), step(tv)
147 {}
148 };
149
150 class FloatEnumParameter: public FloatParameter
151 {
152 private:
153 const char** value_names;
154 public:
155 virtual void writeJSON(gx_system::JsonWriter& jw);
156 virtual void readJSON_value(gx_system::JsonParser& jp);
157 virtual const char **getValueNames() const;
158 FloatEnumParameter(string id, string name, const char** vn, bool preset, float &v,
159 int sv, bool ctrl, bool exp=false);
160 };
161
162 class IntParameter: public Parameter
163 {
164 protected:
165 int json_value;
166 public:
167 int &value;
168 int std_value;
169 int lower, upper;
170 void set(int val) const { value = min(max(val, lower), upper); }
171 virtual void *zone();
172 virtual void set_std_value();
173 virtual void set(int n, int high, float llimit, float ulimit);
174 virtual void writeJSON(gx_system::JsonWriter& jw);
175 virtual void readJSON_value(gx_system::JsonParser& jp);
176 virtual void setJSON_value();
177 virtual bool hasRange() const;
178 virtual float getLowerAsFloat() const;
179 virtual float getUpperAsFloat() const;
180 IntParameter(string id, string name, ctrl_type ctp, bool preset,
181 int &v, int sv, int lv, int uv, bool ctrl, bool exp=false):
182 Parameter(id, name, tp_int, ctp, preset, ctrl, exp),
183 value(v), std_value(sv), lower(lv), upper(uv)
184 {}
185 };
186
187 class EnumParameter: public IntParameter
188 {
189 private:
190 const char** value_names;
191 public:
192 virtual void writeJSON(gx_system::JsonWriter& jw);
193 virtual void readJSON_value(gx_system::JsonParser& jp);
194 virtual const char **getValueNames() const;
195 EnumParameter(string id, string name, const char** vn, bool preset, int &v,
196 int sv, bool ctrl, bool exp=false);
197 };
198
199 class BoolParameter: public Parameter
200 {
201 private:
202 bool json_value;
203 public:
204 bool &value;
205 bool std_value;
206 void set(bool val) const { value = val; }
207 virtual void *zone();
208 virtual void set_std_value();
209 virtual void set(int n, int high, float llimit, float ulimit);
210 virtual void writeJSON(gx_system::JsonWriter& jw);
211 virtual void setJSON_value();
212 virtual void readJSON_value(gx_system::JsonParser& jp);
213 BoolParameter(string id, string name, ctrl_type ctp, bool preset,
214 bool &v, bool sv, bool ctrl, bool exp=false):
215 Parameter(id, name, tp_bool, ctp, preset, ctrl, exp),
216 value(v), std_value(sv)
217 {}
218 };
219
220 class SwitchParameter: public Parameter
221 {
222 private:
223 bool value;
224 bool std_value;
225 bool json_value;
226 public:
227 sigc::signal<void, bool> changed;
228 void set(bool val);
229 bool get() const { return value; }
230 virtual void *zone();
231 virtual void set_std_value();
232 virtual void set(int n, int high, float llimit, float ulimit);
233 virtual void writeJSON(gx_system::JsonWriter& jw);
234 virtual void readJSON_value(gx_system::JsonParser& jp);
235 virtual void setJSON_value();
236 SwitchParameter(string id, bool preset=false, bool sv=false):
237 Parameter(id, "", tp_switch, Switch, preset, false),
238 value(sv), std_value(sv)
239 {}
240 };
241
242 class FileParameter: public Parameter
243 {
244 private:
245 Glib::RefPtr<Gio::File> value;
246 Glib::RefPtr<Gio::File> std_value;
247 Glib::RefPtr<Gio::File> json_value;
248 public:
249 void set(const Glib::RefPtr<Gio::File>& val);
250 void set_path(const string& path);
251 const Glib::RefPtr<Gio::File>& get() const { return value; }
252 virtual void *zone();
253 virtual void set_std_value();
254 virtual void set(int n, int high, float llimit, float ulimit);
255 virtual void writeJSON(gx_system::JsonWriter& jw);
256 virtual void readJSON_value(gx_system::JsonParser& jp);
257 virtual void setJSON_value();
258 FileParameter(string id, string filename, bool preset=false):
259 Parameter(id, "", tp_file, None, preset, false),
260 value(Gio::File::create_for_path(filename)),
261 std_value(value->dup())
262 {}
263 FileParameter(string id, bool preset=false):
264 Parameter(id, "", tp_file, None, preset, false),
265 value(0),
266 std_value(0)
267 {}
268 void set_standard(const string& filename);
269 bool is_standard() const;
270 string get_path();
271 string get_directory_path();
272 string get_parse_name();
273 string get_display_name();
274 void copy(const string& destination);
275 };
276
277 inline FloatParameter &Parameter::getFloat()
278 {
279 assert(isFloat());
280 return static_cast<FloatParameter&>(*this);
281 }
282
283 inline IntParameter &Parameter::getInt()
284 {
285 assert(isInt());
286 return static_cast<IntParameter&>(*this);
287 }
288
289 inline BoolParameter &Parameter::getBool()
290 {
291 assert(isBool());
292 return static_cast<BoolParameter&>(*this);
293 }
294
295 inline SwitchParameter &Parameter::getSwitch()
296 {
297 assert(isSwitch());
298 return static_cast<SwitchParameter&>(*this);
299 }
300
301 inline FileParameter &Parameter::getFile()
302 {
303 assert(isFile());
304 return static_cast<FileParameter&>(*this);
147 /****************************************************************/
148
149 class FloatParameter: public Parameter {
150 protected:
151 float json_value;
152 public:
153 float &value;
154 float std_value;
155 float lower, upper, step;
156 void set(float val) const { value = min(max(val, lower), upper); }
157 void convert_from_range(float low, float up);
158 virtual void *zone();
159 virtual void set_std_value();
160 virtual void set(int n, int high, float llimit, float ulimit);
161 virtual void writeJSON(gx_system::JsonWriter& jw);
162 virtual void readJSON_value(gx_system::JsonParser& jp);
163 virtual void setJSON_value();
164 virtual bool hasRange() const;
165 virtual float getLowerAsFloat() const;
166 virtual float getUpperAsFloat() const;
167 virtual float getStepAsFloat() const;
168 FloatParameter(string id, string name, ctrl_type ctp, bool preset,
169 float &v, float sv, float lv, float uv, float tv, bool ctrl, bool exp = false):
170 Parameter(id, name, tp_float, ctp, preset, ctrl, exp),
171 value(v), std_value(sv), lower(lv), upper(uv), step(tv) {}
172 };
173
174 /****************************************************************/
175
176 class FloatEnumParameter: public FloatParameter {
177 private:
178 const char** value_names;
179 public:
180 virtual void writeJSON(gx_system::JsonWriter& jw);
181 virtual void readJSON_value(gx_system::JsonParser& jp);
182 virtual const char **getValueNames() const;
183 FloatEnumParameter(string id, string name, const char** vn, bool preset, float &v,
184 int sv, bool ctrl, bool exp = false);
185 };
186
187 /****************************************************************/
188
189 class IntParameter: public Parameter {
190 protected:
191 int json_value;
192 public:
193 int &value;
194 int std_value;
195 int lower, upper;
196 void set(int val) const { value = min(max(val, lower), upper); }
197 virtual void *zone();
198 virtual void set_std_value();
199 virtual void set(int n, int high, float llimit, float ulimit);
200 virtual void writeJSON(gx_system::JsonWriter& jw);
201 virtual void readJSON_value(gx_system::JsonParser& jp);
202 virtual void setJSON_value();
203 virtual bool hasRange() const;
204 virtual float getLowerAsFloat() const;
205 virtual float getUpperAsFloat() const;
206 IntParameter(string id, string name, ctrl_type ctp, bool preset,
207 int &v, int sv, int lv, int uv, bool ctrl, bool exp = false):
208 Parameter(id, name, tp_int, ctp, preset, ctrl, exp),
209 value(v), std_value(sv), lower(lv), upper(uv)
210 {}
211 };
212
213 /****************************************************************/
214
215 class EnumParameter: public IntParameter {
216 private:
217 const char** value_names;
218 public:
219 virtual void writeJSON(gx_system::JsonWriter& jw);
220 virtual void readJSON_value(gx_system::JsonParser& jp);
221 virtual const char **getValueNames() const;
222 EnumParameter(string id, string name, const char** vn, bool preset, int &v,
223 int sv, bool ctrl, bool exp = false);
224 };
225
226 /****************************************************************/
227
228 class UIntParameter: public Parameter {
229 protected:
230 unsigned int json_value;
231 public:
232 unsigned int &value;
233 unsigned int std_value;
234 unsigned int lower, upper;
235 void set(unsigned int val) const { value = min(max(val, lower), upper); }
236 virtual void *zone();
237 virtual void set_std_value();
238 virtual void set(int n, int high, float llimit, float ulimit);
239 virtual void writeJSON(gx_system::JsonWriter& jw);
240 virtual void readJSON_value(gx_system::JsonParser& jp);
241 virtual void setJSON_value();
242 virtual bool hasRange() const;
243 virtual float getLowerAsFloat() const;
244 virtual float getUpperAsFloat() const;
245 UIntParameter(string id, string name, ctrl_type ctp, bool preset,
246 unsigned int &v, unsigned int sv, unsigned int lv,
247 unsigned int uv, bool ctrl, bool exp = false):
248 Parameter(id, name, tp_int, ctp, preset, ctrl, exp),
249 value(v), std_value(sv), lower(lv), upper(uv)
250 {}
251 };
252
253 /****************************************************************/
254
255 class UEnumParameter: public UIntParameter {
256 private:
257 const char** value_names;
258 public:
259 virtual void writeJSON(gx_system::JsonWriter& jw);
260 virtual void readJSON_value(gx_system::JsonParser& jp);
261 virtual const char **getValueNames() const;
262 UEnumParameter(string id, string name, const char** vn, bool preset, unsigned int &v,
263 unsigned int sv, bool ctrl, bool exp = false);
264 };
265
266 /****************************************************************/
267
268 class BoolParameter: public Parameter {
269 private:
270 bool json_value;
271 public:
272 bool &value;
273 bool std_value;
274 void set(bool val) const { value = val; }
275 virtual void *zone();
276 virtual void set_std_value();
277 virtual void set(int n, int high, float llimit, float ulimit);
278 virtual void writeJSON(gx_system::JsonWriter& jw);
279 virtual void setJSON_value();
280 virtual void readJSON_value(gx_system::JsonParser& jp);
281 BoolParameter(string id, string name, ctrl_type ctp, bool preset,
282 bool &v, bool sv, bool ctrl, bool exp = false):
283 Parameter(id, name, tp_bool, ctp, preset, ctrl, exp),
284 value(v), std_value(sv)
285 {}
286 };
287
288 /****************************************************************/
289
290 class SwitchParameter: public Parameter {
291 private:
292 bool value;
293 bool std_value;
294 bool json_value;
295 public:
296 sigc::signal<void, bool> changed;
297 void set(bool val);
298 bool get() const { return value; }
299 virtual void *zone();
300 virtual void set_std_value();
301 virtual void set(int n, int high, float llimit, float ulimit);
302 virtual void writeJSON(gx_system::JsonWriter& jw);
303 virtual void readJSON_value(gx_system::JsonParser& jp);
304 virtual void setJSON_value();
305 SwitchParameter(string id, bool preset = false, bool sv = false):
306 Parameter(id, "", tp_switch, Switch, preset, false),
307 value(sv), std_value(sv) {}
308 };
309
310 /****************************************************************/
311
312 class FileParameter: public Parameter {
313 private:
314 Glib::RefPtr<Gio::File> value;
315 Glib::RefPtr<Gio::File> std_value;
316 Glib::RefPtr<Gio::File> json_value;
317 public:
318 void set(const Glib::RefPtr<Gio::File>& val);
319 void set_path(const string& path);
320 const Glib::RefPtr<Gio::File>& get() const { return value; }
321 virtual void *zone();
322 virtual void set_std_value();
323 virtual void set(int n, int high, float llimit, float ulimit);
324 virtual void writeJSON(gx_system::JsonWriter& jw);
325 virtual void readJSON_value(gx_system::JsonParser& jp);
326 virtual void setJSON_value();
327 FileParameter(string id, string filename, bool preset = false):
328 Parameter(id, "", tp_file, None, preset, false),
329 value(Gio::File::create_for_path(filename)),
330 std_value(value->dup()) {}
331 FileParameter(string id, bool preset = false):
332 Parameter(id, "", tp_file, None, preset, false),
333 value(0),
334 std_value(0) {}
335 void set_standard(const string& filename);
336 bool is_standard() const;
337 string get_path();
338 string get_directory_path();
339 string get_parse_name();
340 string get_display_name();
341 void copy(const string& destination);
342 };
343
344 /****************************************************************/
345
346 inline FloatParameter &Parameter::getFloat() {
347 assert(isFloat());
348 return static_cast<FloatParameter&>(*this);
349 }
350
351 inline IntParameter &Parameter::getInt() {
352 assert(isInt());
353 return static_cast<IntParameter&>(*this);
354 }
355
356 inline BoolParameter &Parameter::getBool() {
357 assert(isBool());
358 return static_cast<BoolParameter&>(*this);
359 }
360
361 inline SwitchParameter &Parameter::getSwitch() {
362 assert(isSwitch());
363 return static_cast<SwitchParameter&>(*this);
364 }
365
366 inline FileParameter &Parameter::getFile() {
367 assert(isFile());
368 return static_cast<FileParameter&>(*this);
305369 }
306370
307371 /****************************************************************
308372 ** ParamMap
309373 */
310374
311 class ParamMap
312 {
313 private:
314 map<string, Parameter*> id_map;
315 map<const void*, Parameter*> addr_map;
375 class ParamMap {
376 private:
377 map<string, Parameter*> id_map;
378 map<const void*, Parameter*> addr_map;
316379
317380 #ifndef NDEBUG
318 void unique_zone(Parameter* param);
319 void unique_id(Parameter* param);
320 void check_id(string id);
321 void check_p(const char *p);
322 void check_addr(const void *p);
381 void unique_zone(Parameter* param);
382 void unique_id(Parameter* param);
383 void check_id(string id);
384 void check_p(const char *p);
385 void check_addr(const void *p);
323386 #endif
324387
325 public:
326 typedef map<string, Parameter*>::iterator iterator;
327 iterator begin() { return id_map.begin(); }
328 iterator end() { return id_map.end(); }
329 bool hasZone(const void *p) const { return addr_map.find(p) != addr_map.end(); }
330 bool hasId(string id) const { return id_map.find(id) != id_map.end(); }
331 bool hasId(const char *p) const { return id_map.find(p) != id_map.end(); }
332 Parameter& operator[](const void *p) { debug_check(check_addr, p); return *addr_map[p]; }
333 Parameter& operator[](string id) { debug_check(check_id, id); return *id_map[id]; }
334 Parameter& operator[](const char *p) { debug_check(check_p, p); return *id_map[p]; }
335 void insert(Parameter* param);
336 void set_init_values();
388 public:
389 typedef map<string, Parameter*>::iterator iterator;
390 iterator begin() { return id_map.begin(); }
391 iterator end() { return id_map.end(); }
392 bool hasZone(const void *p) const { return addr_map.find(p) != addr_map.end(); }
393 bool hasId(string id) const { return id_map.find(id) != id_map.end(); }
394 bool hasId(const char *p) const { return id_map.find(p) != id_map.end(); }
395 Parameter& operator[](const void *p) {
396 debug_check(check_addr, p);
397 return *addr_map[p];
398 }
399 Parameter& operator[](string id) {
400 debug_check(check_id, id);
401 return *id_map[id];
402 }
403 Parameter& operator[](const char *p) {
404 debug_check(check_p, p);
405 return *id_map[p];
406 }
407 void insert(Parameter* param);
408 void set_init_values();
337409 };
338410
339411 extern ParamMap parameter_map; // map id -> parameter, zone -> parameter
340412
341 inline void registerParam(const char*a,const char*b,float*c,float std,float lower,float upper,float step)
342 {
343 parameter_map.insert(new FloatParameter(a,b,Parameter::Continuous,true,*c,std,lower,upper,step,true));
344 }
345
346 inline void registerParam(const char*a,const char*b,float*c,float std=0)
347 {
348 parameter_map.insert(new FloatParameter(a,b,Parameter::Switch,true,*c,std,0,1,1,true));
413 /****************************************************************/
414
415 inline void registerParam(const char*a, const char*b, float*c, float std,
416 float lower, float upper, float step) {
417 parameter_map.insert(new FloatParameter(a, b, Parameter::Continuous, true, *c, std,
418 lower, upper, step, true));
419 }
420
421 inline void registerParam(const char*a, const char*b, float*c, float std = 0) {
422 parameter_map.insert(new FloatParameter(a, b, Parameter::Switch, true, *c, std,
423 0, 1, 1, true));
349424 }
350425
351426 #if 0
352427 // should be bool
353 inline void registerParam(const char*a,const char*b,int*c,int d)
354 {
355 parameter_map.insert(new IntParameter(a,b,Parameter::Switch,true,*c,d,0,1065353216,true)); //FIXME (see above float/int)
428 inline void registerParam(const char*a, const char*b, int*c, int d) {
429 parameter_map.insert(new IntParameter(a, b, Parameter::Switch, true, *c, d,
430 0, 1065353216, true)); // FIXME (see above float/int)
356431 }
357432 #endif
358433
359 inline void registerParam(const char*a,const char*b,bool*c,bool d=false, bool exp=false)
360 {
361 parameter_map.insert(new BoolParameter(a,b,Parameter::Switch,true,*c,d,true,exp));
434 inline void registerParam(const char*a, const char*b, bool*c, bool d = false, bool exp = false) {
435 parameter_map.insert(new BoolParameter(a, b, Parameter::Switch, true, *c, d, true, exp));
362436 }
363437
364438 /****************************************************************
372446 ** MidiStandardControllers
373447 */
374448
375 class MidiStandardControllers
376 {
377 private:
378 struct modstring {
379 string name;
380 bool modified;
381 const char *std;
382 modstring(string n, bool m, const char* s): name(n), modified(m), std(s) {}
383 modstring(const char* n): name(n), modified(false), std(n) {}
384 modstring(): name(""), modified(false), std(0) {}
385 };
386 map<int,modstring> m;
387
388 public:
389 MidiStandardControllers();
390 const string operator[](int ctr) { return m[ctr].name; }
391 void replace(int ctr, string name);
392 void writeJSON(gx_system::JsonWriter& jw) const;
393 void readJSON(gx_system::JsonParser& jp);
449 /****************************************************************/
450
451 class MidiStandardControllers {
452 private:
453 struct modstring {
454 string name;
455 bool modified;
456 const char *std;
457 modstring(string n, bool m, const char* s): name(n), modified(m), std(s) {}
458 explicit modstring(const char* n): name(n), modified(false), std(n) {}
459 modstring(): name(""), modified(false), std(0) {}
460 };
461 map<int, modstring> m;
462
463 public:
464 MidiStandardControllers();
465 const string operator[](int ctr) { return m[ctr].name; }
466 void replace(int ctr, string name);
467 void writeJSON(gx_system::JsonWriter& jw) const;
468 void readJSON(gx_system::JsonParser& jp);
394469 };
395470
396471 extern MidiStandardControllers midi_std_ctr; // map ctrl num -> standard name
397472
398
399 /*
473 /****************************************************************
474 **
400475 ** MidiController
401 */
402
403 class MidiController
404 {
405 private:
406 Parameter &param;
407 float _lower, _upper;
408 public:
409 MidiController(Parameter &p, float l, float u):
410 param(p), _lower(l), _upper(u)
411 {}
412 float lower() const { return _lower; }
413 float upper() const { return _upper; }
414 void operator=(MidiController m) { param = m.param; _lower = m._lower; _upper = m._upper; }
415 bool hasParameter(const Parameter& p) const { return param == p; }
416 Parameter& getParameter() const { return param; }
417 static MidiController* readJSON(gx_system::JsonParser&);
418 void set(int n) { param.set(n, 127, _lower, _upper); }
419 void writeJSON(gx_system::JsonWriter& jw) const;
476 **/
477
478 class MidiController {
479 private:
480 Parameter &param;
481 float _lower, _upper;
482 public:
483 MidiController(Parameter &p, float l, float u):
484 param(p), _lower(l), _upper(u) {}
485 float lower() const { return _lower; }
486 float upper() const { return _upper; }
487 void operator = (MidiController m) {
488 param = m.param;
489 _lower = m._lower;
490 _upper = m._upper;
491 }
492 bool hasParameter(const Parameter& p) const { return param == p; }
493 Parameter& getParameter() const { return param; }
494 static MidiController* readJSON(gx_system::JsonParser&);
495 void set(int n) { param.set(n, 127, _lower, _upper); }
496 void writeJSON(gx_system::JsonWriter& jw) const;
420497 };
421498
422499 typedef list<MidiController> midi_controller_list;
423500
424
425 /*
501 /****************************************************************
502 **
426503 ** MidiControllerList
427 */
428
429 class MidiControllerList
430 {
431 public:
432 typedef vector<midi_controller_list> controller_array;
433 enum { controller_array_size = 128 };
434 private:
435 controller_array map;
436 bool midi_config_mode;
437 int last_midi_control;
438 int last_midi_control_value;
439 public:
440 MidiControllerList();
441 midi_controller_list& operator[](int n) { return map[n]; }
442 int size() { return map.size(); }
443 void set_config_mode(bool mode, int ctl=-1);
444 bool get_config_mode() { return midi_config_mode; }
445 int get_current_control() { return last_midi_control; }
446 void set_current_control(int ctl) { last_midi_control = ctl; }
447 void set(int ctr, int val);
448 void deleteParameter(Parameter& param, bool quiet=false);
449 void modifyCurrent(Parameter& param, float lower, float upper);
450 int param2controller(Parameter& param, const MidiController** p);
451 void writeJSON(gx_system::JsonWriter& jw);
452 void readJSON(gx_system::JsonParser& jp, controller_array& m);
453 void set_controller_array(const controller_array& m);
454 void remove_controlled_parameters(paramlist& plist, const controller_array *m);
455 sigc::signal<void> changed;
504 **/
505
506 class MidiControllerList {
507 public:
508 typedef vector<midi_controller_list> controller_array;
509 enum { controller_array_size = 128 };
510 private:
511 controller_array map;
512 bool midi_config_mode;
513 int last_midi_control;
514 int last_midi_control_value;
515 public:
516 MidiControllerList();
517 midi_controller_list& operator[](int n) { return map[n]; }
518 int size() { return map.size(); }
519 void set_config_mode(bool mode, int ctl=-1);
520 bool get_config_mode() { return midi_config_mode; }
521 int get_current_control() { return last_midi_control; }
522 void set_current_control(int ctl) { last_midi_control = ctl; }
523 void set(int ctr, int val);
524 void deleteParameter(Parameter& param, bool quiet = false);
525 void modifyCurrent(Parameter& param, float lower, float upper);
526 int param2controller(Parameter& param, const MidiController** p);
527 void writeJSON(gx_system::JsonWriter& jw);
528 void readJSON(gx_system::JsonParser& jp, controller_array& m);
529 void set_controller_array(const controller_array& m);
530 void remove_controlled_parameters(paramlist& plist, const controller_array *m);
531 sigc::signal<void> changed;
456532 };
457533
458534 void recall_midi_controller_map();
460536
461537 extern MidiControllerList controller_map; // map ctrl num -> controlled parameters
462538
463
464539 } // namespace gx_gui
540
541 #endif // SRC_HEADERS_GX_PARAMETER_H_
542
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * --------------------------------------------------------------------------
1718 */
1819
2021
2122 #pragma once
2223
24 #ifndef SRC_HEADERS_GX_PITCH_TRACKER_H_
25 #define SRC_HEADERS_GX_PITCH_TRACKER_H_
26
2327 #include <zita-resampler.h>
2428
25 namespace gx_engine
26 {
29 namespace gx_engine {
2730 /* ------------- Pitch Tracker ------------- */
2831
2932 const int MAX_FFT_SIZE = 512; // The size of the read buffer (max FFT window size).
3033
31 class PitchTracker
32 {
33 public:
34 PitchTracker();
35 ~PitchTracker();
36 bool setParameters( int sampleRate, int fftSize );
37 void init() { setParameters((int)gx_jack::jack_sr, MAX_FFT_SIZE); }
38 void add(int count, float *input);
39 float tuner_estimate();
34 class PitchTracker {
35 public:
36 PitchTracker();
37 ~PitchTracker();
38 bool setParameters(int sampleRate, int fftSize );
39 void init() { setParameters(static_cast<int>(gx_jack::gxjack.jack_sr), MAX_FFT_SIZE); }
40 void add(int count, float *input);
41 float tuner_estimate();
4042
41 private:
42 void run();
43 static void *static_run(void*);
44 void setEstimatedFrequency(float freq);
45 int find_minimum();
46 int find_maximum(int l);
47 void start_thread();
48 void copy();
49 bool error;
50 volatile bool busy;
51 int tick;
43 private:
44 void run();
45 static void *static_run(void* p);
46 void setEstimatedFrequency(float freq);
47 int find_minimum();
48 int find_maximum(int l);
49 void start_thread();
50 void copy();
51 bool error;
52 volatile bool busy;
53 int tick;
5254 sem_t m_trig;
5355 pthread_t m_pthr;
54 Resampler resamp;
55 int m_sampleRate;
56 int m_fftSize; // Size of the FFT window.
57 float *m_buffer; // The audio buffer that stores the input signal.
58 int m_bufferIndex; // Index of the first empty position in the buffer.
59 bool m_audioLevel; // Whether or not the input level is high enough.
60 float *m_fftwBufferTime; // Support buffer used to store signals in the time domain.
61 fftwf_complex *m_fftwBufferFreq; // Support buffer used to store signals in the frequency domain.
62 fftwf_plan m_fftwPlanFFT; // Plan to compute the FFT of a given signal.
63 fftwf_plan m_fftwPlanIFFT; // Plan to compute the IFFT of a given signal (with additional zero-padding).
56 Resampler resamp;
57 int m_sampleRate;
58 // Size of the FFT window.
59 int m_fftSize;
60 // The audio buffer that stores the input signal.
61 float *m_buffer;
62 // Index of the first empty position in the buffer.
63 int m_bufferIndex;
64 // Whether or not the input level is high enough.
65 bool m_audioLevel;
66 // Support buffer used to store signals in the time domain.
67 float *m_fftwBufferTime;
68 // Support buffer used to store signals in the frequency domain.
69 fftwf_complex *m_fftwBufferFreq;
70 // Plan to compute the FFT of a given signal.
71 fftwf_plan m_fftwPlanFFT;
72 // Plan to compute the IFFT of a given signal (with additional zero-padding).
73 fftwf_plan m_fftwPlanIFFT;
6474 };
6575
6676 extern PitchTracker pitch_tracker;
77 }
78 #endif // SRC_HEADERS_GX_PITCH_TRACKER_H_
6779
68 }
69
0 /*
1 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17 * --------------------------------------------------------------------------
18 */
19
20 /* ------- This is the GUI namespace ------- */
21
22
23 #pragma once
24
25 #ifndef SRC_HEADERS_GX_PORTMAP_H_
26 #define SRC_HEADERS_GX_PORTMAP_H_
27
28 #include <gtk/gtk.h>
29 #include <jack/jack.h>
30
31 #include <list>
32 #include <string>
33
34 #ifndef NJACKLAT
35 #define NJACKLAT (9)
36 #endif
37
38 namespace gx_portmap {
39
40 /****************************************************************
41 ** PortMapWindow
42 */
43
44 enum {
45 number_of_ports = 7
46 };
47
48 struct PortAttr {
49 const int client_num;
50 const bool is_insert;
51 const char *port_name;
52 bool is_input;
53 const char *port_type;
54 };
55
56 extern PortAttr guitarix_ports[number_of_ports];
57
58 struct PortSection {
59 GtkTreeStore *treestore;
60 GtkScrolledWindow *scrolled_window;
61 GtkExpander *expander;
62 GtkLabel *label;
63 PortAttr *port_attr;
64 };
65
66 class PortMapWindow {
67 private:
68 PortSection portsection[number_of_ports];
69 GtkCheckMenuItem *menuitem;
70 list<string> excluded_clients;
71 GtkWidget *monitored_expander_child;
72 static void on_expander(GtkWidget *widget, gpointer data);
73 static void on_check_resize(GtkWidget *widget, gpointer data);
74 static void response_cb(GtkWidget *widget, gint response_id, gpointer data);
75 static void destroy_cb(GtkWidget*, gpointer data);
76 static void on_cell_toggle(GtkCellRendererToggle *widget, gchar *path, gpointer data);
77 static void update_summary(PortSection* p, string *port = 0, bool connect = false);
78 static gboolean redraw_expander(gpointer data);
79 static list<string> walk(GtkTreeStore *ts, string *port, int connect);
80 bool walk_remove(GtkTreeStore *ts, bool (*compare)(const string&, const char*), string data);
81 void walk_insert(GtkTreeStore *ts, string data);
82 void load(int sect, jack_port_t*);
83 void load_all();
84 explicit PortMapWindow(GtkCheckMenuItem *item);
85 ~PortMapWindow();
86 public:
87 static GtkWidget *window; // there can only be 1 window
88 static PortMapWindow* instance;
89 void client_removed(string name);
90 void refresh();
91 void port_changed(string name, const char *tp, int flags, bool reg);
92 void connection_changed(string port1, string port2, bool conn);
93 static void toggle(GtkWidget* widget, gpointer data);
94 };
95 } // end namespace gx_portmap
96 #endif // SRC_HEADERS_GX_PORTMAP_H_
0 /* -*- mode: C++ -*-
0 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * --------------------------------------------------------------------------
1718 */
1819
1920 /* ------- This is the preset namespace ------- */
2021
2122 #pragma once
23
24 #ifndef SRC_HEADERS_GX_PRESET_H_
25 #define SRC_HEADERS_GX_PRESET_H_
26
27 #include <string>
2228
2329 // number of preset action lists
2430 #define GX_NUM_OF_PRESET_LISTS (3)
2733 #define LOAD_PRESET_LIST (0)
2834 #define SAVE_PRESET_LIST (1)
2935 #define RENAME_PRESET_LIST (2)
30 //#define DELETE_PRESET_LIST (3)
36 // #define DELETE_PRESET_LIST (3)
3137
3238 // number of factory preset lists
3339 #define GX_NUM_OF_FACTORY_PRESET (3)
3440
35 namespace gx_preset
36 {
41 namespace gx_preset {
3742 extern gx_gui::FileParameter gx_preset_file;
3843 extern gx_gui::FileParameter gx_factory_preset_file;
3944
4045 /* function declarations */
4146 string gx_get_accel_path(int lindex);
4247
43 void gx_save_newpreset_dialog (GtkMenuItem*, gpointer);
44 void gx_save_newpreset (GtkEntry*);
45 void gx_save_preset (const gchar*, bool);
46 void gx_save_oldpreset (GtkMenuItem*, gpointer);
48 void gx_save_newpreset_dialog(GtkMenuItem*, gpointer);
49 void gx_save_newpreset(GtkEntry* entry);
50 void gx_save_preset(const gchar*, bool);
51 void gx_save_oldpreset(GtkMenuItem*, gpointer);
4752
48 void gx_save_preset_file (const gchar*, bool);
49 void gx_load_preset_file (const gchar*, bool);
53 void gx_save_preset_file(const gchar*, bool);
54 void gx_load_preset_file(const gchar*, bool);
5055
51 void gx_load_preset (GtkMenuItem*, gpointer);
56 void gx_load_preset(GtkMenuItem*, gpointer);
5257 void gx_recall_settings_file(const string *filename = 0);
5358 void gx_recall_main_setting(GtkMenuItem*, gpointer);
5459 void gx_save_main_setting(GtkMenuItem*, gpointer);
5560
5661 void gx_load_factory_file(int i);
5762
58 void gx_rename_preset (GtkEntry*);
59 void gx_rename_preset_dialog (GtkMenuItem*, gpointer);
63 void gx_rename_preset(GtkEntry* entry);
64 void gx_rename_preset_dialog(GtkMenuItem*, gpointer);
6065 void gx_rename_active_preset_dialog(GtkWidget*, gpointer);
6166
6267 void gx_delete_preset(GtkMenuItem*, gpointer);
63 void gx_delete_preset_dialog (GtkMenuItem*, gpointer);
68 void gx_delete_preset_dialog(GtkMenuItem*, gpointer);
6469 void gx_delete_active_preset_dialog(GtkWidget*, gpointer);
6570
6671 void gx_delete_all_presets_dialog(GtkMenuItem*, gpointer);
8489
8590 /* --------------------------------------------------------------------- */
8691 } /* end of gx_preset namespace */
92 #endif // SRC_HEADERS_GX_PRESET_H_
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * --------------------------------------------------------------------------
1718 */
1819
2021
2122 #pragma once
2223
24 #ifndef SRC_HEADERS_GX_RESAMPLER_H_
25 #define SRC_HEADERS_GX_RESAMPLER_H_
26
2327 #include <zita-resampler.h>
2428
25 namespace gx_resample
26 {
29 namespace gx_resample {
2730
2831 #define MAX_UPSAMPLE 8
2932
30 class SimpleResampler
31 {
32 private:
33 Resampler r_up, r_down;
34 int m_fact;
35 public:
36 void setup(int sampleRate, unsigned int fact);
37 void up(int count, float *input, float *output);
38 void down(int count, float *input, float *output);
33 class SimpleResampler {
34 private:
35 Resampler r_up, r_down;
36 int m_fact;
37 public:
38 void setup(int sampleRate, unsigned int fact);
39 void up(int count, float *input, float *output);
40 void down(int count, float *input, float *output);
3941 };
4042
4143 extern SimpleResampler resampTube, resampDist;
4244
43 class BufferResampler: Resampler
44 {
45 public:
46 float *process(int fs_inp, int ilen, float *input, int fs_outp, int& olen);
45 class BufferResampler: Resampler {
46 public:
47 float *process(int fs_inp, int ilen, float *input, int fs_outp, int& olen);
4748 };
4849
49 class StreamingResampler: Resampler
50 {
51 public:
52 bool setup(int srcRate, int dstRate, int nchan);
53 int get_max_out_size(int i_size) { return (i_size * ratio_b()) / ratio_a() + 1; }
54 int process(int count, float *input, float *output);
55 int flush(float *output); // check source for max. output size
50 class StreamingResampler: Resampler {
51 public:
52 bool setup(int srcRate, int dstRate, int nchan);
53 int get_max_out_size(int i_size) { return (i_size * ratio_b()) / ratio_a() + 1; }
54 int process(int count, float *input, float *output);
55 int flush(float *output); // check source for max. output size
5656 };
57
5857 }
58 #endif // SRC_HEADERS_GX_RESAMPLER_H_
+0
-44
src/headers/gx_sndfile.h less more
0 /*
1 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * --------------------------------------------------------------------------
17 */
18
19 /* ------- This is the SNDFILE namespace ------- */
20
21 #pragma once
22
23 #include <sndfile.hh>
24
25 namespace gx_sndfile
26 {
27 // --------------- a simple resampling status
28 typedef enum {
29 kNoError = 0,
30 kErrorInput = 1,
31 kErrorOutput = 2
32 } GxResampleStatus;
33
34 SNDFILE* openOutputSoundFile(const char*, int, int);
35 SNDFILE* openInputSoundFile (const char*, int*, int*, int*);
36 void closeSoundFile (SNDFILE*);
37
38 sf_count_t writeSoundOutput(SNDFILE*, float*, int);
39 sf_count_t readSoundInput (SNDFILE*, float*, int);
40
41 GxResampleStatus resampleSoundFile(const char*, const char*, int);
42
43 } /* end of gx_sndfile namespace */
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * --------------------------------------------------------------------------
1718 */
1819
1920 /* ------- This is the System namespace ------- */
2021
2122 #pragma once
23
24 #ifndef SRC_HEADERS_GX_SYSTEM_H_
25 #define SRC_HEADERS_GX_SYSTEM_H_
26
27 #include <gtk/gtk.h>
2228
2329 #include <cmath>
2430 #include <sstream>
2531 #include <list>
32 #include <string>
33 #include <algorithm>
34
2635
2736 /* constant defines */
2837 #define ASCII_START (48)
2938 #define GDK_NO_MOD_MASK (GdkModifierType)0
3039
3140 enum {
32 JACK_INP,
33 JACK_OUT1,
34 JACK_OUT2,
35 JACK_MIDI,
36 RC_STYLE,
37 JACK_UUID,
38 LOAD_FILE,
39 NUM_SHELL_VAR,
40 };
41
42 namespace gx_system
43 {
41 JACK_INP,
42 JACK_OUT1,
43 JACK_OUT2,
44 JACK_MIDI,
45 RC_STYLE,
46 JACK_UUID,
47 LOAD_FILE,
48 NUM_SHELL_VAR,
49 };
50
51 namespace gx_system {
52
53 /* message handling */
54 typedef enum {
55 kInfo,
56 kWarning,
57 kError,
58 kMessageTypeCount // just count, must be last
59 } GxMsgType;
60
4461 /* classes for reading and writing JSON files */
45 class JsonException: public exception
46 {
47 private:
48 string what_str;
49 public:
50 JsonException(const char* desc);
51 ~JsonException() throw() { }
52 virtual const char* what() const throw() { return what_str.c_str(); }
53 };
54
55 class JsonWriter
56 {
57 private:
58 ostream &os;
59 bool first;
60 bool deferred_nl;
61 string indent;
62 void snl(bool v) { deferred_nl = v; }
63 void komma();
64 void space();
65 void iplus();
66 void iminus();
67 public:
68 JsonWriter(ostream& o);
69 ~JsonWriter() { close(); }
70 bool good() { return os.good(); }
71 void flush();
72 void close() { if (deferred_nl) os << endl; }
73 void write(float v, bool nl=false);
74 void write(double v, bool nl=false);
75 void write(int i, bool nl=false);
76 void write(unsigned int i, bool nl=false);
77 void write(const char* p, bool nl=false);
78 void write(string s, bool nl=false) { write(s.c_str(), nl); }
79 void write_lit(string s, bool nl=false);
80 void begin_object(bool nl=false);
81 void end_object(bool nl=false);
82 void begin_array(bool nl=false);
83 void end_array(bool nl=false);
84 void write_key(const char* p, bool nl=false);
85 void write_key(string p, bool nl=false);
86 void newline() { snl(true); }
87 };
88
89 class JsonParser
90 {
91 public:
92 JsonParser(istream& i);
93 enum token {
94 no_token, end_token, begin_object, end_object, begin_array, end_array,
95 value_string, value_number, value_key };
96 static const char* token_names[];
97 bool good() { return is.good(); }
98 token next(token expect=no_token);
99 token peek() { return next_tok; }
100 void check_expect(token expect) { if (cur_tok != expect) throw_unexpected(expect); }
101 inline string current_value() const { return str; }
102 int current_value_int() { return atoi(str.c_str()); }
103 float current_value_float() { istringstream b(str); float f; b >> f; return f; }
104 double current_value_double() { istringstream b(str); double d; b >> d; return d; }
105 void copy_object(JsonWriter& jw);
106 void skip_object();
107 private:
108 istream& is;
109 int depth;
110 token cur_tok;
111 string str;
112 bool nl;
113 int next_depth;
114 token next_tok;
115 string next_str;
116 const char* readcode();
117 string readstring();
118 string readnumber(char c);
119 void read_next();
120 void throw_unexpected(token expect);
62 class JsonException: public exception {
63 private:
64 string what_str;
65 public:
66 explicit JsonException(const char* desc);
67 ~JsonException() throw() { }
68 virtual const char* what() const throw() { return what_str.c_str(); }
69 };
70
71 class JsonWriter {
72 private:
73 ostream &os;
74 bool first;
75 bool deferred_nl;
76 string indent;
77 void snl(bool v) { deferred_nl = v; }
78 void komma();
79 void space();
80 void iplus();
81 void iminus();
82 public:
83 explicit JsonWriter(ostream& o);
84 ~JsonWriter() { close(); }
85 bool good() { return os.good(); }
86 void flush();
87 void close() { if (deferred_nl) os << endl; }
88 void write(float v, bool nl = false);
89 void write(double v, bool nl = false);
90 void write(int i, bool nl = false);
91 void write(unsigned int i, bool nl = false);
92 void write(const char* p, bool nl = false);
93 void write(string s, bool nl = false) { write(s.c_str(), nl); }
94 void write_lit(string s, bool nl = false);
95 void begin_object(bool nl = false);
96 void end_object(bool nl = false);
97 void begin_array(bool nl = false);
98 void end_array(bool nl = false);
99 void write_key(const char* p, bool nl = false);
100 void write_key(string p, bool nl = false);
101 void newline() { snl(true); }
102 };
103
104 class JsonParser {
105 public:
106 explicit JsonParser(istream& i);
107 enum token {
108 no_token, end_token, begin_object, end_object, begin_array, end_array,
109 value_string, value_number, value_key };
110 static const char* token_names[];
111 bool good() { return is.good(); }
112 token next(token expect = no_token);
113 token peek() { return next_tok; }
114 void check_expect(token expect) { if (cur_tok != expect) throw_unexpected(expect); }
115 inline string current_value() const { return str; }
116 int current_value_int() { return atoi(str.c_str()); }
117 unsigned int current_value_uint() { return atoi(str.c_str()); }
118 float current_value_float() {
119 istringstream b(str);
120 float f;
121 b >> f;
122 return f;
123 }
124 double current_value_double() {
125 istringstream b(str);
126 double d;
127 b >> d;
128 return d;
129 }
130 void copy_object(JsonWriter& jw);
131 void skip_object();
132 private:
133 istream& is;
134 int depth;
135 token cur_tok;
136 string str;
137 bool nl;
138 int next_depth;
139 token next_tok;
140 string next_str;
141 const char* readcode();
142 string readstring();
143 string readnumber(char c);
144 void read_next();
145 void throw_unexpected(token expect);
121146 };
122147
123148 void writeHeader(JsonWriter& jw);
124 bool readHeader(JsonParser& jp, int *major=0, int *minor=0);
149 bool readHeader(JsonParser& jp, int *major = 0, int *minor = 0);
125150 void write_preset(JsonWriter& w, bool write_midi = true, bool force_midi = false);
126151 void read_preset(JsonParser &jp, bool *has_midi, int major, int minor);
127 bool saveStateToFile( const string & filename );
128 bool recallState( const string & filename );
152 bool saveStateToFile(const string & filename );
153 bool recallState(const string & filename );
129154
130155 // file format versions
131156 const int majorversion = 1;
137162
138163 #ifndef NDEBUG
139164
140 class Accum
141 {
142 private:
143 int n;
144 int mn;
145 int mx;
146 float sx;
147 float sx2;
148 public:
149 inline void reset() { n = 0; mn = 1e9; mx = 0; sx = 0; sx2 = 0; }
150 void add(int diff);
151 int count() const { return n; }
152 float mean() const { return sx / n; }
153 float stddev() const { return sqrt((n * sx2 - sx * sx) / (n * (n-1))); }
154 float minimum() const { return mn; }
155 float maximum() const { return mx; }
156 };
157
158 inline void Accum::add(int diff)
159 {
160 n += 1;
161 sx += diff;
162 sx2 += float(diff) * diff;
163 mn = min(mn, diff);
164 mx = max(mx, diff);
165 class Accum {
166 private:
167 int n;
168 int mn;
169 int mx;
170 float sx;
171 float sx2;
172 public:
173 inline void reset() {
174 n = 0;
175 mn = 1e9;
176 mx = 0;
177 sx = 0;
178 sx2 = 0;
179 }
180 void add(int diff);
181 int count() const { return n; }
182 float mean() const { return sx / n; }
183 float stddev() const { return sqrt((n * sx2 - sx * sx) / (n * (n-1))); }
184 float minimum() const { return mn; }
185 float maximum() const { return mx; }
186 };
187
188 inline void Accum::add(int diff) {
189 n += 1;
190 sx += diff;
191 sx2 += static_cast<float>(diff) * diff;
192 mn = min(mn, diff);
193 mx = max(mx, diff);
165194 }
166195
167196
168 class Measure
169 {
170 private:
171 Accum period;
172 Accum duration;
173 timespec t;
174 static int ts_diff(struct timespec ts1, struct timespec ts2);
175 inline float ns2ms(int n) { return n * 1e-6; }
176
177 public:
178 inline void reset() { period.reset(); duration.reset(); t.tv_sec = 0; t.tv_nsec = 0; }
179 Measure() { reset(); }
180 void start_process();
181 void stop_process();
182 void print_accum(Accum& accum, const char* prefix, bool verbose, int total=0);
183 void print(bool verbose);
184 };
185
186 inline void Measure::start_process()
187 {
188 timespec n;
189 clock_gettime(CLOCK_MONOTONIC, &n);
190 if (!(t.tv_sec == 0 and t.tv_nsec == 0)) {
191 period.add(ts_diff(n, t));
192 }
193 t = n;
197 class Measure {
198 private:
199 Accum period;
200 Accum duration;
201 timespec t;
202 static int ts_diff(struct timespec ts1, struct timespec ts2);
203 inline float ns2ms(int n) { return n * 1e-6; }
204
205 public:
206 inline void reset() {
207 period.reset();
208 duration.reset();
209 t.tv_sec = 0;
210 t.tv_nsec = 0;
211 }
212 Measure() { reset(); }
213 void start_process();
214 void stop_process();
215 void print_accum(Accum& accum, const char* prefix, bool verbose, int total = 0);
216 void print(bool verbose);
217 };
218
219 inline void Measure::start_process() {
220 timespec n;
221 clock_gettime(CLOCK_MONOTONIC, &n);
222 if (!(t.tv_sec == 0 and t.tv_nsec == 0)) {
223 period.add(ts_diff(n, t));
224 }
225 t = n;
194226 }
195
196 inline void Measure::stop_process()
197 {
198 timespec n;
199 clock_gettime(CLOCK_MONOTONIC, &n);
200 duration.add(ts_diff(n, t));
227
228 inline void Measure::stop_process() {
229 timespec n;
230 clock_gettime(CLOCK_MONOTONIC, &n);
231 duration.add(ts_diff(n, t));
201232 }
202233
203 class MeasureThreadsafe
204 {
205 private:
206 Measure *pmeasure;
207 Measure m[2];
208 inline Measure *access() { return (Measure*)g_atomic_pointer_get(&pmeasure); }
209 public:
210 MeasureThreadsafe(): pmeasure(m) {}
211 inline void start() { access()->start_process(); }
212 inline void stop() { access()->stop_process(); }
213 void print(bool verbose=false);
234 class MeasureThreadsafe {
235 private:
236 Measure *pmeasure;
237 Measure m[2];
238 inline Measure *access() { return reinterpret_cast<Measure*>(g_atomic_pointer_get(&pmeasure)); }
239 public:
240 MeasureThreadsafe(): pmeasure(m) {}
241 inline void start() { access()->start_process(); }
242 inline void stop() { access()->stop_process(); }
243 void print(bool verbose = false);
214244 };
215245
216246 extern MeasureThreadsafe measure;
232262 ** misc function declarations
233263 */
234264
235 void gx_print_logmsg (const char*, const string&, GxMsgType);
265 void gx_print_logmsg(const char*, const string&, GxMsgType);
236266 void gx_print_warning(const char*, const string&);
237 void gx_print_error (const char*, const string&);
238 void gx_print_fatal (const char*, const string&);
267 void gx_print_error(const char*, const string&);
268 void gx_print_fatal(const char*, const string&);
239269 void gx_print_info(const char*, const string&);
240270
241271 void gx_process_cmdline_options(int&, char**&, string*);
255285 const bool devnull = false,
256286 const bool escape = false);
257287 // int gx_system_call(const string&,
258 // const string&,
259 // const bool devnull = false,
260 // const bool escape = false);
288 // const string&,
289 // const bool devnull = false,
290 // const bool escape = false);
261291
262292 extern list<string> jack_connection_lists[7];
263293
264294 bool gx_version_check();
265295 int gx_pixmap_check();
266 void gx_signal_handler(int);
296 void gx_signal_handler(int sig);
267297 gboolean gx_ladi_handler(gpointer);
268298 void gx_abort(void* arg);
269 void gx_log_window(GtkWidget*, gpointer);
299 void gx_log_window(GtkWidget*, gpointer null);
270300 void gx_nospace_in_name(string& presname, const char* subs = "-");
271301 void gx_destroy_event();
272302 void gx_clean_exit(GtkWidget*, gpointer);
273303
274304 /* wrapper that takes an int and returns a string */
275305 void gx_IntToString(int i, string & s);
276 const string& gx_i2a(int);
277
306 const string& gx_i2a(int i);
278307 /* ---------------------------------------------------------------- */
279308 } /* end of gx_system namespace */
309
310 #endif // SRC_HEADERS_GX_SYSTEM_H_
311
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * --------------------------------------------------------------------------
1718 */
1819
2021
2122 #pragma once
2223
23 namespace gx_threads
24 {
24 #ifndef SRC_HEADERS_GX_THREADS_H_
25 #define SRC_HEADERS_GX_THREADS_H_
26
27 namespace gx_threads {
2528
2629 /* -------------- function declarations ---------------- */
2730 /* slow GTK threads, see GxMainInterface::run() */
28 gboolean gx_update_all_gui (gpointer args);
29 gboolean gx_refresh_meter_level (gpointer arg);
30 gboolean gx_survive_jack_shutdown (gpointer arg);
31 gboolean gx_monitor_jack_clients (gpointer args);
32 gboolean gx_do_program_change (gpointer arg);
33 gboolean gx_xrun_report (gpointer xdel);
34 gboolean gx_check_cab_state (gpointer args);
31 gboolean gx_update_all_gui(gpointer args);
32 gboolean gx_refresh_meter_level(gpointer arg);
33 gboolean gx_survive_jack_shutdown(gpointer arg);
34 gboolean gx_monitor_jack_clients(gpointer args);
35 gboolean gx_do_program_change(gpointer arg);
36 gboolean gx_xrun_report(gpointer xdel);
37 gboolean gx_check_cab_state(gpointer args);
3538 /* this are the glib threads*/
3639
37 gpointer gx_signal_helper_thread (gpointer data);
38 gpointer gx_program_change_helper_thread (gpointer args);
40 gpointer gx_signal_helper_thread(gpointer data);
41 gpointer gx_program_change_helper_thread(gpointer args);
3942
4043
4144
4245 /* -------- helper for level meter display -------- */
43 inline float
44 log_meter (float db)
45 {
46 gfloat def = 0.0f; /* Meter deflection %age */
46 inline float log_meter(float db) {
47 gfloat def = 0.0f; /* Meter deflection %age */
4748
48 if (db < -70.0f)
49 {
50 def = 0.0f;
51 }
52 else if (db < -60.0f)
53 {
54 def = (db + 70.0f) * 0.25f;
55 }
56 else if (db < -50.0f)
57 {
58 def = (db + 60.0f) * 0.5f + 2.5f;
59 }
60 else if (db < -40.0f)
61 {
62 def = (db + 50.0f) * 0.75f + 7.5f;
63 }
64 else if (db < -30.0f)
65 {
66 def = (db + 40.0f) * 1.5f + 15.0f;
67 }
68 else if (db < -20.0f)
69 {
70 def = (db + 30.0f) * 2.0f + 30.0f;
71 }
72 else if (db < 6.0f)
73 {
74 def = (db + 20.0f) * 2.5f + 50.0f;
75 }
76 else
77 {
78 def = 115.0f;
79 }
49 if (db < -70.0f) {
50 def = 0.0f;
51 } else if (db < -60.0f) {
52 def = (db + 70.0f) * 0.25f;
53 } else if (db < -50.0f) {
54 def = (db + 60.0f) * 0.5f + 2.5f;
55 } else if (db < -40.0f) {
56 def = (db + 50.0f) * 0.75f + 7.5f;
57 } else if (db < -30.0f) {
58 def = (db + 40.0f) * 1.5f + 15.0f;
59 } else if (db < -20.0f) {
60 def = (db + 30.0f) * 2.0f + 30.0f;
61 } else if (db < 6.0f) {
62 def = (db + 20.0f) * 2.5f + 50.0f;
63 } else {
64 def = 115.0f;
65 }
8066
81 /* 115 is the deflection %age that would be
82 when db=6.0. this is an arbitrary
83 endpoint for our scaling.
84 */
67 /* 115 is the deflection %age that would be
68 when db=6.0. this is an arbitrary
69 endpoint for our scaling.
70 */
8571
86 return def/115.0f;
72 return def/115.0f;
8773 }
8874
8975 /* --------- calculate power (percent) to decibel -------- */
9076 // Note: could use fast_log10 (see ardour code) to make it faster
91 inline float power2db(float power)
92 {
93 return 20.*log10(power);
77 inline float power2db(float power) {
78 return 20.*log10(power);
9479 }
95
96
9780 }
81 #endif // SRC_HEADERS_GX_THREADS_H_
00 /*
11 * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
2 * Copyright (C) 2011 Pete Shorthose
23 *
34 * This program is free software; you can redistribute it and/or modify
45 * it under the terms of the GNU General Public License as published by
1213 *
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1617 * --------------------------------------------------------------------------
18 *
19 * This is the guitarix UI, it is part of the guitarix GUI main class
20 * Note: this header file is the base for gx_main_interface.h and
21 * gx_main_boxes.h
22 *
23 * ----------------------------------------------------------------------------
1724 */
1825
19 /* ----- This is the guitarix UI, it belongs to the guitarix namespace ------ */
2026
2127 #pragma once
28
29 #ifndef SRC_HEADERS_GX_UI_H_
30 #define SRC_HEADERS_GX_UI_H_
2231
2332 #include <map>
2433 #include <list>
2938 #define kBoxMode 1
3039 #define kTabMode 2
3140
32 namespace gx_ui
33 {
41 namespace gx_ui {
3442 /* ------------- UI Classes ------------- */
3543 /* base interface classes interfacing with the GUI */
3644 class GxUI;
3745
3846 /* --- GxUiItem (virtual class) --- */
39 class GxUiItem
40 {
41 protected :
42 GxUI* fGUI;
43 public:
44 virtual ~GxUiItem();
45 GxUiItem(GxUI *ui): fGUI(ui) {}
46 virtual void reflectZone() = 0;
47 virtual bool hasChanged() = 0;
47 class GxUiItem {
48 protected :
49 GxUI* fGUI;
50 public:
51 virtual ~GxUiItem();
52 explicit GxUiItem(GxUI *ui): fGUI(ui) {}
53 virtual void reflectZone() = 0;
54 virtual bool hasChanged() = 0;
4855 };
4956
50 class GxUiItemFloat: GxUiItem
51 {
52 protected :
53 float* fZone;
54 float fCache;
55 GxUiItemFloat(GxUI* ui, float* zone);
56 public :
57 void modifyZone(float v);
58 virtual bool hasChanged();
57 class GxUiItemFloat: GxUiItem {
58 protected :
59 float* fZone;
60 float fCache;
61 GxUiItemFloat(GxUI* ui, float* zone);
62 public :
63 void modifyZone(float v);
64 virtual bool hasChanged();
5965 };
6066
61 class GxUiItemInt: GxUiItem
62 {
63 protected :
64 int* fZone;
65 int fCache;
66 GxUiItemInt(GxUI* ui, int* zone);
67 public :
68 void modifyZone(int v);
69 virtual bool hasChanged();
67 class GxUiItemInt: GxUiItem {
68 protected :
69 int* fZone;
70 int fCache;
71 GxUiItemInt(GxUI* ui, int* zone);
72 public :
73 void modifyZone(int v);
74 virtual bool hasChanged();
7075 };
7176
72 class GxUiItemBool: GxUiItem
73 {
74 protected :
75 bool* fZone;
76 bool fCache;
77 GxUiItemBool(GxUI* ui, bool* zone);
78 public :
79 void modifyZone(bool v);
80 virtual bool hasChanged();
77 class GxUiItemBool: GxUiItem {
78 protected :
79 bool* fZone;
80 bool fCache;
81 GxUiItemBool(GxUI* ui, bool* zone);
82 public :
83 void modifyZone(bool v);
84 virtual bool hasChanged();
8185 };
8286
8387
8488 /* --- Callback Item --- */
8589 typedef void (*GxUiCallback)(float val, void* data);
8690
87 struct GxUiCallbackItemFloat : public GxUiItemFloat
88 {
89 GxUiCallback fCallback;
90 void* fData;
91 struct GxUiCallbackItemFloat : public GxUiItemFloat {
92 GxUiCallback fCallback;
93 void* fData;
9194
92 GxUiCallbackItemFloat(GxUI* ui, float* zone, GxUiCallback foo, void* data);
93 virtual void reflectZone();
95 GxUiCallbackItemFloat(GxUI* ui, float* zone, GxUiCallback foo, void* data);
96 virtual void reflectZone();
9497 };
9598
9699 /* --- Main UI base class --- */
97 class GxUI
98 {
99 typedef list< GxUiItem* > clist;
100 typedef map < void*, clist* > zmap;
100 class GxUI {
101 typedef list< GxUiItem* > clist;
102 typedef map < void*, clist* > zmap;
101103
102 private:
103 static list<GxUI*> fGuiList;
104 zmap fZoneMap;
104 private:
105 static list<GxUI*> fGuiList;
106 zmap fZoneMap;
107 public:
108 GxUI();
109 virtual ~GxUI() {}
105110
106 public:
107 GxUI();
108 virtual ~GxUI() {}
111 // public methods
112 void registerZone(void*, GxUiItem*);
113 void updateAllZones();
114 void updateZone(void* z);
115 static void updateAllGuis();
116 };
117 } /* end of gx_ui namespace */
109118
110 // public methods
111 void registerZone(void*, GxUiItem*);
112 void updateAllZones();
113 void updateZone(void* z);
114 static void updateAllGuis();
115 };
119 #endif // SRC_HEADERS_GX_UI_H_
116120
117 } /* end of gx_ui namespace */
2727 print 'Incompatible Waf, use 1.5'
2828 sys.exit (1)
2929
30
30
3131
3232 def option_enabled (option):
3333 if getattr (Options.options, 'enable_' + option):
3737 return True
3838
3939 # used by waf dist and waf build
40 VERSION='0.16.0'
40 VERSION='0.17.0'
4141 APPNAME='guitarix'
4242 APPNAME1='guitarix'
4343
381381
382382 # guitarix waf configuration
383383 def configure(conf):
384 platform = Utils.detect_platform()
385 conf.env['IS_MACOSX'] = platform == 'darwin'
386 conf.env['IS_LINUX'] = platform == 'linux' or platform == 'posix'
387 conf.env['IS_SUN'] = platform == 'sunos'
388
389 if conf.env['IS_LINUX']:
390 conf.define ('IS_LINUX', platform )
391
392 if conf.env['IS_MACOSX']:
393 conf.define ('IS_MACOSX', platform )
394
395 if conf.env['IS_SUN']:
396 conf.define ('IS_SUN', platform )
397
398 conf.env['OS'] = platform
384399
385400 def option_checkfatal (option, desc):
386401 if hasattr (Options.options, 'enable_' + option):
395410 else:
396411 option_checkfatal ('nls', 'localization')
397412 nls = 'N/A'
413 conf.define ('DISABLE_NLS', 1)
398414 else:
399415 nls = 'no '
400
416 conf.define ('DISABLE_NLS', 1)
401417 conf.define ('GETTEXT_PACKAGE', APPNAME1)
402418
403419 conf.define ('ENABLE_NLS', [0,1][nls == 'yes'])
453469
454470 conf.define('LIBDIR', os.path.normpath(os.path.join(conf.env['PREFIX'], 'lib')))
455471 if not Options.options.no_ladspa:
472 conf.env['LADSPA'] = True
456473 conf.define('LADSPADIR', os.path.normpath(os.path.join(conf.env['LIBDIR'], 'ladspa')))
457474 if Options.options.ladspadir:
458475 conf.env['LADSPADIR'] = Options.options.ladspadir
498515 print_msg(version_msg)
499516
500517 print_msg("")
518 display_msg("OS ", conf.env['OS'], 'CYAN')
501519
502520 if not conf.env['ZITA_RESAMPLER']:
503521 conf.env['ZITARESAMPLER'] = True