00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "MidiInput.h"
00021
00022 #ifdef MARSYAS_MIDIIO
00023 #include "RtMidi.h"
00024 #endif
00025
00026
00027 using std::ostringstream;
00028 using namespace Marsyas;
00029
00030 MidiInput::MidiInput(mrs_string name):MarSystem("MidiInput",name)
00031 {
00032 initMidi = false;
00033 #ifdef MARSYAS_MIDIIO
00034 midiin = NULL;
00035 #endif
00036 addControls();
00037 }
00038
00039 MidiInput::MidiInput(const MidiInput& a): MarSystem(a)
00040 {
00041 ctrl_byte1_ = getctrl("mrs_natural/byte1");
00042 ctrl_byte2_ = getctrl("mrs_natural/byte2");
00043 ctrl_byte3_ = getctrl("mrs_natural/byte3");
00044 }
00045
00046 MidiInput::~MidiInput()
00047 {
00048 #ifdef MARSYAS_MIDIIO
00049 delete midiin;
00050 #endif
00051 }
00052
00053 MarSystem* MidiInput::clone() const
00054 {
00055 return new MidiInput(*this);
00056 }
00057
00058 void MidiInput::addControls()
00059 {
00060 addctrl("mrs_natural/port", 0);
00061 addctrl("mrs_bool/virtualPort", false);
00062 addctrl("mrs_bool/initmidi", false);
00063 setctrlState("mrs_bool/initmidi", true);
00064 addctrl("mrs_natural/byte1", 0, ctrl_byte1_);
00065 addctrl("mrs_natural/byte2", 0, ctrl_byte2_);
00066 addctrl("mrs_natural/byte3", 0, ctrl_byte3_);
00067 }
00068
00069 void MidiInput::myUpdate(MarControlPtr sender)
00070 {
00071 MRSDIAG("MidiInput.cpp - MidiInput:myUpdate");
00072 MarSystem::myUpdate(sender);
00073
00074 #ifdef MARSYAS_MIDIIO
00075 midiin = NULL;
00076
00077 initMidi= getctrl("mrs_bool/initmidi")->to<mrs_bool>();
00078 initMidi = !initMidi;
00079
00080 virtualPort = getctrl("mrs_bool/virtualPort")->to<mrs_bool>();
00081
00082 if (!initMidi){
00083 try {
00084 midiin = new RtMidiIn();
00085 }
00086 catch (RtError3 &error) {
00087 error.printMessage();
00088 return;
00089 }
00090 midiin->setCallback(&MidiInput::mycallback, this);
00091 midiin->ignoreTypes(false, false, false);
00092 setctrl("mrs_bool/initmidi", false);
00093
00094 if (virtualPort)
00095 {
00096 try {
00097 midiin->openVirtualPort("MarsyasInput");
00098 }
00099 catch (RtError3 &error)
00100 {
00101 error.printMessage();
00102 return;
00103 }
00104 }
00105 else
00106 {
00107 try {
00108 midiin->openPort(getctrl("mrs_natural/port")->to<mrs_natural>());
00109 }
00110 catch (RtError3 &error)
00111 {
00112 error.printMessage();
00113 return;
00114 }
00115 }
00116 }
00117
00118 #endif
00119 }
00120
00121 void MidiInput::mycallback(double deltatime, std::vector< unsigned char > * message, void *userData)
00122 {
00123
00124 (void) deltatime;
00125 int nBytes = 0;
00126 nBytes = message->size();
00127
00128 MidiInput* mythis = (MidiInput*) userData;
00129
00130 if (nBytes > 0)
00131 {
00132 if (nBytes > 2)
00133 {
00134 mythis->byte3 = message->at(2);
00135 mythis->byte2 = message->at(1);
00136 mythis->byte1 = message->at(0);
00137 }
00138
00139 }
00140 }
00141
00142 void MidiInput::myProcess(realvec& in, realvec& out)
00143 {
00144 mrs_natural t,o;
00145
00146 for (o=0; o < inObservations_; o++)
00147 for (t = 0; t < inSamples_; t++)
00148 {
00149 out(o,t) = in(o,t);
00150 }
00151 ctrl_byte1_->setValue((mrs_natural)byte1, NOUPDATE);
00152 ctrl_byte2_->setValue((mrs_natural)byte2, NOUPDATE);
00153 ctrl_byte3_->setValue((mrs_natural)byte3, NOUPDATE);
00154
00155 }