@@ -451,6 +451,8 @@ void StretchAudioSource::setOnsetDetection(double x) | |||||
void StretchAudioSource::setPlayRange(Range<double> playrange, bool isloop) | void StretchAudioSource::setPlayRange(Range<double> playrange, bool isloop) | ||||
{ | { | ||||
std::lock_guard<std::mutex> locker(m_mutex); | std::lock_guard<std::mutex> locker(m_mutex); | ||||
if (m_playrange.isEmpty()==false && playrange == m_playrange) | |||||
return; | |||||
if (playrange.isEmpty()) | if (playrange.isEmpty()) | ||||
m_playrange = { 0.0,1.0 }; | m_playrange = { 0.0,1.0 }; | ||||
else | else | ||||
@@ -23,7 +23,10 @@ PaulstretchpluginAudioProcessorEditor::PaulstretchpluginAudioProcessorEditor (Pa | |||||
m_parcomps.back()->setBounds(1, i * 25, 598, 24); | m_parcomps.back()->setBounds(1, i * 25, 598, 24); | ||||
addAndMakeVisible(m_parcomps.back().get()); | addAndMakeVisible(m_parcomps.back().get()); | ||||
} | } | ||||
setSize (600, pars.size()*25); | |||||
addAndMakeVisible(&m_rec_enable); | |||||
m_rec_enable.setButtonText("Capture"); | |||||
m_rec_enable.addListener(this); | |||||
setSize (600, pars.size()*25+30); | |||||
startTimer(1, 100); | startTimer(1, 100); | ||||
} | } | ||||
@@ -31,6 +34,14 @@ PaulstretchpluginAudioProcessorEditor::~PaulstretchpluginAudioProcessorEditor() | |||||
{ | { | ||||
} | } | ||||
void PaulstretchpluginAudioProcessorEditor::buttonClicked(Button * but) | |||||
{ | |||||
if (but == &m_rec_enable) | |||||
{ | |||||
processor.setRecordingEnabled(but->getToggleState()); | |||||
} | |||||
} | |||||
//============================================================================== | //============================================================================== | ||||
void PaulstretchpluginAudioProcessorEditor::paint (Graphics& g) | void PaulstretchpluginAudioProcessorEditor::paint (Graphics& g) | ||||
{ | { | ||||
@@ -39,8 +50,8 @@ void PaulstretchpluginAudioProcessorEditor::paint (Graphics& g) | |||||
void PaulstretchpluginAudioProcessorEditor::resized() | void PaulstretchpluginAudioProcessorEditor::resized() | ||||
{ | { | ||||
// This is generally where you'll want to lay out the positions of any | |||||
// subcomponents in your editor.. | |||||
m_rec_enable.setBounds(1, getHeight() - 25, 10, 24); | |||||
m_rec_enable.changeWidthToFitText(); | |||||
} | } | ||||
void PaulstretchpluginAudioProcessorEditor::timerCallback(int id) | void PaulstretchpluginAudioProcessorEditor::timerCallback(int id) | ||||
@@ -71,12 +71,12 @@ private: | |||||
}; | }; | ||||
class PaulstretchpluginAudioProcessorEditor : public AudioProcessorEditor, | class PaulstretchpluginAudioProcessorEditor : public AudioProcessorEditor, | ||||
public MultiTimer | |||||
public MultiTimer, public Button::Listener | |||||
{ | { | ||||
public: | public: | ||||
PaulstretchpluginAudioProcessorEditor (PaulstretchpluginAudioProcessor&); | PaulstretchpluginAudioProcessorEditor (PaulstretchpluginAudioProcessor&); | ||||
~PaulstretchpluginAudioProcessorEditor(); | ~PaulstretchpluginAudioProcessorEditor(); | ||||
void buttonClicked(Button* but) override; | |||||
//============================================================================== | //============================================================================== | ||||
void paint (Graphics&) override; | void paint (Graphics&) override; | ||||
void resized() override; | void resized() override; | ||||
@@ -84,5 +84,6 @@ public: | |||||
private: | private: | ||||
PaulstretchpluginAudioProcessor& processor; | PaulstretchpluginAudioProcessor& processor; | ||||
std::vector<std::shared_ptr<ParameterComponent>> m_parcomps; | std::vector<std::shared_ptr<ParameterComponent>> m_parcomps; | ||||
ToggleButton m_rec_enable; | |||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PaulstretchpluginAudioProcessorEditor) | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PaulstretchpluginAudioProcessorEditor) | ||||
}; | }; |
@@ -36,6 +36,8 @@ PaulstretchpluginAudioProcessor::PaulstretchpluginAudioProcessor() | |||||
addParameter(new AudioParameterFloat("fftsize0", "FFT size", 0.0f, 1.0f, 0.6f)); | addParameter(new AudioParameterFloat("fftsize0", "FFT size", 0.0f, 1.0f, 0.6f)); | ||||
addParameter(new AudioParameterFloat("pitchshift0", "Pitch shift", -24.0f, 24.0f, 0.0f)); | addParameter(new AudioParameterFloat("pitchshift0", "Pitch shift", -24.0f, 24.0f, 0.0f)); | ||||
addParameter(new AudioParameterFloat("freqshift0", "Frequency shift", -1000.0f, 1000.0f, 0.0f)); | addParameter(new AudioParameterFloat("freqshift0", "Frequency shift", -1000.0f, 1000.0f, 0.0f)); | ||||
addParameter(new AudioParameterFloat("playrange_start0", "Sound start", 0.0f, 1.0f, 0.0f)); | |||||
addParameter(new AudioParameterFloat("playrange_end0", "Sound end", 0.0f, 1.0f, 1.0f)); | |||||
} | } | ||||
PaulstretchpluginAudioProcessor::~PaulstretchpluginAudioProcessor() | PaulstretchpluginAudioProcessor::~PaulstretchpluginAudioProcessor() | ||||
@@ -163,10 +165,27 @@ void PaulstretchpluginAudioProcessor::processBlock (AudioSampleBuffer& buffer, M | |||||
buffer.clear (i, 0, buffer.getNumSamples()); | buffer.clear (i, 0, buffer.getNumSamples()); | ||||
if (m_ready_to_play == false) | if (m_ready_to_play == false) | ||||
return; | return; | ||||
if (m_is_recording == true) | |||||
{ | |||||
m_rec_pos += buffer.getNumSamples(); | |||||
if (m_rec_pos >= m_max_reclen * getSampleRate()) | |||||
{ | |||||
m_is_recording = false; | |||||
// Set record buffer as strech source... | |||||
} | |||||
return; | |||||
} | |||||
m_control->getStretchAudioSource()->setRate(*getFloatParameter(1)); | m_control->getStretchAudioSource()->setRate(*getFloatParameter(1)); | ||||
//m_control->setFFTSize(*getFloatParameter(2)); | //m_control->setFFTSize(*getFloatParameter(2)); | ||||
m_control->ppar.pitch_shift.cents = *getFloatParameter(3) * 100.0; | m_control->ppar.pitch_shift.cents = *getFloatParameter(3) * 100.0; | ||||
m_control->ppar.freq_shift.Hz = *getFloatParameter(4); | m_control->ppar.freq_shift.Hz = *getFloatParameter(4); | ||||
double t0 = *getFloatParameter(5); | |||||
double t1 = *getFloatParameter(6); | |||||
if (t0 > t1) | |||||
std::swap(t0, t1); | |||||
if (t1 - t0 < 0.001) | |||||
t1 = t0 + 0.001; | |||||
m_control->getStretchAudioSource()->setPlayRange({ t0,t1 }, true); | |||||
m_control->update_process_parameters(); | m_control->update_process_parameters(); | ||||
m_control->processAudio(buffer); | m_control->processAudio(buffer); | ||||
} | } | ||||
@@ -196,6 +215,20 @@ void PaulstretchpluginAudioProcessor::setStateInformation (const void* data, int | |||||
// whose contents will have been created by the getStateInformation() call. | // whose contents will have been created by the getStateInformation() call. | ||||
} | } | ||||
void PaulstretchpluginAudioProcessor::setRecordingEnabled(bool b) | |||||
{ | |||||
if (b == true) | |||||
{ | |||||
m_is_recording = true; | |||||
m_recbuffer.setSize(2, m_max_reclen*getSampleRate()); | |||||
m_rec_pos = 0; | |||||
} | |||||
else | |||||
{ | |||||
m_is_recording = false; | |||||
} | |||||
} | |||||
//============================================================================== | //============================================================================== | ||||
// This creates new instances of the plugin.. | // This creates new instances of the plugin.. | ||||
AudioProcessor* JUCE_CALLTYPE createPluginFilter() | AudioProcessor* JUCE_CALLTYPE createPluginFilter() | ||||
@@ -59,10 +59,15 @@ public: | |||||
{ | { | ||||
return dynamic_cast<AudioParameterFloat*>(getParameters()[index]); | return dynamic_cast<AudioParameterFloat*>(getParameters()[index]); | ||||
} | } | ||||
void setRecordingEnabled(bool b); | |||||
private: | private: | ||||
std::unique_ptr<Control> m_control; | std::unique_ptr<Control> m_control; | ||||
std::unique_ptr<AudioFormatManager> m_afm; | std::unique_ptr<AudioFormatManager> m_afm; | ||||
bool m_ready_to_play = false; | bool m_ready_to_play = false; | ||||
AudioBuffer<float> m_recbuffer; | |||||
double m_max_reclen = 10.0; | |||||
bool m_is_recording = true; | |||||
int m_rec_pos = 0; | |||||
//============================================================================== | //============================================================================== | ||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PaulstretchpluginAudioProcessor) | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PaulstretchpluginAudioProcessor) | ||||
}; | }; |