Skip to content

Commit

Permalink
- tempo and swing is now also stored when a project is saved
Browse files Browse the repository at this point in the history
- reverted the p-lock undo pattern function, as it doesnt belong in this branch (might pick it up again later)
  • Loading branch information
zueblin committed Sep 5, 2019
1 parent af0e39a commit 5eb4592
Show file tree
Hide file tree
Showing 6 changed files with 39 additions and 30 deletions.
4 changes: 4 additions & 0 deletions Software/Polaron/Clock.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,15 @@ class Clock {
public:

void setSwing(float newSwing){swing = newSwing;};
float getSwing(){return swing;};

void onStart();
void onStop();
void notifyMidiClockReceived(){midiClockReceived = true;}
void changeStepLength(float factor);
void setStepLength(uint32_t newStepLength);
uint32_t getStepLength(){return stepLength;};

void setClockMode(ClockMode newClockMode);
void onTriggerReceived(){triggerReceived = true;};
bool update();
Expand Down
36 changes: 31 additions & 5 deletions Software/Polaron/ProjectPersistence.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,18 @@ void ProjectPersistence::save(int projectNum, Sequencer * sequencer){
Serial.println(F("Failed to create file"));
return;
}
file.print("{\"global\":");
StaticJsonDocument<200> clockDoc;
JsonObject clock = clockDoc.to<JsonObject>();
clock["stepLength"] = sequencer->clock.getStepLength();
clock["swing"] = sequencer->clock.getSwing();
if (serializeJson(clockDoc, file) == 0) {
Serial.println(F("Failed to write to file"));
}
file.print(",");

// we serialize track by track in order to save memory.
file.print("{\"tracks\":[");
file.print("\"tracks\":[");
for (int t = 0; t < NUMBER_OF_INSTRUMENTTRACKS; t++){
StaticJsonDocument<40000> trackDoc;
JsonObject track = trackDoc.to<JsonObject>();
Expand All @@ -60,6 +70,7 @@ void ProjectPersistence::save(int projectNum, Sequencer * sequencer){
pattern["pLockArmState"] = sequencerPattern.pLockArmState;
pattern["offset"] = sequencerPattern.offset;
pattern["trackLength"] = sequencerPattern.trackLength;
pattern["autoMutate"] = sequencerPattern.autoMutate;
JsonArray steps = pattern.createNestedArray("steps");
for (int s = 0; s < NUMBER_OF_STEPS_PER_PATTERN; s++){
JsonObject step = steps.createNestedObject();
Expand Down Expand Up @@ -97,6 +108,20 @@ void ProjectPersistence::load(int projectNum, Sequencer * sequencer){
Serial.println(F("Failed to read file"));
return;
}
if (file.find("\"global\":")){
StaticJsonDocument<200> clockDoc;
DeserializationError err = deserializeJson(clockDoc, file);
if (err) {
Serial.print(F("deserializeJson() returned "));
Serial.println(err.c_str());
return;
}
sequencer->clock.setStepLength(clockDoc["stepLength"]);
sequencer->clock.setSwing(clockDoc["swing"]);
} else {
file.seek(0);
};

file.find("\"tracks\":[");
int t = 0;
int p = 0;
Expand All @@ -120,10 +145,11 @@ void ProjectPersistence::load(int projectNum, Sequencer * sequencer){
//Serial.print("pattern");
//Serial.println(p);
SequencerPattern & sequencerPattern = sequencer->tracks[t].patterns[p];
sequencerPattern.triggerState = pattern["triggerState"];
sequencerPattern.pLockArmState = pattern["pLockArmState"];
sequencerPattern.offset = pattern["offset"];
sequencerPattern.trackLength = pattern["trackLength"];
sequencerPattern.triggerState = pattern["triggerState"] | 0;
sequencerPattern.pLockArmState = pattern["pLockArmState"] | 0;
sequencerPattern.offset = pattern["offset"] | 0;
sequencerPattern.trackLength = pattern["trackLength"] | 16;
sequencerPattern.autoMutate = pattern["autoMutate"] | false;
JsonArray steps = pattern["steps"];
s = 0;
for (JsonObject step : steps){
Expand Down
20 changes: 2 additions & 18 deletions Software/Polaron/Sequencer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -200,10 +200,7 @@ void Sequencer::updateState() {
doSetTrackPLock();
break;
case FunctionMode::LEAVE_TOGGLE_PLOCKS:
doTurnOffPlockMode(false);
break;
case FunctionMode::LEAVE_TOGGLE_PLOCKS_UNDO:
doTurnOffPlockMode(true);
doTurnOffPlockMode();
break;
case FunctionMode::TOGGLE_MUTES:
doToggleTrackMuteArm();
Expand Down Expand Up @@ -308,9 +305,6 @@ FunctionMode Sequencer::calculateFunctionMode() {
if (functionButtons[BUTTON_SET_TRACKLENGTH].read()){
return FunctionMode::SET_TEMPO;
}
if (previousFunctionMode == FunctionMode::TOGGLE_PLOCKS && functionButtons[BUTTON_TOGGLE_PLOCK].fell()) {
return FunctionMode::LEAVE_TOGGLE_PLOCKS_UNDO;
}
}

// PLOCKS
Expand Down Expand Up @@ -421,12 +415,6 @@ void Sequencer::doLeaveSetTrackLength(){
* Toggles plock mode of all steps in a track
*/
void Sequencer::doSetTrackPLock() {
if (!shiftPressedModeChange && functionButtons[BUTTON_TOGGLE_PLOCK].rose()){
for (int i = 0; i < NUMBER_OF_INSTRUMENTTRACKS; i++) {
// Serial.println("set undo pattern");
tracks[i].getUndoBufferPattern().copyValuesFrom(tracks[i].getCurrentPattern());
}
}
functionLED(BUTTON_TOGGLE_PLOCK) = CRGB::DarkOrange;
for (int i = 0; i < NUMBER_OF_INSTRUMENTTRACKS; i++) {
if (trackButtons[i].fell()) {
Expand Down Expand Up @@ -639,12 +627,8 @@ void Sequencer::doUpdateMutes() {
}
}

void Sequencer::doTurnOffPlockMode(bool undo) {
void Sequencer::doTurnOffPlockMode() {
for (int i = 0; i < NUMBER_OF_INSTRUMENTTRACKS; i++) {
if (undo == true){
//Serial.println("restore from undo pattern");
tracks[i].getCurrentPattern().copyValuesFrom(tracks[i].getUndoBufferPattern());
}
tracks[i].getCurrentPattern().turnOffPLockMode();
}
}
Expand Down
6 changes: 2 additions & 4 deletions Software/Polaron/Sequencer.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,6 @@ enum class FunctionMode {
LEAVE_SET_TRACK_LENGTH,
TOGGLE_PLOCKS,
LEAVE_TOGGLE_PLOCKS,
LEAVE_TOGGLE_PLOCKS_UNDO,
TOGGLE_MUTES,
LEAVE_TOGGLE_MUTES,
PATTERN_OPS,
Expand Down Expand Up @@ -122,10 +121,9 @@ class Sequencer {
boolean isRunning(){return running;};
bool anyPatternOpsArmed() { return patternOpsArmState > 0; }
void deactivateAllPatternOpsArms() { patternOpsArmState = 0; }
Clock clock;

private:

Clock clock;
PLockParamSet pLockParamSet = PLockParamSet::SET1;

AudioMixer8 *mixerL;
Expand Down Expand Up @@ -172,7 +170,7 @@ class Sequencer {
void doStartStop();
void doToggleTrackMuteArm();
void doUpdateMutes();
void doTurnOffPlockMode(bool undo);
void doTurnOffPlockMode();
void doSetTrackSelection();
void doPatternOps();
void doLeavePatternOps();
Expand Down
1 change: 0 additions & 1 deletion Software/Polaron/SequencerTrack.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ void SequencerTrack::init(ParameterSet &defaultValues) {
for (auto &pattern : patterns) {
pattern.init(defaultValues);
}
undoPattern.init(defaultValues);
}
void SequencerTrack::initPatternOpsArmState(uint8_t trackIdx, uint8_t *patternOpsArmSt) {
trackIndex = trackIdx;
Expand Down
2 changes: 0 additions & 2 deletions Software/Polaron/SequencerTrack.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ class SequencerTrack {
public:
SequencerTrack();
SequencerPattern &getCurrentPattern();
SequencerPattern &getUndoBufferPattern(){return undoPattern;};
uint8_t getCurrentPatternIndex();
SequencerStep &getCurrentStep();

Expand All @@ -61,7 +60,6 @@ class SequencerTrack {
void switchToPattern(uint8_t number);

SequencerPattern patterns[NUMBER_OF_PATTERNS];
SequencerPattern undoPattern;

private:
uint8_t trackIndex;
Expand Down

0 comments on commit 5eb4592

Please sign in to comment.