changeset 9:53f99cbc5dbd

Heavily updated GUI. Added Heller et. al. decoding. Changed gain knobs.
author martinm_home <martin.morrell@eecs.qmul.ac.uk>
date Thu, 20 Sep 2012 16:41:01 +0100
parents d967dd1eafe8
children b5d48e9b9aea
files Classic Ambisonics Decoder VST.xcodeproj/project.pbxproj Classic Ambisonics Decoder VST.xcodeproj/project.xcworkspace/xcuserdata/momont.xcuserdatad/UserInterfaceState.xcuserstate Resources/.DS_Store Resources/360_knob.knob Resources/360_knob.png Resources/blue_knob.knob Resources/blue_knob.png Resources/blue_red_knob.knob Resources/blue_red_knob.png Resources/controls.png Resources/controls.xcf Resources/controls2.png Resources/controls2.xcf Resources/mode2b_knob.knob Resources/mode2b_knob.png Resources/my_name.png Resources/my_name.xcf Resources/plot.png Resources/plot.xcf Resources/red_blue_knob.knob Resources/red_blue_knob.png Resources/red_knob.knob Resources/red_knob.png Resources/rotations.png Resources/rotations.xcf Resources/stereo.png Resources/stereo.xcf Resources/transforms.png Resources/transforms.xcf Resources/zoom.png Resources/zoom.xcf Source/Decoder.cpp Source/Decoder.h Source/GUI.cpp Source/GUI.h Source/MyPlot.cpp Source/MyPlot.h Source/SoundField.cpp Source/SoundField.h
diffstat 39 files changed, 2554 insertions(+), 740 deletions(-) [+]
line wrap: on
line diff
--- a/Classic Ambisonics Decoder VST.xcodeproj/project.pbxproj	Sun Sep 16 23:25:54 2012 +0100
+++ b/Classic Ambisonics Decoder VST.xcodeproj/project.pbxproj	Thu Sep 20 16:41:01 2012 +0100
@@ -21,13 +21,17 @@
 		0C54F71C15F8BB7500953CE0 /* my_name.png in Resources */ = {isa = PBXBuildFile; fileRef = 0C54F71315F8BB7500953CE0 /* my_name.png */; };
 		0C54F71D15F8BB7500953CE0 /* red_blue_knob.png in Resources */ = {isa = PBXBuildFile; fileRef = 0C54F71415F8BB7500953CE0 /* red_blue_knob.png */; };
 		0C54F71E15F8BB7500953CE0 /* red_knob.png in Resources */ = {isa = PBXBuildFile; fileRef = 0C54F71515F8BB7500953CE0 /* red_knob.png */; };
-		0C54F71F15F8BB7500953CE0 /* stereo.png in Resources */ = {isa = PBXBuildFile; fileRef = 0C54F71615F8BB7500953CE0 /* stereo.png */; };
 		0C54F72015F8BB7500953CE0 /* zoom.png in Resources */ = {isa = PBXBuildFile; fileRef = 0C54F71715F8BB7500953CE0 /* zoom.png */; };
-		0C54F72215F8BBA500953CE0 /* rotations.png in Resources */ = {isa = PBXBuildFile; fileRef = 0C54F72115F8BBA500953CE0 /* rotations.png */; };
 		0C7C241B159860DE0050E903 /* audioeffect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0C7C2416159860DE0050E903 /* audioeffect.cpp */; };
 		0C7C241C159860DE0050E903 /* audioeffectx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0C7C2418159860DE0050E903 /* audioeffectx.cpp */; };
 		0C7C241D159860DE0050E903 /* vstplugmain.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0C7C241A159860DE0050E903 /* vstplugmain.cpp */; };
+		0C99BF41160A392400FA8FBA /* blue_red_knob.png in Resources */ = {isa = PBXBuildFile; fileRef = 0C99BF40160A392400FA8FBA /* blue_red_knob.png */; };
 		0CC1308516045FA400DFB900 /* MyPlot.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0C54F70415F8BB4C00953CE0 /* MyPlot.cpp */; };
+		0CD671331609B4D500AEBC6F /* controls.png in Resources */ = {isa = PBXBuildFile; fileRef = 0CD6712E1609B4D500AEBC6F /* controls.png */; };
+		0CD671341609B4D500AEBC6F /* controls2.png in Resources */ = {isa = PBXBuildFile; fileRef = 0CD6712F1609B4D500AEBC6F /* controls2.png */; };
+		0CD671351609B4D500AEBC6F /* mode2b_knob.png in Resources */ = {isa = PBXBuildFile; fileRef = 0CD671301609B4D500AEBC6F /* mode2b_knob.png */; };
+		0CD671361609B4D500AEBC6F /* plot.png in Resources */ = {isa = PBXBuildFile; fileRef = 0CD671311609B4D500AEBC6F /* plot.png */; };
+		0CD671371609B4D500AEBC6F /* transforms.png in Resources */ = {isa = PBXBuildFile; fileRef = 0CD671321609B4D500AEBC6F /* transforms.png */; };
 		8D01CCCE0486CAD60068D4B7 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08EA7FFBFE8413EDC02AAC07 /* Carbon.framework */; };
 		F43771F012439E4600248B30 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F47F241F11D4C30900C94CAF /* Cocoa.framework */; };
 		F43771F312439E9100248B30 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F47F241C11D4C2F600C94CAF /* Accelerate.framework */; };
@@ -57,9 +61,7 @@
 		0C54F71315F8BB7500953CE0 /* my_name.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = my_name.png; path = Resources/my_name.png; sourceTree = "<group>"; };
 		0C54F71415F8BB7500953CE0 /* red_blue_knob.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = red_blue_knob.png; path = Resources/red_blue_knob.png; sourceTree = "<group>"; };
 		0C54F71515F8BB7500953CE0 /* red_knob.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = red_knob.png; path = Resources/red_knob.png; sourceTree = "<group>"; };
-		0C54F71615F8BB7500953CE0 /* stereo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = stereo.png; path = Resources/stereo.png; sourceTree = "<group>"; };
 		0C54F71715F8BB7500953CE0 /* zoom.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = zoom.png; path = Resources/zoom.png; sourceTree = "<group>"; };
-		0C54F72115F8BBA500953CE0 /* rotations.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = rotations.png; path = Resources/rotations.png; sourceTree = "<group>"; };
 		0C54F72315F9144500953CE0 /* Version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Version.h; path = Source/Version.h; sourceTree = "<group>"; };
 		0C7C2412159860DE0050E903 /* aeffect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = aeffect.h; path = ../../../../../Users/momont/libraries/vstsdk2.4/pluginterfaces/vst2.x/aeffect.h; sourceTree = "<group>"; };
 		0C7C2413159860DE0050E903 /* aeffectx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = aeffectx.h; path = ../../../../../Users/momont/libraries/vstsdk2.4/pluginterfaces/vst2.x/aeffectx.h; sourceTree = "<group>"; };
@@ -70,6 +72,12 @@
 		0C7C2418159860DE0050E903 /* audioeffectx.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = audioeffectx.cpp; path = ../../../../../Users/momont/libraries/vstsdk2.4/public.sdk/source/vst2.x/audioeffectx.cpp; sourceTree = "<group>"; };
 		0C7C2419159860DE0050E903 /* audioeffectx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = audioeffectx.h; path = ../../../../../Users/momont/libraries/vstsdk2.4/public.sdk/source/vst2.x/audioeffectx.h; sourceTree = "<group>"; };
 		0C7C241A159860DE0050E903 /* vstplugmain.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = vstplugmain.cpp; path = ../../../../../Users/momont/libraries/vstsdk2.4/public.sdk/source/vst2.x/vstplugmain.cpp; sourceTree = "<group>"; };
+		0C99BF40160A392400FA8FBA /* blue_red_knob.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = blue_red_knob.png; path = Resources/blue_red_knob.png; sourceTree = "<group>"; };
+		0CD6712E1609B4D500AEBC6F /* controls.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = controls.png; path = Resources/controls.png; sourceTree = "<group>"; };
+		0CD6712F1609B4D500AEBC6F /* controls2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = controls2.png; path = Resources/controls2.png; sourceTree = "<group>"; };
+		0CD671301609B4D500AEBC6F /* mode2b_knob.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = mode2b_knob.png; path = Resources/mode2b_knob.png; sourceTree = "<group>"; };
+		0CD671311609B4D500AEBC6F /* plot.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = plot.png; path = Resources/plot.png; sourceTree = "<group>"; };
+		0CD671321609B4D500AEBC6F /* transforms.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = transforms.png; path = Resources/transforms.png; sourceTree = "<group>"; };
 		8D01CCD10486CAD60068D4B7 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
 		8D01CCD20486CAD60068D4B7 /* ClassicAmbisonicsDecoder.vst */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ClassicAmbisonicsDecoder.vst; sourceTree = BUILT_PRODUCTS_DIR; };
 		F47F241C11D4C2F600C94CAF /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = /System/Library/Frameworks/Accelerate.framework; sourceTree = "<absolute>"; };
