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;
74 void expectNoFurtherTicks(
Song* song,
bool actuallySoundChange =
true)
override;
76 NoteRow* createNewNoteRowForYVisual(int32_t,
Song* song);
77 int32_t getYVisualFromYNote(int32_t,
Song* song);
78 int32_t getYNoteFromYVisual(int32_t,
Song* song);
79 int32_t getYNoteFromYDisplay(int32_t yDisplay,
Song* song);
80 int32_t guessRootNote(
Song* song, int32_t previousRoot);
81 int32_t getNumNoteRows();
84 bool deleteSoundsWhichWontSound(
Song* song)
override;
87 int32_t getNoteRowId(
NoteRow* noteRow, int32_t noteRowIndex);
88 NoteRow* getNoteRowFromId(int32_t
id);
91 bool shiftSequenceAndMPE)
override;
92 bool isEmpty(
bool displayPopup =
true)
override;
93 bool containsAnyNotes();
95 NoteRow* getNoteRowOnScreen(int32_t yDisplay,
Song* song, int32_t* getIndex =
nullptr);
96 bool currentlyScrollableAndZoomable()
override;
98 int16_t
const* mpeValuesOrNull =
nullptr, int32_t fromMIDIChannel = MIDI_CHANNEL_NONE);
101 void copyBasicsFrom(Clip
const* otherClip)
override;
114 int32_t ticksTilNextNoteRowEvent{};
115 int32_t noteRowsNumTicksBehindClip{};
123 uint32_t wrapEditLevel{};
126 int8_t backedUpInstrumentSlot[4]{};
127 int8_t backedUpInstrumentSubSlot[4]{};
128 String backedUpInstrumentName[2];
129 String backedUpInstrumentDirPath[2];
133 bool onKeyboardScreen;
139 OutputType outputTypeWhileLoading;
143 int32_t* getIndex =
nullptr);
146 InstrumentClip* favourClipForCloningParamManager =
nullptr,
147 bool keepNoteRowsWithMIDIInput =
true,
bool giveMidiAssignmentsToNewInstrument =
false);
149 bool shouldDeleteEmptyNoteRowsAtEndOfList =
false,
bool shouldRetainLinksToSounds =
false,
150 bool keepNoteRowsWithMIDIInput =
true,
bool shouldGrabMidiCommands =
false,
151 bool shouldBackUpExpressionParamsToo =
true)
override;
153 int32_t numNoteRowsPreviouslyDeletedFromBottom = 0);
155 bool shouldRetainLinksToSounds,
bool shouldGrabMidiCommands,
156 bool shouldBackUpExpressionParamsToo);
159 void prepNoteRowsForExitingKitMode(
Song* song);
161 int16_t getTopYNote();
162 int16_t getBottomYNote();
163 uint32_t getWrapEditLevel();
165 NoteRow* getNoteRowForYNote(int32_t, int32_t* getIndex =
nullptr);
168 NoteRow* getNoteRowForDrum(
Drum* drum, int32_t* getIndex =
nullptr);
170 Action* action =
nullptr,
bool* scaleAltered =
nullptr);
172 bool hasSameInstrument(InstrumentClip* otherClip);
173 bool isScaleModeClip();
175 Error setAudioInstrument(
Instrument* newInstrument,
Song* song,
bool shouldNotifyInstrument,
176 ParamManager* newParamManager, InstrumentClip* favourClipForCloningParamManager =
nullptr);
178 void expectEvent()
override;
183 void noteRemovedFromMode(int32_t yNoteWithinOctave,
Song* song);
185 bool clearSequenceAndMPE)
override;
186 bool doesProbabilityExist(int32_t apartFromPos, int32_t probability, int32_t secondProbability = -1);
188 ScaleType getScaleType();
189 void backupPresetSlot();
196 InstrumentClip* favourClipForCloningParamManager =
nullptr);
197 void deleteOldDrumNames();
198 void ensureScrollWithinKitBounds();
199 bool isScrollWithinRange(int32_t scrollAmount, int32_t newYNote);
202 void instrumentBeenEdited()
override;
207 Sound* sound)
override;
210 char const* getXMLTag()
override {
return "instrumentClip"; }
212 int32_t buttonLatencyForTempolessRecord)
override;
215 bool isAbandonedOverdub()
override;
217 uint32_t timeRemainder, int32_t suggestedLength,
218 int32_t alternativeLongerLength)
override;
220 bool getCurrentlyRecordingLinearly()
override;
221 void abortRecording()
override;
222 void yDisplayNoLongerAuditioning(int32_t yDisplay,
Song* song);
223 void shiftOnlyOneNoteRowHorizontally(
ModelStackWithNoteRow* modelStack, int32_t shiftAmount,
bool shiftAutomation,
224 bool shiftSequenceAndMPE);
225 int32_t getMaxLength()
override;
226 bool hasAnyPitchExpressionAutomationOnNoteRows();
228 char* otherModelStackMemory);
234 bool renderSidebar(uint32_t whichRows = 0,
RGB image[][kDisplayWidth + kSideBarWidth] =
nullptr,
235 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth] =
nullptr)
override {
236 return instrumentClipView.renderSidebar(whichRows, image, occupancyMask);
241 bool wantsToBeginLinearRecording(
Song* song)
override;
246 InstrumentClip* instrumentWasLoadedByReferenceFromClip{};
249 bool mustKeepLastOne =
true,
bool keepOnesWithMIDIInput =
true);
252 void deleteBackedUpParamManagerMIDI();
253 bool possiblyDeleteEmptyNoteRow(
NoteRow* noteRow,
bool onlyIfNoDrum,
Song* song,
bool onlyIfNonNumeric =
false,
254 bool keepIfHasMIDIInput =
true);
256 void prepareToEnterKitMode(
Song* song);
257 Error readMIDIParamsFromFile(
Deserializer& reader, int32_t readAutomationUpToPos);
259 bool lastProbabilities[kNumProbabilityValues]{};
260 int32_t lastProbabiltyPos[kNumProbabilityValues]{};
261 bool currentlyRecordingLinearly;