41 #ifndef __SynthNoteList__
42 #define __SynthNoteList__
44 #include "SynthNote.h"
50 #define SANITY_CHECK 0
57 SynthNoteList() : mState(0xFFFFFFFF), mHead(0), mTail(0) {}
59 bool NotEmpty()
const {
return mHead != NULL; }
60 bool IsEmpty()
const {
return mHead == NULL; }
68 UInt32 Length()
const {
73 for (SynthNote* note = mHead; note; note = note->mNext)
78 void AddNote(SynthNote *inNote)
81 printf(
"AddNote %d %08X\n", mState, inNote);
86 inNote->mState = mState;
87 inNote->mNext = mHead;
90 if (mHead) { mHead->mPrev = inNote; mHead = inNote; }
91 else mHead = mTail = inNote;
97 void RemoveNote(SynthNote *inNote)
100 printf(
"RemoveNote\n");
105 if (inNote->mPrev) inNote->mPrev->mNext = inNote->mNext;
106 else mHead = inNote->mNext;
108 if (inNote->mNext) inNote->mNext->mPrev = inNote->mPrev;
109 else mTail = inNote->mPrev;
118 void TransferAllFrom(SynthNoteList *inNoteList, UInt32 inFrame)
121 printf(
"TransferAllFrom\n");
125 inNoteList->SanityCheck();
127 if (!inNoteList->mTail)
return;
129 if (mState == kNoteState_Released)
131 for (SynthNote* note = inNoteList->mHead; note; note = note->mNext)
134 printf(
"TransferAllFrom release %08X\n", note);
136 note->mState = mState;
137 note->Release(inFrame);
142 for (SynthNote* note = inNoteList->mHead; note; note = note->mNext)
144 note->mState = mState;
148 inNoteList->mTail->mNext = mHead;
150 if (mHead) mHead->mPrev = inNoteList->mTail;
151 else mTail = inNoteList->mTail;
153 mHead = inNoteList->mHead;
155 inNoteList->mHead = NULL;
156 inNoteList->mTail = NULL;
159 inNoteList->SanityCheck();
163 SynthNote* FindOldestNote()
166 printf(
"FindOldestNote\n");
171 SInt64 minStartFrame = -1;
172 SynthNote* oldestNote = NULL;
173 for (SynthNote* note = mHead; note; note = note->mNext)
175 if (note->mAbsoluteStartFrame < minStartFrame)
178 minStartFrame = note->mAbsoluteStartFrame;
184 SynthNote* FindMostQuietNote()
187 printf(
"FindMostQuietNote\n");
189 Float32 minAmplitude = 1e9;
190 SInt64 minStartFrame = -1;
191 SynthNote* mostQuietNote = NULL;
192 for (SynthNote* note = mHead; note; note = note->mNext)
194 Float32 amp = note->Amplitude();
196 printf(
" amp %g minAmplitude %g\n", amp, minAmplitude);
198 if (amp < minAmplitude)
200 mostQuietNote = note;
202 minStartFrame = note->mAbsoluteStartFrame;
204 else if (amp == minAmplitude && note->mAbsoluteStartFrame < minStartFrame)
207 mostQuietNote = note;
208 minStartFrame = note->mAbsoluteStartFrame;
214 return mostQuietNote;
217 void SanityCheck()
const;