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; }
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); }
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); }