/usr/include/CLAM/SegmentSMSHarmonizer.hxx is in libclam-dev 1.4.0-5build1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | /*
* Copyright (c) 2001-2004 MUSIC TECHNOLOGY GROUP (MTG)
* UNIVERSITAT POMPEU FABRA
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#ifndef _SegmentSMSHarmonizer_
#define _SegmentSMSHarmonizer_
#include "SMSPitchShift.hxx"
#include "SpectrumAdder2.hxx"
#include "FrameTransformation.hxx"
// TODO: this transformation needs to be ported to inherit from FrameTransformation instead of SegmentTransformation
// also, a solution has to be figured out to make the transformation controllable via ports
namespace CLAM{
class SegmentSMSHarmonizer: public FrameTransformation
{
/** This method returns the name of the object
* @return Char pointer with the name of object
*/
const char *GetClassName() const {return "SegmentSMSHarmonizer";}
FloatInControl mIndexCtl;//says what the amount sent as control is modifying
FloatInControl mTransCtl;
/** xamat:adding residual does not improve results much and adds a lot of overhead, there should
* probably be a configuration parameter to control whether we want to add residual or not, but that
* would mean changing the kind of configuration. For the time being the output residual is the input.*/
FloatInControl mIgnoreResidualCtl;
FloatInControl mUpdateBPFCtl;///< "boolean" control used to say that we want to update BPF
public:
void UpdateBPF(TControlData value)
{
CLAM::BPF& bpf= mConfig.GetBPF();
//this should never happen, it should be initialized at configuration time
if(bpf.Size()==0)
{
InitBPF();
}
bpf.SetValue((int)mIndexCtl.GetLastValue(), mTransCtl.GetLastValue());
}
void IgnoreResidual(TControlData value)
{
mPitchShift.mIgnoreResidual.DoControl(value);
}
public:
/** Base constructor of class. Calls Configure method with a SegmentTransformationConfig initialised by default*/
SegmentSMSHarmonizer()
: mIndexCtl("Index", this)
, mTransCtl("Transposition",this)
, mIgnoreResidualCtl("IgnoreResidual",this, &SegmentSMSHarmonizer::IgnoreResidual)
, mUpdateBPFCtl("UpdateBPF", this, &SegmentSMSHarmonizer::UpdateBPF)
{
Configure(FrameTransformationConfig());
mTmpFrame.AddAll();
mTmpFrame.UpdateData();
mTmpFund.AddElem();
}
bool ConcreteConfigure(const ProcessingConfig& c)
{
CopyAsConcreteConfig( mConfig, c );
InitBPF();
mPitchShift.Configure(FrameTransformationConfig());
//By default we ignore residual!!
mIgnoreResidualCtl.DoControl(1.);
return true;
}
/** Destructor of the class*/
~SegmentSMSHarmonizer()
{}
bool Do()
{
CLAM_ASSERT(false, "Do with ports not implemented");
return false;
}
bool Do(const Frame& in, Frame& out);
private:
SMSPitchShift mPitchShift;
SpectrumAdder2 mSpectrumAdder;
void AddFrame(const Frame& in1, const Frame& in2, Frame& out);
void Gain(Frame& inputFrame, TData gain);
Fundamental mTmpFund;
Frame mTmpFrame;
void InitBPF()
{
if (!mConfig.HasBPF())
{
mConfig.AddBPF();
mConfig.UpdateData();
}
if(mConfig.GetBPF().Size()==0)//else we asume that the user has initialized it before
{
BPF& bpf=mConfig.GetBPF();
bpf.Resize(10);
bpf.SetSize(10);
int i;
//we add ten voices with gain going from -30 to +30 but no transposition (note that X controls gain and Y transposition)
for (i=0; i< 10; i++)
{
bpf.SetValue(i,1);
bpf.SetXValue(i,(i-5)*6);
}
}
}
};
};//namespace CLAM
#endif // _SegmentSMSHarmonizer_
|