47class InstrumentClip final :
public Clip {
49 explicit InstrumentClip(
Song* song =
nullptr);
50 ~InstrumentClip()
override;
52 IndependentNoteRowLengthIncrease independentNoteRowInstruction,
53 bool completelyRenderOutIterationDependence =
false,
54 Action* action =
nullptr)
override;
59 uint32_t xZoom,
RGB* image, uint8_t occupancyMask[],
bool addUndefinedArea,
60 int32_t noteRowIndexStart = 0, int32_t noteRowIndexEnd = 2147483647, int32_t xStart = 0,
61 int32_t xEnd = kDisplayWidth,
bool allowBlur =
true,
bool drawRepeats =
false)
override;
63 RGB getMainColourFromY(int32_t yNote, int8_t);
67 bool useActualPosForParamManagers =
true)
override;
72 void expectNoFurtherTicks(
Song* song,
bool actuallySoundChange =
true)
override;
74 NoteRow* createNewNoteRowForYVisual(int32_t,
Song* song);
75 int32_t getYVisualFromYNote(int32_t,
Song* song);
76 int32_t getYNoteFromYVisual(int32_t,
Song* song);
77 int32_t getYNoteFromYDisplay(int32_t yDisplay,
Song* song);
78 int32_t guessRootNote(
Song* song, int32_t previousRoot);
79 int32_t getNumNoteRows();
82 bool deleteSoundsWhichWontSound(
Song* song)
override;
85 int32_t getNoteRowId(
NoteRow* noteRow, int32_t noteRowIndex);
86 NoteRow* getNoteRowFromId(int32_t
id);
89 bool shiftSequenceAndMPE)
override;
90 bool isEmpty(
bool displayPopup =
true)
override;
91 bool containsAnyNotes();
93 NoteRow* getNoteRowOnScreen(int32_t yDisplay,
Song* song, int32_t* getIndex =
nullptr);
94 bool currentlyScrollableAndZoomable()
override;
96 int16_t
const* mpeValuesOrNull =
nullptr, int32_t fromMIDIChannel = MIDI_CHANNEL_NONE);
99 void copyBasicsFrom(Clip
const* otherClip)
override;
112 int32_t ticksTilNextNoteRowEvent{};
113 int32_t noteRowsNumTicksBehindClip{};
121 uint32_t wrapEditLevel{};
124 int8_t backedUpInstrumentSlot[4]{};
125 int8_t backedUpInstrumentSubSlot[4]{};
126 String backedUpInstrumentName[2];
127 String backedUpInstrumentDirPath[2];
131 bool onKeyboardScreen;
137 OutputType outputTypeWhileLoading;
141 int32_t* getIndex =
nullptr);
144 InstrumentClip* favourClipForCloningParamManager =
nullptr,
145 bool keepNoteRowsWithMIDIInput =
true,
bool giveMidiAssignmentsToNewInstrument =
false);
147 bool shouldDeleteEmptyNoteRowsAtEndOfList =
false,
bool shouldRetainLinksToSounds =
false,
148 bool keepNoteRowsWithMIDIInput =
true,
bool shouldGrabMidiCommands =
false,
149 bool shouldBackUpExpressionParamsToo =
true)
override;
151 int32_t numNoteRowsPreviouslyDeletedFromBottom = 0);
153 bool shouldRetainLinksToSounds,
bool shouldGrabMidiCommands,
154 bool shouldBackUpExpressionParamsToo);
157 void prepNoteRowsForExitingKitMode(
Song* song);
159 int16_t getTopYNote();
160 int16_t getBottomYNote();
161 uint32_t getWrapEditLevel();
163 NoteRow* getNoteRowForYNote(int32_t, int32_t* getIndex =
nullptr);
166 NoteRow* getNoteRowForDrum(
Drum* drum, int32_t* getIndex =
nullptr);
168 Action* action =
nullptr,
bool* scaleAltered =
nullptr);
170 bool hasSameInstrument(InstrumentClip* otherClip);
171 bool isScaleModeClip();
173 Error setAudioInstrument(
Instrument* newInstrument,
Song* song,
bool shouldNotifyInstrument,
174 ParamManager* newParamManager, InstrumentClip* favourClipForCloningParamManager =
nullptr);
176 void expectEvent()
override;
181 void noteRemovedFromMode(int32_t yNoteWithinOctave,
Song* song);
183 bool clearSequenceAndMPE)
override;
184 bool doesProbabilityExist(int32_t apartFromPos, int32_t probability, int32_t secondProbability = -1);
186 ScaleType getScaleType();
187 void backupPresetSlot();
194 InstrumentClip* favourClipForCloningParamManager =
nullptr);
195 void deleteOldDrumNames();
196 void ensureScrollWithinKitBounds();
197 bool isScrollWithinRange(int32_t scrollAmount, int32_t newYNote);
200 void instrumentBeenEdited()
override;
205 Sound* sound)
override;
208 char const* getXMLTag()
override {
return "instrumentClip"; }
210 int32_t buttonLatencyForTempolessRecord)
override;
213 bool isAbandonedOverdub()
override;
215 uint32_t timeRemainder, int32_t suggestedLength,
216 int32_t alternativeLongerLength)
override;
218 bool getCurrentlyRecordingLinearly()
override;
219 void abortRecording()
override;
220 void yDisplayNoLongerAuditioning(int32_t yDisplay,
Song* song);
221 void shiftOnlyOneNoteRowHorizontally(
ModelStackWithNoteRow* modelStack, int32_t shiftAmount,
bool shiftAutomation,
222 bool shiftSequenceAndMPE);
223 int32_t getMaxLength()
override;
224 bool hasAnyPitchExpressionAutomationOnNoteRows();
226 char* otherModelStackMemory);
232 bool renderSidebar(uint32_t whichRows = 0,
RGB image[][kDisplayWidth + kSideBarWidth] =
nullptr,
233 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth] =
nullptr)
override {
234 return instrumentClipView.renderSidebar(whichRows, image, occupancyMask);
239 bool wantsToBeginLinearRecording(
Song* song)
override;
244 InstrumentClip* instrumentWasLoadedByReferenceFromClip{};
247 bool mustKeepLastOne =
true,
bool keepOnesWithMIDIInput =
true);
250 void deleteBackedUpParamManagerMIDI();
251 bool possiblyDeleteEmptyNoteRow(
NoteRow* noteRow,
bool onlyIfNoDrum,
Song* song,
bool onlyIfNonNumeric =
false,
252 bool keepIfHasMIDIInput =
true);
254 void prepareToEnterKitMode(
Song* song);
255 Error readMIDIParamsFromFile(
Deserializer& reader, int32_t readAutomationUpToPos);
257 bool lastProbabilities[kNumProbabilityValues]{};
258 int32_t lastProbabiltyPos[kNumProbabilityValues]{};
259 bool currentlyRecordingLinearly;