Jamoma API  0.6.0.a19
PlugtasticAUInstrumentGraph.h
1 #ifndef __PlugtasticAUGraph_h__
2 #define __PlugtasticAUGraph_h__
3 
4 #include "PlugtasticAPI.h"
5 #include "AUEffectBase.h"
6 #include "PlugtasticParameter.h"
7 
8 class PlugtasticAUInstrumentGraph {
9  friend class PlugtasticAUParameters;
10 
12  TTAudioSignalPtr mAudioSignal;
13  TTAudioGraphObjectPtr obj0;
14  TTAudioGraphObjectPtr obj1;
15  TTAudioGraphObjectPtr obj2;
16  TTAudioGraphObjectPtr obj3;
17  TTAudioGraphObjectPtr obj4;
18  TTAudioGraphObjectPtr obj5;
19  TTAudioGraphObjectPtr obj6;
20  TTAudioGraphObjectPtr obj7;
21  TTAudioGraphObjectPtr obj8;
22  TTAudioGraphObjectPtr obj9;
23  TTAudioGraphObjectPtr obj10;
24  TTAudioGraphObjectPtr obj11;
25  TTAudioGraphObjectPtr obj12;
26  TTAudioGraphObjectPtr obj13;
27  TTAudioGraphObjectPtr obj14;
28  TTAudioGraphObjectPtr obj15;
29  TTAudioGraphObjectPtr obj16;
30  TTAudioGraphObjectPtr obj17;
31  TTAudioGraphObjectPtr obj18;
32  TTAudioGraphObjectPtr obj19;
33  TTAudioGraphObjectPtr obj20;
34  TTAudioGraphObjectPtr obj21;
35  TTAudioGraphObjectPtr obj22;
36  TTAudioGraphObjectPtr obj23;
37  TTAudioGraphObjectPtr obj24;
38  TTAudioGraphObjectPtr obj25;
39  TTAudioGraphObjectPtr obj26;
40 
41 public:
42  uint mVectorSize;
43 
44  PlugtasticAUInstrumentGraph() :
45  obj0(NULL),
46  obj1(NULL),
47  obj2(NULL),
48  obj3(NULL),
49  obj4(NULL),
50  obj5(NULL),
51  obj6(NULL),
52  obj7(NULL),
53  obj8(NULL),
54  obj9(NULL),
55  obj10(NULL),
56  obj11(NULL),
57  obj12(NULL),
58  obj13(NULL),
59  obj14(NULL),
60  obj15(NULL),
61  obj16(NULL),
62  obj17(NULL),
63  obj18(NULL),
64  obj19(NULL),
65  obj20(NULL),
66  obj21(NULL),
67  obj22(NULL),
68  obj23(NULL),
69  obj24(NULL),
70  obj25(NULL),
71  obj26(NULL),
72  mAudioSignal(NULL)
73  {
74  TTValue audioObjectArguments;
75 
76  audioObjectArguments.setSize(3);
77  PlugtasticInit();
78 
79  audioObjectArguments.set(0, TT("plugtastic.output"));
80  audioObjectArguments.set(1, 2);
81  audioObjectArguments.set(2, 1);
82  TTObjectBaseInstantiate(TT("audio.object"), (TTObjectBasePtr*)&obj0, audioObjectArguments);
83  obj0->mKernel->setAttributeValue(TT("linearGain"), 1.000000);
84  obj0->mKernel->setAttributeValue(TT("maxNumChannels"), 0);
85  obj0->mKernel->setAttributeValue(TT("midiGain"), 100.000000);
86  obj0->mKernel->setAttributeValue(TT("gain"), 0.000000);
87  obj0->mKernel->setAttributeValue(TT("bypass"), 0);
88  obj0->mKernel->setAttributeValue(TT("mute"), 0);
89  obj0->mKernel->setAttributeValue(TT("sampleRate"), 44100u);
90 
91  audioObjectArguments.set(0, TT("operator"));
92  audioObjectArguments.set(1, 1);
93  audioObjectArguments.set(2, 1);
94  TTObjectBaseInstantiate(TT("audio.object"), (TTObjectBasePtr*)&obj1, audioObjectArguments);
95  obj1->mKernel->setAttributeValue(TT("maxNumChannels"), 0);
96  obj1->mKernel->setAttributeValue(TT("operator"), TT("*"));
97  obj1->mKernel->setAttributeValue(TT("operand"), 1.000000);
98  obj1->mKernel->setAttributeValue(TT("bypass"), 0);
99  obj1->mKernel->setAttributeValue(TT("mute"), 0);
100  obj1->mKernel->setAttributeValue(TT("sampleRate"), 44100u);
101 
102  audioObjectArguments.set(0, TT("wavetable"));
103  audioObjectArguments.set(1, 0);
104  audioObjectArguments.set(2, 1);
105  TTObjectBaseInstantiate(TT("audio.object"), (TTObjectBasePtr*)&obj2, audioObjectArguments);
106  obj2->mKernel->setAttributeValue(TT("frequency"), 440.000000);
107  obj2->mKernel->setAttributeValue(TT("maxNumChannels"), 1);
108  obj2->mKernel->setAttributeValue(TT("size"), 8192u);
109  obj2->mKernel->setAttributeValue(TT("gain"), 0.000000);
110  obj2->mKernel->setAttributeValue(TT("mode"), TT("sine"));
111  obj2->mKernel->setAttributeValue(TT("interpolation"), TT("linear"));
112  obj2->mKernel->setAttributeValue(TT("bypass"), 0);
113  obj2->mKernel->setAttributeValue(TT("mute"), 0);
114  obj2->mKernel->setAttributeValue(TT("sampleRate"), 44100u);
115 
116  audioObjectArguments.set(0, TT("operator"));
117  audioObjectArguments.set(1, 1);
118  audioObjectArguments.set(2, 1);
119  TTObjectBaseInstantiate(TT("audio.object"), (TTObjectBasePtr*)&obj3, audioObjectArguments);
120  obj3->mKernel->setAttributeValue(TT("maxNumChannels"), 0);
121  obj3->mKernel->setAttributeValue(TT("operator"), TT("+"));
122  obj3->mKernel->setAttributeValue(TT("operand"), 1.000000);
123  obj3->mKernel->setAttributeValue(TT("bypass"), 0);
124  obj3->mKernel->setAttributeValue(TT("mute"), 0);
125  obj3->mKernel->setAttributeValue(TT("sampleRate"), 44100u);
126 
127  audioObjectArguments.set(0, TT("audio.sig"));
128  audioObjectArguments.set(1, 1);
129  audioObjectArguments.set(2, 1);
130  TTObjectBaseInstantiate(TT("audio.object"), (TTObjectBasePtr*)&obj4, audioObjectArguments);
131  obj4->mKernel->setAttributeValue(TT("value"), 110.000000);
132  obj4->mKernel->setAttributeValue(TT("maxNumChannels"), 0);
133  obj4->mKernel->setAttributeValue(TT("bypass"), 0);
134  obj4->mKernel->setAttributeValue(TT("mute"), 0);
135  obj4->mKernel->setAttributeValue(TT("sampleRate"), 44100u);
136 
137 
138  TTObjectBaseInstantiate(TT("graph.object"), (TTObjectBasePtr*)&obj6, TTValue(TT("dataspace")));
139  obj6->mKernel->setAttributeValue(TT("inputUnit"), TT("midi"));
140  obj6->mKernel->setAttributeValue(TT("outputUnit"), TT("hz"));
141  obj6->mKernel->setAttributeValue(TT("dataspace"), TT("time"));
142  obj6->mKernel->setAttributeValue(TT("bypass"), 0);
143 
144 
145  TTObjectBaseInstantiate(TT("graph.object"), (TTObjectBasePtr*)&obj7, TTValue(TT("midi.filter")));
146  obj7->mKernel->setAttributeValue(TT("type"), TT("note"));
147  obj7->mKernel->setAttributeValue(TT("bypass"), 0);
148 
149 
150  TTObjectBaseInstantiate(TT("graph.object"), (TTObjectBasePtr*)&obj8, TTValue(TT("midi.in")));
151  obj8->mKernel->setAttributeValue(TT("owner"), 135826496);
152  obj8->mKernel->setAttributeValue(TT("bypass"), 0);
153  obj8->mKernel->setAttributeValue(TT("device"), TT("default"));
154 
155  obj7->connect(obj8);
156  obj6->connect(obj7);
157  obj4->connect(obj6);
158  obj3->connectAudio(obj4, 0, 0);
159  audioObjectArguments.set(0, TT("operator"));
160  audioObjectArguments.set(1, 1);
161  audioObjectArguments.set(2, 1);
162  TTObjectBaseInstantiate(TT("audio.object"), (TTObjectBasePtr*)&obj9, audioObjectArguments);
163  obj9->mKernel->setAttributeValue(TT("maxNumChannels"), 0);
164  obj9->mKernel->setAttributeValue(TT("operator"), TT("*"));
165  obj9->mKernel->setAttributeValue(TT("operand"), 1.000000);
166  obj9->mKernel->setAttributeValue(TT("bypass"), 0);
167  obj9->mKernel->setAttributeValue(TT("mute"), 0);
168  obj9->mKernel->setAttributeValue(TT("sampleRate"), 44100u);
169 
170  audioObjectArguments.set(0, TT("wavetable"));
171  audioObjectArguments.set(1, 0);
172  audioObjectArguments.set(2, 1);
173  TTObjectBaseInstantiate(TT("audio.object"), (TTObjectBasePtr*)&obj10, audioObjectArguments);
174  obj10->mKernel->setAttributeValue(TT("frequency"), 440.000000);
175  obj10->mKernel->setAttributeValue(TT("maxNumChannels"), 1);
176  obj10->mKernel->setAttributeValue(TT("size"), 8192u);
177  obj10->mKernel->setAttributeValue(TT("gain"), 0.000000);
178  obj10->mKernel->setAttributeValue(TT("mode"), TT("sine"));
179  obj10->mKernel->setAttributeValue(TT("interpolation"), TT("linear"));
180  obj10->mKernel->setAttributeValue(TT("bypass"), 0);
181  obj10->mKernel->setAttributeValue(TT("mute"), 0);
182  obj10->mKernel->setAttributeValue(TT("sampleRate"), 44100u);
183 
184  audioObjectArguments.set(0, TT("operator"));
185  audioObjectArguments.set(1, 1);
186  audioObjectArguments.set(2, 1);
187  TTObjectBaseInstantiate(TT("audio.object"), (TTObjectBasePtr*)&obj11, audioObjectArguments);
188  obj11->mKernel->setAttributeValue(TT("maxNumChannels"), 0);
189  obj11->mKernel->setAttributeValue(TT("operator"), TT("*"));
190  obj11->mKernel->setAttributeValue(TT("operand"), 1.000000);
191  obj11->mKernel->setAttributeValue(TT("bypass"), 0);
192  obj11->mKernel->setAttributeValue(TT("mute"), 0);
193  obj11->mKernel->setAttributeValue(TT("sampleRate"), 44100u);
194 
195  obj11->connectAudio(obj4, 0, 0);
196  audioObjectArguments.set(0, TT("audio.sig"));
197  audioObjectArguments.set(1, 1);
198  audioObjectArguments.set(2, 1);
199  TTObjectBaseInstantiate(TT("audio.object"), (TTObjectBasePtr*)&obj12, audioObjectArguments);
200  obj12->mKernel->setAttributeValue(TT("value"), 10.000000);
201  obj12->mKernel->setAttributeValue(TT("maxNumChannels"), 0);
202  obj12->mKernel->setAttributeValue(TT("bypass"), 0);
203  obj12->mKernel->setAttributeValue(TT("mute"), 0);
204  obj12->mKernel->setAttributeValue(TT("sampleRate"), 44100u);
205 
206  obj11->connectAudio(obj12, 0, 1);
207  obj10->connectAudio(obj11, 0, 0);
208  obj9->connectAudio(obj10, 0, 0);
209  audioObjectArguments.set(0, TT("operator"));
210  audioObjectArguments.set(1, 1);
211  audioObjectArguments.set(2, 1);
212  TTObjectBaseInstantiate(TT("audio.object"), (TTObjectBasePtr*)&obj16, audioObjectArguments);
213  obj16->mKernel->setAttributeValue(TT("maxNumChannels"), 0);
214  obj16->mKernel->setAttributeValue(TT("operator"), TT("*"));
215  obj16->mKernel->setAttributeValue(TT("operand"), 1.000000);
216  obj16->mKernel->setAttributeValue(TT("bypass"), 0);
217  obj16->mKernel->setAttributeValue(TT("mute"), 0);
218  obj16->mKernel->setAttributeValue(TT("sampleRate"), 44100u);
219 
220  obj16->connectAudio(obj11, 0, 0);
221  audioObjectArguments.set(0, TT("adsr"));
222  audioObjectArguments.set(1, 1);
223  audioObjectArguments.set(2, 1);
224  TTObjectBaseInstantiate(TT("audio.object"), (TTObjectBasePtr*)&obj17, audioObjectArguments);
225  obj17->mKernel->setAttributeValue(TT("sustain"), -12.000000);
226  obj17->mKernel->setAttributeValue(TT("release"), 500.000000);
227  obj17->mKernel->setAttributeValue(TT("maxNumChannels"), 0);
228  obj17->mKernel->setAttributeValue(TT("sampleRate"), 44100u);
229  obj17->mKernel->setAttributeValue(TT("attack"), 150.000000);
230  obj17->mKernel->setAttributeValue(TT("mode"), TT("hybrid"));
231  obj17->mKernel->setAttributeValue(TT("trigger"), 0);
232  obj17->mKernel->setAttributeValue(TT("decay"), 150.000000);
233  obj17->mKernel->setAttributeValue(TT("mute"), 0);
234  obj17->mKernel->setAttributeValue(TT("linearSustain"), 0.251189);
235  obj17->mKernel->setAttributeValue(TT("bypass"), 0);
236 
237  obj17->connect(obj7);
238  obj16->connectAudio(obj17, 0, 1);
239  obj9->connectAudio(obj16, 0, 1);
240  obj3->connectAudio(obj9, 0, 1);
241  obj2->connectAudio(obj3, 0, 0);
242  obj1->connectAudio(obj2, 0, 0);
243  audioObjectArguments.set(0, TT("adsr"));
244  audioObjectArguments.set(1, 1);
245  audioObjectArguments.set(2, 1);
246  TTObjectBaseInstantiate(TT("audio.object"), (TTObjectBasePtr*)&obj23, audioObjectArguments);
247  obj23->mKernel->setAttributeValue(TT("sustain"), -6.000000);
248  obj23->mKernel->setAttributeValue(TT("release"), 500.000000);
249  obj23->mKernel->setAttributeValue(TT("maxNumChannels"), 0);
250  obj23->mKernel->setAttributeValue(TT("sampleRate"), 44100u);
251  obj23->mKernel->setAttributeValue(TT("attack"), 50.000000);
252  obj23->mKernel->setAttributeValue(TT("mode"), TT("hybrid"));
253  obj23->mKernel->setAttributeValue(TT("trigger"), 0);
254  obj23->mKernel->setAttributeValue(TT("decay"), 100.000000);
255  obj23->mKernel->setAttributeValue(TT("mute"), 0);
256  obj23->mKernel->setAttributeValue(TT("linearSustain"), 0.501187);
257  obj23->mKernel->setAttributeValue(TT("bypass"), 0);
258 
259  obj23->connect(obj7);
260  obj1->connectAudio(obj23, 0, 1);
261  obj0->connectAudio(obj1, 0, 0);
262  }
263 
264 
265  virtual ~PlugtasticAUInstrumentGraph()
266  {
294  }
295 
296 
297  void process(const AudioBufferList* inBufferList, AudioBufferList* outBufferList, const AudioBufferList* sidechainInBufferList, AudioBufferList* sidechainOutBufferList)
298  {
299  TTUInt16 channel;
300  TTUInt16 inChannelCount = inBufferList->mNumberBuffers;
301  TTUInt32 outChannelCount = outBufferList->mNumberBuffers;
302 
303  // copy the input
304  ->getUnitGenerator()->setAttributeValue(TT("vectorSize"), mVectorSize);
305  ->getUnitGenerator()->setAttributeValue(TT("maxNumChannels"), inChannelCount);
306  ->getUnitGenerator()->setAttributeValue(TT("numChannels"), inChannelCount);
307  ->setOutputNumChannels(0, inChannelCount);
308 
309  // TODO: All of this channel-related stuff can be set once at setup -- it doesn't need to be called every vector!
310 
311  for (channel=0; channel != inChannelCount; channel++)
312  TTAudioGraphGeneratorPtr(->getUnitGenerator())->mBuffer->setVector(channel, mVectorSize, (TTFloat32*)inBufferList->mBuffers[channel].mData);
313 
314  // run the graph
315  mInitData.vectorSize = mVectorSize;
316 
317  obj0->lockProcessing();
318  obj0->preprocess(mInitData);
319  obj0->process(mAudioSignal);
320  obj0->unlockProcessing();
321 
322  // copy the output
323  for (channel=0; channel != outChannelCount; channel++)
324  mAudioSignal->getVector(channel, mVectorSize, (TTFloat32*)outBufferList->mBuffers[channel].mData);
325  }
326 };
327 
328 
329 
330 
331 enum {
332  kNumberOfParameters = 0
333 };
334 
335 #include "PlugtasticAUInstrument.h"
336 
337 class PlugtasticAUParameters {
338  // we copy this function from the AUBase file, because that file declares this method as a protected member for some reason
339  static void FillInParameterName (AudioUnitParameterInfo& ioInfo, CFStringRef inName, bool inShouldRelease)
340  {
341  ioInfo.cfNameString = inName;
342  ioInfo.flags |= kAudioUnitParameterFlag_HasCFNameString;
343  if (inShouldRelease)
344  ioInfo.flags |= kAudioUnitParameterFlag_CFNameRelease;
345  CFStringGetCString(inName, ioInfo.name, offsetof (AudioUnitParameterInfo, clumpID), kCFStringEncodingUTF8);
346  }
347 
348 
349 public:
350  OSStatus getInfo(AudioUnitScope inScope, AudioUnitParameterID inParameterID, AudioUnitParameterInfo &outParameterInfo)
351  {
352  OSStatus result = noErr;
353 
354  outParameterInfo.flags = kAudioUnitParameterFlag_IsWritable | kAudioUnitParameterFlag_IsReadable;
355 
356  if (inScope == kAudioUnitScope_Global) {
357  switch (inParameterID) {
358  default:
359  result = kAudioUnitErr_InvalidParameter;
360  break;
361  }
362  }
363  else
364  result = kAudioUnitErr_InvalidParameter;
365 
366  return result;
367  }
368 
369 
370  void setDefaults(PlugtasticAUInstrument* self)
371  {
372  }
373 
374 
375  void setParameter(PlugtasticAUInstrumentGraph* graph, AudioUnitParameterID inID, Float32 inValue)
376  {
377  switch (inID) {
378  default:
379  break;
380  }
381  }
382 };
383 
384 
385 #endif // __PlugtasticAUGraph_h__
std::uint16_t TTUInt16
16 bit unsigned integer
Definition: TTBase.h:176
TTErr TTObjectBaseRelease(TTObjectBasePtr *anObject)
DEPRECATED.
Base class for all first-class Jamoma objects.
Definition: TTObjectBase.h:109
#define TT
This macro is defined as a shortcut for doing a lookup in the symbol table.
Definition: TTSymbol.h:155
TTErr setVector(const TTChannelCount channel, const TTUInt16 vectorSize, const TTSampleValuePtr newVector)
[doxygenAppendixC_methodExample]
void setSize(const TTUInt16 arg)
DEPRECATED.
Definition: TTValue.h:528
TTAudioGraphGenerator * TTAudioGraphGeneratorPtr
Pointer to a TTAudioGraphGenerator.
TTUInt16 vectorSize
The global/recommended/initial vectorSize (which can be overriden during process) ...
Definition: TTAudioGraph.h:83
float TTFloat32
32 bit floating point number
Definition: TTBase.h:187
TTErr TTObjectBaseInstantiate(const TTSymbol className, TTObjectBasePtr *returnedObjectPtr, const TTValue arguments)
DEPRECATED.
The TTAudioSignal class represents N vectors of audio samples for M channels.
Definition: TTAudioSignal.h:57
void set(const TTUInt16 index, const T &anElementValue)
DEPRECATED.
Definition: TTValue.h:569
[doxygenAppendixC_bitmaskExample]
Definition: TTAudioGraph.h:81
std::uint32_t TTUInt32
32 bit unsigned integer
Definition: TTBase.h:178
TTAudioSignalPtr mBuffer
Storage for the audioSignal that we provide.
[doxygenAppendixC_copyExample]
Definition: TTValue.h:34