41 #ifndef __SynthElement__
42 #define __SynthElement__
44 #include <Carbon/Carbon.h>
45 #include <AudioUnit/AudioUnit.h>
46 #include "MusicDeviceBase.h"
47 #include "SynthNoteList.h"
50 class AUInstrumentBase;
52 class SynthElement :
public AUElement
55 SynthElement(AUInstrumentBase *audioUnit, UInt32 inElement);
56 virtual ~SynthElement();
58 UInt32 GetIndex()
const {
return mIndex; }
60 AUInstrumentBase* GetAUInstrument() {
return (AUInstrumentBase*)GetAudioUnit(); }
62 CFStringRef GetName()
const {
return mName; }
63 void SetName(CFStringRef inName)
65 CFStringRef oldName = mName;
68 if (oldName) CFRelease(oldName);
78 kMidiController_BankSelect = 0,
79 kMidiController_ModWheel = 1,
80 kMidiController_Breath = 2,
81 kMidiController_Foot = 4,
82 kMidiController_PortamentoTime = 5,
83 kMidiController_DataEntry = 6,
84 kMidiController_Volume = 7,
85 kMidiController_Balance = 8,
86 kMidiController_Pan = 10,
87 kMidiController_Expression = 11,
90 kMidiController_Sustain = 64,
91 kMidiController_Portamento = 65,
92 kMidiController_Sostenuto = 66,
93 kMidiController_Soft = 67,
94 kMidiController_LegatoPedal = 68,
95 kMidiController_Hold2Pedal = 69,
96 kMidiController_FilterResonance = 71,
97 kMidiController_ReleaseTime = 72,
98 kMidiController_AttackTime = 73,
99 kMidiController_Brightness = 74,
100 kMidiController_DecayTime = 75,
101 kMidiController_VibratoRate = 76,
102 kMidiController_VibratoDepth = 77,
103 kMidiController_VibratoDelay = 78,
106 kMidiController_ReverbLevel = 91,
107 kMidiController_ChorusLevel = 93,
109 kMidiController_AllSoundOff = 120,
110 kMidiController_ResetAllControllers = 121,
111 kMidiController_AllNotesOff = 123
119 UInt8 mControls[128];
120 UInt8 mPolyPressure[128];
122 UInt8 mProgramChange;
126 UInt16 mActiveRPValue;
127 UInt16 mActiveNRPValue;
129 UInt16 mPitchBendDepth;
130 float mFPitchBendDepth;
133 SInt16 GetHiResControl(UInt32 inIndex)
const
135 return ((mControls[inIndex] & 127) << 7) | (mControls[inIndex + 32] & 127);
138 void SetHiResControl(UInt32 inIndex, UInt8 inMSB, UInt8 inLSB)
140 mControls[inIndex] = inMSB;
141 mControls[inIndex + 32] = inLSB;
144 float GetControl(UInt32 inIndex)
const
147 return (
float)mControls[inIndex] + (float)mControls[inIndex + 32] / 127.;
149 return (
float)mControls[inIndex];
153 float PitchBend()
const {
return mFPitchBend * mFPitchBendDepth; }
158 class SynthGroupElement :
public SynthElement
162 kUnassignedGroup = 0xFFFFFFFF
165 SynthGroupElement(AUInstrumentBase *audioUnit, UInt32 inElement);
167 void NoteOff(NoteInstanceID inNoteID, UInt32 inFrame);
168 void SustainOn(UInt32 inFrame);
169 void SustainOff(UInt32 inFrame);
170 void SostenutoOn(UInt32 inFrame);
171 void SostenutoOff(UInt32 inFrame);
173 void NoteEnded(SynthNote *inNote, UInt32 inFrame);
175 void AllNotesOff(UInt32 inFrame);
176 void AllSoundOff(UInt32 inFrame);
177 void ResetAllControllers(UInt32 inFrame);
179 UInt32 GetOutputBus()
const {
return mOutputBus; }
180 void SetOutputBus(UInt32 inBus) { mOutputBus = inBus; }
184 virtual OSStatus Render(UInt32 inNumberFrames);
186 float GetControl(UInt32 inIndex)
const {
return mMidiControls.GetControl(inIndex); }
187 float PitchBend()
const {
return mMidiControls.PitchBend(); }
189 MusicDeviceGroupID GroupID ()
const {
return mGroupID; }
190 void SetGroupID (MusicDeviceGroupID inGroup);
193 friend class AUInstrumentBase;
194 friend class AUMonotimbralInstrumentBase;
195 friend class AUMultitimbralInstrumentBase;
197 MidiControls mMidiControls;
202 MusicDeviceGroupID mGroupID;
205 SynthNoteList mNoteList[kNumberOfSoundingNoteStates];
219 const UInt32 kUnlimitedPolyphony = 0xFFFFFFFF;
221 class SynthPartElement :
public SynthElement
224 SynthPartElement(AUInstrumentBase *audioUnit, UInt32 inElement);
226 UInt32 GetGroupIndex()
const {
return mGroupIndex; }
227 bool InRange(Float32 inNote, Float32 inVelocity);
229 UInt32 GetMaxPolyphony()
const {
return mMaxPolyphony; }
230 void SetMaxPolyphony(UInt32 inMaxPolyphony) { mMaxPolyphony = inMaxPolyphony; }
235 UInt32 mMaxPolyphony;
236 SynthKeyZone mKeyZone;
240 inline AUInstrumentBase* SynthNote::GetAudioUnit()
const
242 return (AUInstrumentBase*)mGroup->GetAudioUnit();
245 inline Float32 SynthNote::GetGlobalParameter(AudioUnitParameterID inParamID)
const
247 return mGroup->GetAudioUnit()->Globals()->GetParameter(inParamID);
250 inline void SynthNote::NoteEnded(UInt32 inFrame)
252 mGroup->NoteEnded(
this, inFrame);
253 mNoteID = 0xFFFFFFFF;
256 inline float SynthNote::PitchBend()
const
258 return mGroup->PitchBend();