Jamoma API  0.6.0.a19
PlugtasticAUInstrument.h
1 #include "PlugtasticAUInstrumentVersion.h"
2 #include "AUInstrumentBase.h"
3 #include "PlugtasticAUInstrumentGraph.h"
4 
5 #if AU_DEBUG_DISPATCHER
6 #include "AUDebugDispatcher.h"
7 #endif
8 
9 #ifndef __PlugtasticAUInstrument_h__
10 #define __PlugtasticAUInstrument_h__
11 
12 
13 /*
14 //
15 static const UInt32 kNumNotes = 12;
16 static const UInt32 kMaxActiveNotes = 8;
17 
18 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
19 
20 const double twopi = 2.0 * 3.14159265358979;
21 inline double pow5(double x) { double x2 = x*x; return x2*x2*x; }
22 
23 enum {
24  kGlobalVolumeParam = 0,
25  //Add your parameters here...
26  kNumberOfParameters=1
27 };
28 
29 static const CFStringRef kGlobalVolumeName = CFSTR("global volume");
30 */
31 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
32 /*
33 struct TestNote : public SynthNote
34 {
35  virtual ~TestNote() {}
36 
37  virtual void Attack(const MusicDeviceNoteParams &inParams)
38  {
39  double sampleRate = SampleRate();
40  phase = 0.;
41  amp = 0.;
42  maxamp = 0.4 * pow(inParams.mVelocity/127., 3.);
43  up_slope = maxamp / (0.1 * sampleRate);
44  dn_slope = -maxamp / (0.9 * sampleRate);
45  fast_dn_slope = -maxamp / (0.005 * sampleRate);
46  }
47 
48  virtual Float32 Amplitude() { return amp; } // used for finding quietest note for voice stealing.
49  virtual OSStatus Render(UInt32 inNumFrames, AudioBufferList& inBufferList);
50 
51  double phase, amp, maxamp;
52  double up_slope, dn_slope, fast_dn_slope;
53 };
54 
55 class PlugtasticAUInstrument : public AUMonotimbralInstrumentBase
56 {
57  public:
58  PlugtasticAUInstrument(ComponentInstance inComponentInstance);
59 
60  virtual OSStatus Initialize();
61 // virtual OSStatus Version() { return kPlugtasticAUInstrumentVersion; }
62  virtual OSStatus Version() { return kPlugtasticAUEffectVersion; }
63 
64  virtual OSStatus GetParameterInfo(AudioUnitScope inScope, AudioUnitParameterID inParameterID, AudioUnitParameterInfo &outParameterInfo);
65  private:
66 
67  TestNote mTestNotes[kNumNotes];
68 };
69 */
70 
71 class PlugtasticAUParameters;
72 
73 // TODO: By far, the easiest way to do this is to subclass AUMIDIEffectBase
74 // Then operate as in an effect, but use the MIDI methods below to push data from our midi.in# object
75 
76 class PlugtasticAUInstrument : public AUMIDIEffectBase
77 {
78  PlugtasticAUInstrumentGraph* mGraph;
79  PlugtasticAUParameters* mParameters;
80 
81 public:
82 
83  PlugtasticAUInstrument(AudioUnit component);
84 
85  virtual ~PlugtasticAUInstrument()
86  {
87  delete mGraph;
88  delete mParameters;
89 
90 #if AU_DEBUG_DISPATCHER
91  delete mDebugDispatcher;
92 #endif
93  }
94 
95 // virtual OSStatus GetParameterValueStrings(AudioUnitScope inScope, AudioUnitParameterID inParameterID, CFArrayRef* outStrings);
96 
97  virtual OSStatus GetParameterInfo(AudioUnitScope inScope, AudioUnitParameterID inParameterID, AudioUnitParameterInfo &outParameterInfo);
98 
99 // virtual OSStatus GetPropertyInfo(AudioUnitPropertyID inID,
100 // AudioUnitScope inScope,
101 // AudioUnitElement inElement,
102 // UInt32& outDataSize,
103 // Boolean& outWritable);
104 
105  virtual ComponentResult SetParameter(AudioUnitParameterID inID,
106  AudioUnitScope inScope,
107  AudioUnitElement inElement,
108  Float32 inValue,
109  UInt32 inBufferOffsetInFrames);
110 
111 // virtual void SetParameter(AudioUnitParameterID inID, Float32 inValue);
112 
113  virtual OSStatus GetProperty(AudioUnitPropertyID inID,
114  AudioUnitScope inScope,
115  AudioUnitElement inElement,
116  void* outData);
117 
118  virtual bool SupportsTail()
119  {
120  return false;
121  }
122 
123  virtual OSStatus Version()
124  {
125  return kPlugtasticAUEffectVersion;
126  }
127 
128 
129  // MIDI
130  virtual OSStatus HandleMidiEvent(UInt8 inStatus, UInt8 inChannel, UInt8 inData1, UInt8 inData2, long inStartFrame);
131  virtual ComponentResult StartNote(MusicDeviceInstrumentID inInstrument, MusicDeviceGroupID inGroupID, NoteInstanceID &outNoteInstanceID, UInt32 inOffsetSampleFrame, const MusicDeviceNoteParams &inParams);
132  virtual ComponentResult StopNote(MusicDeviceGroupID inGroupID, NoteInstanceID inNoteInstanceID, UInt32 inOffsetSampleFrame);
133 
134 
135 
136 #pragma mark -
137 #pragma mark audio
138 
139 // struct PlugtasticScheduledProcessParams {
140 // ScheduledProcessParams au; // official AU way of doing this
141 // AudioBufferList* sidechainInputBufferList; // our extension of the struct to pass sidechains
142 // AudioBufferList* sidechainOutputBufferList;
143 // };
144 
145 
146  // Our own custom prototype signature so we can do sidechains
147  OSStatus ProcessBufferLists(AudioUnitRenderActionFlags& ioActionFlags,
148  const AudioBufferList& inBufferList,
149  AudioBufferList& outBufferList,
150  UInt32 nFrames,
151  const AudioBufferList* inSidechainBufferList,
152  AudioBufferList* outSidechainBufferList);
153 
154  // Standard AU Override
155  virtual OSStatus ProcessBufferLists(AudioUnitRenderActionFlags& iFlags,
156  const AudioBufferList& inBufferList,
157  AudioBufferList& outBufferList,
158  UInt32 iFrames);
159 
160  virtual OSStatus ProcessScheduledSlice(void* inUserData,
161  UInt32 inStartFrameInBuffer,
162  UInt32 inSliceFramesToProcess,
163  UInt32 inTotalBufferFrames );
164 
165  virtual OSStatus Render(AudioUnitRenderActionFlags& ioActionFlags,
166  const AudioTimeStamp& inTimeStamp,
167  UInt32 nFrames);
168 };
169 
170 
171 #endif // #ifndef __PlugtasticAUInstrument_h__
172