changeset 11:76e2e62635b4

Fixed the automation problem when a control isn't a child.
author martinm_home <martin.morrell@eecs.qmul.ac.uk>
date Thu, 27 Sep 2012 12:33:46 +0100
parents b5d48e9b9aea
children 87dc3d84c120
files Classic Ambisonics Decoder VST.xcodeproj/project.xcworkspace/xcuserdata/momont.xcuserdatad/UserInterfaceState.xcuserstate Classic Ambisonics Decoder VST.xcodeproj/xcuserdata/momont.xcuserdatad/xcschemes/Classic Ambisonics Decoder VST.xcscheme Source/Decoder.cpp Source/Decoder.h Source/GUI.cpp Source/SoundField.cpp Source/SoundField.h
diffstat 7 files changed, 533 insertions(+), 340 deletions(-) [+]
line wrap: on
line diff
Binary file Classic Ambisonics Decoder VST.xcodeproj/project.xcworkspace/xcuserdata/momont.xcuserdatad/UserInterfaceState.xcuserstate has changed
--- a/Classic Ambisonics Decoder VST.xcodeproj/xcuserdata/momont.xcuserdatad/xcschemes/Classic Ambisonics Decoder VST.xcscheme	Tue Sep 25 21:35:17 2012 +0100
+++ b/Classic Ambisonics Decoder VST.xcodeproj/xcuserdata/momont.xcuserdatad/xcschemes/Classic Ambisonics Decoder VST.xcscheme	Thu Sep 27 12:33:46 2012 +0100
@@ -35,12 +35,12 @@
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
       launchStyle = "0"
       useCustomWorkingDirectory = "NO"
-      buildConfiguration = "Release"
+      buildConfiguration = "Debug"
       ignoresPersistentStateOnLaunch = "NO"
       debugDocumentVersioning = "YES"
       allowLocationSimulation = "YES">
       <PathRunnable
-         FilePath = "/Applications/VSTLord.app">
+         FilePath = "/Applications/Cubase 5.app">
       </PathRunnable>
       <CommandLineArguments>
          <CommandLineArgument
--- a/Source/Decoder.cpp	Tue Sep 25 21:35:17 2012 +0100
+++ b/Source/Decoder.cpp	Thu Sep 27 12:33:46 2012 +0100
@@ -101,13 +101,14 @@
                 output[4]=0;
                 output[5]=0;
                 return 6;
-            break;
             }
             else {
                 return 0;
             }
+            break;
             
         case 3:
+        {
             twoOneDecoder(w, x, y, z);
             if (channelOrder==0) {
                 output[0]=outputL;
@@ -123,18 +124,19 @@
                 output[4]=0;
                 output[5]=0;
                 return 6;
-            break;
             }
             else {
                 return 0;
             }
+            break;
+        }
             
         case 4:
             quadDecoder(w, x, y, z);
             if (channelOrder==0) {
                 output[0]=outputL;
                 output[1]=outputR;
-                output[2]=outputSL;
+                output[2]=outputSR;
                 output[3]=outputSR;
                 return 4;
             }
@@ -195,7 +197,7 @@
                 output[4]=outputSL;
                 output[5]=outputSR;
                 return 6;
-            break;
+                break;
             }
             else {
                 return 0;
@@ -243,12 +245,8 @@
 void Decoder::twoOneDecoder(double &w, double &x, double &y, double &z)
 {
     //Subwoofer signal and filtering
-    subSignal(w);
-    filterLF();
-    if (Fc>0) {
-        filterHF(w, x, y, z);
-    }
-    
+    filterLF(w);
+    filterHF(w, x, y, z);
     
     
     //Front virtual mics
@@ -298,12 +296,11 @@
 			break;
 		case 1:
 			msSurDecode(w, x, y, z);
-			break;	
+			break;
+            
 		default:
 			break;
 	}
-	
-    
 };
 
 
@@ -312,17 +309,22 @@
 {
     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;	
+                break;
+            }
             default:
                 break;
         }   
@@ -330,27 +332,35 @@
         //Rear virtual mics
         switch (surMode) {
             case 0:
+            {
                 xySurDecode(w, x, y, z);
                 break;
+            }
             case 1:
+            {
                 msSurDecode(w, x, y, z);
-                break;	
+                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;
     }
-    
 };
 
 
@@ -358,49 +368,59 @@
 void Decoder::fiveOneDecoder(double &w, double &x, double &y, double &z)
 {
     //Subwoofer signal and filtering
-    subSignal(w);
-    filterLF();
-    if (Fc>0) {
-        filterHF(w, x, y, z);
-    }
-    
-    
+    filterLF(w);
+    filterHF(w, x, y, z);
+
     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;
+        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;
         }
