// SPDX-License-Identifier: GPLv3-or-later WITH Appstore-exception // Copyright (C) 2017 Xenakios // Copyright (C) 2020 Jesse Chappell #include "PluginProcessor.h" #include "PluginEditor.h" #include #include "RenderSettingsComponent.h" #include "CrossPlatformUtils.h" #include "OptionsView.h" enum ParameterGroupIds { HarmonicsGroup = 0, TonalNoiseGroup = 1, FrequencyShiftGroup = 2, PitchShiftGroup = 3, RatiosGroup = 4, FrequencySpreadGroup = 5, FilterGroup = 6, FreeFilterGroup = 7, CompressGroup = 8 }; //============================================================================== PaulstretchpluginAudioProcessorEditor::PaulstretchpluginAudioProcessorEditor(PaulstretchpluginAudioProcessor& p) : AudioProcessorEditor(&p), m_wavecomponent(p.m_afm,p.m_thumb.get(), p.getStretchSource()), processor(p), m_perfmeter(&p), m_free_filter_component(&p), m_wavefilter_tab(p.m_cur_tab_index), m_filefilter(p.m_afm->getWildcardForAllFormats(),String(),String()) { LookAndFeel::setDefaultLookAndFeel(&m_lookandfeel); setLookAndFeel(&m_lookandfeel); setWantsKeyboardFocus(true); m_wave_container = new Component; m_free_filter_component.getEnvelopeComponent()->set_envelope(processor.m_free_filter_envelope); m_free_filter_component.getEnvelopeComponent()->XFromNormalized = [this](double x) { //return jmap(pow(x, 3.0), 0.0, 1.0, 30.0, processor.getSampleRateChecked()/2.0); return 30.0*pow(1.05946309436, x*115.0); }; m_free_filter_component.getEnvelopeComponent()->YFromNormalized = [this](double x) { return jmap(x, 0.0, 1.0, -48.0, 12.0); }; int tabdepth = 26; #if JUCE_IOS tabdepth = 36; #endif m_wavefilter_tab.setTabBarDepth(tabdepth); m_wavefilter_tab.getTabbedButtonBar().setMinimumTabScaleFactor(0.25f); addAndMakeVisible(&m_perfmeter); addAndMakeVisible(&m_import_button); #if JUCE_IOS m_import_button.setButtonText("Load Audio..."); #else m_import_button.setButtonText("Show browser"); #endif m_import_button.onClick = [this]() { toggleFileBrowser(); }; addAndMakeVisible(&m_settings_button); m_settings_button.setButtonText("Settings..."); m_settings_button.onClick = [this]() { showSettings(true); }; if (JUCEApplicationBase::isStandaloneApp()) { addAndMakeVisible(&m_render_button); m_render_button.setButtonText("Render..."); m_render_button.onClick = [this]() { showRenderDialog(); }; } m_rewind_button = std::make_unique("rewind", DrawableButton::ButtonStyle::ImageFitted); std::unique_ptr rewimg(Drawable::createFromImageData(BinaryData::skipback_icon_svg, BinaryData::skipback_icon_svgSize)); m_rewind_button->setImages(rewimg.get()); m_rewind_button->setColour(TextButton::buttonColourId, Colours::transparentBlack); m_rewind_button->setColour(TextButton::buttonOnColourId, Colours::transparentBlack); m_rewind_button->setColour(DrawableButton::backgroundColourId, Colours::transparentBlack); m_rewind_button->setColour(DrawableButton::backgroundOnColourId, Colours::transparentBlack); addAndMakeVisible(m_rewind_button.get()); m_rewind_button->setTitle("Return to start"); m_rewind_button->setTooltip("Return to start"); m_rewind_button->onClick = [this]() { processor.setParameter( cpi_rewind, 1.0f); //processor.getStretchSource()->seekPercent(processor.getStretchSource()->getPlayRange().getStart()); }; addAndMakeVisible(&m_info_label); m_info_label.setJustificationType(Justification::centredRight); m_info_label.setFont(14.0f); m_recordingButton = std::make_unique("rewind", DrawableButton::ButtonStyle::ImageFitted); std::unique_ptr reconimg(Drawable::createFromImageData(BinaryData::record_output_active_svg, BinaryData::record_output_active_svgSize)); std::unique_ptr recoffimg(Drawable::createFromImageData(BinaryData::record_output_svg, BinaryData::record_output_svgSize)); m_recordingButton->setImages(recoffimg.get(), nullptr, nullptr, nullptr, reconimg.get()); m_recordingButton->setColour(DrawableButton::backgroundOnColourId, Colour::fromFloatRGBA(0.6, 0.3, 0.3, 0.5)); addAndMakeVisible(m_recordingButton.get()); //m_recordingButton->setColour(DrawableButton::backgroundOnColourId, Colours::transparentBlack); m_recordingButton->setTooltip(TRANS("Start/Stop recording output to file")); m_recordingButton->setTitle(TRANS("Record Output")); m_recordingButton->setClickingTogglesState(true); m_recordingButton->onClick = [this]() { toggleOutputRecording(); }; m_fileRecordingLabel = std::make_unique