1 /*
2 Copyright (C) 2016 Apple Inc. All Rights Reserved.
3 See LICENSE.txt for this sample’s licensing information
4 
5 Abstract:
6 Part of Core Audio AUInstrument Base Classes
7 */
8 
9 #include "SynthNote.h"
10 #include "SynthElement.h"
11 #include "AUInstrumentBase.h"
12 
AttackNote(SynthPartElement * inPart,SynthGroupElement * inGroup,NoteInstanceID inNoteID,UInt64 inAbsoluteSampleFrame,UInt32 inOffsetSampleFrame,const MusicDeviceNoteParams & inParams)13 bool SynthNote::AttackNote(
14 			SynthPartElement *				inPart,
15 			SynthGroupElement *				inGroup,
16 			NoteInstanceID					inNoteID,
17 			UInt64							inAbsoluteSampleFrame,
18 			UInt32							inOffsetSampleFrame,
19 			const MusicDeviceNoteParams		&inParams)
20 {
21 #if DEBUG_PRINT
22 	printf("SynthNote::AttackNote %lu %lu abs frame %llu rel frame %lu\n", (UInt32)inGroup->GroupID(), (UInt32)inNoteID, inAbsoluteSampleFrame, inOffsetSampleFrame);
23 #endif
24 	mPart = inPart;
25 	mGroup = inGroup;
26 	mNoteID = inNoteID;
27 
28 	mAbsoluteStartFrame = inAbsoluteSampleFrame;
29 	mRelativeStartFrame = inOffsetSampleFrame;
30 	mRelativeReleaseFrame = -1;
31 	mRelativeKillFrame = -1;
32 
33 	mPitch = inParams.mPitch;
34 	mVelocity = inParams.mVelocity;
35 
36 
37 	return Attack(inParams);
38 }
39 
40 
Reset()41 void SynthNote::Reset()
42 {
43 	mPart = 0;
44 	mGroup = 0;
45 	mAbsoluteStartFrame = 0;
46 	mRelativeStartFrame = 0;
47 	mRelativeReleaseFrame = -1;
48 	mRelativeKillFrame = -1;
49 }
50 
Kill(UInt32 inFrame)51 void SynthNote::Kill(UInt32 inFrame)
52 {
53 	mRelativeKillFrame = inFrame;
54 }
55 
Release(UInt32 inFrame)56 void SynthNote::Release(UInt32 inFrame)
57 {
58 	mRelativeReleaseFrame = inFrame;
59 }
60 
FastRelease(UInt32 inFrame)61 void SynthNote::FastRelease(UInt32 inFrame)
62 {
63 	mRelativeReleaseFrame = inFrame;
64 }
65 
TuningA() const66 double SynthNote::TuningA() const
67 {
68 	return 440.0;
69 }
70 
Frequency()71 double SynthNote::Frequency()
72 {
73 	return TuningA() * pow(2., (mPitch - 69. + GetPitchBend()) / 12.);
74 }
75 
SampleRate()76 double SynthNote::SampleRate()
77 {
78 	return GetAudioUnit()->GetOutput(0)->GetStreamFormat().mSampleRate;
79 }
80 
GetAudioUnit() const81 AUInstrumentBase* SynthNote::GetAudioUnit() const
82 {
83 	return (AUInstrumentBase*)mGroup->GetAudioUnit();
84 }
85 
GetGlobalParameter(AudioUnitParameterID inParamID) const86 Float32 SynthNote::GetGlobalParameter(AudioUnitParameterID inParamID) const
87 {
88 	return mGroup->GetAudioUnit()->Globals()->GetParameter(inParamID);
89 }
90 
NoteEnded(UInt32 inFrame)91 void SynthNote::NoteEnded(UInt32 inFrame)
92 {
93 	mGroup->NoteEnded(this, inFrame);
94 	mNoteID = 0xFFFFFFFF;
95 }
96 
GetPitchBend() const97 float SynthNote::GetPitchBend() const
98 {
99 	return mGroup->GetPitchBend();
100 }
101 
102 
103