예제 #1
0
파일: midiGain.cpp 프로젝트: Amcut/pizmidi
//DONT MODIFY THIS METHOD!!!!
//it sends all midi events to the host from the internal vector
void MidiGain::postProcess ()
{
    if (_midiEventsOut[0].size() < MAX_EVENTS_PER_TIMESLICE) 
	{
        _vstEventsToHost->numEvents = (VstInt32)(_midiEventsOut[0].size());
        for (unsigned int i=0;i<_midiEventsOut[0].size();i++) 
		{
            _vstMidiEventsToHost[i].type            = kVstMidiType;
            _vstMidiEventsToHost[i].byteSize        = 24;
            _vstMidiEventsToHost[i].deltaFrames     = _midiEventsOut[0][i].deltaFrames;
            _vstMidiEventsToHost[i].flags           = 0;
            _vstMidiEventsToHost[i].noteLength      = 0;
            _vstMidiEventsToHost[i].noteOffset      = 0;
            _vstMidiEventsToHost[i].midiData[0]     = _midiEventsOut[0][i].midiData[0];
            _vstMidiEventsToHost[i].midiData[1]     = _midiEventsOut[0][i].midiData[1];
            _vstMidiEventsToHost[i].midiData[2]     = _midiEventsOut[0][i].midiData[2];
            _vstMidiEventsToHost[i].midiData[3]     = 0;
            _vstMidiEventsToHost[i].detune          = _midiEventsOut[0][i].detune;

            _vstEventsToHost->events[i] = (VstEvent*) &_vstMidiEventsToHost[i];
        }
        _vstEventsToHost->reserved  = 0;
        if (_midiEventsOut[0].size() > 0) 
			sendVstEventsToHost((VstEvents*)_vstEventsToHost);
    }
    else 
	{
        VstInt32 left = (VstInt32)_midiEventsOut[0].size();
        VstInt32 count = 0;
        while(left>0) 
		{
            if (left>MAX_EVENTS_PER_TIMESLICE) _vstEventsToHost->numEvents = MAX_EVENTS_PER_TIMESLICE;
            else _vstEventsToHost->numEvents = left;
            for (int i=0;i<_vstEventsToHost->numEvents;i++) 
			{
                VstInt32 j = i+count;
                _vstMidiEventsToHost[i].type            = kVstMidiType;
                _vstMidiEventsToHost[i].byteSize        = 24;
                _vstMidiEventsToHost[i].deltaFrames     = _midiEventsOut[0][j].deltaFrames;
                _vstMidiEventsToHost[i].flags           = 0;
                _vstMidiEventsToHost[i].noteLength      = 0;
                _vstMidiEventsToHost[i].noteOffset      = 0;
                _vstMidiEventsToHost[i].midiData[0]     = _midiEventsOut[0][j].midiData[0];
                _vstMidiEventsToHost[i].midiData[1]     = _midiEventsOut[0][j].midiData[1];
                _vstMidiEventsToHost[i].midiData[2]     = _midiEventsOut[0][j].midiData[2];
                _vstMidiEventsToHost[i].midiData[3]     = 0;
                _vstMidiEventsToHost[i].detune          = _midiEventsOut[0][j].detune;

                _vstEventsToHost->events[i] = (VstEvent*) &_vstMidiEventsToHost[i];
            }
            _vstEventsToHost->reserved  = 0;
            sendVstEventsToHost((VstEvents*)_vstEventsToHost);
            left -= _vstEventsToHost->numEvents;
            count += _vstEventsToHost->numEvents;
        }
    }

    //flushing Midi Input Buffers before they are filled
    _cleanMidiInBuffers();
}
예제 #2
0
//----------------------------------------------------------------------------
void AmplitudeImposer::MIDI_PitchBend(int ch, int x1, int x2, int delta)
{
	MIDIEvent[0]->midiData[0] = 0xE0 + ch;
	MIDIEvent[0]->midiData[1] = x1;
	MIDIEvent[0]->midiData[2] = x2;
	MIDIEvent[0]->deltaFrames = delta;
	sendVstEventsToHost(Events);
}
예제 #3
0
//----------------------------------------------------------------------------
void AmplitudeImposer::MIDI_ChannelAftertouch(int ch, int val, int delta)
{
	MIDIEvent[0]->midiData[0] = 0xD0 + ch;
	MIDIEvent[0]->midiData[1] = val;
	MIDIEvent[0]->midiData[2] = 0;
	MIDIEvent[0]->deltaFrames = delta;
	sendVstEventsToHost(Events);
}
예제 #4
0
//----------------------------------------------------------------------------
void AmplitudeImposer::MIDI_PolyAftertouch(int ch, int note, int val, int delta)
{
	MIDIEvent[0]->midiData[0] = 0xA0 + ch;
	MIDIEvent[0]->midiData[1] = note;
	MIDIEvent[0]->midiData[2] = val;
	MIDIEvent[0]->deltaFrames = delta;
	sendVstEventsToHost(Events);
}
예제 #5
0
//----------------------------------------------------------------------------
//You don't have to do this, but I like to...
//----------------------------------------------------------------------------
void AmplitudeImposer::MIDI_ProgramChange(int ch, int val, int delta)
{
	if(val < kNumPrograms)
		setProgram(val);

	MIDIEvent[0]->midiData[0] = 0xD0 + ch;
	MIDIEvent[0]->midiData[1] = val;
	MIDIEvent[0]->midiData[2] = 0;
	MIDIEvent[0]->deltaFrames = delta;
	sendVstEventsToHost(Events);
}
예제 #6
0
//----------------------------------------------------------------------------
void AmplitudeImposer::MIDI_CC(int ch, int num, int val, int delta)
{
	float temp;

	temp = val/127.0f;	// CC data

	MIDIEvent[0]->midiData[0] = 0xB0 + ch;
	MIDIEvent[0]->midiData[1] = num;
	MIDIEvent[0]->midiData[2] = val;
	MIDIEvent[0]->deltaFrames = delta;
	sendVstEventsToHost(Events);
}
예제 #7
0
//-----------------------------------------------------------------------------------------
void Voice2MidiPlugin::processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames)
{
    float* in1  =  inputs[0];
    float* in2  =  inputs[1];
    float* out1 = outputs[0];
    float* out2 = outputs[1];

   
	float freq;
	int note,velocity;

	int velocity2 = 100;

	updateNoteQueue();
	if(voice2midi(this->sampleRate,sampleFrames,in1,&freq,&velocity))
		noteQueue[0] = freq2note(freq,fKey,fScale,fTest*2 - 1);
	else
		noteQueue[0] = -1;

	//note = noteQueue[0];
	
	note = voteForNote();
	
	if(note!=-1)
	{
		
		if(previousNote==note)
		{
			VstEvents evs;
			evs.numEvents=0;
			
			VstMidiEvent ev1;
			if(setMIDIEvent(AFTER_TOUCH,0x07,velocity,&ev1))
				evs.events[evs.numEvents++]=(VstEvent*)&ev1;

			if(evs.numEvents>0)sendVstEventsToHost(&evs);

		}
		else
		{
			VstEvents evs;
			evs.numEvents=0;

			VstMidiEvent ev1;
			if(setMIDIEvent(NOTE_OFF,previousNote,velocity2,&ev1))
			{
				evs.events[evs.numEvents++]=(VstEvent*)&ev1;

				
			}
			//turn off the previous note

			
			
			/*VstMidiEvent ev3;
			if(setMIDIEvent(AFTER_TOUCH,0x07,velocity,&ev3))
			{
				ev3.deltaFrames=1;
				evs.events[evs.numEvents++]=(VstEvent*)&ev3;
			}*/



			VstMidiEvent ev2;
			if(setMIDIEvent(NOTE_ON,note,velocity2,&ev2))
			{
				ev2.deltaFrames=1;
				evs.events[evs.numEvents++]=(VstEvent*)&ev2;

			}
			//turn on the newly recognized note



			
			if(evs.numEvents>0)sendVstEventsToHost(&evs);

			fNote=((float)note)/(HIGHEST_NOTE-LOWEST_NOTE-1);
			setParameter(kNote,fNote);
			//change the display in the panel

		}


	}
	else
	{

		VstEvents evs;
		evs.numEvents=0;
		
		VstMidiEvent ev1;
		if(setMIDIEvent(NOTE_OFF,previousNote,velocity2,&ev1))
		{
			evs.events[evs.numEvents++]=(VstEvent*)&ev1;

			fNote=((float)note)/(HIGHEST_NOTE-LOWEST_NOTE-1);
			setParameter(kNote,fNote);
			//change the display in the panel

		}
		//if the previous note is not silence, turn it off

		if(evs.numEvents>0)sendVstEventsToHost(&evs);

	}

	previousNote = note;


	while (--sampleFrames >= 0)
    {
        (*out1++) = 0;
        (*out2++) = 0;
    }

}