From eaf5d404450c4e467b981db1ea79c6871667a52e Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Fri, 25 Aug 2023 11:37:02 +0200 Subject: Add global BPM behaviour --- src/drawing.c | 17 ++++++++++++++--- src/globals.c | 12 ++++++++++++ src/main.c | 14 +++++++++----- src/sequencer.c | 57 +++++++++++++++++++++++++++++++++------------------------ src/settings.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- src/settings.h | 27 +++++++++++++++++---------- 6 files changed, 137 insertions(+), 45 deletions(-) diff --git a/src/drawing.c b/src/drawing.c index fbc741c..27e265b 100644 --- a/src/drawing.c +++ b/src/drawing.c @@ -418,7 +418,12 @@ draw_bpm() { txt_drawf("SYNC", x + 2, y + 2, COL_FG); } else { // Make sure its horizontally centered if only 2 digits - int bpm = patterns[pattern_selection_loc].bpm; + int bpm; + if (settings.global_bpm) { + bpm = settings.bpm; + } else { + bpm = patterns[pattern_selection_loc].bpm; + } if (bpm >= 100) { txt_drawf("%d", x + 5, y + 2, COL_FG, bpm); } else { @@ -1672,7 +1677,7 @@ draw_notif_bar() { return; } - if (settings.help == HELP_ON) { + if (settings.help == TOGGLE_ON) { if (input_handler == handle_trigger_selection || input_handler == handle_channel_selection) { txt_drawf_small("L/R:NOTE A:PARAMS B:TOGGLE", x0 + 2, y0 + 1, color); @@ -1735,7 +1740,13 @@ draw_notif_bar() { roots[current_scale_root], scale_long[current_scale]); } break; case R_COL_BPM: { - txt_drawf_small("TEMPO: %d bpm", x0 + 2, y0 + 1, color, patterns[pattern_selection_loc].bpm); + int bpm; + if (settings.global_bpm) { + bpm = settings.bpm; + } else { + bpm = patterns[pattern_selection_loc].bpm; + } + txt_drawf_small("TEMPO: %d bpm", x0 + 2, y0 + 1, color, bpm); } break; } return; diff --git a/src/globals.c b/src/globals.c index b94cb11..7361129 100644 --- a/src/globals.c +++ b/src/globals.c @@ -190,3 +190,15 @@ typedef enum Prob { PROB_20, PROB_NUM, } Prob; + +bool redraw_pattern_buttons = true; +bool redraw_play_pause = true; +bool redraw_trigs = true; +bool redraw_channels = true; +bool redraw_bank_buttons = true; +bool redraw_params = true; +bool redraw_bpm = true; +bool redraw_scale = true; +bool update_bpm = false; +u8 bar_counter = 0; + diff --git a/src/main.c b/src/main.c index ae14d87..68049ee 100644 --- a/src/main.c +++ b/src/main.c @@ -146,11 +146,11 @@ render_settings(void) { y0 += 17; draw_rect(x0, y0, x1, y0 + 10, COL_FG); txt_drawf("MUTE", x0 + 2, y0 + 1, COL_FG); - txt_drawf("OFF", x1 + 8, y0 + 1, COL_FG); + txt_drawf("%s", x1 + 8, y0 + 1, COL_FG, toggle_settings_str[settings.global_mute]); y0 += 17; draw_rect(x0, y0, x1, y0 + 10, COL_FG); txt_drawf("BPM", x0 + 2, y0 + 1, COL_FG); - txt_drawf("OFF", x1 + 8, y0 + 1, COL_FG); + txt_drawf("%s", x1 + 8, y0 + 1, COL_FG, toggle_settings_str[settings.global_bpm]); y0 += 17; txt_drawf("GENERAL", x0, y0, COL_FG); @@ -158,7 +158,7 @@ render_settings(void) { y0 += 17; draw_rect(x0, y0, x1, y0 + 10, COL_FG); txt_drawf("AUTO-SAVE", x0 + 2, y0 + 1, COL_FG); - txt_drawf("OFF", x1 + 8, y0 + 1, COL_FG); + txt_drawf("%s", x1 + 8, y0 + 1, COL_FG, toggle_settings_str[settings.auto_save]); y0 += 17; draw_rect(x0, y0, x1, y0 + 10, COL_FG); txt_drawf("SYNC", x0 + 2, y0 + 1, COL_FG); @@ -170,7 +170,7 @@ render_settings(void) { y0 += 17; draw_rect(x0, y0, x1, y0 + 10, COL_FG); txt_drawf("HELP", x0 + 2, y0 + 1, COL_FG); - txt_drawf("%s", x1 + 8, y0 + 1, COL_FG, help_setting_str[settings.help]); + txt_drawf("%s", x1 + 8, y0 + 1, COL_FG, toggle_settings_str[settings.help]); PROF(draw_settings_cursor(), draw_cursor_cycles); } @@ -224,7 +224,11 @@ update(void) { last_pattern_loc = pattern_selection_loc; last_right_col_loc = right_col_selection_loc; if (update_bpm) { - set_time(patterns[current_pattern].bpm); + if (settings.global_bpm) { + set_time(settings.bpm); + } else { + set_time(patterns[current_pattern].bpm); + } update_bpm = false; } if (audio_sync_click) { diff --git a/src/sequencer.c b/src/sequencer.c index f3dff04..07f3012 100644 --- a/src/sequencer.c +++ b/src/sequencer.c @@ -8,17 +8,6 @@ void set_time(int bpm); -bool redraw_pattern_buttons = true; -bool redraw_play_pause = true; -bool redraw_trigs = true; -bool redraw_channels = true; -bool redraw_bank_buttons = true; -bool redraw_params = true; -bool redraw_bpm = true; -bool redraw_scale = true; -bool update_bpm = false; -u8 bar_counter = 0; - void clear_pattern(size_t idx) { Pattern *pat = &patterns[idx]; @@ -121,7 +110,9 @@ select_bank(int i) { next_pattern = 0; next_bank = i; clipboard.type = CLIP_EMPTY; - save_bank(current_bank); + if (settings.auto_save) { + save_bank(current_bank); + } metadata.current_pattern = current_pattern; metadata.current_bank = i; save_metadata(); @@ -552,7 +543,11 @@ toggle_playing(void) { if (current_bank != next_bank) { select_bank(next_bank); } - set_time(patterns[current_pattern].bpm); + if (settings.global_bpm) { + set_time(settings.bpm); + } else { + set_time(patterns[current_pattern].bpm); + } play_step(); } else { TIMER_CTRL_2 ^= TIMER_CTRL_ENABLE; @@ -590,7 +585,11 @@ pause_playing(void) { current_pattern = next_pattern; redraw_pattern_buttons = true; } - set_time(patterns[current_pattern].bpm); + if (settings.global_bpm) { + set_time(settings.bpm); + } else { + set_time(patterns[current_pattern].bpm); + } play_step(); } else { TIMER_CTRL_2 ^= TIMER_CTRL_ENABLE; @@ -666,13 +665,18 @@ handle_right_col_selection(void) { if (key_pressed(KEY_SELECT)) { bpm_inc = -10; } - patterns[pattern_selection_loc].bpm = CLAMP( - patterns[pattern_selection_loc].bpm + bpm_inc, - 10, - 300); + if (settings.global_bpm) { + settings.bpm = CLAMP(settings.bpm + bpm_inc, 10, 300); + } else { + patterns[pattern_selection_loc].bpm = CLAMP(patterns[pattern_selection_loc].bpm + bpm_inc, 10, 300); + } if ((TIMER_CTRL_2 & TIMER_CTRL_ENABLE) != 0 && current_pattern == pattern_selection_loc) { - set_time(patterns[current_pattern].bpm); + if (settings.global_bpm) { + set_time(settings.bpm); + } else { + set_time(patterns[current_pattern].bpm); + } } redraw_bpm = true; if (patterns[pattern_selection_loc].empty) { @@ -701,13 +705,18 @@ handle_right_col_selection(void) { if (key_pressed(KEY_SELECT)) { bpm_inc = 10; } - patterns[pattern_selection_loc].bpm = CLAMP( - patterns[pattern_selection_loc].bpm + bpm_inc, - 10, - 300); + if (settings.global_bpm) { + settings.bpm = CLAMP(settings.bpm + bpm_inc, 10, 300); + } else { + patterns[pattern_selection_loc].bpm = CLAMP(patterns[pattern_selection_loc].bpm + bpm_inc, 10, 300); + } if ((TIMER_CTRL_2 & TIMER_CTRL_ENABLE) != 0 && current_pattern == pattern_selection_loc) { - set_time(patterns[current_pattern].bpm); + if (settings.global_bpm) { + set_time(settings.bpm); + } else { + set_time(patterns[current_pattern].bpm); + } } redraw_bpm = true; if (patterns[pattern_selection_loc].empty) { diff --git a/src/settings.c b/src/settings.c index eb1393b..5a10c90 100644 --- a/src/settings.c +++ b/src/settings.c @@ -1,7 +1,10 @@ #include "settings.h" #include "save.h" -static Settings settings = {0}; +static Settings settings = { + .bpm = 90, + .auto_save = TOGGLE_ON, +}; static int settings_cursor_loc = 0; void serial_irq(void); @@ -86,8 +89,31 @@ handle_settings_input(void) { } swap_palette(settings.theme); } break; + case SETTINGS_GLOBAL_MUTE: { + if ((settings.global_mute + 1) >= TOGGLE_NUM) { + settings.global_mute = 0; + } else { + settings.global_mute++; + } + } break; + case SETTINGS_GLOBAL_BPM: { + if ((settings.global_bpm + 1) >= TOGGLE_NUM) { + settings.global_bpm = 0; + } else { + settings.global_bpm++; + } + redraw_bpm = true; + update_bpm = true; + } break; + case SETTINGS_AUTO_SAVE: { + if ((settings.auto_save + 1) >= TOGGLE_NUM) { + settings.auto_save = 0; + } else { + settings.auto_save++; + } + } break; case SETTINGS_HELP: { - if ((settings.help + 1) >= HELP_NUM) { + if ((settings.help + 1) >= TOGGLE_NUM) { settings.help = 0; } else { settings.help++; @@ -115,9 +141,32 @@ handle_settings_input(void) { } swap_palette(settings.theme); } break; + case SETTINGS_GLOBAL_MUTE: { + if (settings.global_mute == 0) { + settings.global_mute = TOGGLE_NUM - 1; + } else { + settings.global_mute--; + } + } break; + case SETTINGS_GLOBAL_BPM: { + if (settings.global_bpm == 0) { + settings.global_bpm = TOGGLE_NUM - 1; + } else { + settings.global_bpm--; + } + redraw_bpm = true; + update_bpm = true; + } break; + case SETTINGS_AUTO_SAVE: { + if (settings.auto_save == 0) { + settings.auto_save = TOGGLE_NUM - 1; + } else { + settings.auto_save--; + } + } break; case SETTINGS_HELP: { if (settings.help == 0) { - settings.help = HELP_NUM - 1; + settings.help = TOGGLE_NUM - 1; } else { settings.help--; } diff --git a/src/settings.h b/src/settings.h index f917534..a348517 100644 --- a/src/settings.h +++ b/src/settings.h @@ -2,8 +2,8 @@ #define SETTINGS_H typedef enum SettingsList { - SETTINGS_GLOB_MUTE, - SETTINGS_GLOB_BPM, + SETTINGS_GLOBAL_MUTE, + SETTINGS_GLOBAL_BPM, SETTINGS_AUTO_SAVE, SETTINGS_SYNC, SETTINGS_THEME, @@ -59,22 +59,29 @@ char * theme_setting_str[] = { "MERVEILLES", }; -typedef enum HelpSetting { - HELP_OFF = 0, - HELP_ON, - HELP_NUM, -} HelpSetting; +typedef enum ToggleSettings { + TOGGLE_OFF = 0, + TOGGLE_ON, + TOGGLE_NUM, +} ToggleSettings; -char * help_setting_str[] = { +char * toggle_settings_str[] = { "OFF", "ON", }; typedef struct Settings { + ToggleSettings global_mute; + bool mutes[4]; + ToggleSettings global_bpm; + int bpm; + ToggleSettings auto_save; SyncSetting sync; ThemeSetting theme; - HelpSetting help; - u8 reserved[63]; + ToggleSettings help; + u8 reserved[52]; } Settings; +// TODO: Save globals on a separate struct, within the metadata struct? + #endif // SETTINGS_H -- cgit v1.2.1