48class InstrumentClip final :
public Clip {
50 explicit InstrumentClip(
Song* song =
nullptr);
51 ~InstrumentClip()
override;
53 IndependentNoteRowLengthIncrease independentNoteRowInstruction,
54 bool completelyRenderOutIterationDependence =
false,
55 Action* action =
nullptr)
override;
60 uint32_t xZoom,
RGB* image, uint8_t occupancyMask[],
bool addUndefinedArea,
61 int32_t noteRowIndexStart = 0, int32_t noteRowIndexEnd = 2147483647, int32_t xStart = 0,
62 int32_t xEnd = kDisplayWidth,
bool allowBlur =
true,
bool drawRepeats =
false)
override;
64 RGB getMainColourFromY(int32_t yNote, int8_t);
68 bool useActualPosForParamManagers =
true)
override;
73 void expectNoFurtherTicks(
Song* song,
bool actuallySoundChange =
true)
override;
75 NoteRow* createNewNoteRowForYVisual(int32_t,
Song* song);
76 int32_t getYVisualFromYNote(int32_t,
Song* song);
77 int32_t getYNoteFromYVisual(int32_t,
Song* song);
78 int32_t getYNoteFromYDisplay(int32_t yDisplay,
Song* song);
79 int32_t guessRootNote(
Song* song, int32_t previousRoot);
80 int32_t getNumNoteRows();
83 bool deleteSoundsWhichWontSound(
Song* song)
override;
86 int32_t getNoteRowId(
NoteRow* noteRow, int32_t noteRowIndex);
87 NoteRow* getNoteRowFromId(int32_t
id);
90 bool shiftSequenceAndMPE)
override;
91 bool isEmpty(
bool displayPopup =
true)
override;
92 bool containsAnyNotes();
94 NoteRow* getNoteRowOnScreen(int32_t yDisplay,
Song* song, int32_t* getIndex =
nullptr);
95 bool currentlyScrollableAndZoomable()
override;
97 int16_t
const* mpeValuesOrNull =
nullptr, int32_t fromMIDIChannel = MIDI_CHANNEL_NONE);
100 void copyBasicsFrom(Clip
const* otherClip)
override;
113 int32_t ticksTilNextNoteRowEvent{};
114 int32_t noteRowsNumTicksBehindClip{};
122 uint32_t wrapEditLevel{};
125 int8_t backedUpInstrumentSlot[4]{};
126 int8_t backedUpInstrumentSubSlot[4]{};
127 String backedUpInstrumentName[2];
128 String backedUpInstrumentDirPath[2];
132 bool onKeyboardScreen;
138 OutputType outputTypeWhileLoading;
142 int32_t* getIndex =
nullptr);
145 InstrumentClip* favourClipForCloningParamManager =
nullptr,
146 bool keepNoteRowsWithMIDIInput =
true,
bool giveMidiAssignmentsToNewInstrument =
false);
148 bool shouldDeleteEmptyNoteRowsAtEndOfList =
false,
bool shouldRetainLinksToSounds =
false,
149 bool keepNoteRowsWithMIDIInput =
true,
bool shouldGrabMidiCommands =
false,
150 bool shouldBackUpExpressionParamsToo =
true)
override;
152 int32_t numNoteRowsPreviouslyDeletedFromBottom = 0);
154 bool shouldRetainLinksToSounds,
bool shouldGrabMidiCommands,
155 bool shouldBackUpExpressionParamsToo);
158 void prepNoteRowsForExitingKitMode(
Song* song);
160 int16_t getTopYNote();
161 int16_t getBottomYNote();
162 uint32_t getWrapEditLevel();
164 NoteRow* getNoteRowForYNote(int32_t, int32_t* getIndex =
nullptr);
167 NoteRow* getNoteRowForDrum(
Drum* drum, int32_t* getIndex =
nullptr);
169 Action* action =
nullptr,
bool* scaleAltered =
nullptr);
171 bool hasSameInstrument(InstrumentClip* otherClip);
172 bool isScaleModeClip();
174 Error setAudioInstrument(
Instrument* newInstrument,
Song* song,
bool shouldNotifyInstrument,
175 ParamManager* newParamManager, InstrumentClip* favourClipForCloningParamManager =
nullptr);
177 void expectEvent()
override;
182 void noteRemovedFromMode(int32_t yNoteWithinOctave,
Song* song);
184 bool clearSequenceAndMPE)
override;
185 bool doesProbabilityExist(int32_t apartFromPos, int32_t probability, int32_t secondProbability = -1);
187 ScaleType getScaleType();
188 void backupPresetSlot();
195 InstrumentClip* favourClipForCloningParamManager =
nullptr);
196 void deleteOldDrumNames();
197 void ensureScrollWithinKitBounds();
198 bool isScrollWithinRange(int32_t scrollAmount, int32_t newYNote);
201 void instrumentBeenEdited()
override;
206 Sound* sound)
override;
209 char const* getXMLTag()
override {
return "instrumentClip"; }
211 int32_t buttonLatencyForTempolessRecord)
override;
214 bool isAbandonedOverdub()
override;
216 uint32_t timeRemainder, int32_t suggestedLength,
217 int32_t alternativeLongerLength)
override;
219 bool getCurrentlyRecordingLinearly()
override;
220 void abortRecording()
override;
221 void yDisplayNoLongerAuditioning(int32_t yDisplay,
Song* song);
222 void shiftOnlyOneNoteRowHorizontally(
ModelStackWithNoteRow* modelStack, int32_t shiftAmount,
bool shiftAutomation,
223 bool shiftSequenceAndMPE);
224 int32_t getMaxLength()
override;
225 bool hasAnyPitchExpressionAutomationOnNoteRows();
227 char* otherModelStackMemory);
233 bool renderSidebar(uint32_t whichRows = 0,
RGB image[][kDisplayWidth + kSideBarWidth] =
nullptr,
234 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth] =
nullptr)
override {
235 return instrumentClipView.renderSidebar(whichRows, image, occupancyMask);
240 bool wantsToBeginLinearRecording(
Song* song)
override;
245 InstrumentClip* instrumentWasLoadedByReferenceFromClip{};
248 bool mustKeepLastOne =
true,
bool keepOnesWithMIDIInput =
true);
251 void deleteBackedUpParamManagerMIDI();
252 bool possiblyDeleteEmptyNoteRow(
NoteRow* noteRow,
bool onlyIfNoDrum,
Song* song,
bool onlyIfNonNumeric =
false,
253 bool keepIfHasMIDIInput =
true);
255 void prepareToEnterKitMode(
Song* song);
256 Error readMIDIParamsFromFile(
Deserializer& reader, int32_t readAutomationUpToPos);
258 bool lastProbabilities[kNumProbabilityValues]{};
259 int32_t lastProbabiltyPos[kNumProbabilityValues]{};
260 bool currentlyRecordingLinearly;