-            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;
@@ -546,29 +566,24 @@
 //Surround Decoders
 void Decoder::xySurDecode(double &w, double &x, double &y, double &z)
 {	
-    outputSL = (surPattern*sqrt(2.0)*w + (1-surPattern)*(cos(degRad(surWidth))*-x + sin(degRad(surWidth))*y))*surGain;
-    outputSR = (surPattern*sqrt(2.0)*w + (1-surPattern)*(cos(degRad(surWidth))*-x - sin(degRad(surWidth))*y))*surGain;
+    outputSL = (surPattern*sqrt(2.0)*w + (1-surPattern)*(cos(degRad(surWidth))*-x + sin(degRad(surWidth))*y))*pow(10, surGain/20);
+    outputSR = (surPattern*sqrt(2.0)*w + (1-surPattern)*(cos(degRad(surWidth))*-x - sin(degRad(surWidth))*y))*pow(10, surGain/20);
 };
 
 
 void Decoder::msSurDecode(double &w, double &x, double &y, double &z)
 {
-	outputSL = ((cos(degRad(surWidth))*(surPattern*w*sqrt(2.0) + (1-surPattern)*-x)) + (sin(degRad(surWidth))*y))*surGain;
-	outputSR = ((cos(degRad(surWidth))*(surPattern*w*sqrt(2.0) + (1-surPattern)*-x)) - (sin(degRad(surWidth))*y))*surGain;
+	outputSL = ((cos(degRad(surWidth))*(surPattern*w*sqrt(2.0) + (1-surPattern)*-x)) + (sin(degRad(surWidth))*y))*pow(10, surGain/20);
+	outputSR = ((cos(degRad(surWidth))*(surPattern*w*sqrt(2.0) + (1-surPattern)*-x)) - (sin(degRad(surWidth))*y))*pow(10, surGain/20);
 };
 
 
 void Decoder::centreMic(double &w, double &x)
 {
-    outputC = (centrePattern*sqrt(2.0)*w + (1-centrePattern)*x) * centreGain;
+    outputC = (centrePattern*sqrt(2.0)*w + (1-centrePattern)*x) * pow(10, centreGain/20);
 };
 
 
-void Decoder::subSignal(double &w)
-{
-    outputS = sqrt(2.0)*w*subGain;
-};
-
 
 void Decoder::heller1(double &w, double &x, double &y, double &z)
 {
@@ -592,42 +607,42 @@
 
 
 void Decoder::filterCoefs(){
-    int k = tan((M_PI*abs(Fc))/Fs);
-    double denominator = pow(k, 2) + 2*k + 1;
+    double k = tan((M_PI*Fc)/Fs);
+    double denominator = pow(k, 2.0) + 2.0*k + 1;
+    
+    clearFilter();
     
     //a values
     a[0] = 1;
-    a[1] = (2*(pow(k,2)-1))/denominator;
-    a[2] = (pow(k, 2) - 2*k + 1)/denominator;
+    a[1] = (2.0*(pow(k, 2.0)-1))/denominator;
+    a[2] = (pow(k, 2.0) - 2.0*k + 1)/denominator;
     
     //b LF value
-    bLF[0] = pow(k, 2) / denominator;
-    bLF[1] = 2 * bLF[0];
+    bLF[0] = pow(k, 2.0) / denominator;
+    bLF[1] = 2.0 * bLF[0];
     bLF[2] = bLF[0];
     
     //b HF values
     bHF[0] = 1/denominator;
     bHF[1] = -2 * bHF[0];
     bHF[2] = bHF[0];
-    
-    clearFilter();
 };
 
 
-void Decoder::filterLF(){
+void Decoder::filterLF(double &w){
     double outLF;
     
     //LF Filtering
-    outLF = (double)outputS*bLF[0] + prevInS[0]*bLF[1] + prevInS[1]*bLF[2] + prevOutS[0]*a[1] + prevOutS[1]*a[2];
+    outLF = w*sqrt(2.0)*bLF[0] + prevInS[0]*bLF[1] + prevInS[1]*bLF[2] - prevOutS[0]*a[1] - prevOutS[1]*a[2];
     
     //Previous Input and Output Samples
     prevOutS[1] = prevOutS[0];
     prevOutS[0] = outLF;
     prevInS[1] = prevInS[0];
-    prevInS[0] = (double)outputS;
+    prevInS[0] = w*sqrt(2.0);
     
     //Final subwoofer Output
-    outputS = outLF;
+    outputS = outLF*pow(10, subGain/20);
 };
 
 
@@ -635,36 +650,36 @@
     double outHFw, outHFx, outHFy, outHFz;
     
     //w Filtering
-    outHFw = -((double)w*bHF[0] + prevInw[0]*bHF[1] + prevInw[1]*bHF[2] + prevOutw[0]*a[1] + prevOutw[1]*a[2]);
+    outHFw = w*bHF[0] + prevInw[0]*bHF[1] + prevInw[1]*bHF[2] - prevOutw[0]*a[1] - prevOutw[1]*a[2];
     prevOutw[1] = prevOutw[0];
     prevOutw[0] = outHFw;
     prevInw[1] = prevInw[0];
-    prevInw[0] = (double)w;
-    w = outHFw;
+    prevInw[0] = w;
+    w = -outHFw;
     
     //x Filtering
-    outHFx = -((double)x*bHF[0] + prevInx[0]*bHF[1] + prevInx[1]*bHF[2] + prevOutx[0]*a[1] + prevOutx[1]*a[2]);
+    outHFx = x*bHF[0] + prevInx[0]*bHF[1] + prevInx[1]*bHF[2] - prevOutx[0]*a[1] - prevOutx[1]*a[2];
     prevOutx[1] = prevOutx[0];
     prevOutx[0] = outHFx;
     prevInx[1] = prevInx[0];
-    prevInx[0] = (double)x;
-    x = outHFx;
+    prevInx[0] = x;
+    x = -outHFx;
     
     //y Filtering
-    outHFy = -((double)y*bHF[0] + prevIny[0]*bHF[1] + prevIny[1]*bHF[2] + prevOuty[0]*a[1] + prevOuty[1]*a[2]);
+    outHFy = y*bHF[0] + prevIny[0]*bHF[1] + prevIny[1]*bHF[2] - prevOuty[0]*a[1] - prevOuty[1]*a[2];
     prevOuty[1] = prevOuty[0];
     prevOuty[0] = outHFy;
     prevIny[1] = prevIny[0];
-    prevIny[0] = (double)y;
-    y = outHFy;
+    prevIny[0] = y;
+    y = -outHFy;
     
     //z Filtering
-    outHFz = -((double)z*bHF[0] + prevInz[0]*bHF[1] + prevInz[1]*bHF[2] + prevOutz[0]*a[1] + prevOutz[1]*a[2]);
+    outHFz = z*bHF[0] + prevInz[0]*bHF[1] + prevInz[1]*bHF[2] - prevOutz[0]*a[1] - prevOutz[1]*a[2];
     prevOutz[1] = prevOutz[0];
     prevOutz[0] = outHFz;
     prevInz[1] = prevInz[0];
-    prevInz[0] = (double)z;
-    z = outHFz;
+    prevInz[0] = z;
+    z = -outHFz;
 };
 
 
--- a/Source/Decoder.h	Tue Sep 25 21:35:17 2012 +0100
+++ b/Source/Decoder.h	Thu Sep 27 12:33:46 2012 +0100
@@ -107,13 +107,9 @@
     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);
