00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "ChromaScale.h"
00011
00012 using std::ostringstream;
00013 using namespace Marsyas;
00014
00015 ChromaScale::ChromaScale(mrs_string name): MarSystem("ChromaScale", name)
00016 {
00017 addControls();
00018 }
00019
00020 ChromaScale::ChromaScale(const ChromaScale& a): MarSystem(a)
00021 {
00022 }
00023
00024 ChromaScale::~ChromaScale()
00025 {
00026 }
00027
00028 MarSystem*
00029 ChromaScale::clone() const
00030 {
00031 return new ChromaScale(*this);
00032 }
00033
00034 void ChromaScale::addControls()
00035 {
00036 }
00037
00038 void ChromaScale::myUpdate(MarControlPtr sender)
00039 {
00040 (void) sender;
00041 ctrl_onObservations_->setValue(6, NOUPDATE);
00042 ctrl_onSamples_->setValue(inSamples_, NOUPDATE);
00043 ctrl_osrate_->setValue(israte_, NOUPDATE);
00044 ostringstream oss;
00045
00046 for(mrs_natural o=0; o<ctrl_onObservations_->to<mrs_natural>(); o++){
00047 oss << "ChromaScale_" << o << ",";
00048 }
00049 ctrl_onObsNames_->setValue(oss.str(), NOUPDATE);
00050 }
00051
00052 void
00053 ChromaScale::myProcess(realvec& in, realvec& out)
00054 {
00055 mrs_natural i, j, k, tmp;
00056 mrs_real s, s12;
00057
00058 if(inSamples_ > 0){
00059 for(i=0; i<inSamples_; ++i){
00060 for(j=0; j<6; j++){
00061 out(j,i) = 0.0;
00062 }
00063 s = 0.0;
00064 for(k=0; k<inObservations_; k++){
00065 s += in(k,i);
00066 }
00067 s12 = s/12.0;
00068 if(s > 0){
00069 for(j=0; j<6; j++){
00070 for(k=0; k<inObservations_; k++){
00071 tmp = k+j+1;
00072 if(tmp >= inObservations_){
00073 tmp -= inObservations_;
00074 }
00075 out(j,i) += (s12-in(k,i))*(s12-in(tmp,i));
00076 }
00077 out(j,i) /= s*s;
00078 }
00079 }
00080 }
00081 }
00082 }