1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
|
/**
bespoke synth, a software modular synthesizer
Copyright (C) 2021 Ryan Challinor (contact: awwbees@gmail.com)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
**/
/*
==============================================================================
INoteReceiver.cpp
Created: 17 May 2020 10:59:27pm
Author: Ryan Challinor
==============================================================================
*/
#include "INoteReceiver.h"
#include "Profiler.h"
NoteInputBuffer::NoteInputBuffer(INoteReceiver* receiver)
: mReceiver(receiver)
{
for (int i = 0; i < kBufferSize; ++i)
mBuffer[i].time = -1;
}
void NoteInputBuffer::Process(double time)
{
PROFILER(NoteInputBuffer);
//process note offs first
for (int i = 0; i < kBufferSize; ++i)
{
if (mBuffer[i].time != -1 && mBuffer[i].velocity == 0 &&
IsTimeWithinFrame(mBuffer[i].time))
{
NoteInputElement& element = mBuffer[i];
mReceiver->PlayNote(element.time, element.pitch, element.velocity, element.voiceIdx, element.modulation);
mBuffer[i].time = -1;
}
}
//now process note ons
for (int i = 0; i < kBufferSize; ++i)
{
if (mBuffer[i].time != -1 && mBuffer[i].velocity != 0 &&
IsTimeWithinFrame(mBuffer[i].time))
{
NoteInputElement& element = mBuffer[i];
mReceiver->PlayNote(element.time, element.pitch, element.velocity, element.voiceIdx, element.modulation);
mBuffer[i].time = -1;
}
}
}
void NoteInputBuffer::QueueNote(double time, int pitch, float velocity, int voiceIdx, ModulationParameters modulation)
{
for (int i = 0; i < kBufferSize; ++i)
{
if (mBuffer[i].time == -1)
{
mBuffer[i].time = time;
NoteInputElement& element = mBuffer[i];
element.pitch = pitch;
element.velocity = velocity;
element.voiceIdx = voiceIdx;
element.modulation = modulation;
break;
}
}
}
//static
bool NoteInputBuffer::IsTimeWithinFrame(double time)
{
return time <= NextBufferTime(false);
}
|