annotate Source/ClassicAmbiDec.cpp @ 13:989865d55c73 tip

Commit.
author martinm_home <martin.morrell@eecs.qmul.ac.uk>
date Thu, 27 Sep 2012 23:30:29 +0100
parents 87dc3d84c120
children
rev   line source
martin@12 1 #ifndef __ClassicAmbiDec__
martin@12 2 #include "ClassicAmbiDec.h"
martin@12 3 #endif
martin@12 4 //C++ Headers
martin@12 5 #include <stdio.h>
martin@12 6 #include <string.h>
martin@12 7 #include <cmath>
martin@12 8
martin@12 9 //GUI Headers
martin@12 10 #include "aeffguieditor.h"
martin@12 11
martin@12 12
martin@12 13 //-----------------------------------------------------------------------------
martin@12 14 ClassicAmbiDecProgram::ClassicAmbiDecProgram()
martin@12 15 {
martin@12 16
martin@12 17 }
martin@12 18
martin@12 19
martin@12 20
martin@12 21 //-----------------------------------------------------------------------------
martin@12 22 ClassicAmbiDec::ClassicAmbiDec (audioMasterCallback audioMaster)
martin@12 23 : AudioEffectX (audioMaster, kNumPrograms, kNumParameters)
martin@12 24 {
martin@12 25
martin@12 26
martin@12 27 //Set the number of input and output channels
martin@12 28 setNumInputs (4); // 4 Channel Classic B-Format Input
martin@12 29 setNumOutputs (MAX_CHANNELS); // MAX_CHANNELS 5.1 Output
martin@12 30
martin@12 31 //Initially set the number of inputs and outputs incase (set|get)SpeakerArrangement isn't called
martin@12 32 numberInputs=4;
martin@12 33 numberOutputs=MAX_CHANNELS;
martin@12 34 allocateArrangement (&myInputArrangement, 4);
martin@12 35 myInputArrangement->type = kSpeakerArr31Cine;
martin@12 36
martin@12 37 setUniqueID ('MMca');
martin@12 38 canDoubleReplacing(); //Plugin can use process double replacing
martin@12 39 canProcessReplacing(); //Plugin can use process replacing
martin@12 40 noTail ();
martin@12 41
martin@12 42 bool bit64 = setProcessPrecision(kVstProcessPrecision64);
martin@12 43 if (bit64==true) {
martin@12 44 bits=64;
martin@12 45 }
martin@12 46 else{
martin@12 47 bits=32;
martin@12 48 }
martin@12 49
martin@12 50
martin@12 51 // Declare any variables to their default values
martin@12 52 fMode = 0.f;
martin@12 53 fWidth = 0.5f;
martin@12 54 fPattern = 0.5f;
martin@12 55 fRotate = 0.5f;
martin@12 56 fTilt = 0.5f;
martin@12 57 fTumble = 0.5f;
martin@12 58 fZoom = 0.5f;
martin@12 59 fZoomMethod = 0.f;
martin@12 60 fRearVerb = 0.f;
martin@12 61 fHiVerb = 0.f;
martin@12 62 fCentrePattern =0.5f;
martin@12 63 fCentreGain = 0.75f;
martin@12 64 fSubGain = 0.75f;
martin@12 65 fFc = 5.0f/11.0f;
martin@12 66 fSurroundMode = 0.f;
martin@12 67 fSurroundPattern = 0.5;
martin@12 68 fSurroundWidth = 2.f/3.f;
martin@12 69 fSurroundGain = 0.75f;
martin@12 70 fDecoderMode = 0.f;
martin@12 71 fChannelOrder = 1.f;
martin@12 72
martin@12 73 myDecoder.Fs = sampleRate;
martin@12 74 myDecoder.filterCoefs();
martin@12 75
martin@12 76
martin@12 77 programs_20 = new ClassicAmbiDecProgram[kNumParameters];
martin@12 78 programs_21 = new ClassicAmbiDecProgram[kNumParameters];
martin@12 79 programs_40 = new ClassicAmbiDecProgram[kNumParameters];
martin@12 80 programs_50 = new ClassicAmbiDecProgram[kNumParameters];
martin@12 81 programs_51 = new ClassicAmbiDecProgram[kNumParameters];
martin@12 82
martin@12 83 //Initailise all the programs
martin@12 84 //Stereo Mode
martin@12 85 //Name
martin@12 86 vst_strncpy (programs_20[0].name, "Stereo XY Microphones",kVstMaxProgNameLen);
martin@12 87 vst_strncpy (programs_20[1].name, "Stereo MS Microphones",kVstMaxProgNameLen);
martin@12 88 vst_strncpy (programs_20[2].name, "Stereo Blumlein Fig8s",kVstMaxProgNameLen);
martin@12 89 vst_strncpy (programs_20[3].name, "Stereo XY with 'Verb",kVstMaxProgNameLen);
martin@12 90 vst_strncpy (programs_20[4].name, "Stereo MS with 'Verb",kVstMaxProgNameLen);
martin@12 91 //Mode
martin@12 92 programs_20[0].mode = 0.f;
martin@12 93 programs_20[1].mode = 1.f;
martin@12 94 programs_20[2].mode = 0.f;
martin@12 95 programs_20[3].mode = 0.f;
martin@12 96 programs_20[4].mode = 1.f;
martin@12 97 //Width
martin@12 98 programs_20[0].width = (1.f/3.f);
martin@12 99 programs_20[1].width = (1.f/3.f);
martin@12 100 programs_20[2].width = 0.5f;
martin@12 101 programs_20[3].width = (1.f/3.f);
martin@12 102 programs_20[4].width = (1.f/3.f);
martin@12 103 //Pattern
martin@12 104 programs_20[0].pattern = 0.5f;
martin@12 105 programs_20[1].pattern = 0.5f;
martin@12 106 programs_20[2].pattern = 0.f;
martin@12 107 programs_20[3].pattern = 0.5f;
martin@12 108 programs_20[4].pattern = 0.5f;
martin@12 109 //RearVerb
martin@12 110 programs_20[0].rearVerb = 0.f;
martin@12 111 programs_20[1].rearVerb = 0.f;
martin@12 112 programs_20[2].rearVerb = 0.f;
martin@12 113 programs_20[3].rearVerb = 0.75f;
martin@12 114 programs_20[4].rearVerb = 0.75f;
martin@12 115 //HiVerb
martin@12 116 programs_20[0].hiVerb = 0.f;
martin@12 117 programs_20[1].hiVerb = 0.f;
martin@12 118 programs_20[2].hiVerb = 0.f;
martin@12 119 programs_20[3].hiVerb = 0.25f;
martin@12 120 programs_20[4].hiVerb = 0.25f;
martin@12 121
martin@12 122
martin@12 123 //2.1 Mode
martin@12 124 //Name
martin@12 125 vst_strncpy (programs_21[0].name, "2.1 XY Microphones",kVstMaxProgNameLen);
martin@12 126 vst_strncpy (programs_21[1].name, "2.1 MS Microphones",kVstMaxProgNameLen);
martin@12 127 vst_strncpy (programs_21[2].name, "2.1 Blumlein Fig8s",kVstMaxProgNameLen);
martin@12 128 vst_strncpy (programs_21[3].name, "2.1 XY with 'Verb",kVstMaxProgNameLen);
martin@12 129 vst_strncpy (programs_21[4].name, "2.1 MS with 'Verb",kVstMaxProgNameLen);
martin@12 130 //Mode
martin@12 131 programs_21[0].mode = 0.f;
martin@12 132 programs_21[1].mode = 1.f;
martin@12 133 programs_21[2].mode = 0.f;
martin@12 134 programs_21[3].mode = 0.f;
martin@12 135 programs_21[4].mode = 1.f;
martin@12 136 //Width
martin@12 137 programs_21[0].width = (1.f/3.f);
martin@12 138 programs_21[1].width = (1.f/3.f);
martin@12 139 programs_21[2].width = 0.5f;
martin@12 140 programs_21[3].width = (1.f/3.f);
martin@12 141 programs_21[4].width = (1.f/3.f);
martin@12 142 //Pattern
martin@12 143 programs_21[0].pattern = 0.5f;
martin@12 144 programs_21[1].pattern = 0.5f;
martin@12 145 programs_21[2].pattern = 0.f;
martin@12 146 programs_21[3].pattern = 0.5f;
martin@12 147 programs_21[4].pattern = 0.5f;
martin@12 148 //RearVerb
martin@12 149 programs_21[0].rearVerb = 0.f;
martin@12 150 programs_21[1].rearVerb = 0.f;
martin@12 151 programs_21[2].rearVerb = 0.f;
martin@12 152 programs_21[3].rearVerb = 0.75f;
martin@12 153 programs_21[4].rearVerb = 0.75f;
martin@12 154 //HiVerb
martin@12 155 programs_21[0].hiVerb = 0.f;
martin@12 156 programs_21[1].hiVerb = 0.f;
martin@12 157 programs_21[2].hiVerb = 0.f;
martin@12 158 programs_21[3].hiVerb = 0.25f;
martin@12 159 programs_21[4].hiVerb = 0.25f;
martin@12 160 //SubGain
martin@12 161 programs_21[0].subGain = 0.75f;
martin@12 162 programs_21[1].subGain = 0.75f;
martin@12 163 programs_21[2].subGain = 0.75f;
martin@12 164 programs_21[3].subGain = 0.75f;
martin@12 165 programs_21[4].subGain = 0.75f;
martin@12 166 //FC
martin@12 167 programs_21[0].fc = 5.0f/11.0f;
martin@12 168 programs_21[1].fc = 5.0f/11.0f;
martin@12 169 programs_21[2].fc = 5.0f/11.0f;
martin@12 170 programs_21[3].fc = 5.0f/11.0f;
martin@12 171 programs_21[4].fc = 5.0f/11.0f;
martin@12 172
martin@12 173
martin@12 174
martin@12 175 //Quad Mode
martin@12 176 //Name
martin@12 177 vst_strncpy (programs_40[0].name, "Quad XY Microphones",kVstMaxProgNameLen);
martin@12 178 vst_strncpy (programs_40[1].name, "Quad MS Microphones",kVstMaxProgNameLen);
martin@12 179 vst_strncpy (programs_40[2].name, "Quad Blumlein Fig8s",kVstMaxProgNameLen);
martin@12 180 vst_strncpy (programs_40[3].name, "Quad XY with MS",kVstMaxProgNameLen);
martin@12 181 vst_strncpy (programs_40[4].name, "Quad MS with XY",kVstMaxProgNameLen);
martin@12 182 //Mode
martin@12 183 programs_40[0].mode = 0.f;
martin@12 184 programs_40[1].mode = 1.f;
martin@12 185 programs_40[2].mode = 0.f;
martin@12 186 programs_40[3].mode = 0.f;
martin@12 187 programs_40[4].mode = 1.f;
martin@12 188 //Width
martin@12 189 programs_40[0].width = (1.f/3.f);
martin@12 190 programs_40[1].width = (1.f/3.f);
martin@12 191 programs_40[2].width = 0.5f;
martin@12 192 programs_40[3].width = (1.f/3.f);
martin@12 193 programs_40[4].width = (1.f/3.f);
martin@12 194 //Pattern
martin@12 195 programs_40[0].pattern = 0.5f;
martin@12 196 programs_40[1].pattern = 0.5f;
martin@12 197 programs_40[2].pattern = 0.f;
martin@12 198 programs_40[3].pattern = 0.5f;
martin@12 199 programs_40[4].pattern = 0.5f;
martin@12 200 //Surround Mode
martin@12 201 programs_40[0].surroundMode = 0.f;
martin@12 202 programs_40[1].surroundMode = 1.f;
martin@12 203 programs_40[2].surroundMode = 0.f;
martin@12 204 programs_40[3].surroundMode = 1.f;
martin@12 205 programs_40[4].surroundMode = 0.f;
martin@12 206 //Surround Width
martin@12 207 programs_40[0].surroundWidth = (5.5f/9.f);
martin@12 208 programs_40[1].surroundWidth = (5.5f/9.f);
martin@12 209 programs_40[2].surroundWidth = 0.5f;
martin@12 210 programs_40[3].surroundWidth = (5.5f/9.f);
martin@12 211 programs_40[4].surroundWidth = (5.5f/9.f);
martin@12 212 //Surround Pattern
martin@12 213 programs_40[0].surroundPattern = 0.5;
martin@12 214 programs_40[1].surroundPattern = 0.5;
martin@12 215 programs_40[2].surroundPattern = 0.0;
martin@12 216 programs_40[0].surroundPattern = 0.25;
martin@12 217 programs_40[0].surroundPattern = 0.75;
martin@12 218 //Surround Gain
martin@12 219 programs_40[0].surroundGain = 0.75f;
martin@12 220 programs_40[1].surroundGain = 0.75f;
martin@12 221 programs_40[2].surroundGain = 0.75f;
martin@12 222 programs_40[3].surroundGain = 0.75f;
martin@12 223 programs_40[4].surroundGain = 0.75f;
martin@12 224
martin@12 225
martin@12 226 //5.0 Mode
martin@12 227 //Name
martin@12 228 vst_strncpy (programs_50[0].name, "5.0 XY Microphones",kVstMaxProgNameLen);
martin@12 229 vst_strncpy (programs_50[1].name, "5.0 MS Microphones",kVstMaxProgNameLen);
martin@12 230 vst_strncpy (programs_50[2].name, "5.0 Blumlein Fig8s",kVstMaxProgNameLen);
martin@12 231 vst_strncpy (programs_50[3].name, "5.0 Heller et. al. 1",kVstMaxProgNameLen);
martin@12 232 vst_strncpy (programs_50[4].name, "5.0 Heller et. al. 2",kVstMaxProgNameLen);
martin@12 233 //Mode
martin@12 234 programs_50[0].mode = 0.f;
martin@12 235 programs_50[1].mode = 1.f;
martin@12 236 programs_50[2].mode = 0.f;
martin@12 237 //Width
martin@12 238 programs_50[0].width = (1.f/3.f);
martin@12 239 programs_50[1].width = (1.f/3.f);
martin@12 240 programs_50[2].width = 0.5f;
martin@12 241 //Pattern
martin@12 242 programs_50[0].pattern = 0.5f;
martin@12 243 programs_50[1].pattern = 0.5f;
martin@12 244 programs_50[2].pattern = 0.f;
martin@12 245 //Centre Pattern
martin@12 246 programs_50[0].centrePattern = 0.5f;
martin@12 247 programs_50[1].centrePattern = 0.5f;
martin@12 248 programs_50[2].centrePattern = 0.0f;
martin@12 249 //Centre Gain
martin@12 250 programs_50[0].centreGain = 0.75f;
martin@12 251 programs_50[1].centreGain = 0.75f;
martin@12 252 programs_50[2].centreGain = 0.75f;
martin@12 253 //Surround Mode
martin@12 254 programs_50[0].surroundMode = 0.f;
martin@12 255 programs_50[1].surroundMode = 1.f;
martin@12 256 programs_50[2].surroundMode = 0.f;
martin@12 257 //Surround Width
martin@12 258 programs_50[0].surroundWidth = (5.5f/9.f);
martin@12 259 programs_50[1].surroundWidth = (5.5f/9.f);
martin@12 260 programs_50[2].surroundWidth = 0.5f;
martin@12 261 //Surround Pattern
martin@12 262 programs_50[0].surroundPattern = 0.5;
martin@12 263 programs_50[1].surroundPattern = 0.5;
martin@12 264 programs_50[2].surroundPattern = 0.0;
martin@12 265 //Surround Gain
martin@12 266 programs_50[0].surroundGain = 0.75f;
martin@12 267 programs_50[1].surroundGain = 0.75f;
martin@12 268 programs_50[2].surroundGain = 0.75f;
martin@12 269
martin@12 270
martin@12 271 //5.1 Mode
martin@12 272 //Name
martin@12 273 vst_strncpy (programs_51[0].name, "5.1 XY Microphones",kVstMaxProgNameLen);
martin@12 274 vst_strncpy (programs_51[1].name, "5.1 MS Microphones",kVstMaxProgNameLen);
martin@12 275 vst_strncpy (programs_51[2].name, "5.1 Blumlein Fig8s",kVstMaxProgNameLen);
martin@12 276 vst_strncpy (programs_51[3].name, "5.1 Heller et. al. 1",kVstMaxProgNameLen);
martin@12 277 vst_strncpy (programs_51[4].name, "5.1 Heller et. al. 2",kVstMaxProgNameLen);
martin@12 278 //Mode
martin@12 279 programs_51[0].mode = 0.f;
martin@12 280 programs_51[1].mode = 1.f;
martin@12 281 programs_51[2].mode = 0.f;
martin@12 282 //Width
martin@12 283 programs_51[0].width = (1.f/3.f);
martin@12 284 programs_51[1].width = (1.f/3.f);
martin@12 285 programs_51[2].width = 0.5f;
martin@12 286 //Pattern
martin@12 287 programs_51[0].pattern = 0.5f;
martin@12 288 programs_51[1].pattern = 0.5f;
martin@12 289 programs_51[2].pattern = 0.f;
martin@12 290 //Centre Pattern
martin@12 291 programs_51[0].centrePattern = 0.5f;
martin@12 292 programs_51[1].centrePattern = 0.5f;
martin@12 293 programs_51[2].centrePattern = 0.0f;
martin@12 294 //Centre Gain
martin@12 295 programs_51[0].centreGain = 0.75f;
martin@12 296 programs_51[1].centreGain = 0.75f;
martin@12 297 programs_51[2].centreGain = 0.75f;
martin@12 298 //SubGain
martin@12 299 programs_51[0].subGain = 0.75f;
martin@12 300 programs_51[1].subGain = 0.75f;
martin@12 301 programs_51[2].subGain = 0.75f;
martin@12 302 programs_51[3].subGain = 0.75f;
martin@12 303 programs_51[4].subGain = 0.75f;
martin@12 304 //FC
martin@12 305 programs_51[0].fc = 5.0f/11.0f;
martin@12 306 programs_51[1].fc = 5.0f/11.0f;
martin@12 307 programs_51[2].fc = 5.0f/11.0f;
martin@12 308 programs_51[3].fc = 5.0f/11.0f;
martin@12 309 programs_51[4].fc = 5.0f/11.0f;
martin@12 310 //Surround Mode
martin@12 311 programs_51[0].surroundMode = 0.f;
martin@12 312 programs_51[1].surroundMode = 1.f;
martin@12 313 programs_51[2].surroundMode = 0.f;
martin@12 314 //Surround Width
martin@12 315 programs_51[0].surroundWidth = (5.5f/9.f);
martin@12 316 programs_51[1].surroundWidth = (5.5f/9.f);
martin@12 317 programs_51[2].surroundWidth = 0.5f;
martin@12 318 //Surround Pattern
martin@12 319 programs_51[0].surroundPattern = 0.5;
martin@12 320 programs_51[1].surroundPattern = 0.5;
martin@12 321 programs_51[2].surroundPattern = 0.0;
martin@12 322 //Surround Gain
martin@12 323 programs_51[0].surroundGain = 0.75f;
martin@12 324 programs_51[1].surroundGain = 0.75f;
martin@12 325 programs_51[2].surroundGain = 0.75f;
martin@12 326
martin@12 327
martin@12 328 //Load GUI
martin@12 329 extern AEffGUIEditor* createEditor (AudioEffectX*);
martin@12 330 setEditor (createEditor (this));
martin@12 331
martin@12 332 resume (); // flush buffer
martin@12 333
martin@12 334 //Load Program0 default
martin@12 335 if (programs_20||programs_21||programs_40||programs_50||programs_51) {
martin@12 336 setProgram(0);
martin@12 337 }
martin@12 338 }
martin@12 339
martin@12 340
martin@12 341 void ClassicAmbiDec::suspend()
martin@12 342 {
martin@12 343 myDecoder.clearFilter();
martin@12 344
martin@12 345 if (editor){
martin@12 346 ((AEffGUIEditor*)editor)->setParameter (100, 0);
martin@12 347 }
martin@12 348 }
martin@12 349
martin@12 350 void ClassicAmbiDec::close()
martin@12 351 {
martin@12 352 }
martin@12 353
martin@12 354
martin@12 355 void ClassicAmbiDec::open()
martin@12 356 {
martin@12 357 }
martin@12 358
martin@12 359
martin@12 360
martin@12 361
martin@12 362
martin@12 363 //------------------------------------------------------------------------
martin@12 364 bool ClassicAmbiDec::setSpeakerArrangement (VstSpeakerArrangement* pluginInput,
martin@12 365 VstSpeakerArrangement* pluginOutput)
martin@12 366 {
martin@12 367 numberInputs = pluginInput->numChannels;
martin@12 368 numberOutputs = pluginOutput->numChannels;
martin@12 369
martin@12 370
martin@12 371 bool result;//What to return, true for acceptable speaker arrangement
martin@12 372
martin@12 373 switch (pluginOutput->type) {
martin@12 374 case kSpeakerArr51://5.1 Output
martin@12 375 {
martin@12 376 if (pluginInput->type==kSpeakerArr31Cine) {
martin@12 377 result = true;
martin@12 378 }
martin@12 379 else {
martin@12 380 allocateArrangement (&myInputArrangement, 4);
martin@12 381 myInputArrangement->type = kSpeakerArr31Cine;
martin@12 382 result = false;
martin@12 383 }
martin@12 384 break;
martin@12 385 }
martin@12 386
martin@12 387 case kSpeakerArr50://NOT WORKING AS INTENDED
martin@12 388 {
martin@12 389 if (pluginInput->numChannels==4) {
martin@12 390 result = true;
martin@12 391 }
martin@12 392 else {
martin@12 393 allocateArrangement (&myInputArrangement, 4);
martin@12 394 myInputArrangement->type = kSpeakerArr31Cine;
martin@12 395 result = false;
martin@12 396 }
martin@12 397 break;
martin@12 398 }
martin@12 399
martin@12 400 case kSpeakerArr40Cine://4.0 Output (LRCS)
martin@12 401 {
martin@12 402 if (pluginInput->type==kSpeakerArr40Cine) {
martin@12 403 result = true;
martin@12 404 }
martin@12 405 else {
martin@12 406 allocateArrangement (&myInputArrangement, 4);
martin@12 407 myInputArrangement->type = kSpeakerArr40Cine;
martin@12 408 result = false;
martin@12 409 }
martin@12 410 break;
martin@12 411 }
martin@12 412
martin@12 413 case kSpeakerArr40Music://4.0 Output (Music)
martin@12 414 {
martin@12 415 if (pluginInput->type==kSpeakerArr40Music) {
martin@12 416 result = true;
martin@12 417 }
martin@12 418 else {
martin@12 419 allocateArrangement (&myInputArrangement, 4);
martin@12 420 myInputArrangement->type = kSpeakerArr40Music;
martin@12 421 result = false;
martin@12 422 }
martin@12 423 break;
martin@12 424 }
martin@12 425
martin@12 426 case kSpeakerArrStereo://Stereo
martin@12 427 {
martin@12 428 if (pluginInput->type==kSpeakerArr40Music) {
martin@12 429 result = true;
martin@12 430 }
martin@12 431 else {
martin@12 432 result = false;
martin@12 433 }
martin@12 434 break;
martin@12 435 }
martin@12 436
martin@12 437
martin@12 438 default:
martin@12 439 {
martin@12 440 if (pluginInput->type==kSpeakerArr31Cine) {
martin@12 441 result = true;
martin@12 442 }
martin@12 443 else {
martin@12 444 allocateArrangement (&myInputArrangement, 4);
martin@12 445 myInputArrangement->type = kSpeakerArr31Cine;
martin@12 446 result = false;
martin@12 447 }
martin@12 448 break;
martin@12 449 }
martin@12 450 }
martin@12 451
martin@12 452 return result;
martin@12 453 }
martin@12 454
martin@12 455
martin@12 456 //------------------------------------------------------------------------
martin@12 457 bool ClassicAmbiDec::getSpeakerArrangement(VstSpeakerArrangement **pluginInput, VstSpeakerArrangement **pluginOutput)
martin@12 458 {
martin@12 459 *pluginInput = myInputArrangement;
martin@12 460 return true;
martin@12 461 }
martin@12 462
martin@12 463
martin@12 464
martin@12 465 //------------------------------------------------------------------------
martin@12 466 VstInt32 ClassicAmbiDec::getVstVersion()
martin@12 467 {
martin@12 468 return kVstVersion;
martin@12 469 }
martin@12 470
martin@12 471
martin@12 472 //------------------------------------------------------------------------
martin@12 473 ClassicAmbiDec::~ClassicAmbiDec () //clears protected variables
martin@12 474 {
martin@12 475 deallocateArrangement (&myInputArrangement);
martin@12 476
martin@12 477 if (programs_20)
martin@12 478 delete[] programs_20;
martin@12 479 if (programs_21)
martin@12 480 delete[] programs_21;
martin@12 481 if (programs_40)
martin@12 482 delete[] programs_40;
martin@12 483 if (programs_50)
martin@12 484 delete[] programs_50;
martin@12 485 if (programs_51)
martin@12 486 delete[] programs_51;
martin@12 487 }
martin@12 488
martin@12 489
martin@12 490 //------------------------------------------------------------------------
martin@12 491 void ClassicAmbiDec::resume () //Do this on a resume from the host
martin@12 492 {
martin@12 493 AudioEffectX::resume ();
martin@12 494 if (editor){
martin@12 495 ((AEffGUIEditor*)editor)->setParameter (101, 0);
martin@12 496 }
martin@12 497 }
martin@12 498
martin@12 499
martin@12 500 //------------------------------------------------------------------------
martin@12 501 bool ClassicAmbiDec::getProgramNameIndexed(VstInt32 category, VstInt32 index, char *text)
martin@12 502 {
martin@12 503 switch (myDecoder.decoderMode) {
martin@12 504 case 2:
martin@12 505 strcpy(text, programs_20[index].name);
martin@12 506 break;
martin@12 507 case 3:
martin@12 508 strcpy(text, programs_21[index].name);
martin@12 509 break;
martin@12 510 case 4:
martin@12 511 strcpy(text, programs_40[index].name);
martin@12 512 break;
martin@12 513 case 5:
martin@12 514 strcpy(text, programs_50[index].name);
martin@12 515 break;
martin@12 516 case 6:
martin@12 517 strcpy(text, programs_51[index].name);
martin@12 518 break;
martin@12 519
martin@12 520 default:
martin@12 521 break;
martin@12 522 }
martin@12 523
martin@12 524 return true;
martin@12 525 }
martin@12 526
martin@12 527
martin@12 528 //------------------------------------------------------------------------
martin@12 529 void ClassicAmbiDec::setProgram(VstInt32 program)
martin@12 530 {
martin@12 531 ClassicAmbiDecProgram* curProg;
martin@12 532 curProgram = program;
martin@12 533
martin@12 534 switch (myDecoder.decoderMode) {
martin@12 535 case 2:
martin@12 536 curProg = &programs_20[program];
martin@12 537 setParameter(kMode, curProg->mode);
martin@12 538 setParameter(kWidth, curProg->width);
martin@12 539 setParameter(kPattern, curProg->pattern);
martin@12 540 setParameter(kRearVerb, curProg->rearVerb);
martin@12 541 setParameter(kHiVerb, curProg->hiVerb);
martin@12 542 break;
martin@12 543
martin@12 544 case 3:
martin@12 545 curProg = &programs_21[program];
martin@12 546 setParameter(kMode, curProg->mode);
martin@12 547 setParameter(kWidth, curProg->width);
martin@12 548 setParameter(kPattern, curProg->pattern);
martin@12 549 setParameter(kRearVerb, curProg->rearVerb);
martin@12 550 setParameter(kHiVerb, curProg->hiVerb);
martin@12 551 setParameter(kSubGain, curProg->subGain);
martin@12 552 setParameter(kFc, curProg->fc);
martin@12 553 break;
martin@12 554
martin@12 555 case 4:
martin@12 556 curProg = &programs_40[program];
martin@12 557 setParameter(kMode, curProg->mode);
martin@12 558 setParameter(kWidth, curProg->width);
martin@12 559 setParameter(kPattern, curProg->pattern);
martin@12 560 setParameter(kSurroundMode, curProg->surroundMode);
martin@12 561 setParameter(kSurroundWidth, curProg->surroundWidth);
martin@12 562 setParameter(kSurroundPattern, curProg->surroundPattern);
martin@12 563 setParameter(kSurroundGain, curProg->surroundGain);
martin@12 564 break;
martin@12 565
martin@12 566 case 5:
martin@12 567 curProg = &programs_50[program];
martin@12 568 if (program<3) {
martin@12 569 myDecoder.mode5x=0;
martin@12 570 setParameter(kMode, curProg->mode);
martin@12 571 setParameter(kWidth, curProg->width);
martin@12 572 setParameter(kPattern, curProg->pattern);
martin@12 573 setParameter(kCentrePattern, curProg->centrePattern);
martin@12 574 setParameter(kCentreGain, curProg->centreGain);
martin@12 575 setParameter(kSurroundMode, curProg->surroundMode);
martin@12 576 setParameter(kSurroundWidth, curProg->surroundWidth);
martin@12 577 setParameter(kSurroundPattern, curProg->surroundPattern);
martin@12 578 setParameter(kSurroundGain, curProg->surroundGain);
martin@12 579 if (editor){
martin@12 580 ((AEffGUIEditor*)editor)->setParameter (103, 0.f);
martin@12 581 }
martin@12 582 }
martin@12 583 else if (program==3) {
martin@12 584 myDecoder.mode5x=1;
martin@12 585 if (editor){
martin@12 586 ((AEffGUIEditor*)editor)->setParameter (103, 0.5f);
martin@12 587 }
martin@12 588 }
martin@12 589 else if (program==4) {
martin@12 590 myDecoder.mode5x=2;
martin@12 591 if (editor){
martin@12 592 ((AEffGUIEditor*)editor)->setParameter (103, 1.f);
martin@12 593 }
martin@12 594 }
martin@12 595 break;
martin@12 596 case 6:
martin@12 597 curProg = &programs_51[program];
martin@12 598 if (program<3) {
martin@12 599 myDecoder.mode5x=0;
martin@12 600 setParameter(kMode, curProg->mode);
martin@12 601 setParameter(kWidth, curProg->width);
martin@12 602 setParameter(kPattern, curProg->pattern);
martin@12 603 setParameter(kCentrePattern, curProg->centrePattern);
martin@12 604 setParameter(kCentreGain, curProg->centreGain);
martin@12 605 setParameter(kSubGain, curProg->subGain);
martin@12 606 setParameter(kFc, curProg->fc);
martin@12 607 setParameter(kSurroundMode, curProg->surroundMode);
martin@12 608 setParameter(kSurroundWidth, curProg->surroundWidth);
martin@12 609 setParameter(kSurroundPattern, curProg->surroundPattern);
martin@12 610 setParameter(kSurroundGain, curProg->surroundGain);
martin@12 611
martin@12 612 if (editor){
martin@12 613 ((AEffGUIEditor*)editor)->setParameter (103, 0.f);
martin@12 614 }
martin@12 615 }
martin@12 616 else if (program==3) {
martin@12 617 //Only set the sub
martin@12 618 setParameter(kSubGain, curProg->subGain);
martin@12 619 setParameter(kFc, curProg->fc);
martin@12 620 myDecoder.mode5x=1;
martin@12 621 if (editor){
martin@12 622 ((AEffGUIEditor*)editor)->setParameter (103, 0.5f);
martin@12 623 }
martin@12 624 }
martin@12 625 else if (program==4) {
martin@12 626 //Only set the sub
martin@12 627 setParameter(kSubGain, curProg->subGain);
martin@12 628 setParameter(kFc, curProg->fc);
martin@12 629 myDecoder.mode5x=2;
martin@12 630 if (editor){
martin@12 631 ((AEffGUIEditor*)editor)->setParameter (103, 1.f);
martin@12 632 }
martin@12 633 }
martin@12 634 break;
martin@12 635
martin@12 636 default:
martin@12 637 curProg = &programs_20[program];
martin@12 638 break;
martin@12 639 }
martin@12 640 }
martin@12 641
martin@12 642
martin@12 643
martin@12 644 //------------------------------------------------------------------------
martin@12 645 void ClassicAmbiDec::setProgramName (char *name)
martin@12 646 {
martin@12 647 switch (myDecoder.decoderMode) {
martin@12 648 case 2:
martin@12 649 strcpy (programs_20[curProgram].name, name);
martin@12 650 break;
martin@12 651 case 3:
martin@12 652 strcpy (programs_21[curProgram].name, name);
martin@12 653 break;
martin@12 654 case 4:
martin@12 655 strcpy (programs_40[curProgram].name, name);
martin@12 656 break;
martin@12 657 case 5:
martin@12 658 strcpy (programs_50[curProgram].name, name);
martin@12 659 break;
martin@12 660 case 6:
martin@12 661 strcpy (programs_51[curProgram].name, name);
martin@12 662 break;
martin@12 663
martin@12 664 default:
martin@12 665 break;
martin@12 666 }
martin@12 667 }
martin@12 668
martin@12 669 //------------------------------------------------------------------------
martin@12 670 void ClassicAmbiDec::getProgramName (char *name)
martin@12 671 {
martin@12 672 switch (myDecoder.decoderMode) {
martin@12 673 case 2:
martin@12 674 strcpy (name, programs_20[curProgram].name);
martin@12 675 break;
martin@12 676 case 3:
martin@12 677 strcpy (name, programs_21[curProgram].name);
martin@12 678 break;
martin@12 679 case 4:
martin@12 680 strcpy (name, programs_40[curProgram].name);
martin@12 681 break;
martin@12 682 case 5:
martin@12 683 strcpy (name, programs_50[curProgram].name);
martin@12 684 break;
martin@12 685 case 6:
martin@12 686 strcpy (name, programs_51[curProgram].name);
martin@12 687 break;
martin@12 688
martin@12 689 default:
martin@12 690 break;
martin@12 691 }
martin@12 692 }
martin@12 693
martin@12 694
martin@12 695
martin@12 696
martin@12 697 //------------------------------------------------------------------------
martin@12 698 //VstInt32 ClassicAmbiDec::getProgram()
martin@12 699 //{
martin@12 700 // return curProgram;
martin@12 701 //}
martin@12 702
martin@12 703
martin@12 704
martin@12 705
martin@12 706
martin@12 707 //------------------------------------------------------------------------
martin@12 708 void ClassicAmbiDec::setParameter (VstInt32 index, float value) // SET Parameter value from host
martin@12 709 {
martin@12 710 ClassicAmbiDecProgram* curProg;
martin@12 711 switch (myDecoder.decoderMode) {
martin@12 712 case 2:
martin@12 713 curProg = &programs_20[curProgram];
martin@12 714 break;
martin@12 715 case 3:
martin@12 716 curProg = &programs_21[curProgram];
martin@12 717 break;
martin@12 718 case 4:
martin@12 719 curProg = &programs_40[curProgram];
martin@12 720 break;
martin@12 721 case 5:
martin@12 722 curProg = &programs_50[curProgram];
martin@12 723 break;
martin@12 724 case 6:
martin@12 725 curProg = &programs_51[curProgram];
martin@12 726 break;
martin@12 727
martin@12 728 default:
martin@12 729 curProg = &programs_20[curProgram];
martin@12 730 break;
martin@12 731 }
martin@12 732
martin@12 733
martin@12 734 switch (index)
martin@12 735 {
martin@12 736 case kMode :
martin@12 737 fMode = curProg->mode = value;
martin@12 738 if (value<=0.5f) {
martin@12 739 myDecoder.Mode = 0;
martin@12 740 }
martin@12 741 else {
martin@12 742 myDecoder.Mode = 1;
martin@12 743 }
martin@12 744 break;
martin@12 745 case kWidth:
martin@12 746 fWidth = curProg->width = value;
martin@12 747 myDecoder.Width = (double)value*90;
martin@12 748 break;
martin@12 749 case kPattern:
martin@12 750 fPattern = curProg->pattern = value;
martin@12 751 myDecoder.Pattern = (double)value;
martin@12 752 break;
martin@12 753 case kRotate :
martin@12 754 fRotate = value;
martin@12 755 if (value==0.5f) {
martin@12 756 myDecoder.Rotate=0.0;
martin@12 757 }
martin@12 758 else {
martin@12 759 myDecoder.Rotate = (double)value*-360+180;
martin@12 760 }
martin@12 761 break;
martin@12 762 case kTilt:
martin@12 763 fTilt = value;
martin@12 764 if (value==0.5f) {
martin@12 765 myDecoder.Tilt=0.0;
martin@12 766 }
martin@12 767 else {
martin@12 768 myDecoder.Tilt = (double)value*-360+180;
martin@12 769 }
martin@12 770 break;
martin@12 771 case kTumble:
martin@12 772 fTumble = value;
martin@12 773 if (value==0.5f) {
martin@12 774 myDecoder.Tumble=0.00;
martin@12 775 }
martin@12 776 else {
martin@12 777 myDecoder.Tumble = (double)value*-360+180;
martin@12 778 }
martin@12 779 break;
martin@12 780 case kZoom:
martin@12 781 fZoom = value;
martin@12 782 myDecoder.Zoom = (double)value*200-100;
martin@12 783 break;
martin@12 784 case kZoomMethod:
martin@12 785 fZoomMethod = value;
martin@12 786 if (value<=0.2f) {
martin@12 787 myDecoder.ZoomMethod = 0;
martin@12 788 }
martin@12 789 else if (value>0.2f && value<=0.5f) {
martin@12 790 myDecoder.ZoomMethod = 1;
martin@12 791 }
martin@12 792 else if (value>0.5f && value<=0.8f) {
martin@12 793 myDecoder.ZoomMethod = 2;
martin@12 794 }
martin@12 795 else if (value>0.8f && value<=1.f) {
martin@12 796 myDecoder.ZoomMethod = 3;
martin@12 797 }
martin@12 798
martin@12 799 break;
martin@12 800 case kRearVerb :
martin@12 801 fRearVerb = curProg->rearVerb = value;
martin@12 802 if (value==0.0f) {
martin@12 803 myDecoder.RearVerb=-100;
martin@12 804 }
martin@12 805 else {
martin@12 806 myDecoder.RearVerb = -36+(double)value*36;
martin@12 807 }
martin@12 808 break;
martin@12 809 case kHiVerb :
martin@12 810 fHiVerb = curProg->hiVerb = value;
martin@12 811 if (value==0.0f) {
martin@12 812 myDecoder.HiVerb=-100;
martin@12 813 }
martin@12 814 else {
martin@12 815 myDecoder.HiVerb= -36+(double)value*36;
martin@12 816 }
martin@12 817 break;
martin@12 818 case kCentrePattern:
martin@12 819 fCentrePattern = curProg->centrePattern = value;
martin@12 820 myDecoder.centrePattern = (double)value;
martin@12 821 break;
martin@12 822 case kCentreGain:
martin@12 823 fCentreGain = curProg->centreGain = value;
martin@12 824 myDecoder.centreGain = ((double)value*24-18);
martin@12 825 break;
martin@12 826 case kSubGain:
martin@12 827 fSubGain = curProg->subGain = value;
martin@12 828 myDecoder.subGain = ((double)value*24-18);
martin@12 829 break;
martin@12 830 case kFc:
martin@12 831 fFc = curProg->fc = value;
martin@12 832 myDecoder.Fc = (int)((value*220)+20);
martin@12 833 myDecoder.filterCoefs();
martin@12 834 break;
martin@12 835 case kSurroundMode:
martin@12 836 fSurroundMode = curProg->surroundMode = value;
martin@12 837 if (value<=0.5f) {
martin@12 838 myDecoder.surMode = 0;
martin@12 839 }
martin@12 840 else {
martin@12 841 myDecoder.surMode = 1;
martin@12 842 }
martin@12 843 break;
martin@12 844 case kSurroundPattern:
martin@12 845 fSurroundPattern = curProg->surroundPattern = value;
martin@12 846 myDecoder.surPattern = (double)value;
martin@12 847 break;
martin@12 848 case kSurroundWidth:
martin@12 849 fSurroundWidth = curProg->surroundWidth = value;
martin@12 850 myDecoder.surWidth = (double)value*90;
martin@12 851 break;
martin@12 852 case kSurroundGain:
martin@12 853 fSurroundGain = curProg->surroundGain = value;
martin@12 854 myDecoder.surGain = ((double)value*24-18);
martin@12 855 break;
martin@12 856 case kDecoderMode:
martin@12 857 fDecoderMode = value;
martin@12 858
martin@12 859 if (value<=0.125f) {
martin@12 860 myDecoder.decoderMode = 2; //Stereo
martin@12 861 }
martin@12 862 else if (value>0.125f && value<=0.375f) {
martin@12 863 myDecoder.decoderMode = 3; //2.1
martin@12 864 }
martin@12 865 else if (value>0.375f && value<=0.625f) {
martin@12 866 myDecoder.decoderMode = 4; //Quad
martin@12 867 }
martin@12 868 else if (value>0.625f && value<=0.875f) {
martin@12 869 myDecoder.decoderMode = 5; //5.0
martin@12 870 }
martin@12 871 else if (value>0.875f) {
martin@12 872 myDecoder.decoderMode = 6; //5.1
martin@12 873 }
martin@12 874 updateDisplay();
martin@12 875 break;
martin@12 876 case kChannelOrder:
martin@12 877 fChannelOrder = value;
martin@12 878 if (value<=0.5f) {
martin@12 879 myDecoder.channelOrder = 0; //Natural Outputs
martin@12 880 }
martin@12 881 else {
martin@12 882 myDecoder.channelOrder = 1; //5.1 Outputs
martin@12 883 }
martin@12 884 break;
martin@12 885
martin@12 886 default:
martin@12 887 break;
martin@12 888 }
martin@12 889 if (editor){
martin@12 890 ((AEffGUIEditor*)editor)->setParameter (index, value);
martin@12 891 }
martin@12 892 if (index==kDecoderMode) {
martin@12 893 setProgram(curProgram);
martin@12 894 }
martin@12 895 }
martin@12 896
martin@12 897
martin@12 898 //------------------------------------------------------------------------
martin@12 899 float ClassicAmbiDec::getParameter (VstInt32 index) // GET the value of the parameter
martin@12 900 {
martin@12 901 float returnFloat;
martin@12 902
martin@12 903 switch (index)
martin@12 904 {
martin@12 905 case kMode :
martin@12 906 returnFloat = fMode;
martin@12 907 break;
martin@12 908 case kWidth:
martin@12 909 returnFloat = fWidth;
martin@12 910 break;
martin@12 911 case kPattern:
martin@12 912 returnFloat = fPattern;
martin@12 913 break;
martin@12 914 case kRotate :
martin@12 915 returnFloat = fRotate;
martin@12 916 break;
martin@12 917 case kTilt:
martin@12 918 returnFloat = fTilt;
martin@12 919 break;
martin@12 920 case kTumble:
martin@12 921 returnFloat = fTumble;
martin@12 922 break;
martin@12 923 case kZoom:
martin@12 924 returnFloat = fZoom;
martin@12 925 break;
martin@12 926 case kZoomMethod:
martin@12 927 returnFloat = fZoomMethod;
martin@12 928 break;
martin@12 929 case kRearVerb :
martin@12 930 returnFloat = fRearVerb;
martin@12 931 break;
martin@12 932 case kHiVerb :
martin@12 933 returnFloat = fHiVerb;
martin@12 934 break;
martin@12 935 case kCentrePattern:
martin@12 936 returnFloat = fCentrePattern;
martin@12 937 break;
martin@12 938 case kCentreGain:
martin@12 939 returnFloat = fCentreGain;
martin@12 940 break;
martin@12 941 case kSubGain:
martin@12 942 returnFloat = fSubGain;
martin@12 943 break;
martin@12 944 case kFc:
martin@12 945 returnFloat = fFc;
martin@12 946 break;
martin@12 947 case kSurroundMode:
martin@12 948 returnFloat = fSurroundMode;
martin@12 949 break;
martin@12 950 case kSurroundPattern:
martin@12 951 returnFloat = fSurroundPattern;
martin@12 952 break;
martin@12 953 case kSurroundWidth:
martin@12 954 returnFloat = fSurroundWidth;
martin@12 955 break;
martin@12 956 case kSurroundGain:
martin@12 957 returnFloat = fSurroundGain;
martin@12 958 break;
martin@12 959 case kDecoderMode:
martin@12 960 returnFloat = fDecoderMode;
martin@12 961 break;
martin@12 962 case kChannelOrder:
martin@12 963 returnFloat = fChannelOrder;
martin@12 964 break;
martin@12 965
martin@12 966
martin@12 967 //HIDDEN PArameters for GUI Control
martin@12 968 case 102: //Bit Mode for GUI display
martin@12 969 returnFloat = bits;
martin@12 970 break;
martin@12 971 case 103:
martin@12 972 returnFloat = myDecoder.mode5x;
martin@12 973 break;
martin@12 974
martin@12 975 default:
martin@12 976 break;
martin@12 977 }
martin@12 978 return returnFloat; //Returns the chosen Parameters value
martin@12 979 }
martin@12 980
martin@12 981
martin@12 982 //------------------------------------------------------------------------
martin@12 983 void ClassicAmbiDec::getParameterName (VstInt32 index, char *label) //SET display value shown for Parameters
martin@12 984 {
martin@12 985 switch (index)
martin@12 986 {
martin@12 987 case kMode :
martin@12 988 switch (myDecoder.Mode) {
martin@12 989 case 0 :
martin@12 990 strcpy(label, "XY");
martin@12 991 break;
martin@12 992 case 1 :
martin@12 993 strcpy(label, "MS");
martin@12 994 break;
martin@12 995 }
martin@12 996 break;
martin@12 997 case kWidth:
martin@12 998 strcpy(label, "Width");
martin@12 999 break;
martin@12 1000 case kPattern:
martin@12 1001 strcpy(label, "Pattern");
martin@12 1002 break;
martin@12 1003 case kRotate :
martin@12 1004 strcpy(label, "Rotate");
martin@12 1005 break;
martin@12 1006 case kTilt:
martin@12 1007 strcpy(label, "Tilt");
martin@12 1008 break;
martin@12 1009 case kTumble:
martin@12 1010 strcpy(label, "Tumble");
martin@12 1011 break;
martin@12 1012 case kZoom:
martin@12 1013 strcpy(label, "Zoom");
martin@12 1014 break;
martin@12 1015 case kZoomMethod:
martin@12 1016 strcpy(label, "Zoom Method");
martin@12 1017 break;
martin@12 1018 case kRearVerb :
martin@12 1019 strcpy(label, "RearVerb");
martin@12 1020 break;
martin@12 1021 case kHiVerb :
martin@12 1022 strcpy(label, "HiVerb");
martin@12 1023 break;
martin@12 1024 case kCentrePattern:
martin@12 1025 strcpy(label, "Ctr. Pattern");
martin@12 1026 break;
martin@12 1027 case kCentreGain:
martin@12 1028 strcpy(label, "Ctr. Gain");
martin@12 1029 break;
martin@12 1030 case kSubGain:
martin@12 1031 strcpy(label, "Sub. Gain");
martin@12 1032 break;
martin@12 1033 case kFc:
martin@12 1034 strcpy(label, "Sub. Xover");
martin@12 1035 break;
martin@12 1036 case kSurroundMode:
martin@12 1037 strcpy(label, "Sur. Mode");
martin@12 1038 break;
martin@12 1039 case kSurroundPattern:
martin@12 1040 strcpy(label, "Sur. Pattern");
martin@12 1041 break;
martin@12 1042 case kSurroundWidth:
martin@12 1043 strcpy(label, "Sur. Width");
martin@12 1044 break;
martin@12 1045 case kSurroundGain:
martin@12 1046 strcpy(label, "Sur. Gain");
martin@12 1047 break;
martin@12 1048 case kDecoderMode:
martin@12 1049 strcpy(label, "Dec. Mode");
martin@12 1050 break;
martin@12 1051 case kChannelOrder:
martin@12 1052 strcpy(label, "Ch. Order");
martin@12 1053 break;
martin@12 1054
martin@12 1055 default:
martin@12 1056 break;
martin@12 1057 }
martin@12 1058 }
martin@12 1059
martin@12 1060
martin@12 1061 //------------------------------------------------------------------------
martin@12 1062 void ClassicAmbiDec::getParameterDisplay (VstInt32 index, char *text) //GET display value shown for Parameters
martin@12 1063 {
martin@12 1064 switch (index)
martin@12 1065 {
martin@12 1066 case kMode :
martin@12 1067 switch (myDecoder.Mode) {
martin@12 1068 case 0 :
martin@12 1069 strcpy(text, "XY");
martin@12 1070 break;
martin@12 1071 case 1 :
martin@12 1072 strcpy(text, "MS");
martin@12 1073 break;
martin@12 1074 }
martin@12 1075 break;
martin@12 1076 case kWidth:
martin@12 1077 sprintf (text, "%.1f\u00B0", myDecoder.Width);
martin@12 1078 break;
martin@12 1079 case kPattern:
martin@12 1080 if (myDecoder.Pattern<=0.125) {
martin@12 1081 strcpy(text, "Fig-of-8");
martin@12 1082 }
martin@12 1083 else if (myDecoder.Pattern>0.125 && myDecoder.Pattern<=0.375) {
martin@12 1084 strcpy(text, "Hyper-Card.");
martin@12 1085 }
martin@12 1086 else if (myDecoder.Pattern>0.375 && myDecoder.Pattern<=0.625) {
martin@12 1087 strcpy(text, "Cardioid");
martin@12 1088 }
martin@12 1089 else if (myDecoder.Pattern>0.625 && myDecoder.Pattern<=0.875) {
martin@12 1090 strcpy(text, "Sub-Card.");
martin@12 1091 }
martin@12 1092 else {
martin@12 1093 strcpy(text, "Omni.");
martin@12 1094 }
martin@12 1095 break;
martin@12 1096 case kRotate :
martin@12 1097 sprintf (text, "%.1f\u00B0", myDecoder.Rotate);
martin@12 1098 break;
martin@12 1099 case kTilt:
martin@12 1100 sprintf (text, "%.1f\u00B0", myDecoder.Tilt);
martin@12 1101 break;
martin@12 1102 case kTumble:
martin@12 1103 sprintf (text, "%.1f\u00B0", myDecoder.Tumble);
martin@12 1104 break;
martin@12 1105 case kZoom:
martin@12 1106 sprintf (text, "%.1f%%", myDecoder.Zoom);
martin@12 1107 break;
martin@12 1108 case kZoomMethod:
martin@12 1109 switch (myDecoder.ZoomMethod) {
martin@12 1110 case 0:
martin@12 1111 strcpy(text, "Dominance");
martin@12 1112 break;
martin@12 1113 case 1:
martin@12 1114 strcpy(text, "Press");
martin@12 1115 break;
martin@12 1116 case 2:
martin@12 1117 strcpy(text, "Push");
martin@12 1118 break;
martin@12 1119 case 3:
martin@12 1120 strcpy(text, "Focus");
martin@12 1121 break;
martin@12 1122 default:
martin@12 1123 break;
martin@12 1124 }
martin@12 1125 break;
martin@12 1126 case kRearVerb :
martin@12 1127 if (myDecoder.RearVerb>-40) {
martin@12 1128 sprintf (text, "%.2fdB", myDecoder.RearVerb);
martin@12 1129 }
martin@12 1130 else {
martin@12 1131 strcpy(text, "Off");
martin@12 1132 }
martin@12 1133 break;
martin@12 1134 case kHiVerb :
martin@12 1135 if (myDecoder.HiVerb>-40) {
martin@12 1136 sprintf (text, "%.2fdB", myDecoder.HiVerb);
martin@12 1137 }
martin@12 1138 else {
martin@12 1139 strcpy(text, "Off");
martin@12 1140 }
martin@12 1141 break;
martin@12 1142 case kCentrePattern:
martin@12 1143 if (myDecoder.centrePattern<=0.125) {
martin@12 1144 strcpy(text, "Fig-of-8");
martin@12 1145 }
martin@12 1146 else if (myDecoder.centrePattern>0.125 && myDecoder.centrePattern<=0.375) {
martin@12 1147 strcpy(text, "Hyper-Card.");
martin@12 1148 }
martin@12 1149 else if (myDecoder.centrePattern>0.375 && myDecoder.centrePattern<=0.625) {
martin@12 1150 strcpy(text, "Cardioid");
martin@12 1151 }
martin@12 1152 else if (myDecoder.centrePattern>0.625 && myDecoder.centrePattern<=0.875) {
martin@12 1153 strcpy(text, "Sub-Card.");
martin@12 1154 }
martin@12 1155 else {
martin@12 1156 strcpy(text, "Omni.");
martin@12 1157 }
martin@12 1158 break;
martin@12 1159 case kCentreGain:
martin@12 1160 sprintf (text, "%.2fdB", myDecoder.centreGain);
martin@12 1161 break;
martin@12 1162 case kSubGain:
martin@12 1163 sprintf (text, "%.2fdB", myDecoder.subGain);
martin@12 1164 break;
martin@12 1165 case kFc:
martin@12 1166 sprintf (text, "%dHz", myDecoder.Fc);
martin@12 1167 break;
martin@12 1168 case kSurroundMode:
martin@12 1169 switch (myDecoder.surMode) {
martin@12 1170 case 0 :
martin@12 1171 strcpy(text, "XY");
martin@12 1172 break;
martin@12 1173 case 1 :
martin@12 1174 strcpy(text, "MS");
martin@12 1175 break;
martin@12 1176 }
martin@12 1177 break;
martin@12 1178 case kSurroundPattern:
martin@12 1179 if (myDecoder.surPattern<=0.125) {
martin@12 1180 strcpy(text, "Fig-of-8");
martin@12 1181 }
martin@12 1182 else if (myDecoder.surPattern>0.125 && myDecoder.surPattern<=0.375) {
martin@12 1183 strcpy(text, "Hyper-Card.");
martin@12 1184 }
martin@12 1185 else if (myDecoder.surPattern>0.375 && myDecoder.surPattern<=0.625) {
martin@12 1186 strcpy(text, "Cardioid");
martin@12 1187 }
martin@12 1188 else if (myDecoder.surPattern>0.625 && myDecoder.surPattern<=0.875) {
martin@12 1189 strcpy(text, "Sub-Card.");
martin@12 1190 }
martin@12 1191 else {
martin@12 1192 strcpy(text, "Omni.");
martin@12 1193 }
martin@12 1194 break;
martin@12 1195 case kSurroundWidth:
martin@12 1196 sprintf (text, "%.1f\u00B0", myDecoder.surWidth);
martin@12 1197 break;
martin@12 1198 case kSurroundGain:
martin@12 1199 sprintf (text, "%.2fdB", myDecoder.surGain);
martin@12 1200 break;
martin@12 1201 case kDecoderMode:
martin@12 1202 switch (myDecoder.decoderMode) {
martin@12 1203 case 2 :
martin@12 1204 strcpy(text, "Stereo");
martin@12 1205 break;
martin@12 1206 case 3 :
martin@12 1207 strcpy(text, "2.1");
martin@12 1208 break;
martin@12 1209 case 4 :
martin@12 1210 strcpy(text, "Quad");
martin@12 1211 break;
martin@12 1212 case 5 :
martin@12 1213 strcpy(text, "5.0");
martin@12 1214 break;
martin@12 1215 case 6 :
martin@12 1216 strcpy(text, "5.1");
martin@12 1217 break;
martin@12 1218 }
martin@12 1219 break;
martin@12 1220 case kChannelOrder:
martin@12 1221 switch (myDecoder.channelOrder) {
martin@12 1222 case 0 :
martin@12 1223 strcpy(text, "Natural");
martin@12 1224 break;
martin@12 1225 case 1 :
martin@12 1226 strcpy(text, "5.1");
martin@12 1227 break;
martin@12 1228 }
martin@12 1229 break;
martin@12 1230
martin@12 1231 default:
martin@12 1232 break;
martin@12 1233 }
martin@12 1234 }
martin@12 1235
martin@12 1236
martin@12 1237
martin@12 1238 //------------------------------------------------------------------------
martin@12 1239 void ClassicAmbiDec::getParameterLabel (VstInt32 index, char *label) // Labels shown for Parameters
martin@12 1240 {
martin@12 1241 switch (index)
martin@12 1242 {
martin@12 1243 case kMode :
martin@12 1244 strcpy(label, "Microphones");
martin@12 1245 break;
martin@12 1246 case kWidth:
martin@12 1247 strcpy(label, "Degrees");
martin@12 1248 break;
martin@12 1249 case kPattern:
martin@12 1250 strcpy(label, "Omni");
martin@12 1251 break;
martin@12 1252 case kRotate :
martin@12 1253 strcpy(label, "Degrees");
martin@12 1254 break;
martin@12 1255 case kTilt:
martin@12 1256 strcpy(label, "Degrees");
martin@12 1257 break;
martin@12 1258 case kTumble:
martin@12 1259 strcpy(label, "Degrees");
martin@12 1260 break;
martin@12 1261 case kZoom:
martin@12 1262 strcpy(label, "Percentage");
martin@12 1263 break;
martin@12 1264 case kZoomMethod:
martin@12 1265 strcpy(label, "Selection");
martin@12 1266 break;
martin@12 1267 case kRearVerb :
martin@12 1268 strcpy(label, "dB");
martin@12 1269 break;
martin@12 1270 case kHiVerb :
martin@12 1271 strcpy(label, "dB");
martin@12 1272 break;
martin@12 1273 case kCentrePattern:
martin@12 1274 strcpy(label, "Omni");
martin@12 1275 break;
martin@12 1276 case kCentreGain:
martin@12 1277 strcpy(label, "dB");
martin@12 1278 break;
martin@12 1279 case kSubGain:
martin@12 1280 strcpy(label, "dB");
martin@12 1281 break;
martin@12 1282 case kFc:
martin@12 1283 strcpy(label, "Hz");
martin@12 1284 break;
martin@12 1285 case kSurroundMode:
martin@12 1286 strcpy(label, "Microphones");
martin@12 1287 break;
martin@12 1288 case kSurroundPattern:
martin@12 1289 strcpy(label, "Omni");
martin@12 1290 break;
martin@12 1291 case kSurroundWidth:
martin@12 1292 strcpy(label, "Degrees");
martin@12 1293 break;
martin@12 1294 case kSurroundGain:
martin@12 1295 strcpy(label, "dB");
martin@12 1296 break;
martin@12 1297 case kDecoderMode:
martin@12 1298 strcpy(label, "Speakers");
martin@12 1299 break;
martin@12 1300 case kChannelOrder:
martin@12 1301 strcpy(label, "Output");
martin@12 1302 break;
martin@12 1303 }
martin@12 1304 }
martin@12 1305
martin@12 1306
martin@12 1307
martin@12 1308 //------------------------------------------------------------------------
martin@12 1309 bool ClassicAmbiDec::getEffectName (char* name) // Tha NAME of the effect
martin@12 1310 {
martin@12 1311 strcpy (name, "Classic Ambisonics Decoder");
martin@12 1312 return true;
martin@12 1313 }
martin@12 1314
martin@12 1315
martin@12 1316
martin@12 1317 //------------------------------------------------------------------------
martin@12 1318 bool ClassicAmbiDec::getProductString (char* text) // The PRODUCT name
martin@12 1319 {
martin@12 1320 strcpy (text, "Classic Ambisonics Decoder");
martin@12 1321 return true;
martin@12 1322 }
martin@12 1323
martin@12 1324
martin@12 1325
martin@12 1326 //------------------------------------------------------------------------
martin@12 1327 bool ClassicAmbiDec::getVendorString (char* text) // Vendor (Creator/Publisher)
martin@12 1328 {
martin@12 1329 strcpy (text, "Martin J. Morrell");
martin@12 1330 return true;
martin@12 1331 }
martin@12 1332
martin@12 1333
martin@12 1334 //------------------------------------------------------------------------
martin@12 1335 VstInt32 ClassicAmbiDec::getVendorVersion ()
martin@12 1336 {
martin@12 1337 return VERSION;
martin@12 1338 }
martin@12 1339
martin@12 1340
martin@12 1341
martin@12 1342 //------------------------------------------------------------------------
martin@12 1343 void ClassicAmbiDec::setSampleRate(float sampleRate)
martin@12 1344 {
martin@12 1345 myDecoder.Fs = (int)sampleRate;
martin@12 1346 myDecoder.filterCoefs();
martin@12 1347 }
martin@12 1348
martin@12 1349
martin@12 1350
martin@12 1351 //---------------------------------------------------------------------------
martin@12 1352 void ClassicAmbiDec::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.
martin@12 1353 {
martin@12 1354 while (--sampleFrames >= 0) //Do this process if the audio is running
martin@12 1355 {
martin@12 1356 //Set the internal B-Format values as doubles.
martin@12 1357 double w, x, y, z;
martin@12 1358 switch (numberInputs) {
martin@12 1359 case 3:
martin@12 1360 {
martin@12 1361 w = (double) *inputs[0]++;
martin@12 1362 x = (double) *inputs[1]++;
martin@12 1363 y = (double) *inputs[2]++;
martin@12 1364 z = 0;
martin@12 1365 break;
martin@12 1366 }
martin@12 1367
martin@12 1368 case 4:
martin@12 1369 {
martin@12 1370 w = (double) *inputs[0]++;
martin@12 1371 x = (double) *inputs[1]++;
martin@12 1372 y = (double) *inputs[2]++;
martin@12 1373 z = (double) *inputs[3]++;
martin@12 1374 break;
martin@12 1375 }
martin@12 1376
martin@12 1377 default:
martin@12 1378 {
martin@12 1379 w = 0;
martin@12 1380 x = 0;
martin@12 1381 y = 0;
martin@12 1382 z = 0;
martin@12 1383 break;
martin@12 1384 }
martin@12 1385 }
martin@12 1386
martin@12 1387
martin@12 1388 int numOut;
martin@12 1389 numOut = myDecoder.processDecoder(w, x, y, z); //Process B-Format
martin@12 1390
martin@12 1391 if (numOut<numberOutputs){ //Zero up extra outputs
martin@12 1392 for (int i=0; i<numOut; i++)
martin@12 1393 *outputs[i]++ = float(myDecoder.output[i]);
martin@12 1394 for (int i=numOut; i<numberOutputs; i++)
martin@12 1395 *outputs[i]++ = 0.f;
martin@12 1396 }
martin@12 1397 else if (numOut==numberOutputs){ //Number of decoder outputs matches channel outputs
martin@12 1398 for (int i=0; i<numOut; i++)
martin@12 1399 *outputs[i]++ = float(myDecoder.output[i]);
martin@12 1400 }
martin@12 1401 else{ //Only use available outputs
martin@12 1402 for (int i=0; i<numberOutputs; i++)
martin@12 1403 *outputs[i]++ = float(myDecoder.output[i]);
martin@12 1404 }
martin@12 1405 }
martin@12 1406 }
martin@12 1407
martin@12 1408
martin@12 1409 //---------------------------------------------------------------------------
martin@12 1410 void ClassicAmbiDec::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.
martin@12 1411 {
martin@12 1412 while (--sampleFrames >= 0) //Do this process if the audio is running
martin@12 1413 {
martin@12 1414 //Set the internal B-Format values as doubles.
martin@12 1415 double w, x, y, z;
martin@12 1416 switch (numberInputs) {
martin@12 1417 case 3:
martin@12 1418 {
martin@12 1419 w = *inputs[0]++;
martin@12 1420 x = *inputs[1]++;
martin@12 1421 y = *inputs[2]++;
martin@12 1422 z = 0;
martin@12 1423 break;
martin@12 1424 }
martin@12 1425
martin@12 1426 case 4:
martin@12 1427 {
martin@12 1428 w = *inputs[0]++;
martin@12 1429 x = *inputs[1]++;
martin@12 1430 y = *inputs[2]++;
martin@12 1431 z = *inputs[3]++;
martin@12 1432 break;
martin@12 1433 }
martin@12 1434
martin@12 1435 default:
martin@12 1436 {
martin@12 1437 w = 0;
martin@12 1438 x = 0;
martin@12 1439 y = 0;
martin@12 1440 z = 0;
martin@12 1441 break;
martin@12 1442 }
martin@12 1443 }
martin@12 1444
martin@12 1445
martin@12 1446 int numOut;
martin@12 1447 numOut = myDecoder.processDecoder(w, x, y, z); //Process B-Format
martin@12 1448
martin@12 1449 if (numOut<numberOutputs){ //Zero up extra outputs
martin@12 1450 for (int i=0; i<numOut; i++)
martin@12 1451 *outputs[i]++ = myDecoder.output[i];
martin@12 1452 for (int i=numOut; i<numberOutputs; i++)
martin@12 1453 *outputs[i]++ = 0.0;
martin@12 1454 }
martin@12 1455 else if (numOut==numberOutputs){ //Number of decoder outputs matches channel outputs
martin@12 1456 for (int i=0; i<numOut; i++)
martin@12 1457 *outputs[i]++ = myDecoder.output[i];
martin@12 1458 }
martin@12 1459 else{ //Only use available outputs
martin@12 1460 for (int i=0; i<numberOutputs; i++)
martin@12 1461 *outputs[i]++ = myDecoder.output[i];
martin@12 1462 }
martin@12 1463 }
martin@12 1464 }