76class Sound :
public ModControllableAudio,
public virtual Voiced {
81 ~Sound()
override { std::erase(AudioEngine::sounds,
this); }
87 Source sources[kNumSources];
93 std::array<int32_t, util::to_underlying(kFirstLocalSource)> globalSourceValues{};
95 uint32_t sourcesChanged{};
101 bool invertReversed{};
116 alignas(8)
ModKnob modKnobs[kNumModButtons][kNumPhysicalModKnobs];
118 int32_t sideChainSendLevel = 0;
120 PolyphonyMode polyphonic = PolyphonyMode::POLY;
121 uint8_t maxVoiceCount = 8;
123 int16_t transpose = 0;
127 uint8_t numUnison = 1;
128 int8_t unisonDetune = 8;
129 uint8_t unisonStereoSpread = 0;
132 uint8_t outputMidiChannel = MIDI_CHANNEL_NONE;
133 uint8_t outputMidiNoteForDrum = MIDI_NOTE_NONE;
135 int16_t modulatorTranspose[kNumModulators] = {0, -12};
136 int8_t modulatorCents[kNumModulators] = {0, 0};
141 int32_t unisonPan[kMaxNumVoicesUnison]{};
143 SynthMode synthMode = SynthMode::SUBTRACTIVE;
144 bool modulator1ToModulator0 =
false;
146 int32_t volumeNeutralValueForUnison{0};
148 int32_t lastNoteCode = std::numeric_limits<int32_t>::min();
150 bool oscillatorSync =
false;
152 VoicePriority voicePriority = VoicePriority::MEDIUM;
154 bool skippingRendering =
true;
156 std::bitset<kNumExpressionDimensions> expressionSourcesChangedAtSynthLevel{0};
161 std::array<int32_t, kNumExpressionDimensions> monophonicExpressionValues{};
163 std::array<uint32_t, kNumSources> oscRetriggerPhase{};
164 std::array<uint32_t, kNumModulators> modulatorRetriggerPhase{};
166 uint32_t timeStartedSkippingRenderingModFX{0};
167 uint32_t timeStartedSkippingRenderingLFO{0};
168 uint32_t timeStartedSkippingRenderingArp{0};
169 uint32_t startSkippingRenderingAtTime = 0;
173 virtual void setSkippingRendering(
bool newSkipping);
175 ModFXType getModFXType()
override;
176 bool setModFXType(ModFXType newType)
final;
181 int32_t sideChainHitPending, int32_t reverbAmountAdjust = 134217728,
182 bool shouldLimitDelayFeedback =
false, int32_t pitchAdjust = kMaxSampleValue,
185 void ensureInaccessibleParamPresetValuesWithoutKnobsAreZero(
Song* song)
final;
187 void ensureInaccessibleParamPresetValuesWithoutKnobsAreZeroWithMinimalDetails(
ParamManager* paramManager);
189 void ensureParamPresetValueWithoutKnobIsZeroWithMinimalDetails(
ParamManager* paramManager, int32_t p);
191 PatchCableAcceptance maySourcePatchToParam(PatchSource s, uint8_t p,
ParamManager* paramManager);
193 void resyncGlobalLFOs();
198 uint8_t midiChannel,
Song* song)
final;
205 void setUnisonStereoSpread(int32_t newAmount);
211 const char* pathAttribute = NULL);
215 bool isSourceActiveEverDisregardingMissingSample(int32_t s,
ParamManager* paramManager);
216 bool isSourceActiveEver(int32_t s,
ParamManager* paramManager);
219 int16_t
const* mpeValues, uint32_t sampleSyncLength = 0, int32_t ticksLate = 0,
220 uint32_t samplesLate = 0, int32_t velocity = 64, int32_t fromMIDIChannel = 16);
226 int32_t newNoteCodeAfterArpeggiation, int32_t velocity, int16_t
const* mpeValues,
227 uint32_t sampleSyncLength, int32_t ticksLate, uint32_t samplesLate,
228 int32_t fromMIDIChannel = 16);
229 void polyphonicExpressionEventOnChannelOrNote(int32_t newValue, int32_t expressionDimension,
230 int32_t channelOrNoteNumber,
231 MIDICharacteristic whichCharacteristic)
override;
234 int16_t getMinOscTranspose();
235 void setSynthMode(SynthMode value,
Song* song);
236 [[nodiscard]] SynthMode getSynthMode()
const {
return synthMode; }
238 virtual bool isDrum() {
return false; }
241 void set_cents(int8_t new_cents);
242 Error loadAllAudioFiles(
bool mayActuallyReadFiles);
246 bool renderingOscillatorSyncEver(
ParamManager* paramManager);
247 void setupAsBlankSynth(
ParamManager* paramManager,
bool is_dx =
false);
253 int32_t readAutomationUpToPos);
255 int32_t readAutomationUpToPos);
260 int32_t hasCutOrLoopModeSamples(
ParamManagerForTimeline* paramManager, int32_t note,
bool* anyLooping =
nullptr);
265 void doneReadingFromFile();
266 virtual void setupPatchingForAllParamManagers(
Song* song) {}
270 bool allowCreation =
true)
final;
272 void getThingWithMostReverb(Sound** soundWithMostReverb,
ParamManager** paramManagerWithMostReverb,
275 virtual bool readTagFromFile(
Deserializer& reader,
char const* tagName) = 0;
276 void detachSourcesFromAudioFiles();
279 [[gnu::always_inline]] int32_t getSmoothedPatchedParamValue(int32_t p,
ParamManager& paramManager)
const {
280 if (paramLPF.p == p) {
281 return paramLPF.currentValue;
283 return paramManager.getPatchedParamSet()->getValue(p);
287 int32_t oldValue, int32_t newValue,
bool fromAutomation);
288 void deleteMultiRange(int32_t s, int32_t r);
289 void wontBeRenderedForAWhile()
override;
292 void possiblySetupDefaultExpressionPatching(
ParamManager* paramManager);
294 int32_t getShiftAmountForSaturation()
const {
return (clippingAmount >= 2) ? (clippingAmount - 2) : 0; }
298 [[gnu::always_inline]]
void saturate(int32_t* data, uint32_t* workingValue, int32_t shiftAmount) {
301 *data = getTanHAntialiased(*data, workingValue, 5 + clippingAmount) << (shiftAmount);
303 uint32_t getSyncedLFOPhaseIncrement(
const LFOConfig& config);
319 [[nodiscard]]
const deluge::fast_vector<ActiveVoice>&
voices()
const {
return voices_; }
328 bool anyNoteIsOn()
override;
330 void prepareForHibernation()
override;
334 virtual const char* getName() {
return nullptr; }
338 void recalculateFineTuner();
339 void recalculateModulatorTransposer(uint8_t m, ModelStackWithSoundFlags* modelStack);
340 void setupUnisonDetuners(ModelStackWithSoundFlags* modelStack);
341 void setupUnisonStereoSpread();
342 void calculateEffectiveVolume();
343 void ensureKnobReferencesCorrectVolume(Knob& knob);
344 Error readTagFromFileOrError(Deserializer& reader,
char const* tagName, ParamManagerForTimeline* paramManager,
345 int32_t readAutomationUpToPos, ArpeggiatorSettings* arpSettings, Song* song);
347 void writeSourceToFile(Serializer& writer, int32_t s,
char const* tagName);
348 Error
readSourceFromFile(Deserializer& reader, int32_t s, ParamManagerForTimeline* paramManager,
349 int32_t readAutomationUpToPos);
350 void stopSkippingRendering(ArpeggiatorSettings* arpSettings);
351 void startSkippingRendering(ModelStackWithSoundFlags* modelStack);
352 void getArpBackInTimeAfterSkippingRendering(ArpeggiatorSettings* arpSettings);
353 void doParamLPF(int32_t numSamples, ModelStackWithSoundFlags* modelStack);
354 void stopParamLPF(ModelStackWithSoundFlags* modelStack);
356 bool renderingVoicesInStereo(ModelStackWithSoundFlags* modelStack);
357 void setupDefaultExpressionPatching(ParamManager* paramManager);
358 void pushSwitchActionOnEncoderForParam(int32_t p,
bool on, ModelStackWithThreeMainThings* modelStack);
359 ModelStackWithAutoParam* getParamFromModEncoderDeeper(int32_t whichModEncoder,
360 ModelStackWithThreeMainThings* modelStack,
361 bool allowCreation =
true);