46class ArpeggiatorSettings {
48 ArpeggiatorSettings();
52 void cloneFrom(ArpeggiatorSettings
const* other);
54 bool readCommonTagsFromFile(
Deserializer& reader,
char const* tagName,
Song* songToConvertSyncLevel);
56 bool readNonAudioTagsFromFile(
Deserializer& reader,
char const* tagName);
58 void writeCommonParamsToFile(
Serializer& writer,
Song* songToConvertSyncLevel);
60 void writeNonAudioParamsToFile(
Serializer& writer);
62 void generateNewNotePattern();
64 void updatePresetFromCurrentSettings();
66 void updateSettingsFromCurrentPreset();
68 uint32_t getPhaseIncrement(int32_t arpRate);
71 ArpPreset preset{ArpPreset::OFF};
72 ArpMode mode{ArpMode::OFF};
74 bool includeInKitArp{
true};
77 ArpOctaveMode octaveMode{ArpOctaveMode::UP};
78 ArpNoteMode noteMode{ArpNoteMode::UP};
81 uint8_t numOctaves{2};
84 uint8_t numStepRepeats{1};
87 uint8_t chordTypeIndex{0};
94 bool randomizerLock{
false};
97 ArpMpeModSource mpeVelocity{ArpMpeModSource::OFF};
100 uint32_t lastLockedNoteProbabilityParameterValue{0};
101 uint32_t lastLockedBassProbabilityParameterValue{0};
102 uint32_t lastLockedReverseProbabilityParameterValue{0};
103 uint32_t lastLockedChordProbabilityParameterValue{0};
104 uint32_t lastLockedRatchetProbabilityParameterValue{0};
105 uint32_t lastLockedSpreadVelocityParameterValue{0};
106 uint32_t lastLockedSpreadGateParameterValue{0};
107 uint32_t lastLockedSpreadOctaveParameterValue{0};
110 std::array<int8_t, RANDOMIZER_LOCK_MAX_SAVED_VALUES> lockedNoteProbabilityValues;
111 std::array<int8_t, RANDOMIZER_LOCK_MAX_SAVED_VALUES> lockedBassProbabilityValues;
112 std::array<int8_t, RANDOMIZER_LOCK_MAX_SAVED_VALUES> lockedReverseProbabilityValues;
113 std::array<int8_t, RANDOMIZER_LOCK_MAX_SAVED_VALUES> lockedChordProbabilityValues;
114 std::array<int8_t, RANDOMIZER_LOCK_MAX_SAVED_VALUES> lockedRatchetProbabilityValues;
115 std::array<int8_t, RANDOMIZER_LOCK_MAX_SAVED_VALUES> lockedSpreadVelocityValues;
116 std::array<int8_t, RANDOMIZER_LOCK_MAX_SAVED_VALUES> lockedSpreadGateValues;
117 std::array<int8_t, RANDOMIZER_LOCK_MAX_SAVED_VALUES> lockedSpreadOctaveValues;
120 std::array<int8_t, PATTERN_MAX_BUFFER_SIZE> notePattern;
123 bool flagForceArpRestart{
false};
129 uint32_t sequenceLength{0};
130 uint32_t chordPolyphony{0};
131 uint32_t ratchetAmount{0};
132 uint32_t noteProbability{4294967295u};
133 uint32_t bassProbability{0};
134 uint32_t reverseProbability{0};
135 uint32_t chordProbability{0};
136 uint32_t ratchetProbability{0};
137 uint32_t spreadVelocity{0};
138 uint32_t spreadGate{0};
139 uint32_t spreadOctave{0};
188class ArpeggiatorBase {
191 noteCodeCurrentlyOnPostArp.fill(ARP_NOTE_NONE);
192 outputMIDIChannelForNoteCurrentlyOnPostArp.fill(0);
198 uint32_t gateThreshold, uint32_t phaseIncrement);
200 bool currentlyPlayingReversed);
202 virtual bool hasAnyInputNotesActive() = 0;
203 virtual void reset() = 0;
204 virtual ArpType getArpType() = 0;
206 bool gateCurrentlyActive =
false;
207 uint32_t gatePos = 0;
209 bool playedFirstArpeggiatedNoteYet =
false;
210 uint8_t lastVelocity = 0;
211 std::array<int16_t, ARP_MAX_INSTRUCTION_NOTES> noteCodeCurrentlyOnPostArp;
212 std::array<uint8_t, ARP_MAX_INSTRUCTION_NOTES> outputMIDIChannelForNoteCurrentlyOnPostArp;
215 uint32_t notesPlayedFromSequence = 0;
216 uint32_t randomNotesPlayedFromOctave = 0;
219 int16_t whichNoteCurrentlyOnPostArp;
220 int8_t currentOctave = 0;
221 int8_t currentDirection = 1;
222 int8_t currentOctaveDirection = 1;
225 uint32_t notesPlayedFromRhythm = 0;
226 uint32_t lastNormalNotePlayedFromRhythm = 0;
229 uint32_t notesPlayedFromLockedRandomizer = 0;
232 bool lastNormalNotePlayedFromNoteProbability =
true;
235 bool lastNormalNotePlayedFromBassProbability =
false;
238 bool lastNormalNotePlayedFromReverseProbability =
false;
241 bool lastNormalNotePlayedFromChordProbability =
false;
244 int32_t stepRepeatIndex = 0;
247 uint32_t ratchetNotesIndex = 0;
248 uint32_t ratchetNotesMultiplier = 0;
249 uint32_t ratchetNotesCount = 0;
250 bool isRatcheting =
false;
253 uint32_t chordNotesCount = 0;
256 bool isPlayNoteForCurrentStep =
true;
257 bool isPlayBassForCurrentStep =
false;
258 bool isPlayReverseForCurrentStep =
false;
259 bool isPlayChordForCurrentStep =
false;
260 bool isPlayRatchetForCurrentStep =
false;
261 int32_t spreadVelocityForCurrentStep = 0;
262 int32_t spreadGateForCurrentStep = 0;
263 int32_t spreadOctaveForCurrentStep = 0;
264 bool resetLockedRandomizerValuesNextTime =
false;
272 uint32_t maxSequenceLength, uint32_t rhythm,
bool* shouldCarryOnRhythmNote,
273 bool* shouldPlayNote,
bool* shouldPlayBassNote,
bool* shouldPlayReverseNote,
274 bool* shouldPlayChordNote);
275 void increasePatternIndexes(uint8_t numStepRepeats);
276 void increaseSequenceIndexes(uint32_t maxSequenceLength, uint32_t rhythm);
278 bool evaluateRhythm(uint32_t rhythm,
bool isRatchet);
279 bool evaluateNoteProbability(
bool isRatchet);
280 bool evaluateBassProbability(
bool isRatchet);
281 bool evaluateReverseProbability(
bool isRatchet);
282 bool evaluateChordProbability(
bool isRatchet);
283 uint32_t calculateSpreadVelocity(uint8_t velocity, int32_t spreadVelocityForCurrentStep);
287 bool getRandomProbabilityResult(uint32_t value);
288 int8_t getRandomBipolarProbabilityAmount(uint32_t value);
289 int8_t getRandomWeighted2BitsAmount(uint32_t value);