void skidder::m_setup() { state = valley; valleySamples = 0; panRander = 0.0f; rms = 0.0f; rmscount = 0; randomFloor = 0.0f; randomGainRange = 1.0f; // deallocate the memory from these arrays // if (tempoRateTable) delete tempoRateTable; fRate = rateUnscaled(3.0f); // 0.1304347826087 fTempoSync = 0.0f; // default to no tempo sync; "free" control fTempoRate = 0.333f; fRateRandFactor = 0.0f; // default to no randomness fTempo = 0.0f; // default to "auto" (i.e. get it from the host) fPulsewidth = 0.5f; fPulsewidthRandMin = 0.5f; fSlope = 3.0f/SLOPEMAX; // 0.2 fFloor = 0.0f; fFloorRandMin = 0.0f; fPan = 0.0f; fNoise = 0.0f; }
//----------------------------------------------------------------------------- long SkidderEditor::open(void *ptr) { CPoint displayOffset; // for positioning the background graphic behind display boxes // !!! always call this !!! AEffGUIEditor::open(ptr); // load some bitmaps if (!gFaderSlide) gFaderSlide = new CBitmap (kFaderSlideID); if (!gFaderHandle) gFaderHandle = new CBitmap (kFaderHandleID); if (!gGlowingFaderHandle) gGlowingFaderHandle = new CBitmap (kGlowingFaderHandleID); if (!gFaderHandleLeft) gFaderHandleLeft = new CBitmap (kFaderHandleLeftID); if (!gGlowingFaderHandleLeft) gGlowingFaderHandleLeft = new CBitmap (kGlowingFaderHandleLeftID); if (!gFaderHandleRight) gFaderHandleRight = new CBitmap (kFaderHandleRightID); if (!gGlowingFaderHandleRight) gGlowingFaderHandleRight = new CBitmap (kGlowingFaderHandleRightID); if (!gTempoSyncButton) gTempoSyncButton = new CBitmap (kTempoSyncButtonID); if (!gMidiLearnButton) gMidiLearnButton = new CBitmap (kMidiLearnButtonID); if (!gMidiResetButton) gMidiResetButton = new CBitmap (kMidiResetButtonID); if (!gGoButton) gGoButton = new CBitmap (kGoButtonID); if (!gDestroyFXlink) gDestroyFXlink = new CBitmap (kDestroyFXlinkID); if (!gSmartElectronixLink) gSmartElectronixLink = new CBitmap (kSmartElectronixLinkID); #ifdef MSKIDDER if (!gMidiModeButton) gMidiModeButton = new CBitmap (kMidiModeButtonID); if (!gVelocityButton) gVelocityButton = new CBitmap (kVelocityButtonID); #ifdef HUNGRY if (!gConnectButton) gConnectButton = new CBitmap (kConnectButtonID); #endif #endif chunk->resetLearning(); goError = kNoGoDisplay; long rateTag = onOffTest(effect->getParameter(kTempoSync)) ? kTempoRate : kRate; //--initialize the background frame-------------------------------------- CRect size (0, 0, gBackground->getWidth(), gBackground->getHeight()); frame = new CFrame (size, ptr, this); frame->setBackground(gBackground); //--initialize the faders----------------------------------------------- int minPos = kFaderX; int maxPos = kFaderX + gFaderSlide->getWidth() - gFaderHandle->getWidth() - 1; CPoint point (0, 0); CPoint offset (0, 1); // rate (single slider for "free" Hz rate & tempo synced rate) // size stores left, top, right, & bottom positions size (kFaderX, kFaderY, kFaderX + gFaderSlide->getWidth(), kFaderY + gFaderSlide->getHeight()); rateFader = new CHorizontalSlider (size, this, rateTag, minPos, maxPos, gFaderHandle, gFaderSlide, point, kLeft); rateFader->setOffsetHandle(offset); rateFader->setValue(effect->getParameter(rateTag)); rateFader->setDefaultValue(rateUnscaled(3.0f)); frame->addView(rateFader); // rate random factor size.offset (0, kFaderInc); rateRandFactorFader = new CHorizontalSlider (size, this, kRateRandFactor, minPos, maxPos, gFaderHandle, gFaderSlide, point, kLeft); rateRandFactorFader->setOffsetHandle(offset); rateRandFactorFader->setValue(effect->getParameter(kRateRandFactor)); rateRandFactorFader->setDefaultValue(0.0f); frame->addView(rateRandFactorFader); // tempo (in bpm) size.offset (0, kFaderInc); tempoFader = new CHorizontalSlider (size, this, kTempo, minPos, maxPos, gFaderHandle, gFaderSlide, point, kLeft); tempoFader->setOffsetHandle(offset); tempoFader->setValue(effect->getParameter(kTempo)); tempoFader->setDefaultValue(0.0f); frame->addView(tempoFader); int minRPos = kFaderX; int maxRPos = kFaderX + gFaderSlide->getWidth(); // pulsewidth size.offset (0, kFaderInc); pulsewidthFader = new CHorizontalRangeSlider (size, this, kPulsewidthRandMin, kPulsewidth, minRPos, maxRPos, gFaderHandleLeft, gFaderSlide, point, kLeft, kMaxCanPush, gFaderHandleRight); pulsewidthFader->setOffsetHandle(point); pulsewidthFader->setValueTagged(kPulsewidth, effect->getParameter(kPulsewidth)); pulsewidthFader->setValueTagged(kPulsewidthRandMin, effect->getParameter(kPulsewidthRandMin)); pulsewidthFader->setDefaultValueTagged(kPulsewidth, 0.5f); pulsewidthFader->setDefaultValueTagged(kPulsewidthRandMin, 0.5f); frame->addView(pulsewidthFader); // slope size.offset (0, kFaderInc); slopeFader = new CHorizontalSlider (size, this, kSlope, minPos, maxPos, gFaderHandle, gFaderSlide, point, kLeft); slopeFader->setOffsetHandle(offset); slopeFader->setValue(effect->getParameter(kSlope)); slopeFader->setDefaultValue(3.0f/SLOPEMAX); frame->addView(slopeFader); // floor size.offset (0, kFaderInc); floorFader = new CHorizontalRangeSlider (size, this, kFloorRandMin, kFloor, minRPos, maxRPos, gFaderHandleLeft, gFaderSlide, point, kLeft, kMaxCanPush, gFaderHandleRight); floorFader->setOffsetHandle(point); floorFader->setValueTagged(kFloor, effect->getParameter(kFloor)); floorFader->setValueTagged(kFloorRandMin, effect->getParameter(kFloorRandMin)); floorFader->setDefaultValueTagged(kFloor, 0.0f); floorFader->setDefaultValueTagged(kFloorRandMin, 0.0f); frame->addView(floorFader); // pan size.offset (0, kFaderInc); panFader = new CHorizontalSlider (size, this, kPan, minPos, maxPos, gFaderHandle, gFaderSlide, point, kLeft); panFader->setOffsetHandle(offset); panFader->setValue(effect->getParameter(kPan)); panFader->setDefaultValue(0.6f); frame->addView(panFader); // noise size.offset (0, kFaderInc); noiseFader = new CHorizontalSlider (size, this, kNoise, minPos, maxPos, gFaderHandle, gFaderSlide, point, kLeft); noiseFader->setOffsetHandle(offset); noiseFader->setValue(effect->getParameter(kNoise)); noiseFader->setDefaultValue(1.0f); frame->addView(noiseFader); //--initialize the buttons---------------------------------------------- // choose the rate type ("free" or synced) size (kTempoSyncButtonX, kTempoSyncButtonY, kTempoSyncButtonX + gTempoSyncButton->getWidth(), kTempoSyncButtonY + (gTempoSyncButton->getHeight())/2); tempoSyncButton = new COnOffButton (size, this, kTempoSync, gTempoSyncButton); tempoSyncButton->setValue(effect->getParameter(kTempoSync)); frame->addView(tempoSyncButton); // go! // size stores left, top, right, & bottom positions size (kGoButtonX, kGoButtonY, kGoButtonX + gGoButton->getWidth(), kGoButtonY + (gGoButton->getHeight())/2); goButton = new CWebLink (size, this, kGoButtonID, "http://www.whirledbank.org/", gGoButton); frame->addView(goButton); // Destroy FX web page link size (kDestroyFXlinkX, kDestroyFXlinkY, kDestroyFXlinkX + gDestroyFXlink->getWidth(), kDestroyFXlinkY + (gDestroyFXlink->getHeight())/2); DestroyFXlink = new CWebLink (size, this, kDestroyFXlinkID, DESTROYFX_URL, gDestroyFXlink); frame->addView(DestroyFXlink); // Smart Electronix web page link size (kSmartElectronixLinkX, kSmartElectronixLinkY, kSmartElectronixLinkX + gSmartElectronixLink->getWidth(), kSmartElectronixLinkY + (gSmartElectronixLink->getHeight())/2); SmartElectronixLink = new CWebLink (size, this, kSmartElectronixLinkID, SMARTELECTRONIX_URL, gSmartElectronixLink); frame->addView(SmartElectronixLink); #ifdef MSKIDDER // MIDI note control mode button size (kMidiModeButtonX, kMidiModeButtonY, kMidiModeButtonX + gMidiModeButton->getWidth(), kMidiModeButtonY + (gMidiModeButton->getHeight())/NUM_MIDI_MODES); midiModeButton = new CMultiToggle (size, this, kMidiMode, NUM_MIDI_MODES, gMidiModeButton->getHeight()/NUM_MIDI_MODES, gMidiModeButton, point); midiModeButton->setValue(effect->getParameter(kMidiMode)); frame->addView(midiModeButton); // use-note-velocity button size (kVelocityButtonX, kVelocityButtonY, kVelocityButtonX + gVelocityButton->getWidth(), kVelocityButtonY + (gVelocityButton->getHeight())/2); velocityButton = new COnOffButton (size, this, kVelocity, gVelocityButton); velocityButton->setValue(effect->getParameter(kVelocity)); frame->addView(velocityButton); // turn on/off MIDI learn mode for CC parameter automation size (kMidiLearnButtonX, kMidiLearnButtonY, kMidiLearnButtonX + gMidiLearnButton->getWidth(), kMidiLearnButtonY + (gMidiLearnButton->getHeight())/2); midiLearnButton = new COnOffButton (size, this, kMidiLearnButtonID, gMidiLearnButton); midiLearnButton->setValue(0.0f); frame->addView(midiLearnButton); // clear all MIDI CC assignments size (kMidiResetButtonX, kMidiResetButtonY, kMidiResetButtonX + gMidiResetButton->getWidth(), kMidiResetButtonY + (gMidiResetButton->getHeight())/2); midiResetButton = new CKickButton (size, this, kMidiResetButtonID, (gMidiResetButton->getHeight())/2, gMidiResetButton, point); midiResetButton->setValue(0.0f); frame->addView(midiResetButton); #ifdef HUNGRY if ( ((Skidder*)effect)->foodEater->hostIsLogic ) { // connect to food size (kConnectButtonX, kConnectButtonY, kConnectButtonX + gConnectButton->getWidth(), kConnectButtonY + (gConnectButton->getHeight())/2); connectButton = new COnOffButton (size, this, kConnect, gConnectButton); connectButton->setValue(effect->getParameter(kConnect)); frame->addView(connectButton); } #endif #endif //--initialize the displays--------------------------------------------- // first store the proper values for all of the globals so that displays are correct strcpy( tempoRateString, ((Skidder*)effect)->tempoRateTable->getDisplay(effect->getParameter(kTempoRate)) ); theTempoSync = ((Skidder*)effect)->fTempoSync; theCycleRate = calculateTheCycleRate(); // rate (unified display for "free" Hz rate & tempo synced rate) size (kDisplayX, kDisplayY, kDisplayX + kDisplayWidth, kDisplayY + kDisplayHeight); rateDisplay = new CParamDisplay (size, gBackground); displayOffset (kDisplayX, kDisplayY); rateDisplay->setBackOffset(displayOffset); rateDisplay->setHoriAlign(kLeftText); rateDisplay->setFont(kNormalFontSmall); rateDisplay->setFontColor(kWhiteCColor); rateDisplay->setValue(effect->getParameter(rateTag)); rateDisplay->setStringConvert(rateDisplayConvert, tempoRateString); rateDisplay->setTag(rateTag); frame->addView(rateDisplay); // rate random factor size.offset (0, kFaderInc); rateRandFactorDisplay = new CParamDisplay (size, gBackground); displayOffset (kDisplayX, kDisplayY); rateRandFactorDisplay->setBackOffset(displayOffset); rateRandFactorDisplay->setHoriAlign(kLeftText); rateRandFactorDisplay->setFont(kNormalFontSmall); rateRandFactorDisplay->setFontColor(kWhiteCColor); rateRandFactorDisplay->setValue(effect->getParameter(kRateRandFactor)); rateRandFactorDisplay->setStringConvert(rateRandFactorDisplayConvert); rateRandFactorDisplay->setTag(kRateRandFactor); frame->addView(rateRandFactorDisplay); // tempo (in bpm) (editable) size.offset (0, kFaderInc); tempoTextEdit = new CTextEdit (size, this, kTempoTextEdit, 0, gBackground); displayOffset.offset (0, kFaderInc); tempoTextEdit->setBackOffset(displayOffset); tempoTextEdit->setFont (kNormalFontSmall); tempoTextEdit->setFontColor (kWhiteCColor); tempoTextEdit->setHoriAlign (kLeftText); frame->addView (tempoTextEdit); // this makes it display the current value setParameter(kTempo, effect->getParameter(kTempo)); // pulsewidth size.offset (0, kFaderInc - 1); pulsewidthDisplay = new CNumberBox (size, this, kPulsewidth, gBackground, 0, kVertical); displayOffset.offset (0, kFaderInc - 1); pulsewidthDisplay->setBackOffset(displayOffset); pulsewidthDisplay->setHoriAlign(kLeftText); pulsewidthDisplay->setFont(kNormalFontSmall); pulsewidthDisplay->setFontColor(kWhiteCColor); pulsewidthDisplay->setValue(effect->getParameter(kPulsewidth)); pulsewidthDisplay->setStringConvert(pulsewidthDisplayConvert); pulsewidthDisplay->setTag(kPulsewidth); frame->addView(pulsewidthDisplay); // pulsewidth random minimum size.offset (1, kRandomMinimumIncY + 1); pulsewidthRandMinDisplay = new CParamDisplay (size, gBackground); displayOffset.offset (1, kRandomMinimumIncY + 1); pulsewidthRandMinDisplay->setBackOffset(displayOffset); pulsewidthRandMinDisplay->setHoriAlign(kLeftText); pulsewidthRandMinDisplay->setFont(kNormalFontVerySmall); pulsewidthRandMinDisplay->setFontColor(kWhiteCColor); pulsewidthRandMinDisplay->setValue(effect->getParameter(kPulsewidthRandMin)); pulsewidthRandMinDisplay->setStringConvert( pulsewidthRandMinDisplayConvert, &(((Skidder*)effect)->fPulsewidth) ); pulsewidthRandMinDisplay->setTag(kPulsewidthRandMin); frame->addView(pulsewidthRandMinDisplay); // the words "random minimum" size (kRandomMinimumX, kDisplayY + (kFaderInc*3) + kRandomMinimumIncY, kRandomMinimumX + kRandomMinimumWidth, kDisplayY + (kFaderInc*3) + kRandomMinimumIncY + kDisplayHeight); randomMinimumDisplay = new CParamDisplay (size, gBackground); displayOffset (kRandomMinimumX, kDisplayY + (kFaderInc*4) + kRandomMinimumIncY + 1); randomMinimumDisplay->setBackOffset(displayOffset); randomMinimumDisplay->setHoriAlign(kRightText); randomMinimumDisplay->setFont(kNormalFontVerySmall); randomMinimumDisplay->setFontColor(kWhiteCColor); randomMinimumDisplay->setValue(effect->getParameter(kPulsewidthRandMin)); randomMinimumDisplay->setStringConvert( randomMinimumDisplayConvert, &(((Skidder*)effect)->fPulsewidth) ); randomMinimumDisplay->setTag(kPulsewidthRandMin); frame->addView(randomMinimumDisplay); // slope size (kDisplayX, kDisplayY + (kFaderInc*4), kDisplayX + kDisplayWidth, kDisplayY + (kFaderInc*4) + kDisplayHeight); slopeDisplay = new CParamDisplay (size, gBackground); displayOffset (kDisplayX, kDisplayY + (kFaderInc*5)); slopeDisplay->setBackOffset(displayOffset); slopeDisplay->setHoriAlign(kLeftText); slopeDisplay->setFont(kNormalFontSmall); slopeDisplay->setFontColor(kWhiteCColor); slopeDisplay->setValue(effect->getParameter(kSlope)); slopeDisplay->setStringConvert(slopeDisplayConvert); frame->addView(slopeDisplay); // floor size.offset (0, kFaderInc - 1); floorDisplay = new CParamDisplay (size, gBackground); displayOffset.offset (0, kFaderInc - 1); floorDisplay->setBackOffset(displayOffset); floorDisplay->setHoriAlign(kLeftText); floorDisplay->setFont(kNormalFontSmall); floorDisplay->setFontColor(kWhiteCColor); floorDisplay->setValue(effect->getParameter(kFloor)); floorDisplay->setStringConvert(floorDisplayConvert); frame->addView(floorDisplay); // floor random minimum size.offset (1, kRandomMinimumIncY + 1); floorRandMinDisplay = new CParamDisplay (size, gBackground); displayOffset.offset (1, kRandomMinimumIncY + 1); floorRandMinDisplay->setBackOffset(displayOffset); floorRandMinDisplay->setHoriAlign(kLeftText); floorRandMinDisplay->setFont(kNormalFontVerySmall); floorRandMinDisplay->setFontColor(kWhiteCColor); floorRandMinDisplay->setValue(effect->getParameter(kFloorRandMin)); floorRandMinDisplay->setStringConvert( floorRandMinDisplayConvert, &(((Skidder*)effect)->fFloor) ); floorRandMinDisplay->setTag(kFloorRandMin); frame->addView(floorRandMinDisplay); // the words "random minimum" again size (kRandomMinimumX, kDisplayY + (kFaderInc*5) + kRandomMinimumIncY, kRandomMinimumX + kRandomMinimumWidth, kDisplayY + (kFaderInc*5) + kRandomMinimumIncY + kDisplayHeight); randomMinimum2Display = new CParamDisplay (size, gBackground); displayOffset (kRandomMinimumX, kDisplayY + (kFaderInc*6) + kRandomMinimumIncY + 1); randomMinimum2Display->setBackOffset(displayOffset); randomMinimum2Display->setHoriAlign(kRightText); randomMinimum2Display->setFont(kNormalFontVerySmall); randomMinimum2Display->setFontColor(kWhiteCColor); randomMinimum2Display->setValue(effect->getParameter(kFloorRandMin)); randomMinimum2Display->setStringConvert( randomMinimumDisplayConvert, &(((Skidder*)effect)->fFloor) ); randomMinimum2Display->setTag(kFloorRandMin); frame->addView(randomMinimum2Display); // pan size (kDisplayX, kDisplayY + (kFaderInc*6), kDisplayX + kDisplayWidth, kDisplayY + (kFaderInc*6) + kDisplayHeight); panDisplay = new CParamDisplay (size, gBackground); displayOffset.offset (0, kFaderInc); panDisplay->setBackOffset(displayOffset); panDisplay->setHoriAlign(kLeftText); panDisplay->setFont(kNormalFontSmall); panDisplay->setFontColor(kWhiteCColor); panDisplay->setValue(effect->getParameter(kPan)); panDisplay->setStringConvert(panDisplayConvert); frame->addView(panDisplay); // noise size.offset (0, kFaderInc); noiseDisplay = new CParamDisplay (size, gBackground); displayOffset.offset (0, kFaderInc); noiseDisplay->setBackOffset(displayOffset); noiseDisplay->setHoriAlign(kLeftText); noiseDisplay->setFont(kNormalFontSmall); noiseDisplay->setFontColor(kWhiteCColor); noiseDisplay->setValue(effect->getParameter(kNoise)); noiseDisplay->setStringConvert(noiseDisplayConvert); frame->addView(noiseDisplay); // the word "range" size (kRangeDisplayX, kRangeDisplayY, kRangeDisplayX + kRangeDisplayWidth, kRangeDisplayY + kRangeDisplayHeight); rangeDisplay = new CParamDisplay (size, gBackground); displayOffset (kRangeDisplayX, kRangeDisplayY); rangeDisplay->setBackOffset(displayOffset); rangeDisplay->setHoriAlign(kLeftText); rangeDisplay->setFont(kNormalFontVerySmall); rangeDisplay->setFontColor(kBlackCColor); rangeDisplay->setValue(effect->getParameter(kRateRandFactor)); rangeDisplay->setStringConvert(rangeDisplayConvert); frame->addView(rangeDisplay); // the rate random factor range read-out size (kRateRandRangeDisplayX, kRateRandRangeDisplayY, kRateRandRangeDisplayX + kRateRandRangeDisplayWidth, kRateRandRangeDisplayY + kRateRandRangeDisplayHeight); rateRandRangeDisplay = new CParamDisplay (size); // if/else stuff to make this display disappear when there's no rate randomness if ( effect->getParameter(kRateRandFactor) <= 0.0f ) { rateRandRangeDisplay->setBackColor(kBackgroundCColor); rateRandRangeDisplay->setFrameColor(kBackgroundCColor); } else { rateRandRangeDisplay->setBackColor(kMyPaleGreenCColor); rateRandRangeDisplay->setFrameColor(kBlackCColor); } rateRandRangeDisplay->setHoriAlign(kCenterText); rateRandRangeDisplay->setFont(kNormalFontVerySmall); rateRandRangeDisplay->setFontColor(kMyDarkBlueCColor); rateRandRangeDisplay->setValue(effect->getParameter(kRateRandFactor)); rateRandRangeDisplay->setStringConvert(rateRandRangeDisplayConvert, &theCycleRate); frame->addView(rateRandRangeDisplay); // go! error/success display size (kGoButtonX, kGoButtonY + 17, kGoButtonX + gGoButton->getWidth(), kGoButtonY + kDisplayHeight + 17); goDisplay = new CParamDisplay (size, gBackground); displayOffset (kGoButtonX, kGoButtonY + 17); goDisplay->setBackOffset(displayOffset); goDisplay->setHoriAlign(kCenterText); goDisplay->setFont(kNormalFontSmall); goDisplay->setFontColor(kWhiteCColor); goDisplay->setValue(0.0f); goDisplay->setStringConvert(goDisplayConvert, &goError); frame->addView(goDisplay); #ifdef MSKIDDER #ifdef HUNGRY if ( ((Skidder*)effect)->foodEater->hostIsLogic ) { // connect to food error display size (kConnectButtonX, kConnectButtonY + 17, kConnectButtonX + gConnectButton->getWidth(), kConnectButtonY + kDisplayHeight + 17); connectDisplay = new CParamDisplay (size, gBackground); displayOffset (kConnectButtonX, kConnectButtonY + 17); connectDisplay->setBackOffset(displayOffset); connectDisplay->setHoriAlign(kCenterText); connectDisplay->setFont(kNormalFontSmall); connectDisplay->setFontColor(kWhiteCColor); connectDisplay->setValue(effect->getParameter(kConnect)); connectDisplay->setStringConvert( connectDisplayConvert, &(((Skidder*)effect)->foodEater->foodError) ); frame->addView(connectDisplay); } #endif #endif for (long i=0; i < NUM_PARAMETERS; i++) faders[i] = NULL; faders[kRateRandFactor] = rateRandFactorFader; faders[kTempo] = tempoFader; faders[kSlope] = slopeFader; faders[kPan] = panFader; faders[kNoise] = noiseFader; isOpen = true; return true; }