-    
     //Filter Code
     void filterCoefs();
-    void filterLF();
+    void filterLF(double &w);
     void filterHF(double &w, double &x, double &y, double &z);
     
     //Decoder Types
--- a/Source/GUI.cpp	Tue Sep 25 21:35:17 2012 +0100
+++ b/Source/GUI.cpp	Thu Sep 27 12:33:46 2012 +0100
@@ -2445,29 +2445,19 @@
 
         switch (index) {
             case kRotate:
-                if (knobRotate) {
-                    exists = true;
-                }
+                    exists = getFrame()->isChild(knobRotate);
                 break;
             case kTilt:
-                if (knobTilt) {
-                    exists = true;
-                }
+                    exists = getFrame()->isChild(knobTilt);
                 break;
             case kTumble:
-                if (knobTumble) {
-                    exists = true;
-                }
+                    exists = getFrame()->isChild(knobTumble);
                 break;
             case kZoom:
-                if (knobZoom) {
-                    exists = true;
-                }
+                    exists = getFrame()->isChild(knobZoom);
                 break;
             case kZoomMethod:
-                if (knobZoomMethod) {
-                    exists = true;
-                }
+                    exists = getFrame()->isChild(knobZoomMethod);
                 break;
             case kMode:
                 if (value<=0.5f) {
@@ -2477,57 +2467,39 @@
                     myPlot->stereo_mode = 1;
                 }
                 myPlot->setDirty();
-                if (knobMode) {
-                    exists = true;
-                }
+                    exists = getFrame()->isChild(knobMode);
                 break;
             case kWidth:
                 myPlot->width = (double)value*90;
                 myPlot->setDirty();
-                if (knobWidth) {
-                    exists = true;
-                }
+                    exists = getFrame()->isChild(knobWidth);
                 break;  
             case kPattern:
                 myPlot->pattern = (double)value;
                 myPlot->setDirty();
-                if (knobPattern) {
-                    exists = true;
-                }
+                    exists = getFrame()->isChild(knobPattern);
                 break;
             case kRearVerb:
-                if (knobHiVerb) {
-                    exists = true;
-                }
+                    exists = getFrame()->isChild(knobHiVerb);
                 break;
             case kHiVerb:
-                if (knobRearVerb) {
-                    exists = true;
-                }
+                    exists = getFrame()->isChild(knobRearVerb);
                 break;
             case kCentrePattern:
                 myPlot->centre_pattern = (double)value;
                 myPlot->setDirty();
-                if (knobCentrePattern) {
-                    exists = true;
-                }
+                    exists = getFrame()->isChild(knobCentrePattern);
                 break;
             case kCentreGain:
                 myPlot->centre_gain = (double)((value*24)-18);
                 myPlot->setDirty();
-                if (knobCentreGain) {
-                    exists = true;
-                }
+                    exists = getFrame()->isChild(knobSurroundWidth);
                 break;
             case kSubGain:
-                if (knobSubGain) {
-                    exists = true;
-                }
+                    exists = getFrame()->isChild(knobSubGain);
                 break;
             case kFc:
-                if (knobFc) {
-                    exists = true;
-                }
+                    exists = getFrame()->isChild(knobFc);
                 break;
             case kSurroundMode:
                 if (value<=0.5f) {
@@ -2537,30 +2509,22 @@
                     myPlot->surround_mode = 1;
                 }
                 myPlot->setDirty();
-                if (knobSurroundMode) {
-                    exists = true;
-                }
+                    exists = getFrame()->isChild(knobSurroundMode);
                 break;
             case kSurroundPattern:
                 myPlot->surround_pattern = (double)value;
                 myPlot->setDirty();
-                if (knobSurroundPattern) {
-                    exists = true;
-                }
+                    exists = getFrame()->isChild(knobSurroundPattern);
                 break;
             case kSurroundWidth:
                 myPlot->surround_width = (double)value*90;
                 myPlot->setDirty();
-                if (knobSurroundWidth) {
-                    exists = true;
-                }
+                    exists = getFrame()->isChild(knobSurroundWidth);
                 break;
             case kSurroundGain:
                 myPlot->surround_gain = (double)((value*24)-18);
                 myPlot->setDirty();
-                if (knobSurroundGain) {
-                    exists = true;
-                }
+                    exists = getFrame()->isChild(knobSurroundGain);
                 break;
             case kDecoderMode:
                 if (value<=0.2f) {
@@ -2580,14 +2544,10 @@
                 }
                 myPlot->setDirty();
                 modeChange();
-                if (knobDecoder) {
-                    exists = true;
-                }
+                    exists = getFrame()->isChild(knobDecoder);
                 break;
             case kChannelOrder:
-                if (knobChannel) {
-                    exists = true;
-                }
+                    exists = getFrame()->isChild(knobChannel);
             
             default:
                 break;
--- a/Source/SoundField.cpp	Tue Sep 25 21:35:17 2012 +0100
+++ b/Source/SoundField.cpp	Thu Sep 27 12:33:46 2012 +0100
@@ -40,9 +40,12 @@
     
     //Set the number of input and output channels
 	setNumInputs (4);	// 4 Channel Classic B-Format Input
-	setNumOutputs (6);	// MAX_CHANNELS 5.1 Outpu
+	setNumOutputs (MAX_CHANNELS);	// MAX_CHANNELS 5.1 Output
+    numberInputs=4;
+    numberOutputs=MAX_CHANNELS;
+    
 	setUniqueID ('MMca');	// this should be unique, use the Steinberg web page for plugin Id registration
-    canDoubleReplacing(); //Plugin can use process double replacing
+    //canDoubleReplacing(); //Plugin can use process double replacing
     canProcessReplacing(); //Plugin can use process replacing
     noTail ();
     
@@ -55,14 +58,8 @@
         bits=32;
     }
     
