# HG changeset patch # User martinm_home # Date 1348745626 -3600 # Node ID 76e2e62635b40e29aeb692b4cf0038b80a3b1b90 # Parent b5d48e9b9aeaf17bb675325bf262d65815ae0de1 Fixed the automation problem when a control isn't a child. diff -r b5d48e9b9aea -r 76e2e62635b4 Classic Ambisonics Decoder VST.xcodeproj/project.xcworkspace/xcuserdata/momont.xcuserdatad/UserInterfaceState.xcuserstate Binary file Classic Ambisonics Decoder VST.xcodeproj/project.xcworkspace/xcuserdata/momont.xcuserdatad/UserInterfaceState.xcuserstate has changed diff -r b5d48e9b9aea -r 76e2e62635b4 Classic Ambisonics Decoder VST.xcodeproj/xcuserdata/momont.xcuserdatad/xcschemes/Classic Ambisonics Decoder VST.xcscheme --- 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"> + FilePath = "/Applications/Cubase 5.app"> 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; }; diff -r b5d48e9b9aea -r 76e2e62635b4 Source/Decoder.h --- 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 diff -r b5d48e9b9aea -r 76e2e62635b4 Source/GUI.cpp --- 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; diff -r b5d48e9b9aea -r 76e2e62635b4 Source/SoundField.cpp --- 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