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 lastLockedSwapProbabilityParameterValue{0};
103 uint32_t lastLockedGlideProbabilityParameterValue{0};
104 uint32_t lastLockedReverseProbabilityParameterValue{0};
105 uint32_t lastLockedChordProbabilityParameterValue{0};
106 uint32_t lastLockedRatchetProbabilityParameterValue{0};
107 uint32_t lastLockedSpreadVelocityParameterValue{0};
108 uint32_t lastLockedSpreadGateParameterValue{0};
109 uint32_t lastLockedSpreadOctaveParameterValue{0};
112 std::array<int8_t, RANDOMIZER_LOCK_MAX_SAVED_VALUES> lockedNoteProbabilityValues;
113 std::array<int8_t, RANDOMIZER_LOCK_MAX_SAVED_VALUES> lockedBassProbabilityValues;
114 std::array<int8_t, RANDOMIZER_LOCK_MAX_SAVED_VALUES> lockedSwapProbabilityValues;
115 std::array<int8_t, RANDOMIZER_LOCK_MAX_SAVED_VALUES> lockedGlideProbabilityValues;
116 std::array<int8_t, RANDOMIZER_LOCK_MAX_SAVED_VALUES> lockedReverseProbabilityValues;
117 std::array<int8_t, RANDOMIZER_LOCK_MAX_SAVED_VALUES> lockedChordProbabilityValues;
118 std::array<int8_t, RANDOMIZER_LOCK_MAX_SAVED_VALUES> lockedRatchetProbabilityValues;
119 std::array<int8_t, RANDOMIZER_LOCK_MAX_SAVED_VALUES> lockedSpreadVelocityValues;
120 std::array<int8_t, RANDOMIZER_LOCK_MAX_SAVED_VALUES> lockedSpreadGateValues;
121 std::array<int8_t, RANDOMIZER_LOCK_MAX_SAVED_VALUES> lockedSpreadOctaveValues;
124 std::array<int8_t, PATTERN_MAX_BUFFER_SIZE> notePattern;
127 bool flagForceArpRestart{
false};
133 uint32_t sequenceLength{0};
134 uint32_t chordPolyphony{0};
135 uint32_t ratchetAmount{0};
136 uint32_t noteProbability{4294967295u};
137 uint32_t bassProbability{0};
138 uint32_t swapProbability{0};
139 uint32_t glideProbability{0};
140 uint32_t reverseProbability{0};
141 uint32_t chordProbability{0};
142 uint32_t ratchetProbability{0};
143 uint32_t spreadVelocity{0};
144 uint32_t spreadGate{0};
145 uint32_t spreadOctave{0};
168class ArpReturnInstruction {
170 ArpReturnInstruction() {
171 sampleSyncLengthOn = 0;
172 invertReversed =
false;
174 outputMIDIChannelOff.fill(MIDI_CHANNEL_NONE);
175 noteCodeOffPostArp.fill(ARP_NOTE_NONE);
176 glideOutputMIDIChannelOff.fill(MIDI_CHANNEL_NONE);
177 glideNoteCodeOffPostArp.fill(ARP_NOTE_NONE);
182 uint32_t sampleSyncLengthOn;
192 std::array<uint8_t, ARP_MAX_INSTRUCTION_NOTES> outputMIDIChannelOff;
193 std::array<int16_t, ARP_MAX_INSTRUCTION_NOTES> noteCodeOffPostArp;
194 std::array<uint8_t, ARP_MAX_INSTRUCTION_NOTES> glideOutputMIDIChannelOff;
195 std::array<int16_t, ARP_MAX_INSTRUCTION_NOTES> glideNoteCodeOffPostArp;
198class ArpeggiatorBase {
201 noteCodeCurrentlyOnPostArp.fill(ARP_NOTE_NONE);
202 glideNoteCodeCurrentlyOnPostArp.fill(ARP_NOTE_NONE);
203 outputMIDIChannelForNoteCurrentlyOnPostArp.fill(0);
204 outputMIDIChannelForGlideNoteCurrentlyOnPostArp.fill(0);
210 uint32_t gateThreshold, uint32_t phaseIncrement);
212 bool currentlyPlayingReversed);
214 virtual bool hasAnyInputNotesActive() = 0;
215 virtual void reset() = 0;
216 virtual ArpType getArpType() = 0;
218 bool gateCurrentlyActive =
false;
219 uint32_t gatePos = 0;
221 bool playedFirstArpeggiatedNoteYet =
false;
222 uint8_t lastVelocity = 0;
223 std::array<int16_t, ARP_MAX_INSTRUCTION_NOTES> noteCodeCurrentlyOnPostArp;
224 std::array<int16_t, ARP_MAX_INSTRUCTION_NOTES> glideNoteCodeCurrentlyOnPostArp;
225 std::array<uint8_t, ARP_MAX_INSTRUCTION_NOTES> outputMIDIChannelForNoteCurrentlyOnPostArp;
226 std::array<uint8_t, ARP_MAX_INSTRUCTION_NOTES> outputMIDIChannelForGlideNoteCurrentlyOnPostArp;
229 uint32_t notesPlayedFromSequence = 0;
230 uint32_t randomNotesPlayedFromOctave = 0;
233 int16_t whichNoteCurrentlyOnPostArp;
234 int8_t currentOctave = 0;
235 int8_t currentDirection = 1;
236 int8_t currentOctaveDirection = 1;
239 uint32_t notesPlayedFromRhythm = 0;
240 uint32_t lastNormalNotePlayedFromRhythm = 0;
243 uint32_t notesPlayedFromLockedRandomizer = 0;
246 bool lastNormalNotePlayedFromNoteProbability =
true;
249 bool lastNormalNotePlayedFromBassProbability =
false;
252 bool lastNormalNotePlayedFromSwapProbability =
false;
255 bool lastNormalNotePlayedFromReverseProbability =
false;
258 bool lastNormalNotePlayedFromChordProbability =
false;
261 int32_t stepRepeatIndex = 0;
264 uint32_t ratchetNotesIndex = 0;
265 uint32_t ratchetNotesMultiplier = 0;
266 uint32_t ratchetNotesCount = 0;
267 bool isRatcheting =
false;
270 bool glideOnNextNoteOff =
false;
273 bool isPlayNoteForCurrentStep =
true;
274 bool isPlayBassForCurrentStep =
false;
275 bool isPlayRandomStepForCurrentStep =
false;
276 bool isPlayReverseForCurrentStep =
false;
277 bool isPlayChordForCurrentStep =
false;
278 bool isPlayRatchetForCurrentStep =
false;
279 bool isPlayGlideForCurrentStep =
false;
280 int32_t spreadVelocityForCurrentStep = 0;
281 int32_t spreadGateForCurrentStep = 0;
282 int32_t spreadOctaveForCurrentStep = 0;
283 bool resetLockedRandomizerValuesNextTime =
false;
291 uint32_t maxSequenceLength, uint32_t rhythm,
bool* shouldCarryOnRhythmNote,
292 bool* shouldPlayNote,
bool* shouldPlayBassNote,
bool* shouldPlayRandomStep,
293 bool* shouldPlayReverseNote,
bool* shouldPlayChordNote);
294 void increasePatternIndexes(uint8_t numStepRepeats);
295 void increaseSequenceIndexes(uint32_t maxSequenceLength, uint32_t rhythm);
297 bool evaluateRhythm(uint32_t rhythm,
bool isRatchet);
298 bool evaluateNoteProbability(
bool isRatchet);
299 bool evaluateBassProbability(
bool isRatchet);
300 bool evaluateSwapProbability(
bool isRatchet);
301 bool evaluateReverseProbability(
bool isRatchet);
302 bool evaluateChordProbability(
bool isRatchet);
303 uint32_t calculateSpreadVelocity(uint8_t velocity, int32_t spreadVelocityForCurrentStep);
307 bool getRandomProbabilityResult(uint32_t value);
308 int8_t getRandomBipolarProbabilityAmount(uint32_t value);
309 int8_t getRandomWeighted2BitsAmount(uint32_t value);