Example #1
0
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;
	
	
}
Example #2
0
//-----------------------------------------------------------------------------
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;
}