33 Transpose(l10n::String name, l10n::String title_format_str, int32_t newP, uint8_t source_id)
34 :
source::Transpose(name, newP, source_id), FormattedTitle(title_format_str, source_id + 1) {}
36 [[nodiscard]] std::string_view
getTitle()
const override {
return FormattedTitle::title(); }
39 int32_t transpose = 0;
42 Source& source = soundEditor.currentSound->sources[source_id_];
44 if (source.ranges.getNumElements() && soundEditor.currentSound->getSynthMode() != SynthMode::FM
45 && source.oscType == OscType::SAMPLE) {
46 const auto* multiRange =
static_cast<MultisampleRange*
>(source.ranges.getElement(0));
47 transpose = multiRange->sampleHolder.transpose;
48 cents = multiRange->sampleHolder.cents;
51 transpose = source.transpose;
54 this->setValue(computeCurrentValueForTranspose(transpose, cents));
59 void writeCurrentValue()
override {
60 int32_t transpose, cents;
61 computeFinalValuesForTranspose(this->getValue(), &transpose, ¢s);
64 if (currentUIMode == UI_MODE_HOLDING_AFFECT_ENTIRE_IN_SOUND_EDITOR && soundEditor.editingKit()) {
66 Kit* kit = getCurrentKit();
68 for (
Drum* thisDrum = kit->firstDrum; thisDrum !=
nullptr; thisDrum = thisDrum->next) {
69 if (thisDrum->type == DrumType::SOUND) {
70 auto* soundDrum =
static_cast<SoundDrum*
>(thisDrum);
71 Source& source = soundDrum->sources[source_id_];
73 if (source.ranges.getNumElements() && soundDrum->getSynthMode() != SynthMode::FM
74 && source.oscType == OscType::SAMPLE) {
75 auto* multisampleRange =
static_cast<MultisampleRange*
>(source.ranges.getElement(0));
76 multisampleRange->sampleHolder.transpose = transpose;
77 multisampleRange->sampleHolder.setCents(cents);
80 source.transpose = transpose;
81 source.setCents(cents);
84 char modelStackMemoryForSoundDrum[MODEL_STACK_MAX_SIZE];
86 getModelStackFromSoundDrum(modelStackMemoryForSoundDrum, soundDrum)->addSoundFlags();
88 soundDrum->recalculateAllVoicePhaseIncrements(modelStackForSoundDrum);
94 Source& source = soundEditor.currentSound->sources[source_id_];
96 if (source.ranges.getNumElements() && soundEditor.currentSound->getSynthMode() != SynthMode::FM
97 && source.oscType == OscType::SAMPLE) {
98 auto* multisampleRange =
static_cast<MultisampleRange*
>(source.ranges.getElement(0));
99 multisampleRange->sampleHolder.transpose = transpose;
100 multisampleRange->sampleHolder.setCents(cents);
103 source.transpose = transpose;
104 source.setCents(cents);
107 char modelStackMemory[MODEL_STACK_MAX_SIZE];
108 ModelStackWithSoundFlags* modelStack = soundEditor.getCurrentModelStack(modelStackMemory)->addSoundFlags();
110 soundEditor.currentSound->recalculateAllVoicePhaseIncrements(modelStack);
114 MenuPermission checkPermissionToBeginSession(ModControllableAudio* modControllable, int32_t,
115 ::MultiRange** currentRange)
override {
116 if (!
isRelevant(modControllable, source_id_)) {
117 return MenuPermission::NO;
120 const auto sound =
static_cast<Sound*
>(modControllable);
121 const Source& source = sound->sources[source_id_];
123 if (sound->getSynthMode() == SynthMode::FM
124 || (source.oscType != OscType::SAMPLE && source.oscType != OscType::WAVETABLE)) {
125 return MenuPermission::YES;
128 return soundEditor.checkPermissionToBeginSessionForRangeSpecificParam(sound, source_id_, currentRange);
134 const auto sound =
static_cast<Sound*
>(modControllable);
135 if (
Source& source = sound->sources[source_id_];
136 source.oscType == OscType::SAMPLE || source.oscType == OscType::WAVETABLE) {
137 return source.hasAtLeastOneAudioFileLoaded();