Added sound play range parameters. Initial work on audio input capture.
This commit is contained in:
		| @@ -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 | 	m_rec_enable.setBounds(1, getHeight() - 25, 10, 24); | ||||||
|     // subcomponents in your editor.. | 	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) | ||||||
| }; | }; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 xenakios
					xenakios