-    
-	//Load GUI
-    extern AEffGUIEditor* createEditor (AudioEffectX*);
-	setEditor (createEditor (this));
-    
-	resume ();		// flush buffer
-    
-    
+    allocateArrangement (&myInputArrangement, 4);
+    myInputArrangement->type = kSpeakerArr31Cine;
     
 
     //  Declare any variables to their default values
@@ -86,7 +83,7 @@
     fSurroundWidth = 2.f/3.f;
     fSurroundGain = 0.75f;
     fDecoderMode = 0.f;
-    fChannelOrder = 0.f;
+    fChannelOrder = 1.f;
     
 	
     //  myDecoder parameters
@@ -111,7 +108,7 @@
     myDecoder.Fs = sampleRate;
     myDecoder.filterCoefs();
     myDecoder.decoderMode=2; //Default mode is Stereo
-    myDecoder.channelOrder=0;
+    myDecoder.channelOrder=1;
     myDecoder.mode5x=0;
     
     // Zero up decoder outputs as a safety
@@ -313,62 +310,68 @@
     
     
     //5.1 Mode
-    //Name
-    vst_strncpy (programs[4][0].name, "5.1 XY Microphones",kVstMaxProgNameLen);
-    vst_strncpy (programs[4][1].name, "5.1 MS Microphones",kVstMaxProgNameLen);
-    vst_strncpy (programs[4][2].name, "5.1 Blumlein Fig8s",kVstMaxProgNameLen);
-    vst_strncpy (programs[4][3].name, "5.1 Heller et. al. 1",kVstMaxProgNameLen);
-    vst_strncpy (programs[4][4].name, "5.1 Heller et. al. 2",kVstMaxProgNameLen);
-    //Mode
-    programs[4][0].mode = 0.f;
-    programs[4][1].mode = 1.f;
-    programs[4][2].mode = 0.f;
-    //Width
-    programs[4][0].width = (1.f/3.f);
-    programs[4][1].width = (1.f/3.f);
-    programs[4][2].width = 0.5f;
-    //Pattern
-    programs[4][0].pattern = 0.5f;
-    programs[4][1].pattern = 0.5f;
-    programs[4][2].pattern = 0.f;
-    //Centre Pattern
-    programs[4][0].centrePattern = 0.5f;
-    programs[4][1].centrePattern = 0.5f;
-    programs[4][2].centrePattern = 0.0f;
-    //Centre Gain
-    programs[4][0].centreGain = 0.75f;
-    programs[4][1].centreGain = 0.75f;
-    programs[4][2].centreGain = 0.75f;
-    //SubGain
-    programs[4][0].subGain = 0.75f;
-    programs[4][1].subGain = 0.75f;
-    programs[4][2].subGain = 0.75f;
-    programs[4][3].subGain = 0.75f;
-    programs[4][4].subGain = 0.75f;
-    //FC
-    programs[4][0].fc = 5.0f/11.0f;
-    programs[4][1].fc = 5.0f/11.0f;
-    programs[4][2].fc = 5.0f/11.0f;
-    programs[4][3].fc = 5.0f/11.0f;
-    programs[4][4].fc = 5.0f/11.0f;
-    //Surround Mode
-    programs[4][0].surroundMode = 0.f;
-    programs[4][1].surroundMode = 1.f;
-    programs[4][2].surroundMode = 0.f;
-    //Surround Width
-    programs[4][0].surroundWidth = (5.5f/9.f);
-    programs[4][1].surroundWidth = (5.5f/9.f);
-    programs[4][2].surroundWidth = 0.5f;
-    //Surround Pattern
-    programs[4][0].surroundPattern = 0.5;
-    programs[4][1].surroundPattern = 0.5;
-    programs[4][2].surroundPattern = 0.0;
-    //Surround Gain
-    programs[4][0].surroundGain = 0.75f;
-    programs[4][1].surroundGain = 0.75f;
-    programs[4][2].surroundGain = 0.75f;
+        //Name
+        vst_strncpy (programs[4][0].name, "5.1 XY Microphones",kVstMaxProgNameLen);
+        vst_strncpy (programs[4][1].name, "5.1 MS Microphones",kVstMaxProgNameLen);
+        vst_strncpy (programs[4][2].name, "5.1 Blumlein Fig8s",kVstMaxProgNameLen);
+        vst_strncpy (programs[4][3].name, "5.1 Heller et. al. 1",kVstMaxProgNameLen);
+        vst_strncpy (programs[4][4].name, "5.1 Heller et. al. 2",kVstMaxProgNameLen);
+        //Mode
+        programs[4][0].mode = 0.f;
+        programs[4][1].mode = 1.f;
+        programs[4][2].mode = 0.f;
+        //Width
+        programs[4][0].width = (1.f/3.f);
+        programs[4][1].width = (1.f/3.f);
+        programs[4][2].width = 0.5f;
+        //Pattern
+        programs[4][0].pattern = 0.5f;
+        programs[4][1].pattern = 0.5f;
+        programs[4][2].pattern = 0.f;
+        //Centre Pattern
+        programs[4][0].centrePattern = 0.5f;
+        programs[4][1].centrePattern = 0.5f;
+        programs[4][2].centrePattern = 0.0f;
+        //Centre Gain
+        programs[4][0].centreGain = 0.75f;
+        programs[4][1].centreGain = 0.75f;
+        programs[4][2].centreGain = 0.75f;
+        //SubGain
+        programs[4][0].subGain = 0.75f;
+        programs[4][1].subGain = 0.75f;
+        programs[4][2].subGain = 0.75f;
+        programs[4][3].subGain = 0.75f;
+        programs[4][4].subGain = 0.75f;
+        //FC
+        programs[4][0].fc = 5.0f/11.0f;
+        programs[4][1].fc = 5.0f/11.0f;
+        programs[4][2].fc = 5.0f/11.0f;
+        programs[4][3].fc = 5.0f/11.0f;
+        programs[4][4].fc = 5.0f/11.0f;
+        //Surround Mode
+        programs[4][0].surroundMode = 0.f;
+        programs[4][1].surroundMode = 1.f;
+        programs[4][2].surroundMode = 0.f;
+        //Surround Width
+        programs[4][0].surroundWidth = (5.5f/9.f);
+        programs[4][1].surroundWidth = (5.5f/9.f);
+        programs[4][2].surroundWidth = 0.5f;
+        //Surround Pattern
+        programs[4][0].surroundPattern = 0.5;
+        programs[4][1].surroundPattern = 0.5;
+        programs[4][2].surroundPattern = 0.0;
+        //Surround Gain
+        programs[4][0].surroundGain = 0.75f;
+        programs[4][1].surroundGain = 0.75f;
+        programs[4][2].surroundGain = 0.75f;
 
     
+    //Load GUI
+    extern AEffGUIEditor* createEditor (AudioEffectX*);
+	setEditor (createEditor (this));
+    
+	resume ();		// flush buffer
+    
     //Load Program0 default
     setProgram(0);
 }
