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 void deleteAnyInstancesOfClip(
Clip* clip);
134 bool isEmpty(
bool displayPopup =
true);
135 void clipLengthChanged(
Clip* clip, int32_t oldLength);
136 virtual void cutAllSound() {}
137 virtual void getThingWithMostReverb(
Sound** soundWithMostReverb,
ParamManager** paramManagerWithMostReverb,
139 int32_t* highestReverbAmountFound) {}
148 virtual void offerReceivedCCToLearnedParams(
MIDICable& cable, uint8_t channel, uint8_t ccNumber, uint8_t value,
151 virtual int32_t doTickForwardForArp(ModelStack* modelStack, int32_t currentPos) {
return 2147483647; }
152 void endAnyArrangementRecording(Song* song, int32_t actualEndPos, uint32_t timeRemainder);
153 virtual bool wantsToBeginArrangementRecording() {
return armedForRecording; }
156 virtual Error readFromFile(Deserializer& reader, Song* song, Clip* clip, int32_t readAutomationUpToPos);
158 virtual bool readTagFromFile(Deserializer& reader,
char const* tagName);
159 void writeToFile(Clip* clipForSavingOutputOnly, Song* song);
160 virtual bool writeDataToFile(Serializer& writer, Clip* clipForSavingOutputOnly,
163 virtual Error loadAllAudioFiles(
bool mayActuallyReadFiles) {
return Error::NONE; }
164 virtual void loadCrucialAudioFilesOnly() {}
167 virtual void resyncLFOs() {};
169 virtual void sendMIDIPGM() {};
170 virtual void deleteBackedUpParamManagers(Song* song) {}
171 virtual void prepareForHibernationOrDeletion() {}
173 virtual char const* getXMLTag() = 0;
174 virtual ParamManager* getParamManager(Song* song);
176 virtual char const* getNameXMLTag() {
return "name"; }
178 virtual void offerReceivedNote(ModelStackWithTimelineCounter* modelStackWithTimelineCounter, MIDICable& cable,
179 bool on, int32_t channel, int32_t note, int32_t velocity,
bool shouldRecordNotes,
180 bool* doingMidiThru) {}
181 virtual void offerReceivedPitchBend(ModelStackWithTimelineCounter* modelStackWithTimelineCounter, MIDICable& cable,
182 uint8_t channel, uint8_t data1, uint8_t data2,
bool* doingMidiThru) {}
183 virtual void offerReceivedCC(ModelStackWithTimelineCounter* modelStackWithTimelineCounter, MIDICable& cable,
184 uint8_t channel, uint8_t ccNumber, uint8_t value,
bool* doingMidiThru) {}
185 virtual void offerReceivedAftertouch(ModelStackWithTimelineCounter* modelStackWithTimelineCounter, MIDICable& cable,
186 int32_t channel, int32_t value, int32_t noteCode,
bool* doingMidiThru) {}
188 virtual void stopAnyAuditioning(ModelStack* modelStack) {}
189 virtual void offerBendRangeUpdate(ModelStack* modelStack, MIDICable& cable, int32_t channelOrZone,
190 int32_t whichBendRange, int32_t bendSemitones) {}
193 Error possiblyBeginArrangementRecording(Song* song, int32_t newPos);
194 void endArrangementPlayback(Song* song, int32_t actualEndPos, uint32_t timeRemainder);
195 bool recordingInArrangement;
197 virtual ModelStackWithAutoParam* getModelStackWithParam(ModelStackWithTimelineCounter* modelStack, Clip* clip,
199 bool affectEntire,
bool useMenuStack) = 0;
200 virtual bool needsEarlyPlayback()
const {
return false; }
201 bool hasRecorder() {
return recorder; }
202 bool shouldRenderInSong() {
return !(recorderIsEchoing); }
206 recorderIsEchoing = monitoring;
207 outputRecordingThisOutput = output;
213 recorder = newRecorder;
217 bool removeRecorder() {
219 recorder->removeFromOutput();
225 Output* getOutputRecordingThis() {
return outputRecordingThisOutput; }
227 virtual void clearRecordingFrom() {}
232 virtual Clip* createNewClipForArrangementRecording(
ModelStack* modelStack) = 0;
233 bool recorderIsEchoing{
false};
235 Output* outputRecordingThisOutput{
nullptr};
236 Clip* activeClip{
nullptr};
237 SampleRecorder* recorder{
nullptr};