30 using Selection::Selection;
32 enum Direction : uint8_t { USE_SONG_STUTTER = 0, FORWARD, REVERSED, FORWARD_PING_PONG, REVERSED_PING_PONG };
34 deluge::vector<std::string_view> getOptions(OptType optType = OptType::FULL)
override {
35 using namespace deluge::l10n;
37 deluge::vector<std::string_view> result;
39 if (showUseSongOption()) {
40 result.push_back(l10n::getView(optType == OptType::SHORT ? String::STRING_FOR_USE_SONG_SHORT
41 : String::STRING_FOR_USE_SONG));
43 result.push_back(l10n::getView(String::STRING_FOR_FORWARD));
44 result.push_back(l10n::getView(String::STRING_FOR_REVERSED));
45 result.push_back(l10n::getView(String::STRING_FOR_FORWARD_PING_PONG));
46 result.push_back(l10n::getView(String::STRING_FOR_REVERSED_PING_PONG));
52 auto* stutter = &soundEditor.currentModControllable->stutterConfig;
54 if (showUseSongOption() && stutter->useSongStutter) {
55 setValue(USE_SONG_STUTTER);
57 else if (stutter->reversed && stutter->pingPong) {
58 setValue(REVERSED_PING_PONG);
60 else if (stutter->reversed) {
63 else if (stutter->pingPong) {
64 setValue(FORWARD_PING_PONG);
73 void writeCurrentValue()
override {
74 Direction value = getValue();
77 if (currentUIMode == UI_MODE_HOLDING_AFFECT_ENTIRE_IN_SOUND_EDITOR && soundEditor.editingKitRow()) {
78 Kit* kit = getCurrentKit();
79 for (
Drum* thisDrum = kit->firstDrum; thisDrum !=
nullptr; thisDrum = thisDrum->next) {
80 if (thisDrum->type == DrumType::SOUND) {
81 auto* soundDrum =
static_cast<SoundDrum*
>(thisDrum);
82 applyOptionToStutterConfig(value, soundDrum->stutterConfig);
88 applyOptionToStutterConfig(value, soundEditor.currentModControllable->stutterConfig);
95 Direction getValue() {
96 const auto value = Selection::getValue();
97 const auto shift = showUseSongOption() ? 0 : 1;
98 return static_cast<Direction
>(value + shift);
101 void setValue(Direction value) {
102 const auto shift = showUseSongOption() ? 0 : 1;
103 return Selection::setValue(value - shift);
106 bool showUseSongOption() {
return !soundEditor.currentModControllable->isSong(); }
108 void applyOptionToStutterConfig(Direction value,
StutterConfig& stutter) {
109 stutter.useSongStutter = value == USE_SONG_STUTTER;
110 stutter.reversed = value == REVERSED || value == REVERSED_PING_PONG;
111 stutter.pingPong = value == FORWARD_PING_PONG || value == REVERSED_PING_PONG;
113 if (stutter.useSongStutter) {
114 stutter.quantized = currentSong->globalEffectable.stutterConfig.quantized;
115 stutter.reversed = currentSong->globalEffectable.stutterConfig.reversed;
116 stutter.pingPong = currentSong->globalEffectable.stutterConfig.pingPong;