@@ -394,23 +397,157 @@
 
 
 
+
+
 //------------------------------------------------------------------------
 bool SoundField::setSpeakerArrangement (VstSpeakerArrangement* pluginInput,
                                         VstSpeakerArrangement* pluginOutput)
 {
     numberInputs = pluginInput->numChannels;
     numberOutputs = pluginOutput->numChannels;
+    
+    
 
-	return true;
+    bool result;//What to return, true for acceptable speaker arrangement
+    
+    
+    switch (pluginOutput->type) {
+        case kSpeakerArr51://5.1 Output
+        {
+            if (pluginInput->type==kSpeakerArr31Cine) {
+                result = true;
+                }
+            else {
+                allocateArrangement (&myInputArrangement, 4);
+                myInputArrangement->type = kSpeakerArr31Cine;
+                result = false;
+            }
+            break;
+        }
+            
+//        case kSpeakerArr50://NOT WORKING AS INTENDED
+//        {
+//            if (pluginInput->numChannels==4) {
+//                result = true;
+//            }
+//            else {
+//                allocateArrangement (&myInputArrangement, 4);
+//                myInputArrangement->numChannels = 4;
+//                result = false;
+//            }
+//            break;
+//        }
+            
+        case kSpeakerArr40Cine://4.0 Output (LRCS)
+        {
+            if (pluginInput->type==kSpeakerArr40Cine) {
+                result = true;
+            }
+            else {
+                allocateArrangement (&myInputArrangement, 4);
+                myInputArrangement->type = kSpeakerArr40Cine;
+                result = false;
+            }
+            break;
+        }
+            
+        case kSpeakerArr40Music://4.0 Output (Music)
+        {
+            if (pluginInput->type==kSpeakerArr40Music) {
+                result = true;
+            }
+            else {
+                allocateArrangement (&myInputArrangement, 4);
+                myInputArrangement->type = kSpeakerArr40Music;
+                result = false;
+            }
+            break;
+        }
+            
+        case kSpeakerArrStereo:
+        {
+            if (pluginInput->type==kSpeakerArr40Music) {
+                result = true;
+            }
+            else {
+                result = false;
+            }
+            break;
+        }
+            
+            
+        default:
+        {
+            if (pluginInput->type==kSpeakerArr31Cine) {
+                result = true;
+            }
+            else {
+                allocateArrangement (&myInputArrangement, 4);
+                myInputArrangement->type = kSpeakerArr31Cine;
+                result = false;
+            }
+            break;
+        }
+    }
+    
+    return result;
 }
 
 
+//------------------------------------------------------------------------
+bool SoundField::getSpeakerArrangement(VstSpeakerArrangement **pluginInput, VstSpeakerArrangement **pluginOutput)
+{
+	*pluginInput  = myInputArrangement;
+	//*pluginOutput = myOutputArrangement;
+    
+    return true;
+}
+
+
+
+////------------------------------------------------------------------------
+//bool SoundField::getInputProperties(VstInt32 index, VstPinProperties *properties)
+//{
+//    bool returnCode = false;
+//    if (index < numberInputs)
+//    {
+//        sprintf (properties->label, "My %1d In", index + 1);
+//        sprintf (properties->shortLabel, "%1d In", index + 1);
+//        properties->flags = kVstPinIsActive;
+//        returnCode = true;
+//    }
+//    return returnCode;
+//}
+//
+//
+////------------------------------------------------------------------------
+//bool SoundField::getOutputProperties(VstInt32 index, VstPinProperties *properties)
+//{
+//    bool returnCode = false;
+//    if (index < numberOutputs)
+//    {
+//        sprintf (properties->label, "My %1d Out", index + 1);
+//        sprintf (properties->shortLabel, "%1d Out", index + 1);
+//        properties->flags = kVstPinIsActive;
+//        returnCode = true;
+//    }
+//    return (returnCode);
+//}
+
+
+
+//------------------------------------------------------------------------
+VstInt32 SoundField::getVstVersion()
+{
+    return kVstVersion;
+}
 
 
 //------------------------------------------------------------------------
 SoundField::~SoundField () //clears protected variables
 {
-	//if (programs)
+	deallocateArrangement (&myInputArrangement);
+    //deallocateArrangement (&myOutputArrangement);
 }
 
 
