diff --git a/Source/Processors/DataThreads/FPGAThread.cpp b/Source/Processors/DataThreads/FPGAThread.cpp
index 9a6b77667fd0f2c9d2030e3c082d4b0f2af927d5..f7f45df00d87e3a5bc3d2c17f7fe47d84c4faa78 100644
--- a/Source/Processors/DataThreads/FPGAThread.cpp
+++ b/Source/Processors/DataThreads/FPGAThread.cpp
@@ -74,8 +74,7 @@ FPGAThread::~FPGAThread() {
 
 	// probably not the best way to do this:
 	deleteAndZero(dataBuffer);
-	delete dev;
-	dev = 0;
+	deleteAndZero(dev);
 
 }
 
diff --git a/Source/Processors/Editors/ChannelSelector.cpp b/Source/Processors/Editors/ChannelSelector.cpp
index 4f25d486e49df4eb79f1b6f6280eee987ed6ac3b..98dc40623cafd20e23ae190dad9347a2a6dfceec 100644
--- a/Source/Processors/Editors/ChannelSelector.cpp
+++ b/Source/Processors/Editors/ChannelSelector.cpp
@@ -100,6 +100,7 @@ void ChannelSelector::paint(Graphics& g)
 	g.fillRect(0, 15, getWidth(), getHeight()-30);
 }
 
