martin@0
|
1 //-------------------------------------------------------------------------------------------------------
|
martin@0
|
2 // VST Plug-Ins SDK
|
martin@0
|
3 // Version 2.4 $Date: 2006/11/13 09:08:27 $
|
martin@0
|
4 //
|
martin@0
|
5 // Category : VST 2.x SDK Samples
|
martin@0
|
6 // Filename : adelay.cpp
|
martin@0
|
7 // Created by : Steinberg Media Technologies
|
martin@0
|
8 // Description : Simple Delay plugin (Mono->Stereo)
|
martin@0
|
9 //
|
martin@0
|
10 // © 2006, Steinberg Media Technologies, All Rights Reserved
|
martin@0
|
11 //-------------------------------------------------------------------------------------------------------
|
martin@0
|
12
|
martin@0
|
13
|
martin@0
|
14 #ifndef __SoundField__
|
martin@0
|
15 #include "SoundField.h"
|
martin@0
|
16 #endif
|
martin@0
|
17 //C++ Headers
|
martin@0
|
18 #include <stdio.h>
|
martin@0
|
19 #include <string.h>
|
martin@0
|
20 #include <cmath>
|
martin@0
|
21
|
martin@0
|
22 //GUI Headers
|
martin@0
|
23 #include "aeffguieditor.h"
|
martin@0
|
24
|
martin@0
|
25
|
martin@0
|
26
|
martin@0
|
27 //-----------------------------------------------------------------------------
|
martin@0
|
28 SoundFieldProgram::SoundFieldProgram ()
|
martin@0
|
29 {
|
martin@0
|
30 //Define name if all programs are to be the same
|
martin@0
|
31
|
martin@0
|
32 }
|
martin@0
|
33
|
martin@0
|
34 //-----------------------------------------------------------------------------
|
martin@0
|
35 SoundField::SoundField (audioMasterCallback audioMaster)
|
martin@0
|
36 : AudioEffectX (audioMaster, 1, kNumParameters)
|
martin@0
|
37 {
|
martin@0
|
38 // init
|
martin@0
|
39 programs = new SoundFieldProgram[numPrograms];
|
martin@0
|
40
|
martin@0
|
41
|
martin@0
|
42 // if (programs)
|
martin@0
|
43 // setProgram (0);
|
martin@0
|
44
|
martin@0
|
45 //Set the number of input and output channels
|
martin@0
|
46 setNumInputs (4); // 4 Channel Classic B-Format Input
|
martin@0
|
47 setNumOutputs (2); // MAX_CHANNELS 5.1 Output
|
martin@0
|
48
|
martin@0
|
49
|
martin@0
|
50 // We initialize the arrangements to default values.
|
martin@0
|
51 // Nevertheless, the host should modify them via
|
martin@0
|
52 // appropriate calls to setSpeakerArrangement.
|
martin@0
|
53 //allocateArrangement (&plugInput, MAX_CHANNELS);
|
martin@0
|
54 //plugInput->type = kSpeakerArr51;
|
martin@0
|
55
|
martin@0
|
56 //allocateArrangement (&plugOutput, 2); // MAX_CHANNELS, now 2 for stereo
|
martin@0
|
57 //plugOutput->type = kSpeakerArrStereo; // kSpeakerArr51, now set output to stereo
|
martin@0
|
58
|
martin@0
|
59
|
martin@0
|
60
|
martin@0
|
61 setUniqueID ('MMa2'); // this should be unique, use the Steinberg web page for plugin Id registration
|
martin@0
|
62
|
martin@0
|
63
|
martin@0
|
64 if(setProcessPrecision(kVstProcessPrecision64)){
|
martin@0
|
65 setProcessPrecision(kVstProcessPrecision64);
|
martin@0
|
66 bits=64;
|
martin@0
|
67 }
|
martin@0
|
68 else {
|
martin@0
|
69 bits=32;
|
martin@0
|
70 }
|
martin@0
|
71
|
martin@0
|
72
|
martin@0
|
73
|
martin@0
|
74 //Load GUI
|
martin@0
|
75 extern AEffGUIEditor* createEditor (AudioEffectX*);
|
martin@0
|
76 setEditor (createEditor (this));
|
martin@0
|
77
|
martin@0
|
78
|
martin@0
|
79 resume (); // flush buffer
|
martin@0
|
80
|
martin@0
|
81 canProcessReplacing(); //Plugin can use process replacing
|
martin@0
|
82 noTail ();
|
martin@0
|
83
|
martin@0
|
84 //Default Program Names
|
martin@0
|
85 vst_strncpy (programs[0].name, "Default",kVstMaxProgNameLen);
|
martin@0
|
86
|
martin@0
|
87 vst_strncpy (programName, "Default", kVstMaxProgNameLen); // default program name
|
martin@0
|
88
|
martin@0
|
89 //version = 2300;
|
martin@0
|
90
|
martin@0
|
91
|
martin@0
|
92 // Declare any variables to their default values
|
martin@0
|
93 // Default Program Values if NOT using a bank of programs
|
martin@0
|
94
|
martin@0
|
95 fMode = 0.f;
|
martin@0
|
96 fWidth = 0.5f;
|
martin@0
|
97 fPattern = 0.5f;
|
martin@0
|
98 fRotate = 0.5f;
|
martin@0
|
99 fTilt = 0.5f;
|
martin@0
|
100 fTumble = 0.5f;
|
martin@0
|
101 fZoom = 0.5f;
|
martin@0
|
102 fZoomMethod = 0.f;
|
martin@0
|
103 fRearVerb = 0.f;
|
martin@0
|
104 fHiVerb = 0.f;
|
martin@0
|
105
|
martin@0
|
106 myDecoder.Rotate=0.0;
|
martin@0
|
107 myDecoder.Tilt=0.0;
|
martin@0
|
108 myDecoder.Tumble=0.0;
|
martin@0
|
109 myDecoder.Zoom=0.0;
|
martin@0
|
110 myDecoder.ZoomMethod=0.0;
|
martin@0
|
111 myDecoder.Width=45.0;
|
martin@0
|
112 myDecoder.Pattern=0.5;
|
martin@0
|
113 myDecoder.Mode=0;
|
martin@0
|
114 myDecoder.RearVerb=-100;
|
martin@0
|
115 myDecoder.HiVerb=-100;
|
martin@0
|
116 myDecoder.outputL=0.0;
|
martin@0
|
117 myDecoder.outputR=0.0;
|
martin@0
|
118 myDecoder.outputC=0.0;
|
martin@0
|
119 myDecoder.outputS=0.0;
|
martin@0
|
120 myDecoder.outputSL=0.0;
|
martin@0
|
121 myDecoder.outputSR=0.0;
|
martin@0
|
122 myDecoder.surMode=0;
|
martin@0
|
123 myDecoder.surPattern=0.5;
|
martin@0
|
124 myDecoder.surWidth=60.0;
|
martin@0
|
125 myDecoder.subGain=0.0;
|
martin@0
|
126 myDecoder.centrePattern=0.5;
|
martin@0
|
127 myDecoder.centreGain=0.0;
|
martin@0
|
128 myDecoder.subGain=0.0;
|
martin@0
|
129 myDecoder.decoderMode=2;
|
martin@0
|
130 myDecoder.Fs = sampleRate;
|
martin@0
|
131 myDecoder.Fc = 120;
|
martin@0
|
132
|
martin@0
|
133 myDecoder.filterCoefs();
|
martin@0
|
134
|
martin@0
|
135 }
|
martin@0
|
136
|
martin@0
|
137
|
martin@0
|
138 void SoundField::suspend()
|
martin@0
|
139 {
|
martin@0
|
140 myDecoder.clearFilter();
|
martin@0
|
141
|
martin@0
|
142 if (editor){
|
martin@0
|
143 ((AEffGUIEditor*)editor)->setParameter (100, 0);
|
martin@0
|
144 }
|
martin@0
|
145 }
|
martin@0
|
146
|
martin@0
|
147 void SoundField::close()
|
martin@0
|
148 {
|
martin@0
|
149 }
|
martin@0
|
150
|
martin@0
|
151
|
martin@0
|
152 void SoundField::open()
|
martin@0
|
153 {
|
martin@0
|
154 }
|
martin@0
|
155
|
martin@0
|
156
|
martin@0
|
157
|
martin@0
|
158 //------------------------------------------------------------------------
|
martin@0
|
159 //bool SoundField::getSpeakerArrangement (VstSpeakerArrangement** pluginInput, VstSpeakerArrangement** pluginOutput)
|
martin@0
|
160 //{
|
martin@0
|
161 // *pluginInput = plugInput;
|
martin@0
|
162 // *pluginOutput = plugOutput;
|
martin@0
|
163 // return true;
|
martin@0
|
164 //}
|
martin@0
|
165
|
martin@0
|
166 //------------------------------------------------------------------------
|
martin@0
|
167 bool SoundField::setSpeakerArrangement (VstSpeakerArrangement* pluginInput,
|
martin@0
|
168 VstSpeakerArrangement* pluginOutput)
|
martin@0
|
169 {
|
martin@0
|
170 if (!pluginOutput || !pluginInput)
|
martin@0
|
171 return false;
|
martin@0
|
172
|
martin@0
|
173 bool result = true;
|
martin@0
|
174
|
martin@0
|
175 // This plug-in can act on any speaker arrangement,
|
martin@0
|
176 // provided that there are the same number of inputs/outputs.
|
martin@0
|
177 // if (pluginInput->numChannels > MAX_CHANNELS)
|
martin@0
|
178 // {
|
martin@0
|
179 // // This plug-in can't have so many channels. So we answer
|
martin@0
|
180 // // false, and we set the input arrangement with the maximum
|
martin@0
|
181 // // number of channels possible
|
martin@0
|
182 // result = false;
|
martin@0
|
183 // allocateArrangement (&plugInput, MAX_CHANNELS);
|
martin@0
|
184 // plugInput->type = kSpeakerArr51;
|
martin@0
|
185 // }
|
martin@0
|
186 // else
|
martin@0
|
187 // {
|
martin@0
|
188 // matchArrangement (&plugInput, pluginInput);
|
martin@0
|
189 // }
|
martin@0
|
190
|
martin@0
|
191 // if (pluginOutput->numChannels != plugInput->numChannels)
|
martin@0
|
192 if (pluginOutput->numChannels <= MAX_CHANNELS)
|
martin@0
|
193 {
|
martin@0
|
194 // This plug-in only deals with symetric IO configurations...
|
martin@0
|
195 // result = false;
|
martin@0
|
196 // matchArrangement (&plugOutput, plugInput);
|
martin@0
|
197 myDecoder.decoderMode=pluginOutput->numChannels;
|
martin@0
|
198 }
|
martin@0
|
199 else
|
martin@0
|
200 {
|
martin@0
|
201 // matchArrangement (&plugOutput, pluginOutput);
|
martin@0
|
202 myDecoder.decoderMode=6;
|
martin@0
|
203 }
|
martin@0
|
204
|
martin@0
|
205 return result;
|
martin@0
|
206 }
|
martin@0
|
207
|
martin@0
|
208
|
martin@0
|
209 void SoundField::setProgram (VstInt32 program) //Host to SET the Program
|
martin@0
|
210 {
|
martin@0
|
211 curProgram = program; //Change the curProgram value
|
martin@0
|
212 }
|
martin@0
|
213
|
martin@0
|
214
|
martin@0
|
215 void SoundField::setProgramName(char *name) //SET the Program name
|
martin@0
|
216 {
|
martin@0
|
217 strcpy(programs[curProgram].name, name); //Host SETS the Program[].name
|
martin@0
|
218 }
|
martin@0
|
219
|
martin@0
|
220
|
martin@0
|
221
|
martin@0
|
222 void SoundField::getProgramName(char *name) //GET the Program name
|
martin@0
|
223 {
|
martin@0
|
224 strcpy(name, programs[curProgram].name); //Host GETS the Program[].name
|
martin@0
|
225 }
|
martin@0
|
226
|
martin@0
|
227
|
martin@0
|
228
|
martin@0
|
229 bool SoundField::getProgramNameIndexed (VstInt32 category, VstInt32 which, char* name)
|
martin@0
|
230 {
|
martin@0
|
231 if ((unsigned int)which < kNumPrograms) //Check the ProgramNameIndexed is within range
|
martin@0
|
232 {
|
martin@0
|
233 strcpy(name, programs[which].name); //Host GETS the programs[].name
|
martin@0
|
234 return true; //TRUE- ProgramNameIndexed does exits
|
martin@0
|
235 }
|
martin@0
|
236 return false; //FALSE- ProgramNameIndexed does not exits
|
martin@0
|
237 }
|
martin@0
|
238
|
martin@0
|
239
|
martin@0
|
240 //------------------------------------------------------------------------
|
martin@0
|
241 SoundField::~SoundField () //clears protected variables
|
martin@0
|
242 {
|
martin@0
|
243 if (programs)
|
martin@0
|
244 delete[] programs;
|
martin@0
|
245
|
martin@0
|
246 deallocateArrangement (&plugInput);
|
martin@0
|
247 deallocateArrangement (&plugOutput);
|
martin@0
|
248 }
|
martin@0
|
249
|
martin@0
|
250
|
martin@0
|
251
|
martin@0
|
252 //------------------------------------------------------------------------
|
martin@0
|
253 void SoundField::resume () //Do this on a resume from the host
|
martin@0
|
254 {
|
martin@0
|
255 AudioEffectX::resume ();
|
martin@0
|
256 if (editor){
|
martin@0
|
257 ((AEffGUIEditor*)editor)->setParameter (101, 0);
|
martin@0
|
258 }
|
martin@0
|
259 }
|
martin@0
|
260
|
martin@0
|
261
|
martin@0
|
262 //------------------------------------------------------------------------
|
martin@0
|
263 void SoundField::setParameter (VstInt32 index, float value) // SET Parameter value from host
|
martin@0
|
264 {
|
martin@0
|
265 switch (index)
|
martin@0
|
266 {
|
martin@0
|
267 case kMode :
|
martin@0
|
268 fMode = value;
|
martin@0
|
269 if (value<=0.5f) {
|
martin@0
|
270 myDecoder.Mode = 0;
|
martin@0
|
271 }
|
martin@0
|
272 else {
|
martin@0
|
273 myDecoder.Mode = 1;
|
martin@0
|
274 }
|
martin@0
|
275 break;
|
martin@0
|
276 case kWidth:
|
martin@0
|
277 fWidth = value;
|
martin@0
|
278 myDecoder.Width = (double)value*90;
|
martin@0
|
279 break;
|
martin@0
|
280 case kPattern:
|
martin@0
|
281 fPattern = value;
|
martin@0
|
282 myDecoder.Pattern = (double)value;
|
martin@0
|
283 break;
|
martin@0
|
284 case kRotate :
|
martin@0
|
285 fRotate = value;
|
martin@0
|
286 if (value==0.5f) {
|
martin@0
|
287 myDecoder.Rotate=0.0;
|
martin@0
|
288 }
|
martin@0
|
289 else {
|
martin@0
|
290 myDecoder.Rotate = (double)value*-360+180;
|
martin@0
|
291 }
|
martin@0
|
292 break;
|
martin@0
|
293 case kTilt:
|
martin@0
|
294 fTilt = value;
|
martin@0
|
295 if (value==0.5f) {
|
martin@0
|
296 myDecoder.Tilt=0.0;
|
martin@0
|
297 }
|
martin@0
|
298 else {
|
martin@0
|
299 myDecoder.Tilt = (double)value*-360+180;
|
martin@0
|
300 }
|
martin@0
|
301 break;
|
martin@0
|
302 case kTumble:
|
martin@0
|
303 fTumble = value;
|
martin@0
|
304 if (value==0.5f) {
|
martin@0
|
305 myDecoder.Tumble=0.00;
|
martin@0
|
306 }
|
martin@0
|
307 else {
|
martin@0
|
308 myDecoder.Tumble = (double)value*-360+180;
|
martin@0
|
309 }
|
martin@0
|
310 break;
|
martin@0
|
311 case kZoom:
|
martin@0
|
312 fZoom = value;
|
martin@0
|
313 myDecoder.Zoom = (double)value*200-100;
|
martin@0
|
314 break;
|
martin@0
|
315 case kZoomMethod:
|
martin@0
|
316 fZoomMethod = value;
|
martin@0
|
317 if (value<=0.2f) {
|
martin@0
|
318 myDecoder.ZoomMethod = 0;
|
martin@0
|
319 }
|
martin@0
|
320 else if (value>0.2f && value<=0.5f) {
|
martin@0
|
321 myDecoder.ZoomMethod = 1;
|
martin@0
|
322 }
|
martin@0
|
323 else if (value>0.5f && value<=0.8f) {
|
martin@0
|
324 myDecoder.ZoomMethod = 2;
|
martin@0
|
325 }
|
martin@0
|
326 else if (value>0.8f && value<=1.f) {
|
martin@0
|
327 myDecoder.ZoomMethod = 3;
|
martin@0
|
328 }
|
martin@0
|
329
|
martin@0
|
330 break;
|
martin@0
|
331 case kRearVerb :
|
martin@0
|
332 fRearVerb = value;
|
martin@0
|
333 if (value==0.0f) {
|
martin@0
|
334 myDecoder.RearVerb=-100;
|
martin@0
|
335 }
|
martin@0
|
336 else {
|
martin@0
|
337 myDecoder.RearVerb = -36+(double)value*36;
|
martin@0
|
338 }
|
martin@0
|
339 break;
|
martin@0
|
340 case kHiVerb :
|
martin@0
|
341 fHiVerb = value;
|
martin@0
|
342 if (value==0.0f) {
|
martin@0
|
343 myDecoder.HiVerb=-100;
|
martin@0
|
344 }
|
martin@0
|
345 else {
|
martin@0
|
346 myDecoder.HiVerb= -36+(double)value*36;
|
martin@0
|
347 }
|
martin@0
|
348 break;
|
martin@0
|
349 }
|
martin@0
|
350 if (editor){
|
martin@0
|
351 ((AEffGUIEditor*)editor)->setParameter (index, value);
|
martin@0
|
352 }
|
martin@0
|
353 }
|
martin@0
|
354
|
martin@0
|
355
|
martin@0
|
356
|
martin@0
|
357 //------------------------------------------------------------------------
|
martin@0
|
358 float SoundField::getParameter (VstInt32 index) // GET the value of the parameter
|
martin@0
|
359 {
|
martin@0
|
360 float returnFloat; //Define a float to output
|
martin@0
|
361
|
martin@0
|
362 // Use a switch when more than 1 parameter
|
martin@0
|
363 switch (index)
|
martin@0
|
364 {
|
martin@0
|
365 case kMode :
|
martin@0
|
366 returnFloat = fMode;
|
martin@0
|
367 break;
|
martin@0
|
368 case kWidth:
|
martin@0
|
369 returnFloat = fWidth;
|
martin@0
|
370 break;
|
martin@0
|
371 case kPattern:
|
martin@0
|
372 returnFloat = fPattern;
|
martin@0
|
373 break;
|
martin@0
|
374 case kRotate :
|
martin@0
|
375 returnFloat = fRotate;
|
martin@0
|
376 break;
|
martin@0
|
377 case kTilt:
|
martin@0
|
378 returnFloat = fTilt;
|
martin@0
|
379 break;
|
martin@0
|
380 case kTumble:
|
martin@0
|
381 returnFloat = fTumble;
|
martin@0
|
382 break;
|
martin@0
|
383 case kZoom:
|
martin@0
|
384 returnFloat = fZoom;
|
martin@0
|
385 break;
|
martin@0
|
386 case kZoomMethod:
|
martin@0
|
387 returnFloat = fZoomMethod;
|
martin@0
|
388 break;
|
martin@0
|
389 case kRearVerb :
|
martin@0
|
390 returnFloat = fRearVerb;
|
martin@0
|
391 break;
|
martin@0
|
392 case kHiVerb :
|
martin@0
|
393 returnFloat = fHiVerb;
|
martin@0
|
394 break;
|
martin@0
|
395 case 50:
|
martin@0
|
396 returnFloat = bits;
|
martin@0
|
397 break;
|
martin@0
|
398 }
|
martin@0
|
399 return returnFloat; //Returns the chosen Parameters value
|
martin@0
|
400 }
|
martin@0
|
401
|
martin@0
|
402 //------------------------------------------------------------------------
|
martin@0
|
403 void SoundField::getParameterName (VstInt32 index, char *label) //SET display value shown for Parameters
|
martin@0
|
404 {
|
martin@0
|
405 switch (index)
|
martin@0
|
406 {
|
martin@0
|
407 case kMode :
|
martin@0
|
408 switch (myDecoder.Mode) {
|
martin@0
|
409 case 0 :
|
martin@0
|
410 strcpy(label, "XY");
|
martin@0
|
411 break;
|
martin@0
|
412 case 1 :
|
martin@0
|
413 strcpy(label, "MS");
|
martin@0
|
414 break;
|
martin@0
|
415 }
|
martin@0
|
416 break;
|
martin@0
|
417 case kWidth:
|
martin@0
|
418 strcpy(label, "Width");
|
martin@0
|
419 break;
|
martin@0
|
420 case kPattern:
|
martin@0
|
421 strcpy(label, "Pattern");
|
martin@0
|
422 break;
|
martin@0
|
423 case kRotate :
|
martin@0
|
424 strcpy(label, "Rotate");
|
martin@0
|
425 break;
|
martin@0
|
426 case kTilt:
|
martin@0
|
427 strcpy(label, "Tilt");
|
martin@0
|
428 break;
|
martin@0
|
429 case kTumble:
|
martin@0
|
430 strcpy(label, "Tumble");
|
martin@0
|
431 break;
|
martin@0
|
432 case kZoom:
|
martin@0
|
433 strcpy(label, "Zoom");
|
martin@0
|
434 break;
|
martin@0
|
435 case kZoomMethod:
|
martin@0
|
436 strcpy(label, "Zoom Method");
|
martin@0
|
437 break;
|
martin@0
|
438 case kRearVerb :
|
martin@0
|
439 strcpy(label, "RearVerb");
|
martin@0
|
440 break;
|
martin@0
|
441 case kHiVerb :
|
martin@0
|
442 strcpy(label, "HiVerb");
|
martin@0
|
443 break;
|
martin@0
|
444 }
|
martin@0
|
445 }
|
martin@0
|
446
|
martin@0
|
447
|
martin@0
|
448 //------------------------------------------------------------------------
|
martin@0
|
449 void SoundField::getParameterDisplay (VstInt32 index, char *text) //GET display value shown for Parameters
|
martin@0
|
450 {
|
martin@0
|
451 switch (index)
|
martin@0
|
452 {
|
martin@0
|
453 case kMode :
|
martin@0
|
454 switch (myDecoder.Mode) {
|
martin@0
|
455 case 0 :
|
martin@0
|
456 strcpy(text, "XY");
|
martin@0
|
457 break;
|
martin@0
|
458 case 1 :
|
martin@0
|
459 strcpy(text, "MS");
|
martin@0
|
460 break;
|
martin@0
|
461 }
|
martin@0
|
462 break;
|
martin@0
|
463 case kWidth:
|
martin@0
|
464 sprintf (text, "%.1f\u00B0", myDecoder.Width);
|
martin@0
|
465 break;
|
martin@0
|
466 case kPattern:
|
martin@0
|
467 //sprintf (text, "%.1f", myDecoder.Pattern);
|
martin@0
|
468 if (myDecoder.Pattern<=0.125) {
|
martin@0
|
469 strcpy(text, "Fig-of-8");
|
martin@0
|
470 }
|
martin@0
|
471 else if (myDecoder.Pattern>0.125 && myDecoder.Pattern<=0.375) {
|
martin@0
|
472 strcpy(text, "Hyper-Card.");
|
martin@0
|
473 }
|
martin@0
|
474 else if (myDecoder.Pattern>0.375 && myDecoder.Pattern<=0.625) {
|
martin@0
|
475 strcpy(text, "Cardioid");
|
martin@0
|
476 }
|
martin@0
|
477 else if (myDecoder.Pattern>0.625 && myDecoder.Pattern<=0.875) {
|
martin@0
|
478 strcpy(text, "Sub-Card.");
|
martin@0
|
479 }
|
martin@0
|
480 else {
|
martin@0
|
481 strcpy(text, "Omni.");
|
martin@0
|
482 }
|
martin@0
|
483
|
martin@0
|
484
|
martin@0
|
485 break;
|
martin@0
|
486 case kRotate :
|
martin@0
|
487 sprintf (text, "%.1f\u00B0", myDecoder.Rotate);
|
martin@0
|
488 break;
|
martin@0
|
489 case kTilt:
|
martin@0
|
490 sprintf (text, "%.1f\u00B0", myDecoder.Tilt);
|
martin@0
|
491 break;
|
martin@0
|
492 case kTumble:
|
martin@0
|
493 sprintf (text, "%.1f\u00B0", myDecoder.Tumble);
|
martin@0
|
494 break;
|
martin@0
|
495 case kZoom:
|
martin@0
|
496 sprintf (text, "%.1f%%", myDecoder.Zoom);
|
martin@0
|
497 break;
|
martin@0
|
498 case kZoomMethod:
|
martin@0
|
499 switch (myDecoder.ZoomMethod) {
|
martin@0
|
500 case 0:
|
martin@0
|
501 strcpy(text, "Dominance");
|
martin@0
|
502 break;
|
martin@0
|
503 case 1:
|
martin@0
|
504 strcpy(text, "Press");
|
martin@0
|
505 break;
|
martin@0
|
506 case 2:
|
martin@0
|
507 strcpy(text, "Push");
|
martin@0
|
508 break;
|
martin@0
|
509 case 3:
|
martin@0
|
510 strcpy(text, "Focus");
|
martin@0
|
511 break;
|
martin@0
|
512 default:
|
martin@0
|
513 break;
|
martin@0
|
514 }
|
martin@0
|
515 break;
|
martin@0
|
516 case kRearVerb :
|
martin@0
|
517 if (myDecoder.RearVerb>-40) {
|
martin@0
|
518 sprintf (text, "%.2fdB", myDecoder.RearVerb);
|
martin@0
|
519 }
|
martin@0
|
520 else {
|
martin@0
|
521 strcpy(text, "Off");
|
martin@0
|
522 }
|
martin@0
|
523 break;
|
martin@0
|
524 case kHiVerb :
|
martin@0
|
525 if (myDecoder.HiVerb>-40) {
|
martin@0
|
526 sprintf (text, "%.2fdB", myDecoder.HiVerb);
|
martin@0
|
527 }
|
martin@0
|
528 else {
|
martin@0
|
529 strcpy(text, "Off");
|
martin@0
|
530 }
|
martin@0
|
531 break;
|
martin@0
|
532 }
|
martin@0
|
533 //kVstMaxParamStrLen
|
martin@0
|
534 }
|
martin@0
|
535
|
martin@0
|
536
|
martin@0
|
537 //------------------------------------------------------------------------
|
martin@0
|
538 void SoundField::getParameterLabel (VstInt32 index, char *label) // Labels shown for Parameters
|
martin@0
|
539 {
|
martin@0
|
540 switch (index)
|
martin@0
|
541 {
|
martin@0
|
542 case kMode :
|
martin@0
|
543 strcpy(label, "Microphones");
|
martin@0
|
544 break;
|
martin@0
|
545 case kWidth:
|
martin@0
|
546 strcpy(label, "Degrees");
|
martin@0
|
547 break;
|
martin@0
|
548 case kPattern:
|
martin@0
|
549 strcpy(label, "Omni");
|
martin@0
|
550 break;
|
martin@0
|
551 case kRotate :
|
martin@0
|
552 strcpy(label, "Degrees");
|
martin@0
|
553 break;
|
martin@0
|
554 case kTilt:
|
martin@0
|
555 strcpy(label, "Degrees");
|
martin@0
|
556 break;
|
martin@0
|
557 case kTumble:
|
martin@0
|
558 strcpy(label, "Degrees");
|
martin@0
|
559 break;
|
martin@0
|
560 case kZoom:
|
martin@0
|
561 strcpy(label, "Precentage");
|
martin@0
|
562 break;
|
martin@0
|
563 case kZoomMethod:
|
martin@0
|
564 strcpy(label, "Selection");
|
martin@0
|
565 break;
|
martin@0
|
566 case kRearVerb :
|
martin@0
|
567 strcpy(label, "dB");
|
martin@0
|
568 break;
|
martin@0
|
569 case kHiVerb :
|
martin@0
|
570 strcpy(label, "dB");
|
martin@0
|
571 break;
|
martin@0
|
572 }
|
martin@0
|
573 }
|
martin@0
|
574
|
martin@0
|
575
|
martin@0
|
576 //------------------------------------------------------------------------
|
martin@0
|
577 bool SoundField::getEffectName (char* name) // Tha NAME of the effect
|
martin@0
|
578 {
|
martin@0
|
579 strcpy (name, "SoundField Decoder");
|
martin@0
|
580 return true;
|
martin@0
|
581 }
|
martin@0
|
582
|
martin@0
|
583 //------------------------------------------------------------------------
|
martin@0
|
584 bool SoundField::getProductString (char* text) // The PRODUCT name
|
martin@0
|
585 {
|
martin@0
|
586 strcpy (text, "SoundField Decoder");
|
martin@0
|
587 return true;
|
martin@0
|
588 }
|
martin@0
|
589
|
martin@0
|
590 //------------------------------------------------------------------------
|
martin@0
|
591 bool SoundField::getVendorString (char* text) // Vendor (Creator/Publisher)
|
martin@0
|
592 {
|
martin@0
|
593 strcpy (text, "Martin J. Morrell");
|
martin@0
|
594 return true;
|
martin@0
|
595 }
|
martin@0
|
596
|
martin@0
|
597
|
martin@0
|
598 //------------------------------------------------------------------------
|
martin@0
|
599 VstInt32 SoundField::getVendorVersion ()
|
martin@0
|
600 {
|
martin@0
|
601 return VERSION;
|
martin@0
|
602 }
|
martin@0
|
603
|
martin@0
|
604
|
martin@0
|
605 //---------------------------------------------------------------------------
|
martin@0
|
606 void SoundField::processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames) //The part that does some actual DSP. This section takes the input audio and gives the output audio back.
|
martin@0
|
607 {
|
martin@0
|
608
|
martin@0
|
609
|
martin@0
|
610 while (--sampleFrames >= 0) //Do this process if the audio is running
|
martin@0
|
611 {
|
martin@0
|
612 //Set the internal B-Format values as doubles.
|
martin@0
|
613 double w=(double) *inputs[0]++;
|
martin@0
|
614 double x=(double) *inputs[1]++;
|
martin@0
|
615 double y=(double) *inputs[2]++;
|
martin@0
|
616 double z=(double) *inputs[3]++;
|
martin@0
|
617
|
martin@0
|
618 if (myDecoder.decoderMode == 2) {//Stereo
|
martin@0
|
619 myDecoder.stereoDecoder(w, x, y, z);
|
martin@0
|
620 *outputs[0]++ = float(myDecoder.outputL);
|
martin@0
|
621 *outputs[1]++ = float(myDecoder.outputR);
|
martin@0
|
622 }
|
martin@0
|
623 else if (myDecoder.decoderMode == 3) {//2.1
|
martin@0
|
624 myDecoder.twoOneDecoder(w, x, y, z);
|
martin@0
|
625 *outputs[0]++ = float(myDecoder.outputL);
|
martin@0
|
626 *outputs[1]++ = float(myDecoder.outputR);
|
martin@0
|
627 *outputs[2]++ = float(myDecoder.outputS);
|
martin@0
|
628 }
|
martin@0
|
629 else if (myDecoder.decoderMode == 4) {//LRCS
|
martin@0
|
630 myDecoder.fiveOneDecoder(w, x, y, z);
|
martin@0
|
631 *outputs[0]++ = float(myDecoder.outputL);
|
martin@0
|
632 *outputs[1]++ = float(myDecoder.outputR);
|
martin@0
|
633 *outputs[2]++ = float(myDecoder.outputSL);
|
martin@0
|
634 *outputs[3]++ = float(myDecoder.outputSR);
|
martin@0
|
635 }
|
martin@0
|
636 else if (myDecoder.decoderMode == 5) {//5.0
|
martin@0
|
637 myDecoder.fiveOneDecoder(w, x, y, z);
|
martin@0
|
638 *outputs[0]++ = float(myDecoder.outputL);
|
martin@0
|
639 *outputs[1]++ = float(myDecoder.outputR);
|
martin@0
|
640 *outputs[2]++ = float(myDecoder.outputC);
|
martin@0
|
641 *outputs[3]++ = float(myDecoder.outputSL);
|
martin@0
|
642 *outputs[4]++ = float(myDecoder.outputSR);
|
martin@0
|
643 }
|
martin@0
|
644 else if (myDecoder.decoderMode == 6) {//5.1
|
martin@0
|
645 myDecoder.fiveOneDecoder(w, x, y, z);
|
martin@0
|
646 *outputs[0]++ = float(myDecoder.outputL);
|
martin@0
|
647 *outputs[1]++ = float(myDecoder.outputR);
|
martin@0
|
648 *outputs[2]++ = float(myDecoder.outputC);
|
martin@0
|
649 *outputs[3]++ = float(myDecoder.outputS);
|
martin@0
|
650 *outputs[4]++ = float(myDecoder.outputSL);
|
martin@0
|
651 *outputs[5]++ = float(myDecoder.outputSR);
|
martin@0
|
652 }
|
martin@0
|
653
|
martin@0
|
654
|
martin@0
|
655 }
|
martin@0
|
656 }
|