@@ -458,101 +595,105 @@
 void SoundField::setProgram(VstInt32 program)
 {
     curProgram = program;
-    switch (myDecoder.decoderMode) {
-        case 2:
-            setParameter(kMode, programs[0][program].mode);
-            setParameter(kWidth, programs[0][program].width);
-            setParameter(kPattern, programs[0][program].pattern);
-            setParameter(kRearVerb, programs[0][program].rearVerb);
-            setParameter(kHiVerb, programs[0][program].hiVerb);
-            break;
-        case 3:
-            setParameter(kMode, programs[1][program].mode);
-            setParameter(kWidth, programs[1][program].width);
-            setParameter(kPattern, programs[1][program].pattern);
-            setParameter(kRearVerb, programs[1][program].rearVerb);
-            setParameter(kHiVerb, programs[1][program].hiVerb);
-            setParameter(kSubGain, programs[1][program].subGain);
-            setParameter(kFc, programs[1][program].fc);
-            break;
-        case 4:
-            setParameter(kMode, programs[2][program].mode);
-            setParameter(kWidth, programs[2][program].width);
-            setParameter(kSurroundMode, programs[2][program].surroundMode);
-            setParameter(kSurroundWidth, programs[2][program].surroundWidth);
-            setParameter(kSurroundPattern, programs[2][program].surroundPattern);
-            setParameter(kSurroundGain, programs[2][program].surroundGain);
-            break;
-        case 5:
-            if (program<3) {
-                myDecoder.mode5x=0;
+    
+        switch (myDecoder.decoderMode) {
+            case 2:
+                setParameter(kMode, programs[0][program].mode);
+                setParameter(kWidth, programs[0][program].width);
+                setParameter(kPattern, programs[0][program].pattern);
+                setParameter(kRearVerb, programs[0][program].rearVerb);
+                setParameter(kHiVerb, programs[0][program].hiVerb);
+                break;
+            case 3:
+                setParameter(kMode, programs[1][program].mode);
+                setParameter(kWidth, programs[1][program].width);
+                setParameter(kPattern, programs[1][program].pattern);
+                setParameter(kRearVerb, programs[1][program].rearVerb);
+                setParameter(kHiVerb, programs[1][program].hiVerb);
+                setParameter(kSubGain, programs[1][program].subGain);
+                setParameter(kFc, programs[1][program].fc);
+                break;
+            case 4:
+                setParameter(kMode, programs[2][program].mode);
+                setParameter(kWidth, programs[2][program].width);
+                setParameter(kPattern, programs[2][program].pattern);
+                setParameter(kSurroundMode, programs[2][program].surroundMode);
+                setParameter(kSurroundWidth, programs[2][program].surroundWidth);
+                setParameter(kSurroundPattern, programs[2][program].surroundPattern);
+                setParameter(kSurroundGain, programs[2][program].surroundGain);
+                break;
+            case 5:
+                if (program<3) {
+                    myDecoder.mode5x=0;
+                    
+                    setParameter(kMode, programs[3][program].mode);
+                    setParameter(kWidth, programs[3][program].width);
+                    setParameter(kPattern, programs[3][program].pattern);
+                    setParameter(kCentrePattern, programs[3][program].centrePattern);
+                    setParameter(kCentreGain, programs[3][program].centreGain);
+                    setParameter(kSurroundMode, programs[3][program].surroundMode);
+                    setParameter(kSurroundWidth, programs[3][program].surroundWidth);
+                    setParameter(kSurroundPattern, programs[3][program].surroundPattern);
+                    setParameter(kSurroundGain, programs[3][program].surroundGain);
+                    if (editor){
+                        ((AEffGUIEditor*)editor)->setParameter (103, 0.f);
+                    }
+                }
+                else if (program==3) {
+                    myDecoder.mode5x=1;
+                    if (editor){
+                        ((AEffGUIEditor*)editor)->setParameter (103, 0.5f);
+                    }
+                }
+                else if (program==4) {
+                    myDecoder.mode5x=2;
+                    if (editor){
+                        ((AEffGUIEditor*)editor)->setParameter (103, 1.f);
+                    }
+                }
+                break;
+            case 6:
+                if (program<3) {
+                    myDecoder.mode5x=0;
+                    
+                    setParameter(kMode, programs[4][program].mode);
+                    setParameter(kWidth, programs[4][program].width);
+                    setParameter(kPattern, programs[4][program].pattern);
+                    setParameter(kCentrePattern, programs[4][program].centrePattern);
+                    setParameter(kCentreGain, programs[4][program].centreGain);
+                    setParameter(kSubGain, programs[4][program].subGain);
+                    setParameter(kFc, programs[4][program].fc);
+                    setParameter(kSurroundMode, programs[4][program].surroundMode);
+                    setParameter(kSurroundWidth, programs[4][program].surroundWidth);
+                    setParameter(kSurroundPattern, programs[4][program].surroundPattern);
+                    setParameter(kSurroundGain, programs[4][program].surroundGain);
+                    if (editor){
+                        ((AEffGUIEditor*)editor)->setParameter (103, 0.f);
+                    }
+                }
+                else if (program==3) {
+                    //Only set the sub
+                    setParameter(kSubGain, programs[4][program].subGain);
+                    setParameter(kFc, programs[4][program].fc);
+                    myDecoder.mode5x=1;
+                    if (editor){
+                        ((AEffGUIEditor*)editor)->setParameter (103, 0.5f);
+                    }
+                }
+                else if (program==4) {
+                    //Only set the sub
+                    setParameter(kSubGain, programs[4][program].subGain);
+                    setParameter(kFc, programs[4][program].fc);
+                    myDecoder.mode5x=2;
+                    if (editor){
+                        ((AEffGUIEditor*)editor)->setParameter (103, 1.f);
+                    }
+                }
+                break;
                 
-                setParameter(kMode, programs[3][program].mode);
-                setParameter(kWidth, programs[3][program].width);
-                setParameter(kCentrePattern, programs[3][program].centrePattern);
-                setParameter(kCentreGain, programs[3][program].centreGain);
-                setParameter(kSurroundMode, programs[3][program].surroundMode);
-                setParameter(kSurroundWidth, programs[3][program].surroundWidth);
-                setParameter(kSurroundPattern, programs[3][program].surroundPattern);
-                setParameter(kSurroundGain, programs[3][program].surroundGain);
-                if (editor){
-                    ((AEffGUIEditor*)editor)->setParameter (103, 0.f);
-                }
-            }
-            else if (program==3) {
-                myDecoder.mode5x=1;
-                if (editor){
-                    ((AEffGUIEditor*)editor)->setParameter (103, 0.5f);
-                }
-            }
-            else if (program==4) {
-                myDecoder.mode5x=2;
-                if (editor){
-                    ((AEffGUIEditor*)editor)->setParameter (103, 1.f);
-                }
-            }
-            break;
-        case 6:
-            if (program<3) {
-                myDecoder.mode5x=0;
-                
-                setParameter(kMode, programs[4][program].mode);
-                setParameter(kWidth, programs[4][program].width);
-                setParameter(kCentrePattern, programs[4][program].centrePattern);
-                setParameter(kCentreGain, programs[4][program].centreGain);
-                setParameter(kSubGain, programs[4][program].subGain);
-                setParameter(kFc, programs[4][program].fc);
-                setParameter(kSurroundMode, programs[4][program].surroundMode);
-                setParameter(kSurroundWidth, programs[4][program].surroundWidth);
-                setParameter(kSurroundPattern, programs[4][program].surroundPattern);
-                setParameter(kSurroundGain, programs[4][program].surroundGain);
-                if (editor){
-                    ((AEffGUIEditor*)editor)->setParameter (103, 0.f);
-                }
-            }
-            else if (program==3) {
-                //Only set the sub
-                setParameter(kSubGain, programs[4][program].subGain);
-                setParameter(kFc, programs[4][program].fc);
-                myDecoder.mode5x=1;
-                if (editor){
-                    ((AEffGUIEditor*)editor)->setParameter (103, 0.5f);
-                }
-            }
-            else if (program==4) {
-                //Only set the sub
-                setParameter(kSubGain, programs[4][program].subGain);
-                setParameter(kFc, programs[4][program].fc);
-                myDecoder.mode5x=2;
-                if (editor){
-                    ((AEffGUIEditor*)editor)->setParameter (103, 1.f);
-                }
-            }
-            break;
-            
-        default:
-            break;
-    }
+            default:
+                break;
+        }
 }
 
 
