Example #1
0
static void EmulateMidiHardware(int flag, void *data)
{
    std::list<RprMidiTake *> midiTakes;
    std::list<RprMidiNote *> midiNotes;
    double serialDelay = 0.001;
    std::string val = getReaperProperty("midihw_delay");
    if(!val.empty()) {
        serialDelay = ::atof(val.c_str()) / 1000.0;
    }

    int jitter = 1000;
    val = getReaperProperty("midihw_jitter");
    if(!val.empty()) {
        jitter = (int)(::atof(val.c_str()) * 1000.0 + 0.5);
    }

    RprItemCtrPtr itemCtr = RprItemCollec::getSelected();
    if(!convertToInProjectMidi(itemCtr))
        return;

    for(int i = 0; i < itemCtr->size(); ++i) {
        RprTake take = itemCtr->getAt(i).getActiveTake();
        if(!take.isMIDI())
            continue;
        if(take.isFile())
            continue;
        RprMidiTake *midiTake = new RprMidiTake(take);
        midiTakes.push_back(midiTake);
        for(int j = 0; j < midiTake->countNotes(); ++j) {
            midiNotes.push_back(midiTake->getNoteAt(j));
        }
     }
    midiNotes.sort(sortMidiPositions);

    std::list<RprMidiNote *>::iterator i = midiNotes.begin();
    if(i == midiNotes.end()) {
        for(std::list<RprMidiTake *>::iterator k = midiTakes.begin(); k != midiTakes.end(); ++k)
        delete *k;
        return;
    }

    double lastPosition = (*i)->getPosition();
    (*i)->setPosition((*i)->getPosition() + getJitter(jitter));
    ++i;
    for(; i != midiNotes.end(); ++i) {
        double currentPosition = (*i)->getPosition();
        if(currentPosition < lastPosition)
            currentPosition = lastPosition;
        double diff = currentPosition - lastPosition;
        double newPos = currentPosition + getJitter(jitter);
        if(diff < serialDelay) {
            newPos += serialDelay;
            diff = serialDelay;
        }
        (*i)->setPosition(newPos);
        lastPosition += diff;
    }
    for(std::list<RprMidiTake *>::iterator k = midiTakes.begin(); k != midiTakes.end(); ++k)
        delete *k;
}
Example #2
0
bool XAGYLWheel::getSettingInfo()
{
    bool rc1 = getMaximumSpeed();
    bool rc2 = getJitter();
    bool rc3 = getThreshold();
    bool rc4 = true;

    if (firmwareVersion >= 3)
        rc4 = getPulseWidth();

    return (rc1 && rc2 && rc3 && rc4);
}
Example #3
0
bool XAGYLWheel::ISNewNumber (const char *dev, const char *name, double values[], char *names[], int n)
{
    if(strcmp(dev,getDeviceName())==0)
    {               
        if (!strcmp(OffsetNP.name, name))
        {
            bool rc_offset=true;
            for (int i=0; i < n; i++)
            {
                if (!strcmp(names[i], OffsetN[i].name))
                {
                    while (values[i] != OffsetN[i].value && rc_offset)
                    {
                        if (values[i] > OffsetN[i].value)
                            rc_offset = setOffset(i, 1);
                        else
                            rc_offset = setOffset(i, -1);
                    }
                }

            }

            OffsetNP.s = rc_offset ? IPS_OK : IPS_ALERT;
            IDSetNumber(&OffsetNP, NULL);
            return true;
        }

        if (!strcmp(SettingsNP.name, name))
        {
            double newSpeed, newJitter, newThreshold, newPulseWidth;
            for (int i=0; i < n; i++)
            {
                if (!strcmp(names[i], SettingsN[SET_SPEED].name))
                    newSpeed = values[i];
                else if (!strcmp(names[i], SettingsN[SET_JITTER].name))
                    newJitter = values[i];
                if (!strcmp(names[i], SettingsN[SET_THRESHOLD].name))
                    newThreshold = values[i];
                if (!strcmp(names[i], SettingsN[SET_PULSE_WITDH].name))
                    newPulseWidth = values[i];
            }

            bool rc_speed=true, rc_jitter=true, rc_threshold=true, rc_pulsewidth=true;

            if (newSpeed != SettingsN[SET_SPEED].value)
            {
                rc_speed = setCommand(SET_SPEED, newSpeed);
                getMaximumSpeed();
            }

            // Jitter
            while (newJitter != SettingsN[SET_JITTER].value && rc_jitter)
            {
                if (newJitter > SettingsN[SET_JITTER].value)
                {
                    rc_jitter &= setCommand(SET_JITTER, 1);
                    getJitter();
                }
                else
                {
                    rc_jitter &= setCommand(SET_JITTER, -1);
                    getJitter();
                }
            }

            // Threshold
            while (newThreshold != SettingsN[SET_THRESHOLD].value && rc_threshold)
            {
                if (newThreshold > SettingsN[SET_THRESHOLD].value)
                {
                    rc_threshold &= setCommand(SET_THRESHOLD, 1);
                    getThreshold();
                }
                else
                {
                    rc_threshold &= setCommand(SET_THRESHOLD, -1);
                    getThreshold();
                }
            }

            // Pulse width
            while (firmwareVersion >= 3 && newPulseWidth != SettingsN[SET_PULSE_WITDH].value && rc_pulsewidth)
            {
                if (newPulseWidth> SettingsN[SET_PULSE_WITDH].value)
                {
                    rc_pulsewidth &= setCommand(SET_PULSE_WITDH, 1);
                    getPulseWidth();
                }
                else
                {
                    rc_pulsewidth &= setCommand(SET_PULSE_WITDH, -1);
                    getPulseWidth();
                }
            }

            if (rc_speed && rc_jitter && rc_threshold && rc_pulsewidth)
                SettingsNP.s = IPS_OK;
            else
                SettingsNP.s = IPS_ALERT;

            IDSetNumber(&SettingsNP, NULL);

            return true;
        }
    }

    return INDI::FilterWheel::ISNewNumber(dev, name, values, names, n);
}