From e59017b03f161bf4e2b0b591780f93b3b52f77c2 Mon Sep 17 00:00:00 2001 From: SubhadeepJasu Date: Sun, 11 Jul 2021 15:09:37 +0530 Subject: [PATCH 01/14] Make Metronome work --- .buildconfig | 6 +-- src/Core/MetronomeLFOPlayer.vala | 40 ++++++++++++++++++ src/Core/central_bus.h | 2 +- src/Core/metronome_lfo_player.c | 72 +++++++++++++++++++++++++++----- src/Core/style_player.c | 14 +++++-- src/Core/synthesizer.c | 19 ++++++++- src/Core/synthesizer.h | 2 + src/Shell/MainWindow.vala | 6 +++ src/meson.build | 2 + 9 files changed, 144 insertions(+), 19 deletions(-) create mode 100644 src/Core/MetronomeLFOPlayer.vala diff --git a/.buildconfig b/.buildconfig index b9154405..b265c7df 100644 --- a/.buildconfig +++ b/.buildconfig @@ -1,9 +1,9 @@ -[default] -name=Default +[meson] +name=Meson runtime=host config-opts= run-opts= -prefix=/home/subhadeep/.cache/gnome-builder/install/.vscode/host +prefix=/usr app-id= postbuild= prebuild= diff --git a/src/Core/MetronomeLFOPlayer.vala b/src/Core/MetronomeLFOPlayer.vala new file mode 100644 index 00000000..172f61e6 --- /dev/null +++ b/src/Core/MetronomeLFOPlayer.vala @@ -0,0 +1,40 @@ +namespace Ensembles.Core { + public class MetronomeLFOPlayer { + string _lfo_directory_location; + int _time_signature_n; + int _time_signature_d; + string _lfo_file_location; + int _tempo = 120; + public MetronomeLFOPlayer (string lfo_directory_location) { + _lfo_directory_location = lfo_directory_location; + metronome_lfo_player_init (); + } + ~MetronomeLFOPlayer () { + metronome_lfo_player_destruct (); + } + + public void play_measure (int time_signature_n, int time_signature_d) { + if (_time_signature_n != time_signature_n || _time_signature_d != time_signature_d) { + _time_signature_n = time_signature_n; + _time_signature_d = time_signature_d; + _lfo_file_location = _lfo_directory_location + "/" + + time_signature_n.to_string () + "_" + + time_signature_d.to_string () + ".mtlfo"; + metronome_lfo_player_change_base (_lfo_file_location, _tempo, 1920); + } else { + metronome_lfo_player_play (); + } + } + + public void set_tempo (int tempo) { + _tempo = tempo; + metronome_lfo_player_set_tempo (_tempo); + } + } +} + +extern void metronome_lfo_player_init (); +extern void metronome_lfo_player_destruct (); +extern void metronome_lfo_player_change_base (string mid_file, int tempo, int eol); +extern void metronome_lfo_player_play (); +extern void metronome_lfo_player_set_tempo (int tempo); \ No newline at end of file diff --git a/src/Core/central_bus.h b/src/Core/central_bus.h index 711711bb..66f4963d 100644 --- a/src/Core/central_bus.h +++ b/src/Core/central_bus.h @@ -20,7 +20,7 @@ #ifndef CENTRAL_BUS_H #define CENTRAL_BUS_H -/** Central Clock becomes 1 every time a beat starts and then it goes to 0 +/** Central Clock becomes 1 every time a measure starts and then it goes to 0 */ /** This function gives you the current value of the clock */ diff --git a/src/Core/metronome_lfo_player.c b/src/Core/metronome_lfo_player.c index 4d657ae7..916e0125 100644 --- a/src/Core/metronome_lfo_player.c +++ b/src/Core/metronome_lfo_player.c @@ -35,9 +35,40 @@ fluid_player_t* lfo_player; int lfo_measure_length = 0; int lfo_looping = 0; +int lfo_end_of_line = 0; char* metronome_file_path; +int +lfo_parse_midi_events (void *data, fluid_midi_event_t *event) { + fluid_midi_event_t* new_event = new_fluid_midi_event (); + + fluid_midi_event_set_channel (new_event, fluid_midi_event_get_channel (event)); + fluid_midi_event_set_control (new_event, fluid_midi_event_get_control (event)); + fluid_midi_event_set_program (new_event, fluid_midi_event_get_program (event)); + fluid_midi_event_set_value (new_event, fluid_midi_event_get_value (event)); + fluid_midi_event_set_velocity (new_event, 105); + fluid_midi_event_set_type (new_event, fluid_midi_event_get_type (event)); + + int type = fluid_midi_event_get_type (event); + int channel = fluid_midi_event_get_channel (event); + int key = fluid_midi_event_get_key (event); + + if (channel == 9) { + // Send data to synth + synthesizer_send_notes_metronome (key, type); + } + return 0; +} + + +int +lfo_parse_ticks (void* data, int ticks) { + if (ticks >= lfo_end_of_line) { + fluid_player_stop (lfo_player); + } +} + void metronome_lfo_player_init () { @@ -47,28 +78,49 @@ metronome_lfo_player_init () { } -GThreadFunc -queue_lfo_file_change (int tempo) { - printf("changing...to %s\n", metronome_file_path); -} void -metronome_lfo_player_change_time_signature (int tempo, float time_signature) { - +metronome_lfo_player_change_base (const char* mid_file, int tempo, int eol) { + lfo_end_of_line = eol; + if (lfo_player) { + fluid_player_stop (lfo_player); + delete_fluid_player(lfo_player); + } + lfo_player = new_fluid_player(lfo_synth); + fluid_player_set_playback_callback(lfo_player, lfo_parse_midi_events, lfo_synth); + fluid_player_set_tick_callback (lfo_player, lfo_parse_ticks, lfo_synth); + if (fluid_is_midifile(mid_file)) { + fluid_player_add(lfo_player, mid_file); + } + fluid_player_set_tempo (lfo_player, FLUID_PLAYER_TEMPO_EXTERNAL_BPM, (double)tempo); + fluid_player_play (lfo_player); + printf ("d:\n"); } void metronome_lfo_player_destruct () { /* wait for playback termination */ - fluid_player_stop (lfo_player); - fluid_player_join(lfo_player); + if (lfo_player) { + fluid_player_stop (lfo_player); + fluid_player_join(lfo_player); + delete_fluid_player(lfo_player); + lfo_player = NULL; + } /* cleanup */ delete_fluid_audio_driver(lfo_adriver); - delete_fluid_player(lfo_player); delete_fluid_synth(lfo_synth); delete_fluid_settings(lfo_settings); } void -metronome_lfo_player_loop () { +metronome_lfo_player_play () { + fluid_player_stop (lfo_player); + fluid_player_seek (lfo_player, 0); + fluid_player_play (lfo_player); +} +void +metronome_lfo_player_set_tempo (int tempo) { + if (lfo_player) { + fluid_player_set_tempo (lfo_player, FLUID_PLAYER_TEMPO_EXTERNAL_BPM, (double)tempo); + } } \ No newline at end of file diff --git a/src/Core/style_player.c b/src/Core/style_player.c index d68dccea..64ef9936 100644 --- a/src/Core/style_player.c +++ b/src/Core/style_player.c @@ -362,7 +362,10 @@ queue_style_file_change (int use_previous_tempo) { } if (player) { printf ("b:\n"); + fluid_player_stop (player); + fluid_player_join(player); delete_fluid_player(player); + player = NULL; printf ("c:\n"); } player = new_fluid_player(synth); @@ -412,12 +415,15 @@ style_player_reload_style () { void style_player_destruct () { - /* wait for playback termination */ - fluid_player_stop (player); - fluid_player_join(player); /* cleanup */ delete_fluid_audio_driver(adriver); - delete_fluid_player(player); + if (player) { + /* wait for playback termination */ + fluid_player_stop (player); + fluid_player_join(player); + delete_fluid_player(player); + player = NULL; + } delete_fluid_synth(synth); delete_fluid_settings(settings); } diff --git a/src/Core/synthesizer.c b/src/Core/synthesizer.c index 8d3f7a5d..57a71b3c 100644 --- a/src/Core/synthesizer.c +++ b/src/Core/synthesizer.c @@ -142,10 +142,14 @@ synthesizer_set_defaults () { fluid_synth_cc (realtime_synth, 1, 74, 0); fluid_synth_cc (realtime_synth, 2, 74, 0); - // Reverb and Chorus ro R1 voice + // Reverb and Chorus for R1 voice fluid_synth_cc (realtime_synth, 0, 91, 4); fluid_synth_cc (realtime_synth, 0, 93, 1); + // Reverb and Chorus for Metronome + fluid_synth_cc (realtime_synth, 9, 91, 0); + fluid_synth_cc (realtime_synth, 9, 93, 0); + // Default gain for Realtime synth fluid_synth_cc (realtime_synth, 0, 7, 100); fluid_synth_cc (realtime_synth, 1, 7, 90); @@ -197,6 +201,9 @@ synthesizer_init (const gchar* loc) { fluid_synth_program_select (realtime_synth, 3, realtime_synth_sf_id, 0, 5); fluid_synth_program_select (realtime_synth, 4, realtime_synth_sf_id, 0, 33); fluid_synth_program_select (realtime_synth, 5, realtime_synth_sf_id, 0, 49); + + // Initialize metronome voice + fluid_synth_program_select (realtime_synth, 9, realtime_synth_sf_id, 128, 0); } fx_init (); style_adriver = new_fluid_audio_driver2(style_synth_settings, fx_function, (void *) &fx_data); @@ -320,6 +327,15 @@ handle_events_for_styles (fluid_midi_event_t *event) { return fluid_synth_handle_midi_event(style_synth, event); } +int +synthesizer_send_notes_metronome (int key, int on) { + if (on == 144) { + fluid_synth_noteon (realtime_synth, 9, key, 127); + } else { + fluid_synth_noteoff (realtime_synth, 9, key); + } +} + int synthesizer_send_notes (int key, int on, int velocity, int* type) { if (get_central_accompaniment_mode () > 0) { @@ -362,6 +378,7 @@ synthesizer_send_notes (int key, int on, int velocity, int* type) { if (on == 144) { fluid_synth_noteon (realtime_synth, 0, key + ((synthesizer_octave_shifted > 0) ? (synthesizer_octave * 12) : 0) + ((synthesizer_transpose_enable > 0) ? synthesizer_transpose : 0), velocity); voice_velocity_buffer[0] = velocity; + printf("%d\n", key); } else if (on == 128) { fluid_synth_noteoff (realtime_synth, 0, key + ((synthesizer_octave_shifted > 0) ? (synthesizer_octave * 12) : 0) + ((synthesizer_transpose_enable > 0) ? synthesizer_transpose : 0)); voice_velocity_buffer[0] = 0; diff --git a/src/Core/synthesizer.h b/src/Core/synthesizer.h index 0b2c4149..1d244f61 100644 --- a/src/Core/synthesizer.h +++ b/src/Core/synthesizer.h @@ -27,6 +27,8 @@ */ int handle_events_for_styles (fluid_midi_event_t *event); +void synthesizer_send_notes_metronome (int key, int on); + /** This function is used to stop all synthesizer sounds for styles * except channel 10 i.e. drums */ diff --git a/src/Shell/MainWindow.vala b/src/Shell/MainWindow.vala index 51a95e43..e671ae60 100644 --- a/src/Shell/MainWindow.vala +++ b/src/Shell/MainWindow.vala @@ -35,11 +35,13 @@ namespace Ensembles.Shell { Ensembles.Core.Synthesizer synthesizer; Ensembles.Core.StyleDiscovery style_discovery; Ensembles.Core.StylePlayer style_player; + Ensembles.Core.MetronomeLFOPlayer metronome_player; Ensembles.Core.CentralBus bus; Ensembles.Core.Controller controller_connection; string sf_loc = Constants.SF2DATADIR + "/EnsemblesGM.sf2"; string sf_schema_loc = Constants.SF2DATADIR + "/EnsemblesGMSchema.csv"; + string metronome_lfo_directory = Constants.PKGDATADIR + "/MetronomesAndLFO"; public MainWindow () { Gtk.Settings settings = Gtk.Settings.get_default (); settings.gtk_application_prefer_dark_theme = true; @@ -125,6 +127,8 @@ namespace Ensembles.Shell { ); }); + metronome_player = new Ensembles.Core.MetronomeLFOPlayer (metronome_lfo_directory); + make_ui_events (); load_voices (); @@ -134,6 +138,7 @@ namespace Ensembles.Shell { beat_counter_panel.sync (); style_controller_view.sync (); main_display_unit.set_measure_display (Ensembles.Core.CentralBus.get_measure ()); + metronome_player.play_measure (4, 4); }); bus.system_halt.connect (() => { style_player.reload_style (); @@ -149,6 +154,7 @@ namespace Ensembles.Shell { bus.loaded_tempo_change.connect ((tempo) => { beat_counter_panel.change_tempo (tempo); main_display_unit.set_tempo_display (tempo); + metronome_player.set_tempo (tempo); }); bus.split_key_change.connect (() => { main_keyboard.update_split (); diff --git a/src/meson.build b/src/meson.build index 91d226a8..25c325d8 100644 --- a/src/meson.build +++ b/src/meson.build @@ -47,6 +47,7 @@ ensembles_sources_vala = files ( 'Core/StyleDiscovery.vala', 'Core/CentralBus.vala', 'Core/StylePlayer.vala', + 'Core/MetronomeLFOPlayer.vala', 'Core/StyleAnalyser.vala', 'Core/Voice.vala', 'Core/VoiceAnalyser.vala' @@ -58,6 +59,7 @@ ensembles_sources_c = files ( 'Core/synthesizer.c', 'Core/controller.c', 'Core/style_player.c', + 'Core/metronome_lfo_player.c', 'Core/style_analyser.c', 'Core/chord_finder.c', 'Core/voice_analyser.c' From e336938b13a6a1ff9e8c17d664a88dd3e462eb62 Mon Sep 17 00:00:00 2001 From: SubhadeepJasu Date: Sun, 11 Jul 2021 15:59:06 +0530 Subject: [PATCH 02/14] Make metronome play on its own --- src/Core/CentralBus.vala | 20 +++++++++++++++++++- src/Core/MetronomeLFOPlayer.vala | 17 +++++++++++++++++ src/Core/central_bus.c | 9 +++++++++ src/Core/central_bus.h | 1 + src/Core/metronome_lfo_player.c | 3 ++- src/Shell/MainWindow.vala | 10 ++++++++++ src/Shell/Views/ControlPanel.vala | 4 ++++ 7 files changed, 62 insertions(+), 2 deletions(-) diff --git a/src/Core/CentralBus.vala b/src/Core/CentralBus.vala index 65950915..44efc2f5 100644 --- a/src/Core/CentralBus.vala +++ b/src/Core/CentralBus.vala @@ -124,6 +124,18 @@ namespace Ensembles.Core { public static void set_layer_on (bool active) { central_layer_on = active ? 1 : 0; } + + public static bool get_metronome_on () { + return central_metronome_on > 0 ? true : false; + } + + public static void set_metronome_on (bool active) { + central_metronome_on = active ? 1 : 0; + } + + public static bool get_style_looping_on () { + return central_style_looping > 0 ? true : false; + } } } @@ -138,5 +150,11 @@ extern int central_style_section; extern int central_loaded_tempo; extern int central_split_key; extern int central_split_on; +extern int central_layer_on; + +// Style extern int central_accompaniment_mode; -extern int central_layer_on; \ No newline at end of file +extern int central_style_looping; + +// Metronome and LFO +extern int central_metronome_on; \ No newline at end of file diff --git a/src/Core/MetronomeLFOPlayer.vala b/src/Core/MetronomeLFOPlayer.vala index 172f61e6..4fbb3574 100644 --- a/src/Core/MetronomeLFOPlayer.vala +++ b/src/Core/MetronomeLFOPlayer.vala @@ -5,6 +5,7 @@ namespace Ensembles.Core { int _time_signature_d; string _lfo_file_location; int _tempo = 120; + public bool looping; public MetronomeLFOPlayer (string lfo_directory_location) { _lfo_directory_location = lfo_directory_location; metronome_lfo_player_init (); @@ -30,6 +31,22 @@ namespace Ensembles.Core { _tempo = tempo; metronome_lfo_player_set_tempo (_tempo); } + + public void play_loop (int time_signature_n, int time_signature_d) { + if (!CentralBus.get_style_looping_on ()) { + looping = true; + CentralBus.set_metronome_on (true); + play_measure (time_signature_n, time_signature_d); + Timeout.add (240000/_tempo, () => { + metronome_lfo_player_play (); + return looping; + }); + } + } + + public void stop_loop () { + looping = false; + } } } diff --git a/src/Core/central_bus.c b/src/Core/central_bus.c index c103569b..35034db8 100644 --- a/src/Core/central_bus.c +++ b/src/Core/central_bus.c @@ -45,6 +45,15 @@ void set_styles_ready (int value) { styles_ready = value; } +// Metronome & LFO signals +int central_metronome_on; +int get_central_metronome_on () { + return central_metronome_on; +} +int set_central_metronome_on (int on) { + central_metronome_on = on; +} + // UI signals int* loaded_style_time_stamps; int* get_loaded_style_time_stamps () { diff --git a/src/Core/central_bus.h b/src/Core/central_bus.h index 66f4963d..04df711e 100644 --- a/src/Core/central_bus.h +++ b/src/Core/central_bus.h @@ -57,6 +57,7 @@ int get_styles_ready (); */ void set_styles_ready (int value); +int get_central_metronome_on (); /** UI signals are used to communicate with the UI frontend. */ diff --git a/src/Core/metronome_lfo_player.c b/src/Core/metronome_lfo_player.c index 916e0125..8f2ec55f 100644 --- a/src/Core/metronome_lfo_player.c +++ b/src/Core/metronome_lfo_player.c @@ -56,7 +56,8 @@ lfo_parse_midi_events (void *data, fluid_midi_event_t *event) { if (channel == 9) { // Send data to synth - synthesizer_send_notes_metronome (key, type); + if (get_central_metronome_on ()) + synthesizer_send_notes_metronome (key, type); } return 0; } diff --git a/src/Shell/MainWindow.vala b/src/Shell/MainWindow.vala index e671ae60..3e39a66b 100644 --- a/src/Shell/MainWindow.vala +++ b/src/Shell/MainWindow.vala @@ -138,11 +138,13 @@ namespace Ensembles.Shell { beat_counter_panel.sync (); style_controller_view.sync (); main_display_unit.set_measure_display (Ensembles.Core.CentralBus.get_measure ()); + if (metronome_player.looping) metronome_player.stop_loop (); metronome_player.play_measure (4, 4); }); bus.system_halt.connect (() => { style_player.reload_style (); beat_counter_panel.halt (); + metronome_player.stop_loop (); }); bus.system_ready.connect (() => { main_display_unit.queue_remove_splash (); @@ -193,6 +195,14 @@ namespace Ensembles.Shell { ctrl_panel.update_split.connect (() => { main_keyboard.update_split (); }); + ctrl_panel.start_metronome.connect ((active) => { + if (active) { + metronome_player.play_loop (4, 4); + } else { + metronome_player.stop_loop (); + Ensembles.Core.CentralBus.set_metronome_on (false); + } + }); controller_connection.receive_note_event.connect ((key, on, velocity)=>{ // print ("%d %d %d\n", key, on, velocity); synthesizer.send_notes_realtime (key, on, velocity); diff --git a/src/Shell/Views/ControlPanel.vala b/src/Shell/Views/ControlPanel.vala index 1b88b630..f5a8ac41 100644 --- a/src/Shell/Views/ControlPanel.vala +++ b/src/Shell/Views/ControlPanel.vala @@ -45,6 +45,7 @@ namespace Ensembles.Shell { public signal void reverb_change (int level); public signal void chorus_change (int level); public signal void dial_rotate (bool direction, int amount); + public signal void start_metronome (bool active); public signal void dial_activate (); public signal void update_split (); public ControlPanel () { @@ -132,6 +133,9 @@ namespace Ensembles.Shell { Ensembles.Core.CentralBus.set_split_on (active); update_split (); }); + metronome_toggle.toggled.connect ((active) => { + start_metronome (active); + }); main_dial.activate_clicked.connect (() => { dial_activate (); }); From ad9d2c533856a0e8dbf5b8a395eb92878f9c68b3 Mon Sep 17 00:00:00 2001 From: SubhadeepJasu Date: Sun, 11 Jul 2021 17:06:56 +0530 Subject: [PATCH 03/14] Get LFO signals working --- data/MetronomesAndLFO/4_4.rg | Bin 11048 -> 11049 bytes src/Core/CentralBus.vala | 16 +++++++++++++++- src/Core/MetronomeLFOPlayer.vala | 1 - src/Core/central_bus.c | 16 ++++++++++++++++ src/Core/central_bus.h | 4 ++++ src/Core/metronome_lfo_player.c | 17 ++++++++--------- src/Shell/MainWindow.vala | 5 ++++- 7 files changed, 47 insertions(+), 12 deletions(-) diff --git a/data/MetronomesAndLFO/4_4.rg b/data/MetronomesAndLFO/4_4.rg index a4188d5baa874e7db412648101be18c3236a90dc..25a79b53b46bfef3f43801183087c9b7b699845d 100644 GIT binary patch delta 10830 zcmXwb1x%e?*KBbsP~hP1uEmNw2Pp1d+}$bV!6_W%;85J%-HW@s6o=wgtmy6gf4RwI zGHYh-mF#3?XP0P|YSp}l0aX2l=uGeJvWn$0Dtstao8G_BWkvo?5mN5kk1yWN^S15V z`Th&{jZevyEB`430cMfu)e$NC!F+P1s@GNv#<$R4*Gp>**k`)5 zHm_aJ>3g})KP5~%Syz1~@}jbJSTd`7^=~ATr6L|>39NkD4Bh0K%>d=WNEw9Ar+exC zYCG=Y&kcs|@Xx!U0UL`ASG)#Q-pR(Oy~`}|9sD@nvaZ@s`lS&kC*_ygH`Q(q zUhnz|-SEIUy`FJ?OMl{hr8=zo>EyQOR4iT>5yA z5qfM5eo?*x`VZHqfO0obb&vYif@a5g@r-cL;LPwhRBm5*qRxEln=II9kwBR@2BMc@ zvE5X$-3JDu?0zW`%4z;jk%RP{9!T&+!THvH*dK2-W*&0&5Kn)*`9}T55kjH1iA8>y z6|wC6SSPC-1WuROdr?M+~82e*Ok@A0(y(f%BH$z>We&gs%XSd zaxC`tqoac&wl-#Os#a$~BhC}`&V==T>8=W|!v&xw1Bn?8=;lDpa5r>xd=4QcSG?j;HygS8?Z+-9Z{ z$BlQ>`CB27SU*os)NDqP*6-3*(kZNOqNXiBeY0uOMaNVcX+EVFZx@}`w)-35FpI#hOSp$PpU8iY@Q(Gh-pWw0Rg6Ig zBD`5FfpiNZwmMS^5ieyUp(jzRyg2M~>lp)`;8p@x1smn2dMS>0y!^A)T{LH292ps% z+^Kf9%RC;8kPdrA#>8TSC_vo$Ppx@Yy?&N~v6WB?oG^R%pB0;#WUc&o9TwX>aF|;( z>xVvnI&v1Vv)Y6G(AjdNkcHK!4GjX$nI+FXK)bV922x2o@Jv`|46uk8s}aM?0?2V9 z&l^V%&4m|yeokk0Xm*so>nXp$`XjkkhV?!sC&3rRUGyY%bH9w8?108?%p=}-#NvgU zza94aGZoi1HV$R@S(@!O`{Y~3R>kcmk9j;_&ft*jd)7Hj$$|d1bGUnx)vujD{S&c( z6UCy~>&95KY_hFRPX#)5ulmyLZ(WJfZJUH3B7LvL;CC8dMWzI|p{b;FOB=lg=?Q5Sk`o38_8 zFH2)@uUc>#L1Y_uZcz>^A%FcECB1|J!;39dF3dkqWk}J!4dR2S3?@Z-)Tf&{SeviJ z?L&DEM4{h?GzoVmEZ(&(U$tQ5Gfj1TzLgOLnH-zuoA>o{GtcRjgP;SBqS7MGU1M4! zhJ*{2rsL+)PoAPy_by$wZw5lFh$}xVe0G)BQY~DkLfM&WnSu@cwEk`wQVoCs>2n~_ znO?9HcbT5nDfENA4rPx|;}f;WiNG@zUwgl#A2}GN!Ndi3iTzgR&5f{nQ+WE-ZRGOl zJUsHgE1{zAqwNUwzUtUL7yuFV?No;6K`j=tuZ*XZ0!#6y+8*kWUSoEq2pui;L__oa98unAJc8};z9!SJ?`?qhTRUiJfok) z?miGNl1sf#Dvf>L?s}IONntd?U)UJYG{#XyltH`XgVoIqk26u;!N^iON;;p4UrsoIN86> zwfh8SB=Q7uBwPT>Ay}b97SL}paQ%)3gE<+A!bPW6Xqv8R_2(kVH^ExGTx%yEUpb?5 zigMS&?Q{Nw4hadr-j1>hf@dG|r1q_WTyllv$hxklDG8*zY+0bLt6iZl`6F|HoxD;N!ObxdqKPBx~+6S%^QA7oy_rga#5zx z8Rh&q*Z|{TiMZ(oLWmRhbG8m~)?~A;&$r!gBL6sNL{NNIq}qddrdiI(O%dylo)b$5OS}H~CiQ_kBwCYN zx_CrtiUrX%rN1D)<@>V3@{4^=);`vh>*C9e2D<)Cqoa3*g9I6&MtR#nc%^lxN0uKa za>?XnJxN-+CbnB}$T2K=znIa~dvX)z#=P9?k&3_5JDVKz+ua zVH!ZhajhluL3Fvg`$qx&*TUaeR)bAQUk4!9<#a9!E+QM(?s1W1L>KSg59;1#rI;i` zbPYE?Nn>kdS}#p5RM`>8RGc&Y!dZXf{G%$TLuMJX< zqo@iVCp7zcLj!E$UFjXL`r!A=Fw`DR3YLJ+JX~S-V!89#eKe@()Qk03bBN_zj0+GO z4lczv`F;F4KlpUQ+pQk>_-hYrS}on*^E3yNe1C7XO;%mYa%P`oP09uu*o1|SLOMTk+QTY^`kVuh}=nt@ESl5Df;0X&KV(a^-@dN7lQiwPR;7Uwhv+6@F&;X~Fma6G3 zHAGLvaV*nQHsyFf3v74WpepA8T~O%A;Dbyv-62YkruR38_-k9Wu0&JQ7IsBfe?>?8 zZ(hvwhzav8bUd|P?HJX6G%c~y=lfw#1dpb4-Yg>u14o)MVGkQZA5HzOY71)%)miA~ zz355YgU8)NEJ6-=<=l5JSFpuwRbJC-AvE`=XGYN69VI(Wp~t6SwJ z`&=cQnDJ=o2+7Bg3oX1doIXpGg?GHB&ufiJ%>8>*#i?9#XxCagu9s*CD8xTa&pv&w zF^T^{#hA;ST%BNFzax|Ir7wv2y zw1VZ!9LPkvF{0JB*i%!w@4&awZg_8fARp4`nT#5YkB+GD(Hbca3h~4O((X zwK>JGFXOX`x;d5v1n8z2F{P8Nr9-(y)b&mPIdMiX@Bmw?b;!RLfA=%YeTP>u$_Kqh zjG+y+dbqH+MMRh*v!0s@aWR>`B!;AMYDM888frmBI_mC|+P z-Y13jx*xi5ZucJ_S{JfN*!pzahYyVNpEu3K`@7lx0HU>v+voBgcl+V1XY%`zs4DX! z<sGnl>MnaV zqtjWDoW;xtM|d7WhZqVoeNh^SL;p3BLwU@CrR3KHU&iLODW8s#Ro&C>sYvqS36l0e z2oce;E2WFMK7_d1^8n;;PgBf)yZcP-;5f>5n=2y$#Gz7TbcL>7^8J42K7q^ik|V}! z)DeDNXK+=eIV;~codX6ZwDL(x({p?}lJA`9>Rs#(N@d=gM}u1q79i6nJ-BHWC+*G` zaHh%>EZMDH2*kwl`M=}s2zPO4~|$Yt+3nbtvU6=nxlb9mw3{1Z6#i8B+2 z*Tcu3c5YvFGTtU1Tek1*npTDju6~7ai-`J`GE~m67gij*$~J!k74!S4>@j7W;|IHs z9ovkZ`;w`#_8~M^^?!A2Bg53IYy%>7N86<|4*K+istP<%`6x30o1A6uF_vo3dXKNg_gefg~xXHy~CiV=M|#+ zqWt0R59W4n2>H)@HL`GZFUB#g_Vv`s7$hqiRGIdxZR>ve6$Qr2Lmepsw_#xE=!1(L zJEK~OKvozxK~olPdVygkXj0O^fhwm&L8A15sx_UE=;O@wg?j`8I{uJ${kaLs5M>Q) z+vO0rd(j7*J)tVxPICEyJ0t(sfq}dKi3GTY4W*gWU>uvwG49Hydn3&P(PVysbZc3X zb8%uy*_NH*MAer))f1@r^g)T=WIMZcx^>@s$U}^w(sR)H=Sp9 zq1XHcLKuv(n>wTU;mu^-L6u2rH|3ClXQen!%nKoZ1Y%}oed4ax>%E-lO=V*5r7PxT z4WFIWpI>8)dy+?SmH@;JmuFO7jjR^lOaEPM=;=d$W1tstcaXsleHD5J@-uFMfQXC3 zme5xCs5?o6O9}6#-m~4Xo8QiH3F~0^!UJ`=nZXz=S@LddWsDy7Wepi%?=kNh5RUNI ztUNy%R;Xea;PY@l+v;OQYS(LBp*Bvq3SVh{i)Qchb~_{`0FVs7%{&BUOlY&DXeu66 zEc)R16#z2uCVGqqffzOG7}QxiBn=G7Rg#@oTcZhYyx`8SF|*;!{^?u5{f7aE4@vrp zU9D8|=YX{_w}Bq#|3~e`)%I+p)5~mRc^_M4i@?onBt(+EvIUx=j#elg>Ojmd?CE?(8;ThxeNWO?R`L+5gklapag}bydqM$1V>=WjXUC zW^3C{U!b;jhw#6s9ImSBVgBu(0RC&@KRk{k$Lwm`dEP2#-XQVx7$^^}s%pVjP_Li< zH&!HY`yldv;Hvw(ux=2@7hH9R-?Mi1Zl!>f!h~TL0mtBVpkc4kgQ}=8BOjOR*Gd_# zYXq@44`pl%u?Eg{grEdZE~krn2^}}(ImS2n_(omHxr1H0vj8AT8yj&UAom}422}pz z!hphm939a3k3Ig+F$}2e28r0o6R;;F2dI*Z>-QHxZS?zdusE*wEkmO=)bB$_QwZi^ zEIa+ybI>@B_jeJc1H{7*(i>s!o@pV!GtAou9k3Gi)r{HrqQ@(P&|{8$%mOy;kr0|}+i6JJ#y^DiBZ4+AaFJU_-9~H8GVRLNkoHj^*UZeQntM0O8IVbRYPun;I zjP;9~*2-OJ;#P6rb#2ia0X8~ngd_ims`wP+0wpnhb@4l^B4j!K*2lttn$J|>4lGBc zJ#srx?6)uE_uA%?L@AvXqnjq4!nI)iZ3Ot^FpmFk;dT!qW%@xcTB@s3c>KCL?FP7J zW%ASAK69@V!ACwR9b!7?(dpHUPYpJ(nTG?z2@I1}9CAGs4{Z45&Xi&kKUDmlZ!L*k z=8lPq*w$9gj&DEPc#oayFc5>WgQw@U-Xq0>r}g2nKNz`n@mu|oALq|pd4gB0{{c7( z{-ViWQ{o#B<>BNcrr8(E=WrluA?xWzqv zzW!T=OOiLPTjewP!&89bi}Pf&O%VWjQ~9xt^_=6PEto?{ZeFG12J&dyc5*^?@)9tv z_TAmw(2@4uh@bgp8U;VbA7+W!*xI$dYS0&2An8$+E3mYro~baWwOq#?&jfKb8XbA@ zAi#xr>(c!DqqA`Z4tDqFRJ@K%dX(a~gv;?Zv{1L(^I!BQk3a8tM;wUCB65Mw3uE9p z`s;DaOz#XF$f};cMWdQw|5+B>?tS#5~NTmGaH!q4u#Q1*v zhf+^D7f$kcBXDWtxxfvkPC)CmH;A{8G=)0lDVo z3fHK-L_li!^#Qed!JbsY9`FuTw$n5TCs-pl-fnEGmxP{S7F=qbO{Psx#W>JhLpb8z1kBRWQ+NpX(102GVZ~>jwNox6uC7E@kSMo6 zqOWIPZ$nmumuX=K_&uo8EzOnfW9eRCs_x2RPLkHbU=XTTT`T+8JRG_sR?zykl75lPlRsZB1Y3!6WJdU4vHP%xk~n1=bE2CI*x>H_B?WD^BGfKe!Yp~ zF=#q|0xWn+u~%I5btxRo-8+~%TO)NQv1(Y*>id#bhT0L^)jzUS)oKN^U@Tv76i32a z?WJ?7s-07TNNIF=Euiae^pWXce& zqFiModaj$&>Wm0FT588ZS$3KrBl_YVlIB+Nh+_H^VGUbFjQ)0!7YfN>mS$^M$|X2^ zY$?m_{o-LS#a`I+aCn;Mh@xsnI&^}7He|=H+b`-g2RM#B|0U(hY7a76M8F`Cqh6CD z18my+zJD>_?r^j*_%S@}CrF)&C&Ox`09T2qzws_9qLV007DP6$lfF6D@Nn?^$-g@H zWIlWa;R_zRAP83}x&~qBn`h*Bd9`nVaM4ZW;QH;ZXtTW`$WncdY7v*87zee5$f5#) z*|>r-Xs1ssT5rW}6AW!?BxTf>v}Ry30+>ID%51X^)xczR(cxCfI-9PqzH8rk-?vJ3 zjRrfNE_;cwZQu9NI0<;8_ioG`0X?Kph$b2&T>zEgl8Ln% zft^UjrmuTZzR^=-Yu>4(mbKsLvVX)9sIZMYxv!x9z-94~hgeLsMtDJ!v8$MGu;`MV z*%L=AhYM73np58P^LrjMPnqL~JYbhnnzDK>UxjGiULKp(JA)2_s*CX{^z^1qOGT-b zBN(-9(TUVpkc=e#5|+PPzauB`#E#w|e40E*;Eym&{HzL3Z*mYkX~r+K$pxJ9xwPP3 z1dugmb3>RdT$!-ega-;vlrhACJ6(UTt|Snxr$mb_2vH}xR$0yy$fENa1qR_u8nf2M zmICzVE=+YHTR7SzQDPSAJOo7`)U8vYg#CAR4jw&ZQ9W}M6@odg9(dO}$xW;{PQiuEV7*Q$10Kj&b_j7~M#xC1F-UanALP{1N%5w6nwly{4UxCCZ2J!Z7G zM05D=ofq?@D`{SE6gllVfVll0kKOj$+?7f=dATyag73#NBDqf$wf1|Zh%Zs1iF;Yq z*jIeXZlp|~XFzj)pu@46W1s~gr@ zXEKNwHhdN*Bch#zUFfMNqWQ6Bo~oP1-&vQohmdpQlU0#ckvn61sF8Mu zVqzQIc1W9GjV+PNVW=Wv7@ezuwy3~v``n>;J;u>BV}lr~%up71P0Ll)fiy3U7_-GL zc~&uzCDSW(9)T!^XUENn*1ugNC?#mxGmqIQ^qAqK<@L z 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 KrdR 0 ? true : false; } + + public static float get_lfo () { + return ((float)central_lfo_value / 127.0f); + } } } @@ -157,4 +169,6 @@ extern int central_accompaniment_mode; extern int central_style_looping; // Metronome and LFO -extern int central_metronome_on; \ No newline at end of file +extern int central_metronome_on; +extern int central_lfo_on; +extern int central_lfo_value; \ No newline at end of file diff --git a/src/Core/MetronomeLFOPlayer.vala b/src/Core/MetronomeLFOPlayer.vala index 4fbb3574..f7dfb642 100644 --- a/src/Core/MetronomeLFOPlayer.vala +++ b/src/Core/MetronomeLFOPlayer.vala @@ -35,7 +35,6 @@ namespace Ensembles.Core { public void play_loop (int time_signature_n, int time_signature_d) { if (!CentralBus.get_style_looping_on ()) { looping = true; - CentralBus.set_metronome_on (true); play_measure (time_signature_n, time_signature_d); Timeout.add (240000/_tempo, () => { metronome_lfo_player_play (); diff --git a/src/Core/central_bus.c b/src/Core/central_bus.c index 35034db8..10210f44 100644 --- a/src/Core/central_bus.c +++ b/src/Core/central_bus.c @@ -54,6 +54,22 @@ int set_central_metronome_on (int on) { central_metronome_on = on; } +int central_lfo_on; +int get_central_lfo_on () { + return central_lfo_on; +} +int set_central_lfo_on (int on) { + central_lfo_on = on; +} + +int central_lfo_value; +int get_central_lfo_value () { + return central_lfo_value; +} +int set_central_lfo_value (int on) { + central_lfo_value = on; +} + // UI signals int* loaded_style_time_stamps; int* get_loaded_style_time_stamps () { diff --git a/src/Core/central_bus.h b/src/Core/central_bus.h index 04df711e..dce07872 100644 --- a/src/Core/central_bus.h +++ b/src/Core/central_bus.h @@ -58,6 +58,10 @@ int get_styles_ready (); void set_styles_ready (int value); int get_central_metronome_on (); + +int get_central_lfo_on (); + +int set_central_lfo_value (int on); /** UI signals are used to communicate with the UI frontend. */ diff --git a/src/Core/metronome_lfo_player.c b/src/Core/metronome_lfo_player.c index 8f2ec55f..90da2617 100644 --- a/src/Core/metronome_lfo_player.c +++ b/src/Core/metronome_lfo_player.c @@ -41,19 +41,18 @@ char* metronome_file_path; int lfo_parse_midi_events (void *data, fluid_midi_event_t *event) { - fluid_midi_event_t* new_event = new_fluid_midi_event (); - - fluid_midi_event_set_channel (new_event, fluid_midi_event_get_channel (event)); - fluid_midi_event_set_control (new_event, fluid_midi_event_get_control (event)); - fluid_midi_event_set_program (new_event, fluid_midi_event_get_program (event)); - fluid_midi_event_set_value (new_event, fluid_midi_event_get_value (event)); - fluid_midi_event_set_velocity (new_event, 105); - fluid_midi_event_set_type (new_event, fluid_midi_event_get_type (event)); - int type = fluid_midi_event_get_type (event); int channel = fluid_midi_event_get_channel (event); int key = fluid_midi_event_get_key (event); + if (channel < 9) + if (get_central_lfo_on () == (channel + 1) && fluid_midi_event_get_control (event) == 16) { + set_central_lfo_value (fluid_midi_event_get_value (event)); + } + else if (channel > 9) + if (get_central_lfo_on () == (channel - 1) && fluid_midi_event_get_control (event) == 16) { + set_central_lfo_value (fluid_midi_event_get_value (event)); + } if (channel == 9) { // Send data to synth if (get_central_metronome_on ()) diff --git a/src/Shell/MainWindow.vala b/src/Shell/MainWindow.vala index 3e39a66b..9cd6d575 100644 --- a/src/Shell/MainWindow.vala +++ b/src/Shell/MainWindow.vala @@ -128,6 +128,7 @@ namespace Ensembles.Shell { }); metronome_player = new Ensembles.Core.MetronomeLFOPlayer (metronome_lfo_directory); + Ensembles.Core.CentralBus.set_lfo_on (1); make_ui_events (); @@ -156,7 +157,8 @@ namespace Ensembles.Shell { bus.loaded_tempo_change.connect ((tempo) => { beat_counter_panel.change_tempo (tempo); main_display_unit.set_tempo_display (tempo); - metronome_player.set_tempo (tempo); + if (metronome_player != null) + metronome_player.set_tempo (tempo); }); bus.split_key_change.connect (() => { main_keyboard.update_split (); @@ -197,6 +199,7 @@ namespace Ensembles.Shell { }); ctrl_panel.start_metronome.connect ((active) => { if (active) { + Ensembles.Core.CentralBus.set_metronome_on (true); metronome_player.play_loop (4, 4); } else { metronome_player.stop_loop (); From f2a447c5f61bf6923930d06af3e48f070af9d79d Mon Sep 17 00:00:00 2001 From: SubhadeepJasu Date: Sun, 11 Jul 2021 17:13:47 +0530 Subject: [PATCH 04/14] Rename master knob --- .../{SuperKnob.vala => MasterKnob.vala} | 4 +- src/Shell/Views/SliderBoardView.vala | 78 +++++++++---------- src/meson.build | 2 +- 3 files changed, 42 insertions(+), 42 deletions(-) rename src/Shell/Common/{SuperKnob.vala => MasterKnob.vala} (97%) diff --git a/src/Shell/Common/SuperKnob.vala b/src/Shell/Common/MasterKnob.vala similarity index 97% rename from src/Shell/Common/SuperKnob.vala rename to src/Shell/Common/MasterKnob.vala index 7640a36f..e94fd0e8 100644 --- a/src/Shell/Common/SuperKnob.vala +++ b/src/Shell/Common/MasterKnob.vala @@ -18,8 +18,8 @@ */ namespace Ensembles.Shell { - public class SuperKnob : Knob { - public SuperKnob () { + public class MasterKnob : Knob { + public MasterKnob () { // Set up visuals center = 40; diff --git a/src/Shell/Views/SliderBoardView.vala b/src/Shell/Views/SliderBoardView.vala index 5d596686..fe534961 100644 --- a/src/Shell/Views/SliderBoardView.vala +++ b/src/Shell/Views/SliderBoardView.vala @@ -23,7 +23,7 @@ namespace Ensembles.Shell { Knob modulator_knob_b; Knob modulator_knob_c; Knob modulator_knob_d; - SuperKnob super_knob; + MasterKnob master_knob; Gtk.Button knob_assign_button; Gtk.Button super_assign_button; Gtk.Button slider_assign_button; @@ -63,7 +63,7 @@ namespace Ensembles.Shell { int[] knob_c_variables; int[] knob_d_variables; - bool[] super_knob_assigns; + bool[] master_knob_assigns; bool super_assign_mode; public SliderBoardView () { @@ -79,11 +79,11 @@ namespace Ensembles.Shell { modulator_knob_c = new Knob (); modulator_knob_d = new Knob (); - super_knob = new SuperKnob (); + master_knob = new MasterKnob (); knob_assign_button = new Gtk.Button.with_label ("Knob Assign"); - super_assign_button = new Gtk.Button.with_label ("Super Assign"); + super_assign_button = new Gtk.Button.with_label ("Master Knob Assign"); var knob_assign_box = new Gtk.ButtonBox (Gtk.Orientation.HORIZONTAL); knob_assign_box.add(knob_assign_button); knob_assign_box.add(super_assign_button); @@ -164,7 +164,7 @@ namespace Ensembles.Shell { attach (modulator_knob_d, 3, 1, 1, 1); attach (new Gtk.Label ("4"), 3, 2, 1, 1); attach (slider_assign_button, 0, 3, 4, 1); - attach (super_knob, 4, 1, 1, 3); + attach (master_knob, 4, 1, 1, 3); attach (slider_grid, 0, 4, 5, 1); @@ -223,7 +223,7 @@ namespace Ensembles.Shell { super_assign_button.clicked.connect (() => { super_assign_mode = !super_assign_mode; - super_knob_assigns = new bool[14]; + master_knob_assigns = new bool[14]; slider_0.get_style_context ().remove_class ("slider-super-controlled"); slider_1.get_style_context ().remove_class ("slider-super-controlled"); slider_2.get_style_context ().remove_class ("slider-super-controlled"); @@ -271,7 +271,7 @@ namespace Ensembles.Shell { } slider_assign_button.sensitive = !super_assign_mode; knob_assign_button.sensitive = !super_assign_mode; - super_knob.set_color (false, 0); + master_knob.set_color (false, 0); }); slider_0.change_value.connect ((scroll, value) => { @@ -289,7 +289,7 @@ namespace Ensembles.Shell { slider_8.get_style_context ().remove_class ("slider-assignable"); slider_9.get_style_context ().remove_class ("slider-assignable"); if (super_assign_mode) { - super_knob_assigns[0] = true; + master_knob_assigns[0] = true; slider_0.get_style_context ().add_class ("slider-super-controlled"); slider_0.get_style_context ().remove_class ("slider-super-assignable"); } @@ -313,7 +313,7 @@ namespace Ensembles.Shell { slider_8.get_style_context ().remove_class ("slider-assignable"); slider_9.get_style_context ().remove_class ("slider-assignable"); if (super_assign_mode) { - super_knob_assigns[1] = true; + master_knob_assigns[1] = true; slider_1.get_style_context ().add_class ("slider-super-controlled"); slider_1.get_style_context ().remove_class ("slider-super-assignable"); } @@ -337,7 +337,7 @@ namespace Ensembles.Shell { slider_8.get_style_context ().remove_class ("slider-assignable"); slider_9.get_style_context ().remove_class ("slider-assignable"); if (super_assign_mode) { - super_knob_assigns[2] = true; + master_knob_assigns[2] = true; slider_2.get_style_context ().add_class ("slider-super-controlled"); slider_2.get_style_context ().remove_class ("slider-super-assignable"); } @@ -361,7 +361,7 @@ namespace Ensembles.Shell { slider_8.get_style_context ().remove_class ("slider-assignable"); slider_9.get_style_context ().remove_class ("slider-assignable"); if (super_assign_mode) { - super_knob_assigns[3] = true; + master_knob_assigns[3] = true; slider_3.get_style_context ().add_class ("slider-super-controlled"); slider_3.get_style_context ().remove_class ("slider-super-assignable"); } @@ -385,7 +385,7 @@ namespace Ensembles.Shell { slider_8.get_style_context ().remove_class ("slider-assignable"); slider_9.get_style_context ().remove_class ("slider-assignable"); if (super_assign_mode) { - super_knob_assigns[4] = true; + master_knob_assigns[4] = true; slider_4.get_style_context ().add_class ("slider-super-controlled"); slider_4.get_style_context ().remove_class ("slider-super-assignable"); } @@ -409,7 +409,7 @@ namespace Ensembles.Shell { slider_8.get_style_context ().remove_class ("slider-assignable"); slider_9.get_style_context ().remove_class ("slider-assignable"); if (super_assign_mode) { - super_knob_assigns[5] = true; + master_knob_assigns[5] = true; slider_5.get_style_context ().add_class ("slider-super-controlled"); slider_5.get_style_context ().remove_class ("slider-super-assignable"); } @@ -433,7 +433,7 @@ namespace Ensembles.Shell { slider_8.get_style_context ().remove_class ("slider-assignable"); slider_9.get_style_context ().remove_class ("slider-assignable"); if (super_assign_mode) { - super_knob_assigns[6] = true; + master_knob_assigns[6] = true; slider_6.get_style_context ().add_class ("slider-super-controlled"); slider_6.get_style_context ().remove_class ("slider-super-assignable"); } @@ -457,7 +457,7 @@ namespace Ensembles.Shell { slider_8.get_style_context ().remove_class ("slider-assignable"); slider_9.get_style_context ().remove_class ("slider-assignable"); if (super_assign_mode) { - super_knob_assigns[7] = true; + master_knob_assigns[7] = true; slider_7.get_style_context ().add_class ("slider-super-controlled"); slider_7.get_style_context ().remove_class ("slider-super-assignable"); } @@ -481,7 +481,7 @@ namespace Ensembles.Shell { slider_7.get_style_context ().remove_class ("slider-assignable"); slider_9.get_style_context ().remove_class ("slider-assignable"); if (super_assign_mode) { - super_knob_assigns[8] = true; + master_knob_assigns[8] = true; slider_8.get_style_context ().add_class ("slider-super-controlled"); slider_8.get_style_context ().remove_class ("slider-super-assignable"); } @@ -505,7 +505,7 @@ namespace Ensembles.Shell { slider_7.get_style_context ().remove_class ("slider-assignable"); slider_8.get_style_context ().remove_class ("slider-assignable"); if (super_assign_mode) { - super_knob_assigns[9] = true; + master_knob_assigns[9] = true; slider_9.get_style_context ().add_class ("slider-super-controlled"); slider_9.get_style_context ().remove_class ("slider-super-assignable"); } @@ -523,7 +523,7 @@ namespace Ensembles.Shell { modulator_knob_c.get_style_context ().remove_class ("knob-assignable"); modulator_knob_d.get_style_context ().remove_class ("knob-assignable"); if (super_assign_mode) { - super_knob_assigns[10] = true; + master_knob_assigns[10] = true; modulator_knob_a.get_style_context ().add_class ("knob-super-controlled"); modulator_knob_a.get_style_context ().remove_class ("knob-super-assignable"); } @@ -540,7 +540,7 @@ namespace Ensembles.Shell { modulator_knob_c.get_style_context ().remove_class ("knob-assignable"); modulator_knob_d.get_style_context ().remove_class ("knob-assignable"); if (super_assign_mode) { - super_knob_assigns[11] = true; + master_knob_assigns[11] = true; modulator_knob_b.get_style_context ().add_class ("knob-super-controlled"); modulator_knob_b.get_style_context ().remove_class ("knob-super-assignable"); } @@ -557,7 +557,7 @@ namespace Ensembles.Shell { modulator_knob_b.get_style_context ().remove_class ("knob-assignable"); modulator_knob_d.get_style_context ().remove_class ("knob-assignable"); if (super_assign_mode) { - super_knob_assigns[12] = true; + master_knob_assigns[12] = true; modulator_knob_c.get_style_context ().add_class ("knob-super-controlled"); modulator_knob_c.get_style_context ().remove_class ("knob-super-assignable"); } @@ -574,7 +574,7 @@ namespace Ensembles.Shell { modulator_knob_b.get_style_context ().remove_class ("knob-assignable"); modulator_knob_c.get_style_context ().remove_class ("knob-assignable"); if (super_assign_mode) { - super_knob_assigns[13] = true; + master_knob_assigns[13] = true; modulator_knob_d.get_style_context ().add_class ("knob-super-controlled"); modulator_knob_d.get_style_context ().remove_class ("knob-super-assignable"); } @@ -583,68 +583,68 @@ namespace Ensembles.Shell { } }); - super_knob.change_value.connect ((value) => { + master_knob.change_value.connect ((value) => { bool assigned = false; - if (super_knob_assigns != null) { - if (super_knob_assigns[0] && slider_0_variables != null) { + if (master_knob_assigns != null) { + if (master_knob_assigns[0] && slider_0_variables != null) { slider_0.set_value (value); Ensembles.Core.Synthesizer.set_modulator_value (slider_0_variables[0], slider_0_variables[1], slider_0_variables[2], (int)(value * 127)); } - if (super_knob_assigns[1] && slider_1_variables != null) { + if (master_knob_assigns[1] && slider_1_variables != null) { slider_1.set_value (value); Ensembles.Core.Synthesizer.set_modulator_value (slider_1_variables[0], slider_1_variables[1], slider_1_variables[2], (int)(value * 127)); } - if (super_knob_assigns[2] && slider_2_variables != null) { + if (master_knob_assigns[2] && slider_2_variables != null) { slider_2.set_value (value); Ensembles.Core.Synthesizer.set_modulator_value (slider_2_variables[0], slider_2_variables[1], slider_2_variables[2], (int)(value * 127)); } - if (super_knob_assigns[3] && slider_3_variables != null) { + if (master_knob_assigns[3] && slider_3_variables != null) { slider_3.set_value (value); Ensembles.Core.Synthesizer.set_modulator_value (slider_3_variables[0], slider_3_variables[1], slider_3_variables[2], (int)(value * 127)); } - if (super_knob_assigns[4] && slider_4_variables != null) { + if (master_knob_assigns[4] && slider_4_variables != null) { slider_4.set_value (value); Ensembles.Core.Synthesizer.set_modulator_value (slider_4_variables[0], slider_4_variables[1], slider_4_variables[2], (int)(value * 127)); } - if (super_knob_assigns[5] && slider_5_variables != null) { + if (master_knob_assigns[5] && slider_5_variables != null) { slider_5.set_value (value); Ensembles.Core.Synthesizer.set_modulator_value (slider_5_variables[0], slider_5_variables[1], slider_5_variables[2], (int)(value * 127)); } - if (super_knob_assigns[6] && slider_6_variables != null) { + if (master_knob_assigns[6] && slider_6_variables != null) { slider_6.set_value (value); Ensembles.Core.Synthesizer.set_modulator_value (slider_6_variables[0], slider_6_variables[1], slider_6_variables[2], (int)(value * 127)); } - if (super_knob_assigns[7] && slider_7_variables != null) { + if (master_knob_assigns[7] && slider_7_variables != null) { slider_7.set_value (value); Ensembles.Core.Synthesizer.set_modulator_value (slider_7_variables[0], slider_7_variables[1], slider_7_variables[2], (int)(value * 127)); } - if (super_knob_assigns[8] && slider_8_variables != null) { + if (master_knob_assigns[8] && slider_8_variables != null) { slider_8.set_value (value); Ensembles.Core.Synthesizer.set_modulator_value (slider_8_variables[0], slider_8_variables[1], slider_8_variables[2], (int)(value * 127)); } - if (super_knob_assigns[9] && slider_9_variables != null) { + if (master_knob_assigns[9] && slider_9_variables != null) { slider_9.set_value (value); Ensembles.Core.Synthesizer.set_modulator_value (slider_9_variables[0], slider_9_variables[1], slider_9_variables[2], (int)(value * 127)); } - if (super_knob_assigns[10] && knob_a_variables != null) { + if (master_knob_assigns[10] && knob_a_variables != null) { modulator_knob_a.set_value (value); Ensembles.Core.Synthesizer.set_modulator_value (knob_a_variables[0], knob_a_variables[1], knob_a_variables[2], (int)(value * 127)); } - if (super_knob_assigns[11] && knob_b_variables != null) { + if (master_knob_assigns[11] && knob_b_variables != null) { modulator_knob_b.set_value (value); Ensembles.Core.Synthesizer.set_modulator_value (knob_b_variables[0], knob_b_variables[1], knob_b_variables[2], (int)(value * 127)); } - if (super_knob_assigns[12] && knob_c_variables != null) { + if (master_knob_assigns[12] && knob_c_variables != null) { modulator_knob_c.set_value (value); Ensembles.Core.Synthesizer.set_modulator_value (knob_c_variables[0], knob_c_variables[1], knob_c_variables[2], (int)(value * 127)); } - if (super_knob_assigns[13] && knob_d_variables != null) { + if (master_knob_assigns[13] && knob_d_variables != null) { modulator_knob_d.set_value (value); Ensembles.Core.Synthesizer.set_modulator_value (knob_d_variables[0], knob_d_variables[1], knob_d_variables[2], (int)(value * 127)); } for (int i = 0; i < 14; i++) { - if (super_knob_assigns[i]) { + if (master_knob_assigns[i]) { assigned = true; break; } @@ -664,7 +664,7 @@ namespace Ensembles.Shell { modulator_knob_b.get_style_context ().remove_class ("knob-super-assignable"); modulator_knob_c.get_style_context ().remove_class ("knob-super-assignable"); modulator_knob_d.get_style_context ().remove_class ("knob-super-assignable"); - super_knob.set_color (assigned, (int)(value * 10)); + master_knob.set_color (assigned, (int)(value * 10)); super_assign_mode = false; slider_assign_button.sensitive = true; knob_assign_button.sensitive = true; diff --git a/src/meson.build b/src/meson.build index 25c325d8..386a26c0 100644 --- a/src/meson.build +++ b/src/meson.build @@ -20,7 +20,7 @@ ensembles_sources_vala = files ( 'Shell/Common/ToggleSwitch.vala', 'Shell/Common/Dial.vala', 'Shell/Common/Knob.vala', - 'Shell/Common/SuperKnob.vala', + 'Shell/Common/MasterKnob.vala', 'Shell/Common/Key.vala', 'Shell/Common/OctaveKeyboard.vala', 'Shell/Common/EqualizerBar.vala', From 3ea03024b7cb433094a2666209878d5d2dadbd17 Mon Sep 17 00:00:00 2001 From: SubhadeepJasu Date: Sun, 11 Jul 2021 21:38:03 +0530 Subject: [PATCH 05/14] Make master knob LFO work --- data/Images/LFO_Graphics/LFO_4_4_0.svg | 8 ++ data/Images/LFO_Graphics/LFO_4_4_1.svg | 9 ++ data/Images/LFO_Graphics/LFO_4_4_10.svg | 10 ++ data/Images/LFO_Graphics/LFO_4_4_11.svg | 9 ++ data/Images/LFO_Graphics/LFO_4_4_12.svg | 10 ++ data/Images/LFO_Graphics/LFO_4_4_13.svg | 12 ++ data/Images/LFO_Graphics/LFO_4_4_14.svg | 12 ++ data/Images/LFO_Graphics/LFO_4_4_15.svg | 13 ++ data/Images/LFO_Graphics/LFO_4_4_2.svg | 10 ++ data/Images/LFO_Graphics/LFO_4_4_3.svg | 12 ++ data/Images/LFO_Graphics/LFO_4_4_4.svg | 9 ++ data/Images/LFO_Graphics/LFO_4_4_5.svg | 10 ++ data/Images/LFO_Graphics/LFO_4_4_6.svg | 12 ++ data/Images/LFO_Graphics/LFO_4_4_7.svg | 12 ++ data/Images/LFO_Graphics/LFO_4_4_8.svg | 9 ++ data/Images/LFO_Graphics/LFO_4_4_9.svg | 10 ++ data/MetronomesAndLFO/4_4.mtlfo | Bin 658 -> 859 bytes data/MetronomesAndLFO/4_4.rg | Bin 11049 -> 11356 bytes ...thub.subhadeepjasu.ensembles.gresource.xml | 19 +++ src/Core/synthesizer.c | 6 +- src/Shell/Display/LFOEditScreen.vala | 74 ++++++++++ src/Shell/Display/MainDisplayCasing.vala | 12 ++ src/Shell/MainWindow.vala | 2 +- src/Shell/Views/SliderBoardView.vala | 135 ++++++++++++++---- src/meson.build | 1 + 25 files changed, 385 insertions(+), 31 deletions(-) create mode 100644 data/Images/LFO_Graphics/LFO_4_4_0.svg create mode 100644 data/Images/LFO_Graphics/LFO_4_4_1.svg create mode 100644 data/Images/LFO_Graphics/LFO_4_4_10.svg create mode 100644 data/Images/LFO_Graphics/LFO_4_4_11.svg create mode 100644 data/Images/LFO_Graphics/LFO_4_4_12.svg create mode 100644 data/Images/LFO_Graphics/LFO_4_4_13.svg create mode 100644 data/Images/LFO_Graphics/LFO_4_4_14.svg create mode 100644 data/Images/LFO_Graphics/LFO_4_4_15.svg create mode 100644 data/Images/LFO_Graphics/LFO_4_4_2.svg create mode 100644 data/Images/LFO_Graphics/LFO_4_4_3.svg create mode 100644 data/Images/LFO_Graphics/LFO_4_4_4.svg create mode 100644 data/Images/LFO_Graphics/LFO_4_4_5.svg create mode 100644 data/Images/LFO_Graphics/LFO_4_4_6.svg create mode 100644 data/Images/LFO_Graphics/LFO_4_4_7.svg create mode 100644 data/Images/LFO_Graphics/LFO_4_4_8.svg create mode 100644 data/Images/LFO_Graphics/LFO_4_4_9.svg create mode 100644 src/Shell/Display/LFOEditScreen.vala diff --git a/data/Images/LFO_Graphics/LFO_4_4_0.svg b/data/Images/LFO_Graphics/LFO_4_4_0.svg new file mode 100644 index 00000000..4dfec798 --- /dev/null +++ b/data/Images/LFO_Graphics/LFO_4_4_0.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/data/Images/LFO_Graphics/LFO_4_4_1.svg b/data/Images/LFO_Graphics/LFO_4_4_1.svg new file mode 100644 index 00000000..03c5bdfa --- /dev/null +++ b/data/Images/LFO_Graphics/LFO_4_4_1.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/data/Images/LFO_Graphics/LFO_4_4_10.svg b/data/Images/LFO_Graphics/LFO_4_4_10.svg new file mode 100644 index 00000000..24c259e1 --- /dev/null +++ b/data/Images/LFO_Graphics/LFO_4_4_10.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/data/Images/LFO_Graphics/LFO_4_4_11.svg b/data/Images/LFO_Graphics/LFO_4_4_11.svg new file mode 100644 index 00000000..8a6115e3 --- /dev/null +++ b/data/Images/LFO_Graphics/LFO_4_4_11.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/data/Images/LFO_Graphics/LFO_4_4_12.svg b/data/Images/LFO_Graphics/LFO_4_4_12.svg new file mode 100644 index 00000000..f69ffd00 --- /dev/null +++ b/data/Images/LFO_Graphics/LFO_4_4_12.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/data/Images/LFO_Graphics/LFO_4_4_13.svg b/data/Images/LFO_Graphics/LFO_4_4_13.svg new file mode 100644 index 00000000..a027325c --- /dev/null +++ b/data/Images/LFO_Graphics/LFO_4_4_13.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/data/Images/LFO_Graphics/LFO_4_4_14.svg b/data/Images/LFO_Graphics/LFO_4_4_14.svg new file mode 100644 index 00000000..84ee022b --- /dev/null +++ b/data/Images/LFO_Graphics/LFO_4_4_14.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/data/Images/LFO_Graphics/LFO_4_4_15.svg b/data/Images/LFO_Graphics/LFO_4_4_15.svg new file mode 100644 index 00000000..3bfc57fb --- /dev/null +++ b/data/Images/LFO_Graphics/LFO_4_4_15.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/data/Images/LFO_Graphics/LFO_4_4_2.svg b/data/Images/LFO_Graphics/LFO_4_4_2.svg new file mode 100644 index 00000000..75d7a435 --- /dev/null +++ b/data/Images/LFO_Graphics/LFO_4_4_2.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/data/Images/LFO_Graphics/LFO_4_4_3.svg b/data/Images/LFO_Graphics/LFO_4_4_3.svg new file mode 100644 index 00000000..52577632 --- /dev/null +++ b/data/Images/LFO_Graphics/LFO_4_4_3.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/data/Images/LFO_Graphics/LFO_4_4_4.svg b/data/Images/LFO_Graphics/LFO_4_4_4.svg new file mode 100644 index 00000000..8bce89ab --- /dev/null +++ b/data/Images/LFO_Graphics/LFO_4_4_4.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/data/Images/LFO_Graphics/LFO_4_4_5.svg b/data/Images/LFO_Graphics/LFO_4_4_5.svg new file mode 100644 index 00000000..5a054f13 --- /dev/null +++ b/data/Images/LFO_Graphics/LFO_4_4_5.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/data/Images/LFO_Graphics/LFO_4_4_6.svg b/data/Images/LFO_Graphics/LFO_4_4_6.svg new file mode 100644 index 00000000..4b85c2cf --- /dev/null +++ b/data/Images/LFO_Graphics/LFO_4_4_6.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/data/Images/LFO_Graphics/LFO_4_4_7.svg b/data/Images/LFO_Graphics/LFO_4_4_7.svg new file mode 100644 index 00000000..46520735 --- /dev/null +++ b/data/Images/LFO_Graphics/LFO_4_4_7.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/data/Images/LFO_Graphics/LFO_4_4_8.svg b/data/Images/LFO_Graphics/LFO_4_4_8.svg new file mode 100644 index 00000000..10fa8c54 --- /dev/null +++ b/data/Images/LFO_Graphics/LFO_4_4_8.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/data/Images/LFO_Graphics/LFO_4_4_9.svg b/data/Images/LFO_Graphics/LFO_4_4_9.svg new file mode 100644 index 00000000..a6b9f94d --- /dev/null +++ b/data/Images/LFO_Graphics/LFO_4_4_9.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/data/MetronomesAndLFO/4_4.mtlfo b/data/MetronomesAndLFO/4_4.mtlfo index ac64cdc316f076a5bd387063b945828f5d023c16..33acc1c4ccf8409a96302686d448651862a03a53 100644 GIT binary patch delta 224 zcmXBK%}N4c07l{WOPwYi>JVCEP{=H_gh0roP$p?3{kZC9QAvxOGAb7hNYP?0pj}?c z;1x)#7F|IXQ(3#`z83i;bXVunzSNRUbi&}Cu))JRy&_j-E><~R;lRb8r_fxStpgE>SkOcSeu-C$;i^cJ&avL(Dcl?D7o+C?sF-1ywp33oF*)p@xl Ldi_ie^Ha}14{a?X delta 32 ocmcc3Hi?zTHzXs4fq{XIfsuiABab@c#M9Q3^BA{Ie#4Xx0D?9NApigX diff --git a/data/MetronomesAndLFO/4_4.rg b/data/MetronomesAndLFO/4_4.rg index 25a79b53b46bfef3f43801183087c9b7b699845d..5603fc6509bcc96e719c01cff8184e080d0da1dc 100644 GIT binary patch literal 11356 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 z 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 CcY(41 diff --git a/data/com.github.subhadeepjasu.ensembles.gresource.xml b/data/com.github.subhadeepjasu.ensembles.gresource.xml index 42b82dcb..cb8cbd51 100644 --- a/data/com.github.subhadeepjasu.ensembles.gresource.xml +++ b/data/com.github.subhadeepjasu.ensembles.gresource.xml @@ -21,4 +21,23 @@ Images/beat_counter_2_0.svg Images/beat_counter_2_1.svg + + + Images/LFO_Graphics/LFO_4_4_0.svg + Images/LFO_Graphics/LFO_4_4_1.svg + Images/LFO_Graphics/LFO_4_4_2.svg + Images/LFO_Graphics/LFO_4_4_3.svg + Images/LFO_Graphics/LFO_4_4_4.svg + Images/LFO_Graphics/LFO_4_4_5.svg + Images/LFO_Graphics/LFO_4_4_6.svg + Images/LFO_Graphics/LFO_4_4_7.svg + Images/LFO_Graphics/LFO_4_4_8.svg + Images/LFO_Graphics/LFO_4_4_9.svg + Images/LFO_Graphics/LFO_4_4_10.svg + Images/LFO_Graphics/LFO_4_4_11.svg + Images/LFO_Graphics/LFO_4_4_12.svg + Images/LFO_Graphics/LFO_4_4_13.svg + Images/LFO_Graphics/LFO_4_4_14.svg + Images/LFO_Graphics/LFO_4_4_15.svg + diff --git a/src/Core/synthesizer.c b/src/Core/synthesizer.c index 57a71b3c..6aa1c2bc 100644 --- a/src/Core/synthesizer.c +++ b/src/Core/synthesizer.c @@ -180,9 +180,9 @@ synthesizer_init (const gchar* loc) { realtime_synth_settings = new_fluid_settings(); fluid_settings_setstr(realtime_synth_settings, "audio.driver", "pulseaudio"); - fluid_settings_setint(realtime_synth_settings, "audio.periods", 3); - fluid_settings_setint(realtime_synth_settings, "audio.period-size", 1024); - fluid_settings_setint(realtime_synth_settings, "audio.realtime-prio", 70); + fluid_settings_setint(realtime_synth_settings, "audio.periods", 4); + fluid_settings_setint(realtime_synth_settings, "audio.period-size", 2048); + fluid_settings_setint(realtime_synth_settings, "audio.realtime-prio", 90); fluid_settings_setnum(realtime_synth_settings, "synth.gain", 2); fluid_settings_setstr(realtime_synth_settings, "synth.midi-bank-select", "gs"); diff --git a/src/Shell/Display/LFOEditScreen.vala b/src/Shell/Display/LFOEditScreen.vala new file mode 100644 index 00000000..64c9a5d1 --- /dev/null +++ b/src/Shell/Display/LFOEditScreen.vala @@ -0,0 +1,74 @@ +namespace Ensembles.Shell { + public class LFOEditScreen : Gtk.Grid { + public signal void close_screen (); + Gtk.Label header; + Gtk.SpinButton lfo_spin_button; + Gtk.Label lfo_type; + + Gtk.Image lfo_graph; + string[] lfo_names = { + "Disabled", + "Sqr 2x (Inverse Phase)", + "Square 4x", + "Sqr 8x (Inverse Phase)", + "Sine (Inverse Phase)", + "Sin 2x (Inverse Phase)", + "Sine 4x", + "Sin 4x (Inverse Phase)", + "Saw 2x", + "Saw 4x", + "Saw 4x (Inverse Phase)", + "Triangular", + "Triangular 2x", + "Dance 1", + "Dance 2", + "Sine 4x (Damping)" + }; + public LFOEditScreen () { + set_size_request (424, 236); + row_spacing = 8; + get_style_context ().add_class ("channel-modulator-screen"); + + var close_button = new Gtk.Button.from_icon_name ("window-close-symbolic", Gtk.IconSize.BUTTON); + close_button.get_style_context ().add_class ("channel-modulator-close-button"); + close_button.clicked.connect (() => { + close_screen (); + }); + attach (close_button, 0, 0, 1, 1); + + header = new Gtk.Label ("Select Master Knob LFO"); + header.get_style_context ().add_class ("channel-modulator-header"); + header.halign = Gtk.Align.START; + header.hexpand = true; + attach (header, 1, 0, 1, 1); + + var mod_grid = new Gtk.Grid (); + mod_grid.column_homogeneous = true; + mod_grid.column_spacing = 6; + mod_grid.get_style_context ().add_class ("channel-modulator-grid"); + + lfo_type = new Gtk.Label ("Disabled"); + lfo_spin_button = new Gtk.SpinButton.with_range (0, 15, 1); + lfo_type.vexpand = true; + lfo_spin_button.vexpand = true; + mod_grid.attach (lfo_spin_button, 0, 0, 1, 1); + mod_grid.attach (lfo_type, 1, 0, 1, 1); + + lfo_graph = new Gtk.Image.from_resource ("/com/github/subhadeepjasu/ensembles/images/lfo_graphics/LFO_4_4_0"); + + mod_grid.attach (lfo_graph, 0, 1, 2, 1); + attach (mod_grid, 0, 1, 2, 1); + show_all (); + + make_events (); + } + public void make_events () { + lfo_spin_button.value_changed.connect (() => { + int index = (int)(lfo_spin_button.value); + lfo_graph.set_from_resource ("/com/github/subhadeepjasu/ensembles/images/lfo_graphics/LFO_4_4_" + index.to_string ()); + lfo_type.set_text (lfo_names[index]); + Ensembles.Core.CentralBus.set_lfo_on (index); + }); + } + } +} \ No newline at end of file diff --git a/src/Shell/Display/MainDisplayCasing.vala b/src/Shell/Display/MainDisplayCasing.vala index 2fd45f5f..17f77dde 100644 --- a/src/Shell/Display/MainDisplayCasing.vala +++ b/src/Shell/Display/MainDisplayCasing.vala @@ -31,6 +31,8 @@ namespace Ensembles.Shell { VoiceMenu voice_menu_r1; VoiceMenu voice_menu_r2; + LFOEditScreen lfo_editor; + public ChannelModulatorScreen channel_mod_screen; public signal void change_style (string path, string name, int tempo); @@ -43,6 +45,7 @@ namespace Ensembles.Shell { voice_menu_r1 = new VoiceMenu (0); voice_menu_r2 = new VoiceMenu (1); channel_mod_screen = new ChannelModulatorScreen (0, 0); + lfo_editor = new LFOEditScreen (); main_stack = new Gtk.Stack (); main_stack.add_named (style_menu, "Styles Menu"); @@ -50,6 +53,7 @@ namespace Ensembles.Shell { main_stack.add_named (voice_menu_r1, "Voice R1 Menu"); main_stack.add_named (voice_menu_r2, "Voice R2 Menu"); main_stack.add_named (channel_mod_screen, "Channel Modulator Screen"); + main_stack.add_named (lfo_editor, "LFO Editor"); splash_screen = new Gtk.Image.from_resource ("/com/github/subhadeepjasu/ensembles/images/display_unit/ensembles_splash.svg"); @@ -148,6 +152,9 @@ namespace Ensembles.Shell { home_screen.set_voice_r2_name (voice.name); this.change_voice (voice, channel); }); + lfo_editor.close_screen.connect (() => { + main_display_leaflet.set_visible_child (home_screen); + }); } public void update_style_list (List paths, List names, List genre, List tempo) { @@ -200,5 +207,10 @@ namespace Ensembles.Shell { main_stack.set_visible_child (channel_mod_screen); channel_mod_screen.set_synth_channel_to_edit (synth_index, channel); } + + public void open_LFO_screen () { + main_display_leaflet.set_visible_child (main_stack); + main_stack.set_visible_child (lfo_editor); + } } } diff --git a/src/Shell/MainWindow.vala b/src/Shell/MainWindow.vala index 9cd6d575..6a4af818 100644 --- a/src/Shell/MainWindow.vala +++ b/src/Shell/MainWindow.vala @@ -128,7 +128,6 @@ namespace Ensembles.Shell { }); metronome_player = new Ensembles.Core.MetronomeLFOPlayer (metronome_lfo_directory); - Ensembles.Core.CentralBus.set_lfo_on (1); make_ui_events (); @@ -267,6 +266,7 @@ namespace Ensembles.Shell { }); main_display_unit.channel_mod_screen.broadcast_assignment.connect (slider_board.send_modulator); slider_board.send_assignable_mode.connect (main_display_unit.channel_mod_screen.set_assignable); + slider_board.open_LFO_editor.connect (main_display_unit.open_LFO_screen); print("Initialized...\n"); } diff --git a/src/Shell/Views/SliderBoardView.vala b/src/Shell/Views/SliderBoardView.vala index fe534961..745c5c4f 100644 --- a/src/Shell/Views/SliderBoardView.vala +++ b/src/Shell/Views/SliderBoardView.vala @@ -25,7 +25,7 @@ namespace Ensembles.Shell { Knob modulator_knob_d; MasterKnob master_knob; Gtk.Button knob_assign_button; - Gtk.Button super_assign_button; + Gtk.Button master_assign_button; Gtk.Button slider_assign_button; Gtk.Scale slider_0; @@ -41,6 +41,7 @@ namespace Ensembles.Shell { public signal void change_modulator (int id, double value); public signal void send_assignable_mode (bool assignable); + public signal void open_LFO_editor (); bool slider_assign_mode; bool knob_assign_mode; @@ -64,7 +65,9 @@ namespace Ensembles.Shell { int[] knob_d_variables; bool[] master_knob_assigns; - bool super_assign_mode; + bool master_assign_mode; + + bool monitoring_lfo = false; public SliderBoardView () { row_spacing = 4; @@ -83,10 +86,10 @@ namespace Ensembles.Shell { knob_assign_button = new Gtk.Button.with_label ("Knob Assign"); - super_assign_button = new Gtk.Button.with_label ("Master Knob Assign"); + master_assign_button = new Gtk.Button.with_label ("Master Knob Assign"); var knob_assign_box = new Gtk.ButtonBox (Gtk.Orientation.HORIZONTAL); knob_assign_box.add(knob_assign_button); - knob_assign_box.add(super_assign_button); + knob_assign_box.add(master_assign_button); knob_assign_box.set_layout (Gtk.ButtonBoxStyle.EXPAND); slider_assign_button = new Gtk.Button.with_label ("Slider Assign"); @@ -175,7 +178,7 @@ namespace Ensembles.Shell { slider_assign_mode = !slider_assign_mode; send_assignable_mode (slider_assign_mode); knob_assign_button.sensitive = !slider_assign_mode; - super_assign_button.sensitive = !slider_assign_mode; + master_assign_button.sensitive = !slider_assign_mode; if (slider_assign_mode) { slider_0.get_style_context ().add_class ("slider-assignable"); slider_1.get_style_context ().add_class ("slider-assignable"); @@ -206,7 +209,7 @@ namespace Ensembles.Shell { knob_assign_mode = !knob_assign_mode; send_assignable_mode (knob_assign_mode); slider_assign_button.sensitive = !knob_assign_mode; - super_assign_button.sensitive = !knob_assign_mode; + master_assign_button.sensitive = !knob_assign_mode; if (knob_assign_mode) { modulator_knob_a.get_style_context ().add_class ("knob-assignable"); modulator_knob_b.get_style_context ().add_class ("knob-assignable"); @@ -221,8 +224,8 @@ namespace Ensembles.Shell { } }); - super_assign_button.clicked.connect (() => { - super_assign_mode = !super_assign_mode; + master_assign_button.clicked.connect (() => { + master_assign_mode = !master_assign_mode; master_knob_assigns = new bool[14]; slider_0.get_style_context ().remove_class ("slider-super-controlled"); slider_1.get_style_context ().remove_class ("slider-super-controlled"); @@ -238,7 +241,7 @@ namespace Ensembles.Shell { modulator_knob_b.get_style_context ().remove_class ("knob-super-controlled"); modulator_knob_c.get_style_context ().remove_class ("knob-super-controlled"); modulator_knob_d.get_style_context ().remove_class ("knob-super-controlled"); - if (super_assign_mode) { + if (master_assign_mode) { slider_0.get_style_context ().add_class ("slider-super-assignable"); slider_1.get_style_context ().add_class ("slider-super-assignable"); slider_2.get_style_context ().add_class ("slider-super-assignable"); @@ -269,8 +272,8 @@ namespace Ensembles.Shell { modulator_knob_c.get_style_context ().remove_class ("knob-super-assignable"); modulator_knob_d.get_style_context ().remove_class ("knob-super-assignable"); } - slider_assign_button.sensitive = !super_assign_mode; - knob_assign_button.sensitive = !super_assign_mode; + slider_assign_button.sensitive = !master_assign_mode; + knob_assign_button.sensitive = !master_assign_mode; master_knob.set_color (false, 0); }); @@ -288,7 +291,7 @@ namespace Ensembles.Shell { slider_7.get_style_context ().remove_class ("slider-assignable"); slider_8.get_style_context ().remove_class ("slider-assignable"); slider_9.get_style_context ().remove_class ("slider-assignable"); - if (super_assign_mode) { + if (master_assign_mode) { master_knob_assigns[0] = true; slider_0.get_style_context ().add_class ("slider-super-controlled"); slider_0.get_style_context ().remove_class ("slider-super-assignable"); @@ -312,7 +315,7 @@ namespace Ensembles.Shell { slider_7.get_style_context ().remove_class ("slider-assignable"); slider_8.get_style_context ().remove_class ("slider-assignable"); slider_9.get_style_context ().remove_class ("slider-assignable"); - if (super_assign_mode) { + if (master_assign_mode) { master_knob_assigns[1] = true; slider_1.get_style_context ().add_class ("slider-super-controlled"); slider_1.get_style_context ().remove_class ("slider-super-assignable"); @@ -336,7 +339,7 @@ namespace Ensembles.Shell { slider_7.get_style_context ().remove_class ("slider-assignable"); slider_8.get_style_context ().remove_class ("slider-assignable"); slider_9.get_style_context ().remove_class ("slider-assignable"); - if (super_assign_mode) { + if (master_assign_mode) { master_knob_assigns[2] = true; slider_2.get_style_context ().add_class ("slider-super-controlled"); slider_2.get_style_context ().remove_class ("slider-super-assignable"); @@ -360,7 +363,7 @@ namespace Ensembles.Shell { slider_7.get_style_context ().remove_class ("slider-assignable"); slider_8.get_style_context ().remove_class ("slider-assignable"); slider_9.get_style_context ().remove_class ("slider-assignable"); - if (super_assign_mode) { + if (master_assign_mode) { master_knob_assigns[3] = true; slider_3.get_style_context ().add_class ("slider-super-controlled"); slider_3.get_style_context ().remove_class ("slider-super-assignable"); @@ -384,7 +387,7 @@ namespace Ensembles.Shell { slider_7.get_style_context ().remove_class ("slider-assignable"); slider_8.get_style_context ().remove_class ("slider-assignable"); slider_9.get_style_context ().remove_class ("slider-assignable"); - if (super_assign_mode) { + if (master_assign_mode) { master_knob_assigns[4] = true; slider_4.get_style_context ().add_class ("slider-super-controlled"); slider_4.get_style_context ().remove_class ("slider-super-assignable"); @@ -408,7 +411,7 @@ namespace Ensembles.Shell { slider_7.get_style_context ().remove_class ("slider-assignable"); slider_8.get_style_context ().remove_class ("slider-assignable"); slider_9.get_style_context ().remove_class ("slider-assignable"); - if (super_assign_mode) { + if (master_assign_mode) { master_knob_assigns[5] = true; slider_5.get_style_context ().add_class ("slider-super-controlled"); slider_5.get_style_context ().remove_class ("slider-super-assignable"); @@ -432,7 +435,7 @@ namespace Ensembles.Shell { slider_7.get_style_context ().remove_class ("slider-assignable"); slider_8.get_style_context ().remove_class ("slider-assignable"); slider_9.get_style_context ().remove_class ("slider-assignable"); - if (super_assign_mode) { + if (master_assign_mode) { master_knob_assigns[6] = true; slider_6.get_style_context ().add_class ("slider-super-controlled"); slider_6.get_style_context ().remove_class ("slider-super-assignable"); @@ -456,7 +459,7 @@ namespace Ensembles.Shell { slider_6.get_style_context ().remove_class ("slider-assignable"); slider_8.get_style_context ().remove_class ("slider-assignable"); slider_9.get_style_context ().remove_class ("slider-assignable"); - if (super_assign_mode) { + if (master_assign_mode) { master_knob_assigns[7] = true; slider_7.get_style_context ().add_class ("slider-super-controlled"); slider_7.get_style_context ().remove_class ("slider-super-assignable"); @@ -480,7 +483,7 @@ namespace Ensembles.Shell { slider_6.get_style_context ().remove_class ("slider-assignable"); slider_7.get_style_context ().remove_class ("slider-assignable"); slider_9.get_style_context ().remove_class ("slider-assignable"); - if (super_assign_mode) { + if (master_assign_mode) { master_knob_assigns[8] = true; slider_8.get_style_context ().add_class ("slider-super-controlled"); slider_8.get_style_context ().remove_class ("slider-super-assignable"); @@ -504,7 +507,7 @@ namespace Ensembles.Shell { slider_6.get_style_context ().remove_class ("slider-assignable"); slider_7.get_style_context ().remove_class ("slider-assignable"); slider_8.get_style_context ().remove_class ("slider-assignable"); - if (super_assign_mode) { + if (master_assign_mode) { master_knob_assigns[9] = true; slider_9.get_style_context ().add_class ("slider-super-controlled"); slider_9.get_style_context ().remove_class ("slider-super-assignable"); @@ -522,7 +525,7 @@ namespace Ensembles.Shell { modulator_knob_b.get_style_context ().remove_class ("knob-assignable"); modulator_knob_c.get_style_context ().remove_class ("knob-assignable"); modulator_knob_d.get_style_context ().remove_class ("knob-assignable"); - if (super_assign_mode) { + if (master_assign_mode) { master_knob_assigns[10] = true; modulator_knob_a.get_style_context ().add_class ("knob-super-controlled"); modulator_knob_a.get_style_context ().remove_class ("knob-super-assignable"); @@ -539,7 +542,7 @@ namespace Ensembles.Shell { modulator_knob_a.get_style_context ().remove_class ("knob-assignable"); modulator_knob_c.get_style_context ().remove_class ("knob-assignable"); modulator_knob_d.get_style_context ().remove_class ("knob-assignable"); - if (super_assign_mode) { + if (master_assign_mode) { master_knob_assigns[11] = true; modulator_knob_b.get_style_context ().add_class ("knob-super-controlled"); modulator_knob_b.get_style_context ().remove_class ("knob-super-assignable"); @@ -556,7 +559,7 @@ namespace Ensembles.Shell { modulator_knob_a.get_style_context ().remove_class ("knob-assignable"); modulator_knob_b.get_style_context ().remove_class ("knob-assignable"); modulator_knob_d.get_style_context ().remove_class ("knob-assignable"); - if (super_assign_mode) { + if (master_assign_mode) { master_knob_assigns[12] = true; modulator_knob_c.get_style_context ().add_class ("knob-super-controlled"); modulator_knob_c.get_style_context ().remove_class ("knob-super-assignable"); @@ -573,7 +576,7 @@ namespace Ensembles.Shell { modulator_knob_a.get_style_context ().remove_class ("knob-assignable"); modulator_knob_b.get_style_context ().remove_class ("knob-assignable"); modulator_knob_c.get_style_context ().remove_class ("knob-assignable"); - if (super_assign_mode) { + if (master_assign_mode) { master_knob_assigns[13] = true; modulator_knob_d.get_style_context ().add_class ("knob-super-controlled"); modulator_knob_d.get_style_context ().remove_class ("knob-super-assignable"); @@ -665,10 +668,19 @@ namespace Ensembles.Shell { modulator_knob_c.get_style_context ().remove_class ("knob-super-assignable"); modulator_knob_d.get_style_context ().remove_class ("knob-super-assignable"); master_knob.set_color (assigned, (int)(value * 10)); - super_assign_mode = false; + if (master_assign_mode) { + open_LFO_editor (); + } + master_assign_mode = false; slider_assign_button.sensitive = true; knob_assign_button.sensitive = true; }); + monitoring_lfo = true; + monitor_lfo (); + } + + ~SliderBoardView () { + monitoring_lfo = false; } public void send_modulator (int synth_index, int channel, int modulator) { @@ -744,7 +756,76 @@ namespace Ensembles.Shell { } slider_assign_button.sensitive = true; knob_assign_button.sensitive = true; - super_assign_button.sensitive = true; + master_assign_button.sensitive = true; + } + + public void monitor_lfo () { + Timeout.add (10, () => { + if (Ensembles.Core.CentralBus.get_lfo_type () > 0) { + float value = Ensembles.Core.CentralBus.get_lfo (); + value = value * 0.8f + 0.1f; + master_knob.set_value (value); + if (master_knob_assigns != null) { + if (master_knob_assigns[0] && slider_0_variables != null) { + slider_0.set_value (value); + Ensembles.Core.Synthesizer.set_modulator_value (slider_0_variables[0], slider_0_variables[1], slider_0_variables[2], (int)(value * 127)); + } + if (master_knob_assigns[1] && slider_1_variables != null) { + slider_1.set_value (value); + Ensembles.Core.Synthesizer.set_modulator_value (slider_1_variables[0], slider_1_variables[1], slider_1_variables[2], (int)(value * 127)); + } + if (master_knob_assigns[2] && slider_2_variables != null) { + slider_2.set_value (value); + Ensembles.Core.Synthesizer.set_modulator_value (slider_2_variables[0], slider_2_variables[1], slider_2_variables[2], (int)(value * 127)); + } + if (master_knob_assigns[3] && slider_3_variables != null) { + slider_3.set_value (value); + Ensembles.Core.Synthesizer.set_modulator_value (slider_3_variables[0], slider_3_variables[1], slider_3_variables[2], (int)(value * 127)); + } + if (master_knob_assigns[4] && slider_4_variables != null) { + slider_4.set_value (value); + Ensembles.Core.Synthesizer.set_modulator_value (slider_4_variables[0], slider_4_variables[1], slider_4_variables[2], (int)(value * 127)); + } + if (master_knob_assigns[5] && slider_5_variables != null) { + slider_5.set_value (value); + Ensembles.Core.Synthesizer.set_modulator_value (slider_5_variables[0], slider_5_variables[1], slider_5_variables[2], (int)(value * 127)); + } + if (master_knob_assigns[6] && slider_6_variables != null) { + slider_6.set_value (value); + Ensembles.Core.Synthesizer.set_modulator_value (slider_6_variables[0], slider_6_variables[1], slider_6_variables[2], (int)(value * 127)); + } + if (master_knob_assigns[7] && slider_7_variables != null) { + slider_7.set_value (value); + Ensembles.Core.Synthesizer.set_modulator_value (slider_7_variables[0], slider_7_variables[1], slider_7_variables[2], (int)(value * 127)); + } + if (master_knob_assigns[8] && slider_8_variables != null) { + slider_8.set_value (value); + Ensembles.Core.Synthesizer.set_modulator_value (slider_8_variables[0], slider_8_variables[1], slider_8_variables[2], (int)(value * 127)); + } + if (master_knob_assigns[9] && slider_9_variables != null) { + slider_9.set_value (value); + Ensembles.Core.Synthesizer.set_modulator_value (slider_9_variables[0], slider_9_variables[1], slider_9_variables[2], (int)(value * 127)); + } + if (master_knob_assigns[10] && knob_a_variables != null) { + modulator_knob_a.set_value (value); + Ensembles.Core.Synthesizer.set_modulator_value (knob_a_variables[0], knob_a_variables[1], knob_a_variables[2], (int)(value * 127)); + } + if (master_knob_assigns[11] && knob_b_variables != null) { + modulator_knob_b.set_value (value); + Ensembles.Core.Synthesizer.set_modulator_value (knob_b_variables[0], knob_b_variables[1], knob_b_variables[2], (int)(value * 127)); + } + if (master_knob_assigns[12] && knob_c_variables != null) { + modulator_knob_c.set_value (value); + Ensembles.Core.Synthesizer.set_modulator_value (knob_c_variables[0], knob_c_variables[1], knob_c_variables[2], (int)(value * 127)); + } + if (master_knob_assigns[13] && knob_d_variables != null) { + modulator_knob_d.set_value (value); + Ensembles.Core.Synthesizer.set_modulator_value (knob_d_variables[0], knob_d_variables[1], knob_d_variables[2], (int)(value * 127)); + } + } + } + return monitoring_lfo; + }); } } } \ No newline at end of file diff --git a/src/meson.build b/src/meson.build index 386a26c0..9404b612 100644 --- a/src/meson.build +++ b/src/meson.build @@ -42,6 +42,7 @@ ensembles_sources_vala = files ( 'Shell/Display/StyleMenu.vala', 'Shell/Display/VoiceMenu.vala', 'Shell/Display/ChannelModulatorScreen.vala', + 'Shell/Display/LFOEditScreen.vala', 'Core/Synthesizer.vala', 'Core/Controller.vala', 'Core/StyleDiscovery.vala', From 58368058e0621ac191e8763b7a3b540bd61fd0cb Mon Sep 17 00:00:00 2001 From: SubhadeepJasu Date: Mon, 12 Jul 2021 09:56:45 +0530 Subject: [PATCH 06/14] Make metronome more reliable --- src/Core/MetronomeLFOPlayer.vala | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/Core/MetronomeLFOPlayer.vala b/src/Core/MetronomeLFOPlayer.vala index f7dfb642..27dec317 100644 --- a/src/Core/MetronomeLFOPlayer.vala +++ b/src/Core/MetronomeLFOPlayer.vala @@ -33,16 +33,24 @@ namespace Ensembles.Core { } public void play_loop (int time_signature_n, int time_signature_d) { - if (!CentralBus.get_style_looping_on ()) { + _time_signature_n = time_signature_n; + _time_signature_d = time_signature_d; + if (!CentralBus.get_style_looping_on () && !looping) { looping = true; - play_measure (time_signature_n, time_signature_d); - Timeout.add (240000/_tempo, () => { - metronome_lfo_player_play (); - return looping; - }); + new Thread ("metronome_loop", loop); } } + int loop () { + play_measure (_time_signature_n, _time_signature_d); + while (looping) { + Thread.usleep ((ulong)(240000/_tempo) * 1000); + metronome_lfo_player_play (); + Thread.yield (); + } + return 0; + } + public void stop_loop () { looping = false; } From 3d11fb0d8d55ee5a5a2a7e87851783002abf18e0 Mon Sep 17 00:00:00 2001 From: SubhadeepJasu Date: Mon, 12 Jul 2021 17:39:04 +0530 Subject: [PATCH 07/14] Fix seg fault on app exit --- data/MetronomesAndLFO/4_4.rg | Bin 11356 -> 14246 bytes src/Core/CentralBus.vala | 2 +- src/Core/metronome_lfo_player.c | 19 +++++++++++-------- src/Shell/Display/LFOEditScreen.vala | 2 +- src/Shell/MainWindow.vala | 3 +++ src/Shell/Views/SliderBoardView.vala | 9 ++++++++- 6 files changed, 24 insertions(+), 11 deletions(-) diff --git a/data/MetronomesAndLFO/4_4.rg b/data/MetronomesAndLFO/4_4.rg index 5603fc6509bcc96e719c01cff8184e080d0da1dc..3606fddcedb1547583bb159209232fc54717d6a7 100644 GIT binary patch literal 14246 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 IT_8aJA1Q^y#sB~S literal 11356 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 9) - if (get_central_lfo_on () == (channel - 1) && fluid_midi_event_get_control (event) == 16) { - set_central_lfo_value (fluid_midi_event_get_value (event)); - } + int lfo_type = get_central_lfo_on (); + if (lfo_type > 0 && lfo_type < 16) { + if (channel < 9) + if (lfo_type == (channel + 1) && fluid_midi_event_get_control (event) == 16) { + set_central_lfo_value (fluid_midi_event_get_value (event)); + } + else if (channel > 9) + if (lfo_type == (channel - 1) && fluid_midi_event_get_control (event) == 16) { + set_central_lfo_value (fluid_midi_event_get_value (event)); + } + } if (channel == 9) { // Send data to synth if (get_central_metronome_on ()) diff --git a/src/Shell/Display/LFOEditScreen.vala b/src/Shell/Display/LFOEditScreen.vala index 64c9a5d1..c25f68ab 100644 --- a/src/Shell/Display/LFOEditScreen.vala +++ b/src/Shell/Display/LFOEditScreen.vala @@ -67,7 +67,7 @@ namespace Ensembles.Shell { int index = (int)(lfo_spin_button.value); lfo_graph.set_from_resource ("/com/github/subhadeepjasu/ensembles/images/lfo_graphics/LFO_4_4_" + index.to_string ()); lfo_type.set_text (lfo_names[index]); - Ensembles.Core.CentralBus.set_lfo_on (index); + Ensembles.Core.CentralBus.set_lfo_type (index); }); } } diff --git a/src/Shell/MainWindow.vala b/src/Shell/MainWindow.vala index 6a4af818..15dfb786 100644 --- a/src/Shell/MainWindow.vala +++ b/src/Shell/MainWindow.vala @@ -267,6 +267,9 @@ namespace Ensembles.Shell { main_display_unit.channel_mod_screen.broadcast_assignment.connect (slider_board.send_modulator); slider_board.send_assignable_mode.connect (main_display_unit.channel_mod_screen.set_assignable); slider_board.open_LFO_editor.connect (main_display_unit.open_LFO_screen); + this.destroy.connect (() => { + slider_board.stop_monitoring (); + }); print("Initialized...\n"); } diff --git a/src/Shell/Views/SliderBoardView.vala b/src/Shell/Views/SliderBoardView.vala index 745c5c4f..5941c2d6 100644 --- a/src/Shell/Views/SliderBoardView.vala +++ b/src/Shell/Views/SliderBoardView.vala @@ -679,10 +679,14 @@ namespace Ensembles.Shell { monitor_lfo (); } - ~SliderBoardView () { + public void stop_monitoring () { monitoring_lfo = false; } + ~SliderBoardView () { + stop_monitoring (); + } + public void send_modulator (int synth_index, int channel, int modulator) { if (slider_assign_mode) { switch (assignable_slider_index) { @@ -762,6 +766,9 @@ namespace Ensembles.Shell { public void monitor_lfo () { Timeout.add (10, () => { if (Ensembles.Core.CentralBus.get_lfo_type () > 0) { + if (!monitoring_lfo) { + return false; + } float value = Ensembles.Core.CentralBus.get_lfo (); value = value * 0.8f + 0.1f; master_knob.set_value (value); From fdd326d93e24469cdec473aaa38bd495ccd473a4 Mon Sep 17 00:00:00 2001 From: SubhadeepJasu Date: Tue, 13 Jul 2021 23:37:02 +0530 Subject: [PATCH 08/14] Update beat counter visuals to be less color focused. --- data/Images/beat_counter_1_0.svg | 37 +++++++++++++++++---------- data/Images/beat_counter_1_1.svg | 38 ++++++++++++++++++---------- data/Images/beat_counter_2_0.svg | 37 +++++++++++++++++---------- data/Images/beat_counter_2_1.svg | 36 ++++++++++++++++---------- src/Shell/Views/BeatCounterView.vala | 11 ++++---- 5 files changed, 98 insertions(+), 61 deletions(-) mode change 100755 => 100644 data/Images/beat_counter_1_0.svg mode change 100755 => 100644 data/Images/beat_counter_1_1.svg mode change 100755 => 100644 data/Images/beat_counter_2_0.svg mode change 100755 => 100644 data/Images/beat_counter_2_1.svg diff --git a/data/Images/beat_counter_1_0.svg b/data/Images/beat_counter_1_0.svg old mode 100755 new mode 100644 index c0691765..5277b2c9 --- a/data/Images/beat_counter_1_0.svg +++ b/data/Images/beat_counter_1_0.svg @@ -1,21 +1,30 @@ - - - - + + + + + - + - - - - - - + + + + + + + - - - + + + + + + + + + + diff --git a/data/Images/beat_counter_1_1.svg b/data/Images/beat_counter_1_1.svg old mode 100755 new mode 100644 index 4d2abfb7..48b54285 --- a/data/Images/beat_counter_1_1.svg +++ b/data/Images/beat_counter_1_1.svg @@ -1,21 +1,31 @@ - - - - + + + + + - + - - - - - - + + + + + + + - - - + + + + + + + + + + + diff --git a/data/Images/beat_counter_2_0.svg b/data/Images/beat_counter_2_0.svg old mode 100755 new mode 100644 index 7266c763..41b6fb07 --- a/data/Images/beat_counter_2_0.svg +++ b/data/Images/beat_counter_2_0.svg @@ -1,21 +1,30 @@ - - - - + + + + + - + - - - - - - + + + + + + + - - - + + + + + + + + + + diff --git a/data/Images/beat_counter_2_1.svg b/data/Images/beat_counter_2_1.svg old mode 100755 new mode 100644 index 33588fc3..f61a54a0 --- a/data/Images/beat_counter_2_1.svg +++ b/data/Images/beat_counter_2_1.svg @@ -1,21 +1,29 @@ - - - - + + + + + - + - - - - - - + + + + + + + - - - + + + + + + + + + diff --git a/src/Shell/Views/BeatCounterView.vala b/src/Shell/Views/BeatCounterView.vala index da5f97fa..9cfebcae 100644 --- a/src/Shell/Views/BeatCounterView.vala +++ b/src/Shell/Views/BeatCounterView.vala @@ -42,6 +42,7 @@ namespace Ensembles.Shell { beat_counter_1 = new Gtk.Image.from_resource ("/com/github/subhadeepjasu/ensembles/images/beat_counter/beat_counter_2_0.svg"); beat_counter_2 = new Gtk.Image.from_resource ("/com/github/subhadeepjasu/ensembles/images/beat_counter/beat_counter_2_0.svg"); beat_counter_3 = new Gtk.Image.from_resource ("/com/github/subhadeepjasu/ensembles/images/beat_counter/beat_counter_2_0.svg"); + beat_counter_0.margin_top = 1; beat_counter_1.margin_top = 3; beat_counter_2.margin_top = 3; beat_counter_3.margin_top = 3; @@ -64,9 +65,9 @@ namespace Ensembles.Shell { beat_counter_active_1 = new Gtk.Image.from_resource ("/com/github/subhadeepjasu/ensembles/images/beat_counter/beat_counter_2_1.svg"); beat_counter_active_2 = new Gtk.Image.from_resource ("/com/github/subhadeepjasu/ensembles/images/beat_counter/beat_counter_2_1.svg"); beat_counter_active_3 = new Gtk.Image.from_resource ("/com/github/subhadeepjasu/ensembles/images/beat_counter/beat_counter_2_1.svg"); - beat_counter_active_1.margin_top = 3; - beat_counter_active_2.margin_top = 3; - beat_counter_active_3.margin_top = 3; + beat_counter_active_1.margin_top = 2; + beat_counter_active_2.margin_top = 2; + beat_counter_active_3.margin_top = 2; beat_counter_active_0.opacity = 0; beat_counter_active_1.opacity = 0; beat_counter_active_2.opacity = 0; @@ -76,13 +77,13 @@ namespace Ensembles.Shell { overlay_grid.attach (beat_counter_active_1, 1, 0, 1, 1); overlay_grid.attach (beat_counter_active_2, 2, 0, 1, 1); overlay_grid.attach (beat_counter_active_3, 3, 0, 1, 1); - overlay_grid.margin_top = 5; + overlay_grid.margin_top = 7; this.add_overlay (main_grid); this.add_overlay (overlay_grid); this.show_all (); this.set_overlay_pass_through (overlay_grid, true); - this.width_request = 170; + this.width_request = 190; this.height_request = 34; } From 67c290befba8a5205be3b49d25306714d664e8e2 Mon Sep 17 00:00:00 2001 From: SubhadeepJasu Date: Tue, 13 Jul 2021 23:56:57 +0530 Subject: [PATCH 09/14] Prevent crash on playing metronome for the first time --- src/Core/MetronomeLFOPlayer.vala | 8 +++++--- src/Shell/MainWindow.vala | 3 +++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Core/MetronomeLFOPlayer.vala b/src/Core/MetronomeLFOPlayer.vala index 27dec317..fdb92ea9 100644 --- a/src/Core/MetronomeLFOPlayer.vala +++ b/src/Core/MetronomeLFOPlayer.vala @@ -6,6 +6,7 @@ namespace Ensembles.Core { string _lfo_file_location; int _tempo = 120; public bool looping; + public signal void beat_sync (); public MetronomeLFOPlayer (string lfo_directory_location) { _lfo_directory_location = lfo_directory_location; metronome_lfo_player_init (); @@ -14,8 +15,8 @@ namespace Ensembles.Core { metronome_lfo_player_destruct (); } - public void play_measure (int time_signature_n, int time_signature_d) { - if (_time_signature_n != time_signature_n || _time_signature_d != time_signature_d) { + public void play_measure (int time_signature_n, int time_signature_d, bool? initial = false) { + if (_time_signature_n != time_signature_n || _time_signature_d != time_signature_d || initial) { _time_signature_n = time_signature_n; _time_signature_d = time_signature_d; _lfo_file_location = _lfo_directory_location + "/" + @@ -42,8 +43,9 @@ namespace Ensembles.Core { } int loop () { - play_measure (_time_signature_n, _time_signature_d); + play_measure (_time_signature_n, _time_signature_d, true); while (looping) { + beat_sync (); Thread.usleep ((ulong)(240000/_tempo) * 1000); metronome_lfo_player_play (); Thread.yield (); diff --git a/src/Shell/MainWindow.vala b/src/Shell/MainWindow.vala index 15dfb786..7ab1b0b5 100644 --- a/src/Shell/MainWindow.vala +++ b/src/Shell/MainWindow.vala @@ -267,6 +267,9 @@ namespace Ensembles.Shell { main_display_unit.channel_mod_screen.broadcast_assignment.connect (slider_board.send_modulator); slider_board.send_assignable_mode.connect (main_display_unit.channel_mod_screen.set_assignable); slider_board.open_LFO_editor.connect (main_display_unit.open_LFO_screen); + metronome_player.beat_sync.connect (() => { + beat_counter_panel.sync (); + }); this.destroy.connect (() => { slider_board.stop_monitoring (); }); From 6bb3a196b1b4b7d694d87a454def257906cff05e Mon Sep 17 00:00:00 2001 From: SubhadeepJasu Date: Wed, 14 Jul 2021 23:46:28 +0530 Subject: [PATCH 10/14] Make rest of the LFO waveforms --- data/Images/beat_counter_1_0.svg | 4 ++-- data/Images/beat_counter_1_1.svg | 16 ++++++++-------- data/Images/beat_counter_2_0.svg | 12 ++++++------ data/Images/beat_counter_2_1.svg | 25 +++++++++++++------------ data/MetronomesAndLFO/4_4.mtlfo | Bin 859 -> 4219 bytes data/MetronomesAndLFO/4_4.rg | Bin 14246 -> 15642 bytes src/Core/metronome_lfo_player.c | 7 ++++--- src/Shell/Views/BeatCounterView.vala | 2 ++ 8 files changed, 35 insertions(+), 31 deletions(-) diff --git a/data/Images/beat_counter_1_0.svg b/data/Images/beat_counter_1_0.svg index 5277b2c9..bec81ca7 100644 --- a/data/Images/beat_counter_1_0.svg +++ b/data/Images/beat_counter_1_0.svg @@ -1,5 +1,5 @@ - + @@ -24,7 +24,7 @@ - + diff --git a/data/Images/beat_counter_1_1.svg b/data/Images/beat_counter_1_1.svg index 48b54285..be98277b 100644 --- a/data/Images/beat_counter_1_1.svg +++ b/data/Images/beat_counter_1_1.svg @@ -1,11 +1,11 @@ - + - + - + - + @@ -15,17 +15,17 @@ - + - + - - + + diff --git a/data/Images/beat_counter_2_0.svg b/data/Images/beat_counter_2_0.svg index 41b6fb07..e1c60b25 100644 --- a/data/Images/beat_counter_2_0.svg +++ b/data/Images/beat_counter_2_0.svg @@ -1,11 +1,11 @@ - + - + - + - + @@ -21,10 +21,10 @@ - + - + diff --git a/data/Images/beat_counter_2_1.svg b/data/Images/beat_counter_2_1.svg index f61a54a0..bba92d43 100644 --- a/data/Images/beat_counter_2_1.svg +++ b/data/Images/beat_counter_2_1.svg @@ -1,29 +1,30 @@ - - + + - + - + - + - + - - - - + + + + - + - + + diff --git a/data/MetronomesAndLFO/4_4.mtlfo b/data/MetronomesAndLFO/4_4.mtlfo index 33acc1c4ccf8409a96302686d448651862a03a53..f9e6548fcdd0340f78f04ae08ae2f500a377acb6 100644 GIT binary patch literal 4219 zcma)S@#tyzwhrQ|WrGBf_d!7-spp>zy-cstSQddOs12RfKT|&vX{Cn`Pr6WDtFY6g!-ngsY zublNerQSbIPjwlkpKPP#TlM$g`|TsWKNG#7Bm1t4p*!O54=SpEuha*}sje=gw1?XJ zzpn>R_l~f9Cs=$l>sxu}^{prQ;-kF!uma-`N_}`7jH)t|(kk!V;>kE$ecbD1(cz}e zbQ|MoMiLBK^rYx$$4(Jzqwy@>VO(!eH-(y^_B!>wm|X;W3AbT)(w3yBg8_$JGovkB zOE44XRyX-UHZSrx&)X}M4xXNPZc9yz*itXHoY_+!RgCyfsgI5`qPmPyj{PnkrFhWB zlAl{}J;c=zxg>*OdK)+yBWV+M@HOFTpf-c*r{<)_9tzV0$tGIEbT`rGCl}``%rvsl z!fKSw6vZgJ7VorEdV~E}c^D-x(kAA@Ov891xhR8;^n~baCK;e5LO6}DgZggNS?XTF zou)BOyn(hD-9GxFkDHL2h)L2-yFrhe0XJD6SG@Y1n_lje zbv=x+-$E(Hewv2?)=gGj-0?8yWm13{WZevUw7O1%q@PHDpcgYhZM3Wl3?Bg>VLx#% zX*Z`$228SEMmWfpaE{hQ=>eY ztTC7>W0PHjE**jnFLscKAA)#%oCu*_jDM|9;_sIV>Dzl=?w?fh;7>|@a$Fu%mr+V; zcWbjlESMV2giD*9lc1XP`soN_i4+#?G=vNdnn5CV;)ndRXw153$w2ZkYYBwrdaVqMh$G`S=i zrPAEokuvab-$NnD zaE{fpY+m5e@XM%c!p~4kC;O~|`Y%d-b{y*JGL(hULeL_bz;30zm2QXrR^7G7TbQ(% zv$>sQ)#gEx9fwkl-cldKCj%gfZPA{fH_bpR**IefCTwOMZriLnY|0j^yd{Ydg*dSU zDTk9bnHC0<7A)Q9 zH!L36+Be4YF0X{4)ww6~JH^6QVKc8j7y9SasJ|-pc@_Wsfb8AY)t@fe^8L9zqTYS^ zrgcQwBL`29SX+%%?k&r^FZ7l#Dv|k{QeRZjTqbSRWt5^kX{OM|TAD?R`8d-Zyq+T0 z%DDuYHcqx;CuoZ6V)w|XsMF1H*Jdk8zJ-NT%qF>(WYi{`qCZKuO@~7=My#1oGal)} zHIx!%EeY1*ET))Ga@}EEwzTPx3R~$Ewqns_5sG4pmfA9~DBCu90TyRI!BmQ|cCt48 zj*ikPhlEYU(OS%wm;0}<*uy%{jpF+9*1g9Y%SH8N#X)~p>dWICR9%L;h1(5O*#xJH+HgE?**>rGJE;*XX=V zYKZ0m8Z&r%s6BXE_dKH{?Vsb`$V;R6s)G9;N_}-4?&>mBD~3(bA(keU(#6nYGiWp7 za3#rvet2y{XrX$bDOReJ3TkudMH6M5OXYXtkUsCmcNOdLBvjpCiO))HfBx z-z)XaafqwSD7}C<(@0mC)(9~fgaW-ukD2>nZZ~R7H^RK$K(2u^O&U;-Y#byNBGyPq zrk7XG&dfYYh@1RRt5|iKOarGHv7XZ6X8LaB^i6I%*L1qb2-MaJa&>P8!P~t zBgn^$pt{LidD-%sO>MbwpUcae+v?kj<^NRb+v6;+E@LFaXd6=j=KZV&xgVft@phV0 z7yD(xvMwahoQn~YaiPZn zeZrzkv&~J5Cz-PSk!L51RI^zZ{W9un=H1 z&3YHB0d7ZlGr)L2lc0eBr!CTHl4)8kPDSXG_YwV{ZKjKxUCdfc1{k&U%X1cIWE6GL dXX*QFgv+w>RVL1IwTsa-7rV$FJoQMr{SWTF%I^RG delta 159 zcmeyZaGQCA#ZCeh)&kXO0`=WzS^n!Y_=Xf^1KpCx K@PG0z&Kv+}7$7YG diff --git a/data/MetronomesAndLFO/4_4.rg b/data/MetronomesAndLFO/4_4.rg index 3606fddcedb1547583bb159209232fc54717d6a7..94e3a1940e3a080ebe31ba6f05e20c11f99087bc 100644 GIT binary patch literal 15642 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 IT_8aJA1Q^y#sB~S diff --git a/src/Core/metronome_lfo_player.c b/src/Core/metronome_lfo_player.c index 4a480840..f2e2e89e 100644 --- a/src/Core/metronome_lfo_player.c +++ b/src/Core/metronome_lfo_player.c @@ -47,14 +47,15 @@ lfo_parse_midi_events (void *data, fluid_midi_event_t *event) { int lfo_type = get_central_lfo_on (); if (lfo_type > 0 && lfo_type < 16) { - if (channel < 9) + if (lfo_type < 10) { if (lfo_type == (channel + 1) && fluid_midi_event_get_control (event) == 16) { set_central_lfo_value (fluid_midi_event_get_value (event)); } - else if (channel > 9) - if (lfo_type == (channel - 1) && fluid_midi_event_get_control (event) == 16) { + } else if (lfo_type > 9) { + if (lfo_type == channel && fluid_midi_event_get_control (event) == 16) { set_central_lfo_value (fluid_midi_event_get_value (event)); } + } } if (channel == 9) { // Send data to synth diff --git a/src/Shell/Views/BeatCounterView.vala b/src/Shell/Views/BeatCounterView.vala index 9cfebcae..b439a24b 100644 --- a/src/Shell/Views/BeatCounterView.vala +++ b/src/Shell/Views/BeatCounterView.vala @@ -46,6 +46,7 @@ namespace Ensembles.Shell { beat_counter_1.margin_top = 3; beat_counter_2.margin_top = 3; beat_counter_3.margin_top = 3; + main_grid.column_spacing = 1; @@ -66,6 +67,7 @@ namespace Ensembles.Shell { beat_counter_active_2 = new Gtk.Image.from_resource ("/com/github/subhadeepjasu/ensembles/images/beat_counter/beat_counter_2_1.svg"); beat_counter_active_3 = new Gtk.Image.from_resource ("/com/github/subhadeepjasu/ensembles/images/beat_counter/beat_counter_2_1.svg"); beat_counter_active_1.margin_top = 2; + beat_counter_active_1.margin_start = 1; beat_counter_active_2.margin_top = 2; beat_counter_active_3.margin_top = 2; beat_counter_active_0.opacity = 0; From 8bfc968d54490457485bb0584fcf8b776cf00689 Mon Sep 17 00:00:00 2001 From: SubhadeepJasu Date: Thu, 15 Jul 2021 12:24:41 +0530 Subject: [PATCH 11/14] Make slider ui automation calls async --- src/Core/MetronomeLFOPlayer.vala | 5 +- src/Core/metronome_lfo_player.c | 1 - src/Shell/Views/SliderBoardView.vala | 121 ++++++++++++++------------- 3 files changed, 66 insertions(+), 61 deletions(-) diff --git a/src/Core/MetronomeLFOPlayer.vala b/src/Core/MetronomeLFOPlayer.vala index fdb92ea9..56da3fb1 100644 --- a/src/Core/MetronomeLFOPlayer.vala +++ b/src/Core/MetronomeLFOPlayer.vala @@ -45,7 +45,10 @@ namespace Ensembles.Core { int loop () { play_measure (_time_signature_n, _time_signature_d, true); while (looping) { - beat_sync (); + Idle.add (() => { + beat_sync (); + return false; + }); Thread.usleep ((ulong)(240000/_tempo) * 1000); metronome_lfo_player_play (); Thread.yield (); diff --git a/src/Core/metronome_lfo_player.c b/src/Core/metronome_lfo_player.c index f2e2e89e..a278d24b 100644 --- a/src/Core/metronome_lfo_player.c +++ b/src/Core/metronome_lfo_player.c @@ -97,7 +97,6 @@ metronome_lfo_player_change_base (const char* mid_file, int tempo, int eol) { } fluid_player_set_tempo (lfo_player, FLUID_PLAYER_TEMPO_EXTERNAL_BPM, (double)tempo); fluid_player_play (lfo_player); - printf ("d:\n"); } void diff --git a/src/Shell/Views/SliderBoardView.vala b/src/Shell/Views/SliderBoardView.vala index 5941c2d6..0fc2a20f 100644 --- a/src/Shell/Views/SliderBoardView.vala +++ b/src/Shell/Views/SliderBoardView.vala @@ -770,66 +770,69 @@ namespace Ensembles.Shell { return false; } float value = Ensembles.Core.CentralBus.get_lfo (); - value = value * 0.8f + 0.1f; - master_knob.set_value (value); - if (master_knob_assigns != null) { - if (master_knob_assigns[0] && slider_0_variables != null) { - slider_0.set_value (value); - Ensembles.Core.Synthesizer.set_modulator_value (slider_0_variables[0], slider_0_variables[1], slider_0_variables[2], (int)(value * 127)); + Idle.add (() => { + value = value * 0.8f + 0.1f; + master_knob.set_value (value); + if (master_knob_assigns != null) { + if (master_knob_assigns[0] && slider_0_variables != null) { + slider_0.set_value (value); + Ensembles.Core.Synthesizer.set_modulator_value (slider_0_variables[0], slider_0_variables[1], slider_0_variables[2], (int)(value * 127)); + } + if (master_knob_assigns[1] && slider_1_variables != null) { + slider_1.set_value (value); + Ensembles.Core.Synthesizer.set_modulator_value (slider_1_variables[0], slider_1_variables[1], slider_1_variables[2], (int)(value * 127)); + } + if (master_knob_assigns[2] && slider_2_variables != null) { + slider_2.set_value (value); + Ensembles.Core.Synthesizer.set_modulator_value (slider_2_variables[0], slider_2_variables[1], slider_2_variables[2], (int)(value * 127)); + } + if (master_knob_assigns[3] && slider_3_variables != null) { + slider_3.set_value (value); + Ensembles.Core.Synthesizer.set_modulator_value (slider_3_variables[0], slider_3_variables[1], slider_3_variables[2], (int)(value * 127)); + } + if (master_knob_assigns[4] && slider_4_variables != null) { + slider_4.set_value (value); + Ensembles.Core.Synthesizer.set_modulator_value (slider_4_variables[0], slider_4_variables[1], slider_4_variables[2], (int)(value * 127)); + } + if (master_knob_assigns[5] && slider_5_variables != null) { + slider_5.set_value (value); + Ensembles.Core.Synthesizer.set_modulator_value (slider_5_variables[0], slider_5_variables[1], slider_5_variables[2], (int)(value * 127)); + } + if (master_knob_assigns[6] && slider_6_variables != null) { + slider_6.set_value (value); + Ensembles.Core.Synthesizer.set_modulator_value (slider_6_variables[0], slider_6_variables[1], slider_6_variables[2], (int)(value * 127)); + } + if (master_knob_assigns[7] && slider_7_variables != null) { + slider_7.set_value (value); + Ensembles.Core.Synthesizer.set_modulator_value (slider_7_variables[0], slider_7_variables[1], slider_7_variables[2], (int)(value * 127)); + } + if (master_knob_assigns[8] && slider_8_variables != null) { + slider_8.set_value (value); + Ensembles.Core.Synthesizer.set_modulator_value (slider_8_variables[0], slider_8_variables[1], slider_8_variables[2], (int)(value * 127)); + } + if (master_knob_assigns[9] && slider_9_variables != null) { + slider_9.set_value (value); + Ensembles.Core.Synthesizer.set_modulator_value (slider_9_variables[0], slider_9_variables[1], slider_9_variables[2], (int)(value * 127)); + } + if (master_knob_assigns[10] && knob_a_variables != null) { + modulator_knob_a.set_value (value); + Ensembles.Core.Synthesizer.set_modulator_value (knob_a_variables[0], knob_a_variables[1], knob_a_variables[2], (int)(value * 127)); + } + if (master_knob_assigns[11] && knob_b_variables != null) { + modulator_knob_b.set_value (value); + Ensembles.Core.Synthesizer.set_modulator_value (knob_b_variables[0], knob_b_variables[1], knob_b_variables[2], (int)(value * 127)); + } + if (master_knob_assigns[12] && knob_c_variables != null) { + modulator_knob_c.set_value (value); + Ensembles.Core.Synthesizer.set_modulator_value (knob_c_variables[0], knob_c_variables[1], knob_c_variables[2], (int)(value * 127)); + } + if (master_knob_assigns[13] && knob_d_variables != null) { + modulator_knob_d.set_value (value); + Ensembles.Core.Synthesizer.set_modulator_value (knob_d_variables[0], knob_d_variables[1], knob_d_variables[2], (int)(value * 127)); + } } - if (master_knob_assigns[1] && slider_1_variables != null) { - slider_1.set_value (value); - Ensembles.Core.Synthesizer.set_modulator_value (slider_1_variables[0], slider_1_variables[1], slider_1_variables[2], (int)(value * 127)); - } - if (master_knob_assigns[2] && slider_2_variables != null) { - slider_2.set_value (value); - Ensembles.Core.Synthesizer.set_modulator_value (slider_2_variables[0], slider_2_variables[1], slider_2_variables[2], (int)(value * 127)); - } - if (master_knob_assigns[3] && slider_3_variables != null) { - slider_3.set_value (value); - Ensembles.Core.Synthesizer.set_modulator_value (slider_3_variables[0], slider_3_variables[1], slider_3_variables[2], (int)(value * 127)); - } - if (master_knob_assigns[4] && slider_4_variables != null) { - slider_4.set_value (value); - Ensembles.Core.Synthesizer.set_modulator_value (slider_4_variables[0], slider_4_variables[1], slider_4_variables[2], (int)(value * 127)); - } - if (master_knob_assigns[5] && slider_5_variables != null) { - slider_5.set_value (value); - Ensembles.Core.Synthesizer.set_modulator_value (slider_5_variables[0], slider_5_variables[1], slider_5_variables[2], (int)(value * 127)); - } - if (master_knob_assigns[6] && slider_6_variables != null) { - slider_6.set_value (value); - Ensembles.Core.Synthesizer.set_modulator_value (slider_6_variables[0], slider_6_variables[1], slider_6_variables[2], (int)(value * 127)); - } - if (master_knob_assigns[7] && slider_7_variables != null) { - slider_7.set_value (value); - Ensembles.Core.Synthesizer.set_modulator_value (slider_7_variables[0], slider_7_variables[1], slider_7_variables[2], (int)(value * 127)); - } - if (master_knob_assigns[8] && slider_8_variables != null) { - slider_8.set_value (value); - Ensembles.Core.Synthesizer.set_modulator_value (slider_8_variables[0], slider_8_variables[1], slider_8_variables[2], (int)(value * 127)); - } - if (master_knob_assigns[9] && slider_9_variables != null) { - slider_9.set_value (value); - Ensembles.Core.Synthesizer.set_modulator_value (slider_9_variables[0], slider_9_variables[1], slider_9_variables[2], (int)(value * 127)); - } - if (master_knob_assigns[10] && knob_a_variables != null) { - modulator_knob_a.set_value (value); - Ensembles.Core.Synthesizer.set_modulator_value (knob_a_variables[0], knob_a_variables[1], knob_a_variables[2], (int)(value * 127)); - } - if (master_knob_assigns[11] && knob_b_variables != null) { - modulator_knob_b.set_value (value); - Ensembles.Core.Synthesizer.set_modulator_value (knob_b_variables[0], knob_b_variables[1], knob_b_variables[2], (int)(value * 127)); - } - if (master_knob_assigns[12] && knob_c_variables != null) { - modulator_knob_c.set_value (value); - Ensembles.Core.Synthesizer.set_modulator_value (knob_c_variables[0], knob_c_variables[1], knob_c_variables[2], (int)(value * 127)); - } - if (master_knob_assigns[13] && knob_d_variables != null) { - modulator_knob_d.set_value (value); - Ensembles.Core.Synthesizer.set_modulator_value (knob_d_variables[0], knob_d_variables[1], knob_d_variables[2], (int)(value * 127)); - } - } + return false; + }); } return monitoring_lfo; }); From 1cd07af3e893664393c2177682f57d345d23e106 Mon Sep 17 00:00:00 2001 From: SubhadeepJasu Date: Thu, 15 Jul 2021 14:18:49 +0530 Subject: [PATCH 12/14] Prepare Prerelease 0.0.1 Alpha --- .gitignore | 2 ++ README.md | 17 +++++++++-------- .../128/com.github.subhadeepjasu.ensembles.svg | 10 +++++----- .../24/com.github.subhadeepjasu.ensembles.svg | 4 ++-- .../32/com.github.subhadeepjasu.ensembles.svg | 12 ++++++------ .../48/com.github.subhadeepjasu.ensembles.svg | 10 +++++----- .../64/com.github.subhadeepjasu.ensembles.svg | 12 ++++++------ 7 files changed, 35 insertions(+), 32 deletions(-) diff --git a/.gitignore b/.gitignore index 646143b8..837dbf96 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,10 @@ build _build builddir +subhadeepjasu .vscode .flatpak-builder +*.flatpak *.tar.gz null.d ~* diff --git a/README.md b/README.md index 47d3df5d..e095ce95 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,8 @@ TBD ## Install from source You can install Ensembles by compiling it from source, here's a list of required dependencies: + - `io.elementary.Platform` (flatpak) + - `io.elementary.Sdk` (flatpak) - `elementary-sdk` - `gtk+-3.0>=3.18` - `granite>=5.3.0` @@ -52,7 +54,13 @@ Clone repository and change directory git clone https://github.com/SubhadeepJasu/ensembles.git cd ensembles ``` -Compile, install using meson and start Ensembles on your system *(Requires GIT-LFS)* +Compile, install using flatpak and start Ensembles on your system *(Recommended)* +``` +flatpak-builder build com.github.subhadeepjasu.ensembles.yml --user --install --force-clean +flatpak run com.github.subhadeepjasu.ensembles + +``` +_OR_ using meson *(Requires GIT-LFS)* ``` meson _build --prefix=/usr cd _build @@ -60,13 +68,6 @@ sudo ninja install com.github.subhadeepjasu.ensembles ``` -... _OR_ as flatpak *(Does not require GIT-LFS)* -``` -flatpak-builder build com.github.subhadeepjasu.ensembles.yml --user --install --force-clean -flatpak run com.github.subhadeepjasu.ensembles - -``` - ## Realtime Audio Performance The software does require quiet a lot of CPU power. If you notice bad delay or stuttering audio, launch the app from terminal; check to see if there is any error messages stating that fluidsynth was unable to set realtime priority. In that case, edit the file- `/etc/security/limits.conf` and add the following lines: ``` diff --git a/data/icons/128/com.github.subhadeepjasu.ensembles.svg b/data/icons/128/com.github.subhadeepjasu.ensembles.svg index 3b559d60..f833964e 100644 --- a/data/icons/128/com.github.subhadeepjasu.ensembles.svg +++ b/data/icons/128/com.github.subhadeepjasu.ensembles.svg @@ -118,11 +118,11 @@ - + - + - + @@ -367,7 +367,7 @@ - + @@ -381,7 +381,7 @@ - + diff --git a/data/icons/24/com.github.subhadeepjasu.ensembles.svg b/data/icons/24/com.github.subhadeepjasu.ensembles.svg index 0aa5a461..03762cef 100644 --- a/data/icons/24/com.github.subhadeepjasu.ensembles.svg +++ b/data/icons/24/com.github.subhadeepjasu.ensembles.svg @@ -51,7 +51,7 @@ - + @@ -131,7 +131,7 @@ - + diff --git a/data/icons/32/com.github.subhadeepjasu.ensembles.svg b/data/icons/32/com.github.subhadeepjasu.ensembles.svg index 96dac04e..dfcb9f14 100644 --- a/data/icons/32/com.github.subhadeepjasu.ensembles.svg +++ b/data/icons/32/com.github.subhadeepjasu.ensembles.svg @@ -21,7 +21,7 @@ - + @@ -87,11 +87,11 @@ - + - + - + @@ -225,7 +225,7 @@ - + @@ -239,7 +239,7 @@ - + diff --git a/data/icons/48/com.github.subhadeepjasu.ensembles.svg b/data/icons/48/com.github.subhadeepjasu.ensembles.svg index 270cf523..55f68f9f 100644 --- a/data/icons/48/com.github.subhadeepjasu.ensembles.svg +++ b/data/icons/48/com.github.subhadeepjasu.ensembles.svg @@ -78,11 +78,11 @@ - + - + - + @@ -238,7 +238,7 @@ - + @@ -252,7 +252,7 @@ - + diff --git a/data/icons/64/com.github.subhadeepjasu.ensembles.svg b/data/icons/64/com.github.subhadeepjasu.ensembles.svg index 6ef1774c..ad42eba1 100644 --- a/data/icons/64/com.github.subhadeepjasu.ensembles.svg +++ b/data/icons/64/com.github.subhadeepjasu.ensembles.svg @@ -27,7 +27,7 @@ - + @@ -80,11 +80,11 @@ - + - + - + @@ -244,7 +244,7 @@ - + @@ -258,7 +258,7 @@ - + From 05d72fbd28f4a5d5311a9fc604ccea7162809bd3 Mon Sep 17 00:00:00 2001 From: SubhadeepJasu Date: Thu, 15 Jul 2021 15:48:05 +0530 Subject: [PATCH 13/14] Make code style fixes --- src/Core/CentralBus.vala | 7 ++-- src/Core/Controller.vala | 18 +++++---- src/Core/MetronomeLFOPlayer.vala | 12 +++--- src/Core/StyleAnalyser.vala | 4 +- src/Core/StyleDiscovery.vala | 10 ++--- src/Core/StylePlayer.vala | 12 +++--- src/Core/Synthesizer.vala | 13 +++---- src/Core/Voice.vala | 4 +- src/Core/VoiceAnalyser.vala | 12 +++--- src/Core/central_bus.c | 2 +- src/Core/chord_finder.c | 2 - src/Core/chord_finder.h | 2 +- src/Core/controller.c | 2 +- src/Core/metronome_lfo_player.c | 2 +- src/Core/style_analyser.c | 2 +- src/Core/style_analyser.h | 2 +- src/Core/style_player.c | 2 +- src/Core/synthesizer.c | 2 +- src/Core/synthesizer.h | 2 +- src/Core/synthesizer_settings.c | 2 +- src/Core/synthesizer_settings.h | 2 +- src/Core/voice_analyser.c | 2 +- src/Shell/Application.vala | 7 ++-- src/Shell/Common/DeviceItem.vala | 10 ++--- src/Shell/Common/Dial.vala | 13 ++----- src/Shell/Common/EqualizerBar.vala | 9 ++--- src/Shell/Common/Key.vala | 16 +++++--- src/Shell/Common/Knob.vala | 23 ++++++----- src/Shell/Common/MasterKnob.vala | 9 ++--- src/Shell/Common/OctaveKeyboard.vala | 14 ++++--- src/Shell/Common/ToggleSwitch.vala | 4 +- src/Shell/Common/VoiceItem.vala | 18 ++++++--- src/Shell/Display/ChannelModulatorScreen.vala | 7 ++-- src/Shell/Display/HomeScreen.vala | 30 +++++++-------- src/Shell/Display/LFOEditScreen.vala | 7 ++-- src/Shell/Display/MainDisplayCasing.vala | 20 ++++------ src/Shell/Display/StyleMenu.vala | 8 ++-- src/Shell/Display/VoiceMenu.vala | 14 ++++--- src/Shell/Display/WheelScrollableWidget.vala | 6 +-- src/Shell/MainWindow.vala | 16 ++++---- src/Shell/Views/AppMenuView.vala | 12 +++--- src/Shell/Views/BeatCounterView.vala | 22 +++++------ src/Shell/Views/ControlPanel.vala | 5 +-- src/Shell/Views/JoyStick.vala | 4 +- src/Shell/Views/KeyboardView.vala | 10 ++--- src/Shell/Views/MixerBoardView.vala | 21 +++++----- src/Shell/Views/MultipadView.vala | 9 ++--- src/Shell/Views/RegistryView.vala | 4 +- src/Shell/Views/SliderBoardView.vala | 38 +++++++++---------- src/Shell/Views/SongControllerView.vala | 4 +- src/Shell/Views/StyleControllerView.vala | 23 ++++++----- src/Shell/Views/VoiceCategoryView.vala | 4 +- 52 files changed, 252 insertions(+), 253 deletions(-) diff --git a/src/Core/CentralBus.vala b/src/Core/CentralBus.vala index d7f1dec8..470ccd0a 100644 --- a/src/Core/CentralBus.vala +++ b/src/Core/CentralBus.vala @@ -45,9 +45,10 @@ namespace Ensembles.Core { public signal void loaded_tempo_change (int tempo); public signal void split_key_change (); - public void clk() { + public void clk () { print ("clk\n"); - } + } + public signal void system_ready (); int bus_watch () { while (thread_alive) { @@ -171,4 +172,4 @@ extern int central_style_looping; // Metronome and LFO extern int central_metronome_on; extern int central_lfo_on; -extern int central_lfo_value; \ No newline at end of file +extern int central_lfo_value; diff --git a/src/Core/Controller.vala b/src/Core/Controller.vala index b1644b93..5ebb6663 100644 --- a/src/Core/Controller.vala +++ b/src/Core/Controller.vala @@ -17,7 +17,7 @@ * Authored by: Subhadeep Jasu */ -namespace Ensembles.Core { +namespace Ensembles.Core { public struct ControllerDevice { string name; int id; @@ -29,7 +29,7 @@ namespace Ensembles.Core { public Controller () { controller_init (); } - + ~Controller () { stream_connected = false; controller_destruct (); @@ -57,11 +57,15 @@ namespace Ensembles.Core { while (stream_connected) { if (controller_poll_device () > 0) { int message = controller_read_device_stream (); - - int key = (((0x00FF00 & message) - 9216)/256) + 36; + int key = (((0x00FF00 & message) - 9216) / 256) + 36; int type = message & 0x0000FF; - double velocity = 0.0 + ((127.0 - 0.0) / (8323072.0 - 65536.0)) * (double)((0xFF0000 & message) - 65536); - print ("Velocity: %d, Key: %d, Type:%d, Raw: %x\n", (int)velocity, key, message & 0x0000FF, message); + double velocity = ((127.0 - 0.0) / (8323072.0 - 65536.0)) * + (double)((0xFF0000 & message) - 65536); + print ("Velocity: %d, Key: %d, Type:%d, Raw: %x\n", + (int)velocity, + key, + message & 0x0000FF, + message); if (velocity < 0) { velocity = 1; type = 128; @@ -101,4 +105,4 @@ extern void controller_query_device_info (int id); extern int controller_connect_device (int id); extern int32 controller_read_device_stream (); extern void controller_close_connection (); -extern int controller_poll_device (); \ No newline at end of file +extern int controller_poll_device (); diff --git a/src/Core/MetronomeLFOPlayer.vala b/src/Core/MetronomeLFOPlayer.vala index 56da3fb1..2329eb5a 100644 --- a/src/Core/MetronomeLFOPlayer.vala +++ b/src/Core/MetronomeLFOPlayer.vala @@ -16,11 +16,13 @@ namespace Ensembles.Core { } public void play_measure (int time_signature_n, int time_signature_d, bool? initial = false) { - if (_time_signature_n != time_signature_n || _time_signature_d != time_signature_d || initial) { + if (_time_signature_n != time_signature_n || + _time_signature_d != time_signature_d || + initial) { _time_signature_n = time_signature_n; _time_signature_d = time_signature_d; - _lfo_file_location = _lfo_directory_location + "/" + - time_signature_n.to_string () + "_" + + _lfo_file_location = _lfo_directory_location + "/" + + time_signature_n.to_string () + "_" + time_signature_d.to_string () + ".mtlfo"; metronome_lfo_player_change_base (_lfo_file_location, _tempo, 1920); } else { @@ -49,7 +51,7 @@ namespace Ensembles.Core { beat_sync (); return false; }); - Thread.usleep ((ulong)(240000/_tempo) * 1000); + Thread.usleep ((ulong)(240000 / _tempo) * 1000); metronome_lfo_player_play (); Thread.yield (); } @@ -66,4 +68,4 @@ extern void metronome_lfo_player_init (); extern void metronome_lfo_player_destruct (); extern void metronome_lfo_player_change_base (string mid_file, int tempo, int eol); extern void metronome_lfo_player_play (); -extern void metronome_lfo_player_set_tempo (int tempo); \ No newline at end of file +extern void metronome_lfo_player_set_tempo (int tempo); diff --git a/src/Core/StyleAnalyser.vala b/src/Core/StyleAnalyser.vala index 63f9a047..111db8d8 100644 --- a/src/Core/StyleAnalyser.vala +++ b/src/Core/StyleAnalyser.vala @@ -17,7 +17,7 @@ * Authored by: Subhadeep Jasu */ -namespace Ensembles.Core { +namespace Ensembles.Core { public class StyleAnalyser { public int analyze_style (string mid_file) { return style_analyser_analyze (mid_file); @@ -25,4 +25,4 @@ namespace Ensembles.Core { } } -extern int style_analyser_analyze (string mid_file); \ No newline at end of file +extern int style_analyser_analyze (string mid_file); diff --git a/src/Core/StyleDiscovery.vala b/src/Core/StyleDiscovery.vala index 87fc560a..f3198bb6 100644 --- a/src/Core/StyleDiscovery.vala +++ b/src/Core/StyleDiscovery.vala @@ -18,7 +18,7 @@ */ -namespace Ensembles.Core { +namespace Ensembles.Core { public class StyleDiscovery { string in_built_style_path; string user_style_path; @@ -29,7 +29,7 @@ namespace Ensembles.Core { Ensembles.Core.StyleAnalyser analyser; public signal void analysis_complete (); - public StyleDiscovery() { + public StyleDiscovery () { in_built_style_path = Constants.PKGDATADIR + "/Styles"; user_style_path = Environment.get_home_dir () + "/Documents/Ensembles/Styles"; style_files = new List (); @@ -38,7 +38,8 @@ namespace Ensembles.Core { style_tempo = new List (); if (DirUtils.create_with_parents (Environment.get_home_dir () + "/Documents/Ensembles", 2000) != -1) { - if (DirUtils.create_with_parents (Environment.get_home_dir () + "/Documents/Ensembles/Styles", 2000) != -1) { + if (DirUtils.create_with_parents ( + Environment.get_home_dir () + "/Documents/Ensembles/Styles", 2000) != -1) { print ("Made user style_folder\n"); } } @@ -89,7 +90,6 @@ namespace Ensembles.Core { analysis_complete (); return false; }); - } } -} \ No newline at end of file +} diff --git a/src/Core/StylePlayer.vala b/src/Core/StylePlayer.vala index 66c76a1e..3a4f2c5c 100644 --- a/src/Core/StylePlayer.vala +++ b/src/Core/StylePlayer.vala @@ -18,7 +18,7 @@ */ -namespace Ensembles.Core { +namespace Ensembles.Core { public class StylePlayer : Object { public StylePlayer (string? style_file = null) { style_player_init (); @@ -43,19 +43,19 @@ namespace Ensembles.Core { style_player_play (); } - public void switch_var_a() { + public void switch_var_a () { style_player_play_loop (3, 4); } - public void switch_var_b() { + public void switch_var_b () { style_player_play_loop (5, 6); } - public void switch_var_c() { + public void switch_var_c () { style_player_play_loop (7, 8); } - public void switch_var_d() { + public void switch_var_d () { style_player_play_loop (9, 10); } @@ -104,4 +104,4 @@ extern void style_player_break (); extern void style_player_sync_start (); extern void style_player_sync_stop (); -extern void style_player_change_chord (int cd_main, int cd_type); \ No newline at end of file +extern void style_player_change_chord (int cd_main, int cd_type); diff --git a/src/Core/Synthesizer.vala b/src/Core/Synthesizer.vala index 35f4b2e4..f9c048ee 100644 --- a/src/Core/Synthesizer.vala +++ b/src/Core/Synthesizer.vala @@ -17,7 +17,7 @@ * Authored by: Subhadeep Jasu */ -namespace Ensembles.Core { +namespace Ensembles.Core { public class Synthesizer : Object { public Synthesizer (string soundfont) { synthesizer_init (soundfont); @@ -73,7 +73,6 @@ namespace Ensembles.Core { } else { set_mod_buffer_value (modulator, channel, -1); } - } public static bool get_modulator_lock (int modulator, int channel) { @@ -121,7 +120,7 @@ namespace Ensembles.Core { extern void synthesizer_init (string loc); extern void synthesizer_destruct (); -extern int synthesizer_send_notes (int key, int on, int velocity, out int type); +extern int synthesizer_send_notes (int key, int on, int velocity, out int type); extern void synthesizer_halt_notes (); extern void synthesizer_set_accomp_enable (int on); @@ -133,14 +132,14 @@ extern void synthesizer_edit_master_chorus (int level); extern void synthesizer_change_voice (int bank, int preset, int channel); extern void synthesizer_change_modulator (int synth_index, int channel, int modulator, int value); -extern int synthesizer_get_modulator_values (int synth_index, int channel, int modulator); +extern int synthesizer_get_modulator_values (int synth_index, int channel, int modulator); extern void set_gain_value (int channel, int value); -extern int get_mod_buffer_value (int modulator, int channel); +extern int get_mod_buffer_value (int modulator, int channel); extern void set_mod_buffer_value (int modulator, int channel, int value); -extern int synthesizer_get_velocity_levels (int synth_index, int channel); +extern int synthesizer_get_velocity_levels (int synth_index, int channel); extern int synthesizer_transpose; extern int synthesizer_transpose_enable; extern int synthesizer_octave; -extern int synthesizer_octave_shifted; \ No newline at end of file +extern int synthesizer_octave_shifted; diff --git a/src/Core/Voice.vala b/src/Core/Voice.vala index 18405b60..cb705474 100644 --- a/src/Core/Voice.vala +++ b/src/Core/Voice.vala @@ -17,7 +17,7 @@ * Authored by: Subhadeep Jasu */ -namespace Ensembles.Core { +namespace Ensembles.Core { public class Voice : Object { public int index; public int bank; @@ -32,4 +32,4 @@ namespace Ensembles.Core { this.category = category; } } -} \ No newline at end of file +} diff --git a/src/Core/VoiceAnalyser.vala b/src/Core/VoiceAnalyser.vala index 45eb991f..2608c76f 100644 --- a/src/Core/VoiceAnalyser.vala +++ b/src/Core/VoiceAnalyser.vala @@ -17,13 +17,13 @@ * Authored by: Subhadeep Jasu */ -namespace Ensembles.Core { +namespace Ensembles.Core { public class VoiceAnalyser : Object { Voice[] voices; int[] category_indices; public VoiceAnalyser (string sf_path, string sf_schema_path) { FileStream stream = FileStream.open (sf_schema_path, "r"); - + if (voice_analyser_init (sf_path) == 0) { voices = new Voice[0]; category_indices = new int[0]; @@ -35,8 +35,8 @@ namespace Ensembles.Core { voices.resize (voices.length + 1); if (line != null) { string[] parts = line.split (","); - int bank = int.parse(parts[0]); - int preset = int.parse(parts[1]); + int bank = int.parse (parts[0]); + int preset = int.parse (parts[1]); if (bank == sf_preset_bank_num && preset == sf_preset_num) { category = parts[2]; category_indices.resize (category_indices.length + 1); @@ -67,11 +67,11 @@ namespace Ensembles.Core { } extern int voice_analyser_init (string sf_path); -extern int voice_analyser_next (); +extern int voice_analyser_next (); extern void voice_analyser_deconstruct (); // Data extern string sf_preset_name; extern int sf_preset_bank_num; -extern int sf_preset_num; \ No newline at end of file +extern int sf_preset_num; diff --git a/src/Core/central_bus.c b/src/Core/central_bus.c index 10210f44..93a1c5a7 100644 --- a/src/Core/central_bus.c +++ b/src/Core/central_bus.c @@ -169,4 +169,4 @@ int get_central_layer_on () { } void set_central_layer_on (int value) { central_layer_on = value; -} \ No newline at end of file +} diff --git a/src/Core/chord_finder.c b/src/Core/chord_finder.c index 327cfebf..b2d3f475 100644 --- a/src/Core/chord_finder.c +++ b/src/Core/chord_finder.c @@ -87,7 +87,5 @@ chord_finder_infer (int key, int on, int* type) { return max_index - 24; } } - - return -6; } diff --git a/src/Core/chord_finder.h b/src/Core/chord_finder.h index 8868d80e..66ec2c50 100644 --- a/src/Core/chord_finder.h +++ b/src/Core/chord_finder.h @@ -26,4 +26,4 @@ */ int chord_finder_infer (int key, int on, int* type); -#endif /* CHORD_FINDER_H */ \ No newline at end of file +#endif /* CHORD_FINDER_H */ diff --git a/src/Core/controller.c b/src/Core/controller.c index 394bcedf..33f2b9c1 100644 --- a/src/Core/controller.c +++ b/src/Core/controller.c @@ -87,4 +87,4 @@ controller_close_connection () { void controller_destruct () { Pm_Terminate (); -} \ No newline at end of file +} diff --git a/src/Core/metronome_lfo_player.c b/src/Core/metronome_lfo_player.c index a278d24b..6535b3d6 100644 --- a/src/Core/metronome_lfo_player.c +++ b/src/Core/metronome_lfo_player.c @@ -126,4 +126,4 @@ metronome_lfo_player_set_tempo (int tempo) { if (lfo_player) { fluid_player_set_tempo (lfo_player, FLUID_PLAYER_TEMPO_EXTERNAL_BPM, (double)tempo); } -} \ No newline at end of file +} diff --git a/src/Core/style_analyser.c b/src/Core/style_analyser.c index b15663cd..642d55d4 100644 --- a/src/Core/style_analyser.c +++ b/src/Core/style_analyser.c @@ -121,4 +121,4 @@ int style_analyser_analyze (char* mid_file) { time_stamp_index = 0; return style_analyser (mid_file); -} \ No newline at end of file +} diff --git a/src/Core/style_analyser.h b/src/Core/style_analyser.h index 836bc7a5..8dbf4128 100644 --- a/src/Core/style_analyser.h +++ b/src/Core/style_analyser.h @@ -26,4 +26,4 @@ */ int style_analyser_analyze (char* mid_file); -#endif /* STYLE_ANALYSER_H */ \ No newline at end of file +#endif /* STYLE_ANALYSER_H */ diff --git a/src/Core/style_player.c b/src/Core/style_player.c index 64ef9936..1e67e7e7 100644 --- a/src/Core/style_player.c +++ b/src/Core/style_player.c @@ -516,4 +516,4 @@ style_player_queue_ending (int start, int end) { void style_player_break () { breaking = 1; -} \ No newline at end of file +} diff --git a/src/Core/synthesizer.c b/src/Core/synthesizer.c index 6aa1c2bc..eaf15afa 100644 --- a/src/Core/synthesizer.c +++ b/src/Core/synthesizer.c @@ -421,4 +421,4 @@ synthesizer_halt_notes () { void synthesizer_set_accomp_enable (int on) { set_central_accompaniment_mode (on); -} \ No newline at end of file +} diff --git a/src/Core/synthesizer.h b/src/Core/synthesizer.h index 1d244f61..5b97dc47 100644 --- a/src/Core/synthesizer.h +++ b/src/Core/synthesizer.h @@ -34,4 +34,4 @@ void synthesizer_send_notes_metronome (int key, int on); */ void synthesizer_halt_notes (); -#endif /* SYNTHESIZER_H */ \ No newline at end of file +#endif /* SYNTHESIZER_H */ diff --git a/src/Core/synthesizer_settings.c b/src/Core/synthesizer_settings.c index 7787eba2..bcb29b55 100644 --- a/src/Core/synthesizer_settings.c +++ b/src/Core/synthesizer_settings.c @@ -135,4 +135,4 @@ set_mod_buffer_value (int modulator, int channel, int value) { chorus_value[channel] = value; break; } -} \ No newline at end of file +} diff --git a/src/Core/synthesizer_settings.h b/src/Core/synthesizer_settings.h index 2d7f41f2..7911ba92 100644 --- a/src/Core/synthesizer_settings.h +++ b/src/Core/synthesizer_settings.h @@ -59,4 +59,4 @@ int get_mod_buffer_value (int modulator, int channel); */ void set_mod_buffer_value (int modulator, int channel, int value); -#endif /* SYNTHESIZER_SETTINGS_H */ \ No newline at end of file +#endif /* SYNTHESIZER_SETTINGS_H */ diff --git a/src/Core/voice_analyser.c b/src/Core/voice_analyser.c index c5ba1210..a4974486 100644 --- a/src/Core/voice_analyser.c +++ b/src/Core/voice_analyser.c @@ -71,4 +71,4 @@ void voice_analyser_deconstruct () { delete_fluid_synth(sf_synth); delete_fluid_settings(sf_settings); -} \ No newline at end of file +} diff --git a/src/Shell/Application.vala b/src/Shell/Application.vala index 619ad633..d21af216 100644 --- a/src/Shell/Application.vala +++ b/src/Shell/Application.vala @@ -17,7 +17,7 @@ * Authored by: Subhadeep Jasu */ -namespace Ensembles.Shell { +namespace Ensembles.Shell { public class EnsemblesApp : Gtk.Application { static EnsemblesApp _instance = null; @@ -29,7 +29,6 @@ namespace Ensembles.Shell { return _instance; } } - string version_string = ""; Ensembles.Shell.MainWindow main_window; @@ -50,7 +49,7 @@ namespace Ensembles.Shell { this.add_window (main_window); } if (css_provider == null) { - css_provider = new Gtk.CssProvider(); + css_provider = new Gtk.CssProvider (); css_provider.load_from_resource ("/com/github/subhadeepjasu/ensembles/Application.css"); // CSS Provider Gtk.StyleContext.add_provider_for_screen ( @@ -62,4 +61,4 @@ namespace Ensembles.Shell { this.main_window.show_all (); } } -} \ No newline at end of file +} diff --git a/src/Shell/Common/DeviceItem.vala b/src/Shell/Common/DeviceItem.vala index 094f5c67..b4613035 100644 --- a/src/Shell/Common/DeviceItem.vala +++ b/src/Shell/Common/DeviceItem.vala @@ -17,26 +17,26 @@ * Authored by: Subhadeep Jasu */ -namespace Ensembles.Shell { +namespace Ensembles.Shell { public class DeviceItem : Gtk.ListBoxRow { public Ensembles.Core.ControllerDevice device; Gtk.Label device_name; public Gtk.CheckButton radio; - public DeviceItem(Ensembles.Core.ControllerDevice device) { + public DeviceItem (Ensembles.Core.ControllerDevice device) { this.device = device; device_name = new Gtk.Label (this.device.name); radio = new Gtk.CheckButton (); radio.margin_end = 8; radio.set_active (false); radio.set_sensitive (false); - + var box = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 0); box.margin = 8; box.halign = Gtk.Align.START; - + box.pack_start (radio); box.pack_start (device_name); this.add (box); } } -} \ No newline at end of file +} diff --git a/src/Shell/Common/Dial.vala b/src/Shell/Common/Dial.vala index a13e3a74..3ce21c5d 100644 --- a/src/Shell/Common/Dial.vala +++ b/src/Shell/Common/Dial.vala @@ -17,7 +17,7 @@ * Authored by: Subhadeep Jasu */ -namespace Ensembles.Shell { +namespace Ensembles.Shell { public class Dial : Gtk.Overlay { public string tooltip; public bool dragging; @@ -126,8 +126,8 @@ namespace Ensembles.Shell { } public void rotate_dial (double value) { - double px = RADIUS * GLib.Math.cos (value/(Math.PI)); - double py = RADIUS * GLib.Math.sin (value/(Math.PI)); + double px = RADIUS * GLib.Math.cos (value / (Math.PI)); + double py = RADIUS * GLib.Math.sin (value / (Math.PI)); fixed.move (knob_socket_graphic, (int)(px + 50), (int)(py + 50)); } @@ -170,9 +170,7 @@ namespace Ensembles.Shell { if (over_centre == 0) { over_centre = event.motion.y_root; } - if (dragging_direction > event.motion.x || event.motion.x_root == 0) { - if (over_centre > over_centre_initial) { value+=0.5; if (value >= 360 || value <= -360) { @@ -194,11 +192,9 @@ namespace Ensembles.Shell { } } rotate_dial (value); - dragging_direction = event.motion.x; over_centre = event.motion.y_root; } else { - if (over_centre > over_centre_initial) { value-=0.5; if (value >= 360 || value <= -360) { @@ -220,7 +216,6 @@ namespace Ensembles.Shell { } } rotate_dial (value); - dragging_direction = event.motion.x; over_centre = event.motion.y_root; } @@ -228,4 +223,4 @@ namespace Ensembles.Shell { return false; } } -} \ No newline at end of file +} diff --git a/src/Shell/Common/EqualizerBar.vala b/src/Shell/Common/EqualizerBar.vala index 3ef1f292..ebb16577 100644 --- a/src/Shell/Common/EqualizerBar.vala +++ b/src/Shell/Common/EqualizerBar.vala @@ -17,7 +17,7 @@ * Authored by: Subhadeep Jasu */ -namespace Ensembles.Shell { +namespace Ensembles.Shell { public class EqualizerBar : Gtk.Bin { // DrawingArea drawing_area; private int _velocity; @@ -29,7 +29,7 @@ namespace Ensembles.Shell { _velocity = 127 - value; queue_draw (); } - } + } public EqualizerBar () { set_size_request (19, 40); velocity = 0; @@ -39,12 +39,12 @@ namespace Ensembles.Shell { cr.move_to (0, 0); cr.set_source_rgba (0.6, 0.6, 0.6, 0.2); for (int i = 0; i < 7; i++) { - cr.rectangle (0, i*5, 19, 4); + cr.rectangle (0, i * 5, 19, 4); } cr.fill (); cr.set_source_rgba (0.42, 0.56, 0.015, 1); for (int i = 6; i >= 0; i--) { - cr.rectangle (0, i*5, 19, 4); + cr.rectangle (0, i * 5, 19, 4); if (i * 16 < _velocity) { break; } @@ -55,4 +55,3 @@ namespace Ensembles.Shell { } } } - diff --git a/src/Shell/Common/Key.vala b/src/Shell/Common/Key.vala index 1624c7c2..08f17999 100644 --- a/src/Shell/Common/Key.vala +++ b/src/Shell/Common/Key.vala @@ -17,7 +17,7 @@ * Authored by: Subhadeep Jasu */ -namespace Ensembles.Shell { +namespace Ensembles.Shell { public class Key : Gtk.Button { bool _black_key; int _index; @@ -39,12 +39,14 @@ namespace Ensembles.Shell { public void note_on () { if (_black_key) { - if ((_index <= Ensembles.Core.CentralBus.get_split_key ()) && (Ensembles.Core.CentralBus.get_accomp_on () || Ensembles.Core.CentralBus.get_split_on ())) + if ((_index <= Ensembles.Core.CentralBus.get_split_key ()) && + (Ensembles.Core.CentralBus.get_accomp_on () || Ensembles.Core.CentralBus.get_split_on ())) get_style_context ().add_class ("black-key-split-active"); else get_style_context ().add_class ("black-key-active"); } else { - if ((_index <= Ensembles.Core.CentralBus.get_split_key ()) && (Ensembles.Core.CentralBus.get_accomp_on () || Ensembles.Core.CentralBus.get_split_on ())) + if ((_index <= Ensembles.Core.CentralBus.get_split_key ()) && + (Ensembles.Core.CentralBus.get_accomp_on () || Ensembles.Core.CentralBus.get_split_on ())) get_style_context ().add_class ("white-key-split-active"); else get_style_context ().add_class ("white-key-active"); @@ -69,13 +71,15 @@ namespace Ensembles.Shell { hexpand = true; height_request = 84; get_style_context ().add_class ("black-key-normal"); - if ((_index <= Ensembles.Core.CentralBus.get_split_key ()) && (Ensembles.Core.CentralBus.get_accomp_on () || Ensembles.Core.CentralBus.get_split_on ())) + if ((_index <= Ensembles.Core.CentralBus.get_split_key ()) && + (Ensembles.Core.CentralBus.get_accomp_on () || Ensembles.Core.CentralBus.get_split_on ())) get_style_context ().add_class ("black-key-split"); } else { height_request = 146; hexpand = true; get_style_context ().add_class ("white-key-normal"); - if ((_index <= Ensembles.Core.CentralBus.get_split_key ()) && (Ensembles.Core.CentralBus.get_accomp_on () || Ensembles.Core.CentralBus.get_split_on ())) + if ((_index <= Ensembles.Core.CentralBus.get_split_key ()) && + (Ensembles.Core.CentralBus.get_accomp_on () || Ensembles.Core.CentralBus.get_split_on ())) get_style_context ().add_class ("white-key-split"); } if (_index == Ensembles.Core.CentralBus.get_split_key ()) { @@ -83,4 +87,4 @@ namespace Ensembles.Shell { } } } -} \ No newline at end of file +} diff --git a/src/Shell/Common/Knob.vala b/src/Shell/Common/Knob.vala index 74764ee0..e19daf67 100644 --- a/src/Shell/Common/Knob.vala +++ b/src/Shell/Common/Knob.vala @@ -17,7 +17,7 @@ * Authored by: Subhadeep Jasu */ -namespace Ensembles.Shell { +namespace Ensembles.Shell { public class Knob : Gtk.Overlay { public string tooltip; public bool dragging; @@ -55,19 +55,17 @@ namespace Ensembles.Shell { fixed.margin_start = 4; fixed.width_request = 50; fixed.height_request = 50; - double px = RADIUS * GLib.Math.cos (value/(Math.PI)); - double py = RADIUS * GLib.Math.sin (value/(Math.PI)); + double px = RADIUS * GLib.Math.cos (value / Math.PI); + double py = RADIUS * GLib.Math.sin (value / Math.PI); fixed.put (knob_socket_graphic, (int)(px + center), (int)(py + center)); knob_background = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 0); - knob_background.halign = Gtk.Align.START; knob_background.valign = Gtk.Align.START; knob_background.margin_start = 4; knob_background.width_request = 50; knob_background.height_request = 50; - var event_box = new Gtk.EventBox (); event_box.event.connect (handle_event); event_box.hexpand = true; @@ -84,16 +82,16 @@ namespace Ensembles.Shell { } public void rotate_dial (double value) { - double px = RADIUS * GLib.Math.cos (value/(Math.PI)); - double py = RADIUS * GLib.Math.sin (value/(Math.PI)); + double px = RADIUS * GLib.Math.cos (value / Math.PI); + double py = RADIUS * GLib.Math.sin (value / Math.PI); fixed.move (knob_socket_graphic, (int)(px + center), (int)(py + center)); change_value ((value - 27.0) / 15.0); } public void set_value (double _value) { value = 15 * _value + 27; - double px = RADIUS * GLib.Math.cos (value/(Math.PI)); - double py = RADIUS * GLib.Math.sin (value/(Math.PI)); + double px = RADIUS * GLib.Math.cos (value / Math.PI); + double py = RADIUS * GLib.Math.sin (value / Math.PI); fixed.move (knob_socket_graphic, (int)(px + center), (int)(py + center)); } @@ -116,8 +114,9 @@ namespace Ensembles.Shell { if (dragging_direction == 0) { dragging_direction = event.motion.y - event.motion.x; } - - if (dragging_direction > event.motion.y - event.motion.x || event.motion.y_root == 0 || event.motion.x_root == 0) { + if (dragging_direction > event.motion.y - event.motion.x || + event.motion.y_root == 0 || + event.motion.x_root == 0) { value += 0.5; if (value < 27) { value = 27; @@ -142,4 +141,4 @@ namespace Ensembles.Shell { return false; } } -} \ No newline at end of file +} diff --git a/src/Shell/Common/MasterKnob.vala b/src/Shell/Common/MasterKnob.vala index e94fd0e8..93a5c243 100644 --- a/src/Shell/Common/MasterKnob.vala +++ b/src/Shell/Common/MasterKnob.vala @@ -17,10 +17,9 @@ * Authored by: Subhadeep Jasu */ -namespace Ensembles.Shell { +namespace Ensembles.Shell { public class MasterKnob : Knob { public MasterKnob () { - // Set up visuals center = 40; knob_background.get_style_context ().add_class ("knob-background"); @@ -31,8 +30,8 @@ namespace Ensembles.Shell { knob_background.width_request = 80; knob_background.height_request = 80; width_request = 80; - double px = RADIUS * GLib.Math.cos (value/(Math.PI)); - double py = RADIUS * GLib.Math.sin (value/(Math.PI)); + double px = RADIUS * GLib.Math.cos (value / Math.PI); + double py = RADIUS * GLib.Math.sin (value / Math.PI); fixed.move (knob_socket_graphic, (int)(px + center), (int)(py + center)); knob_background.get_style_context ().add_class ("super-knob-idle"); @@ -55,4 +54,4 @@ namespace Ensembles.Shell { } } } -} \ No newline at end of file +} diff --git a/src/Shell/Common/OctaveKeyboard.vala b/src/Shell/Common/OctaveKeyboard.vala index 7be79ff2..dd4eb860 100644 --- a/src/Shell/Common/OctaveKeyboard.vala +++ b/src/Shell/Common/OctaveKeyboard.vala @@ -17,17 +17,19 @@ * Authored by: Subhadeep Jasu */ -namespace Ensembles.Shell { +namespace Ensembles.Shell { public class OctaveKeyboard : Gtk.Grid { Key[] keys; int _index; public signal void note_activate (int index, bool on); - public OctaveKeyboard(int index) { + public OctaveKeyboard (int index) { _index = index; keys = new Key[12]; for (int i = 0; i < 12; i++) { - keys[i] = new Key (_index * 12 + i, ((i == 1) || (i == 3) || (i == 6) || (i == 8) || (i == 10)) ? true : false); + keys[i] = new Key (_index * 12 + i, ((i == 1) || (i == 3) || (i == 6) || (i == 8) || (i == 10)) + ? true + : false); } var white_grid = new Gtk.Grid (); @@ -37,14 +39,14 @@ namespace Ensembles.Shell { white_grid.attach (keys[5], 3, 0, 1, 1); white_grid.attach (keys[7], 4, 0, 1, 1); white_grid.attach (keys[9], 5, 0, 1, 1); - white_grid.attach (keys[11],6, 0, 1, 1); + white_grid.attach (keys[11], 6, 0, 1, 1); var black_grid = new Gtk.Grid (); black_grid.attach (keys[1], 0, 0, 1, 1); black_grid.attach (keys[3], 1, 0, 1, 1); black_grid.attach (keys[6], 2, 0, 1, 1); black_grid.attach (keys[8], 3, 0, 1, 1); - black_grid.attach (keys[10],4, 0, 1, 1); + black_grid.attach (keys[10], 4, 0, 1, 1); keys[1].margin_start = 18; keys[1].margin_end = 5; keys[3].margin_start = 6; @@ -175,4 +177,4 @@ namespace Ensembles.Shell { } } } -} \ No newline at end of file +} diff --git a/src/Shell/Common/ToggleSwitch.vala b/src/Shell/Common/ToggleSwitch.vala index 886ab760..6d192672 100644 --- a/src/Shell/Common/ToggleSwitch.vala +++ b/src/Shell/Common/ToggleSwitch.vala @@ -17,7 +17,7 @@ * Authored by: Subhadeep Jasu */ -namespace Ensembles.Shell { +namespace Ensembles.Shell { public class ToggleSwitch : Gtk.Button { Gtk.Label text_label; Gtk.Box indicator_box; @@ -57,4 +57,4 @@ namespace Ensembles.Shell { } } } -} \ No newline at end of file +} diff --git a/src/Shell/Common/VoiceItem.vala b/src/Shell/Common/VoiceItem.vala index 190911b7..8a8e5a83 100644 --- a/src/Shell/Common/VoiceItem.vala +++ b/src/Shell/Common/VoiceItem.vala @@ -17,7 +17,7 @@ * Authored by: Subhadeep Jasu */ -namespace Ensembles.Shell { +namespace Ensembles.Shell { public class VoiceItem : Gtk.ListBoxRow { public Ensembles.Core.Voice voice; public VoiceItem (Ensembles.Core.Voice voice, bool show_category) { @@ -38,15 +38,21 @@ namespace Ensembles.Shell { category_label.get_style_context ().add_class ("menu-item-annotation"); } try { - Gdk.Pixbuf thumb = new Gdk.Pixbuf.from_file (Constants.PKGDATADIR + "/Instruments/" + voice.name + ".jpg"); - thumb = thumb.scale_simple(54, 36, Gdk.InterpType.NEAREST); + Gdk.Pixbuf thumb = new Gdk.Pixbuf.from_file (Constants.PKGDATADIR + + "/Instruments/" + + voice.name + + ".jpg"); + thumb = thumb.scale_simple (54, 36, Gdk.InterpType.NEAREST); var image = new Gtk.Image.from_pixbuf (thumb); image.margin_end = 8; voice_grid.attach (image, 0, 0, 1, 2); } catch (Error e) { try { - Gdk.Pixbuf thumb = new Gdk.Pixbuf.from_file (Constants.PKGDATADIR + "/Instruments/" + voice.category.replace ("/", "_") + ".jpg"); - thumb = thumb.scale_simple(54, 36, Gdk.InterpType.NEAREST); + Gdk.Pixbuf thumb = new Gdk.Pixbuf.from_file (Constants.PKGDATADIR + + "/Instruments/" + + voice.category.replace ("/", "_") + + ".jpg"); + thumb = thumb.scale_simple (54, 36, Gdk.InterpType.NEAREST); var image = new Gtk.Image.from_pixbuf (thumb); image.margin_end = 8; voice_grid.attach (image, 0, 0, 1, 2); @@ -60,4 +66,4 @@ namespace Ensembles.Shell { this.add (voice_grid); } } -} \ No newline at end of file +} diff --git a/src/Shell/Display/ChannelModulatorScreen.vala b/src/Shell/Display/ChannelModulatorScreen.vala index 83b6b83c..2f67a639 100644 --- a/src/Shell/Display/ChannelModulatorScreen.vala +++ b/src/Shell/Display/ChannelModulatorScreen.vala @@ -17,7 +17,7 @@ * Authored by: Subhadeep Jasu */ -namespace Ensembles.Shell { +namespace Ensembles.Shell { public class ChannelModulatorScreen : Gtk.Grid { int _synth_index; int _channel; @@ -46,7 +46,7 @@ namespace Ensembles.Shell { Gtk.Button modulation_button; Gtk.Button cut_off_button; Gtk.Button resonance_button; - + bool pan_lock; bool reverb_lock; bool chorus_lock; @@ -56,7 +56,6 @@ namespace Ensembles.Shell { bool cut_off_lock; bool resonance_lock; - bool assignable; public signal void broadcast_assignment (int synth_index, int channel, int modulator); @@ -407,4 +406,4 @@ namespace Ensembles.Shell { set_synth_channel_to_edit (_synth_index, _channel); } } -} \ No newline at end of file +} diff --git a/src/Shell/Display/HomeScreen.vala b/src/Shell/Display/HomeScreen.vala index 50ab320c..d7dc40bd 100644 --- a/src/Shell/Display/HomeScreen.vala +++ b/src/Shell/Display/HomeScreen.vala @@ -17,7 +17,7 @@ * Authored by: Subhadeep Jasu */ -namespace Ensembles.Shell { +namespace Ensembles.Shell { public class HomeScreen : WheelScrollableWidget { int tempo = 33; Gtk.Button style_button; @@ -40,24 +40,23 @@ namespace Ensembles.Shell { Gtk.Label chord_type_label; EqualizerBar[] equalizer_bar; - Gtk.Button[] channel_configure_buttons; + Gtk.Button[] channel_configure_buttons; public signal void open_style_menu (); public signal void open_voice_l_menu (); public signal void open_voice_r1_menu (); public signal void open_voice_r2_menu (); public signal void edit_channel (int synth_index, int channel); - - public HomeScreen() { + + public HomeScreen () { this.get_style_context ().add_class ("home-screen-background"); var top_panel = new Gtk.Grid (); top_panel.get_style_context ().add_class ("home-screen-panel-top"); top_panel.height_request = 46; top_panel.width_request = 460; - - var style_button_box = new Gtk.Box(Gtk.Orientation.VERTICAL, 0); + var style_button_box = new Gtk.Box (Gtk.Orientation.VERTICAL, 0); style_button_box.height_request = 46; var style_label = new Gtk.Label ("Style"); style_label.halign = Gtk.Align.CENTER; @@ -77,7 +76,7 @@ namespace Ensembles.Shell { open_style_menu (); }); - var voice_l_button_box = new Gtk.Box(Gtk.Orientation.VERTICAL, 0); + var voice_l_button_box = new Gtk.Box (Gtk.Orientation.VERTICAL, 0); voice_l_button_box.height_request = 46; voice_l_button_box.get_style_context ().add_class ("display-top-panel-button"); var voice_l_label = new Gtk.Label ("Voice L"); @@ -98,7 +97,7 @@ namespace Ensembles.Shell { open_voice_l_menu (); }); - var voice_r1_button_box = new Gtk.Box(Gtk.Orientation.VERTICAL, 0); + var voice_r1_button_box = new Gtk.Box (Gtk.Orientation.VERTICAL, 0); voice_r1_button_box.height_request = 46; voice_r1_button_box.get_style_context ().add_class ("display-top-panel-button"); var voice_r1_label = new Gtk.Label ("Voice R1"); @@ -119,7 +118,7 @@ namespace Ensembles.Shell { open_voice_r1_menu (); }); - var voice_r2_button_box = new Gtk.Box(Gtk.Orientation.VERTICAL, 0); + var voice_r2_button_box = new Gtk.Box (Gtk.Orientation.VERTICAL, 0); voice_r2_button_box.height_request = 46; voice_r2_button_box.get_style_context ().add_class ("display-top-panel-button"); var voice_r2_label = new Gtk.Label ("Voice R2"); @@ -204,7 +203,7 @@ namespace Ensembles.Shell { beat_box.pack_end (beat_label, false, true, 0); beat_box.valign = Gtk.Align.START; beat_box.margin_top = 2; - + var transpose_box = new Gtk.Box (Gtk.Orientation.VERTICAL, 0); transpose_box.pack_start (transpose_header, false, true, 0); transpose_box.pack_end (transpose_label, false, true, 0); @@ -228,13 +227,13 @@ namespace Ensembles.Shell { equalizer_bar = new EqualizerBar[19]; for (int i = 0; i < 19; i++) { equalizer_bar[i] = new EqualizerBar (); - equalizer_grid.attach (equalizer_bar[i], i, 0 ,1, 1); + equalizer_grid.attach (equalizer_bar[i], i, 0, 1, 1); } equalizer_grid.column_spacing = 4; equalizer_grid.column_homogeneous = true; equalizer_grid.margin_start = 6; - equalizer_grid.margin_end = 7; - equalizer_grid.margin_top = 4; + equalizer_grid.margin_end = 7; + equalizer_grid.margin_top = 4; var equalizer_label_grid = new Gtk.Grid (); for (int i = 0; i < 16; i++) { @@ -254,7 +253,8 @@ namespace Ensembles.Shell { channel_button_grid.margin_start = 2; channel_configure_buttons = new Gtk.Button [19]; for (int i = 0; i < 19; i++) { - channel_configure_buttons[i] = new Gtk.Button.from_icon_name ("preferences-system-symbolic", Gtk.IconSize.BUTTON); + channel_configure_buttons[i] = new Gtk.Button.from_icon_name ("preferences-system-symbolic", + Gtk.IconSize.BUTTON); channel_configure_buttons[i].get_style_context ().add_class ("channel-configure-button"); channel_button_grid.attach (channel_configure_buttons[i], i, 0, 1, 1); } @@ -431,7 +431,7 @@ namespace Ensembles.Shell { } void update_equalizer () { - Timeout.add (60000/(tempo * 16), () => { + Timeout.add (60000 / (tempo * 16), () => { for (int i = 0; i < 16; i++) { equalizer_bar[i].velocity = Ensembles.Core.Synthesizer.get_channel_velocity (1, i); } diff --git a/src/Shell/Display/LFOEditScreen.vala b/src/Shell/Display/LFOEditScreen.vala index c25f68ab..381e2a6e 100644 --- a/src/Shell/Display/LFOEditScreen.vala +++ b/src/Shell/Display/LFOEditScreen.vala @@ -52,7 +52,7 @@ namespace Ensembles.Shell { lfo_type.vexpand = true; lfo_spin_button.vexpand = true; mod_grid.attach (lfo_spin_button, 0, 0, 1, 1); - mod_grid.attach (lfo_type, 1, 0, 1, 1); + mod_grid.attach (lfo_type, 1, 0, 1, 1); lfo_graph = new Gtk.Image.from_resource ("/com/github/subhadeepjasu/ensembles/images/lfo_graphics/LFO_4_4_0"); @@ -65,10 +65,11 @@ namespace Ensembles.Shell { public void make_events () { lfo_spin_button.value_changed.connect (() => { int index = (int)(lfo_spin_button.value); - lfo_graph.set_from_resource ("/com/github/subhadeepjasu/ensembles/images/lfo_graphics/LFO_4_4_" + index.to_string ()); + lfo_graph.set_from_resource ("/com/github/subhadeepjasu/ensembles/images/lfo_graphics/LFO_4_4_" + + index.to_string ()); lfo_type.set_text (lfo_names[index]); Ensembles.Core.CentralBus.set_lfo_type (index); }); } } -} \ No newline at end of file +} diff --git a/src/Shell/Display/MainDisplayCasing.vala b/src/Shell/Display/MainDisplayCasing.vala index 17f77dde..1f90948f 100644 --- a/src/Shell/Display/MainDisplayCasing.vala +++ b/src/Shell/Display/MainDisplayCasing.vala @@ -17,7 +17,7 @@ * Authored by: Subhadeep Jasu */ -namespace Ensembles.Shell { +namespace Ensembles.Shell { public class MainDisplayCasing : Gtk.Box { Gtk.Stack main_stack; Gtk.Overlay main_overlay; @@ -38,7 +38,7 @@ namespace Ensembles.Shell { public signal void change_style (string path, string name, int tempo); public signal void change_voice (Ensembles.Core.Voice voice, int channel); - public MainDisplayCasing() { + public MainDisplayCasing () { home_screen = new HomeScreen (); style_menu = new StyleMenu (); voice_menu_l = new VoiceMenu (2); @@ -55,10 +55,8 @@ namespace Ensembles.Shell { main_stack.add_named (channel_mod_screen, "Channel Modulator Screen"); main_stack.add_named (lfo_editor, "LFO Editor"); - splash_screen = new Gtk.Image.from_resource ("/com/github/subhadeepjasu/ensembles/images/display_unit/ensembles_splash.svg"); - main_display_leaflet = new Hdy.Leaflet (); main_display_leaflet.set_mode_transition_duration (400); main_display_leaflet.add (home_screen); @@ -66,11 +64,9 @@ namespace Ensembles.Shell { main_display_leaflet.set_can_swipe_back (true); main_display_leaflet.set_transition_type (Hdy.LeafletTransitionType.SLIDE); - main_display_deck = new Hdy.Deck(); + main_display_deck = new Hdy.Deck (); main_display_deck.add (main_display_leaflet); - - main_overlay = new Gtk.Overlay (); main_overlay.height_request = 236; main_overlay.width_request = 460; @@ -163,16 +159,16 @@ namespace Ensembles.Shell { string[] genre_arr = new string [genre.length ()]; int[] tempo_arr = new int [tempo.length ()]; for(int i = 0; i < paths.length (); i++) { - path_arr [i] = paths.nth_data (i); + path_arr[i] = paths.nth_data (i); } for(int i = 0; i < names.length (); i++) { - name_arr [i] = names.nth_data (i); + name_arr[i] = names.nth_data (i); } for(int i = 0; i < genre.length (); i++) { - genre_arr [i] = genre.nth_data (i); + genre_arr[i] = genre.nth_data (i); } for(int i = 0; i < tempo.length (); i++) { - tempo_arr [i] = tempo.nth_data (i); + tempo_arr[i] = tempo.nth_data (i); } style_menu.populate_style_menu (path_arr, name_arr, genre_arr, tempo_arr); home_screen.set_style_name (name_arr[0]); @@ -208,7 +204,7 @@ namespace Ensembles.Shell { channel_mod_screen.set_synth_channel_to_edit (synth_index, channel); } - public void open_LFO_screen () { + public void open_lfo_screen () { main_display_leaflet.set_visible_child (main_stack); main_stack.set_visible_child (lfo_editor); } diff --git a/src/Shell/Display/StyleMenu.vala b/src/Shell/Display/StyleMenu.vala index 52996baa..6b60d3cc 100644 --- a/src/Shell/Display/StyleMenu.vala +++ b/src/Shell/Display/StyleMenu.vala @@ -17,19 +17,19 @@ * Authored by: Subhadeep Jasu */ -namespace Ensembles.Shell { +namespace Ensembles.Shell { public class StyleMenu : WheelScrollableWidget { Gtk.Button close_button; Gtk.ListBox main_list; string[] style_path; string[] style_genre; string[] style_name; - int[] style_tempo; + int[] style_tempo; Gtk.ListBoxRow[] rows; public signal void close_menu (); public signal void change_style (string path, string name, int tempo); - public StyleMenu() { + public StyleMenu () { this.get_style_context ().add_class ("menu-background"); close_button = new Gtk.Button.from_icon_name ("application-exit-symbolic", Gtk.IconSize.BUTTON); @@ -103,4 +103,4 @@ namespace Ensembles.Shell { Ensembles.Core.CentralBus.set_styles_ready (true); } } -} \ No newline at end of file +} diff --git a/src/Shell/Display/VoiceMenu.vala b/src/Shell/Display/VoiceMenu.vala index ad58acf8..50c7080b 100644 --- a/src/Shell/Display/VoiceMenu.vala +++ b/src/Shell/Display/VoiceMenu.vala @@ -17,7 +17,7 @@ * Authored by: Subhadeep Jasu */ -namespace Ensembles.Shell { +namespace Ensembles.Shell { public class VoiceMenu : WheelScrollableWidget { int channel; Gtk.Button close_button; @@ -27,7 +27,7 @@ namespace Ensembles.Shell { public signal void close_menu (); public signal void change_voice (Ensembles.Core.Voice voice, int channel); - public VoiceMenu(int channel) { + public VoiceMenu (int channel) { this.channel = channel; this.get_style_context ().add_class ("menu-background"); @@ -37,8 +37,12 @@ namespace Ensembles.Shell { var headerbar = new Hdy.HeaderBar (); - headerbar.set_title ("Voice - " + ((channel == 0) ? "Right 1 (Main)" : (channel == 1) ? "Right 2 (Layered)" : "Left (Split)")); - headerbar.set_subtitle ("Pick a Voice to play" + ((channel == 0) ? "" : (channel == 1) ? " on another layer" : " on left hand side of split")); + headerbar.set_title ("Voice - " + ((channel == 0) ? "Right 1 (Main)" : (channel == 1) + ? "Right 2 (Layered)" + : "Left (Split)")); + headerbar.set_subtitle ("Pick a Voice to play" + ((channel == 0) ? "" : (channel == 1) + ? " on another layer" + : " on left hand side of split")); headerbar.get_style_context ().add_class ("menu-header"); headerbar.pack_start (close_button); main_list = new Gtk.ListBox (); @@ -115,4 +119,4 @@ namespace Ensembles.Shell { scroll_to_selected_row (); } } -} \ No newline at end of file +} diff --git a/src/Shell/Display/WheelScrollableWidget.vala b/src/Shell/Display/WheelScrollableWidget.vala index ef24f789..579901d5 100644 --- a/src/Shell/Display/WheelScrollableWidget.vala +++ b/src/Shell/Display/WheelScrollableWidget.vala @@ -17,8 +17,8 @@ * Authored by: Subhadeep Jasu */ -namespace Ensembles.Shell { - public class WheelScrollableWidget : Gtk.Grid { +namespace Ensembles.Shell { + public class WheelScrollableWidget : Gtk.Grid { public int scroll_wheel_location; public WheelScrollableWidget () { width_request = 424; @@ -32,4 +32,4 @@ namespace Ensembles.Shell { } } } -} \ No newline at end of file +} diff --git a/src/Shell/MainWindow.vala b/src/Shell/MainWindow.vala index 7ab1b0b5..5a020a42 100644 --- a/src/Shell/MainWindow.vala +++ b/src/Shell/MainWindow.vala @@ -16,7 +16,7 @@ * * Authored by: Subhadeep Jasu */ -namespace Ensembles.Shell { +namespace Ensembles.Shell { public class MainWindow : Gtk.Window { StyleControllerView style_controller_view; BeatCounterView beat_counter_panel; @@ -55,7 +55,8 @@ namespace Ensembles.Shell { headerbar.title = "Ensembles"; headerbar.pack_start (beat_counter_panel); - Gtk.Button app_menu_button = new Gtk.Button.from_icon_name ("preferences-system-symbolic", Gtk.IconSize.BUTTON); + Gtk.Button app_menu_button = new Gtk.Button.from_icon_name ("preferences-system-symbolic", + Gtk.IconSize.BUTTON); headerbar.pack_end (app_menu_button); this.set_titlebar (headerbar); @@ -101,9 +102,6 @@ namespace Ensembles.Shell { grid.attach (main_keyboard, 0, 3, 3, 1); this.add (grid); this.show_all (); - - - controller_connection = new Ensembles.Core.Controller (); app_menu.change_enable_midi_input.connect ((enable) => { @@ -266,21 +264,21 @@ namespace Ensembles.Shell { }); main_display_unit.channel_mod_screen.broadcast_assignment.connect (slider_board.send_modulator); slider_board.send_assignable_mode.connect (main_display_unit.channel_mod_screen.set_assignable); - slider_board.open_LFO_editor.connect (main_display_unit.open_LFO_screen); + slider_board.open_LFO_editor.connect (main_display_unit.open_lfo_screen); metronome_player.beat_sync.connect (() => { beat_counter_panel.sync (); }); this.destroy.connect (() => { slider_board.stop_monitoring (); }); - print("Initialized...\n"); + print ("Initialized\n"); } void load_voices () { - var voice_analyser = new Ensembles.Core.VoiceAnalyser (sf_loc, sf_schema_loc); + var voice_analyser = new Ensembles.Core.VoiceAnalyser (sf_loc, sf_schema_loc); detected_voices = voice_analyser.get_all_voices (); detected_voice_indices = voice_analyser.get_all_category_indices (); main_display_unit.update_voice_list (detected_voices); } } -} \ No newline at end of file +} diff --git a/src/Shell/Views/AppMenuView.vala b/src/Shell/Views/AppMenuView.vala index 26e3d45c..e37a4a7d 100644 --- a/src/Shell/Views/AppMenuView.vala +++ b/src/Shell/Views/AppMenuView.vala @@ -17,7 +17,7 @@ * Authored by: Subhadeep Jasu */ -namespace Ensembles.Shell { +namespace Ensembles.Shell { public class AppMenuView : Gtk.Popover { Ensembles.Core.ControllerDevice[] controller_devices; @@ -26,7 +26,7 @@ namespace Ensembles.Shell { public signal void change_enable_midi_input (bool enable); public signal void change_active_input_device (Ensembles.Core.ControllerDevice device); - public AppMenuView(Gtk.Widget? relative_to) { + public AppMenuView (Gtk.Widget? relative_to) { this.relative_to = relative_to; make_ui (); } @@ -68,7 +68,7 @@ namespace Ensembles.Shell { device_monitor_toggle.notify["active"].connect (() => { revealer.reveal_child = device_monitor_toggle.active; change_enable_midi_input (device_monitor_toggle.active); - }); + }); device_list_box = new Gtk.ListBox (); device_list_box.set_activate_on_single_click (false); @@ -102,8 +102,8 @@ namespace Ensembles.Shell { controller_devices = null; controller_devices = devices; - print("Update Device list...\n"); - + print ("Updating Device list\n"); + var previous_items = device_list_box.get_children (); foreach (var item in previous_items) { device_list_box.remove (item); @@ -118,4 +118,4 @@ namespace Ensembles.Shell { device_list_box.show_all (); } } -} \ No newline at end of file +} diff --git a/src/Shell/Views/BeatCounterView.vala b/src/Shell/Views/BeatCounterView.vala index b439a24b..5de8f6cf 100644 --- a/src/Shell/Views/BeatCounterView.vala +++ b/src/Shell/Views/BeatCounterView.vala @@ -17,7 +17,7 @@ * Authored by: Subhadeep Jasu */ -namespace Ensembles.Shell { +namespace Ensembles.Shell { public class BeatCounterView : Gtk.Overlay { Gtk.Image beat_counter_0; Gtk.Image beat_counter_1; @@ -36,7 +36,7 @@ namespace Ensembles.Shell { bool halt_ack = false; - public BeatCounterView() { + public BeatCounterView () { var main_grid = new Gtk.Grid (); beat_counter_0 = new Gtk.Image.from_resource ("/com/github/subhadeepjasu/ensembles/images/beat_counter/beat_counter_1_0.svg"); beat_counter_1 = new Gtk.Image.from_resource ("/com/github/subhadeepjasu/ensembles/images/beat_counter/beat_counter_2_0.svg"); @@ -100,14 +100,14 @@ namespace Ensembles.Shell { if (halt_ack) { halt_ack = false; } else { - Timeout.add ((uint)(60000/tempo), () => { + Timeout.add ((uint)(60000 / tempo), () => { if (halt_ack) { halt_ack = false; } else { pulse_1 (); - Timeout.add ((uint)(60000/tempo), () => { + Timeout.add ((uint)(60000 / tempo), () => { pulse_2 (); - Timeout.add ((uint)(60000/tempo), () => { + Timeout.add ((uint)(60000 / tempo), () => { pulse_3 (); return false; }); @@ -121,7 +121,7 @@ namespace Ensembles.Shell { public void halt () { halt_ack = true; - Timeout.add (60000/(tempo * 2), () => { + Timeout.add (60000 / (tempo * 2), () => { halt_ack = false; return false; }); @@ -129,31 +129,31 @@ namespace Ensembles.Shell { void pulse_0 () { beat_counter_active_0.set_opacity (1); - Timeout.add (60000/(tempo * 2), () => { + Timeout.add (60000 / (tempo * 2), () => { beat_counter_active_0.set_opacity (0); return false; }); } void pulse_1 () { beat_counter_active_1.set_opacity (1); - Timeout.add (60000/(tempo * 2), () => { + Timeout.add (60000 / (tempo * 2), () => { beat_counter_active_1.set_opacity (0); return false; }); } void pulse_2 () { beat_counter_active_2.set_opacity (1); - Timeout.add (60000/(tempo * 2), () => { + Timeout.add (60000 / (tempo * 2), () => { beat_counter_active_2.set_opacity (0); return false; }); } void pulse_3 () { beat_counter_active_3.set_opacity (1); - Timeout.add (60000/(tempo * 2), () => { + Timeout.add (60000 / (tempo * 2), () => { beat_counter_active_3.set_opacity (0); return false; }); } } -} \ No newline at end of file +} diff --git a/src/Shell/Views/ControlPanel.vala b/src/Shell/Views/ControlPanel.vala index f5a8ac41..ba17ab69 100644 --- a/src/Shell/Views/ControlPanel.vala +++ b/src/Shell/Views/ControlPanel.vala @@ -17,7 +17,7 @@ * Authored by: Subhadeep Jasu */ -namespace Ensembles.Shell { +namespace Ensembles.Shell { public class ControlPanel : Gtk.Grid { ToggleSwitch accomp_toggle; @@ -95,7 +95,6 @@ namespace Ensembles.Shell { main_dial = new Dial (); attach (main_dial, 0, 0, 2, 4); - attach (accomp_toggle, 2, 0, 1, 1); attach (layer_toggle, 2, 1, 1, 1); @@ -156,4 +155,4 @@ namespace Ensembles.Shell { }); } } -} \ No newline at end of file +} diff --git a/src/Shell/Views/JoyStick.vala b/src/Shell/Views/JoyStick.vala index f37da9db..86db4e2f 100644 --- a/src/Shell/Views/JoyStick.vala +++ b/src/Shell/Views/JoyStick.vala @@ -17,7 +17,7 @@ * Authored by: Subhadeep Jasu */ -namespace Ensembles.Shell { +namespace Ensembles.Shell { public class JoyStick : Gtk.Grid { Gtk.Button x_assign_button; Gtk.Button y_assign_button; @@ -40,4 +40,4 @@ namespace Ensembles.Shell { width_request = 150; } } -} \ No newline at end of file +} diff --git a/src/Shell/Views/KeyboardView.vala b/src/Shell/Views/KeyboardView.vala index 02d75c94..6249748a 100644 --- a/src/Shell/Views/KeyboardView.vala +++ b/src/Shell/Views/KeyboardView.vala @@ -17,7 +17,7 @@ * Authored by: Subhadeep Jasu */ -namespace Ensembles.Shell { +namespace Ensembles.Shell { public class KeyboardView : Gtk.Grid { OctaveKeyboard[] octaves; Gtk.Box key_grid; @@ -25,7 +25,7 @@ namespace Ensembles.Shell { Gtk.Switch zoom_switch; JoyStick joy_stick; Ensembles.Core.Synthesizer _synth; - public KeyboardView() { + public KeyboardView () { get_style_context ().add_class ("keyboard-background"); valign = Gtk.Align.END; key_grid = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 0); @@ -69,8 +69,6 @@ namespace Ensembles.Shell { keyboard_top_bar.height_request = 24; keyboard_top_bar.get_style_context ().add_class ("keyboard-top-bar"); keyboard_top_bar.add (switch_bar); - - keyboard_overlay.add_overlay (keyboard_top_bar); keyboard_overlay.set_overlay_pass_through (keyboard_top_bar, true); @@ -109,7 +107,7 @@ namespace Ensembles.Shell { } public void set_note_on (int key, bool on) { - octaves[(int)(key/12) - 3].set_note_on (key % 12, on); + octaves[(int)(key / 12) - 3].set_note_on (key % 12, on); } public void update_split () { @@ -118,4 +116,4 @@ namespace Ensembles.Shell { } } } -} \ No newline at end of file +} diff --git a/src/Shell/Views/MixerBoardView.vala b/src/Shell/Views/MixerBoardView.vala index 0ea4e145..3a5533b7 100644 --- a/src/Shell/Views/MixerBoardView.vala +++ b/src/Shell/Views/MixerBoardView.vala @@ -17,7 +17,7 @@ * Authored by: Subhadeep Jasu */ -namespace Ensembles.Shell { +namespace Ensembles.Shell { public class MixerBoardView : Gtk.Grid { Gtk.Scale[] style_gain_sliders; @@ -33,7 +33,7 @@ namespace Ensembles.Shell { public MixerBoardView () { halign = Gtk.Align.CENTER; vexpand = true; - int i = 0; + int i = 0; style_gain_sliders = new Gtk.Scale [16]; for (i = 0; i < 16; i++) { @@ -45,7 +45,7 @@ namespace Ensembles.Shell { style_gain_sliders[0].vexpand = true; connect_style_sliders (); - voice_l_gain_slider = new Gtk.Scale.with_range (Gtk.Orientation.VERTICAL, 0, 1, 0.1); + voice_l_gain_slider = new Gtk.Scale.with_range (Gtk.Orientation.VERTICAL, 0, 1, 0.1); voice_l_gain_slider.inverted = true; voice_l_gain_slider.draw_value = false; voice_l_gain_slider.margin_start = 4; @@ -57,7 +57,7 @@ namespace Ensembles.Shell { }); - voice_r1_gain_slider = new Gtk.Scale.with_range (Gtk.Orientation.VERTICAL, 0, 1, 0.1); + voice_r1_gain_slider = new Gtk.Scale.with_range (Gtk.Orientation.VERTICAL, 0, 1, 0.1); voice_r1_gain_slider.inverted = true; voice_r1_gain_slider.draw_value = false; attach (voice_r1_gain_slider, i++, 0, 1, 1); @@ -67,7 +67,7 @@ namespace Ensembles.Shell { }); - voice_r2_gain_slider = new Gtk.Scale.with_range (Gtk.Orientation.VERTICAL, 0, 1, 0.1); + voice_r2_gain_slider = new Gtk.Scale.with_range (Gtk.Orientation.VERTICAL, 0, 1, 0.1); voice_r2_gain_slider.inverted = true; voice_r2_gain_slider.draw_value = false; attach (voice_r2_gain_slider, i++, 0, 1, 1); @@ -78,7 +78,6 @@ namespace Ensembles.Shell { style_chord_gain_slider = new Gtk.Scale.with_range (Gtk.Orientation.VERTICAL, 0, 1, 0.1); - style_chord_gain_slider.inverted = true; style_chord_gain_slider.draw_value = false; attach (style_chord_gain_slider, i++, 0, 1, 1); @@ -332,17 +331,17 @@ namespace Ensembles.Shell { if (synth_index == 0) { switch (channel) { case 0: - voice_r1_gain_slider.set_value ((double)value/127); + voice_r1_gain_slider.set_value ((double)value / 127); break; case 1: - voice_r2_gain_slider.set_value ((double)value/127); + voice_r2_gain_slider.set_value ((double)value / 127); break; case 2: - voice_l_gain_slider.set_value ((double)value/127); + voice_l_gain_slider.set_value ((double)value / 127); break; } } else { - style_gain_sliders[channel].set_value ((double)value/127); + style_gain_sliders[channel].set_value ((double)value / 127); } return false; }); @@ -363,4 +362,4 @@ namespace Ensembles.Shell { return 0; } } -} \ No newline at end of file +} diff --git a/src/Shell/Views/MultipadView.vala b/src/Shell/Views/MultipadView.vala index db62ddb6..1bb5990e 100644 --- a/src/Shell/Views/MultipadView.vala +++ b/src/Shell/Views/MultipadView.vala @@ -17,7 +17,7 @@ * Authored by: Subhadeep Jasu */ -namespace Ensembles.Shell { +namespace Ensembles.Shell { public class MultipadView : Gtk.Grid { Gtk.Button[] pads; Gtk.Button assign_button; @@ -36,8 +36,8 @@ namespace Ensembles.Shell { pads = new Gtk.Button [12]; for (int i = 0; i < 6; i++) { - pads[i] = new Gtk.Button(); - pads[i + 6] = new Gtk.Button(); + pads[i] = new Gtk.Button (); + pads[i + 6] = new Gtk.Button (); pads[i].width_request = 32; pads[i].hexpand = true; pads[i + 6].width_request = 32; @@ -50,7 +50,6 @@ namespace Ensembles.Shell { assign_button.vexpand = true; assign_button.get_style_context ().add_class (Gtk.STYLE_CLASS_SUGGESTED_ACTION); attach (assign_button, 7, 1, 1, 2); - stop_button = new Gtk.Button.with_label ("Stop"); stop_button.width_request = 51; attach (stop_button, 8, 1, 1, 2); @@ -58,4 +57,4 @@ namespace Ensembles.Shell { show_all (); } } -} \ No newline at end of file +} diff --git a/src/Shell/Views/RegistryView.vala b/src/Shell/Views/RegistryView.vala index 74e7cd80..69c56f6c 100644 --- a/src/Shell/Views/RegistryView.vala +++ b/src/Shell/Views/RegistryView.vala @@ -17,7 +17,7 @@ * Authored by: Subhadeep Jasu */ -namespace Ensembles.Shell { +namespace Ensembles.Shell { public class RegistryView : Gtk.Grid { Gtk.SpinButton bank_select; Gtk.Button[] registry_buttons; @@ -57,4 +57,4 @@ namespace Ensembles.Shell { } } -} \ No newline at end of file +} diff --git a/src/Shell/Views/SliderBoardView.vala b/src/Shell/Views/SliderBoardView.vala index 0fc2a20f..cb7cb632 100644 --- a/src/Shell/Views/SliderBoardView.vala +++ b/src/Shell/Views/SliderBoardView.vala @@ -17,7 +17,7 @@ * Authored by: Subhadeep Jasu */ -namespace Ensembles.Shell { +namespace Ensembles.Shell { public class SliderBoardView : Gtk.Grid { Knob modulator_knob_a; Knob modulator_knob_b; @@ -88,8 +88,8 @@ namespace Ensembles.Shell { knob_assign_button = new Gtk.Button.with_label ("Knob Assign"); master_assign_button = new Gtk.Button.with_label ("Master Knob Assign"); var knob_assign_box = new Gtk.ButtonBox (Gtk.Orientation.HORIZONTAL); - knob_assign_box.add(knob_assign_button); - knob_assign_box.add(master_assign_button); + knob_assign_box.add (knob_assign_button); + knob_assign_box.add (master_assign_button); knob_assign_box.set_layout (Gtk.ButtonBoxStyle.EXPAND); slider_assign_button = new Gtk.Button.with_label ("Slider Assign"); @@ -157,7 +157,7 @@ namespace Ensembles.Shell { slider_grid.attach (new Gtk.Label ((i + 1).to_string ()), i, 1, 1, 1); } - attach (knob_assign_box, 0, 0, 5, 1); + attach (knob_assign_box, 0, 0, 5, 1); attach (modulator_knob_a, 0, 1, 1, 1); attach (new Gtk.Label ("1"), 0, 2, 1, 1); attach (modulator_knob_b, 1, 1, 1, 1); @@ -170,10 +170,8 @@ namespace Ensembles.Shell { attach (master_knob, 4, 1, 1, 3); attach (slider_grid, 0, 4, 5, 1); - show_all (); - slider_assign_button.clicked.connect (() => { slider_assign_mode = !slider_assign_mode; send_assignable_mode (slider_assign_mode); @@ -278,8 +276,11 @@ namespace Ensembles.Shell { }); slider_0.change_value.connect ((scroll, value) => { - if (slider_0_variables != null) { - Ensembles.Core.Synthesizer.set_modulator_value (slider_0_variables[0], slider_0_variables[1], slider_0_variables[2], (int)(value * 127)); + if (slider_0_variables != null) { + Ensembles.Core.Synthesizer.set_modulator_value (slider_0_variables[0], + slider_0_variables[1], + slider_0_variables[2], + (int)(value * 127)); } assignable_slider_index = 0; slider_1.get_style_context ().remove_class ("slider-assignable"); @@ -302,7 +303,7 @@ namespace Ensembles.Shell { return false; }); slider_1.change_value.connect ((scroll, value) => { - if (slider_1_variables != null) { + if (slider_1_variables != null) { Ensembles.Core.Synthesizer.set_modulator_value (slider_1_variables[0], slider_1_variables[1], slider_1_variables[2], (int)(value * 127)); } assignable_slider_index = 1; @@ -326,7 +327,7 @@ namespace Ensembles.Shell { return false; }); slider_2.change_value.connect ((scroll, value) => { - if (slider_2_variables != null) { + if (slider_2_variables != null) { Ensembles.Core.Synthesizer.set_modulator_value (slider_2_variables[0], slider_2_variables[1], slider_2_variables[2], (int)(value * 127)); } assignable_slider_index = 2; @@ -350,7 +351,7 @@ namespace Ensembles.Shell { return false; }); slider_3.change_value.connect ((scroll, value) => { - if (slider_3_variables != null) { + if (slider_3_variables != null) { Ensembles.Core.Synthesizer.set_modulator_value (slider_3_variables[0], slider_3_variables[1], slider_3_variables[2], (int)(value * 127)); } assignable_slider_index = 3; @@ -374,7 +375,7 @@ namespace Ensembles.Shell { return false; }); slider_4.change_value.connect ((scroll, value) => { - if (slider_4_variables != null) { + if (slider_4_variables != null) { Ensembles.Core.Synthesizer.set_modulator_value (slider_4_variables[0], slider_4_variables[1], slider_4_variables[2], (int)(value * 127)); } assignable_slider_index = 4; @@ -398,7 +399,7 @@ namespace Ensembles.Shell { return false; }); slider_5.change_value.connect ((scroll, value) => { - if (slider_5_variables != null) { + if (slider_5_variables != null) { Ensembles.Core.Synthesizer.set_modulator_value (slider_5_variables[0], slider_5_variables[1], slider_5_variables[2], (int)(value * 127)); } assignable_slider_index = 5; @@ -422,7 +423,7 @@ namespace Ensembles.Shell { return false; }); slider_6.change_value.connect ((scroll, value) => { - if (slider_6_variables != null) { + if (slider_6_variables != null) { Ensembles.Core.Synthesizer.set_modulator_value (slider_6_variables[0], slider_6_variables[1], slider_6_variables[2], (int)(value * 127)); } assignable_slider_index = 6; @@ -446,7 +447,7 @@ namespace Ensembles.Shell { return false; }); slider_7.change_value.connect ((scroll, value) => { - if (slider_7_variables != null) { + if (slider_7_variables != null) { Ensembles.Core.Synthesizer.set_modulator_value (slider_7_variables[0], slider_7_variables[1], slider_7_variables[2], (int)(value * 127)); } assignable_slider_index = 7; @@ -470,7 +471,7 @@ namespace Ensembles.Shell { return false; }); slider_8.change_value.connect ((scroll, value) => { - if (slider_8_variables != null) { + if (slider_8_variables != null) { Ensembles.Core.Synthesizer.set_modulator_value (slider_8_variables[0], slider_8_variables[1], slider_8_variables[2], (int)(value * 127)); } assignable_slider_index = 8; @@ -494,7 +495,7 @@ namespace Ensembles.Shell { return false; }); slider_9.change_value.connect ((scroll, value) => { - if (slider_9_variables != null) { + if (slider_9_variables != null) { Ensembles.Core.Synthesizer.set_modulator_value (slider_9_variables[0], slider_9_variables[1], slider_9_variables[2], (int)(value * 127)); } assignable_slider_index = 9; @@ -645,7 +646,6 @@ namespace Ensembles.Shell { modulator_knob_d.set_value (value); Ensembles.Core.Synthesizer.set_modulator_value (knob_d_variables[0], knob_d_variables[1], knob_d_variables[2], (int)(value * 127)); } - for (int i = 0; i < 14; i++) { if (master_knob_assigns[i]) { assigned = true; @@ -838,4 +838,4 @@ namespace Ensembles.Shell { }); } } -} \ No newline at end of file +} diff --git a/src/Shell/Views/SongControllerView.vala b/src/Shell/Views/SongControllerView.vala index 17f934e9..2dabd2e1 100644 --- a/src/Shell/Views/SongControllerView.vala +++ b/src/Shell/Views/SongControllerView.vala @@ -17,7 +17,7 @@ * Authored by: Subhadeep Jasu */ -namespace Ensembles.Shell { +namespace Ensembles.Shell { public class SongControllerView : Gtk.Grid { Gtk.Button prev_button; Gtk.Button play_button; @@ -37,4 +37,4 @@ namespace Ensembles.Shell { this.show_all (); } } -} \ No newline at end of file +} diff --git a/src/Shell/Views/StyleControllerView.vala b/src/Shell/Views/StyleControllerView.vala index 2411f922..f1431c02 100644 --- a/src/Shell/Views/StyleControllerView.vala +++ b/src/Shell/Views/StyleControllerView.vala @@ -56,8 +56,8 @@ namespace Ensembles.Shell { var intro_box = new Gtk.ButtonBox (Gtk.Orientation.HORIZONTAL); intro_button_a = new Gtk.Button.with_label ("1"); intro_button_b = new Gtk.Button.with_label ("2"); - intro_box.add(intro_button_a); - intro_box.add(intro_button_b); + intro_box.add (intro_button_a); + intro_box.add (intro_button_b); intro_box.set_layout (Gtk.ButtonBoxStyle.EXPAND); intro_button_a.set_sensitive (false); intro_button_b.set_sensitive (false); @@ -82,10 +82,10 @@ namespace Ensembles.Shell { var_fill_button_b = new Gtk.Button.with_label ("B"); var_fill_button_c = new Gtk.Button.with_label ("C"); var_fill_button_d = new Gtk.Button.with_label ("D"); - var_fill_box.add(var_fill_button_a); - var_fill_box.add(var_fill_button_b); - var_fill_box.add(var_fill_button_c); - var_fill_box.add(var_fill_button_d); + var_fill_box.add (var_fill_button_a); + var_fill_box.add (var_fill_button_b); + var_fill_box.add (var_fill_button_c); + var_fill_box.add (var_fill_button_d); var_fill_box.set_layout (Gtk.ButtonBoxStyle.EXPAND); var_fill_button_a.set_sensitive (false); var_fill_button_b.set_sensitive (false); @@ -135,8 +135,8 @@ namespace Ensembles.Shell { ending_button_b = new Gtk.Button.with_label ("2"); ending_button_a.set_sensitive (false); ending_button_b.set_sensitive (false); - ending_box.add(ending_button_a); - ending_box.add(ending_button_b); + ending_box.add (ending_button_a); + ending_box.add (ending_button_b); ending_box.set_layout (Gtk.ButtonBoxStyle.EXPAND); ending_button_a.clicked.connect (() => { queue_ending_a (); @@ -159,8 +159,8 @@ namespace Ensembles.Shell { sync_stop_button = new Gtk.Button.with_label ("Sync Stop"); sync_start_button.set_sensitive (false); sync_stop_button.set_sensitive (false); - sync_box.add(sync_start_button); - sync_box.add(sync_stop_button); + sync_box.add (sync_start_button); + sync_box.add (sync_stop_button); sync_box.set_layout (Gtk.ButtonBoxStyle.EXPAND); sync_start_button.clicked.connect (() => { sync_start_button.get_style_context ().add_class ("queue-measure"); @@ -194,7 +194,6 @@ namespace Ensembles.Shell { this.attach (ending_box, 3, 0, 1, 1); this.attach (sync_box, 4, 0, 1, 1); this.attach (start_button, 5, 0, 1, 1); - this.attach (intro_label, 0, 1, 1, 1); this.attach (var_label, 1, 1, 1, 1); this.attach (ending_label, 3, 1, 1, 1); @@ -323,4 +322,4 @@ namespace Ensembles.Shell { } } } -} \ No newline at end of file +} diff --git a/src/Shell/Views/VoiceCategoryView.vala b/src/Shell/Views/VoiceCategoryView.vala index 6b549008..ecf24352 100644 --- a/src/Shell/Views/VoiceCategoryView.vala +++ b/src/Shell/Views/VoiceCategoryView.vala @@ -17,7 +17,7 @@ * Authored by: Subhadeep Jasu */ -namespace Ensembles.Shell { +namespace Ensembles.Shell { public class VoiceCategoryView : Gtk.Grid { Gtk.Button piano_button; Gtk.Button chromatic_perc; @@ -121,4 +121,4 @@ namespace Ensembles.Shell { }); } } -} \ No newline at end of file +} From fcf2448b725f5cd7de0d3f46d3fe7f3af0d9dd4c Mon Sep 17 00:00:00 2001 From: SubhadeepJasu Date: Thu, 15 Jul 2021 15:52:13 +0530 Subject: [PATCH 14/14] Fix missed code style issues --- src/Core/VoiceAnalyser.vala | 2 +- src/Main.vala | 6 +++--- src/Shell/Application.vala | 2 +- src/Shell/Display/MainDisplayCasing.vala | 8 ++++---- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Core/VoiceAnalyser.vala b/src/Core/VoiceAnalyser.vala index 2608c76f..a5f0d319 100644 --- a/src/Core/VoiceAnalyser.vala +++ b/src/Core/VoiceAnalyser.vala @@ -35,7 +35,7 @@ namespace Ensembles.Core { voices.resize (voices.length + 1); if (line != null) { string[] parts = line.split (","); - int bank = int.parse (parts[0]); + int bank = int.parse (parts[0]); int preset = int.parse (parts[1]); if (bank == sf_preset_bank_num && preset == sf_preset_num) { category = parts[2]; diff --git a/src/Main.vala b/src/Main.vala index bb41c351..c72a2bdf 100644 --- a/src/Main.vala +++ b/src/Main.vala @@ -23,11 +23,11 @@ * * @see Ensembls.Shell.EnsemblesApp * @return {@code int} - * @since 1.0.0 + * @since 0.0.1 */ public static int main (string[] args) { - X.init_threads (); + X.init_threads (); var app = new Ensembles.Shell.EnsemblesApp (); var ret = app.run (args); return ret; -} \ No newline at end of file +} diff --git a/src/Shell/Application.vala b/src/Shell/Application.vala index d21af216..da244551 100644 --- a/src/Shell/Application.vala +++ b/src/Shell/Application.vala @@ -53,7 +53,7 @@ namespace Ensembles.Shell { css_provider.load_from_resource ("/com/github/subhadeepjasu/ensembles/Application.css"); // CSS Provider Gtk.StyleContext.add_provider_for_screen ( - Gdk.Screen.get_default(), + Gdk.Screen.get_default (), css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION ); diff --git a/src/Shell/Display/MainDisplayCasing.vala b/src/Shell/Display/MainDisplayCasing.vala index 1f90948f..899a3d0d 100644 --- a/src/Shell/Display/MainDisplayCasing.vala +++ b/src/Shell/Display/MainDisplayCasing.vala @@ -158,16 +158,16 @@ namespace Ensembles.Shell { string[] name_arr = new string [names.length ()]; string[] genre_arr = new string [genre.length ()]; int[] tempo_arr = new int [tempo.length ()]; - for(int i = 0; i < paths.length (); i++) { + for (int i = 0; i < paths.length (); i++) { path_arr[i] = paths.nth_data (i); } - for(int i = 0; i < names.length (); i++) { + for (int i = 0; i < names.length (); i++) { name_arr[i] = names.nth_data (i); } - for(int i = 0; i < genre.length (); i++) { + for (int i = 0; i < genre.length (); i++) { genre_arr[i] = genre.nth_data (i); } - for(int i = 0; i < tempo.length (); i++) { + for (int i = 0; i < tempo.length (); i++) { tempo_arr[i] = tempo.nth_data (i); } style_menu.populate_style_menu (path_arr, name_arr, genre_arr, tempo_arr);