+
 void ChannelSelector::setNumChannels(int numChans)
 {
 
diff --git a/Source/Processors/Editors/EventNodeEditor.cpp b/Source/Processors/Editors/EventNodeEditor.cpp
index 26baa7c8215999c91bde3b6ddb076a8c3edcfb65..fe9f9cab0d664b9b8c6cc61bbe28ca654320899f 100644
--- a/Source/Processors/Editors/EventNodeEditor.cpp
+++ b/Source/Processors/Editors/EventNodeEditor.cpp
@@ -29,13 +29,9 @@ EventNodeEditor::EventNodeEditor (GenericProcessor* parentNode)
 	: GenericEditor(parentNode)
 
 {
-	desiredWidth = 250;
+	desiredWidth = 200;
 
-	StringArray hzValues;
-	hzValues.add("0.25");
-	hzValues.add("0.5");
-	hzValues.add("1");
-	hzValues.add("2");
+	
 
 	//createRadioButtons(35, 65, 160, hzValues, "Event frequency");
 
diff --git a/Source/Processors/Editors/FilterEditor.cpp b/Source/Processors/Editors/FilterEditor.cpp
index a6c64763ccce0a9cec0af690b96a9a51f95fe382..c54b9b0c901b36abbc650a47049f049b570b045c 100644
--- a/Source/Processors/Editors/FilterEditor.cpp
+++ b/Source/Processors/Editors/FilterEditor.cpp
@@ -32,17 +32,7 @@ FilterEditor::FilterEditor (GenericProcessor* parentNode)
 {
 	desiredWidth = 250;
 
-	StringArray lowCutValues;
-	lowCutValues.add("1");
-	lowCutValues.add("10");
-	lowCutValues.add("100");
-	lowCutValues.add("500");
-
-	StringArray highCutValues;
-	highCutValues.add("1K");
-	highCutValues.add("3K");
-	highCutValues.add("6K");
-	highCutValues.add("9K");
+
 
 	//createRadioButtons(35, 50, 160, lowCutValues, "Low Cutoff");
 	//createRadioButtons(35, 90, 160, highCutValues, "High Cutoff");
diff --git a/Source/Processors/Editors/GenericEditor.cpp b/Source/Processors/Editors/GenericEditor.cpp
index fac0c8590cfe227a1a43a233b2c3645429fa1561..4634d80c589bd6c18ef4e522c14b935f0a0805d7 100644
--- a/Source/Processors/Editors/GenericEditor.cpp
+++ b/Source/Processors/Editors/GenericEditor.cpp
@@ -92,8 +92,9 @@ void GenericEditor::addParameterEditors()
 
 	for (int i = 0; i < getProcessor()->getNumParameters(); i++)
 	{
-		ParameterEditor* p = new ParameterEditor(getProcessor()->getParameterReference(i), titleFont);												
+		ParameterEditor* p = new ParameterEditor(getProcessor(), getProcessor()->getParameterReference(i), titleFont);												
 		
+		p->setChannelSelector(channelSelector);
 		int dWidth = p->desiredWidth;
 		int dHeight = p->desiredHeight;
 
@@ -285,8 +286,6 @@ void GenericEditor::buttonClicked(Button* button)
 {
 
 	std::cout << "Button clicked." << std::endl;
-
-	checkParameterButtons(button);
 	
 	checkDrawerButton(button);
 
@@ -294,20 +293,6 @@ void GenericEditor::buttonClicked(Button* button)
 						 // button event
 }
 
-void GenericEditor::sliderValueChanged(Slider* slider)
-{
-	std::cout << "Slider name: " << slider->getName() << std::endl;
-	std::cout << "Slider value: " << slider->getValue() << std::endl;
-
-	sliderEvent(slider);
-
-}
-
-bool GenericEditor::checkParameterButtons(Button* button)
-{
-	std::cout << "Button name: " << button->getName() << std::endl;
-	std::cout << "Button value: " << button->getButtonText() << std::endl;
-}
 
 bool GenericEditor::checkDrawerButton(Button* button)
 {
@@ -338,6 +323,12 @@ bool GenericEditor::checkDrawerButton(Button* button)
 
 }
 
+void GenericEditor::sliderValueChanged(Slider* slider)
+{
+
+	sliderEvent(slider);
+}
+
 
 void GenericEditor::update()
 {
diff --git a/Source/Processors/Editors/GenericEditor.h b/Source/Processors/Editors/GenericEditor.h
index a1f66899303038dd90a60b6c647ca83668598f18..d7b187ab8a8aeecfab736c45b988e703ff945e5e 100644
--- a/Source/Processors/Editors/GenericEditor.h
+++ b/Source/Processors/Editors/GenericEditor.h
@@ -99,7 +99,7 @@ public:
 	virtual void sliderEvent(Slider* slider) {}
 
 	bool checkDrawerButton(Button* button);
-	bool checkParameterButtons(Button* button);
+//	bool checkParameterButtons(Button* button);
 
 	bool getRecordStatus(int chan);
 
diff --git a/Source/Processors/Editors/LfpDisplayEditor.cpp b/Source/Processors/Editors/LfpDisplayEditor.cpp
index 7ef2a4a0557c46014dc5a9621f09f115d971128a..0fe61a9b8524d8a25b5ed745027c1aaae0d85bde 100644
--- a/Source/Processors/Editors/LfpDisplayEditor.cpp
+++ b/Source/Processors/Editors/LfpDisplayEditor.cpp
@@ -31,24 +31,7 @@ LfpDisplayEditor::LfpDisplayEditor (GenericProcessor* parentNode)
 
 	tabText = "LFP";
 
-	desiredWidth = 250;
-
-	StringArray timeBaseValues;
-	timeBaseValues.add("1");
-	timeBaseValues.add("2");
-	timeBaseValues.add("5");
-	timeBaseValues.add("10");
-
-	//createRadioButtons(35, 50, 160, timeBaseValues, "Display width (s)");
-
-	StringArray displayGainValues;
-	displayGainValues.add("1");
-	displayGainValues.add("2");
-	displayGainValues.add("4");
-	displayGainValues.add("8");
-
-	//createRadioButtons(35, 90, 160, displayGainValues, "Display Gain");
-
+	desiredWidth = 180;
 
 }
 
diff --git a/Source/Processors/Editors/ParameterEditor.cpp b/Source/Processors/Editors/ParameterEditor.cpp
index db6a162e1aaf869a840da091c8f89388144fa268..79908223af2d428f50b496f4f8cd7885489b236b 100644
--- a/Source/Processors/Editors/ParameterEditor.cpp
+++ b/Source/Processors/Editors/ParameterEditor.cpp
@@ -23,9 +23,11 @@
 
 #include "ParameterEditor.h"
 
-ParameterEditor::ParameterEditor(Parameter& p, Font labelFont)
+ParameterEditor::ParameterEditor(GenericProcessor* proc, Parameter& p, Font labelFont)
 {
 
+	processor = proc;
+
 	if (p.isBoolean())
 	{
 		std::cout << "Boolean parameter. Creating checkbox." << std::endl;
@@ -34,8 +36,10 @@ ParameterEditor::ParameterEditor(Parameter& p, Font labelFont)
 		ParameterCheckbox* pc = new ParameterCheckbox((bool) p.getDefaultValue());
 		addAndMakeVisible(pc);
 		pc->setBounds(0,0,12, 12);
-		pc->setName(p.getName());
+		pc->setName(String(p.getID()));
 		buttonArray.add(pc);
+		//buttonIdArray.add(p.getID());
+		pc->addListener(this);
 
 		Label* label = new Label(p.getName(), p.getName());
 		labelFont.setHeight(10);
@@ -58,9 +62,11 @@ ParameterEditor::ParameterEditor(Parameter& p, Font labelFont)
 												  labelFont);
 
 		ps->setBounds(0,0, 40, 40);
-		ps->setName(p.getName());
+		ps->setName(String(p.getID()));
 		addAndMakeVisible(ps);
 		sliderArray.add(ps);
+		//sliderIdArray.add(p.getID());
+		ps->addListener(this);
 
 		Label* label = new Label(p.getName(), p.getName());
 		labelFont.setHeight(10);
@@ -92,7 +98,9 @@ ParameterEditor::ParameterEditor(Parameter& p, Font labelFont)
 
 		std::cout << "Default value: " << (int) p.getDefaultValue() << std::endl;
 
-		for (int i = 0; i < possibleValues.size(); i++)
+		int i;
+
+		for (i = 0; i < possibleValues.size(); i++)
 		{
 			std::cout << "Creating button " << i << std::endl;
 			int buttonType = MIDDLE;
@@ -103,8 +111,10 @@ ParameterEditor::ParameterEditor(Parameter& p, Font labelFont)
 
 			ParameterButton* pb = new ParameterButton(possibleValues[i], buttonType, labelFont);
 			pb->setBounds(buttonWidth*i, 12, buttonWidth, 18);
-			pb->setName(p.getName());
+			pb->setName(String(p.getID()));
 			buttonArray.add(pb);
+			//buttonIdArray.add(p.getID());
+			pb->addListener(this);
 
 			if (i == (int) p.getDefaultValue())
 				pb->setToggleState(true, false);
@@ -113,7 +123,7 @@ ParameterEditor::ParameterEditor(Parameter& p, Font labelFont)
 
 		}
 
-		desiredWidth = 120;
+		desiredWidth = buttonWidth*i;
 		desiredHeight = 30;
 	}
 }
@@ -125,25 +135,69 @@ ParameterEditor::~ParameterEditor()
 
 void ParameterEditor::parentHierarchyChanged()
 {
-	std::cout << "Parent hierarchy changed." << std::endl;
+	// std::cout << "Parent hierarchy changed." << std::endl;
 
-	// register all children with parent --> not currently working
-	if (getParentComponent() != 0) {
+	// // register all children with parent --> not currently working
+	// if (getParentComponent() != 0) {
 
-		for (int i = 0; i < sliderArray.size(); i++)
+	// 	for (int i = 0; i < sliderArray.size(); i++)
+	// 	{
+	// 		sliderArray[i]->addListener((Slider::Listener*) getParentComponent());
+	// 	}
+
+	// 	for (int i = 0; i < buttonArray.size(); i++)
+	// 	{
+	// 		buttonArray[i]->addListener((Button::Listener*) getParentComponent());
+	// 	}
+	// }
+
+}
+
+void ParameterEditor::buttonClicked(Button* button)
+{
+	//std::cout << "Button name: " << button->getName() << std::endl;
+	//std::cout << "Button value: " << button->getButtonText() << std::endl;
+	
+	Array<int> a = channelSelector->getActiveChannels();
+	{
+		for (int i = 0; i < a.size(); i++)
 		{
-			sliderArray[i]->addListener((Slider::Listener*) getParentComponent());
+			//std::cout << a[i] << " ";
+			processor->setCurrentChannel(a[i]);
+			processor->setParameter(button->getName().getIntValue(),
+									button->getButtonText().getFloatValue());
+			//processor->
 		}
+		//std::cout << std::endl;
+	}
 
-		for (int i = 0; i < buttonArray.size(); i++)
+	//processor->sliderValueChanged(slider);
+
+}
+
+void ParameterEditor::sliderValueChanged(Slider* slider)
+{
+
+
+	//std::cout << "Slider name: " << slider->getName() << std::endl;
+	//std::cout << "Slider value: " << slider->getValue() << std::endl;
+	
+	Array<int> a = channelSelector->getActiveChannels();
+	{
+		for (int i = 0; i < a.size(); i++)
 		{
-			buttonArray[i]->addListener((Button::Listener*) getParentComponent());
+			//std::cout << a[i] << " ";
+			processor->setCurrentChannel(a[i]);
+			processor->setParameter(slider->getName().getIntValue(),
+									slider->getValue());
+			//processor->
 		}
+		//std::cout << std::endl;
 	}
-
 }
 
 
+
 /// ============= PARAMETER BUTTON ==================
 
 ParameterButton::ParameterButton(var value, int buttonType, Font labelFont) :
diff --git a/Source/Processors/Editors/ParameterEditor.h b/Source/Processors/Editors/ParameterEditor.h
index c3d592acd668397b619a3ea2e39216ad09ee83d5..b33628a15c40f2dce2383eed2c31d959b4c9b815 100644
--- a/Source/Processors/Editors/ParameterEditor.h
+++ b/Source/Processors/Editors/ParameterEditor.h
@@ -25,7 +25,8 @@
 #define __PARAMETEREDITOR_H_44537DA9__
 
 #include "../../../JuceLibraryCode/JuceHeader.h"
-#include "GenericEditor.h"
+#include "../GenericProcessor.h"
+#include "ChannelSelector.h"
 #include "../Parameter.h"
 #include <stdio.h>
 
@@ -34,15 +35,17 @@
   Automatically creates an interactive editor for a particular
   parameter.
 
-  @see GenericEditor, Parameter
+  @see GenericEditor, GenericProcessor, Parameter
 
 */
 
-class ParameterEditor : public Component
+class ParameterEditor : public Component,
+						public Button::Listener,
+						public Slider::Listener
 
 {
 public:
-	ParameterEditor(Parameter& p, Font labelFont);
+	ParameterEditor(GenericProcessor* proc, Parameter& p, Font labelFont);
 	~ParameterEditor();
 
 
@@ -51,10 +54,23 @@ public:
 
     void parentHierarchyChanged();
 
+    void buttonClicked(Button* button);
+    void sliderValueChanged(Slider* slider);
+
+    void setChannelSelector(ChannelSelector* ch)
+    {
+    	channelSelector = ch;
+    }
+
 private:
 
 	Array<Slider*> sliderArray;
 	Array<Button*> buttonArray;
+	Array<int> buttonIdArray;
+	Array<int> sliderIdArray;
+
+	GenericProcessor* processor;
+	ChannelSelector* channelSelector;
 
 	enum {
 		LEFT,
diff --git a/Source/Processors/Editors/VisualizerEditor.cpp b/Source/Processors/Editors/VisualizerEditor.cpp
index db474bbb2ec6a06e9c78c50a58d9aeb06bbd95a1..ead969534ca50ee48da345009f2cb61a65292f97 100644
--- a/Source/Processors/Editors/VisualizerEditor.cpp
+++ b/Source/Processors/Editors/VisualizerEditor.cpp
@@ -84,7 +84,7 @@ VisualizerEditor::VisualizerEditor (GenericProcessor* parentNode)
 
 {
 
-	desiredWidth = 250;
+	desiredWidth = 180;
 	initializeSelectors();
 
 
diff --git a/Source/Processors/EventNode.cpp b/Source/Processors/EventNode.cpp
index b36be29e73a6aa93391520d8b17e46d6faee1e11..e3c18aa68aefc8b983f5b587d5cc5f473aa39ab8 100644
--- a/Source/Processors/EventNode.cpp
+++ b/Source/Processors/EventNode.cpp
@@ -28,6 +28,14 @@ EventNode::EventNode()
 	: GenericProcessor("Event Generator"), Hz(1), accumulator(0)
 {
 
+	Array<var> hzValues;
+	hzValues.add(0.25f);
+	hzValues.add(0.5f);
+	hzValues.add(1.0f);
+	hzValues.add(2.0f);
+
+	parameters.add(Parameter("Frequency",hzValues, 0, 0));
+
 }
 
 EventNode::~EventNode()
@@ -49,11 +57,11 @@ void EventNode::updateSettings()
 }
 
 
-void EventNode::setParameter (int parameterIndex, float newValue)
-{
-	std::cout << "Setting frequency to " << newValue << " Hz." << std::endl;
-	Hz = newValue;
-}
+// void EventNode::setParameter (int parameterIndex, float newValue)
+// {
+// 	std::cout << "Setting frequency to " << newValue << " Hz." << std::endl;
+// 	Hz = newValue;
+// }
 
 
 void EventNode::process(AudioSampleBuffer &buffer, 
diff --git a/Source/Processors/EventNode.h b/Source/Processors/EventNode.h
index f0664849d04018c8476024f7601ebce6e47d3cc0..7885449165d1bf812942be9562472bc9ca931b2b 100644
--- a/Source/Processors/EventNode.h
+++ b/Source/Processors/EventNode.h
@@ -45,7 +45,7 @@ public:
 	~EventNode();
 	
 	void process(AudioSampleBuffer &buffer, MidiBuffer &midiMessages, int& nSamples);
-	void setParameter (int parameterIndex, float newValue);
+	//void setParameter (int parameterIndex, float newValue);
 
 	bool isSource() {return true;}
 
diff --git a/Source/Processors/FilterNode.cpp b/Source/Processors/FilterNode.cpp
index e381b58ea7f1e7b83da1d04ae20c465afab3d556..29ac76598ab977d7f50794a2bc079157bba4b3b8 100644
--- a/Source/Processors/FilterNode.cpp
+++ b/Source/Processors/FilterNode.cpp
@@ -30,6 +30,22 @@ FilterNode::FilterNode()
 
 {
 
+	Array<var> lowCutValues;
+	lowCutValues.add(1.0f);
+	lowCutValues.add(10.0f);
+	lowCutValues.add(100.0f);
+	lowCutValues.add(500.0f);
+
+	parameters.add(Parameter("low cut",lowCutValues, 0, 0));
+
+	Array<var> highCutValues;
+	highCutValues.add(1000.0f);
+	highCutValues.add(3000.0f);
+	highCutValues.add(6000.0f);
+	highCutValues.add(9000.0f);
+
+	parameters.add(Parameter("high cut",highCutValues, 0, 1));
+
 }
 
 FilterNode::~FilterNode()
@@ -85,8 +101,8 @@ void FilterNode::updateSettings()
 {		
 
 	filters.clear();
-	lowCuts.clear();
-	highCuts.clear();
+//	lowCuts.clear();
+	//highCuts.clear();
 
 	if (getNumInputs() < 100) {
 
@@ -101,8 +117,11 @@ void FilterNode::updateSettings()
 				Dsp::DirectFormII>						// realization
 				(1024));	 
 
-			lowCuts.add(1.0f);
-			highCuts.add(1000.0f);
+			Parameter& p1 =  parameters.getReference(0);
+			p1.setValue(1.0f, n);
+
+			Parameter& p2 =  parameters.getReference(1);
+			p2.setValue(1000.0f, n);
 			
 			setFilterParameters(1.0f, 1000.0f, n);
 		}
@@ -128,14 +147,42 @@ void FilterNode::setFilterParameters(double lowCut, double highCut, int chan)
 void FilterNode::setParameter (int parameterIndex, float newValue)
 {
 
-	if (parameterIndex == 0) {
-		lowCuts.set(currentChannel, newValue);
-		setFilterParameters(newValue, highCuts[currentChannel], currentChannel);
+	std::cout << "Setting channel " << currentChannel;// << std::endl;
+
+	if (parameterIndex == 0)
+	{
+		std::cout << " low cut to ";
 	} else {
-		highCuts.set(currentChannel, newValue);
-		setFilterParameters(lowCuts[currentChannel], newValue, currentChannel);
+		std::cout << " high cut to ";
 	}
 
+	std::cout << newValue << std::endl;
+
+	//if (parameterIndex)
+//
+	Parameter& p =  parameters.getReference(parameterIndex);
+
+	p.setValue(newValue, currentChannel);
+
+
+	Parameter& p1 =  parameters.getReference(0);
+	Parameter& p2 =  parameters.getReference(1);
+
+	std::cout << float(p1[currentChannel]) << " ";
+	std::cout << float(p2[currentChannel]) << std::endl;
+
+	setFilterParameters(float(p1[currentChannel]),
+						float(p2[currentChannel]),
+						currentChannel);
+
+	// if (parameterIndex == 0) {
+	// 	parameters[0].setValue(newValue, currentChannel);
+	// 	setFilterParameters(newValue, parameters[0][currentChannel], currentChannel);
+	// } else {
+	// 	parameters[1].setValue(newValue, currentChannel);
+	// 	setFilterParameters(lowCuts[currentChannel], newValue, currentChannel);
+	// }
+
 }
 
 void FilterNode::process(AudioSampleBuffer &buffer, 
diff --git a/Source/Processors/GenericProcessor.cpp b/Source/Processors/GenericProcessor.cpp
index 8df1cb70c6515ca4575b3f7ad1702fe87e692480..a24af8954e2b0d49cb1f57853b45cf01661d5268 100644
--- a/Source/Processors/GenericProcessor.cpp
+++ b/Source/Processors/GenericProcessor.cpp
@@ -30,7 +30,7 @@ GenericProcessor::GenericProcessor(const String& name_) :
 	isEnabled(true), 
 	saveOrder(-1), loadOrder(-1),
 	nextAvailableChannel(0), currentChannel(-1),
-	wasConnected(false), nullParam("VOID", false)
+	wasConnected(false), nullParam("VOID", false, -1)
 {
 }
 
diff --git a/Source/Processors/LfpDisplayNode.cpp b/Source/Processors/LfpDisplayNode.cpp
index c444d776a51e218e684a9581cf80c1bcde91c82d..6745430623d6ff5bf55fb19d24aaa67a36d0c593 100644
--- a/Source/Processors/LfpDisplayNode.cpp
+++ b/Source/Processors/LfpDisplayNode.cpp
@@ -22,6 +22,7 @@
 */
 
 #include "LfpDisplayNode.h"
+#include "Visualization/LfpDisplayCanvas.h"
 #include <stdio.h>
 
 LfpDisplayNode::LfpDisplayNode()
@@ -32,6 +33,23 @@ LfpDisplayNode::LfpDisplayNode()
 {
 	displayBuffer = new AudioSampleBuffer(8, 100);
 	eventBuffer = new MidiBuffer();
+
+	Array<var> timeBaseValues;
+	timeBaseValues.add(1);
+	timeBaseValues.add(2);
+	timeBaseValues.add(5);
+	timeBaseValues.add(10);
+
+	parameters.add(Parameter("timebase",timeBaseValues, 0, 0));//true);//a,0);
+
+	Array<var> displayGainValues;
+	displayGainValues.add(1);
+	displayGainValues.add(2);
+	displayGainValues.add(4);
+	displayGainValues.add(8);
+
+	parameters.add(Parameter("display gain",displayGainValues, 0, 1));//true);//a,0);
+
 }
 
 LfpDisplayNode::~LfpDisplayNode()
@@ -94,7 +112,8 @@ bool LfpDisplayNode::disable()
 
 void LfpDisplayNode::setParameter (int parameterIndex, float newValue)
 {
-
+	LfpDisplayEditor* ed = (LfpDisplayEditor*) getEditor();
+	ed->canvas->setParameter(parameterIndex, newValue);
 }
 
 void LfpDisplayNode::process(AudioSampleBuffer &buffer, MidiBuffer &midiMessages, int& nSamples)
diff --git a/Source/Processors/Parameter.cpp b/Source/Processors/Parameter.cpp
index 3495061605c5b5372f417a16977b3bf309f15df4..c123ff84dd2b73cade5e426952397219f95d2ba4 100644
--- a/Source/Processors/Parameter.cpp
+++ b/Source/Processors/Parameter.cpp
@@ -24,8 +24,8 @@
 #include "Parameter.h"
 
 
-Parameter::Parameter(const String& name_, bool defaultVal) 
-		: name(name_), description("")
+Parameter::Parameter(const String& name_, bool defaultVal, int ID) 
+		: name(name_), description(""), parameterId(ID)
 {
 
 	defaultValue = defaultVal;
@@ -39,8 +39,8 @@ Parameter::Parameter(const String& name_, bool defaultVal)
 
 }
 
-Parameter::Parameter(const String& name_, float low, float high, float defaultVal)
-	 : name(name_), description("")
+Parameter::Parameter(const String& name_, float low, float high, float defaultVal, int ID)
+	 : name(name_), description(""), parameterId(ID)
 {
 	defaultValue = defaultVal;
 
@@ -53,8 +53,8 @@ Parameter::Parameter(const String& name_, float low, float high, float defaultVa
 
 }
 
-Parameter::Parameter(const String& name_, Array<var> a, int defaultVal)
-	 : name(name_), description("")
+Parameter::Parameter(const String& name_, Array<var> a, int defaultVal, int ID)
+	 : name(name_), description(""), parameterId(ID)
 {
 	possibleValues = a;
 	defaultValue = defaultVal; //possibleValues[defaultVal];
@@ -87,12 +87,12 @@ void Parameter::setValue(float val, int chan)
 		}
 
 	} else {
-		int index = (int) val;
+		//int index = (int) val;
 
-		if (index >= 0 && index < possibleValues.size())
-		{
-			values.set(chan, possibleValues[index]);
-		}
+		//if (index >= 0 && index < possibleValues.size())
+		//{
+			values.set(chan, val);
+		//}
 
 	}
 
diff --git a/Source/Processors/Parameter.h b/Source/Processors/Parameter.h
index 89f78dc2cf429a544e78731c3d3a713b2a757748..20d357f872a947bc6f49836bcbe8663221d62cd8 100644
--- a/Source/Processors/Parameter.h
+++ b/Source/Processors/Parameter.h
@@ -43,9 +43,9 @@ class Parameter
 {
 public:
 
-	Parameter(const String& name_, bool defaultVal);
-	Parameter(const String& name_, float low, float high, float defaultVal);
-	Parameter(const String& name_, Array<var> a, int defaultVal);
+	Parameter(const String& name_, bool defaultVal, int ID);
+	Parameter(const String& name_, float low, float high, float defaultVal, int ID);
+	Parameter(const String& name_, Array<var> a, int defaultVal, int ID);
 
 	~Parameter() {}
 
@@ -55,6 +55,8 @@ public:
 
 	var getDefaultValue() {return defaultValue;}
 
+	int getID() {return parameterId;}
+
 	Array<var> getPossibleValues() {return possibleValues;}
 	void setValue(float val, int chan);
 
@@ -71,6 +73,8 @@ private:
 	const String name;
 	String description;
 
+	int parameterId;
+
 	bool isBool, isCont, isDisc;
 
 	var defaultValue;
diff --git a/Source/Processors/SignalGenerator.cpp b/Source/Processors/SignalGenerator.cpp
index 43e59ced0f313dad30e3644fc736ccadc4b266dc..4db3bc7d64faa066bc9d74e4a83bbba049f8a1c4 100644
--- a/Source/Processors/SignalGenerator.cpp
+++ b/Source/Processors/SignalGenerator.cpp
@@ -42,10 +42,9 @@ SignalGenerator::SignalGenerator()
 	a.add(2);
 	a.add(3);
 
+	parameters.add(Parameter("Param 1",a, 0, 0));//true);//a,0);
 
-	parameters.add(Parameter("Param 1",a, 0));//true);//a,0);
-
-	parameters.add(Parameter("PARAM",0.0f, 100.0f, 50.0f));
+	parameters.add(Parameter("PARAM",0.0f, 100.0f, 50.0f, 1));
 
 	//parameters.add(Parameter("Param 1",a, 0));//true);//a,0);