2018-03-10 00:01:21 +01:00

159 lines
4.5 KiB
C++

#ifndef __Go4kVSTi__
#include "Go4kVSTi.h"
#include "Go4kVSTiCore.h"
#include "stdio.h"
#endif
#include "math.h"
//-----------------------------------------------------------------------------------------
void Go4kVSTi::setSampleRate (float sampleRate)
{
AudioEffectX::setSampleRate (sampleRate);
}
//-----------------------------------------------------------------------------------------
void Go4kVSTi::setBlockSize (long blockSize)
{
AudioEffectX::setBlockSize (blockSize);
// you may need to have to do something here...
}
//-----------------------------------------------------------------------------------------
void Go4kVSTi::suspend ()
{
m_currentEvents.clear();
}
//-----------------------------------------------------------------------------------------
void Go4kVSTi::resume ()
{
wantEvents ();
}
//-----------------------------------------------------------------------------------------
void Go4kVSTi::initProcess ()
{
}
//-----------------------------------------------------------------------------------------
void Go4kVSTi::process (float **inputs, float **outputs, long sampleFrames)
{
processAnyhow(inputs, outputs, sampleFrames);
}
//-----------------------------------------------------------------------------------------
void Go4kVSTi::processReplacing (float **inputs, float **outputs, long sampleFrames)
{
processAnyhow(inputs, outputs, sampleFrames);
}
void Go4kVSTi::processAnyhow(float **inputs, float **outputs, long sampleFrames)
{
float* outl = outputs[0];
float* outr = outputs[1];
static int bpmCheck = 0;
if ( bpmCheck <= 0 )
{
VstTimeInfo* myTime = getTimeInfo ( kVstTempoValid );
Go4kVSTi_SetBPM(myTime->tempo);
bpmCheck = 20; // only check every 20th call of this function (bpm shouldnt change that often)
}
bpmCheck--;
int start = 0;
// midi events will occur this frame, so render partially
if (m_currentEvents.size() > 0)
{
// for all events
for (unsigned int i = 0; i < m_currentEvents.size(); i++)
{
// process samples until next event
int todo = m_currentEvents[i]->deltaFrames - start;
Go4kVSTi_Tick(outl+start, outr+start, todo);
start = m_currentEvents[i]->deltaFrames;
// apply changes due to event
ApplyEvent(m_currentEvents[i]);
}
}
Go4kVSTi_Tick(outl+start, outr+start, sampleFrames - start);
// clear event list (old event pointer wont be valid next frame anyway)
m_currentEvents.clear();
}
//-----------------------------------------------------------------------------------------
long Go4kVSTi::processEvents(VstEvents* ev)
{
for (long i = 0; i < ev->numEvents; i++)
{
if ((ev->events[i])->type != kVstMidiType)
continue;
VstMidiEvent* event = (VstMidiEvent*)ev->events[i];
m_currentEvents.push_back(event);
}
return 1; // want more
}
//-----------------------------------------------------------------------------------------
void Go4kVSTi::ApplyEvent(VstMidiEvent *event)
{
char* midiData = event->midiData;
byte status = midiData[0] & 0xf0; // status
byte channel = midiData[0] & 0x0f; // channel
// note on/off events
if (status == 0x90 || status == 0x80)
{
byte note = midiData[1] & 0x7f;
byte velocity = midiData[2] & 0x7f;
if (status == 0x80)
velocity = 0;
// note off
if (!velocity)
{
Go4kVSTi_StopVoice(channel, note);
}
// note on
else
{
Go4kVSTi_AddVoice(channel, note);
}
}
/* // polyphonic aftertouch
else if (status == 0xA)
{
byte note = midiData[1] & 0x7f;
byte pressure = midiData[2] & 0x7f;
Go4kVSTi_PolyAftertouch(channel, note, pressure);
}
// channel aftertouch
else if (status == 0xD)
{
byte pressure = midiData[1] & 0x7f;
Go4kVSTi_ChannelAftertouch(channel, pressure);
}
// Controller Change
else if (status == 0xB0)
{
byte number = midiData[1] & 0x7f;
byte value = midiData[2] & 0x7f;
// Go4kVSTi_ControllerChange(channel, number, value, event->deltaFrames);
}
// Pitch Bend
else if (status == 0xE0)
{
byte lsb = midiData[1] & 0x7f;
byte msb = midiData[2] & 0x7f;
int value = (((int)(msb)) << 7) + lsb;
// Go4kVSTi_PitchBend(channel, value); // 0 - 16383, center 8192
// dont use full precision for the sake of equally sized streams
// Go4kVSTi_PitchBend(channel, value >> 7, event->deltaFrames); // 0 - 127, center 64
}*/
// all notes off (dont seem to come anyway
else if (status == 0xb0 && midiData[1] == 0x7e) // all notes off
{
Go4kVSTi_StopVoice(channel, 0);
}
}