paulxstretch/Source/PS_Source/ProcessedStretch.h

237 lines
6.0 KiB
C++

/*
Copyright (C) 2011 Nasca Octavian Paul
Author: Nasca Octavian Paul
This program is free software; you can redistribute it and/or modify
it under the terms of version 2 of the GNU General Public License
as published by the Free Software Foundation.
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 (version 2) for more details.
You should have received a copy of the GNU General Public License (version 2)
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#pragma once
#include "FreeEdit.h"
#include "Stretch.h"
struct ProcessParameters
{
ProcessParameters()
{
pitch_shift.enabled=false;
pitch_shift.cents=0;
octave.enabled=false;
octave.om2=octave.om1=octave.o1=octave.o15=octave.o2=0.0f;
octave.o0=1.0f;
freq_shift.enabled=false;
freq_shift.Hz=0;
compressor.enabled=false;
compressor.power=0.0f;
filter.enabled=false;
filter.stop=false;
filter.low=0.0f;
filter.high=22000.0f;
filter.hdamp=0.0f;
harmonics.enabled=false;
harmonics.freq=440.0f;
harmonics.bandwidth=25.0f;
harmonics.nharmonics=10;
harmonics.gauss=false;
spread.enabled=false;
spread.bandwidth=0.3f;
tonal_vs_noise.enabled=false;
tonal_vs_noise.preserve=0.5f;
tonal_vs_noise.bandwidth=0.9f;
};
~ProcessParameters(){
};
struct{
bool enabled;
int cents;
}pitch_shift;
struct{
bool enabled;
REALTYPE om2,om1,o0,o1,o15,o2;
}octave;
struct{
bool enabled;
int Hz;
}freq_shift;
struct{
bool enabled;
REALTYPE power;
}compressor;
struct{
bool enabled;
REALTYPE low,high;
REALTYPE hdamp;
bool stop;
}filter;
struct{
bool enabled;
REALTYPE freq;
REALTYPE bandwidth;
int nharmonics;
bool gauss;
}harmonics;
struct{
bool enabled;
REALTYPE bandwidth;
}spread;
struct{
bool enabled;
REALTYPE preserve;
REALTYPE bandwidth;
}tonal_vs_noise;
//FreeEdit free_filter;
//FreeEdit stretch_multiplier;
/*
auto getMembers() const
{
return std::make_tuple(pitch_shift.enabled,
pitch_shift.cents,
octave.enabled,
octave.o0,
octave.o1,
octave.o15,
octave.o2,
octave.om1,
octave.om2,
spread.enabled,
spread.bandwidth,
tonal_vs_noise.enabled,
tonal_vs_noise.bandwidth,
tonal_vs_noise.preserve,
freq_shift.enabled,
freq_shift.Hz,
compressor.enabled,
compressor.power,
harmonics.bandwidth,
harmonics.enabled,
harmonics.freq,
harmonics.gauss,
harmonics.nharmonics,
filter.enabled,
filter.hdamp,
filter.high,
filter.low,
filter.stop);
}
bool operator == (const ProcessParameters& other) const
{
return getMembers() == other.getMembers();
}
*/
bool operator == (const ProcessParameters& other) const noexcept
{
return pitch_shift.enabled == other.pitch_shift.enabled &&
pitch_shift.cents == other.pitch_shift.cents &&
octave.enabled == other.octave.enabled &&
octave.o0 == other.octave.o0 &&
octave.o1 == other.octave.o1 &&
octave.o15 == other.octave.o15 &&
octave.o2 == other.octave.o2 &&
octave.om1 == other.octave.om1 &&
octave.om2 == other.octave.om2 &&
spread.enabled == other.spread.enabled &&
spread.bandwidth == other.spread.bandwidth &&
tonal_vs_noise.enabled == other.tonal_vs_noise.enabled &&
tonal_vs_noise.bandwidth == other.tonal_vs_noise.bandwidth &&
tonal_vs_noise.preserve == other.tonal_vs_noise.preserve &&
freq_shift.enabled == other.freq_shift.enabled &&
freq_shift.Hz == other.freq_shift.Hz &&
compressor.enabled == other.compressor.enabled &&
compressor.power == other.compressor.power &&
harmonics.bandwidth == other.harmonics.bandwidth &&
harmonics.enabled == other.harmonics.enabled &&
harmonics.freq == other.harmonics.freq &&
harmonics.gauss == other.harmonics.gauss &&
harmonics.nharmonics == other.harmonics.nharmonics &&
filter.enabled == other.filter.enabled &&
filter.hdamp == other.filter.hdamp &&
filter.high == other.filter.high &&
filter.low == other.filter.low &&
filter.stop == other.filter.stop;
}
};
class SpectrumProcess
{
public:
SpectrumProcess() {}
SpectrumProcess(String name, int index) :
m_name(name), m_index(index) {}
String m_name;
int m_index = -1;
private:
};
std::vector<SpectrumProcess> make_spectrum_processes();
class ProcessedStretch final : public Stretch
{
public:
//stereo_mode: 0=mono,1=left,2=right
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);
std::vector<int> 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;
void do_harmonics(REALTYPE *freq1,REALTYPE *freq2);
void do_pitch_shift(REALTYPE *freq1,REALTYPE *freq2,REALTYPE rap);
void do_freq_shift(REALTYPE *freq1,REALTYPE *freq2);
void do_octave(REALTYPE *freq1,REALTYPE *freq2);
void do_filter(REALTYPE *freq1,REALTYPE *freq2);
void do_free_filter(REALTYPE *freq1,REALTYPE *freq2);
void do_compressor(REALTYPE *freq1,REALTYPE *freq2);
void do_spread(REALTYPE *freq1,REALTYPE *freq2);
void do_tonal_vs_noise(REALTYPE *freq1,REALTYPE *freq2);
//void copy(const realvector& freq1,realvector& freq2);
void copy(REALTYPE* freq1, REALTYPE* freq2);
void add(REALTYPE *freq2,REALTYPE *freq1,REALTYPE a=1.0);
void mul(REALTYPE *freq1,REALTYPE a);
void zero(REALTYPE *freq1);
void spread(REALTYPE *freq1,REALTYPE *freq2,REALTYPE spread_bandwidth);
void update_free_filter();
int nfreq=0;
std::vector<REALTYPE> free_filter_freqs;
ProcessParameters pars;
std::vector<REALTYPE> infreq,sumfreq,tmpfreq1,tmpfreq2;
//REALTYPE *fbfreq;
};