diff --git a/src/deluge/gui/l10n/english.json b/src/deluge/gui/l10n/english.json index 20481f7873..0abcdd766b 100644 --- a/src/deluge/gui/l10n/english.json +++ b/src/deluge/gui/l10n/english.json @@ -461,6 +461,7 @@ "STRING_FOR_DEFAULT_UI_DEFAULT_STARTUP_SONG_MODE_TEMPLATE": "Template song (Default.xml)", "STRING_FOR_DEFAULT_UI_DEFAULT_STARTUP_SONG_MODE_LAST_OPENED": "Last opened song", "STRING_FOR_DEFAULT_UI_DEFAULT_STARTUP_SONG_MODE_LAST_SAVED": "Last saved song", + "STRING_FOR_DEFAULT_UI_FLATS": "Use Flats (b)", "STRING_FOR_TEMPO_MAGNITUDE_MATCHING": "Tempo magnitude matching", "STRING_FOR_TRIGGER_CLOCK": "Trigger clock", "STRING_FOR_FM_MODULATOR_1": "FM modulator 1", @@ -491,6 +492,7 @@ "STRING_FOR_COMMUNITY_FEATURE_FINE_TEMPO_KNOB": "Fine Tempo Knob", "STRING_FOR_COMMUNITY_FEATURE_MOD_DEPTH_DECIMALS": "Mod. Depth Decimals", "STRING_FOR_COMMUNITY_FEATURE_CATCH_NOTES": "Catch Notes", + "STRING_FOR_COMMUNITY_FEATURE_USE_FLATS": "Use Flats (b)", "STRING_FOR_COMMUNITY_FEATURE_DELETE_UNUSED_KIT_ROWS": "Delete Unused Kit Rows", "STRING_FOR_COMMUNITY_FEATURE_ALT_DELAY_PARAMS": "Alternative Golden Knob Delay Params", "STRING_FOR_COMMUNITY_FEATURE_QUANTIZED_STUTTER": "Stutter Rate Quantize", diff --git a/src/deluge/gui/l10n/g_english.cpp b/src/deluge/gui/l10n/g_english.cpp index 2c7aa49d81..fe23a6e912 100644 --- a/src/deluge/gui/l10n/g_english.cpp +++ b/src/deluge/gui/l10n/g_english.cpp @@ -448,6 +448,7 @@ PLACE_SDRAM_DATA Language english{ {STRING_FOR_COMMUNITY_FEATURE_FINE_TEMPO_KNOB, "Fine Tempo Knob"}, {STRING_FOR_COMMUNITY_FEATURE_MOD_DEPTH_DECIMALS, "Mod. Depth Decimals"}, {STRING_FOR_COMMUNITY_FEATURE_CATCH_NOTES, "Catch Notes"}, + {STRING_FOR_COMMUNITY_FEATURE_USE_FLATS, "Use Flats (b)"}, {STRING_FOR_COMMUNITY_FEATURE_DELETE_UNUSED_KIT_ROWS, "Delete Unused Kit Rows"}, {STRING_FOR_COMMUNITY_FEATURE_ALT_DELAY_PARAMS, "Alternative Golden Knob Delay Params"}, {STRING_FOR_COMMUNITY_FEATURE_QUANTIZED_STUTTER, "Stutter Rate Quantize"}, diff --git a/src/deluge/gui/l10n/g_seven_segment.cpp b/src/deluge/gui/l10n/g_seven_segment.cpp index 4825fd752d..4c329d4ddf 100644 --- a/src/deluge/gui/l10n/g_seven_segment.cpp +++ b/src/deluge/gui/l10n/g_seven_segment.cpp @@ -362,6 +362,7 @@ PLACE_SDRAM_DATA Language seven_segment{ {STRING_FOR_COMMUNITY_FEATURE_FINE_TEMPO_KNOB, "TEMP"}, {STRING_FOR_COMMUNITY_FEATURE_MOD_DEPTH_DECIMALS, "MOD."}, {STRING_FOR_COMMUNITY_FEATURE_CATCH_NOTES, "CATC"}, + {STRING_FOR_COMMUNITY_FEATURE_USE_FLATS, "FLAT"}, {STRING_FOR_COMMUNITY_FEATURE_DELETE_UNUSED_KIT_ROWS, "UNUS"}, {STRING_FOR_COMMUNITY_FEATURE_ALT_DELAY_PARAMS, "DELA"}, {STRING_FOR_COMMUNITY_FEATURE_QUANTIZED_STUTTER, "STUT"}, diff --git a/src/deluge/gui/l10n/seven_segment.json b/src/deluge/gui/l10n/seven_segment.json index 83efe11776..8862e28310 100644 --- a/src/deluge/gui/l10n/seven_segment.json +++ b/src/deluge/gui/l10n/seven_segment.json @@ -338,6 +338,7 @@ "STRING_FOR_DEFAULT_UI_DEFAULT_STARTUP_SONG_MODE_TEMPLATE": "TMPL", "STRING_FOR_DEFAULT_UI_DEFAULT_STARTUP_SONG_MODE_LAST_OPENED": "OPEN", "STRING_FOR_DEFAULT_UI_DEFAULT_STARTUP_SONG_MODE_LAST_SAVED": "SAVE", + "STRING_FOR_DEFAULT_UI_FLATS": "FLAT", "STRING_FOR_TEMPO_MAGNITUDE_MATCHING": "MAGN", "STRING_FOR_TRIGGER_CLOCK": "TCLOCK", "STRING_FOR_FM_MODULATOR_1": "MOD1", @@ -373,6 +374,7 @@ "STRING_FOR_COMMUNITY_FEATURE_FINE_TEMPO_KNOB": "TEMP", "STRING_FOR_COMMUNITY_FEATURE_MOD_DEPTH_DECIMALS": "MOD.", "STRING_FOR_COMMUNITY_FEATURE_CATCH_NOTES": "CATC", + "STRING_FOR_COMMUNITY_FEATURE_USE_FLATS": "FLAT", "STRING_FOR_COMMUNITY_FEATURE_DELETE_UNUSED_KIT_ROWS": "UNUS", "STRING_FOR_COMMUNITY_FEATURE_ALT_DELAY_PARAMS": "DELA", "STRING_FOR_COMMUNITY_FEATURE_QUANTIZED_STUTTER": "STUT", diff --git a/src/deluge/gui/l10n/strings.h b/src/deluge/gui/l10n/strings.h index b630e16c38..f5ca8c2e3f 100644 --- a/src/deluge/gui/l10n/strings.h +++ b/src/deluge/gui/l10n/strings.h @@ -476,6 +476,7 @@ enum class String : size_t { STRING_FOR_COMMUNITY_FEATURE_FINE_TEMPO_KNOB, STRING_FOR_COMMUNITY_FEATURE_MOD_DEPTH_DECIMALS, STRING_FOR_COMMUNITY_FEATURE_CATCH_NOTES, + STRING_FOR_COMMUNITY_FEATURE_USE_FLATS, STRING_FOR_COMMUNITY_FEATURE_DELETE_UNUSED_KIT_ROWS, STRING_FOR_COMMUNITY_FEATURE_ALT_DELAY_PARAMS, STRING_FOR_COMMUNITY_FEATURE_QUANTIZED_STUTTER, diff --git a/src/deluge/gui/menu_item/key_range.cpp b/src/deluge/gui/menu_item/key_range.cpp index 0a89bc8c29..060b75a3c1 100644 --- a/src/deluge/gui/menu_item/key_range.cpp +++ b/src/deluge/gui/menu_item/key_range.cpp @@ -20,6 +20,8 @@ #include "gui/ui/sound_editor.h" #include "hid/display/display.h" #include "util/functions.h" +#include "model/settings/runtime_feature_settings.h" + namespace deluge::gui::menu_item { @@ -57,11 +59,17 @@ void KeyRange::selectEncoderAction(int32_t offset) { void KeyRange::getText(char* buffer, int32_t* getLeftLength, int32_t* getRightLength, bool mayShowJustOne) { - *(buffer++) = noteCodeToNoteLetter[lower]; + bool useFlats = runtimeFeatureSettings.get(RuntimeFeatureSettingType::UseFlats) + == RuntimeFeatureStateToggle::On; + char accidential = !useFlats ? '#' : 'b'; + + + *(buffer++) = !useFlats ? noteCodeToNoteLetter[lower] : noteCodeToNoteLetterFlats[lower]; int32_t leftLength = 1; + if (noteCodeIsSharp[lower]) { - *(buffer++) = (display->haveOLED()) ? '#' : '.'; + *(buffer++) = (display->haveOLED()) ? accidential : '.'; if (display->haveOLED()) { leftLength++; } @@ -81,10 +89,10 @@ void KeyRange::getText(char* buffer, int32_t* getLeftLength, int32_t* getRightLe *(buffer++) = '-'; - *(buffer++) = noteCodeToNoteLetter[upper]; + *(buffer++) = !useFlats ? noteCodeToNoteLetter[upper] : noteCodeToNoteLetterFlats[upper]; int32_t rightLength = 1; if (noteCodeIsSharp[upper]) { - *(buffer++) = (display->haveOLED()) ? '#' : '.'; + *(buffer++) = (display->haveOLED()) ? accidential : '.'; if (display->haveOLED()) { rightLength++; } diff --git a/src/deluge/gui/menu_item/runtime_feature/settings.cpp b/src/deluge/gui/menu_item/runtime_feature/settings.cpp index 16e107ffff..186c11f76c 100644 --- a/src/deluge/gui/menu_item/runtime_feature/settings.cpp +++ b/src/deluge/gui/menu_item/runtime_feature/settings.cpp @@ -32,6 +32,7 @@ SettingToggle menuFineTempo(RuntimeFeatureSettingType::FineTempoKnob); SettingToggle menuQuantize(RuntimeFeatureSettingType::Quantize); SettingToggle menuPatchCableResolution(RuntimeFeatureSettingType::PatchCableResolution); SettingToggle menuCatchNotes(RuntimeFeatureSettingType::CatchNotes); +SettingToggle menuUseFlats(RuntimeFeatureSettingType::UseFlats); SettingToggle menuDeleteUnusedKitRows(RuntimeFeatureSettingType::DeleteUnusedKitRows); SettingToggle menuAltGoldenKnobDelayParams(RuntimeFeatureSettingType::AltGoldenKnobDelayParams); SettingToggle menuQuantizedStutterRate(RuntimeFeatureSettingType::QuantizedStutterRate); @@ -58,6 +59,7 @@ std::arrayinScaleMode) { + + bool useFlats = runtimeFeatureSettings.get(RuntimeFeatureSettingType::UseFlats) + == RuntimeFeatureStateToggle::On; toggleScaleModeOnButtonRelease = false; int32_t newRootNote = ((currentSong->key.rootNote + kOctaveSize) + offset) % kOctaveSize; instrumentClipView.setupChangingOfRootNote(newRootNote); char noteName[3] = {0}; - noteName[0] = noteCodeToNoteLetter[newRootNote]; + noteName[0] = !useFlats ? noteCodeToNoteLetter[newRootNote] : noteCodeToNoteLetterFlats[newRootNote]; + if (display->haveOLED()) { if (noteCodeIsSharp[newRootNote]) { - noteName[1] = '#'; + char accidential = !useFlats ? '#' : 'b'; + noteName[1] = accidential; } } display->displayPopup(noteName, 3, false, (noteCodeIsSharp[newRootNote] ? 0 : 255)); diff --git a/src/deluge/model/settings/runtime_feature_settings.cpp b/src/deluge/model/settings/runtime_feature_settings.cpp index 40d0c280e2..3309039f40 100644 --- a/src/deluge/model/settings/runtime_feature_settings.cpp +++ b/src/deluge/model/settings/runtime_feature_settings.cpp @@ -120,6 +120,11 @@ void RuntimeFeatureSettings::init() { // CatchNotes SetupOnOffSetting(settings[RuntimeFeatureSettingType::CatchNotes], STRING_FOR_COMMUNITY_FEATURE_CATCH_NOTES, "catchNotes", RuntimeFeatureStateToggle::On); + + // UseFlats + SetupOnOffSetting(settings[RuntimeFeatureSettingType::UseFlats], STRING_FOR_COMMUNITY_FEATURE_USE_FLATS, + "useFlats", RuntimeFeatureStateToggle::Off); + // DeleteUnusedKitRows SetupOnOffSetting(settings[RuntimeFeatureSettingType::DeleteUnusedKitRows], STRING_FOR_COMMUNITY_FEATURE_DELETE_UNUSED_KIT_ROWS, "deleteUnusedKitRows", diff --git a/src/deluge/model/settings/runtime_feature_settings.h b/src/deluge/model/settings/runtime_feature_settings.h index 7364ef5346..991110e00d 100644 --- a/src/deluge/model/settings/runtime_feature_settings.h +++ b/src/deluge/model/settings/runtime_feature_settings.h @@ -48,6 +48,7 @@ enum RuntimeFeatureSettingType : uint32_t { FineTempoKnob, PatchCableResolution, CatchNotes, + UseFlats, DeleteUnusedKitRows, AltGoldenKnobDelayParams, QuantizedStutterRate, diff --git a/src/deluge/util/functions.cpp b/src/deluge/util/functions.cpp index f463678dae..b11811cf58 100644 --- a/src/deluge/util/functions.cpp +++ b/src/deluge/util/functions.cpp @@ -25,6 +25,7 @@ #include "gui/ui/qwerty_ui.h" #include "hid/display/display.h" #include "hid/encoders.h" +#include "model/settings/runtime_feature_settings.h" #include "modulation/arpeggiator.h" #include "processing/audio_output.h" #include "processing/sound/sound.h" @@ -1879,10 +1880,16 @@ void noteCodeToString(int32_t noteCode, char* buffer, int32_t* getLengthWithoutD int32_t octave = (noteCode) / 12 - 2; int32_t noteCodeWithinOctave = (uint16_t)(noteCode + 120) % (uint8_t)12; - *thisChar = noteCodeToNoteLetter[noteCodeWithinOctave]; + bool useFlats = runtimeFeatureSettings.get(RuntimeFeatureSettingType::UseFlats) + == RuntimeFeatureStateToggle::On; + + + *thisChar = !useFlats ? noteCodeToNoteLetter[noteCodeWithinOctave] : noteCodeToNoteLetterFlats[noteCodeWithinOctave]; + thisChar++; if (noteCodeIsSharp[noteCodeWithinOctave]) { - *thisChar = display->haveOLED() ? '#' : '.'; + char accidential = !useFlats ? '#' : 'b'; + *thisChar = display->haveOLED() ? accidential : '.'; thisChar++; } if (appendOctaveNo) { diff --git a/src/deluge/util/lookuptables/lookuptables.cpp b/src/deluge/util/lookuptables/lookuptables.cpp index 151a63145c..a8e2429669 100644 --- a/src/deluge/util/lookuptables/lookuptables.cpp +++ b/src/deluge/util/lookuptables/lookuptables.cpp @@ -481,10 +481,15 @@ const int16_t lanczosKernelA16[1025] = { 0, }; - +//C C# D D# E F F# G G# A A# B const uint8_t noteCodeToNoteLetter[12] = {67, 67, 68, 68, 69, 70, 70, 71, 71, 65, 65, 66}; const bool noteCodeIsSharp[12] = {0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0}; +//C Db D Eb E F Gb G Ab A Bb B +const uint8_t noteCodeToNoteLetterFlats[12] = {67, 68, 68, 69, 69, 70, 71, 71, 65, 65, 66, 66}; +const bool noteCodeIsFlat[12] = {0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0}; + + /** * @brief How iterance is encoded: * diff --git a/src/deluge/util/lookuptables/lookuptables.h b/src/deluge/util/lookuptables/lookuptables.h index 849a61da8a..2f66f6c37a 100644 --- a/src/deluge/util/lookuptables/lookuptables.h +++ b/src/deluge/util/lookuptables/lookuptables.h @@ -133,6 +133,9 @@ extern deluge::l10n::String presetReverbNames[NUM_PRESET_REVERBS]; extern const uint8_t noteCodeToNoteLetter[]; extern const bool noteCodeIsSharp[]; +extern const uint8_t noteCodeToNoteLetterFlats[]; +extern const bool noteCodeIsFlat[]; + extern const std::array iterancePresets; #define MAX_CHORD_TYPES 9