skidder::skidder(int argc, t_atom *argv) { post("_ ____ ---- :: _______ ___ _____ _ skidder~ "); tempoRateTable = new TempoRateTable; // m_setup(); // initialize a fresh skid cycle AddInSignal(2); AddInFloat(6); AddOutSignal(2); SetupInOut(); fTempo = tempoUnscaled(120.0f); currentTempoBPS = oldTempoBPS = tempoScaled(fTempo) / 60.0f; FLEXT_ADDMETHOD( 1, setRate); FLEXT_ADDMETHOD_F(0,"temposync",setTempoSync); FLEXT_ADDMETHOD( 2, setTempoRate); FLEXT_ADDMETHOD_F(0,"rrf",setRateRandFactor); FLEXT_ADDMETHOD( 3, setTempo); FLEXT_ADDMETHOD( 4, setPulsewidth); FLEXT_ADDMETHOD_F(0,"pwrm",setPulsewidthRandMin); FLEXT_ADDMETHOD( 5, setSlope); FLEXT_ADDMETHOD( 6, setFloor); FLEXT_ADDMETHOD_F(0,"frm",setFloorRandMin); FLEXT_ADDMETHOD( 7, setPan); FLEXT_ADDMETHOD_F(0,"noise",setNoise); post("_ ____ ____ _"); srand((unsigned int)time(NULL)); // sets a seed value for rand() from the system clock }
//----------------------------------------------------------------------------- void SkidderEditor::valueChanged(CDrawContext* context, CControl* control) { long tag = control->getTag(); float tempTempo; long sscanfReturn; switch (tag) { // process the tempo text input case kTempoTextEdit: if (tempoTextEdit) { tempoTextEdit->getText(tempoString); sscanfReturn = sscanf(tempoString, "%f", &tempTempo); if (strcmp(tempoString, "auto") == 0) effect->setParameterAutomated(kTempo, 0.0f); else if ( (sscanfReturn != EOF) && (sscanfReturn > 0) ) { // check if the user typed in something that's not a number if (tempTempo == 0.0f) tempoTextEdit->setText("very bad"); // the user typed in a number else { // no negative tempos if (tempTempo < 0.0f) tempTempo = -tempTempo; // if the tempo entered is 0, then leave it at 0.0 as the parameter value if (tempTempo > 0.0f) // scale the value to a 0.0 to 1.0 parameter value tempTempo = tempoUnscaled(tempTempo); // this updates the display with "bpm" appended & the fader position effect->setParameterAutomated(kTempo, tempTempo); } } // there was a sscanf() error else tempoTextEdit->setText("bad"); } break; // clicking on these parts of the GUI takes you to Destroy FX or SE web pages case kGoButtonID: if (goButton) { if (goButton->mouseIsDown()) goError = goButton->getError(); else goError = kNoGoDisplay; if (goDisplay) goDisplay->setDirty(); } case kDestroyFXlinkID: case kSmartElectronixLinkID: break; case kMidiLearnButtonID: chunk->setParameterMidiLearn(control->getValue()); break; case kMidiResetButtonID: chunk->setParameterMidiReset(control->getValue()); break; case kPulsewidth: case kPulsewidthRandMin: if (pulsewidthFader) { effect->setParameterAutomated(kPulsewidth, pulsewidthFader->getValueTagged(kPulsewidth)); effect->setParameterAutomated(kPulsewidthRandMin, pulsewidthFader->getValueTagged(kPulsewidthRandMin)); chunk->setLearner(pulsewidthFader->getTag()); // set the automation link mode for the pulsewidth range slider if (pulsewidthFader->getClickBetween()) chunk->pulsewidthDoubleAutomate = 1; else chunk->pulsewidthDoubleAutomate = 0; if (chunk->isLearning()) { if ( ((pulsewidthFader->getTag() == kPulsewidthRandMin) || (chunk->pulsewidthDoubleAutomate != 0)) && (pulsewidthFader->getHandle() == gFaderHandleLeft) ) { pulsewidthFader->setHandle(gGlowingFaderHandleLeft); pulsewidthFader->setDirty(); } if ( ((pulsewidthFader->getTag() == kPulsewidth) || (chunk->pulsewidthDoubleAutomate != 0)) && (pulsewidthFader->getHandle2() == gFaderHandleRight) ) { pulsewidthFader->setHandle2(gGlowingFaderHandleRight); pulsewidthFader->setDirty(); } } } break; case kFloor: case kFloorRandMin: if (floorFader) { effect->setParameterAutomated(kFloor, floorFader->getValueTagged(kFloor)); effect->setParameterAutomated(kFloorRandMin, floorFader->getValueTagged(kFloorRandMin)); chunk->setLearner(floorFader->getTag()); // set the automation link mode for the floor range slider if (floorFader->getClickBetween()) chunk->floorDoubleAutomate = 1; else chunk->floorDoubleAutomate = 0; if (chunk->isLearning()) { if ( ((floorFader->getTag() == kFloorRandMin) || (chunk->floorDoubleAutomate != 0)) && (floorFader->getHandle() == gFaderHandleLeft) ) { floorFader->setHandle(gGlowingFaderHandleLeft); floorFader->setDirty(); } if ( ((floorFader->getTag() == kFloor) || (chunk->floorDoubleAutomate != 0)) && (floorFader->getHandle2() == gFaderHandleRight) ) { floorFader->setHandle2(gGlowingFaderHandleRight); floorFader->setDirty(); } } } break; case kRate: case kTempoRate: effect->setParameterAutomated(tag, control->getValue()); chunk->setLearner(tag); if (chunk->isLearning()) { if (rateFader != NULL) { if ( (rateFader->getTag() == tag) && (rateFader->getHandle() == gFaderHandle) ) { rateFader->setHandle(gGlowingFaderHandle); rateFader->setDirty(); } } } break; case kTempoSync: #ifdef MSKIDDER case kVelocity: #ifdef HUNGRY case kConnect: #endif #endif effect->setParameterAutomated(tag, control->getValue()); // these are on/off buttons, so use toggle MIDI control chunk->setLearner(tag, kEventBehaviourToggle); break; #ifdef MSKIDDER case kMidiMode: effect->setParameterAutomated(tag, control->getValue()); // this is a multi-state switch, so use multi-state toggle MIDI control chunk->setLearner(tag, kEventBehaviourToggle, NUM_MIDI_MODES); break; #endif case kRateRandFactor: case kTempo: case kSlope: case kPan: case kNoise: effect->setParameterAutomated(tag, control->getValue()); chunk->setLearner(tag); if (chunk->isLearning()) { if (faders[tag] != NULL) { if (faders[tag]->getHandle() == gFaderHandle) { faders[tag]->setHandle(gGlowingFaderHandle); faders[tag]->setDirty(); } } } break; default: break; } control->update(context); }