@@ -696,19 +837,64 @@
             break;
         case kDecoderMode:
             fDecoderMode = value;
-            if (value<=0.2f) {
+            if (value<=0.125f) {
+//                if (myDecoder.channelOrder==0) {
+//                    setNumOutputs(2);
+//                    allocateArrangement (&myOutputArrangement, 2);
+//                    myOutputArrangement->type = kSpeakerArrStereo;
+//                    setNumInputs(4);
+//                    allocateArrangement (&myInputArrangement, 4);
+//                    myInputArrangement->type = kSpeakerArr31Cine;
+//                    ioChanged();
+//                }
 				myDecoder.decoderMode = 2; //Stereo
 			}
-			else if (value>0.2f && value<=0.4f) {
+			else if (value>0.125f && value<=0.375f) {
+//                if (myDecoder.channelOrder==0) {
+//                    setNumOutputs(3);
+//                    allocateArrangement (&myOutputArrangement, 3);
+//                    myOutputArrangement->type = kSpeakerArr30Music;
+//                    setNumInputs(4);
+//                    allocateArrangement (&myInputArrangement, 4);
+//                    myInputArrangement->type = kSpeakerArr31Cine;
+//                    ioChanged();
+//                }
 				myDecoder.decoderMode = 3; //2.1
 			}
-			else if (value>0.4f && value<=0.6f) {
+			else if (value>0.375f && value<=0.625f) {
+//                if (myDecoder.channelOrder==0) {
+//                    setNumOutputs(6);
+//                    allocateArrangement (&myOutputArrangement, 4);
+//                    myOutputArrangement->type = kSpeakerArr40Music;
+//                    setNumInputs(4);
+//                    allocateArrangement (&myInputArrangement, 4);
+//                    myInputArrangement->type = kSpeakerArr31Cine;
+//                    ioChanged();
+//                }
 				myDecoder.decoderMode = 4; //Quad
 			}
-			else if (value>0.6f && value<=0.8f) {
+			else if (value>0.625f && value<=0.875f) {
+//                if (myDecoder.channelOrder==0) {
+//                    setNumOutputs(5);
+//                    allocateArrangement (&myOutputArrangement, 5);
+//                    myOutputArrangement->type = kSpeakerArr50;
+//                    setNumInputs(4);
+//                    allocateArrangement (&myInputArrangement, 4);
+//                    myInputArrangement->type = kSpeakerArr31Cine;
+//                    ioChanged();
+//                }
 				myDecoder.decoderMode = 5; //5.0
 			}
-            else if (value>0.8f && value<=1.0f) {
+            else if (value>0.875f) {
+//                if (myDecoder.channelOrder==0) {
+//                    setNumOutputs(6);
+//                    allocateArrangement (&myOutputArrangement, 6);
+//                    myOutputArrangement->type = kSpeakerArr51;
+//                    setNumInputs(4);
+//                    allocateArrangement (&myInputArrangement, 4);
+//                    myInputArrangement->type = kSpeakerArr31Cine;
+//                    ioChanged();
+//                }
 				myDecoder.decoderMode = 6; //5.1
 			}
             updateDisplay();
@@ -717,9 +903,17 @@
             fChannelOrder = value;
 			if (value<=0.5f) {
 				myDecoder.channelOrder = 0; //Natural Outputs
+//                setParameter(kDecoderMode, fDecoderMode);
 			}
 			else {
-				myDecoder.channelOrder = 1; //5.1 Outputs
+//                setNumOutputs(6);
+//                allocateArrangement (&myOutputArrangement, 6);
+//                myOutputArrangement->type = kSpeakerArr51;
+//                setNumInputs(4);
+//                allocateArrangement (&myInputArrangement, 4);
+//                myInputArrangement->type = kSpeakerArr31Cine;
+//                ioChanged();
+                myDecoder.channelOrder = 1; //5.1 Outputs
 			}
             break;
             
@@ -919,7 +1113,6 @@
 			sprintf (text, "%.1f\u00B0", myDecoder.Width);
 			break;
 		case kPattern:
-			//sprintf (text, "%.1f", myDecoder.Pattern);
 			if (myDecoder.Pattern<=0.125) {
 				strcpy(text, "Fig-of-8");
 			}
@@ -1074,7 +1267,6 @@
         default:
             break;
 	}
-	//kVstMaxParamStrLen
 }
 
 
@@ -1197,34 +1389,46 @@
         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) {
+
+        if (numOut<numberOutputs){
             for (int i=0; i<numOut; i++)
-                *outputs[i]++ = float(myDecoder.output[i]);                
+                *outputs[i]++ = float(myDecoder.output[i]);
+            for (int i=numOut; i<numberOutputs; i++)
+                *outputs[i]++ = 0.f;
+        }
+        else if (numOut==numberOutputs){
+            for (int i=0; i<numOut; i++)
+                *outputs[i]++ = float(myDecoder.output[i]);
         }
         else{
             for (int i=0; i<numberOutputs; i++)
@@ -1243,38 +1447,50 @@
         double w, x, y, z;
         switch (numberInputs) {
             case 3:
-                w = (double) *inputs[0]++;
-                x = (double) *inputs[1]++;
-                y = (double) *inputs[2]++;
+            {
+                w = *inputs[0]++;
+                x = *inputs[1]++;
+                y = *inputs[2]++;
                 z = 0;
                 break;
+            }
                 
             case 4:
-                w = (double) *inputs[0]++;
-                x = (double) *inputs[1]++;
-                y = (double) *inputs[2]++;
-                z = (double) *inputs[3]++;
+            {
+                w = *inputs[0]++;
+                x = *inputs[1]++;
+                y = *inputs[2]++;
+                z = *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) {
+        if (numOut<numberOutputs){
             for (int i=0; i<numOut; i++)
-                *outputs[i]++ = float(myDecoder.output[i]);
+                *outputs[i]++ = myDecoder.output[i];
+            for (int i=numOut; i<numberOutputs; i++)
+                *outputs[i]++ = 0.0;
+        }
+        else if (numOut==numberOutputs){
+            for (int i=0; i<numOut; i++)
+                *outputs[i]++ = myDecoder.output[i];
         }
         else{
             for (int i=0; i<numberOutputs; i++)
-                *outputs[i]++ = float(myDecoder.output[i]);
+                *outputs[i]++ = myDecoder.output[i];
         }
 	}
 }
\ No newline at end of file
--- a/Source/SoundField.h	Tue Sep 25 21:35:17 2012 +0100
+++ b/Source/SoundField.h	Thu Sep 27 12:33:46 2012 +0100
@@ -10,14 +10,14 @@
 // © 2006, Steinberg Media Technologies, All Rights Reserved
 //-------------------------------------------------------------------------------------------------------
 
-#define kNumPrograms 5 //Number of Programs 
+#define kNumPrograms 5 //Number of Programs
 #define MAX_CHANNELS 6 //Max Input/Output Count
 #define VERSION      1000 //Plugin Version
+#define kVstVersion  2400 //Plugin implemented in VST Version
 
 #ifndef __SoundField__
 #define __SoundField__
 
-
 //VST SDK Header(s)
 #include "audioeffectx.h"
 
@@ -92,15 +92,21 @@
 	virtual bool getVendorString (char* text);
 	virtual bool getProductString (char* text);
 	virtual VstInt32 getVendorVersion ();
+    virtual VstInt32 getVstVersion();
 
 	virtual VstPlugCategory getPlugCategory () { return kPlugCategSpacializer; }
 	virtual bool setSpeakerArrangement (VstSpeakerArrangement* pluginInput, VstSpeakerArrangement* pluginOutput);
-
+    virtual bool getSpeakerArrangement (VstSpeakerArrangement **pluginInput, VstSpeakerArrangement **pluginOutput);
+//    virtual bool getInputProperties	(VstInt32 index, VstPinProperties *properties);
+//    virtual bool getOutputProperties (VstInt32 index, VstPinProperties *properties);
+    
     
     // Variables
     char label[20];
     int bits;
 	Decoder myDecoder;
+    VstSpeakerArrangement* myInputArrangement;
+    //VstSpeakerArrangement* myOutputArrangement;