00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "RadioDrumInput.h"
00021
00022
00023 #ifdef MARSYAS_MIDIIO
00024 #include "RtMidi.h"
00025 #endif
00026
00027
00028 using namespace std;
00029 using namespace Marsyas;
00030
00031 RadioDrumInput::RadioDrumInput(mrs_string name):MarSystem("RadioDrumInput",name)
00032 {
00033 initMidi = false;
00034 #ifdef MARSYAS_MIDIIO
00035 rdin = NULL;
00036 #endif
00037 addControls();
00038 }
00039
00040 RadioDrumInput::RadioDrumInput(const RadioDrumInput& a): MarSystem(a)
00041 {
00042 rx_ = getctrl("mrs_natural/rightstickx");
00043 ry_ = getctrl("mrs_natural/rightsticky");
00044 rz_ = getctrl("mrs_natural/rightstickz");
00045 lx_ = getctrl("mrs_natural/leftstickx");
00046 ly_ = getctrl("mrs_natural/leftsticky");
00047 lz_ = getctrl("mrs_natural/leftstickz");
00048 }
00049
00050 RadioDrumInput::~RadioDrumInput()
00051 {
00052 #ifdef MARSYAS_MIDIIO
00053 delete rdin;
00054 #endif
00055 }
00056
00057 MarSystem* RadioDrumInput::clone() const
00058 {
00059 return new RadioDrumInput(*this);
00060 }
00061
00062 void RadioDrumInput::addControls()
00063 {
00064 addctrl("mrs_natural/port", 0);
00065 addctrl("mrs_bool/initmidi", false);
00066 setctrlState("mrs_bool/initmidi", true);
00067 addctrl("mrs_natural/rightstickx", 0, rx_);
00068 addctrl("mrs_natural/rightsticky", 0, ry_);
00069 addctrl("mrs_natural/rightstickz", 0, rz_);
00070 addctrl("mrs_natural/leftstickx", 0, lx_);
00071 addctrl("mrs_natural/leftsticky", 0, ly_);
00072 addctrl("mrs_natural/leftstickz", 0, lz_);
00073 }
00074
00075 void RadioDrumInput::myUpdate(MarControlPtr sender)
00076 {
00077 MRSDIAG("RadioDrumInput.cpp - RadioDrumInput:myUpdate");
00078 MarSystem::myUpdate(sender);
00079
00080 #ifdef MARSYAS_MIDIIO
00081 rdin = NULL;
00082
00083 initMidi= getctrl("mrs_bool/initmidi")->to<mrs_bool>();
00084
00085 if (!initMidi){
00086 try {
00087 rdin = new RtMidiIn();
00088 }
00089 catch (RtError3 &error) {
00090 error.printMessage();
00091 return;
00092 }
00093 rdin->setCallback(&RadioDrumInput::mycallback, this);
00094 rdin->ignoreTypes(false, false, false);
00095 setctrl("mrs_bool/initmidi", false);
00096
00097 try {
00098 rdin->openPort(getctrl("mrs_natural/port")->to<mrs_natural>());
00099 }
00100 catch (RtError3 &error)
00101 {
00102 error.printMessage();
00103 return;
00104 }
00105 initMidi = !initMidi;
00106 }
00107 #endif
00108 }
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141 void RadioDrumInput::mycallback(double deltatime, std::vector< unsigned char > * message, void *userData)
00142 {
00143
00144 (void) deltatime;
00145 int nBytes = 0;
00146 nBytes = message->size();
00147
00148 RadioDrumInput* mythis = (RadioDrumInput*) userData;
00149
00150
00151 if (nBytes == 3)
00152 {
00153
00154
00155 if ( message->at(0) == 160){
00156 if(message->at(1) == 8)
00157 mythis->rightstickx = message->at(2);
00158 else if ( message->at(1)==9)
00159 mythis->rightsticky = message->at(2);
00160 else if ( message->at(1)==10)
00161 mythis->rightstickz = message->at(2);
00162 else if ( message->at(1)==11)
00163 mythis->leftstickx = message->at(2);
00164 else if ( message->at(1)==12)
00165 mythis->leftsticky = message->at(2);
00166 else if ( message->at(1)==13)
00167 mythis->leftstickz = message->at(2);
00168 }
00169
00170 }
00171 }
00172
00173 void RadioDrumInput::myProcess(realvec& in, realvec& out)
00174 {
00175 mrs_natural o,t;
00176
00177 for (o=0; o < inObservations_; o++)
00178 for (t = 0; t < inSamples_; t++)
00179 {
00180 out(o,t) = in(o,t);
00181 }
00182
00183 rx_->setValue((mrs_natural)rightstickx, NOUPDATE);
00184 ry_->setValue((mrs_natural)rightsticky, NOUPDATE);
00185 rz_->setValue((mrs_natural)rightstickz, NOUPDATE);
00186 lx_->setValue((mrs_natural)leftstickx, NOUPDATE);
00187 ly_->setValue((mrs_natural)leftsticky, NOUPDATE);
00188 lz_->setValue((mrs_natural)leftstickz, NOUPDATE);
00189
00190 }