Implemented free filter processing. Note that the envelope manipulation from the GUI is not handled thread safely yet
This commit is contained in:
@ -39,6 +39,12 @@ void ProcessedStretch::set_parameters(ProcessParameters *ppar)
|
||||
pars=*ppar;
|
||||
//update_free_filter();
|
||||
}
|
||||
|
||||
void ProcessedStretch::setFreeFilterEnvelope(shared_envelope env)
|
||||
{
|
||||
m_free_filter_envelope = env;
|
||||
}
|
||||
|
||||
void ProcessedStretch::setBufferSize(int sz)
|
||||
{
|
||||
jassert(sz > 0);
|
||||
@ -125,6 +131,8 @@ void ProcessedStretch::process_spectrum(REALTYPE *freq)
|
||||
spectrum_do_filter(pars,nfreq,samplerate,infreq.data(), freq);
|
||||
if (e.m_index == 7 && e.m_enabled == true)
|
||||
spectrum_do_compressor(pars,nfreq, infreq.data(), freq);
|
||||
if (e.m_index == 8 && e.m_enabled == true)
|
||||
spectrum_do_free_filter(m_free_filter_envelope, nfreq, samplerate, infreq.data(), freq);
|
||||
}
|
||||
|
||||
#ifdef USE_OLD_SPEC_PROC
|
||||
|
@ -21,6 +21,7 @@
|
||||
|
||||
#include "FreeEdit.h"
|
||||
#include "Stretch.h"
|
||||
#include "../jcdp_envelope.h"
|
||||
|
||||
struct ProcessParameters
|
||||
{
|
||||
@ -413,6 +414,25 @@ inline void spectrum_do_filter(const ProcessParameters& pars, int nfreq, double
|
||||
};
|
||||
};
|
||||
|
||||
inline void spectrum_do_free_filter(shared_envelope& env, int nfreq, double samplerate,
|
||||
REALTYPE *freq1, REALTYPE *freq2)
|
||||
{
|
||||
jassert(env != nullptr);
|
||||
for (int i = 0; i<nfreq; i++)
|
||||
{
|
||||
double binhz = (samplerate / 2.0) / nfreq * i;
|
||||
if (binhz >= 30.0)
|
||||
{
|
||||
double norm = jmap<double>(binhz, 0.0, samplerate / 2.0, 0.0, 1.0);
|
||||
double db = jmap<double>(env->GetInterpolatedNodeValue(pow(norm, 0.25)), 0.0, 1.0, -36.0, 12.0);
|
||||
freq2[i] = freq1[i] * Decibels::decibelsToGain(db);
|
||||
}
|
||||
else
|
||||
freq2[i] = freq1[i];
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
class SpectrumProcess
|
||||
{
|
||||
public:
|
||||
@ -430,13 +450,14 @@ public:
|
||||
ProcessedStretch(REALTYPE rap_,int in_bufsize_,FFTWindow w=W_HAMMING,bool bypass_=false,REALTYPE samplerate_=44100.0f,int stereo_mode=0);
|
||||
~ProcessedStretch();
|
||||
void set_parameters(ProcessParameters *ppar);
|
||||
void setFreeFilterEnvelope(shared_envelope env);
|
||||
std::vector<SpectrumProcess> m_spectrum_processes;
|
||||
void setBufferSize(int sz) override;
|
||||
private:
|
||||
REALTYPE get_stretch_multiplier(REALTYPE pos_percents) override;
|
||||
// void process_output(REALTYPE *smps,int nsmps);
|
||||
void process_spectrum(REALTYPE *freq) override;
|
||||
|
||||
shared_envelope m_free_filter_envelope;
|
||||
|
||||
//void copy(const realvector& freq1,realvector& freq2);
|
||||
void copy(REALTYPE* freq1, REALTYPE* freq2);
|
||||
|
@ -80,6 +80,16 @@ std::pair<Range<double>, Range<double>> StretchAudioSource::getFileCachedRangesN
|
||||
return m_inputfile->getCachedRangesNormalized();
|
||||
}
|
||||
|
||||
void StretchAudioSource::setFreeFilterEnvelope(shared_envelope env)
|
||||
{
|
||||
ScopedLock locker(m_cs);
|
||||
m_free_filter_envelope = env;
|
||||
for (int i = 0; i < m_stretchers.size(); ++i)
|
||||
{
|
||||
m_stretchers[i]->setFreeFilterEnvelope(env);
|
||||
}
|
||||
}
|
||||
|
||||
ValueTree StretchAudioSource::getStateTree()
|
||||
{
|
||||
ValueTree tree("stretchsourcestate");
|
||||
@ -456,6 +466,7 @@ void StretchAudioSource::initObjects()
|
||||
m_stretchers[i]->set_onset_detection_sensitivity(onsetsens);
|
||||
m_stretchers[i]->set_parameters(&m_ppar);
|
||||
m_stretchers[i]->set_freezing(m_freezing);
|
||||
m_stretchers[i]->setFreeFilterEnvelope(m_free_filter_envelope);
|
||||
fill_container(m_stretchers[i]->out_buf, 0.0f);
|
||||
m_stretchers[i]->m_spectrum_processes = m_specproc_order;
|
||||
}
|
||||
|
@ -88,6 +88,8 @@ public:
|
||||
int getFFTWindowingType() { return m_fft_window_type; }
|
||||
std::pair<Range<double>,Range<double>> getFileCachedRangesNormalized();
|
||||
|
||||
void setFreeFilterEnvelope(shared_envelope env);
|
||||
|
||||
ValueTree getStateTree();
|
||||
void setStateTree(ValueTree state);
|
||||
void setClippingEnabled(bool b) { m_clip_output = b; }
|
||||
@ -144,6 +146,7 @@ private:
|
||||
int64_t m_output_length = 0;
|
||||
bool m_clip_output = true;
|
||||
void initObjects();
|
||||
shared_envelope m_free_filter_envelope;
|
||||
AudioFormatManager* m_afm = nullptr;
|
||||
struct
|
||||
{
|
||||
|
Reference in New Issue
Block a user