XR4-display / src / XRSequenceInstrumentTrackProgram.cpp
XRSequenceInstrumentTrackProgram.cpp
Raw
#include "XRSequenceInstrumentTrackProgram.h"

#include <Arduino.h>
#include <sstream>

void SequenceInstrumentTrackProgram::toggleState()
{
    switch (this->state) {
        case (unsigned int) InstrumentTrackProgramState::REST :
            this->state = (unsigned int) InstrumentTrackProgramState::ACTIVE;
            break;
        case (unsigned int) InstrumentTrackProgramState::ACTIVE :
            this->state = (unsigned int) InstrumentTrackProgramState::REST;
            break;
    }
}

void SequenceInstrumentTrackProgram::undoChanges()
{
    unsigned int &bn = this->bankNumber;
    unsigned int &pn = this->programNumber;
    unsigned int &bl = this->barLength;
    unsigned int &s = this->state;
    unsigned int &ls = this->lastStep;

    unsigned int &oBn = this->oldBankNumber;
    unsigned int &oPn = this->oldProgramNumber;
    unsigned int &oBl = this->oldBarLength;
    unsigned int &oS = this->oldState;
    unsigned int &oLs = this->oldLastStep;

    bn = oBn;
    pn = oPn;
    bl = oBl;
    s = oS;
    ls = oLs;
}

void SequenceInstrumentTrackProgram::setConfigProp(unsigned int prop, unsigned int val)
{
    unsigned int &bn = this->bankNumber;
    unsigned int &pn = this->programNumber;
    unsigned int &bl = this->barLength;
    unsigned int &s  = this->state;
    unsigned int &ls = this->lastStep;

    switch (prop) {
        case (int)ConfigPropSettingsType::BANK_NUMBER :
            bn = val;
            break;
        case (int)ConfigPropSettingsType::PROGRAM_NUMBER :
            pn = val;
            break;
        case (int)ConfigPropSettingsType::BAR_LENGTH :
            bl = val;
            break;
        case (int)ConfigPropSettingsType::STATE :
            s = val;
            break;
        case (int)ConfigPropSettingsType::LAST_STEP :
            ls = val;
            break;
        default:
            break;
    }
}

/**
 * USE ONLY WITH STRING VECTOR OPTIONS
 * @param unsigned int propIdx
 * @param unsigned int opt
 * @return
 */
std::string SequenceInstrumentTrackProgram::getConfigPropSettingOption(unsigned int propIdx, unsigned int opt) const
{
    ConfigPropSettingsTemplate propOpts = this->configPropOptions;

    // bank num or state prop
    if (propIdx == (int)ConfigPropSettingsType::BANK_NUMBER || propIdx == (int)ConfigPropSettingsType::STATE) {
        std::vector<std::string> opts = propIdx == (int)ConfigPropSettingsType::BANK_NUMBER ? propOpts.bankNumberOpts : propOpts.stateOpts;

        // are there any prop options ? safe to parse ?
        if (!opts.empty() && opts.size() >= opt) {
            std::string cOpt = opts.at(opt);

            return cOpt;
        }
    }

    return "N/A";
}

unsigned int SequenceInstrumentTrackProgram::getConfigPropSettingMax(unsigned int prop) const
{
    ConfigPropSettingsTemplate propOpts = this->configPropOptions;

    unsigned int max = 128; // default max (for 8-bit values for things like program num, etc)

    if (prop == (int)ConfigPropSettingsType::BANK_NUMBER || prop == (int)ConfigPropSettingsType::STATE) {
        std::vector<std::string> opts = prop == (int)ConfigPropSettingsType::BANK_NUMBER ? propOpts.bankNumberOpts : propOpts.stateOpts;
        max = opts.size();
    } else if (prop == (int)ConfigPropSettingsType::BAR_LENGTH) {
        max = 99;
    } else if (prop == (int)ConfigPropSettingsType::LAST_STEP) {
        max = 16;
    }

    return max;
}

unsigned int SequenceInstrumentTrackProgram::getConfigPropCount()
{
    return SequenceInstrumentTrackProgram::configPropCount;
}

std::string SequenceInstrumentTrackProgram::getConfigPropSettingValue(unsigned int prop) const
{
    std::string numStr;
    std::ostringstream numStrTmp;

    switch (prop) {
        case (int)ConfigPropSettingsType::BANK_NUMBER :
            return this->getConfigPropSettingOption(prop, this->bankNumber);
        case (int)ConfigPropSettingsType::PROGRAM_NUMBER :
            numStrTmp << this->programNumber;
            numStr = numStrTmp.str();
            return numStr;
        case (int)ConfigPropSettingsType::BAR_LENGTH :
            numStrTmp << this->barLength;
            numStr = numStrTmp.str();
            return numStr;
        case (int)ConfigPropSettingsType::STATE :
            return this->getConfigPropSettingOption(prop, this->state);
        case (int)ConfigPropSettingsType::LAST_STEP :
            numStrTmp << this->lastStep;
            numStr = numStrTmp.str();
            return numStr;
        default:
            return "N/A";
    }
}

const char* SequenceInstrumentTrackProgram::getConfigPropName(unsigned int prop)
{
    return this->configPropNames[prop];
}

const char* SequenceInstrumentTrackProgram::getConfigPropNameShort(unsigned int prop)
{
    return this->configPropNamesShort[prop];
}