@@ -114,8 +122,13 @@
 		089C167CFE841241C02AAC07 /* Resources */ = {
 			isa = PBXGroup;
 			children = (
+				0C99BF40160A392400FA8FBA /* blue_red_knob.png */,
+				0CD6712E1609B4D500AEBC6F /* controls.png */,
+				0CD6712F1609B4D500AEBC6F /* controls2.png */,
+				0CD671301609B4D500AEBC6F /* mode2b_knob.png */,
+				0CD671311609B4D500AEBC6F /* plot.png */,
+				0CD671321609B4D500AEBC6F /* transforms.png */,
 				0C22E51B16067A170061F1EB /* mode5_knob.png */,
-				0C54F72115F8BBA500953CE0 /* rotations.png */,
 				0C54F70F15F8BB7500953CE0 /* 360_knob.png */,
 				0C54F71015F8BB7500953CE0 /* blue_knob.png */,
 				0C54F71115F8BB7500953CE0 /* mode2_knob.png */,
@@ -123,7 +136,6 @@
 				0C54F71315F8BB7500953CE0 /* my_name.png */,
 				0C54F71415F8BB7500953CE0 /* red_blue_knob.png */,
 				0C54F71515F8BB7500953CE0 /* red_knob.png */,
-				0C54F71615F8BB7500953CE0 /* stereo.png */,
 				0C54F71715F8BB7500953CE0 /* zoom.png */,
 				8D01CCD10486CAD60068D4B7 /* Info.plist */,
 			);
@@ -243,10 +255,14 @@
 				0C54F71C15F8BB7500953CE0 /* my_name.png in Resources */,
 				0C54F71D15F8BB7500953CE0 /* red_blue_knob.png in Resources */,
 				0C54F71E15F8BB7500953CE0 /* red_knob.png in Resources */,
-				0C54F71F15F8BB7500953CE0 /* stereo.png in Resources */,
 				0C54F72015F8BB7500953CE0 /* zoom.png in Resources */,
-				0C54F72215F8BBA500953CE0 /* rotations.png in Resources */,
 				0C22E51C16067A170061F1EB /* mode5_knob.png in Resources */,
+				0CD671331609B4D500AEBC6F /* controls.png in Resources */,
+				0CD671341609B4D500AEBC6F /* controls2.png in Resources */,
+				0CD671351609B4D500AEBC6F /* mode2b_knob.png in Resources */,
+				0CD671361609B4D500AEBC6F /* plot.png in Resources */,
+				0CD671371609B4D500AEBC6F /* transforms.png in Resources */,
+				0C99BF41160A392400FA8FBA /* blue_red_knob.png in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
Binary file Classic Ambisonics Decoder VST.xcodeproj/project.xcworkspace/xcuserdata/momont.xcuserdatad/UserInterfaceState.xcuserstate has changed
Binary file Resources/.DS_Store has changed
Binary file Resources/360_knob.knob has changed
Binary file Resources/360_knob.png has changed
Binary file Resources/blue_knob.knob has changed
Binary file Resources/blue_knob.png has changed
Binary file Resources/blue_red_knob.knob has changed
Binary file Resources/blue_red_knob.png has changed
Binary file Resources/controls.png has changed
Binary file Resources/controls.xcf has changed
Binary file Resources/controls2.png has changed
Binary file Resources/controls2.xcf has changed
Binary file Resources/mode2b_knob.knob has changed
Binary file Resources/mode2b_knob.png has changed
Binary file Resources/my_name.png has changed
Binary file Resources/my_name.xcf has changed
Binary file Resources/plot.png has changed
Binary file Resources/plot.xcf has changed
Binary file Resources/red_blue_knob.knob has changed
Binary file Resources/red_blue_knob.png has changed
Binary file Resources/red_knob.knob has changed
Binary file Resources/red_knob.png has changed
Binary file Resources/rotations.png has changed
Binary file Resources/rotations.xcf has changed
Binary file Resources/stereo.png has changed
Binary file Resources/stereo.xcf has changed
Binary file Resources/transforms.png has changed
Binary file Resources/transforms.xcf has changed
Binary file Resources/zoom.png has changed
Binary file Resources/zoom.xcf has changed
--- a/Source/Decoder.cpp	Sun Sep 16 23:25:54 2012 +0100
+++ b/Source/Decoder.cpp	Thu Sep 20 16:41:01 2012 +0100
@@ -33,6 +33,38 @@
 //Overall Functions
 int Decoder::processDecoder(double &w, double &x, double &y, double &z)
 {
+    //Sound field rotations. Only called if the value is not 0
+	if (Rotate!=0.0f)
+		rotateField(x, y);
+	
+	if (Tilt!=0.0f)
+		tiltField(y, z);
+	
+	if (Tumble!=0.0f)
+		tumbleField(x, z);
+	
+	//Zoom function. Only called if the value is not 0
+	if (Zoom!=0.0f) {
+		switch (ZoomMethod) {
+			case 0:
+				dominanceZoom(w, x, y, z);
+				break;
+			case 1:
+				pressZoom(w, x, y, z);
+				break;
+			case 2:
+				pushZoom(w, x, y, z);
+				break;
+			case 3:
+				focusZoom(w, x, y, z);
+				break;
+				
+			default:
+				break;
+		}
+	}
+    
+    
     switch (decoderMode) {
         case 1:
             monoDecoder(w, x, y, z);
@@ -153,82 +185,15 @@
 
 
 
-void Decoder::monoDecoder(double &w, double &x, double &y, double &z)
+void Decoder::monoDecoder(double &w, double &x, double &y, double &z)//NOT USED
 {
-	//Sound field rotations. Only called if the value is not 0 
-	if (Rotate!=0.0f)
-		rotateField(x, y);
-	
-	if (Tilt!=0.0f)
-		tiltField(y, z);
-	
-	if (Tumble!=0.0f)
-		tumbleField(x, z);
-	
-	
-	//Zoom function. Only called if the value is not 0 
-	if (Zoom!=0.0f) {
-		switch (ZoomMethod) {
-			case 0:
-				dominanceZoom(w, x, y, z);
-				break;
-			case 1:
-				pressZoom(w, x, y, z);
-				break;
-			case 2:
-				pushZoom(w, x, y, z);
-				break;
-			case 3:
-				focusZoom(w, x, y, z);
-				break;
-				
-			default:
-				break;
-		}
-	}
-	
-	
 	//Centre virtual mic
     centreMic(w, x);
-	
 };
 
 
 void Decoder::stereoDecoder(double &w, double &x, double &y, double &z)
 {
-	//Sound field rotations. Only called if the value is not 0 
-	if (Rotate!=0.0f)
-		rotateField(x, y);
-	
-	if (Tilt!=0.0f)
-		tiltField(y, z);
-	
-	if (Tumble!=0.0f)
-		tumbleField(x, z);
-	
-	
-	//Zoom function. Only called if the value is not 0 
-	if (Zoom!=0.0f) {
-		switch (ZoomMethod) {
-			case 0:
-				dominanceZoom(w, x, y, z);
-				break;
-			case 1:
-				pressZoom(w, x, y, z);
-				break;
-			case 2:
-				pushZoom(w, x, y, z);
-				break;
-			case 3:
-				focusZoom(w, x, y, z);
-				break;
-				
-			default:
-				break;
-		}
-	}
-	
-	
 	switch (Mode) {
 		case 0:
 			xyDecode(w, x, y, z);
@@ -253,38 +218,6 @@
 
 void Decoder::twoOneDecoder(double &w, double &x, double &y, double &z)
 {
-	//Sound field rotations. Only called if the value is not 0 
-	if (Rotate!=0.0f)
-		rotateField(x, y);
-	
-	if (Tilt!=0.0f)
-		tiltField(y, z);
-	
-	if (Tumble!=0.0f)
-		tumbleField(x, z);
-	
-	
-	//Zoom function. Only called if the value is not 0 
-	if (Zoom!=0.0f) {
-		switch (ZoomMethod) {
-			case 0:
-				dominanceZoom(w, x, y, z);
-				break;
-			case 1:
-				pressZoom(w, x, y, z);
-				break;
-			case 2:
-				pushZoom(w, x, y, z);
-				break;
-			case 3:
-				focusZoom(w, x, y, z);
-				break;
-				
-			default:
-				break;
-		}
-	}
-	
     //Subwoofer signal and filtering
     subSignal(w);
     filterLF();
@@ -322,39 +255,6 @@
 
 void Decoder::quadDecoder(double &w, double &x, double &y, double &z)
 {
-	//Sound field rotations. Only called if the value is not 0 
-	if (Rotate!=0.0f)
-		rotateField(x, y);
-	
-	if (Tilt!=0.0f)
-		tiltField(y, z);
-	
-	if (Tumble!=0.0f)
-		tumbleField(x, z);
-	
-	
-	//Zoom function. Only called if the value is not 0 
-	if (Zoom!=0.0f) {
-		switch (ZoomMethod) {
-			case 0:
-				dominanceZoom(w, x, y, z);
-				break;
-			case 1:
-				pressZoom(w, x, y, z);
-				break;
-			case 2:
-				pushZoom(w, x, y, z);
-				break;
-			case 3:
-				focusZoom(w, x, y, z);
-				break;
-				
-			default:
-				break;
-		}
-	}
-	
-    
     //Front virtual mics
  	switch (Mode) {
 		case 0:
@@ -386,66 +286,46 @@
 
 void Decoder::fiveDecoder(double &w, double &x, double &y, double &z)
 {
-	//Sound field rotations. Only called if the value is not 0 
-	if (Rotate!=0.0f)
-		rotateField(x, y);
-	
-	if (Tilt!=0.0f)
-		tiltField(y, z);
-	
-	if (Tumble!=0.0f)
-		tumbleField(x, z);
-	
-	
-	//Zoom function. Only called if the value is not 0 
-	if (Zoom!=0.0f) {
-		switch (ZoomMethod) {
-			case 0:
-				dominanceZoom(w, x, y, z);
-				break;
-			case 1:
-				pressZoom(w, x, y, z);
-				break;
-			case 2:
-				pushZoom(w, x, y, z);
-				break;
-			case 3:
-				focusZoom(w, x, y, z);
-				break;
-				
-			default:
-				break;
-		}
-	}
-	
-    
-    //Centre virtual mic
-    centreMic(w, x);
-    
-    //Front virtual mics
- 	switch (Mode) {
-		case 0:
-			xyDecode(w, x, y, z);
-			break;
-		case 1:
-			msDecode(w, x, y, z);
-			break;	
-		default:
-			break;
-	}   
-    
-	//Rear virtual mics
-	switch (surMode) {
-		case 0:
-			xySurDecode(w, x, y, z);
-			break;
-		case 1:
-			msSurDecode(w, x, y, z);
-			break;	
-		default:
-			break;
-	}
-	
+    switch (mode5x) {
+        case 0://Mic Pattern Decode
+        //Centre virtual mic
+        centreMic(w, x);
+        
+        //Front virtual mics
+        switch (Mode) {
+            case 0:
+                xyDecode(w, x, y, z);
+                break;
+            case 1:
+                msDecode(w, x, y, z);
+                break;	
+            default:
+                break;
+        }   
+        
+        //Rear virtual mics
+        switch (surMode) {
+            case 0:
+                xySurDecode(w, x, y, z);
+                break;
+            case 1:
+                msSurDecode(w, x, y, z);
+                break;	
+            default:
+                break;
+        }
+            break;
+        case 1://Heller 1 Decode - little centre
+            heller1(w, x, y, z);
+            break;
+        case 2://Heller 2 Decode - More centre
+            heller2(w, x, y, z);
+            break;
+
+            
+        default:
+            break;
+    }
     
 };
 
@@ -453,38 +333,6 @@
 
 void Decoder::fiveOneDecoder(double &w, double &x, double &y, double &z)
 {
-	//Sound field rotations. Only called if the value is not 0 
-	if (Rotate!=0.0f)
-		rotateField(x, y);
-	
-	if (Tilt!=0.0f)
-		tiltField(y, z);
-	
-	if (Tumble!=0.0f)
-		tumbleField(x, z);
-	
-	
-	//Zoom function. Only called if the value is not 0 
-	if (Zoom!=0.0f) {
-		switch (ZoomMethod) {
-			case 0:
-				dominanceZoom(w, x, y, z);
-				break;
-			case 1:
-				pressZoom(w, x, y, z);
-				break;
-			case 2:
-				pushZoom(w, x, y, z);
-				break;
-			case 3:
-				focusZoom(w, x, y, z);
-				break;
-				
-			default:
-				break;
-		}
-	}
-	
     //Subwoofer signal and filtering
     subSignal(w);
     filterLF();
@@ -492,34 +340,47 @@
         filterHF(w, x, y, z);
     }
     
-    //Centre virtual mic
-    centreMic(w, x);
     
-    //Front virtual mics
- 	switch (Mode) {
-		case 0:
-			xyDecode(w, x, y, z);
-			break;
-		case 1:
-			msDecode(w, x, y, z);
-			break;	
-		default:
-			break;
-	}   
-    
-	//Rear virtual mics
-	switch (surMode) {
-		case 0:
-			xySurDecode(w, x, y, z);
-			break;
-		case 1:
-			msSurDecode(w, x, y, z);
-			break;	
-		default:
-			break;
-	}
-	
-    
+    switch (mode5x) {
+        case 0:
+        //Centre virtual mic
+        centreMic(w, x);
+        
+        //Front virtual mics
+        switch (Mode) {
+            case 0:
+                xyDecode(w, x, y, z);
+                break;
+            case 1:
+                msDecode(w, x, y, z);
+                break;	
+            default:
+                break;
+        }   
+        
+        //Rear virtual mics
+        switch (surMode) {
+            case 0:
+                xySurDecode(w, x, y, z);
+                break;
+            case 1:
+                msSurDecode(w, x, y, z);
+                break;	
+            default:
+                break;
+        }
+            break;
+        case 1://Heller 1 Decode - little centre
+            heller1(w, x, y, z);
+            break;
+        case 2://Heller 2 Decode - More centre
+            heller2(w, x, y, z);
+            break;
+
+            
+        default:
+            break;
+    }
 };
 
 
@@ -533,7 +394,6 @@
 	double temp = x;
 	x = cos(degRad(Rotate))*temp - sin(degRad(Rotate))*y;
 	y = cos(degRad(Rotate))*y + sin(degRad(Rotate))*temp;
-	
 };
 
 
@@ -686,6 +546,27 @@
 };
 
 
+void Decoder::heller1(double &w, double &x, double &y, double &z)
+{
+    outputL = (0.28205165*w +0.24760232*x +0.18790454*y)*1.40171951577097;
+    outputR = (0.28204229*w +0.24758662*x -0.18792311*y)*1.40171951577097;
+    outputC = (-0.04881270*w -0.02756928*x +0.00001724*y)*1.40171951577097;
+    outputSL = (0.44947336*w -0.23381746*x +0.31911519*y)*1.40171951577097;
+    outputSR = (0.44945895*w -0.23380219*x -0.31911386*y)*1.40171951577097;
+};
+
+
+void Decoder::heller2(double &w, double &x, double &y, double &z)
+{
+    outputL = (0.21426224*w +0.19218459*x +0.20409261*y)*1.38921598327229;
+    outputR = (0.21426400*w +0.19218379*x -0.20409362*y)*1.38921598327229;
+    outputC = (0.09993309*w +0.15577050*x +0.00000000*y)*1.38921598327229;
+    outputSL = (0.44287748*w -0.27006948*x +0.30405695*y)*1.38921598327229;
+    outputSR = (0.44287676*w -0.27006941*x -0.30405595*y)*1.38921598327229;
+};
+
+
+
 void Decoder::filterCoefs(){
     int k = tan((M_PI*abs(Fc))/Fs);
     double denominator = pow(k, 2) + 2*k + 1;
--- a/Source/Decoder.h	Sun Sep 16 23:25:54 2012 +0100
+++ b/Source/Decoder.h	Thu Sep 20 16:41:01 2012 +0100
@@ -20,8 +20,9 @@
 	int    ZoomMethod; //4 positions
     
     //Decoder Speaker Layout
-    int    decoderMode; //Decoder mode, set to same as number of outputs
+    int    decoderMode; //Decoder mode
     int    channelOrder; //Natural or 5.1 ordering
+    int    mode5x; //Hidden mode for 5.x decoders accessed by programs
     
     //Front Stereo Speaker Decoding & Reverb
 	double Width; //0-90 degrees
@@ -106,6 +107,7 @@
     void xySurDecode(double &w, double &x, double &y, double &z);
 	void msSurDecode(double &w, double &x, double &y, double &z);
     
+    
     //Subwoofer
     void subSignal(double &w);
     
@@ -121,4 +123,7 @@
     void quadDecoder(double &w, double &x, double &y, double &z); //Decode to LRCS
     void fiveDecoder(double &w, double &x, double &y, double &z); //Decode to 5.0
 	void fiveOneDecoder(double &w, double &x, double &y, double &z); //Decode to 5.1
+    void heller1(double &w, double &x, double &y, double &z);
+    void heller2(double &w, double &x, double &y, double &z);
+    void craven(double &w, double &x, double &y, double &z);
 };
\ No newline at end of file
--- a/Source/GUI.cpp	Sun Sep 16 23:25:54 2012 +0100
+++ b/Source/GUI.cpp	Thu Sep 20 16:41:01 2012 +0100
@@ -51,162 +51,84 @@
 MyEditor::MyEditor (void* ptr)
 : AEffGUIEditor (ptr)
 {
-    //CBitmap* plugin_background = new CBitmap ("icme_plugin.png");
     rect.left   = 0;
     rect.top    = 0;
-    rect.right  = 545;//plugin_background->getWidth ();
-    rect.bottom = 495;//360;//plugin_background->getHeight ();
+    rect.right  = 578;
+    rect.bottom = 502;
 }
 
 //------------------------------------------------------------------------------------
 bool MyEditor::open (void* ptr)
 {
-	
 	//Knob Images
 	knob_360 = new CBitmap ("360_knob.png");
 	knob_red = new CBitmap ("red_knob.png");
 	knob_blue = new CBitmap ("blue_knob.png");
 	knob_red_blue = new CBitmap ("red_blue_knob.png");
+    knob_blue_red = new CBitmap("blue_red_knob.png");
 	knob_mode2 = new CBitmap ("mode2_knob.png");
+    knob_mode2b = new CBitmap ("mode2b_knob.png");
 	knob_mode4 = new CBitmap ("mode4_knob.png");
     knob_mode5 = new CBitmap ("mode5_knob.png");
 	
-    bRotations = new CBitmap ("rotations.png");
-    bZoom = new CBitmap ("zoom.png");
-    
-	
-	
-	frameSize (0, 0, 545, 495);
+
+	//Create the main frame
+	frameSize (0, 0, 578, 502);
 	CFrame* newFrame = new CFrame (frameSize, ptr, this);
 	newFrame->setBackgroundColor (CColor(23,25,26,255));
     newFrame->setDirty();
 
+    //Set up the Colours that are used
 	kDisplayText = CColor(255,255,255,255);//(R,G,B,Alpha)
 	kDisplayBackground = CColor(94,102,106,255);//(R,G,B,Alpha)
 	kLabelText = CColor(82,116,193,255);//(R,G,B,Alpha)	
 	kBlank = CColor(0,0,0,0);
     
-    
-	textDepth = 15;
-	textDepthLarge = 20;
-	labelOffset = -20;
-	displayOffset = 7;
+     
 	
 	
 	//Transforms
-    int transformsSep = 25;
-	int transformsHoz = transformsSep;
-	int transformsEl = 50;
-	transformsDisplay(transformsHoz, transformsEl, transformsSep, newFrame);
-	
-	
+	transformsDisplay(newFrame);
 	
 	//Zooming
-	int zoomHoz = transformsHoz + 3*knob_red_blue->getWidth() + 6*transformsSep;
-	int zoomEl = transformsEl;
-	int zoomSep = transformsSep;
-	zoomDisplay(zoomHoz, zoomEl, zoomSep, newFrame);
+	zoomDisplay(newFrame);
 	
-	
-    
     //Polar Plot
-    int plotHoz = transformsHoz;
-    int plotEl = transformsEl + knob_mode2->getHeight()/2 + displayOffset + textDepth + 2*transformsSep;
-    int plotSep = transformsSep;
-    plotDisplay(plotHoz, plotEl, plotSep, newFrame);
-    
+    plotDisplay(newFrame);
     
     //Settings
-    int settingsHoz = transformsHoz + 3*knob_red_blue->getWidth() + 2.5*transformsSep;
-    int settingsEl = transformsEl + knob_mode2->getHeight()/2 + displayOffset + textDepth + 2*transformsSep;
-    int settingsSep = transformsSep;
-    settingsDisplay(settingsHoz, settingsEl, settingsSep, newFrame);
-    
-    
-    
+    settingsDisplay(newFrame);
     
     //Info Display
-    int nameHoz = transformsHoz;
-    int nameEl = plotEl + knob_mode2->getHeight()/2 + displayOffset + textDepth + 2*transformsSep;
-    int nameSep = transformsSep;
-    nameDisplay(nameHoz, nameEl, nameSep, newFrame);
+    nameDisplay(newFrame);
     
-
-    
-//    switch ((int)effect->getParameter(103)) {
-//        case 0:
-//        {
-//    
-//        }
-//        break;
-//            
-//        case 2:
-//        {
-            //Stereo Decoding
-            int stereoHoz = transformsHoz;
-            int stereoEl = plotEl + knob_mode2->getHeight()/2 + displayOffset + textDepth + 2*transformsSep;
-            int stereoSep = transformsSep;
-            stereoDisplay(stereoHoz, stereoEl, stereoSep, newFrame);
-//        }
-//        break;
-//
-//            
-//
-//    }
-
-
-    
-    
-    
-
-    
-    
-    
-	
-	//Forget Images
-	knob_360->forget();
-	knob_red->forget();
-	knob_blue->forget();
-	knob_red_blue->forget();
-	knob_mode2->forget();
-	knob_mode4->forget();
-    
-    bRotations->forget ();
-	bZoom->forget ();
-
+   
 	
     
 	//-- remember our controls so that we can sync them with the state of the effect
 	controls[kRotate] = knobRotate;
 	controls[kTilt] = knobTilt;
 	controls[kTumble] = knobTumble;
+    controls[kZoom] = knobZoom;
 	controls[kZoomMethod] = knobZoomMethod;
-	controls[kZoom] = knobZoom;
-	controls[kWidth] = knobWidth;
-	controls[kPattern] = knobPattern;
-	controls[kMode] = knobMode;
-	controls[kRearVerb] = knobRearVerb;
-	controls[kHiVerb] = knobHiVerb;
-    //controls[kCentrePattern] = knobCentrePattern;
-    //controls[kCentreGain] = knobGain;
-    //controls[kSubGain] = knobSubGain;
-    //controls[kFc] = knobFc;
-    //controls[kSurroundMode] = knobSurMode;
-    //controls[kSurroundPattern] = knobSurPattern;
-    //controls[kSurroundWidth] = knobSurWidth;
-    //controls[kSurroundGain] = knobSurGain;
     controls[kDecoderMode] = knobDecoder;
+    controls[kChannelOrder] = knobChannel;
     
 	
     
-    
-    
-
+    //Create main frame
 	frame = newFrame;
     
+    
+    
 	//-- sync parameters
-    syncParameters();
-
+    //syncParameters();
+    for (int i = 0; i <= 4; i++)    //Sync Transforms & Zoom
+        setParameter (i, effect->getParameter (i));
+    for (int i = 18; i <= 19; i++)    //Sync Decoder Mode & Output Type
+        setParameter (i, effect->getParameter (i));
+    myPlot->decoder_mode5x = effect->getParameter(103); //Sync the hidden 5.x decoder mode
+    
     
 	return true;
 }
@@ -228,57 +150,49 @@
 //------------------------------------------------------------------------------------
 void MyEditor::syncParameters()
 {
-//	switch ((int)effect->getParameter(103)) {
-//        case 0:
-//        {
-//            int sync_paramerts [] = {0,1,2,3,4};
-//            for (int i = 0; i < 5; i++) //sizeof(syncParameters())
-//            setParameter (i, effect->getParameter (sync_paramerts[i]));
-//        }
-//        break;
-//            
-//        case 2:
-//        {
-            for (int i = 0; i < 10; i++)//kNumParameters
-            setParameter (i, effect->getParameter (i));
-//        }
-//        break;
-//    }
-    
+    for (int i = 0; i < kNumParameters; i++)
+        setParameter (i, effect->getParameter (i));    
 }
 
 
 
 
 //------------------------------------------------------------------------------------
-void MyEditor::transformsDisplay(int &transformsHoz, int &transformsEl, int &transformsSep, CFrame* newFrame)
+void MyEditor::transformsDisplay(CFrame* newFrame)
 {
-    CRect transSize = CRect (0, 0, bRotations->getWidth (),bRotations->getHeight ());
-    transSize.offset(transformsHoz-transformsSep/2, transformsEl+labelOffset-textDepthLarge);
+    //FIRST OFF - define a top coordinate
+    int hPos = cSep;
+    int ePos = cSep;
+    
+    
+    bTransforms = new CBitmap ("transforms.png");
+    
+    CRect transSize = CRect (0, 0, bTransforms->getWidth (),bTransforms->getHeight ());
+    transSize.offset(hPos, ePos);//transformsEl+labelOffset-textDepthLarge
 	CView* transforms_view = new CView (transSize);
-    transforms_view->setBackground (bRotations);
+    transforms_view->setBackground (bTransforms);
     newFrame->addView (transforms_view);
     
 	//Rotate
-	r (0, 0, knob_red_blue->getWidth (), knob_red_blue->getHeight () / 101);
-	r.offset(transformsHoz, transformsEl);
-	knobRotate = new CAnimKnob (r, this, kRotate, 101, knob_360->getHeight () / 101, knob_360, CPoint (0, 0));//101, 64, 
+	r (0, 0, knob_red_blue->getWidth (), knob_red_blue->getHeight () / IMAGE);
+	r.offset(hPos+cSep, ePos+kOffset);
+	knobRotate = new CAnimKnob (r, this, kRotate, IMAGE, knob_360->getHeight () / IMAGE, knob_360, CPoint (0, 0));//IMAGE, 64, 
 	newFrame->addView (knobRotate);
 	//knobRotate->forget ();
 	
 	//Tilt
-	r.offset(knob_red_blue->getWidth()+transformsSep, 0);
-	knobTilt = new CAnimKnob (r, this, kTilt, 101, knob_360->getHeight () / 101, knob_360, CPoint (0, 0));
+	r.offset(knob_red_blue->getWidth()+cSep, 0);
+	knobTilt = new CAnimKnob (r, this, kTilt, IMAGE, knob_360->getHeight () / IMAGE, knob_360, CPoint (0, 0));
 	newFrame->addView (knobTilt);
 	//knobTilt->forget ();
 	
 	//Tumble
-	r.offset(knob_red_blue->getWidth()+transformsSep, 0);
-	knobTumble = new CAnimKnob (r, this, kTumble, 101, knob_360->getHeight () / 101, knob_360, CPoint (0, 0));
+	r.offset(knob_red_blue->getWidth()+cSep, 0);
+	knobTumble = new CAnimKnob (r, this, kTumble, IMAGE, knob_360->getHeight () / IMAGE, knob_360, CPoint (0, 0));
 	newFrame->addView (knobTumble);
 	//knobTumble->forget ();
 	
-	
+
 	
 	
 	
@@ -287,8 +201,8 @@
 	
     //--CTextLabel--------------------------------------
     //Label Rotate
-    LabelSize (0, 0, knob_red_blue->getWidth (), textDepth); 
-    LabelSize.offset (transformsHoz, transformsEl+labelOffset);
+    LabelSize (0, 0, knob_red_blue->getWidth (), tDepth);
+    LabelSize.offset (hPos+cSep, ePos+lOffset);
     CTextLabel* labelRotate = new CTextLabel (LabelSize, 0, 0, kCenterText); 
     labelRotate->setFont (kNormalFontSmall); 
     labelRotate->setFontColor (kLabelText); 
@@ -298,7 +212,7 @@
     newFrame->addView (labelRotate);
 	
 	//Label Tilt
-	LabelSize.offset (knob_red_blue->getWidth()+transformsSep, 0);
+	LabelSize.offset (knob_red_blue->getWidth()+cSep, 0);
     CTextLabel* labelTilt = new CTextLabel (LabelSize, 0, 0, kCenterText); 
     labelTilt->setFont (kNormalFontSmall); 
     labelTilt->setFontColor (kLabelText); 
@@ -308,7 +222,7 @@
     newFrame->addView (labelTilt);
 	
 	//Label Tumble
-	LabelSize.offset (knob_red_blue->getWidth()+transformsSep, 0);
+	LabelSize.offset (knob_red_blue->getWidth()+cSep, 0);
     CTextLabel* labelTumble = new CTextLabel (LabelSize, 0, 0, kCenterText); 
     labelTumble->setFont (kNormalFontSmall); 
     labelTumble->setFontColor (kLabelText); 
@@ -317,10 +231,10 @@
     labelTumble->setText("Tumble");
     newFrame->addView (labelTumble);
 	
-	
+
 	//Label Section
-    LabelSize (0, 0, knob_red_blue->getWidth ()*3 + transformsSep*2, textDepthLarge); 
-    LabelSize.offset (transformsHoz, transformsEl+labelOffset - textDepthLarge);
+    LabelSize (0, 0, bTransforms->getWidth(), tDepthLarge);
+    LabelSize.offset (hPos, ePos+tOffset);
     CTextLabel* labelTransforms = new CTextLabel (LabelSize, 0, 0, kCenterText); 
     labelTransforms->setFont (kNormalFontBig); 
     labelTransforms->setFontColor (kLabelText); 
@@ -331,11 +245,11 @@
 	
 	
 	
-	
+
 	//--CTextLabel--------------------------------------
 	//Rotate Value
-	DisplaySize (0, 0, knob_red_blue->getWidth (), textDepth); 
-	DisplaySize.offset (transformsHoz, transformsEl+knob_red_blue->getHeight()/110+displayOffset);
+	DisplaySize (0, 0, knob_red_blue->getWidth (), tDepth);
+	DisplaySize.offset (hPos+cSep, ePos+pOffset);
 	paramRotate = new CTextLabel (DisplaySize, 0, 0, kCenterText); 
 	paramRotate->setHoriAlign(kCenterText);
 	paramRotate->setFont (kNormalFontVerySmall); 
@@ -346,7 +260,7 @@
 	
 	
 	//Tilt Value 
-	DisplaySize.offset (knob_red_blue->getWidth()+transformsSep, 0);
+	DisplaySize.offset (knob_red_blue->getWidth()+cSep, 0);
 	paramTilt = new CTextLabel (DisplaySize, 0, 0, kCenterText); 
 	paramTilt->setHoriAlign(kCenterText);
 	paramTilt->setFont (kNormalFontVerySmall); 
@@ -357,7 +271,7 @@
 	
 	
 	//Tumble Value
-	DisplaySize.offset (knob_red_blue->getWidth()+transformsSep, 0);
+	DisplaySize.offset (knob_red_blue->getWidth()+cSep, 0);
 	paramTumble = new CTextLabel (DisplaySize, 0, 0, kCenterText); 
 	paramTumble->setHoriAlign(kCenterText);
 	paramTumble->setFont (kNormalFontVerySmall); 
@@ -369,32 +283,38 @@
 
 
 //------------------------------------------------------------------------------------
-void MyEditor::zoomDisplay(int &zoomHoz, int &zoomEl, int &zoomSep, CFrame* newFrame)
+void MyEditor::zoomDisplay(CFrame* newFrame)
 {
+    //FIRST OFF - define a top coordinate
+    int hPos = 402;
+    int ePos = cSep;
+    
+    bZoom = new CBitmap ("zoom.png");
+    
     CRect zoomSize = CRect (0, 0, bZoom->getWidth (),bZoom->getHeight ());
-    zoomSize.offset(zoomHoz-zoomSep/2, zoomEl+labelOffset-textDepthLarge);
+    zoomSize.offset(hPos, ePos);
 	CView* zoom_view = new CView (zoomSize);
     zoom_view->setBackground (bZoom);
     newFrame->addView (zoom_view);
     
 	//ZoomMethod
-	CRect r (0, 0, knob_red_blue->getWidth (), knob_red_blue->getHeight () / 101);
-	r.offset(zoomHoz, zoomEl);
+	CRect r (0, 0, knob_red_blue->getWidth (), knob_red_blue->getHeight () / IMAGE);
+	r.offset(hPos+cSep, kOffset+cSep);
 	knobZoomMethod = new CHorizontalSwitch (r, this, kZoomMethod, 4, knob_mode4->getHeight () / 4, 4, knob_mode4, CPoint (0, 0));
 	newFrame->addView (knobZoomMethod);
 	//knobZoomMethod->forget ();
 	
 	//Zoom
-	r.offset(knob_mode4->getWidth()+zoomSep, 0);
-	knobZoom = new CAnimKnob (r, this, kZoom, 101, knob_red_blue->getHeight () / 101, knob_red_blue, CPoint (0, 0));
+	r.offset(knob_mode4->getWidth()+cSep, 0);
+	knobZoom = new CAnimKnob (r, this, kZoom, IMAGE, knob_red_blue->getHeight () / IMAGE, knob_red_blue, CPoint (0, 0));
 	newFrame->addView (knobZoom);
 	//knobZoom->forget ();
 	
 	
 	//--CTextLabel--------------------------------------
     //Label ZoomMethod
-    LabelSize (0, 0, knob_red_blue->getWidth (), textDepth); 
-    LabelSize.offset (zoomHoz, zoomEl+labelOffset);
+    LabelSize (0, 0, knob_red_blue->getWidth (), tDepth);
+    LabelSize.offset (hPos+cSep, ePos+lOffset);
     CTextLabel* labelZoomMethod = new CTextLabel (LabelSize, 0, 0, kCenterText); 
     labelZoomMethod->setFont (kNormalFontSmall); 
     labelZoomMethod->setFontColor (kLabelText); 
@@ -404,7 +324,7 @@
     newFrame->addView (labelZoomMethod);
 	
 	//Label Zoom
-	LabelSize.offset (knob_mode4->getWidth()+zoomSep, 0);
+	LabelSize.offset (knob_mode4->getWidth()+cSep, 0);
     CTextLabel* labelZoom = new CTextLabel (LabelSize, 0, 0, kCenterText); 
     labelZoom->setFont (kNormalFontSmall); 
     labelZoom->setFontColor (kLabelText); 
@@ -414,8 +334,8 @@
     newFrame->addView (labelZoom);
 	
 	//Label Section
-    LabelSize (0, 0, knob_red_blue->getWidth ()*2 + zoomSep*1, textDepthLarge); 
-    LabelSize.offset (zoomHoz, zoomEl+labelOffset - textDepthLarge);
+    LabelSize (0, 0, bZoom->getWidth(), tDepthLarge);
+    LabelSize.offset (hPos, ePos+tOffset);
     CTextLabel* labelTransforms = new CTextLabel (LabelSize, 0, 0, kCenterText); 
     labelTransforms->setFont (kNormalFontBig); 
     labelTransforms->setFontColor (kLabelText); 
@@ -427,8 +347,8 @@
 	
 	//--CTextLabel--------------------------------------
 	//Zoom Method
-	DisplaySize (0, 0, knob_red_blue->getWidth (), textDepth); 
-	DisplaySize.offset (zoomHoz, zoomEl+knob_red_blue->getHeight()/110+displayOffset);
+	DisplaySize (0, 0, knob_red_blue->getWidth (), tDepth);
+	DisplaySize.offset (hPos+cSep, ePos+pOffset);
 	paramZoomMethod = new CTextLabel (DisplaySize, 0, 0, kCenterText); 
 	paramZoomMethod->setHoriAlign(kCenterText);
 	paramZoomMethod->setFont (kNormalFontVerySmall); 
@@ -438,7 +358,7 @@
 	newFrame->addView (paramZoomMethod); 
 	
 	//Zoom Value 
-	DisplaySize.offset (knob_red_blue->getWidth()+zoomSep, 0);
+	DisplaySize.offset (knob_red_blue->getWidth()+cSep, 0);
 	paramZoom = new CTextLabel (DisplaySize, 0, 0, kCenterText); 
 	paramZoom->setHoriAlign(kCenterText);
 	paramZoom->setFont (kNormalFontVerySmall); 
@@ -451,215 +371,1432 @@
 
 
 //------------------------------------------------------------------------------------
-void MyEditor::stereoDisplay(int &stereoHoz, int &stereoEl, int &stereoSep, CFrame* newFrame)
+void MyEditor::stereoDisplay()
 {
-    bStereo = new CBitmap ("stereo.png");
+    //FIRST OFF - define a top coordinate
+    int hPos = cSep;
+    int ePos = 288;
     
-    CRect stereoSize = CRect (0, 0, bStereo->getWidth (),bStereo->getHeight ());
-    stereoSize.offset(stereoHoz-stereoSep/2, stereoEl+labelOffset-textDepthLarge);
-	CView* stereo_view = new CView (stereoSize);
-    stereo_view->setBackground (bStereo);
-    newFrame->addView (stereo_view);
     
+    bControls = new CBitmap ("controls.png");
+    
+    CRect controlSize = CRect (0, 0, bControls->getWidth (),bControls->getHeight ());
+    controlSize.offset(hPos, ePos);
+    
+	control_view = new CView (controlSize);
+    control_view->setBackground (bControls);
+    getFrame()->addView (control_view);
+    
+    
+    
+
 	//Mode
 	r (0, 0, knob_mode2->getWidth (), knob_mode2->getHeight () / 2);
-	r.offset(stereoHoz, stereoEl);
+	r.offset(hPos+cSep,ePos+kOffset);
 	knobMode = new CHorizontalSwitch (r, this, kMode, 2, knob_mode2->getHeight () / 2, 2, knob_mode2, CPoint (0, 0));
-	newFrame->addView (knobMode);
-	//knobMode->forget ();
+	getFrame()->addView (knobMode);
 	
 	//Width
-	r.offset(knob_mode2->getWidth()+stereoSep, 0);
-	knobWidth = new CAnimKnob (r, this, kWidth, 101, knob_red->getHeight () / 101, knob_red, CPoint (0, 0));
-	newFrame->addView (knobWidth);
-	//knobWidth->forget ();
+	r.offset(knob_mode2->getWidth()+cSep, 0);
+	knobWidth = new CAnimKnob (r, this, kWidth, IMAGE, knob_red->getHeight () / IMAGE, knob_red, CPoint (0, 0));
+	getFrame()->addView (knobWidth);
 	
 	//Pattern
-	r.offset(knob_red_blue->getWidth()+stereoSep, 0);
-	knobPattern = new CAnimKnob (r, this, kPattern, 101, knob_blue->getHeight () / 101, knob_blue, CPoint (0, 0));
-	newFrame->addView (knobPattern);
-	//knobPattern->forget ();
-	
+	r.offset(knob_mode2->getWidth()+cSep, 0);
+	knobPattern = new CAnimKnob (r, this, kPattern, IMAGE, knob_blue->getHeight () / IMAGE, knob_blue, CPoint (0, 0));
+	getFrame()->addView (knobPattern);
+
 	//RearVerb
-	r.offset(knob_mode2->getWidth()+stereoSep*4, 0);
-	knobRearVerb = new CAnimKnob (r, this, kRearVerb, 101, knob_red_blue->getHeight () / 101, knob_red, CPoint (0, 0));
-	newFrame->addView (knobRearVerb);
-	//knobRearVerb->forget ();
+    r.offset(2*knob_mode2->getWidth()+2*cSep+10, 0);
+    knobRearVerb = new CAnimKnob (r, this, kRearVerb, IMAGE, knob_red_blue->getHeight () / IMAGE, knob_red, CPoint (0, 0));
+	getFrame()->addView (knobRearVerb);
 	
 	//HiVerb
-	r.offset(knob_red_blue->getWidth()+stereoSep, 0);
-	knobHiVerb = new CAnimKnob (r, this, kHiVerb, 101, knob_red_blue->getHeight () / 101, knob_blue, CPoint (0, 0));
-	newFrame->addView (knobHiVerb);
-	//knobHiVerb->forget ();
+	r.offset(knob_mode2->getWidth()+cSep, 0);
+	knobHiVerb = new CAnimKnob (r, this, kHiVerb, IMAGE, knob_red_blue->getHeight () / IMAGE, knob_blue, CPoint (0, 0));
+	getFrame()->addView (knobHiVerb);
 	
 	
 	
-	
-	
-	
-	
+
 	
 	
     //--CTextLabel--------------------------------------
     //Label Mode
-    LabelSize (0, 0, knob_red_blue->getWidth (), textDepth); 
-    LabelSize.offset (stereoHoz, stereoEl+labelOffset);
-    CTextLabel* labelMode = new CTextLabel (LabelSize, 0, 0, kCenterText); 
+    LabelSize (0, 0, knob_red_blue->getWidth (), tDepth);
+    LabelSize.offset (hPos+cSep, ePos+lOffset);
+    labelMode = new CTextLabel (LabelSize, 0, 0, kCenterText); 
     labelMode->setFont (kNormalFontSmall); 
     labelMode->setFontColor (kLabelText); 
     labelMode->setBackColor (kBlank); 
     labelMode->setFrameColor (kBlank);
     labelMode->setText("Mode");
-    newFrame->addView (labelMode);    
+    getFrame()->addView (labelMode);    
 	
 	//Label Width
-	LabelSize.offset (knob_red_blue->getWidth()+stereoSep, 0);
-    CTextLabel* labelWidth = new CTextLabel (LabelSize, 0, 0, kCenterText); 
+	LabelSize.offset (knob_red_blue->getWidth()+cSep, 0);
+    labelWidth = new CTextLabel (LabelSize, 0, 0, kCenterText); 
     labelWidth->setFont (kNormalFontSmall); 
     labelWidth->setFontColor (kLabelText); 
     labelWidth->setBackColor (kBlank); 
     labelWidth->setFrameColor (kBlank);
     labelWidth->setText("Width");
-    newFrame->addView (labelWidth);
+    getFrame()->addView (labelWidth);
 	
 	//Label Pattern
-	LabelSize.offset (knob_red_blue->getWidth()+stereoSep, 0);
-    CTextLabel* labelPattern = new CTextLabel (LabelSize, 0, 0, kCenterText); 
+	LabelSize.offset (knob_red_blue->getWidth()+cSep, 0);
+    labelPattern = new CTextLabel (LabelSize, 0, 0, kCenterText);
     labelPattern->setFont (kNormalFontSmall); 
     labelPattern->setFontColor (kLabelText); 
     labelPattern->setBackColor (kBlank); 
     labelPattern->setFrameColor (kBlank);
     labelPattern->setText("Pattern");
-    newFrame->addView (labelPattern);
+    getFrame()->addView (labelPattern);
 	
 	//Label RearVerb
-	LabelSize.offset (knob_red_blue->getWidth()+stereoSep*4, 0);
-    CTextLabel* labelRearVerb = new CTextLabel (LabelSize, 0, 0, kCenterText); 
+	LabelSize.offset (2*knob_mode2->getWidth()+2*cSep+10, 0);
+    labelRearVerb = new CTextLabel (LabelSize, 0, 0, kCenterText); 
     labelRearVerb->setFont (kNormalFontSmall); 
     labelRearVerb->setFontColor (kLabelText); 
     labelRearVerb->setBackColor (kBlank); 
     labelRearVerb->setFrameColor (kBlank);
     labelRearVerb->setText("RearVerb");
-    newFrame->addView (labelRearVerb);
+    getFrame()->addView (labelRearVerb);
 	
 	//Label HiVerb
-	LabelSize.offset (knob_red_blue->getWidth()+stereoSep, 0);
-    CTextLabel* labelHiVerb = new CTextLabel (LabelSize, 0, 0, kCenterText); 
+	LabelSize.offset (knob_red_blue->getWidth()+cSep, 0);
+    labelHiVerb = new CTextLabel (LabelSize, 0, 0, kCenterText); 
     labelHiVerb->setFont (kNormalFontSmall); 
     labelHiVerb->setFontColor (kLabelText); 
     labelHiVerb->setBackColor (kBlank); 
     labelHiVerb->setFrameColor (kBlank);
     labelHiVerb->setText("HiVerb");
-    newFrame->addView (labelHiVerb);
+    getFrame()->addView (labelHiVerb);
 	
 	
 	
 	
-	
+
 	
 	//Label Section
-    LabelSize (0, 0, knob_red_blue->getWidth ()*5 + stereoSep*7, textDepthLarge); 
-    LabelSize.offset (stereoHoz, stereoEl+labelOffset - textDepthLarge);
-    CTextLabel* labelStereo = new CTextLabel (LabelSize, 0, 0, kCenterText); 
-    labelStereo->setFont (kNormalFontBig); 
-    labelStereo->setFontColor (kLabelText); 
-    labelStereo->setBackColor (kBlank); 
-    labelStereo->setFrameColor (kBlank);
-    labelStereo->setText("Stereo Decoding & Reverb");
-    newFrame->addView (labelStereo);
+    LabelSize (0, 0, bControls->getWidth(), tDepthLarge);
+    LabelSize.offset (hPos, ePos+tOffset);
+    decoderLabel1 = new CTextLabel (LabelSize, 0, 0, kCenterText); 
+    decoderLabel1->setFont (kNormalFontBig); 
+    decoderLabel1->setFontColor (kLabelText); 
+    decoderLabel1->setBackColor (kBlank); 
+    decoderLabel1->setFrameColor (kBlank);
+    decoderLabel1->setText("Stereo Decoding & Reverb");
+    getFrame()->addView (decoderLabel1);
 	
 	
 	
-	
+
 	//--CTextLabel--------------------------------------
 	//Mode Value
-	DisplaySize (0, 0, knob_red_blue->getWidth (), textDepth); 
-	DisplaySize.offset (stereoHoz, stereoEl+knob_red_blue->getHeight()/110+displayOffset);
+	DisplaySize (0, 0, knob_red_blue->getWidth (), tDepth);
+	DisplaySize.offset (hPos+cSep, ePos+pOffset);
 	paramMode = new CTextLabel (DisplaySize, 0, 0, kCenterText);
 	paramMode->setHoriAlign(kCenterText);
 	paramMode->setFont (kNormalFontVerySmall); 
 	paramMode->setFontColor (kDisplayText); 
 	paramMode->setBackColor (kDisplayBackground); 
 	paramMode->setFrameColor (kBlackCColor); 
-	newFrame->addView (paramMode);
-    paramMode->forget();
+	getFrame()->addView (paramMode);
+
 	
 	//Width Value 
-	DisplaySize.offset (knob_red_blue->getWidth()+stereoSep, 0);
+	DisplaySize.offset (knob_red_blue->getWidth()+cSep, 0);
 	paramWidth = new CTextLabel (DisplaySize, 0, 0, kCenterText); 
 	paramWidth->setHoriAlign(kCenterText);
 	paramWidth->setFont (kNormalFontVerySmall); 
 	paramWidth->setFontColor (kDisplayText); 
 	paramWidth->setBackColor (kDisplayBackground); 
 	paramWidth->setFrameColor (kBlackCColor); 
-	newFrame->addView (paramWidth);
-    paramWidth->forget();
+	getFrame()->addView (paramWidth);
+
 	
 	//Pattern Value
-	DisplaySize.offset (knob_red_blue->getWidth()+stereoSep, 0);
+	DisplaySize.offset (knob_red_blue->getWidth()+cSep, 0);
 	paramPattern = new CTextLabel (DisplaySize, 0, 0, kCenterText); 
 	paramPattern->setHoriAlign(kCenterText);
 	paramPattern->setFont (kNormalFontVerySmall); 
 	paramPattern->setFontColor (kDisplayText); 
 	paramPattern->setBackColor (kDisplayBackground); 
 	paramPattern->setFrameColor (kBlackCColor); 
-	newFrame->addView (paramPattern);
-    paramPattern->forget();
+	getFrame()->addView (paramPattern);
+
     
 	//RearVerb Value 
-	DisplaySize.offset (knob_red_blue->getWidth()+stereoSep*4, 0);
+	DisplaySize.offset (2*knob_mode2->getWidth()+2*cSep+10, 0);
 	paramRearVerb = new CTextLabel (DisplaySize, 0, 0, kCenterText); 
 	paramRearVerb->setHoriAlign(kCenterText);
 	paramRearVerb->setFont (kNormalFontVerySmall); 
 	paramRearVerb->setFontColor (kDisplayText); 
 	paramRearVerb->setBackColor (kDisplayBackground); 
 	paramRearVerb->setFrameColor (kBlackCColor); 
-	newFrame->addView (paramRearVerb);
-    paramRearVerb->forget();
+	getFrame()->addView (paramRearVerb);
+
 	
 	//HiVerb Value
-	DisplaySize.offset (knob_red_blue->getWidth()+stereoSep, 0);
+	DisplaySize.offset (knob_red_blue->getWidth()+cSep, 0);
 	paramHiVerb = new CTextLabel (DisplaySize, 0, 0, kCenterText); 
 	paramHiVerb->setHoriAlign(kCenterText);
 	paramHiVerb->setFont (kNormalFontVerySmall); 
 	paramHiVerb->setFontColor (kDisplayText); 
 	paramHiVerb->setBackColor (kDisplayBackground); 
 	paramHiVerb->setFrameColor (kBlackCColor); 
-	newFrame->addView (paramHiVerb);
-    paramHiVerb->forget();
-    
-    //ModeStereo Value
-	DisplaySize.offset (-7*stereoSep-4*knob_red->getWidth(), 0);
-	paramModeStereo = new CTextLabel (DisplaySize, 0, 0, kCenterText); 
-	paramModeStereo->setHoriAlign(kCenterText);
-	paramModeStereo->setFont (kNormalFontVerySmall); 
-	paramModeStereo->setFontColor (kDisplayText); 
-	paramModeStereo->setBackColor (kDisplayBackground); 
-	paramModeStereo->setFrameColor (kBlackCColor); 
-	newFrame->addView (paramModeStereo);
-    paramModeStereo->forget();
-    
-    
-    bStereo->forget ();
+	getFrame()->addView (paramHiVerb);
+
+    controls[kMode] = knobMode;
+	controls[kWidth] = knobWidth;
+	controls[kPattern] = knobPattern;
+	controls[kRearVerb] = knobRearVerb;
+	controls[kHiVerb] = knobHiVerb;
+    //controls[kCentrePattern] = knobCentrePattern;
+    //controls[kCentreGain] =knobCentreGain;
+    //controls[kSubGain] = knobSubGain;
+    //controls[kFc] = knobFc;
+    //controls[kSurroundMode] = knobSurroundMode;
+    //controls[kSurroundPattern] = knobSurroundPattern;
+    //controls[kSurroundWidth] = knobSurroundWidth;
+    //controls[kSurroundGain] = knobSurroundGain;
 }
 
 
 
 //------------------------------------------------------------------------------------
-void MyEditor::nameDisplay(int &nameHoz, int &nameEl, int &nameSep, CFrame* newFrame)
+void MyEditor::twooneDisplay()
 {
+    //FIRST OFF - define a top coordinate
+    int hPos = cSep;
+    int ePos = 288;
+    int hPos2 = cSep+37;
+    int ePos2 = 150;
+    
+    
+    bControls = new CBitmap ("controls.png");
+    CRect controlSize = CRect (0, 0, bControls->getWidth (),bControls->getHeight ());
+    controlSize.offset(cSep, cSep+(cSep+bControls->getHeight())*2);
+	control_view = new CView (controlSize);
+    control_view->setBackground (bControls);
+    getFrame()->addView (control_view);
+
+    
+    bControls2 = new CBitmap ("controls2.png");
+    controlSize = CRect (0, 0, bControls2->getWidth (),bControls2->getHeight ());
+    controlSize.offset(hPos2, ePos2);
+	control_view2 = new CView (controlSize);
+    control_view2->setBackground (bControls2);
+    getFrame()->addView (control_view2);
+    
+    
+    
+	//Mode
+	r (0, 0, knob_mode2->getWidth (), knob_mode2->getHeight () / 2);
+	r.offset(hPos+cSep,ePos+kOffset);
+	knobMode = new CHorizontalSwitch (r, this, kMode, 2, knob_mode2->getHeight () / 2, 2, knob_mode2, CPoint (0, 0));
+	getFrame()->addView (knobMode);
+	
+	//Width
+	r.offset(knob_mode2->getWidth()+cSep, 0);
+	knobWidth = new CAnimKnob (r, this, kWidth, IMAGE, knob_red->getHeight () / IMAGE, knob_red, CPoint (0, 0));
+	getFrame()->addView (knobWidth);
+	
+	//Pattern
+	r.offset(knob_mode2->getWidth()+cSep, 0);
+	knobPattern = new CAnimKnob (r, this, kPattern, IMAGE, knob_blue->getHeight () / IMAGE, knob_blue, CPoint (0, 0));
+	getFrame()->addView (knobPattern);
+    
+	//RearVerb
+    r.offset(2*knob_mode2->getWidth()+2*cSep+10, 0);
+    knobRearVerb = new CAnimKnob (r, this, kRearVerb, IMAGE, knob_red_blue->getHeight () / IMAGE, knob_red, CPoint (0, 0));
+	getFrame()->addView (knobRearVerb);
+	
+	//HiVerb
+	r.offset(knob_mode2->getWidth()+cSep, 0);
+	knobHiVerb = new CAnimKnob (r, this, kHiVerb, IMAGE, knob_red_blue->getHeight () / IMAGE, knob_blue, CPoint (0, 0));
+	getFrame()->addView (knobHiVerb);
+    
+    //SubGain
+    r (0, 0, knob_mode2->getWidth (), knob_mode2->getHeight () / 2);
+	r.offset(hPos2+2*cSep+knob_mode2->getWidth (), ePos2+kOffset);
+    knobSubGain = new CAnimKnob (r, this, kSubGain, IMAGE, knob_red_blue->getHeight () / IMAGE, knob_blue_red, CPoint (0, 0));
+	getFrame()->addView (knobSubGain);
+	
+	//FC
+	r.offset(knob_mode2->getWidth()+cSep, 0);
+	knobFc = new CAnimKnob (r, this, kFc, IMAGE, knob_red_blue->getHeight () / IMAGE, knob_blue, CPoint (0, 0));
+	getFrame()->addView (knobFc);
+	
+	
+	
+    
+	
+	
+    //--CTextLabel--------------------------------------
+    //Label Mode
+    LabelSize (0, 0, knob_red_blue->getWidth (), tDepth);
+    LabelSize.offset (hPos+cSep, ePos+lOffset);
+    labelMode = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelMode->setFont (kNormalFontSmall);
+    labelMode->setFontColor (kLabelText);
+    labelMode->setBackColor (kBlank);
+    labelMode->setFrameColor (kBlank);
+    labelMode->setText("Mode");
+    getFrame()->addView (labelMode);
+	
+	//Label Width
+	LabelSize.offset (knob_red_blue->getWidth()+cSep, 0);
+    labelWidth = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelWidth->setFont (kNormalFontSmall);
+    labelWidth->setFontColor (kLabelText);
+    labelWidth->setBackColor (kBlank);
+    labelWidth->setFrameColor (kBlank);
+    labelWidth->setText("Width");
+    getFrame()->addView (labelWidth);
+	
+	//Label Pattern
+	LabelSize.offset (knob_red_blue->getWidth()+cSep, 0);
+    labelPattern = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelPattern->setFont (kNormalFontSmall);
+    labelPattern->setFontColor (kLabelText);
+    labelPattern->setBackColor (kBlank);
+    labelPattern->setFrameColor (kBlank);
+    labelPattern->setText("Pattern");
+    getFrame()->addView (labelPattern);
+	
+	//Label RearVerb
+	LabelSize.offset (2*knob_mode2->getWidth()+2*cSep+10, 0);
+    labelRearVerb = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelRearVerb->setFont (kNormalFontSmall);
+    labelRearVerb->setFontColor (kLabelText);
+    labelRearVerb->setBackColor (kBlank);
+    labelRearVerb->setFrameColor (kBlank);
+    labelRearVerb->setText("RearVerb");
+    getFrame()->addView (labelRearVerb);
+	
+	//Label HiVerb
+	LabelSize.offset (knob_red_blue->getWidth()+cSep, 0);
+    labelHiVerb = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelHiVerb->setFont (kNormalFontSmall);
+    labelHiVerb->setFontColor (kLabelText);
+    labelHiVerb->setBackColor (kBlank);
+    labelHiVerb->setFrameColor (kBlank);
+    labelHiVerb->setText("HiVerb");
+    getFrame()->addView (labelHiVerb);
+    
+    //Label SubGain
+    LabelSize(0, 0, knob_mode2->getWidth (), tDepth);
+	LabelSize.offset (hPos2+2*cSep+knob_mode2->getWidth (), ePos2+lOffset);
+    labelSubGain = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelSubGain->setFont (kNormalFontSmall);
+    labelSubGain->setFontColor (kLabelText);
+    labelSubGain->setBackColor (kBlank);
+    labelSubGain->setFrameColor (kBlank);
+    labelSubGain->setText("SubGain");
+    getFrame()->addView (labelSubGain);
+	
+	//Label Fc
+	LabelSize.offset (knob_red_blue->getWidth()+cSep, 0);
+    labelFc = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelFc->setFont (kNormalFontSmall);
+    labelFc->setFontColor (kLabelText);
+    labelFc->setBackColor (kBlank);
+    labelFc->setFrameColor (kBlank);
+    labelFc->setText("xOver");
+    getFrame()->addView (labelFc);
+	
+	
+	
+	
+    
+	
+	//Label Section
+    LabelSize (0, 0, bControls2->getWidth(), tDepthLarge);
+    LabelSize.offset (hPos2, ePos2+tOffset);
+    decoderLabel1 = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    decoderLabel1->setFont (kNormalFontBig);
+    decoderLabel1->setFontColor (kLabelText);
+    decoderLabel1->setBackColor (kBlank);
+    decoderLabel1->setFrameColor (kBlank);
+    decoderLabel1->setText("2.1 Decoding & Reverb");
+    getFrame()->addView (decoderLabel1);
+	
+	
+	
+    
+	//--CTextLabel--------------------------------------
+	//Mode Value
+	DisplaySize (0, 0, knob_red_blue->getWidth (), tDepth);
+	DisplaySize.offset (hPos+cSep, ePos+pOffset);
+	paramMode = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramMode->setHoriAlign(kCenterText);
+	paramMode->setFont (kNormalFontVerySmall);
+	paramMode->setFontColor (kDisplayText);
+	paramMode->setBackColor (kDisplayBackground);
+	paramMode->setFrameColor (kBlackCColor);
+	getFrame()->addView (paramMode);
+    
+	
+	//Width Value
+	DisplaySize.offset (knob_red_blue->getWidth()+cSep, 0);
+	paramWidth = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramWidth->setHoriAlign(kCenterText);
+	paramWidth->setFont (kNormalFontVerySmall);
+	paramWidth->setFontColor (kDisplayText);
+	paramWidth->setBackColor (kDisplayBackground);
+	paramWidth->setFrameColor (kBlackCColor);
+	getFrame()->addView (paramWidth);
+    
+	
+	//Pattern Value
+	DisplaySize.offset (knob_red_blue->getWidth()+cSep, 0);
+	paramPattern = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramPattern->setHoriAlign(kCenterText);
+	paramPattern->setFont (kNormalFontVerySmall);
+	paramPattern->setFontColor (kDisplayText);
+	paramPattern->setBackColor (kDisplayBackground);
+	paramPattern->setFrameColor (kBlackCColor);
+	getFrame()->addView (paramPattern);
+    
+    
+	//RearVerb Value
+	DisplaySize.offset (2*knob_mode2->getWidth()+2*cSep+10, 0);
+	paramRearVerb = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramRearVerb->setHoriAlign(kCenterText);
+	paramRearVerb->setFont (kNormalFontVerySmall);
+	paramRearVerb->setFontColor (kDisplayText);
+	paramRearVerb->setBackColor (kDisplayBackground);
+	paramRearVerb->setFrameColor (kBlackCColor);
+	getFrame()->addView (paramRearVerb);
+    
+	
+	//HiVerb Value
+	DisplaySize.offset (knob_red_blue->getWidth()+cSep, 0);
+	paramHiVerb = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramHiVerb->setHoriAlign(kCenterText);
+	paramHiVerb->setFont (kNormalFontVerySmall);
+	paramHiVerb->setFontColor (kDisplayText);
+	paramHiVerb->setBackColor (kDisplayBackground);
+	paramHiVerb->setFrameColor (kBlackCColor);
+	getFrame()->addView (paramHiVerb);
+    
+    
+    //SubGain Value
+    DisplaySize(0, 0, knob_mode2->getWidth (), tDepth);
+	DisplaySize.offset(hPos2+2*cSep+knob_mode2->getWidth (), ePos2+pOffset);
+	paramSubGain = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramSubGain->setHoriAlign(kCenterText);
+	paramSubGain->setFont (kNormalFontVerySmall);
+	paramSubGain->setFontColor (kDisplayText);
+	paramSubGain->setBackColor (kDisplayBackground);
+	paramSubGain->setFrameColor (kBlackCColor);
+	getFrame()->addView (paramSubGain);
+    
+	
+	//Fc Value
+	DisplaySize.offset (knob_red_blue->getWidth()+cSep, 0);
+	paramFc = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramFc->setHoriAlign(kCenterText);
+	paramFc->setFont (kNormalFontVerySmall);
+	paramFc->setFontColor (kDisplayText);
+	paramFc->setBackColor (kDisplayBackground);
+	paramFc->setFrameColor (kBlackCColor);
+	getFrame()->addView (paramFc);
+    
+    controls[kMode] = knobMode;
+	controls[kWidth] = knobWidth;
+	controls[kPattern] = knobPattern;
+	controls[kRearVerb] = knobRearVerb;
+	controls[kHiVerb] = knobHiVerb;
+    //controls[kCentrePattern] = knobCentrePattern;
+    //controls[kCentreGain] =knobCentreGain;
+    controls[kSubGain] = knobSubGain;
+    controls[kFc] = knobFc;
+    //controls[kSurroundMode] = knobSurroundMode;
+    //controls[kSurroundPattern] = knobSurroundPattern;
+    //controls[kSurroundWidth] = knobSurroundWidth;
+    //controls[kSurroundGain] = knobSurroundGain;
+}
+
+
+
+//------------------------------------------------------------------------------------
+void MyEditor::fourDisplay()
+{
+    //FIRST OFF - define a top coordinate
+    int hPos = cSep;
+    int ePos = 288;
+    
+    
+    bControls = new CBitmap ("controls.png");
+    CRect controlSize = CRect (0, 0, bControls->getWidth (),bControls->getHeight ());
+    controlSize.offset(cSep, cSep+(cSep+bControls->getHeight())*2);
+	control_view = new CView (controlSize);
+    control_view->setBackground (bControls);
+    getFrame()->addView (control_view);
+    
+    
+    
+    
+	//Mode
+	r (0, 0, knob_mode2->getWidth (), knob_mode2->getHeight () / 2);
+	r.offset(hPos+cSep,ePos+kOffset);
+	knobMode = new CHorizontalSwitch (r, this, kMode, 2, knob_mode2->getHeight () / 2, 2, knob_mode2, CPoint (0, 0));
+	getFrame()->addView (knobMode);
+	
+	//Width
+	r.offset(knob_mode2->getWidth()+cSep, 0);
+	knobWidth = new CAnimKnob (r, this, kWidth, IMAGE, knob_red->getHeight () / IMAGE, knob_red, CPoint (0, 0));
+	getFrame()->addView (knobWidth);
+	
+	//Pattern
+	r.offset(knob_mode2->getWidth()+cSep, 0);
+	knobPattern = new CAnimKnob (r, this, kPattern, IMAGE, knob_blue->getHeight () / IMAGE, knob_blue, CPoint (0, 0));
+	getFrame()->addView (knobPattern);
+    
+    
+    //Surround Mode
+	r.offset(knob_mode2->getWidth()+cSep+10, 0);
+	knobSurroundMode = new CHorizontalSwitch (r, this, kSurroundMode, 2, knob_mode2->getHeight () / 2, 2, knob_mode2, CPoint (0, 0));
+	getFrame()->addView (knobSurroundMode);
+    
+	//Surround Width
+    r.offset(knob_mode2->getWidth()+cSep, 0);
+    knobSurroundWidth = new CAnimKnob (r, this, kSurroundWidth, IMAGE, knob_red_blue->getHeight () / IMAGE, knob_red, CPoint (0, 0));
+	getFrame()->addView (knobSurroundWidth);
+	
+	//Surround Pattern
+	r.offset(knob_mode2->getWidth()+cSep, 0);
+	knobSurroundPattern = new CAnimKnob (r, this, kSurroundPattern, IMAGE, knob_blue->getHeight () / IMAGE, knob_blue, CPoint (0, 0));
+	getFrame()->addView (knobSurroundPattern);
+    
+    //Surround Gain
+	r.offset(knob_mode2->getWidth()+cSep, 0);
+	knobSurroundGain = new CAnimKnob (r, this, kSurroundGain, IMAGE, knob_blue->getHeight () / IMAGE, knob_blue_red, CPoint (0, 0));
+	getFrame()->addView (knobSurroundGain);
+	
+	
+	
+    
+	
+	
+    //--CTextLabel--------------------------------------
+    //Label Mode
+    LabelSize (0, 0, knob_red_blue->getWidth (), tDepth);
+    LabelSize.offset (hPos+cSep, ePos+lOffset);
+    labelMode = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelMode->setFont (kNormalFontSmall);
+    labelMode->setFontColor (kLabelText);
+    labelMode->setBackColor (kBlank);
+    labelMode->setFrameColor (kBlank);
+    labelMode->setText("Mode");
+    getFrame()->addView (labelMode);
+	
+	//Label Width
+	LabelSize.offset (knob_red_blue->getWidth()+cSep, 0);
+    labelWidth = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelWidth->setFont (kNormalFontSmall);
+    labelWidth->setFontColor (kLabelText);
+    labelWidth->setBackColor (kBlank);
+    labelWidth->setFrameColor (kBlank);
+    labelWidth->setText("Width");
+    getFrame()->addView (labelWidth);
+	
+	//Label Pattern
+	LabelSize.offset (knob_red_blue->getWidth()+cSep, 0);
+    labelPattern = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelPattern->setFont (kNormalFontSmall);
+    labelPattern->setFontColor (kLabelText);
+    labelPattern->setBackColor (kBlank);
+    labelPattern->setFrameColor (kBlank);
+    labelPattern->setText("Pattern");
+    getFrame()->addView (labelPattern);
+	
+	//Label Surround Mode
+	LabelSize.offset (knob_mode2->getWidth()+cSep+10, 0);
+    labelSurMode = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelSurMode->setFont (kNormalFontSmall);
+    labelSurMode->setFontColor (kLabelText);
+    labelSurMode->setBackColor (kBlank);
+    labelSurMode->setFrameColor (kBlank);
+    labelSurMode->setText("SurMode");
+    getFrame()->addView (labelSurMode);
+	
+	//Label Surround Width
+	LabelSize.offset (knob_red_blue->getWidth()+cSep, 0);
+    labelSurWidth = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelSurWidth->setFont (kNormalFontSmall);
+    labelSurWidth->setFontColor (kLabelText);
+    labelSurWidth->setBackColor (kBlank);
+    labelSurWidth->setFrameColor (kBlank);
+    labelSurWidth->setText("SurWidth");
+    getFrame()->addView (labelSurWidth);
+    
+    //Label Surround Pattern
+	LabelSize.offset (knob_red_blue->getWidth()+cSep, 0);
+    labelSurPattern = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelSurPattern->setFont (kNormalFontSmall);
+    labelSurPattern->setFontColor (kLabelText);
+    labelSurPattern->setBackColor (kBlank);
+    labelSurPattern->setFrameColor (kBlank);
+    labelSurPattern->setText("SurPattern");
+    getFrame()->addView (labelSurPattern);
+    
+    //Label Surround Gain
+	LabelSize.offset (knob_red_blue->getWidth()+cSep, 0);
+    labelSurGain = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelSurGain->setFont (kNormalFontSmall);
+    labelSurGain->setFontColor (kLabelText);
+    labelSurGain->setBackColor (kBlank);
+    labelSurGain->setFrameColor (kBlank);
+    labelSurGain->setText("SurGain");
+    getFrame()->addView (labelSurGain);
+	
+	
+	
+    
+	
+	//Label Section
+    LabelSize (0, 0, bControls->getWidth(), tDepthLarge);
+    LabelSize.offset (hPos, ePos+tOffset);
+    decoderLabel1 = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    decoderLabel1->setFont (kNormalFontBig);
+    decoderLabel1->setFontColor (kLabelText);
+    decoderLabel1->setBackColor (kBlank);
+    decoderLabel1->setFrameColor (kBlank);
+    decoderLabel1->setText("4.0 Decoding");
+    getFrame()->addView (decoderLabel1);
+	
+	
+	
+    
+	//--CTextLabel--------------------------------------
+	//Mode Value
+	DisplaySize (0, 0, knob_red_blue->getWidth (), tDepth);
+	DisplaySize.offset (hPos+cSep, ePos+pOffset);
+	paramMode = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramMode->setHoriAlign(kCenterText);
+	paramMode->setFont (kNormalFontVerySmall);
+	paramMode->setFontColor (kDisplayText);
+	paramMode->setBackColor (kDisplayBackground);
+	paramMode->setFrameColor (kBlackCColor);
+	getFrame()->addView (paramMode);
+    
+	
+	//Width Value
+	DisplaySize.offset (knob_red_blue->getWidth()+cSep, 0);
+	paramWidth = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramWidth->setHoriAlign(kCenterText);
+	paramWidth->setFont (kNormalFontVerySmall);
+	paramWidth->setFontColor (kDisplayText);
+	paramWidth->setBackColor (kDisplayBackground);
+	paramWidth->setFrameColor (kBlackCColor);
+	getFrame()->addView (paramWidth);
+    
+	
+	//Pattern Value
+	DisplaySize.offset (knob_red_blue->getWidth()+cSep, 0);
+	paramPattern = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramPattern->setHoriAlign(kCenterText);
+	paramPattern->setFont (kNormalFontVerySmall);
+	paramPattern->setFontColor (kDisplayText);
+	paramPattern->setBackColor (kDisplayBackground);
+	paramPattern->setFrameColor (kBlackCColor);
+	getFrame()->addView (paramPattern);
+    
+    
+	//SurMode Value
+	DisplaySize.offset (knob_mode2->getWidth()+cSep+10, 0);
+	paramSurMode = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramSurMode->setHoriAlign(kCenterText);
+	paramSurMode->setFont (kNormalFontVerySmall);
+	paramSurMode->setFontColor (kDisplayText);
+	paramSurMode->setBackColor (kDisplayBackground);
+	paramSurMode->setFrameColor (kBlackCColor);
+	getFrame()->addView (paramSurMode);
+    
+	
+	//SurWidth Value
+	DisplaySize.offset (knob_red_blue->getWidth()+cSep, 0);
+	paramSurWidth = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramSurWidth->setHoriAlign(kCenterText);
+	paramSurWidth->setFont (kNormalFontVerySmall);
+	paramSurWidth->setFontColor (kDisplayText);
+	paramSurWidth->setBackColor (kDisplayBackground);
+	paramSurWidth->setFrameColor (kBlackCColor);
+	getFrame()->addView (paramSurWidth);
+    
+    //SurPattern Value
+	DisplaySize.offset (knob_red_blue->getWidth()+cSep, 0);
+	paramSurPattern = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramSurPattern->setHoriAlign(kCenterText);
+	paramSurPattern->setFont (kNormalFontVerySmall);
+	paramSurPattern->setFontColor (kDisplayText);
+	paramSurPattern->setBackColor (kDisplayBackground);
+	paramSurPattern->setFrameColor (kBlackCColor);
+	getFrame()->addView (paramSurPattern);
+    
+    //SurWidth Value
+	DisplaySize.offset (knob_red_blue->getWidth()+cSep, 0);
+	paramSurGain = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramSurGain->setHoriAlign(kCenterText);
+	paramSurGain->setFont (kNormalFontVerySmall);
+	paramSurGain->setFontColor (kDisplayText);
+	paramSurGain->setBackColor (kDisplayBackground);
+	paramSurGain->setFrameColor (kBlackCColor);
+	getFrame()->addView (paramSurGain);
+    
+    controls[kMode] = knobMode;
+	controls[kWidth] = knobWidth;
+	controls[kPattern] = knobPattern;
+	//controls[kRearVerb] = knobRearVerb;
+	//controls[kHiVerb] = knobHiVerb;
+    //controls[kCentrePattern] = knobCentrePattern;
+    //controls[kCentreGain] =knobCentreGain;
+    //controls[kSubGain] = knobSubGain;
+    //controls[kFc] = knobFc;
+    controls[kSurroundMode] = knobSurroundMode;
+    controls[kSurroundPattern] = knobSurroundPattern;
+    controls[kSurroundWidth] = knobSurroundWidth;
+    controls[kSurroundGain] = knobSurroundGain;
+}
+
+
+
+
+
+//------------------------------------------------------------------------------------
+void MyEditor::fiveDisplay()
+{
+    //FIRST OFF - define a top coordinate
+    int hPos = cSep;
+    int ePos = 288;
+    int hPos2 = cSep+37;
+    int ePos2 = 150;
+    
+    
+    bControls = new CBitmap ("controls.png");
+    CRect controlSize = CRect (0, 0, bControls->getWidth (),bControls->getHeight ());
+    controlSize.offset(cSep, cSep+(cSep+bControls->getHeight())*2);
+	control_view = new CView (controlSize);
+    control_view->setBackground (bControls);
+    getFrame()->addView (control_view);
+    
+    
+    bControls2 = new CBitmap ("controls2.png");
+    controlSize = CRect (0, 0, bControls2->getWidth (),bControls2->getHeight ());
+    controlSize.offset(hPos2, ePos2);
+	control_view2 = new CView (controlSize);
+    control_view2->setBackground (bControls2);
+    getFrame()->addView (control_view2);
+    
+    
+    
+	//Mode
+	r (0, 0, knob_mode2->getWidth (), knob_mode2->getHeight () / 2);
+	r.offset(hPos+cSep,ePos+kOffset);
+	knobMode = new CHorizontalSwitch (r, this, kMode, 2, knob_mode2->getHeight () / 2, 2, knob_mode2, CPoint (0, 0));
+	getFrame()->addView (knobMode);
+	
+	//Width
+	r.offset(knob_mode2->getWidth()+cSep, 0);
+	knobWidth = new CAnimKnob (r, this, kWidth, IMAGE, knob_red->getHeight () / IMAGE, knob_red, CPoint (0, 0));
+	getFrame()->addView (knobWidth);
+	
+	//Pattern
+	r.offset(knob_mode2->getWidth()+cSep, 0);
+	knobPattern = new CAnimKnob (r, this, kPattern, IMAGE, knob_blue->getHeight () / IMAGE, knob_blue, CPoint (0, 0));
+	getFrame()->addView (knobPattern);
+    
+    
+    //Surround Mode
+	r.offset(knob_mode2->getWidth()+cSep+10, 0);
+	knobSurroundMode = new CHorizontalSwitch (r, this, kSurroundMode, 2, knob_mode2->getHeight () / 2, 2, knob_mode2, CPoint (0, 0));
+	getFrame()->addView (knobSurroundMode);
+    
+	//Surround Width
+    r.offset(knob_mode2->getWidth()+cSep, 0);
+    knobSurroundWidth = new CAnimKnob (r, this, kSurroundWidth, IMAGE, knob_red_blue->getHeight () / IMAGE, knob_red, CPoint (0, 0));
+	getFrame()->addView (knobSurroundWidth);
+	
+	//Surround Pattern
+	r.offset(knob_mode2->getWidth()+cSep, 0);
+	knobSurroundPattern = new CAnimKnob (r, this, kSurroundPattern, IMAGE, knob_blue->getHeight () / IMAGE, knob_blue, CPoint (0, 0));
+	getFrame()->addView (knobSurroundPattern);
+    
+    //Surround Gain
+	r.offset(knob_mode2->getWidth()+cSep, 0);
+	knobSurroundGain = new CAnimKnob (r, this, kSurroundGain, IMAGE, knob_blue->getHeight () / IMAGE, knob_blue_red, CPoint (0, 0));
+	getFrame()->addView (knobSurroundGain);
+    
+    
+    
+    
+    
+    //Centre Pattern
+    r (0, 0, knob_mode2->getWidth (), knob_mode2->getHeight () / 2);
+	r.offset(hPos2+2*cSep+knob_mode2->getWidth (), ePos2+kOffset);
+    knobCentrePattern = new CAnimKnob (r, this, kCentrePattern, IMAGE, knob_red_blue->getHeight () / IMAGE, knob_blue, CPoint (0, 0));
+	getFrame()->addView (knobCentrePattern);
+    
+    //Centre Gain
+	r.offset(knob_mode2->getWidth()+cSep, 0);
+    knobCentreGain = new CAnimKnob (r, this, kCentreGain, IMAGE, knob_red_blue->getHeight () / IMAGE, knob_blue_red, CPoint (0, 0));
+	getFrame()->addView (knobCentreGain);
+    
+	
+	
+	
+    
+	
+	
+    //--CTextLabel--------------------------------------
+    //Label Mode
+    LabelSize (0, 0, knob_red_blue->getWidth (), tDepth);
+    LabelSize.offset (hPos+cSep, ePos+lOffset);
+    labelMode = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelMode->setFont (kNormalFontSmall);
+    labelMode->setFontColor (kLabelText);
+    labelMode->setBackColor (kBlank);
+    labelMode->setFrameColor (kBlank);
+    labelMode->setText("Mode");
+    getFrame()->addView (labelMode);
+	
+	//Label Width
+	LabelSize.offset (knob_red_blue->getWidth()+cSep, 0);
+    labelWidth = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelWidth->setFont (kNormalFontSmall);
+    labelWidth->setFontColor (kLabelText);
+    labelWidth->setBackColor (kBlank);
+    labelWidth->setFrameColor (kBlank);
+    labelWidth->setText("Width");
+    getFrame()->addView (labelWidth);
+	
+	//Label Pattern
+	LabelSize.offset (knob_red_blue->getWidth()+cSep, 0);
+    labelPattern = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelPattern->setFont (kNormalFontSmall);
+    labelPattern->setFontColor (kLabelText);
+    labelPattern->setBackColor (kBlank);
+    labelPattern->setFrameColor (kBlank);
+    labelPattern->setText("Pattern");
+    getFrame()->addView (labelPattern);
+	
+	//Label Surround Mode
+	LabelSize.offset (knob_mode2->getWidth()+cSep+10, 0);
+    labelSurMode = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelSurMode->setFont (kNormalFontSmall);
+    labelSurMode->setFontColor (kLabelText);
+    labelSurMode->setBackColor (kBlank);
+    labelSurMode->setFrameColor (kBlank);
+    labelSurMode->setText("SurMode");
+    getFrame()->addView (labelSurMode);
+	
+	//Label Surround Width
+	LabelSize.offset (knob_red_blue->getWidth()+cSep, 0);
+    labelSurWidth = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelSurWidth->setFont (kNormalFontSmall);
+    labelSurWidth->setFontColor (kLabelText);
+    labelSurWidth->setBackColor (kBlank);
+    labelSurWidth->setFrameColor (kBlank);
+    labelSurWidth->setText("SurWidth");
+    getFrame()->addView (labelSurWidth);
+    
+    //Label Surround Pattern
+	LabelSize.offset (knob_red_blue->getWidth()+cSep, 0);
+    labelSurPattern = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelSurPattern->setFont (kNormalFontSmall);
+    labelSurPattern->setFontColor (kLabelText);
+    labelSurPattern->setBackColor (kBlank);
+    labelSurPattern->setFrameColor (kBlank);
+    labelSurPattern->setText("SurPattern");
+    getFrame()->addView (labelSurPattern);
+    
+    //Label Surround Gain
+	LabelSize.offset (knob_red_blue->getWidth()+cSep, 0);
+    labelSurGain = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelSurGain->setFont (kNormalFontSmall);
+    labelSurGain->setFontColor (kLabelText);
+    labelSurGain->setBackColor (kBlank);
+    labelSurGain->setFrameColor (kBlank);
+    labelSurGain->setText("SurGain");
+    getFrame()->addView (labelSurGain);
+    
+    
+    
+    //Label Centre Pattern
+    LabelSize(0, 0, knob_mode2->getWidth (), tDepth);
+	LabelSize.offset(hPos2+2*cSep+knob_mode2->getWidth (), ePos2+lOffset);
+    labelCtrPattern = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelCtrPattern->setFont (kNormalFontSmall);
+    labelCtrPattern->setFontColor (kLabelText);
+    labelCtrPattern->setBackColor (kBlank);
+    labelCtrPattern->setFrameColor (kBlank);
+    labelCtrPattern->setText("CtrPattern");
+    getFrame()->addView (labelCtrPattern);
+    
+    //Label Centre Gain
+    LabelSize.offset (knob_red_blue->getWidth()+cSep, 0);
+    labelCtreGain = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelCtreGain->setFont (kNormalFontSmall);
+    labelCtreGain->setFontColor (kLabelText);
+    labelCtreGain->setBackColor (kBlank);
+    labelCtreGain->setFrameColor (kBlank);
+    labelCtreGain->setText("CtrGain");
+    getFrame()->addView (labelCtreGain);
+	
+	
+	
+	
+    
+	
+	//Label Section
+    LabelSize (0, 0, bControls2->getWidth(), tDepthLarge);
+    LabelSize.offset (hPos2, ePos2+tOffset);
+    decoderLabel1 = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    decoderLabel1->setFont (kNormalFontBig);
+    decoderLabel1->setFontColor (kLabelText);
+    decoderLabel1->setBackColor (kBlank);
+    decoderLabel1->setFrameColor (kBlank);
+    decoderLabel1->setText("5.0 Decoding");
+    getFrame()->addView (decoderLabel1);
+	
+	
+	
+    
+	//--CTextLabel--------------------------------------
+	//Mode Value
+	DisplaySize (0, 0, knob_red_blue->getWidth (), tDepth);
+	DisplaySize.offset (hPos+cSep, ePos+pOffset);
+	paramMode = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramMode->setHoriAlign(kCenterText);
+	paramMode->setFont (kNormalFontVerySmall);
+	paramMode->setFontColor (kDisplayText);
+	paramMode->setBackColor (kDisplayBackground);
+	paramMode->setFrameColor (kBlackCColor);
+	getFrame()->addView (paramMode);
+    
+	
+	//Width Value
+	DisplaySize.offset (knob_red_blue->getWidth()+cSep, 0);
+	paramWidth = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramWidth->setHoriAlign(kCenterText);
+	paramWidth->setFont (kNormalFontVerySmall);
+	paramWidth->setFontColor (kDisplayText);
+	paramWidth->setBackColor (kDisplayBackground);
+	paramWidth->setFrameColor (kBlackCColor);
+	getFrame()->addView (paramWidth);
+    
+	
+	//Pattern Value
+	DisplaySize.offset (knob_red_blue->getWidth()+cSep, 0);
+	paramPattern = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramPattern->setHoriAlign(kCenterText);
+	paramPattern->setFont (kNormalFontVerySmall);
+	paramPattern->setFontColor (kDisplayText);
+	paramPattern->setBackColor (kDisplayBackground);
+	paramPattern->setFrameColor (kBlackCColor);
+	getFrame()->addView (paramPattern);
+    
+    
+	//SurMode Value
+	DisplaySize.offset (knob_mode2->getWidth()+cSep+10, 0);
+	paramSurMode = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramSurMode->setHoriAlign(kCenterText);
+	paramSurMode->setFont (kNormalFontVerySmall);
+	paramSurMode->setFontColor (kDisplayText);
+	paramSurMode->setBackColor (kDisplayBackground);
+	paramSurMode->setFrameColor (kBlackCColor);
+	getFrame()->addView (paramSurMode);
+    
+	
+	//SurWidth Value
+	DisplaySize.offset (knob_red_blue->getWidth()+cSep, 0);
+	paramSurWidth = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramSurWidth->setHoriAlign(kCenterText);
+	paramSurWidth->setFont (kNormalFontVerySmall);
+	paramSurWidth->setFontColor (kDisplayText);
+	paramSurWidth->setBackColor (kDisplayBackground);
+	paramSurWidth->setFrameColor (kBlackCColor);
+	getFrame()->addView (paramSurWidth);
+    
+    //SurPattern Value
+	DisplaySize.offset (knob_red_blue->getWidth()+cSep, 0);
+	paramSurPattern = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramSurPattern->setHoriAlign(kCenterText);
+	paramSurPattern->setFont (kNormalFontVerySmall);
+	paramSurPattern->setFontColor (kDisplayText);
+	paramSurPattern->setBackColor (kDisplayBackground);
+	paramSurPattern->setFrameColor (kBlackCColor);
+	getFrame()->addView (paramSurPattern);
+    
+    //SurWidth Value
+	DisplaySize.offset (knob_red_blue->getWidth()+cSep, 0);
+	paramSurGain = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramSurGain->setHoriAlign(kCenterText);
+	paramSurGain->setFont (kNormalFontVerySmall);
+	paramSurGain->setFontColor (kDisplayText);
+	paramSurGain->setBackColor (kDisplayBackground);
+	paramSurGain->setFrameColor (kBlackCColor);
+	getFrame()->addView (paramSurGain);
+    
+    
+    
+    //CtrPattern Value
+    DisplaySize(0, 0, knob_mode2->getWidth (), tDepth);
+	DisplaySize.offset(hPos2+2*cSep+knob_mode2->getWidth (), ePos2+pOffset);
+	paramCtrPattern = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramCtrPattern->setHoriAlign(kCenterText);
+	paramCtrPattern->setFont (kNormalFontVerySmall);
+	paramCtrPattern->setFontColor (kDisplayText);
+	paramCtrPattern->setBackColor (kDisplayBackground);
+	paramCtrPattern->setFrameColor (kBlackCColor);
+	getFrame()->addView (paramCtrPattern);
+    
+    
+    //CtrGain Value
+	DisplaySize.offset(knob_red_blue->getWidth()+cSep, 0);
+	paramCtrGain = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramCtrGain->setHoriAlign(kCenterText);
+	paramCtrGain->setFont (kNormalFontVerySmall);
+	paramCtrGain->setFontColor (kDisplayText);
+	paramCtrGain->setBackColor (kDisplayBackground);
+	paramCtrGain->setFrameColor (kBlackCColor);
+	getFrame()->addView (paramCtrGain);
+    
+    
+    controls[kMode] = knobMode;
+	controls[kWidth] = knobWidth;
+	controls[kPattern] = knobPattern;
+	//controls[kRearVerb] = knobRearVerb;
+	//controls[kHiVerb] = knobHiVerb;
+    controls[kCentrePattern] = knobCentrePattern;
+    controls[kCentreGain] =knobCentreGain;
+    //controls[kSubGain] = knobSubGain;
+    //controls[kFc] = knobFc;
+    controls[kSurroundMode] = knobSurroundMode;
+    controls[kSurroundPattern] = knobSurroundPattern;
+    controls[kSurroundWidth] = knobSurroundWidth;
+    controls[kSurroundGain] = knobSurroundGain;
+}
+
+
+
+
+
+
+//------------------------------------------------------------------------------------
+void MyEditor::fiveoneDisplay()
+{
+    //FIRST OFF - define a top coordinate
+    int hPos = cSep;
+    int ePos = 288;
+    int hPos2 = cSep+37;
+    int ePos2 = 150;
+    
+    
+    bControls = new CBitmap ("controls.png");
+    CRect controlSize = CRect (0, 0, bControls->getWidth (),bControls->getHeight ());
+    controlSize.offset(cSep, cSep+(cSep+bControls->getHeight())*2);
+	control_view = new CView (controlSize);
+    control_view->setBackground (bControls);
+    getFrame()->addView (control_view);
+    
+    
+    bControls2 = new CBitmap ("controls2.png");
+    controlSize = CRect (0, 0, bControls2->getWidth (),bControls2->getHeight ());
+    controlSize.offset(hPos2, ePos2);
+	control_view2 = new CView (controlSize);
+    control_view2->setBackground (bControls2);
+    getFrame()->addView (control_view2);
+    
+    
+    
+	//Mode
+	r (0, 0, knob_mode2->getWidth (), knob_mode2->getHeight () / 2);
+	r.offset(hPos+cSep,ePos+kOffset);
+	knobMode = new CHorizontalSwitch (r, this, kMode, 2, knob_mode2->getHeight () / 2, 2, knob_mode2, CPoint (0, 0));
+	getFrame()->addView (knobMode);
+	
+	//Width
+	r.offset(knob_mode2->getWidth()+cSep, 0);
+	knobWidth = new CAnimKnob (r, this, kWidth, IMAGE, knob_red->getHeight () / IMAGE, knob_red, CPoint (0, 0));
+	getFrame()->addView (knobWidth);
+	
+	//Pattern
+	r.offset(knob_mode2->getWidth()+cSep, 0);
+	knobPattern = new CAnimKnob (r, this, kPattern, IMAGE, knob_blue->getHeight () / IMAGE, knob_blue, CPoint (0, 0));
+	getFrame()->addView (knobPattern);
+    
+    
+    //Surround Mode
+	r.offset(knob_mode2->getWidth()+cSep+10, 0);
+	knobSurroundMode = new CHorizontalSwitch (r, this, kSurroundMode, 2, knob_mode2->getHeight () / 2, 2, knob_mode2, CPoint (0, 0));
+	getFrame()->addView (knobSurroundMode);
+    
+	//Surround Width
+    r.offset(knob_mode2->getWidth()+cSep, 0);
+    knobSurroundWidth = new CAnimKnob (r, this, kSurroundWidth, IMAGE, knob_red_blue->getHeight () / IMAGE, knob_red, CPoint (0, 0));
+	getFrame()->addView (knobSurroundWidth);
+	
+	//Surround Pattern
+	r.offset(knob_mode2->getWidth()+cSep, 0);
+	knobSurroundPattern = new CAnimKnob (r, this, kSurroundPattern, IMAGE, knob_blue->getHeight () / IMAGE, knob_blue, CPoint (0, 0));
+	getFrame()->addView (knobSurroundPattern);
+    
+    //Surround Gain
+	r.offset(knob_mode2->getWidth()+cSep, 0);
+	knobSurroundGain = new CAnimKnob (r, this, kSurroundGain, IMAGE, knob_blue->getHeight () / IMAGE, knob_blue_red, CPoint (0, 0));
+	getFrame()->addView (knobSurroundGain);
+    
+    
+    
+    
+    
+    //Centre Pattern
+    r (0, 0, knob_mode2->getWidth (), knob_mode2->getHeight () / 2);
+	r.offset(hPos2+cSep, ePos2+kOffset);
+    knobCentrePattern = new CAnimKnob (r, this, kCentrePattern, IMAGE, knob_red_blue->getHeight () / IMAGE, knob_blue, CPoint (0, 0));
+	getFrame()->addView (knobCentrePattern);
+    
+    //Centre Gain
+	r.offset(knob_mode2->getWidth()+cSep, 0);
+    knobCentreGain = new CAnimKnob (r, this, kCentreGain, IMAGE, knob_red_blue->getHeight () / IMAGE, knob_blue_red, CPoint (0, 0));
+	getFrame()->addView (knobCentreGain);
+    
+    //SubGain
+    r.offset(knob_mode2->getWidth()+cSep, 0);
+    knobSubGain = new CAnimKnob (r, this, kSubGain, IMAGE, knob_red_blue->getHeight () / IMAGE, knob_blue_red, CPoint (0, 0));
+	getFrame()->addView (knobSubGain);
+	
+	//FC
+	r.offset(knob_mode2->getWidth()+cSep, 0);
+	knobFc = new CAnimKnob (r, this, kFc, IMAGE, knob_red_blue->getHeight () / IMAGE, knob_blue, CPoint (0, 0));
+	getFrame()->addView (knobFc);
+	
+	
+	
+    
+	
+	
+    //--CTextLabel--------------------------------------
+    //Label Mode
+    LabelSize (0, 0, knob_red_blue->getWidth (), tDepth);
+    LabelSize.offset (hPos+cSep, ePos+lOffset);
+    labelMode = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelMode->setFont (kNormalFontSmall);
+    labelMode->setFontColor (kLabelText);
+    labelMode->setBackColor (kBlank);
+    labelMode->setFrameColor (kBlank);
+    labelMode->setText("Mode");
+    getFrame()->addView (labelMode);
+	
+	//Label Width
+	LabelSize.offset (knob_red_blue->getWidth()+cSep, 0);
+    labelWidth = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelWidth->setFont (kNormalFontSmall);
+    labelWidth->setFontColor (kLabelText);
+    labelWidth->setBackColor (kBlank);
+    labelWidth->setFrameColor (kBlank);
+    labelWidth->setText("Width");
+    getFrame()->addView (labelWidth);
+	
+	//Label Pattern
+	LabelSize.offset (knob_red_blue->getWidth()+cSep, 0);
+    labelPattern = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelPattern->setFont (kNormalFontSmall);
+    labelPattern->setFontColor (kLabelText);
+    labelPattern->setBackColor (kBlank);
+    labelPattern->setFrameColor (kBlank);
+    labelPattern->setText("Pattern");
+    getFrame()->addView (labelPattern);
+	
+	//Label Surround Mode
+	LabelSize.offset (knob_mode2->getWidth()+cSep+10, 0);
+    labelSurMode = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelSurMode->setFont (kNormalFontSmall);
+    labelSurMode->setFontColor (kLabelText);
+    labelSurMode->setBackColor (kBlank);
+    labelSurMode->setFrameColor (kBlank);
+    labelSurMode->setText("SurMode");
+    getFrame()->addView (labelSurMode);
+	
+	//Label Surround Width
+	LabelSize.offset (knob_red_blue->getWidth()+cSep, 0);
+    labelSurWidth = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelSurWidth->setFont (kNormalFontSmall);
+    labelSurWidth->setFontColor (kLabelText);
+    labelSurWidth->setBackColor (kBlank);
+    labelSurWidth->setFrameColor (kBlank);
+    labelSurWidth->setText("SurWidth");
+    getFrame()->addView (labelSurWidth);
+    
+    //Label Surround Pattern
+	LabelSize.offset (knob_red_blue->getWidth()+cSep, 0);
+    labelSurPattern = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelSurPattern->setFont (kNormalFontSmall);
+    labelSurPattern->setFontColor (kLabelText);
+    labelSurPattern->setBackColor (kBlank);
+    labelSurPattern->setFrameColor (kBlank);
+    labelSurPattern->setText("SurPattern");
+    getFrame()->addView (labelSurPattern);
+    
+    //Label Surround Gain
+	LabelSize.offset (knob_red_blue->getWidth()+cSep, 0);
+    labelSurGain = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelSurGain->setFont (kNormalFontSmall);
+    labelSurGain->setFontColor (kLabelText);
+    labelSurGain->setBackColor (kBlank);
+    labelSurGain->setFrameColor (kBlank);
+    labelSurGain->setText("SurGain");
+    getFrame()->addView (labelSurGain);
+    
+    
+    
+    //Label Centre Pattern
+    LabelSize(0, 0, knob_mode2->getWidth (), tDepth);
+	LabelSize.offset (hPos2+cSep, ePos2+lOffset);
+    labelCtrPattern = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelCtrPattern->setFont (kNormalFontSmall);
+    labelCtrPattern->setFontColor (kLabelText);
+    labelCtrPattern->setBackColor (kBlank);
+    labelCtrPattern->setFrameColor (kBlank);
+    labelCtrPattern->setText("CtrPattern");
+    getFrame()->addView (labelCtrPattern);
+    
+    //Label Centre Gain
+    LabelSize.offset (knob_red_blue->getWidth()+cSep, 0);
+    labelCtreGain = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelCtreGain->setFont (kNormalFontSmall);
+    labelCtreGain->setFontColor (kLabelText);
+    labelCtreGain->setBackColor (kBlank);
+    labelCtreGain->setFrameColor (kBlank);
+    labelCtreGain->setText("CtrGain");
+    getFrame()->addView (labelCtreGain);
+    
+    //Label SubGain
+    LabelSize.offset (knob_red_blue->getWidth()+cSep, 0);
+    labelSubGain = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelSubGain->setFont (kNormalFontSmall);
+    labelSubGain->setFontColor (kLabelText);
+    labelSubGain->setBackColor (kBlank);
+    labelSubGain->setFrameColor (kBlank);
+    labelSubGain->setText("SubGain");
+    getFrame()->addView (labelSubGain);
+	
+	//Label Fc
+	LabelSize.offset (knob_red_blue->getWidth()+cSep, 0);
+    labelFc = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelFc->setFont (kNormalFontSmall);
+    labelFc->setFontColor (kLabelText);
+    labelFc->setBackColor (kBlank);
+    labelFc->setFrameColor (kBlank);
+    labelFc->setText("xOver");
+    getFrame()->addView (labelFc);
+	
+	
+	
+	
+    
+	
+	//Label Section
+    LabelSize (0, 0, bControls2->getWidth(), tDepthLarge);
+    LabelSize.offset (hPos2, ePos2+tOffset);
+    decoderLabel1 = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    decoderLabel1->setFont (kNormalFontBig);
+    decoderLabel1->setFontColor (kLabelText);
+    decoderLabel1->setBackColor (kBlank);
+    decoderLabel1->setFrameColor (kBlank);
+    decoderLabel1->setText("5.1 Decoding");
+    getFrame()->addView (decoderLabel1);
+	
+	
+	
+    
+	//--CTextLabel--------------------------------------
+	//Mode Value
+	DisplaySize (0, 0, knob_red_blue->getWidth (), tDepth);
+	DisplaySize.offset (hPos+cSep, ePos+pOffset);
+	paramMode = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramMode->setHoriAlign(kCenterText);
+	paramMode->setFont (kNormalFontVerySmall);
+	paramMode->setFontColor (kDisplayText);
+	paramMode->setBackColor (kDisplayBackground);
+	paramMode->setFrameColor (kBlackCColor);
+	getFrame()->addView (paramMode);
+    
+	
+	//Width Value
+	DisplaySize.offset (knob_red_blue->getWidth()+cSep, 0);
+	paramWidth = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramWidth->setHoriAlign(kCenterText);
+	paramWidth->setFont (kNormalFontVerySmall);
+	paramWidth->setFontColor (kDisplayText);
+	paramWidth->setBackColor (kDisplayBackground);
+	paramWidth->setFrameColor (kBlackCColor);
+	getFrame()->addView (paramWidth);
+    
+	
+	//Pattern Value
+	DisplaySize.offset (knob_red_blue->getWidth()+cSep, 0);
+	paramPattern = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramPattern->setHoriAlign(kCenterText);
+	paramPattern->setFont (kNormalFontVerySmall);
+	paramPattern->setFontColor (kDisplayText);
+	paramPattern->setBackColor (kDisplayBackground);
+	paramPattern->setFrameColor (kBlackCColor);
+	getFrame()->addView (paramPattern);
+    
+    
+	//SurMode Value
+	DisplaySize.offset (knob_mode2->getWidth()+cSep+10, 0);
+	paramSurMode = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramSurMode->setHoriAlign(kCenterText);
+	paramSurMode->setFont (kNormalFontVerySmall);
+	paramSurMode->setFontColor (kDisplayText);
+	paramSurMode->setBackColor (kDisplayBackground);
+	paramSurMode->setFrameColor (kBlackCColor);
+	getFrame()->addView (paramSurMode);
+    
+	
+	//SurWidth Value
+	DisplaySize.offset (knob_red_blue->getWidth()+cSep, 0);
+	paramSurWidth = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramSurWidth->setHoriAlign(kCenterText);
+	paramSurWidth->setFont (kNormalFontVerySmall);
+	paramSurWidth->setFontColor (kDisplayText);
+	paramSurWidth->setBackColor (kDisplayBackground);
+	paramSurWidth->setFrameColor (kBlackCColor);
+	getFrame()->addView (paramSurWidth);
+    
+    //SurPattern Value
+	DisplaySize.offset (knob_red_blue->getWidth()+cSep, 0);
+	paramSurPattern = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramSurPattern->setHoriAlign(kCenterText);
+	paramSurPattern->setFont (kNormalFontVerySmall);
+	paramSurPattern->setFontColor (kDisplayText);
+	paramSurPattern->setBackColor (kDisplayBackground);
+	paramSurPattern->setFrameColor (kBlackCColor);
+	getFrame()->addView (paramSurPattern);
+    
+    //SurWidth Value
+	DisplaySize.offset (knob_red_blue->getWidth()+cSep, 0);
+	paramSurGain = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramSurGain->setHoriAlign(kCenterText);
+	paramSurGain->setFont (kNormalFontVerySmall);
+	paramSurGain->setFontColor (kDisplayText);
+	paramSurGain->setBackColor (kDisplayBackground);
+	paramSurGain->setFrameColor (kBlackCColor);
+	getFrame()->addView (paramSurGain);
+    
+    
+    
+    //CtrPattern Value
+    DisplaySize(0, 0, knob_mode2->getWidth (), tDepth);
+	DisplaySize.offset(hPos2+cSep, ePos2+pOffset);
+	paramCtrPattern = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramCtrPattern->setHoriAlign(kCenterText);
+	paramCtrPattern->setFont (kNormalFontVerySmall);
+	paramCtrPattern->setFontColor (kDisplayText);
+	paramCtrPattern->setBackColor (kDisplayBackground);
+	paramCtrPattern->setFrameColor (kBlackCColor);
+	getFrame()->addView (paramCtrPattern);
+    
+    
+    //CtrGain Value
+	DisplaySize.offset(knob_red_blue->getWidth()+cSep, 0);
+	paramCtrGain = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramCtrGain->setHoriAlign(kCenterText);
+	paramCtrGain->setFont (kNormalFontVerySmall);
+	paramCtrGain->setFontColor (kDisplayText);
+	paramCtrGain->setBackColor (kDisplayBackground);
+	paramCtrGain->setFrameColor (kBlackCColor);
+	getFrame()->addView (paramCtrGain);
+    
+    
+    //SubGain Value
+    DisplaySize.offset (knob_red_blue->getWidth()+cSep, 0);
+	paramSubGain = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramSubGain->setHoriAlign(kCenterText);
+	paramSubGain->setFont (kNormalFontVerySmall);
+	paramSubGain->setFontColor (kDisplayText);
+	paramSubGain->setBackColor (kDisplayBackground);
+	paramSubGain->setFrameColor (kBlackCColor);
+	getFrame()->addView (paramSubGain);
+    
+	
+	//Fc Value
+	DisplaySize.offset (knob_red_blue->getWidth()+cSep, 0);
+	paramFc = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramFc->setHoriAlign(kCenterText);
+	paramFc->setFont (kNormalFontVerySmall);
+	paramFc->setFontColor (kDisplayText);
+	paramFc->setBackColor (kDisplayBackground);
+	paramFc->setFrameColor (kBlackCColor);
+	getFrame()->addView (paramFc);
+    
+    controls[kMode] = knobMode;
+	controls[kWidth] = knobWidth;
+	controls[kPattern] = knobPattern;
+	//controls[kRearVerb] = knobRearVerb;
+	//controls[kHiVerb] = knobHiVerb;
+    controls[kCentrePattern] = knobCentrePattern;
+    controls[kCentreGain] =knobCentreGain;
+    controls[kSubGain] = knobSubGain;
+    controls[kFc] = knobFc;
+    controls[kSurroundMode] = knobSurroundMode;
+    controls[kSurroundPattern] = knobSurroundPattern;
+    controls[kSurroundWidth] = knobSurroundWidth;
+    controls[kSurroundGain] = knobSurroundGain;
+}
+
+
+
+//------------------------------------------------------------------------------------
+void MyEditor::hellerDisplay()
+{
+    heller1 = new CTextLabel(control_view->getViewSize(), 0, 0, kCenterText);
+	heller1->setBackColor(CColor(23,25,26,200));
+    heller1->setFont (kNormalFontVeryBig);
+    heller1->setFontColor (CColor (255,255,255,255));
+    if (myPlot->decoder_mode5x==1) {
+        heller1->setText("Heller 1 Decoder");
+    }
+    else if (myPlot->decoder_mode5x==2){
+        heller1->setText("Heller 2 Decoder");
+    }
+    getFrame()->addView (heller1);
+    
+    heller2 = new CTextLabel(control_view2->getViewSize(), 0, 0, kCenterText);
+	heller2->setBackColor(CColor(23,25,26,200));
+    heller2->setFont (kNormalFontVeryBig);
+    heller2->setFontColor (CColor (255,255,255,255));
+    getFrame()->addView (heller2);
+};
+
+
+
+//------------------------------------------------------------------------------------
+void MyEditor::nameDisplay(CFrame* newFrame)
+{
+    //FIRST OFF - define a top coordinate
+    int hPos = cSep;
+    int ePos = 426;
+    
+    
     bName = new CBitmap ("my_name.png");
     
     
     CRect nameSize = CRect (0, 0, bName->getWidth (),bName->getHeight ());
-    nameSize.offset(nameHoz-nameSep/2, nameEl+knob_mode2->getHeight()/2+displayOffset+textDepth+nameSep/2);
+    nameSize.offset(hPos, ePos);
 	CView* name_view = new CView (nameSize);
     name_view->setBackground (bName);
     newFrame->addView (name_view);
     
-    LabelSize (0, 0, 160, textDepth); 
-    LabelSize.offset(nameHoz, nameEl+knob_mode2->getHeight()/2+displayOffset+textDepth+nameSep/2+40);
-    //LabelSize.offset (nameHoz, nameEl+labelOffset);
+    LabelSize (0, 0, 160, tDepth);
+    LabelSize.offset(hPos+cSep, ePos+cSep+tDepth+10);
     CTextLabel *vendor_version = new CTextLabel(LabelSize, 0, 0, kLeftText);
     
     char text[100];
@@ -677,10 +1814,9 @@
     newFrame->addView (vendor_version);
     vendor_version->forget();
     
-    LabelSize.offset(0, -20);
+    LabelSize.offset(0, -(tDepth+10));
     bitMode = new CTextLabel(LabelSize, 0, 0, kLeftText);
-    int b = effect->getParameter(102);
-    sprintf(text,"Bit Mode: %d", b);
+    sprintf(text,"Bit Mode: %d", (int)effect->getParameter(102));
     bitMode->setText(text);
     bitMode->setFont (kNormalFontSmall); 
     bitMode->setFontColor (kLabelText); 
@@ -696,59 +1832,67 @@
 
 
 //------------------------------------------------------------------------------------
-void MyEditor::plotDisplay(int &plotHoz, int &plotEl, int &plotSep, CFrame* newFrame)
+void MyEditor::plotDisplay(CFrame* newFrame)
 {
-    CRect plotArea (0, 0, bZoom->getWidth (),bZoom->getHeight ());
-    plotArea.offset(plotHoz-plotSep/2, plotEl+labelOffset-textDepthLarge);
+    //FIRST OFF - define a top coordinate
+    int hPos = 264;
+    int ePos = cSep;
+    
+    bPlot = new CBitmap ("plot.png");
+    
+    
+    CRect plotArea (0, 0, bPlot->getWidth (),bPlot->getHeight ());
+    plotArea.offset(hPos, ePos);
     CView* plotBackground = new CView (plotArea);
-    plotBackground->setBackground(bZoom);
+    plotBackground->setBackground(bPlot);
     newFrame->addView (plotBackground);
 	
     
-    CRect plotSize (0, 0, bZoom->getWidth (), bZoom->getHeight ());
-    plotSize.offset(plotHoz-plotSep/2, plotEl+labelOffset-textDepthLarge);
+    CRect plotSize (0, 0, bPlot->getWidth (), bPlot->getHeight ());
+    plotSize.offset(hPos, ePos);
     myPlot = new polarPlot(plotSize);
-    //myPlot->setBackground(bRotations);
-    //myPlot->setDirty();
     newFrame->addView (myPlot);
     
 }
 
 
 //------------------------------------------------------------------------------------
-void MyEditor::settingsDisplay(int &settingsHoz, int &settingsEl, int &settingsSep, CFrame* newFrame)
+void MyEditor::settingsDisplay(CFrame* newFrame)
 {
-    CRect plotArea (0, 0, bRotations->getWidth (),bRotations->getHeight ());
-    plotArea.offset(settingsHoz-settingsSep/2, settingsEl+labelOffset-textDepthLarge);
+    //FIRST OFF - define a top coordinate
+    int hPos = 402;
+    int ePos = 150;
+    
+    bSettings = new CBitmap ("zoom.png");
+    
+    CRect plotArea (0, 0, bSettings->getWidth (),bSettings->getHeight ());
+    plotArea.offset(hPos, ePos);
     CView* settingsBackground = new CView (plotArea);
-    settingsBackground->setBackground(bRotations);
+    settingsBackground->setBackground(bSettings);
     newFrame->addView (settingsBackground);
-	
-    
-    //Label Section
-    LabelSize (0, 0, bRotations->getWidth (), textDepthLarge);
-    LabelSize.offset (settingsHoz-settingsSep/2, settingsEl+labelOffset - textDepthLarge);
-    CTextLabel* labelSettings = new CTextLabel (LabelSize, 0, 0, kCenterText);
-    labelSettings->setFont (kNormalFontBig);
-    labelSettings->setFontColor (kLabelText);
-    labelSettings->setBackColor (kBlank);
-    labelSettings->setFrameColor (kBlank);
-    labelSettings->setText("Settings");
-    newFrame->addView (labelSettings);
-    
+
     
    
     //Decoder Mode Knob
 	r (0, 0, knob_mode5->getWidth (), knob_mode5->getHeight () / 5);
-	r.offset(settingsHoz, settingsEl);
+	r.offset(hPos+cSep, ePos+kOffset);
 	knobDecoder = new CHorizontalSwitch (r, this, kDecoderMode, 5, knob_mode5->getHeight () / 5, 5, knob_mode5, CPoint (0, 0));
 	newFrame->addView (knobDecoder);
 	knobDecoder->forget ();
     
     
+    //Channel Order Knob
+	r.offset(knob_mode5->getWidth()+cSep, 0);
+	knobChannel = new CHorizontalSwitch (r, this, kChannelOrder, 2, knob_mode2b->getHeight () / 2, 2, knob_mode2b, CPoint (0, 0));
+	newFrame->addView (knobChannel);
+	knobChannel->forget ();
+    
+    
+    
+    
     //Label Decoder Mode
-    LabelSize (0, 0, knob_mode5->getWidth (), textDepth);
-    LabelSize.offset (settingsHoz, settingsEl+labelOffset);
+    LabelSize (0, 0, knob_mode5->getWidth (), tDepth);
+    LabelSize.offset (hPos+cSep, ePos+lOffset);
     CTextLabel* labelDecoder = new CTextLabel (LabelSize, 0, 0, kCenterText);
     labelDecoder->setFont (kNormalFontSmall);
     labelDecoder->setFontColor (kLabelText);
@@ -757,9 +1901,23 @@
     labelDecoder->setText("Decoding");
     newFrame->addView (labelDecoder);
     
+    //Label Channel Order
+    LabelSize.offset (knob_mode5->getWidth ()+cSep, 0);
+    CTextLabel* labelChannel = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelChannel->setFont (kNormalFontSmall);
+    labelChannel->setFontColor (kLabelText);
+    labelChannel->setBackColor (kBlank);
+    labelChannel->setFrameColor (kBlank);
+    labelChannel->setText("Channels");
+    newFrame->addView (labelChannel);
+    
+    
+    
+    
+    
     //Decoder Mode Value
-	DisplaySize (0, 0, knob_mode5->getWidth (), textDepth);
-	DisplaySize.offset (settingsHoz, settingsEl+knob_mode5->getHeight()/5);
+	DisplaySize (0, 0, knob_mode5->getWidth (), tDepth);
+	DisplaySize.offset (hPos+cSep, ePos+pOffset);
 	paramDecoder = new CTextLabel (DisplaySize, 0, 0, kCenterText);
 	paramDecoder->setHoriAlign(kCenterText);
 	paramDecoder->setFont (kNormalFontVerySmall);
@@ -767,41 +1925,406 @@
 	paramDecoder->setBackColor (kDisplayBackground);
 	paramDecoder->setFrameColor (kBlackCColor);
 	newFrame->addView (paramDecoder);
-    paramDecoder->forget();
     
     
-//    //--COptionMenu--------------------------------------
-//	CRect size (0, 0, 50, 14);
-//	size.offset (settingsHoz, settingsEl);
-//    
-//	long style = k3DIn | kMultipleCheckStyle;
-//	settingsMenu = new COptionMenu (size, this, kDecoderMode, 0, 0, style);
-//	if (settingsMenu)
-//	{
-//		settingsMenu->setFont (kNormalFontSmall);
-//		settingsMenu->setFontColor (kLabelText);
-//		settingsMenu->setBackColor (kWhiteCColor);
-//		settingsMenu->setFrameColor (kLabelText);
-//		settingsMenu->setHoriAlign (kLeftText);
-//        settingsMenu->addEntry ("Stereo");//2
-//        settingsMenu->addEntry ("2.1");//3
-//        settingsMenu->addEntry ("LCRS");//4
-//        settingsMenu->addEntry ("5.0");//5
-//        settingsMenu->addEntry ("5.1");//6
-//
-//        
-//		newFrame->addView (settingsMenu);
-//	}
+    //Channel Order Value
+	DisplaySize.offset (knob_mode5->getWidth ()+cSep, 0);
+	paramChannel = new CTextLabel (DisplaySize, 0, 0, kCenterText);
+	paramChannel->setHoriAlign(kCenterText);
+	paramChannel->setFont (kNormalFontVerySmall);
+	paramChannel->setFontColor (kDisplayText);
+	paramChannel->setBackColor (kDisplayBackground);
+	paramChannel->setFrameColor (kBlackCColor);
+	newFrame->addView (paramChannel);
+    
+    
+    
+    //Label Section
+    LabelSize (0, 0, bSettings->getWidth (), tDepthLarge);
+    LabelSize.offset (hPos, ePos+tOffset);
+    CTextLabel* labelSettings = new CTextLabel (LabelSize, 0, 0, kCenterText);
+    labelSettings->setFont (kNormalFontBig);
+    labelSettings->setFontColor (kLabelText);
+    labelSettings->setBackColor (kBlank);
+    labelSettings->setFrameColor (kBlank);
+    labelSettings->setText("Settings");
+    newFrame->addView (labelSettings);    
+}
+
+
+
+//------------------------------------------------------------------------------------
+void MyEditor::setupKnobs(int &setupHoz, int &setupEl, int &setupSep)
+{
+    
+    //DEFAULT STEREO POSITIONS
+    
+    //Mode
+	r (0, 0, knob_mode2->getWidth (), knob_mode2->getHeight () / 2);
+	r.offset(setupHoz, setupEl);
+	knobMode = new CHorizontalSwitch (r, this, kMode, 2, knob_mode2->getHeight () / 2, 2, knob_mode2, CPoint (0, 0));
+	//newFrame->addView (knobMode);
+	//knobMode->forget ();
+	
+	//Width
+	r.offset(knob_mode2->getWidth()+setupSep, 0);
+	knobWidth = new CAnimKnob (r, this, kWidth, IMAGE, knob_red->getHeight () / IMAGE, knob_red, CPoint (0, 0));
+	//newFrame->addView (knobWidth);
+	//knobWidth->forget ();
+	
+	//Pattern
+	r.offset(knob_red_blue->getWidth()+setupSep, 0);
+	knobPattern = new CAnimKnob (r, this, kPattern, IMAGE, knob_blue->getHeight () / IMAGE, knob_blue, CPoint (0, 0));
+	//newFrame->addView (knobPattern);
+	//knobPattern->forget ();
+	
+	//RearVerb
+	r.offset(knob_mode2->getWidth()+setupSep*4, 0);
+	knobRearVerb = new CAnimKnob (r, this, kRearVerb, IMAGE, knob_red_blue->getHeight () / IMAGE, knob_red, CPoint (0, 0));
+	//newFrame->addView (knobRearVerb);
+	//knobRearVerb->forget ();
+	
+	//HiVerb
+	r.offset(knob_red_blue->getWidth()+setupSep, 0);
+	knobHiVerb = new CAnimKnob (r, this, kHiVerb, IMAGE, knob_red_blue->getHeight () / IMAGE, knob_blue, CPoint (0, 0));
+	//newFrame->addView (knobHiVerb);
+	//knobHiVerb->forget ();
+    
+    
+    
+    //DEFAULT SURROUND POSITIONS
+    
+    //CentrePattern
+	r (0, 0, knob_mode2->getWidth (), knob_mode2->getHeight () / 2);
+	r.offset(setupHoz+knob_mode2->getWidth ()*3+setupSep/2*3, setupEl);
+	knobCentrePattern = new CAnimKnob (r, this, kCentrePattern, IMAGE, knob_red_blue->getHeight () / IMAGE, knob_blue, CPoint (0, 0));
+    
+    //CentreGain
+	r.offset(knob_red_blue->getWidth()+setupSep/2, 0);
+	knobCentreGain = new CAnimKnob (r, this, kCentreGain, IMAGE, knob_red_blue->getHeight () / IMAGE, knob_blue_red, CPoint (0, 0));
+    
+    //SubGain
+	r.offset(knob_red_blue->getWidth()+setupSep/2, 0);
+	knobSubGain = new CAnimKnob (r, this, kSubGain, IMAGE, knob_red_blue->getHeight () / IMAGE, knob_blue_red, CPoint (0, 0));
+    
+    //Fc
+	r.offset(knob_red_blue->getWidth()+setupSep, 0);
+	knobFc = new CAnimKnob (r, this, kFc, IMAGE, knob_red_blue->getHeight () / IMAGE, knob_blue, CPoint (0, 0));
+    
+    //SurroundMode
+    knobSurroundMode = new CHorizontalSwitch (r, this, kSurroundMode, 2, knob_mode2->getHeight () / 2, 2, knob_mode2, CPoint (0, 0));
+    
+    //SurroundPattern
+	r.offset(knob_red_blue->getWidth()+setupSep, 0);
+	knobSurroundPattern = new CAnimKnob (r, this, kSurroundPattern, IMAGE, knob_red_blue->getHeight () / IMAGE, knob_blue, CPoint (0, 0));
+    
+    //SurroundWidth
+	r.offset(knob_red_blue->getWidth()+setupSep, 0);
+	knobSurroundWidth = new CAnimKnob (r, this, kSurroundWidth, IMAGE, knob_red_blue->getHeight () / IMAGE, knob_blue, CPoint (0, 0));
+    
+    //SurroundGain
+	r.offset(knob_red_blue->getWidth()+setupSep, 0);
+	knobSurroundGain = new CAnimKnob (r, this, kSurroundGain, IMAGE, knob_red_blue->getHeight () / IMAGE, knob_blue_red, CPoint (0, 0));
     
     
 }
 
 
+
+
+//------------------------------------------------------------------------------------
+void MyEditor::clearStereo()
+{
+    //Section Title
+    getFrame()->removeView(decoderLabel1);
+    //Knob Titles
+    getFrame()->removeView(labelMode);
+    getFrame()->removeView(labelWidth);
+    getFrame()->removeView(labelPattern);
+    getFrame()->removeView(labelRearVerb);
+    getFrame()->removeView(labelHiVerb);
+    //Knob Parameter Values
+    getFrame()->removeView(paramMode);
+    getFrame()->removeView(paramWidth);
+    getFrame()->removeView(paramPattern);
+    getFrame()->removeView(paramRearVerb);
+    getFrame()->removeView(paramHiVerb);
+    //Knobs
+    getFrame()->removeView(knobWidth);
+    getFrame()->removeView(knobPattern);
+    getFrame()->removeView(knobMode);
+    getFrame()->removeView(knobRearVerb);
+    getFrame()->removeView(knobHiVerb);
+    //Section background
+    getFrame()->removeView(control_view);
+}
+
+
+//------------------------------------------------------------------------------------
+void MyEditor::clearTwoOne()
+{
+    //Section Title
+    getFrame()->removeView(decoderLabel1);
+    //Knob Titles
+    getFrame()->removeView(labelMode);
+    getFrame()->removeView(labelWidth);
+    getFrame()->removeView(labelPattern);
+    getFrame()->removeView(labelRearVerb);
+    getFrame()->removeView(labelHiVerb);
+    getFrame()->removeView(labelSubGain);
+    getFrame()->removeView(labelFc);
+    //Knob Parameter Values
+    getFrame()->removeView(paramMode);
+    getFrame()->removeView(paramWidth);
+    getFrame()->removeView(paramPattern);
+    getFrame()->removeView(paramRearVerb);
+    getFrame()->removeView(paramHiVerb);
+    getFrame()->removeView(paramSubGain);
+    getFrame()->removeView(paramFc);
+    
+    //Knobs
+    getFrame()->removeView(knobWidth);
+    getFrame()->removeView(knobPattern);
+    getFrame()->removeView(knobMode);
+    getFrame()->removeView(knobRearVerb);
+    getFrame()->removeView(knobHiVerb);
+    getFrame()->removeView(knobSubGain);
+    getFrame()->removeView(knobFc);
+    //Section background
+    getFrame()->removeView(control_view);
+    getFrame()->removeView(control_view2);
+}
+
+
+//------------------------------------------------------------------------------------
+void MyEditor::clearFive()
+{
+    //Section Title
+    getFrame()->removeView(decoderLabel1);
+    //Knob Titles
+    getFrame()->removeView(labelMode);
+    getFrame()->removeView(labelWidth);
+    getFrame()->removeView(labelPattern);
+    getFrame()->removeView(labelSurMode);
+    getFrame()->removeView(labelSurWidth);
+    getFrame()->removeView(labelSurPattern);
+    getFrame()->removeView(labelSurGain);
+    getFrame()->removeView(labelCtrPattern);
+    getFrame()->removeView(labelCtreGain);
+    //Knob Parameter Values
+    getFrame()->removeView(paramMode);
+    getFrame()->removeView(paramWidth);
+    getFrame()->removeView(paramPattern);
+    getFrame()->removeView(paramSurMode);
+    getFrame()->removeView(paramSurWidth);
+    getFrame()->removeView(paramSurPattern);
+    getFrame()->removeView(paramSurGain);
+    getFrame()->removeView(paramCtrPattern);
+    getFrame()->removeView(paramCtrGain);
+    //Knobs
+    getFrame()->removeView(knobWidth);
+    getFrame()->removeView(knobPattern);
+    getFrame()->removeView(knobMode);
+    getFrame()->removeView(knobSurroundMode);
+    getFrame()->removeView(knobSurroundWidth);
+    getFrame()->removeView(knobSurroundPattern);
+    getFrame()->removeView(knobSurroundGain);
+    getFrame()->removeView(knobCentrePattern);
+    getFrame()->removeView(knobCentreGain);
+    //Section background
+    getFrame()->removeView(control_view);
+    getFrame()->removeView(control_view2);
+}
+
+
+
+//------------------------------------------------------------------------------------
+void MyEditor::clearFour()
+{
+    //Section Title
+    getFrame()->removeView(decoderLabel1);
+    //Knob Titles
+    getFrame()->removeView(labelMode);
+    getFrame()->removeView(labelWidth);
+    getFrame()->removeView(labelPattern);
+    getFrame()->removeView(labelSurMode);
+    getFrame()->removeView(labelSurWidth);
+    getFrame()->removeView(labelSurPattern);
+    getFrame()->removeView(labelSurGain);
+    //Knob Parameter Values
+    getFrame()->removeView(paramMode);
+    getFrame()->removeView(paramWidth);
+    getFrame()->removeView(paramPattern);
+    getFrame()->removeView(paramSurMode);
+    getFrame()->removeView(paramSurWidth);
+    getFrame()->removeView(paramSurPattern);
+    getFrame()->removeView(paramSurGain);
+    //Knobs
+    getFrame()->removeView(knobWidth);
+    getFrame()->removeView(knobPattern);
+    getFrame()->removeView(knobMode);
+    getFrame()->removeView(knobSurroundMode);
+    getFrame()->removeView(knobSurroundWidth);
+    getFrame()->removeView(knobSurroundPattern);
+    getFrame()->removeView(knobSurroundGain);
+    //Section background
+    getFrame()->removeView(control_view);
+}
+
+
+
+//------------------------------------------------------------------------------------
+void MyEditor::clearFiveOne()
+{
+    //Section Title
+    getFrame()->removeView(decoderLabel1);
+    //Knob Titles
+    getFrame()->removeView(labelMode);
+    getFrame()->removeView(labelWidth);
+    getFrame()->removeView(labelPattern);
+    getFrame()->removeView(labelSurMode);
+    getFrame()->removeView(labelSurWidth);
+    getFrame()->removeView(labelSurPattern);
+    getFrame()->removeView(labelSurGain);
+    getFrame()->removeView(labelCtrPattern);
+    getFrame()->removeView(labelCtreGain);
+    getFrame()->removeView(labelSubGain);
+    getFrame()->removeView(labelFc);
+    //Knob Parameter Values
+    getFrame()->removeView(paramMode);
+    getFrame()->removeView(paramWidth);
+    getFrame()->removeView(paramPattern);
+    getFrame()->removeView(paramSurMode);
+    getFrame()->removeView(paramSurWidth);
+    getFrame()->removeView(paramSurPattern);
+    getFrame()->removeView(paramSurGain);
+    getFrame()->removeView(paramCtrPattern);
+    getFrame()->removeView(paramCtrGain);
+    getFrame()->removeView(paramSubGain);
+    getFrame()->removeView(paramFc);
+    //Knobs
+    getFrame()->removeView(knobWidth);
+    getFrame()->removeView(knobPattern);
+    getFrame()->removeView(knobMode);
+    getFrame()->removeView(knobSurroundMode);
+    getFrame()->removeView(knobSurroundWidth);
+    getFrame()->removeView(knobSurroundPattern);
+    getFrame()->removeView(knobSurroundGain);
+    getFrame()->removeView(knobCentrePattern);
+    getFrame()->removeView(knobCentreGain);
+    getFrame()->removeView(knobSubGain);
+    getFrame()->removeView(knobFc);
+    //Section background
+    getFrame()->removeView(control_view);
+    getFrame()->removeView(control_view2);
+}
+
+
+//------------------------------------------------------------------------------------
+void MyEditor::clearHeller()
+{
+    //Section background
+    getFrame()->removeView(heller1);
+    getFrame()->removeView(heller2);
+};
+
+
+//------------------------------------------------------------------------------------
+void MyEditor::modeChange()
+{
+    //First remove the previous mode's view
+    switch (myPlot->decoder_prev) {
+        case 2:
+            clearStereo();
+            break;
+        case 3:
+            clearTwoOne();
+            break;
+        case 4:
+            clearFour();
+            break;
+        case 5:
+            clearFive();
+            if (myPlot->decoder_mode5x != 0) {
+                clearHeller();//Blank Out Controls
+            }
+            break;
+        case 6:
+            clearFiveOne();
+            if (myPlot->decoder_mode5x != 0) {
+                clearHeller();//Blank Out Controls
+            }
+            break;
+            
+        default:
+            break;
+    }
+    
+    
+    //Second add the new mode's view
+    switch (myPlot->decoder_mode) {
+        case 2:
+            stereoDisplay();
+            //Sync Parameters
+            for (int i = 5; i <= 9; i++)
+                setParameter (i, effect->getParameter (i));
+            break;
+        case 3:
+            twooneDisplay();
+            //Sync Parameters
+            for (int i = 5; i <= 9; i++)
+                setParameter (i, effect->getParameter (i));
+            for (int i = 12; i <= 13; i++)
+                setParameter (i, effect->getParameter (i));
+            break;
+        case 4:
+            fourDisplay();
+            //Sync Parameters
+            for (int i = 5; i <= 7; i++)
+                setParameter (i, effect->getParameter (i));
+            for (int i = 14; i <= 17; i++)
+                setParameter (i, effect->getParameter (i));
+            break;
+        case 5:
+            fiveDisplay();
+            //Sync Parameters
+            for (int i = 5; i <= 7; i++)
+                setParameter (i, effect->getParameter (i));
+            for (int i = 10; i <= 11; i++)
+                setParameter (i, effect->getParameter (i));
+            for (int i = 14; i <= 17; i++)
+                setParameter (i, effect->getParameter (i));
+            if (myPlot->decoder_mode5x != 0) {
+                hellerDisplay();//Blank Out Controls
+            }
+            break;
+        case 6:
+        {
+            fiveoneDisplay();
+            //Sync Parameters
+            for (int i = 5; i <= 7; i++)
+                setParameter (i, effect->getParameter (i));
+            for (int i = 10; i <= 17; i++)
+                setParameter (i, effect->getParameter (i));
+            if (myPlot->decoder_mode5x != 0) {
+                hellerDisplay();//Blank Out Controls
+            }
+        }
+            break;
+            
+        default:
+            break;
+    }
+    
+}
+
+
+
 //------------------------------------------------------------------------------------
 void MyEditor::suspendDisplay()
 {
     suspend = new CTextLabel(frameSize, 0, 0, kCenterText);
-	suspend->setBackColor(CColor(23,25,26,150));
+	suspend->setBackColor(CColor(23,25,26,200));//150
     suspend->setFont (kNormalFontVeryBig);
     suspend->setFontColor (CColor (255,255,255,255));
     suspend->setText("Currently Suspended");
@@ -833,29 +2356,36 @@
 	//-- The UI should reflect this state so we set the value of the control to the new value.
 	//-- VSTGUI will automaticly redraw changed controls in the next idle (as this call happens to be in the process thread).
 	if (frame && index < kNumParameters)
-	{        //First write the value into the GUI value container
-        controls[index]->setValue (value);
+	{
+        bool exists = false; //Checks if control exists, needed for outside automation
 
-        
-        //Call getParameterDisplay to get the char to display
-        getParameterDisplay (index, &displayText); //Will this work with no switch?
-        
-        
-        //Set the polar plot variables if they've changed and the decoder mode display
+
         switch (index) {
-                
-                
-                //Second anything that affests the plot
-            case kPattern:
-                myPlot->pattern = (double)value;
-                myPlot->setDirty();
+            case kRotate:
+                if (knobRotate) {
+                    exists = true;
+                }
                 break;
-               
-            case kWidth:
-                myPlot->width = (double)value*90;
-                myPlot->setDirty();
+            case kTilt:
+                if (knobTilt) {
+                    exists = true;
+                }
                 break;
-                
+            case kTumble:
+                if (knobTumble) {
+                    exists = true;
+                }
+                break;
+            case kZoom:
+                if (knobZoom) {
+                    exists = true;
+                }
+                break;
+            case kZoomMethod:
+                if (knobZoomMethod) {
+                    exists = true;
+                }
+                break;
             case kMode:
                 if (value<=0.5f) {
                     myPlot->stereo_mode = 0;
@@ -864,18 +2394,58 @@
                     myPlot->stereo_mode = 1;
                 }
                 myPlot->setDirty();
+                if (knobMode) {
+                    exists = true;
+                }
                 break;
-                
+            case kWidth:
+                myPlot->width = (double)value*90;
+                myPlot->setDirty();
+                if (knobWidth) {
+                    exists = true;
+                }
+                break;  
+            case kPattern:
+                myPlot->pattern = (double)value;
+                myPlot->setDirty();
+                if (knobPattern) {
+                    exists = true;
+                }
+                break;
+            case kRearVerb:
+                if (knobHiVerb) {
+                    exists = true;
+                }
+                break;
+            case kHiVerb:
+                if (knobRearVerb) {
+                    exists = true;
+                }
+                break;
             case kCentrePattern:
                 myPlot->centre_pattern = (double)value;
                 myPlot->setDirty();
+                if (knobCentrePattern) {
+                    exists = true;
+                }
                 break;
-                
             case kCentreGain:
                 myPlot->centre_gain = (double)((value*24)-18);
                 myPlot->setDirty();
+                if (knobCentreGain) {
+                    exists = true;
+                }
                 break;
-                
+            case kSubGain:
+                if (knobSubGain) {
+                    exists = true;
+                }
+                break;
+            case kFc:
+                if (knobFc) {
+                    exists = true;
+                }
+                break;
             case kSurroundMode:
                 if (value<=0.5f) {
                     myPlot->surround_mode = 0;
@@ -884,24 +2454,33 @@
                     myPlot->surround_mode = 1;
                 }
                 myPlot->setDirty();
+                if (knobSurroundMode) {
+                    exists = true;
+                }
                 break;
-                
             case kSurroundPattern:
                 myPlot->surround_pattern = (double)value;
                 myPlot->setDirty();
+                if (knobSurroundPattern) {
+                    exists = true;
+                }
                 break;
-                
             case kSurroundWidth:
                 myPlot->surround_width = (double)value*90;
                 myPlot->setDirty();
+                if (knobSurroundWidth) {
+                    exists = true;
+                }
                 break;
-                
             case kSurroundGain:
                 myPlot->surround_gain = (double)((value*24)-18);
                 myPlot->setDirty();
+                if (knobSurroundGain) {
+                    exists = true;
+                }
                 break;
-                
             case kDecoderMode:
+                myPlot->decoder_prev = myPlot->decoder_mode;
                 if (value<=0.2f) {
                     myPlot->decoder_mode = 2; //Stereo
                 }
@@ -918,11 +2497,29 @@
                     myPlot->decoder_mode = 6; //5.1
                 }
                 myPlot->setDirty();
+                modeChange();
+                if (knobDecoder) {
+                    exists = true;
+                }
                 break;
-                
+            case kChannelOrder:
+                if (knobChannel) {
+                    exists = true;
+                }
+            
             default:
                 break;
+        }        
+        if (exists) {
+            //First write the value into the GUI value container
+            controls[index]->setValue (value);
+            
+            //Call getParameterDisplay to get the char to display
+            getParameterDisplay (index, &displayText);
         }
+        
+        
+        
 	}
     else if (frame && index == 100) {
         suspendDisplay();
@@ -931,8 +2528,11 @@
     else if (frame && index == 101) {
         resumeDisplay();
     }
-
-    
+    else if (frame && index == 103){
+        myPlot->decoder_mode5x = (int)value;
+        myPlot->setDirty(); //ReDraw plot in next idle
+        modeChange();
+    }
 }
 
 
@@ -942,15 +2542,6 @@
 	effect->getParameterDisplay(index, text);
 	switch (index)
 	{
-        case kMode :
-            paramModeStereo->setText(text);
-            break;
-		case kWidth:
-			paramWidth->setText(text);
-			break;
-		case kPattern:
-			paramPattern->setText(text);
-			break;
 		case kRotate :
 			paramRotate->setText(text);
 			break;
@@ -966,16 +2557,51 @@
 		case kZoomMethod:
 			paramZoomMethod->setText(text);
 			break;
+      case kMode :
+            paramMode->setText(text);
+            break;
+		case kWidth:
+			paramWidth->setText(text);
+			break;
+		case kPattern:
+			paramPattern->setText(text);
+			break;
 		case kRearVerb :
 			paramRearVerb->setText(text);
 			break;
 		case kHiVerb :
 			paramHiVerb->setText(text);
 			break;
-            
+        case kCentrePattern:
+            paramCtrPattern->setText(text);
+            break;
+        case kCentreGain:
+            paramCtrGain->setText(text);
+            break;
+        case kSubGain:
+            paramSubGain->setText(text);
+            break;
+        case kFc:
+            paramFc->setText(text);
+            break;
+        case kSurroundMode:
+            paramSurMode->setText(text);
+            break;
+        case kSurroundPattern:
+            paramSurPattern->setText(text);
+            break;
+        case kSurroundWidth:
+            paramSurWidth->setText(text);
+            break;
+        case kSurroundGain:
+            paramSurGain->setText(text);
+            break;
         case kDecoderMode:
             paramDecoder->setText(text);
             break;
+        case kChannelOrder:
+            paramChannel->setText(text);
+            break;
             
         default:
             break;
--- a/Source/GUI.h	Sun Sep 16 23:25:54 2012 +0100
+++ b/Source/GUI.h	Thu Sep 20 16:41:01 2012 +0100
@@ -34,6 +34,18 @@
 #ifndef __MyEditor__
 #define __MyEditor__
 
+#define IMAGE 280
+
+#define cSep 12
+#define tDepth 15
+#define tDepthLarge 20
+#define dOffset 3
+#define kOffset (1*dOffset + tDepth + tDepthLarge)
+#define lOffset kOffset-(1*dOffset + tDepth)
+#define tOffset kOffset-(1*dOffset + tDepth + tDepthLarge)
+#define pOffset kOffset+(64+dOffset)
+
+
 #include "aeffguieditor.h"
 #include <vstgui.h>
 #include "SoundField.h"
@@ -46,18 +58,19 @@
 
 
 
+
 class MyEditor :  public AEffGUIEditor, public CControlListener
 {    	
 public:
 	MyEditor (void*);
 	
 	// from AEffGUIEditor
-	bool open (void* ptr);
-	void close ();
-	void setParameter (VstInt32 index, float value);
-    void setParameterAutomated();
-    void getParameterDisplay (VstInt32 index, char *text);
-    void syncParameters();
+	bool    open (void* ptr);
+	void    close ();
+	void    setParameter (VstInt32 index, float value);
+    void    setParameterAutomated();
+    void    getParameterDisplay (VstInt32 index, char *text);
+    void    syncParameters();
 
 	// from CControlListener
 	void valueChanged (CControl* pControl);
@@ -67,44 +80,42 @@
 	CControl*           controls[kNumParameters];
     char                displayText;
     
-    CTextLabel*         paramMode;
-    CTextLabel*         paramModeSelect;
-    CTextLabel*         paramWidth;
-    CTextLabel*         paramPattern;
-    CTextLabel*         paramRotate;
-    CTextLabel*         paramTilt;
-	CTextLabel*         paramTumble;
-	CTextLabel*         paramZoom;
-	CTextLabel*         paramZoomMethod;
-	CTextLabel*         paramRearVerb;
-	CTextLabel*         paramHiVerb;
-    CTextLabel*         paramModeStereo;
-    
-    CTextLabel*         paramDecoder;
-    
-    polarPlot*          myPlot;
+
     
     
     // own function
-	void transformsDisplay(int &transformsHoz, int &transformsEl, int &transformsSep, CFrame* newFrame);
-	void zoomDisplay(int &zoomHoz, int &zoomEl, int &zoomSep, CFrame* newFrame);
-	void stereoDisplay(int &stereoHoz, int &stereoEl, int &stereoSep, CFrame* newFrame);
-    void nameDisplay(int &nameHoz, int &nameEl, int &nameSep, CFrame* newFrame);
-	void plotDisplay(int &plotHoz, int &plotEl, int &plotSep, CFrame* newFrame);
-    void settingsDisplay(int &settingsHoz, int &settingsEl, int &settingsSep, CFrame* newFrame);
-    void suspendDisplay();
-    void resumeDisplay();
+	void    transformsDisplay(CFrame* newFrame);
+	void    zoomDisplay(CFrame* newFrame);
+    void    plotDisplay(CFrame* newFrame);
+    void    settingsDisplay(CFrame* newFrame);
+    void    nameDisplay(CFrame* newFrame);
+    void    setupKnobs(int &setupHoz, int &setupEl, int &setupSep);//REMOVE
+    void    modeChange();
+    void    stereoDisplay();
+    void    twooneDisplay();
+    void    fourDisplay();
+    void    fiveDisplay();
+    void    fiveoneDisplay();
+    void    hellerDisplay();
+    void    clearStereo();
+    void    clearTwoOne();
+    void    clearFour();
+    void    clearFive();
+    void    clearFiveOne();
+    void    clearHeller();
+    void    suspendDisplay();
+    void    resumeDisplay();
 	
     
     
+    
 private:
 
     
     
     
 protected:
-	int textDepth, textDepthLarge, labelOffset, displayOffset;
-	
+	//Parameters
 	CAnimKnob			*knobRotate;
 	CAnimKnob			*knobTilt;
 	CAnimKnob			*knobTumble;
@@ -115,8 +126,68 @@
 	CHorizontalSwitch	*knobMode;
 	CAnimKnob			*knobRearVerb;
 	CAnimKnob			*knobHiVerb;
+    CAnimKnob			*knobCentrePattern;
+    CAnimKnob			*knobCentreGain;
+    CAnimKnob			*knobSubGain;
+    CAnimKnob			*knobFc;
+    CHorizontalSwitch	*knobSurroundMode;
+    CAnimKnob			*knobSurroundPattern;
+    CAnimKnob			*knobSurroundWidth;
+    CAnimKnob			*knobSurroundGain;
     CHorizontalSwitch	*knobDecoder;
-	
+    CHorizontalSwitch	*knobChannel;
+    
+    //Main Controls Section Background
+    CView               *control_view;
+    CView               *control_view2;
+    
+    //Controls Text Labels
+    CTextLabel          *labelMode;
+    CTextLabel          *labelWidth;
+    CTextLabel          *labelPattern;
+    CTextLabel          *labelRearVerb;
+    CTextLabel          *labelHiVerb;
+    CTextLabel          *labelSurMode;
+    CTextLabel          *labelSurWidth;
+    CTextLabel          *labelSurPattern;
+    CTextLabel          *labelSurGain;
+    CTextLabel          *labelCtrPattern;
+    CTextLabel          *labelCtreGain;
+    CTextLabel          *labelSubGain;
+    CTextLabel          *labelFc;
+    
+    //Controls Parameters
+    CTextLabel          *paramMode;
+    CTextLabel          *paramWidth;
+    CTextLabel          *paramPattern;
+    CTextLabel          *paramRotate;
+    CTextLabel          *paramTilt;
+	CTextLabel          *paramTumble;
+	CTextLabel          *paramZoom;
+	CTextLabel          *paramZoomMethod;
+	CTextLabel          *paramRearVerb;
+	CTextLabel          *paramHiVerb;
+    CTextLabel          *paramSurMode;
+    CTextLabel          *paramSurWidth;
+    CTextLabel          *paramSurPattern;
+    CTextLabel          *paramSurGain;
+    CTextLabel          *paramCtrPattern;
+    CTextLabel          *paramCtrGain;
+    CTextLabel          *paramSubGain;
+    CTextLabel          *paramFc;
+    CTextLabel          *paramDecoder;
+    CTextLabel          *paramChannel;
+    
+    
+    
+    //Main Controls Section Text
+    CTextLabel          *decoderLabel1;
+    
+    //Polar Plot
+    polarPlot*          myPlot;
+
+    
+    
     CRect frameSize;
 	CRect DisplaySize;
 	CRect LabelSize;
@@ -132,17 +203,25 @@
 	CBitmap* knob_red;
 	CBitmap* knob_blue;
 	CBitmap* knob_red_blue;
+    CBitmap* knob_blue_red;
 	CBitmap* knob_mode2;
+    CBitmap* knob_mode2b;
 	CBitmap* knob_mode4;
     CBitmap* knob_mode5;
 	
-    CBitmap *bRotations;
+    CBitmap *bTransforms;
     CBitmap *bZoom;
-    CBitmap *bStereo;
+    CBitmap *bControls;
+    CBitmap *bControls2;
     CBitmap *bName;
+    CBitmap *bPlot;
+    CBitmap *bSettings;
     
     CTextLabel* suspend;
+    CTextLabel* heller1;
+    CTextLabel* heller2;
 	CTextLabel* bitMode;
+    CTextLabel* vendor_version;
 };
 
 
--- a/Source/MyPlot.cpp	Sun Sep 16 23:25:54 2012 +0100
+++ b/Source/MyPlot.cpp	Thu Sep 20 16:41:01 2012 +0100
@@ -24,7 +24,8 @@
     surround_pattern = 0.5;
     surround_width = 60;
     surround_mode = 0;
-    decoder_mode = 2;
+    decoder_mode = 0;
+    decoder_prev = 0;
 };
     
 
@@ -59,21 +60,52 @@
             break;
             
         case 5:
-            //5.0 Mic Patterns
-            leftMicPattern(context);
-            rightMicPattern(context);
-            centreMicPattern(context);
-            lsMicPattern(context);
-            rsMicPattern(context);
+            switch (decoder_mode5x) {
+                case 0:
+                    //5.0 Mic Patterns
+                    leftMicPattern(context);
+                    rightMicPattern(context);
+                    centreMicPattern(context);
+                    lsMicPattern(context);
+                    rsMicPattern(context);
+                    break;
+                case 1:
+                    //Heller 1 Plot
+                    heller1Pattern(context);
+                    break;
+                case 2:
+                    //Heller 2 Plot
+                    heller2Pattern(context);
+                    break;
+                    
+                default:
+                    break;
+            }
+            
             break;
             
         case 6:
-            //5.1 Mic Patterns
-            leftMicPattern(context);
-            rightMicPattern(context);
-            centreMicPattern(context);
-            lsMicPattern(context);
-            rsMicPattern(context);
+            switch (decoder_mode5x) {
+                case 0:
+                    //5.1 Mic Patterns
+                    leftMicPattern(context);
+                    rightMicPattern(context);
+                    centreMicPattern(context);
+                    lsMicPattern(context);
+                    rsMicPattern(context);
+                    break;
+                case 1:
+                    //Heller 1 Plot
+                    heller1Pattern(context);
+                    break;
+                case 2:
+                    //Heller 2 Plot
+                    heller2Pattern(context);
+                    break;
+                    
+                default:
+                    break;
+            }
             break;
             
             
@@ -82,50 +114,7 @@
     }
     
     
-   
-
-
-
-    
     setDirty(false);
-    
-    
-    
-    //context->beginDraw();
-    //context->drawRect(size);
-    
-    
-    //        CBitmap *knob_knob = new CBitmap ("360_knob.png");
-    //        context->drawBitmap(knob_knob, size);
-    //
-    //
-    //        //Plot Ellipse
-    //        context->setLineWidth (6);
-    //        CColor eclColor = CColor(120,120,120,255);
-    //        context->setFrameColor(eclColor);
-    //        CRect hi = CRect(20, 20, 130, 130);
-    //        context->drawEllipse(hi);
-    
-    
-    //        double x = 75;
-    //        double y=75;
-    //        context->setFrameColor(kBlueCColor);
-    //        context->setLineWidth (2);
-    //        CRect fatPoint = CRect(x-1,y-1,x+1,y+1);
-    //        context->drawEllipse(fatPoint);
-    
-    
-    //CPoint *myPoint = new CPoint(50,50);
-    //context->drawPolygon(myPoint, 3);
-    
-    //context->setFillColor(eclColor);
-    //context->setFrameColor(eclColor);
-    
-    
-    //context->endDraw();
-    
-    
-    //setDirty (false);
 };
 
 
@@ -172,8 +161,8 @@
         
         
         
-        x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius); //size.left +
-        y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius); //+ PLOT_OFFSET
+        x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius);
+        y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius);
         
         context->beginDraw();
         CPoint point = CPoint((int)x, (int)y);
@@ -230,7 +219,7 @@
 
 void polarPlot::centreMicPattern(CDrawContext* context)//To finish updating
 {
-    CColor yellowColor = CColor(255,255,0,255);
+    CColor yellowColor = CColor(255,215,0,255);
     double radius, x, y;
     int ang = 0;
     
@@ -239,8 +228,8 @@
         radius = fabs(centre_pattern+(1-centre_pattern)*(cos((ang)/180.0*M_PI))) * size.getHeight()/2*0.8;
 
 
-        x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius*pow(10,(centre_gain/20))); //size.left +
-        y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius*pow(10,(centre_gain/20))); //+ PLOT_OFFSET
+        x = size.getCenter().x - (sin(ang/180.0*M_PI)*(radius*(pow(10,centre_gain/gFactor/20))));
+        y = size.getCenter().y - (cos(ang/180.0*M_PI)*(radius*(pow(10,centre_gain/gFactor/20))));
         
         context->beginDraw();
         CPoint point = CPoint((int)x, (int)y);
@@ -284,8 +273,8 @@
         
         
         
-        x = size.getCenter().x + (sin(ang/180.0*M_PI)*radius*pow(10,(surround_gain/20)));
-        y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius*pow(10,(surround_gain/20)));
+        x = size.getCenter().x + (sin(ang/180.0*M_PI)*(radius*(pow(10,surround_gain/gFactor/20))));
+        y = size.getCenter().y - (cos(ang/180.0*M_PI)*(radius*(pow(10,surround_gain/gFactor/20))));
         
         context->beginDraw();
         CPoint point = CPoint((int)x, (int)y);
@@ -325,8 +314,8 @@
         
         
         
-        x = size.getCenter().x + (sin(ang/180.0*M_PI)*radius*pow(10,(surround_gain/20)));
-        y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius*pow(10,(surround_gain/20))); 
+        x = size.getCenter().x + (sin(ang/180.0*M_PI)*(radius*(pow(10,surround_gain/gFactor/20))));
+        y = size.getCenter().y - (cos(ang/180.0*M_PI)*(radius*(pow(10,surround_gain/gFactor/20))));
         
         context->beginDraw();
         CPoint point = CPoint((int)x, (int)y);
@@ -338,5 +327,186 @@
 };
 
 
+void polarPlot::heller1Pattern(VSTGUI::CDrawContext *context)
+{
+    double radius, x, y;
+    int ang = 0;
+    
+    //Left Polar
+    CColor redColor = CColor(255,0,0,255);
+    while (ang<360) {
+        radius = 1.4017195157709*fabs(0.28205165*(1/sqrt(2.0)) +0.24760232*(cos(ang/180.0*M_PI)) +0.18790454*(sin(ang/180.0*M_PI))) * size.getHeight()/2*0.8;
 
+        x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius);
+        y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius);
+        
+        context->beginDraw();
+        CPoint point = CPoint((int)x, (int)y);
+        context->drawPoint(point, redColor);
+        context->endDraw();
+        
+        ang++;
+    }
 
+    //Right Polar
+    CColor blueColor = CColor(0,0,255,255);
+    ang = 0;
+    while (ang<360) {
+        radius = 1.4017195157709*fabs(0.28204229*(1/sqrt(2.0)) +0.24758662*(cos(ang/180.0*M_PI)) -0.18792311*(sin(ang/180.0*M_PI))) * size.getHeight()/2*0.8;
+
+        x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius);
+        y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius);
+        
+        context->beginDraw();
+        CPoint point = CPoint((int)x, (int)y);
+        context->drawPoint(point, blueColor);
+        context->endDraw();
+        
+        ang++;
+    }
+
+    
+    //SL Polar Pattern
+    CColor greenColor = CColor(0,255,0,255);
+    ang = 0;
+    while (ang<360) {
+        radius = 1.40171951577099*fabs(0.44947336*(1/sqrt(2.0)) -0.23381746*(cos(ang/180.0*M_PI)) +0.31911519*(sin(ang/180.0*M_PI))) * size.getHeight()/2*0.8;
+        
+        x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius);
+        y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius);
+        
+        context->beginDraw();
+        CPoint point = CPoint((int)x, (int)y);
+        context->drawPoint(point, greenColor);
+        context->endDraw();
+        
+        ang++;
+    }
+    
+    //SR Polar Pattern
+    CColor brownColor = CColor(139,69,19,255);
+    ang = 0;
+    while (ang<360) {
+        radius = 1.4017195157709*fabs(0.44945895*(1/sqrt(2.0)) -0.23380219*(cos(ang/180.0*M_PI)) -0.31911386*(sin(ang/180.0*M_PI))) * size.getHeight()/2*0.8;
+        
+        x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius);
+        y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius);
+        
+        context->beginDraw();
+        CPoint point = CPoint((int)x, (int)y);
+        context->drawPoint(point, brownColor);
+        context->endDraw();
+        
+        ang++;
+    }
+    
+    //C Polar Pattern
+    CColor yellowColor = CColor(255,215,0,255);
+    ang = 0;
+    while (ang<360) {
+        radius = 1.4017195157709*fabs(-0.04881270*(1/sqrt(2.0)) -0.02756928*(cos(ang/180.0*M_PI)) +0.00001724*(sin(ang/180.0*M_PI))) * size.getHeight()/2*0.8;
+        
+        x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius);
+        y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius);
+        
+        context->beginDraw();
+        CPoint point = CPoint((int)x, (int)y);
+        context->drawPoint(point, yellowColor);
+        context->endDraw();
+        
+        ang++;
+    }
+};
+
+
+void polarPlot::heller2Pattern(VSTGUI::CDrawContext *context)
+{
+    double radius, x, y;
+    int ang = 0;
+    
+    //Left Polar
+    CColor redColor = CColor(255,0,0,255);
+    while (ang<360) {
+        radius = 1.38921598327229*fabs(0.21426224*(1/sqrt(2.0)) +0.19218459*(cos(ang/180.0*M_PI)) +0.20409261*(sin(ang/180.0*M_PI))) * size.getHeight()/2*0.8;
+        
+        x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius);
+        y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius);
+        
+        context->beginDraw();
+        CPoint point = CPoint((int)x, (int)y);
+        context->drawPoint(point, redColor);
+        context->endDraw();
+        
+        ang++;
+    }
+    
+    //Right Polar
+    CColor blueColor = CColor(0,0,255,255);
+    ang = 0;
+    while (ang<360) {
+        radius = 1.38921598327229*fabs(0.21426400*(1/sqrt(2.0)) +0.19218379*(cos(ang/180.0*M_PI)) -0.20409362*(sin(ang/180.0*M_PI))) * size.getHeight()/2*0.8;
+        
+        x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius);
+        y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius);
+        
+        context->beginDraw();
+        CPoint point = CPoint((int)x, (int)y);
+        context->drawPoint(point, blueColor);
+        context->endDraw();
+        
+        ang++;
+    }
+    
+    
+    //SL Polar Pattern
+    CColor greenColor = CColor(0,255,0,255);
+    ang = 0;
+    while (ang<360) {
+        radius = 1.38921598327229*fabs(0.44287748*(1/sqrt(2.0)) -0.27006948*(cos(ang/180.0*M_PI)) +0.30405695*(sin(ang/180.0*M_PI))) * size.getHeight()/2*0.8;
+        
+        x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius);
+        y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius);
+        
+        context->beginDraw();
+        CPoint point = CPoint((int)x, (int)y);
+        context->drawPoint(point, greenColor);
+        context->endDraw();
+        
+        ang++;
+    }
+    
+    //SR Polar Pattern
+    CColor brownColor = CColor(139,69,19,255);
+    ang = 0;
+    while (ang<360) {
+        radius = 1.38921598327229*fabs(0.44287676*(1/sqrt(2.0)) -0.27006941*(cos(ang/180.0*M_PI)) -0.30405595*(sin(ang/180.0*M_PI))) * size.getHeight()/2*0.8;
+        
+        x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius);
+        y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius);
+        
+        context->beginDraw();
+        CPoint point = CPoint((int)x, (int)y);
+        context->drawPoint(point, brownColor);
+        context->endDraw();
+        
+        ang++;
+    }
+    
+    //C Polar Pattern
+    CColor yellowColor = CColor(255,215,0,255);
+    ang = 0;
+    while (ang<360) {
+        radius = 1.38921598327229*fabs(0.09993309*(1/sqrt(2.0)) +0.15577050*(cos(ang/180.0*M_PI)) +0.00000000*(sin(ang/180.0*M_PI))) * size.getHeight()/2*0.8;
+       
+        x = size.getCenter().x - (sin(ang/180.0*M_PI)*radius);
+        y = size.getCenter().y - (cos(ang/180.0*M_PI)*radius);
+        
+        context->beginDraw();
+        CPoint point = CPoint((int)x, (int)y);
+        context->drawPoint(point, yellowColor);
+        context->endDraw();
+        
+        ang++;
+    }
+};
+
--- a/Source/MyPlot.h	Sun Sep 16 23:25:54 2012 +0100
+++ b/Source/MyPlot.h	Thu Sep 20 16:41:01 2012 +0100
@@ -14,6 +14,7 @@
 #ifndef __vstgui__
 #include "vstgui.h"
 #endif
+#define gFactor 12
 
 
 class polarPlot : public CView
@@ -33,6 +34,8 @@
     double  surround_width;
     double  surround_gain;
     int     decoder_mode;
+    int     decoder_prev;
+    int     decoder_mode5x;
     
     //Functions
     void    draw (CDrawContext* context);
@@ -42,7 +45,8 @@
     void    centreMicPattern(CDrawContext* context);
     void    lsMicPattern(CDrawContext* context);
     void    rsMicPattern(CDrawContext* context);
-    
+    void    heller1Pattern(CDrawContext* context);
+    void    heller2Pattern(CDrawContext* context);
     
 
     
--- a/Source/SoundField.cpp	Sun Sep 16 23:25:54 2012 +0100
+++ b/Source/SoundField.cpp	Thu Sep 20 16:41:01 2012 +0100
@@ -45,17 +45,18 @@
 	
     //Set the number of input and output channels
 	setNumInputs (4);	// 4 Channel Classic B-Format Input
-	setNumOutputs (6);	// MAX_CHANNELS 5.1 Output
+	setNumOutputs (6);	// MAX_CHANNELS 5.1 Outpu
+	setUniqueID ('MMca');	// this should be unique, use the Steinberg web page for plugin Id registration
+    canDoubleReplacing(); //Plugin can use process double replacing
+    canProcessReplacing(); //Plugin can use process replacing
+    noTail ();
     
-	
-	setUniqueID ('MMca');	// this should be unique, use the Steinberg web page for plugin Id registration
+    bool bit64 = setProcessPrecision(kVstProcessPrecision64);
     
-    
-    if(setProcessPrecision(kVstProcessPrecision64)){
-        setProcessPrecision(kVstProcessPrecision64);
+    if (bit64==true) {
         bits=64;
     }
-    else {
+    else{
         bits=32;
     }
     
@@ -68,8 +69,6 @@
     
 	resume ();		// flush buffer
     
-    canProcessReplacing(); //Plugin can use process replacing 
-    noTail ();
 	
     //Default Program Names
     vst_strncpy (programs[0].name, "Default",kVstMaxProgNameLen);
@@ -115,7 +114,7 @@
     myDecoder.surMode=0;
     myDecoder.surPattern=0.5;
     myDecoder.surWidth=60.0;
-    myDecoder.subGain=0.0;
+    myDecoder.surGain = 0.0;
     myDecoder.Fc = 120;
     myDecoder.centrePattern=0.5;
     myDecoder.centreGain=0.0;
@@ -124,7 +123,7 @@
     myDecoder.filterCoefs();
     myDecoder.decoderMode=2; //Default mode is Stereo
     myDecoder.channelOrder=0;
-    
+    myDecoder.mode5x=0;
     
     // Zero up decoder outputs as a safety
     myDecoder.outputL=0.0;
@@ -157,14 +156,6 @@
 
 
 //------------------------------------------------------------------------
-//bool SoundField::getSpeakerArrangement (VstSpeakerArrangement** pluginInput, VstSpeakerArrangement** pluginOutput)
-//{
-//	*pluginInput  = plugInput;
-//	*pluginOutput = plugOutput;
-//	return true;
-//}
-
-//------------------------------------------------------------------------
 bool SoundField::setSpeakerArrangement (VstSpeakerArrangement* pluginInput,
                                         VstSpeakerArrangement* pluginOutput)
 {
@@ -461,11 +452,12 @@
             break;
             
             
-        case 102:
+        //HIDDEN PArameters for GUI Control
+        case 102: //Bit Mode for GUI display
             returnFloat = bits;
             break;
         case 103:
-            returnFloat = myDecoder.decoderMode;
+            returnFloat = myDecoder.mode5x;
             break;
             
         default:
@@ -845,8 +837,6 @@
 //---------------------------------------------------------------------------
 void SoundField::processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames) //The part that does some actual DSP. This section takes the input audio and gives the output audio back.
 {
-    
-	
 	while (--sampleFrames >= 0) //Do this process if the audio is running
 	{
 		//Set the internal B-Format values as doubles.
@@ -886,6 +876,51 @@
             for (int i=0; i<numberOutputs; i++)
                 *outputs[i]++ = float(myDecoder.output[i]);
         }
-        
 	}
 }
+
+
+//---------------------------------------------------------------------------
+void SoundField::processDoubleReplacing(double **inputs, double **outputs, VstInt32 sampleFrames) //The part that does some actual DSP. This section takes the input audio and gives the output audio back.
+{
+	while (--sampleFrames >= 0) //Do this process if the audio is running
+	{
+		//Set the internal B-Format values as doubles.
+        double w, x, y, z;
+        switch (numberInputs) {
+            case 3:
+                w = (double) *inputs[0]++;
+                x = (double) *inputs[1]++;
+                y = (double) *inputs[2]++;
+                z = 0;
+                break;
+                
+            case 4:
+                w = (double) *inputs[0]++;
+                x = (double) *inputs[1]++;
+                y = (double) *inputs[2]++;
+                z = (double) *inputs[3]++;
+                break;
+                
+            default:
+                w = 0;
+                x = 0;
+                y = 0;
+                z = 0;
+                break;
+        }
+		
+		
+        int numOut;
+        numOut = myDecoder.processDecoder(w, x, y, z); //Process B-Format
+        
+        if (numOut<=numberOutputs) {
+            for (int i=0; i<numOut; i++)
+                *outputs[i]++ = float(myDecoder.output[i]);
+        }
+        else{
+            for (int i=0; i<numberOutputs; i++)
+                *outputs[i]++ = float(myDecoder.output[i]);
+        }
+	}
+}
\ No newline at end of file
--- a/Source/SoundField.h	Sun Sep 16 23:25:54 2012 +0100
+++ b/Source/SoundField.h	Thu Sep 20 16:41:01 2012 +0100
@@ -60,6 +60,7 @@
     virtual void close ();
     virtual void open ();
 	virtual void processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames);
+    virtual void processDoubleReplacing (double ** 	inputs, double ** 	outputs, VstInt32 sampleFrames);
     
 	virtual void setProgram (VstInt32 program);
 	virtual void setProgramName (char* name);
@@ -80,10 +81,7 @@
 	virtual VstInt32 getVendorVersion ();
 
 	
-	//virtual VstPlugCategory getPlugCategory () { return kPlugCategEffect; }
-    
-
-    //virtual bool getSpeakerArrangement (VstSpeakerArrangement** pluginInput, VstSpeakerArrangement** pluginOutput);
+	virtual VstPlugCategory getPlugCategory () { return kPlugCategSpacializer; }
 	virtual bool setSpeakerArrangement (VstSpeakerArrangement* pluginInput, VstSpeakerArrangement* pluginOutput);