83 Output(OutputType newType);
85 virtual bool matchesPreset(OutputType otherType, int32_t channel, int32_t channelSuffix,
char const* otherName,
86 char const* dirPath) = 0;
89 [[nodiscard]]
Clip* getActiveClip()
const;
95 const OutputType type;
96 bool mutedInArrangementMode;
97 bool mutedInArrangementModeBeforeStemExport;
99 bool soloingInArrangementMode;
101 bool wasCreatedForAutoOverdub;
102 bool armedForRecording;
108 bool alreadyGotItsNewClip;
109 bool isGettingSoloingClip;
111 bool nextClipFoundShouldGetArmed;
115 virtual void renderOutput(
ModelStack* modelStack, std::span<StereoSample> outputBuffer, int32_t* reverbBuffer,
116 int32_t reverbAmountAdjust, int32_t sideChainHitPending,
bool shouldLimitDelayFeedback,
117 bool isClipActive) = 0;
119 virtual void setupWithoutActiveClip(
ModelStack* modelStack);
120 virtual bool setActiveClip(
122 PgmChangeSend maySendMIDIPGMs = PgmChangeSend::ONCE);
123 void pickAnActiveClipForArrangementPos(
ModelStack* modelStack, int32_t arrangementPos,
124 PgmChangeSend maySendMIDIPGMs);
125 void pickAnActiveClipIfPossible(
ModelStack* modelStack,
bool searchSessionClipsIfNeeded =
true,
126 PgmChangeSend maySendMIDIPGMs = PgmChangeSend::ONCE,
127 bool setupWithoutActiveClipIfNeeded =
true);
128 void detachActiveClip(
Song* currentSong);
131 virtual bool isSkippingRendering() {
return true; }
132 bool clipHasInstance(
Clip* clip);
133 bool isEmpty(
bool displayPopup =
true);
134 void clipLengthChanged(
Clip* clip, int32_t oldLength);
135 virtual void cutAllSound() {}
136 virtual void getThingWithMostReverb(
Sound** soundWithMostReverb,
ParamManager** paramManagerWithMostReverb,
138 int32_t* highestReverbAmountFound) {}
147 virtual void offerReceivedCCToLearnedParams(
MIDICable& cable, uint8_t channel, uint8_t ccNumber, uint8_t value,
150 virtual int32_t doTickForwardForArp(ModelStack* modelStack, int32_t currentPos) {
return 2147483647; }
151 void endAnyArrangementRecording(Song* song, int32_t actualEndPos, uint32_t timeRemainder);
152 virtual bool wantsToBeginArrangementRecording() {
return armedForRecording; }
155 virtual Error readFromFile(Deserializer& reader, Song* song, Clip* clip, int32_t readAutomationUpToPos);
157 virtual bool readTagFromFile(Deserializer& reader,
char const* tagName);
158 void writeToFile(Clip* clipForSavingOutputOnly, Song* song);
159 virtual bool writeDataToFile(Serializer& writer, Clip* clipForSavingOutputOnly,
162 virtual Error loadAllAudioFiles(
bool mayActuallyReadFiles) {
return Error::NONE; }
163 virtual void loadCrucialAudioFilesOnly() {}
166 virtual void resyncLFOs() {};
168 virtual void sendMIDIPGM() {};
169 virtual void deleteBackedUpParamManagers(Song* song) {}
170 virtual void prepareForHibernationOrDeletion() {}
172 virtual char const* getXMLTag() = 0;
173 virtual ParamManager* getParamManager(Song* song);
175 virtual char const* getNameXMLTag() {
return "name"; }
177 virtual void offerReceivedNote(ModelStackWithTimelineCounter* modelStackWithTimelineCounter, MIDICable& cable,
178 bool on, int32_t channel, int32_t note, int32_t velocity,
bool shouldRecordNotes,
179 bool* doingMidiThru) {}
180 virtual void offerReceivedPitchBend(ModelStackWithTimelineCounter* modelStackWithTimelineCounter, MIDICable& cable,
181 uint8_t channel, uint8_t data1, uint8_t data2,
bool* doingMidiThru) {}
182 virtual void offerReceivedCC(ModelStackWithTimelineCounter* modelStackWithTimelineCounter, MIDICable& cable,
183 uint8_t channel, uint8_t ccNumber, uint8_t value,
bool* doingMidiThru) {}
184 virtual void offerReceivedAftertouch(ModelStackWithTimelineCounter* modelStackWithTimelineCounter, MIDICable& cable,
185 int32_t channel, int32_t value, int32_t noteCode,
bool* doingMidiThru) {}
187 virtual void stopAnyAuditioning(ModelStack* modelStack) {}
188 virtual void offerBendRangeUpdate(ModelStack* modelStack, MIDICable& cable, int32_t channelOrZone,
189 int32_t whichBendRange, int32_t bendSemitones) {}
192 Error possiblyBeginArrangementRecording(Song* song, int32_t newPos);
193 void endArrangementPlayback(Song* song, int32_t actualEndPos, uint32_t timeRemainder);
194 bool recordingInArrangement;
196 virtual ModelStackWithAutoParam* getModelStackWithParam(ModelStackWithTimelineCounter* modelStack, Clip* clip,
198 bool affectEntire,
bool useMenuStack) = 0;
199 virtual bool needsEarlyPlayback()
const {
return false; }
200 bool hasRecorder() {
return recorder; }
201 bool shouldRenderInSong() {
return !(recorderIsEchoing); }
205 recorderIsEchoing = monitoring;
206 outputRecordingThisOutput = output;
212 recorder = newRecorder;
216 bool removeRecorder() {
218 recorder->removeFromOutput();
224 Output* getOutputRecordingThis() {
return outputRecordingThisOutput; }
227 virtual Clip* createNewClipForArrangementRecording(ModelStack* modelStack) = 0;
228 bool recorderIsEchoing{
false};
230 Output* outputRecordingThisOutput{
nullptr};
232 virtual void clearRecordingFrom() {}
233 Clip* activeClip{
nullptr};
234 SampleRecorder* recorder{
nullptr};