From 8f8782f43bd838e825f3792b611d27fffa90399b Mon Sep 17 00:00:00 2001 From: Chris Xiong Date: Thu, 7 Apr 2016 23:39:02 +0800 Subject: Lunatic Princess. --- core/qmpmidimapperrtmidi.cpp | 88 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 core/qmpmidimapperrtmidi.cpp (limited to 'core/qmpmidimapperrtmidi.cpp') diff --git a/core/qmpmidimapperrtmidi.cpp b/core/qmpmidimapperrtmidi.cpp new file mode 100644 index 0000000..adba267 --- /dev/null +++ b/core/qmpmidimapperrtmidi.cpp @@ -0,0 +1,88 @@ +#include +#include +#include +#include "RtMidi.h" +#include "qmpmidimappers.hpp" +RtMidiOut* qmpMidiMapperRtMidi::dummy=NULL; +qmpMidiMapperRtMidi::qmpMidiMapperRtMidi() +{ + dummy=new RtMidiOut(); + memset(ports,0,sizeof(ports)); +} +qmpMidiMapperRtMidi::~qmpMidiMapperRtMidi() +{ + delete dummy;for(int i=0;i<16;++i)if(ports[i])delete ports[i]; +} +int qmpMidiMapperRtMidi::enumDevices() +{ + return dummy->getPortCount(); +} +std::string qmpMidiMapperRtMidi::deviceName(int id) +{ + fprintf(stderr,"port #%d: %s\n",id,dummy->getPortName(id).c_str()); + return dummy->getPortName(id); +} +int qmpMidiMapperRtMidi::deviceInit(int id) +{ + int i=0;for(;ports[i]&&i<16;++i); + if(i==16)return -1; + try + { + ports[i]=new RtMidiOut(); + ports[i]->openPort(id); + } + catch(RtMidiError e) + { + printf("Device initialization failure: %s\n",e.what()); + ports[i]=NULL; + return -1; + } + return i; +} +void qmpMidiMapperRtMidi::deviceDeinit(int iid) +{ + if(ports[iid]){ports[iid]->closePort();delete ports[iid];ports[iid]=NULL;} +} +void qmpMidiMapperRtMidi::noteOn(int iid,int ch,int key,int vel) +{ + if(!ports[iid])return;ch&=0x0F; + std::vectormessage; + message.push_back(0x90|ch); + message.push_back(key); + message.push_back(vel); + ports[iid]->sendMessage(&message); +} +void qmpMidiMapperRtMidi::noteOff(int iid,int ch,int key) +{ + if(!ports[iid])return;ch&=0x0F; + std::vectormessage; + message.push_back(0x80|ch);message.push_back(key);message.push_back(0); + ports[iid]->sendMessage(&message); +} +void qmpMidiMapperRtMidi::ctrlChange(int iid,int ch,int cc,int val) +{ + if(!ports[iid])return;ch&=0x0F; + std::vectormessage; + message.push_back(0xB0|ch);message.push_back(cc);message.push_back(val); + ports[iid]->sendMessage(&message); +} +void qmpMidiMapperRtMidi::progChange(int iid,int ch,int val) +{ + if(!ports[iid])return;ch&=0x0F; + std::vectormessage; + message.push_back(0xC0|ch);message.push_back(val); + ports[iid]->sendMessage(&message); +} +void qmpMidiMapperRtMidi::pitchBend(int iid,int ch,int val) +{ + if(!ports[iid])return;ch&=0x0F; + std::vectormessage; + message.push_back(0xE0|ch);message.push_back(val&0xFF); + message.push_back(val>>8);ports[iid]->sendMessage(&message); +} +void qmpMidiMapperRtMidi::sysEx(int iid,int length,const char *data) +{ + if(!ports[iid])return; + std::vectormessage(data,data+length); + ports[iid]->sendMessage(&message); +} -- cgit v1.2.3