added button icons. layout fixes. increased buffering thread priority

This commit is contained in:
essej 2022-04-14 03:26:26 -04:00
parent 7404f827a7
commit b3414a292e
18 changed files with 1568 additions and 120 deletions

View File

@ -98,9 +98,19 @@ PaulstretchpluginAudioProcessorEditor::PaulstretchpluginAudioProcessorEditor(Pau
m_render_button.onClick = [this]() { showRenderDialog(); }; m_render_button.onClick = [this]() { showRenderDialog(); };
} }
addAndMakeVisible(m_rewind_button); // jlc
m_rewind_button.setButtonText("<<"); m_rewind_button = std::make_unique<DrawableButton>("rewind", DrawableButton::ButtonStyle::ImageFitted);
m_rewind_button.onClick = [this]() std::unique_ptr<Drawable> 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.getBoolParameter(cpi_rewind) = true; *processor.getBoolParameter(cpi_rewind) = true;
//processor.getStretchSource()->seekPercent(processor.getStretchSource()->getPlayRange().getStart()); //processor.getStretchSource()->seekPercent(processor.getStretchSource()->getPlayRange().getStart());
@ -108,6 +118,7 @@ PaulstretchpluginAudioProcessorEditor::PaulstretchpluginAudioProcessorEditor(Pau
addAndMakeVisible(&m_info_label); addAndMakeVisible(&m_info_label);
m_info_label.setJustificationType(Justification::centredRight); m_info_label.setJustificationType(Justification::centredRight);
m_info_label.setFont(14.0f);
m_wavecomponent.GetFileCallback = [this]() { return processor.getAudioFile(); }; m_wavecomponent.GetFileCallback = [this]() { return processor.getAudioFile(); };
@ -120,7 +131,13 @@ PaulstretchpluginAudioProcessorEditor::PaulstretchpluginAudioProcessorEditor(Pau
if (parid->paramID.startsWith("fftsize") || parid->paramID.startsWith("numoutchans") if (parid->paramID.startsWith("fftsize") || parid->paramID.startsWith("numoutchans")
|| parid->paramID.startsWith("numinchans")) || parid->paramID.startsWith("numinchans"))
notifyonlyonrelease = true; notifyonlyonrelease = true;
int group_id = -1;
bool usedrawable = false;
if (i == cpi_pause_enabled || i == cpi_looping_enabled || i == cpi_capture_trigger || i == cpi_freeze || i == cpi_passthrough)
usedrawable = true;
int group_id = -1;
if (i == cpi_harmonicsbw || i == cpi_harmonicsfreq || i == cpi_harmonicsgauss || i == cpi_numharmonics) if (i == cpi_harmonicsbw || i == cpi_harmonicsfreq || i == cpi_harmonicsgauss || i == cpi_numharmonics)
group_id = HarmonicsGroup; group_id = HarmonicsGroup;
if (i == cpi_octavesm2 || i == cpi_octavesm1 || i == cpi_octaves0 || i == cpi_octaves1 || i == cpi_octaves15 || if (i == cpi_octavesm2 || i == cpi_octavesm1 || i == cpi_octaves0 || i == cpi_octaves1 || i == cpi_octaves15 ||
@ -148,7 +165,7 @@ PaulstretchpluginAudioProcessorEditor::PaulstretchpluginAudioProcessorEditor(Pau
group_id = -2; group_id = -2;
if (group_id >= -1) if (group_id >= -1)
{ {
m_parcomps.emplace_back(std::make_unique<ParameterComponent>(pars[i], notifyonlyonrelease)); m_parcomps.emplace_back(std::make_unique<ParameterComponent>(pars[i], notifyonlyonrelease, usedrawable));
m_parcomps.back()->m_group_id = group_id; m_parcomps.back()->m_group_id = group_id;
if (group_id == -1) // only add ones that aren't in groups if (group_id == -1) // only add ones that aren't in groups
@ -166,6 +183,42 @@ PaulstretchpluginAudioProcessorEditor::PaulstretchpluginAudioProcessorEditor(Pau
m_parcomps[cpi_num_outchans]->getSlider()->setSliderStyle(Slider::SliderStyle::IncDecButtons); m_parcomps[cpi_num_outchans]->getSlider()->setSliderStyle(Slider::SliderStyle::IncDecButtons);
m_parcomps[cpi_num_outchans]->getSlider()->setTextBoxStyle(Slider::TextEntryBoxPosition::TextBoxLeft, false, 30, 34); m_parcomps[cpi_num_outchans]->getSlider()->setTextBoxStyle(Slider::TextEntryBoxPosition::TextBoxLeft, false, 30, 34);
removeChildComponent(m_parcomps[cpi_bypass_stretch].get());
if (auto * pausebut = m_parcomps[cpi_pause_enabled]->getDrawableButton()) {
std::unique_ptr<Drawable> playimg(Drawable::createFromImageData(BinaryData::play_icon_svg, BinaryData::play_icon_svgSize));
std::unique_ptr<Drawable> pauseimg(Drawable::createFromImageData(BinaryData::pause_icon_svg, BinaryData::pause_icon_svgSize));
pausebut->setImages(pauseimg.get(), nullptr, nullptr, nullptr, playimg.get());
pausebut->setColour(DrawableButton::backgroundColourId, Colour::fromFloatRGBA(0.1f, 0.5f, 0.1f, 0.55f));
}
if (auto * loopbut = m_parcomps[cpi_looping_enabled]->getDrawableButton()) {
std::unique_ptr<Drawable> loopimg(Drawable::createFromImageData(BinaryData::loop_icon_svg, BinaryData::loop_icon_svgSize));
loopbut->setImages(loopimg.get());
loopbut->setColour(DrawableButton::backgroundOnColourId, Colour::fromFloatRGBA(0.6, 0.4, 0.6, 0.4));
}
if (auto * recbut = m_parcomps[cpi_capture_trigger]->getDrawableButton()) {
std::unique_ptr<Drawable> reconimg(Drawable::createFromImageData(BinaryData::record_active_svg, BinaryData::record_active_svgSize));
std::unique_ptr<Drawable> recoffimg(Drawable::createFromImageData(BinaryData::record_svg, BinaryData::record_svgSize));
recbut->setImages(recoffimg.get(), nullptr, nullptr, nullptr, reconimg.get());
recbut->setColour(DrawableButton::backgroundOnColourId, Colour::fromFloatRGBA(0.6, 0.3, 0.3, 0.5));
}
if (auto * freezebut = m_parcomps[cpi_freeze]->getDrawableButton()) {
std::unique_ptr<Drawable> img(Drawable::createFromImageData(BinaryData::freeze_svg, BinaryData::freeze_svgSize));
freezebut->setImages(img.get());
freezebut->setColour(DrawableButton::backgroundOnColourId, Colour::fromFloatRGBA(0.2, 0.5, 0.7, 0.55));
}
if (auto * thrubut = m_parcomps[cpi_passthrough]->getDrawableButton()) {
std::unique_ptr<Drawable> img(Drawable::createFromImageData(BinaryData::passthru_svg, BinaryData::passthru_svgSize));
std::unique_ptr<Drawable> imgon(Drawable::createFromImageData(BinaryData::passthru_enabled_svg, BinaryData::passthru_enabled_svgSize));
thrubut->setImages(img.get(), nullptr, nullptr, nullptr, imgon.get());
thrubut->setColour(DrawableButton::backgroundOnColourId, Colour::fromFloatRGBA(0.5, 0.3, 0.0, 0.55));
}
#if JUCE_IOS #if JUCE_IOS
// just don't include chan counts on ios for now // just don't include chan counts on ios for now
@ -180,8 +233,9 @@ PaulstretchpluginAudioProcessorEditor::PaulstretchpluginAudioProcessorEditor(Pau
addAndMakeVisible(m_groupviewport.get()); addAndMakeVisible(m_groupviewport.get());
m_stretchgroup = std::make_unique<ParameterGroupComponent>("", -1, &processor, false); m_stretchgroup = std::make_unique<ParameterGroupComponent>("", -1, &processor, true);
m_stretchgroup->setBackgroundColor(Colour(0xff332244)); m_stretchgroup->setBackgroundColor(Colour(0xff332244));
m_stretchgroup->setToggleEnabled( ! *processor.getBoolParameter(cpi_bypass_stretch));
if (*processor.getBoolParameter(cpi_bypass_stretch)) { if (*processor.getBoolParameter(cpi_bypass_stretch)) {
m_stretchgroup->addParameterComponent(m_parcomps[cpi_dryplayrate].get()); m_stretchgroup->addParameterComponent(m_parcomps[cpi_dryplayrate].get());
removeChildComponent(m_parcomps[cpi_stretchamount].get()); removeChildComponent(m_parcomps[cpi_stretchamount].get());
@ -190,6 +244,11 @@ PaulstretchpluginAudioProcessorEditor::PaulstretchpluginAudioProcessorEditor(Pau
removeChildComponent(m_parcomps[cpi_dryplayrate].get()); removeChildComponent(m_parcomps[cpi_dryplayrate].get());
} }
m_stretchgroup->addParameterComponent(m_parcomps[cpi_fftsize].get()); m_stretchgroup->addParameterComponent(m_parcomps[cpi_fftsize].get());
m_stretchgroup->EnabledChangedCallback = [this]() {
toggleBool(processor.getBoolParameter(cpi_bypass_stretch));
m_stretchgroup->setToggleEnabled( ! *processor.getBoolParameter(cpi_bypass_stretch));
// jlc
};
addAndMakeVisible(m_stretchgroup.get()); addAndMakeVisible(m_stretchgroup.get());
@ -451,7 +510,7 @@ void PaulstretchpluginAudioProcessorEditor::showRenderDialog()
{ {
auto contentraw = new RenderSettingsComponent(&processor); auto contentraw = new RenderSettingsComponent(&processor);
int prefw = jmin(contentraw->getPreferredWidth(), getWidth() - 10); int prefw = jmin(contentraw->getPreferredWidth(), getWidth() - 20);
int prefh = jmin(contentraw->getPreferredHeight(), getHeight() - 10); int prefh = jmin(contentraw->getPreferredHeight(), getHeight() - 10);
contentraw->setSize(prefw, prefh); contentraw->setSize(prefw, prefh);
std::unique_ptr<Component> content(contentraw); std::unique_ptr<Component> content(contentraw);
@ -577,7 +636,6 @@ void PaulstretchpluginAudioProcessorEditor::resized()
{ {
topbox.items.add(FlexItem(buttw, buttonrowheight, m_render_button).withMargin(1).withFlex(1).withMaxWidth(130)); topbox.items.add(FlexItem(buttw, buttonrowheight, m_render_button).withMargin(1).withFlex(1).withMaxWidth(130));
} }
topbox.items.add(FlexItem(buttminw, buttonrowheight, m_rewind_button).withMargin(1));
topbox.items.add(FlexItem(4, 4)); topbox.items.add(FlexItem(4, 4));
topbox.items.add(FlexItem(80, buttonrowheight, m_perfmeter).withMargin(1).withFlex(1).withMaxWidth(110).withMaxHeight(24).withAlignSelf(FlexItem::AlignSelf::center)); topbox.items.add(FlexItem(80, buttonrowheight, m_perfmeter).withMargin(1).withFlex(1).withMaxWidth(110).withMaxHeight(24).withAlignSelf(FlexItem::AlignSelf::center));
topbox.items.add(FlexItem(140, 26, m_info_label).withMargin(1).withFlex(2)); topbox.items.add(FlexItem(140, 26, m_info_label).withMargin(1).withFlex(2));
@ -591,13 +649,23 @@ void PaulstretchpluginAudioProcessorEditor::resized()
togglesbox.flexWrap = FlexBox::Wrap::wrap; togglesbox.flexWrap = FlexBox::Wrap::wrap;
togglesbox.alignContent = FlexBox::AlignContent::flexStart; togglesbox.alignContent = FlexBox::AlignContent::flexStart;
togglesbox.items.add(FlexItem(toggleminw, togglerowheight, *m_parcomps[cpi_capture_trigger]).withMargin(margin).withFlex(1).withMaxWidth(200)); togglesbox.items.add(FlexItem(buttminw, buttonrowheight, *m_parcomps[cpi_capture_trigger]).withMargin(margin).withFlex(1).withMaxWidth(65));
togglesbox.items.add(FlexItem(toggleminw, togglerowheight, *m_parcomps[cpi_passthrough]).withMargin(margin).withFlex(1.5).withMaxWidth(200)); togglesbox.items.add(FlexItem(buttminw, buttonrowheight).withFlex(0.1));
togglesbox.items.add(FlexItem(toggleminw, togglerowheight, *m_parcomps[cpi_pause_enabled]).withMargin(margin).withFlex(1).withMaxWidth(200)); togglesbox.items.add(FlexItem(buttminw, buttonrowheight, *m_rewind_button).withMargin(1).withFlex(1).withMaxWidth(65));
togglesbox.items.add(FlexItem(toggleminw, togglerowheight, *m_parcomps[cpi_freeze]).withMargin(margin).withFlex(1).withMaxWidth(200)); togglesbox.items.add(FlexItem(0, buttonrowheight).withFlex(0.1).withMaxWidth(10));
togglesbox.items.add(FlexItem(toggleminw, togglerowheight, *m_parcomps[cpi_bypass_stretch]).withMargin(margin).withFlex(1).withMaxWidth(200)); togglesbox.items.add(FlexItem(buttminw, buttonrowheight, *m_parcomps[cpi_pause_enabled]).withMargin(margin).withFlex(1).withMaxWidth(65));
togglesbox.items.add(FlexItem(toggleminw, togglerowheight, *m_parcomps[cpi_looping_enabled]).withMargin(margin).withFlex(1).withMaxWidth(200)); togglesbox.items.add(FlexItem(0, buttonrowheight).withFlex(0.1).withMaxWidth(10));
togglesbox.items.add(FlexItem(buttminw, buttonrowheight, *m_parcomps[cpi_looping_enabled]).withMargin(margin).withFlex(1).withMaxWidth(65));
togglesbox.items.add(FlexItem(0, buttonrowheight).withFlex(0.1).withMaxWidth(10));
togglesbox.items.add(FlexItem(buttminw, buttonrowheight, *m_parcomps[cpi_freeze]).withMargin(margin).withFlex(1).withMaxWidth(65));
togglesbox.items.add(FlexItem(buttminw, buttonrowheight).withFlex(0.1));
//togglesbox.items.add(FlexItem(toggleminw, togglerowheight, *m_parcomps[cpi_bypass_stretch]).withMargin(margin).withFlex(1).withMaxWidth(150));
togglesbox.items.add(FlexItem(buttminw + 15, buttonrowheight, *m_parcomps[cpi_passthrough]).withMargin(margin).withFlex(1.5).withMaxWidth(85));
togglesbox.items.add(FlexItem(2, buttonrowheight));
togglesbox.performLayout(Rectangle<int>(0,0,w - 2*margin,400)); // test run to calculate actual used height togglesbox.performLayout(Rectangle<int>(0,0,w - 2*margin,400)); // test run to calculate actual used height
int toggleh = togglesbox.items.getLast().currentBounds.getBottom() + togglesbox.items.getLast().margin.bottom; int toggleh = togglesbox.items.getLast().currentBounds.getBottom() + togglesbox.items.getLast().margin.bottom;
@ -625,7 +693,7 @@ void PaulstretchpluginAudioProcessorEditor::resized()
volbox.performLayout(Rectangle<int>(0,0,w - 2*margin,400)); // test run to calculate actual used height volbox.performLayout(Rectangle<int>(0,0,w - 2*margin,400)); // test run to calculate actual used height
int volh = volbox.items.getLast().currentBounds.getBottom() + volbox.items.getLast().margin.bottom; int volh = volbox.items.getLast().currentBounds.getBottom() + volbox.items.getLast().margin.bottom;
int stretchH = m_stretchgroup->getMinimumHeight(w - 2*margin); int stretchH = m_stretchgroup->getMinimumHeight(w - 2*margin);
stretchH = jmax(stretchH, (int) (minh*1.1f));
FlexBox groupsbox; FlexBox groupsbox;
@ -719,6 +787,7 @@ void PaulstretchpluginAudioProcessorEditor::resized()
mainbox.items.add(FlexItem(minw, topboxh, topbox).withMargin(margin).withFlex(0)); mainbox.items.add(FlexItem(minw, topboxh, topbox).withMargin(margin).withFlex(0));
mainbox.items.add(FlexItem(minw, toggleh, togglesbox).withMargin(margin).withFlex(0));
auto reparentIfNecessary = [] (Component * comp, Component *newparent) { auto reparentIfNecessary = [] (Component * comp, Component *newparent) {
@ -747,14 +816,14 @@ void PaulstretchpluginAudioProcessorEditor::resized()
// not enough vertical space, put the top items in the scrollable viewport // not enough vertical space, put the top items in the scrollable viewport
// may have to reparent them // may have to reparent them
reparentIfNecessary(m_stretchgroup.get(), m_groupcontainer.get()); reparentIfNecessary(m_stretchgroup.get(), m_groupcontainer.get());
reparentItemsIfNecessary(togglesbox, m_groupcontainer.get()); //reparentItemsIfNecessary(togglesbox, m_groupcontainer.get());
reparentItemsIfNecessary(volbox, m_groupcontainer.get()); reparentItemsIfNecessary(volbox, m_groupcontainer.get());
groupsbox.items.insert(0, FlexItem(minw, stretchH, *m_stretchgroup).withMargin(groupmargin).withFlex(0)); groupsbox.items.insert(0, FlexItem(minw, stretchH, *m_stretchgroup).withMargin(groupmargin).withFlex(0));
groupsbox.items.insert(0, FlexItem(minw, volh, volbox).withMargin(groupmargin).withFlex(0)); groupsbox.items.insert(0, FlexItem(minw, volh, volbox).withMargin(groupmargin).withFlex(0));
groupsbox.items.insert(0, FlexItem(minw, toggleh, togglesbox).withMargin(groupmargin).withFlex(0)); //groupsbox.items.insert(0, FlexItem(minw, toggleh, togglesbox).withMargin(groupmargin).withFlex(0));
useh += toggleh + volh + stretchH + 6*groupmargin; useh += /*toggleh + */ volh + stretchH + 6*groupmargin;
if (getHeight() < shortthresh) { if (getHeight() < shortthresh) {
// really not much space, put group scroll in a new tab // really not much space, put group scroll in a new tab
@ -797,11 +866,11 @@ void PaulstretchpluginAudioProcessorEditor::resized()
reparentIfNecessary(m_groupviewport.get(), this); reparentIfNecessary(m_groupviewport.get(), this);
reparentIfNecessary(&m_spec_order_ed, this); reparentIfNecessary(&m_spec_order_ed, this);
reparentIfNecessary(m_stretchgroup.get(), this); reparentIfNecessary(m_stretchgroup.get(), this);
reparentItemsIfNecessary(togglesbox, this); //reparentItemsIfNecessary(togglesbox, this);
reparentItemsIfNecessary(volbox, this); reparentItemsIfNecessary(volbox, this);
mainbox.items.add(FlexItem(minw, toggleh, togglesbox).withMargin(margin).withFlex(0)); //mainbox.items.add(FlexItem(minw, toggleh, togglesbox).withMargin(margin).withFlex(0));
mainbox.items.add(FlexItem(minw, volh, volbox).withMargin(margin).withFlex(0)); mainbox.items.add(FlexItem(minw, volh, volbox).withMargin(margin).withFlex(0));
mainbox.items.add(FlexItem(minw, stretchH, *m_stretchgroup).withMargin(margin).withFlex(0)); mainbox.items.add(FlexItem(minw, stretchH, *m_stretchgroup).withMargin(margin).withFlex(0));
} }
@ -862,6 +931,13 @@ void PaulstretchpluginAudioProcessorEditor::timerCallback(int id)
{ {
if (id == 1) if (id == 1)
{ {
if (!tooltipWindow && getParentComponent()) {
Component* dw = this;
if (dw) {
tooltipWindow = std::make_unique<CustomTooltipWindow>(this, dw);
}
}
for (int i = 0; i < m_parcomps.size(); ++i) for (int i = 0; i < m_parcomps.size(); ++i)
{ {
if (m_parcomps[i]!=nullptr) if (m_parcomps[i]!=nullptr)
@ -911,7 +987,8 @@ void PaulstretchpluginAudioProcessorEditor::timerCallback(int id)
group.second->updateParameterComponents(); group.second->updateParameterComponents();
} }
; m_stretchgroup->setToggleEnabled(!*processor.getBoolParameter(cpi_bypass_stretch));
if (AudioParameterBool* enablepar = dynamic_cast<AudioParameterBool*>(processor.getBoolParameter(cpi_pause_enabled))) { if (AudioParameterBool* enablepar = dynamic_cast<AudioParameterBool*>(processor.getBoolParameter(cpi_pause_enabled))) {
m_perfmeter.enabled = !enablepar->get(); m_perfmeter.enabled = !enablepar->get();
} }
@ -1060,9 +1137,10 @@ void PaulstretchpluginAudioProcessorEditor::showAbout()
#if !JUCE_IOS #if !JUCE_IOS
text += juceversiontxt + String(" used under the GPL license.\n\n"); text += juceversiontxt + String(" used under the GPL license.\n\n");
text += String("GPL licensed source code for this plugin at : https://bitbucket.org/xenakios/paulstretchplugin/overview\n");
#endif #endif
// text += String("GPL licensed source code for this plugin at : https://bitbucket.org/xenakios/paulstretchplugin/overview\n");
if (host.type != juce::PluginHostType::UnknownHost) { if (host.type != juce::PluginHostType::UnknownHost) {
text += String("Running in : ") + host.getHostDescription()+ String("\n"); text += String("Running in : ") + host.getHostDescription()+ String("\n");
} }
@ -1770,7 +1848,8 @@ void SpectralChainEditor::drawBox(Graphics & g, int index, int x, int y, int w,
g.setColour(Colours::white.withAlpha(0.8f)); g.setColour(Colours::white.withAlpha(0.8f));
} }
ParameterComponent::ParameterComponent(AudioProcessorParameter * par, bool notifyOnlyOnRelease) : m_par(par) ParameterComponent::ParameterComponent(AudioProcessorParameter * par, bool notifyOnlyOnRelease, bool useDrawableToggle)
: m_par(par)
{ {
addAndMakeVisible(&m_label); addAndMakeVisible(&m_label);
m_labeldefcolor = m_label.findColour(Label::textColourId); m_labeldefcolor = m_label.findColour(Label::textColourId);
@ -1789,6 +1868,8 @@ ParameterComponent::ParameterComponent(AudioProcessorParameter * par, bool notif
m_slider->setDoubleClickReturnValue(true, floatpar->range.convertFrom0to1(par->getDefaultValue())); m_slider->setDoubleClickReturnValue(true, floatpar->range.convertFrom0to1(par->getDefaultValue()));
m_slider->setViewportIgnoreDragFlag(true); m_slider->setViewportIgnoreDragFlag(true);
m_slider->setScrollWheelEnabled(false); m_slider->setScrollWheelEnabled(false);
m_slider->setTitle(floatpar->getName(50));
} }
AudioParameterInt* intpar = dynamic_cast<AudioParameterInt*>(par); AudioParameterInt* intpar = dynamic_cast<AudioParameterInt*>(par);
if (intpar) if (intpar)
@ -1800,7 +1881,9 @@ ParameterComponent::ParameterComponent(AudioProcessorParameter * par, bool notif
m_slider->setTextBoxStyle(Slider::TextBoxLeft, false, 60, 34); m_slider->setTextBoxStyle(Slider::TextBoxLeft, false, 60, 34);
m_slider->addListener(this); m_slider->addListener(this);
m_slider->setViewportIgnoreDragFlag(true); m_slider->setViewportIgnoreDragFlag(true);
m_slider->setScrollWheelEnabled(false); m_slider->setScrollWheelEnabled(false
);
m_slider->setTitle(intpar->getName(50));
} }
AudioParameterChoice* choicepar = dynamic_cast<AudioParameterChoice*>(par); AudioParameterChoice* choicepar = dynamic_cast<AudioParameterChoice*>(par);
if (choicepar) if (choicepar)
@ -1810,11 +1893,27 @@ ParameterComponent::ParameterComponent(AudioProcessorParameter * par, bool notif
AudioParameterBool* boolpar = dynamic_cast<AudioParameterBool*>(par); AudioParameterBool* boolpar = dynamic_cast<AudioParameterBool*>(par);
if (boolpar) if (boolpar)
{ {
m_togglebut = std::make_unique<ToggleButton>(); if (useDrawableToggle) {
m_togglebut->setToggleState(*boolpar, dontSendNotification); m_drawtogglebut = std::make_unique<DrawableButton>("but", DrawableButton::ImageFitted);
m_togglebut->addListener(this); m_drawtogglebut->setToggleState(*boolpar, dontSendNotification);
m_togglebut->setButtonText(par->getName(50)); m_drawtogglebut->addListener(this);
addAndMakeVisible(m_togglebut.get()); m_drawtogglebut->setTitle(par->getName(50));
m_drawtogglebut->setTooltip(par->getName(50));
m_drawtogglebut->setClickingTogglesState(true);
m_drawtogglebut->setColour(TextButton::buttonColourId, Colours::transparentBlack);
m_drawtogglebut->setColour(TextButton::buttonOnColourId, Colours::transparentBlack);
m_drawtogglebut->setColour(DrawableButton::backgroundColourId, Colours::transparentBlack);
m_drawtogglebut->setColour(DrawableButton::backgroundOnColourId, Colours::transparentBlack);
addAndMakeVisible(m_drawtogglebut.get());
}
else {
m_togglebut = std::make_unique<ToggleButton>();
m_togglebut->setToggleState(*boolpar, dontSendNotification);
m_togglebut->addListener(this);
m_togglebut->setButtonText(par->getName(50));
addAndMakeVisible(m_togglebut.get());
}
} }
} }
@ -1830,8 +1929,13 @@ void ParameterComponent::resized()
m_label.setBounds(0, 0, labw, h); m_label.setBounds(0, 0, labw, h);
m_slider->setBounds(m_label.getRight() + 1, 0, getWidth() - 2 - m_label.getWidth(), h); m_slider->setBounds(m_label.getRight() + 1, 0, getWidth() - 2 - m_label.getWidth(), h);
} }
if (m_togglebut) else if (m_togglebut) {
m_togglebut->setBounds(1, 0, getWidth() - 1, h); m_togglebut->setBounds(1, 0, getWidth() - 1, h);
}
else if (m_drawtogglebut) {
m_drawtogglebut->setBounds(1, 0, getWidth() - 1, h);
}
} }
void ParameterComponent::sliderValueChanged(Slider * slid) void ParameterComponent::sliderValueChanged(Slider * slid)
@ -1872,6 +1976,11 @@ void ParameterComponent::buttonClicked(Button * but)
if (m_togglebut->getToggleState()!=*boolpar) if (m_togglebut->getToggleState()!=*boolpar)
*boolpar = m_togglebut->getToggleState(); *boolpar = m_togglebut->getToggleState();
} }
else if (m_drawtogglebut != nullptr)
{
if (m_drawtogglebut->getToggleState() != *boolpar)
*boolpar = m_drawtogglebut->getToggleState();
}
} }
void ParameterComponent::updateComponent() void ParameterComponent::updateComponent()
@ -1887,11 +1996,18 @@ void ParameterComponent::updateComponent()
m_slider->setValue(*intpar, dontSendNotification); m_slider->setValue(*intpar, dontSendNotification);
} }
AudioParameterBool* boolpar = dynamic_cast<AudioParameterBool*>(m_par); AudioParameterBool* boolpar = dynamic_cast<AudioParameterBool*>(m_par);
if (boolpar!=nullptr && m_togglebut != nullptr) if (boolpar!=nullptr) {
{ if ( m_togglebut != nullptr)
if (m_togglebut->getToggleState() != *boolpar) {
m_togglebut->setToggleState(*boolpar, dontSendNotification); if (m_togglebut->getToggleState() != *boolpar)
} m_togglebut->setToggleState(*boolpar, dontSendNotification);
}
else if ( m_drawtogglebut != nullptr)
{
if (m_drawtogglebut->getToggleState() != *boolpar)
m_drawtogglebut->setToggleState(*boolpar, dontSendNotification);
}
}
} }
void ParameterComponent::setHighLighted(bool b) void ParameterComponent::setHighLighted(bool b)
@ -1901,12 +2017,16 @@ void ParameterComponent::setHighLighted(bool b)
m_label.setColour(Label::textColourId, m_labeldefcolor); m_label.setColour(Label::textColourId, m_labeldefcolor);
if (m_togglebut) if (m_togglebut)
m_togglebut->setColour(ToggleButton::textColourId, m_labeldefcolor); m_togglebut->setColour(ToggleButton::textColourId, m_labeldefcolor);
//else if (m_drawtogglebut)
// m_drawtogglebut->setColour(ToggleButton::textColourId, m_labeldefcolor);
} }
else else
{ {
m_label.setColour(Label::textColourId, Colours::yellow); m_label.setColour(Label::textColourId, Colours::yellow);
if (m_togglebut) if (m_togglebut)
m_togglebut->setColour(ToggleButton::textColourId, Colours::yellow); m_togglebut->setColour(ToggleButton::textColourId, Colours::yellow);
//else if (m_drawtogglebut)
// m_drawtogglebut->setColour(ToggleButton::textColourId, Colours::yellow);
} }
} }
@ -2179,22 +2299,26 @@ void RatioMixerEditor::paint(Graphics & g)
FreeFilterComponent::FreeFilterComponent(PaulstretchpluginAudioProcessor* proc) FreeFilterComponent::FreeFilterComponent(PaulstretchpluginAudioProcessor* proc)
: m_env(proc->getStretchSource()->getMutex()), m_cs(proc->getStretchSource()->getMutex()), m_proc(proc) : m_env(proc->getStretchSource()->getMutex()), m_cs(proc->getStretchSource()->getMutex()), m_proc(proc)
{ {
m_viewport = std::make_unique<Viewport>();
m_viewport->setViewedComponent(&m_container, false);
addAndMakeVisible(m_viewport.get());
addAndMakeVisible(m_env); addAndMakeVisible(m_env);
const auto& pars = m_proc->getParameters(); const auto& pars = m_proc->getParameters();
m_parcomps.emplace_back(std::make_unique<ParameterComponent>(pars[cpi_freefilter_shiftx],false)); m_parcomps.emplace_back(std::make_unique<ParameterComponent>(pars[cpi_freefilter_shiftx],false));
addAndMakeVisible(m_parcomps.back().get()); m_container.addAndMakeVisible(m_parcomps.back().get());
m_parcomps.emplace_back(std::make_unique<ParameterComponent>(pars[cpi_freefilter_shifty], false)); m_parcomps.emplace_back(std::make_unique<ParameterComponent>(pars[cpi_freefilter_shifty], false));
addAndMakeVisible(m_parcomps.back().get()); m_container.addAndMakeVisible(m_parcomps.back().get());
m_parcomps.emplace_back(std::make_unique<ParameterComponent>(pars[cpi_freefilter_scaley], false)); m_parcomps.emplace_back(std::make_unique<ParameterComponent>(pars[cpi_freefilter_scaley], false));
addAndMakeVisible(m_parcomps.back().get()); m_container.addAndMakeVisible(m_parcomps.back().get());
m_parcomps.emplace_back(std::make_unique<ParameterComponent>(pars[cpi_freefilter_tilty], false)); m_parcomps.emplace_back(std::make_unique<ParameterComponent>(pars[cpi_freefilter_tilty], false));
addAndMakeVisible(m_parcomps.back().get()); m_container.addAndMakeVisible(m_parcomps.back().get());
m_parcomps.emplace_back(std::make_unique<ParameterComponent>(pars[cpi_freefilter_randomy_numbands], false)); m_parcomps.emplace_back(std::make_unique<ParameterComponent>(pars[cpi_freefilter_randomy_numbands], false));
addAndMakeVisible(m_parcomps.back().get()); m_container.addAndMakeVisible(m_parcomps.back().get());
m_parcomps.emplace_back(std::make_unique<ParameterComponent>(pars[cpi_freefilter_randomy_rate], false)); m_parcomps.emplace_back(std::make_unique<ParameterComponent>(pars[cpi_freefilter_randomy_rate], false));
addAndMakeVisible(m_parcomps.back().get()); m_container.addAndMakeVisible(m_parcomps.back().get());
m_parcomps.emplace_back(std::make_unique<ParameterComponent>(pars[cpi_freefilter_randomy_amount], false)); m_parcomps.emplace_back(std::make_unique<ParameterComponent>(pars[cpi_freefilter_randomy_amount], false));
addAndMakeVisible(m_parcomps.back().get()); m_container.addAndMakeVisible(m_parcomps.back().get());
} }
void FreeFilterComponent::resized() void FreeFilterComponent::resized()
@ -2208,30 +2332,65 @@ void FreeFilterComponent::resized()
#endif #endif
FlexBox mainbox; FlexBox mainbox;
mainbox.flexDirection = FlexBox::Direction::row;
m_env.setBounds(m_slidwidth, 0, getWidth() - m_slidwidth, getHeight());
FlexBox slidbox; FlexBox slidbox;
slidbox.flexDirection = FlexBox::Direction::column; slidbox.flexDirection = FlexBox::Direction::column;
slidbox.items.add(FlexItem(3, 2).withMargin(0));
for (int i = 0; i < m_parcomps.size(); ++i) for (int i = 0; i < m_parcomps.size(); ++i)
{ {
//m_parcomps[i]->setBounds(1, 1+25*i, m_slidwidth - 2, 24); //m_parcomps[i]->setBounds(1, 1+25*i, m_slidwidth - 2, 24);
slidbox.items.add(FlexItem(minslidwidth, slidh, *m_parcomps[i]).withMargin(margin).withFlex(0)); slidbox.items.add(FlexItem(minslidwidth, slidh, *m_parcomps[i]).withMargin(margin).withFlex(0));
} }
mainbox.items.add(FlexItem(minslidwidth, 50, slidbox).withMargin(0).withFlex(1).withMaxWidth(m_slidwidth)); int minh = 0;
mainbox.items.add(FlexItem(100, 50, m_env).withMargin(0).withFlex(3)); for (auto & item : slidbox.items ) {
minh += item.minHeight + item.margin.top + item.margin.bottom;
}
int vpminh = 3*slidh + 3*margin;
if (minslidwidth < getWidth() * 0.4) {
mainbox.flexDirection = FlexBox::Direction::row;
//m_env.setBounds(m_slidwidth, 0, getWidth() - m_slidwidth, getHeight());
mainbox.items.add(FlexItem(minslidwidth, vpminh, *m_viewport).withMargin(0).withFlex(1).withMaxWidth(m_slidwidth));
mainbox.items.add(FlexItem(100, 50, m_env).withMargin(0).withFlex(3));
}
else {
mainbox.flexDirection = FlexBox::Direction::column;
//m_env.setBounds(m_slidwidth, 0, getWidth() - m_slidwidth, getHeight());
slidbox.flexDirection = FlexBox::Direction::column;
slidbox.flexWrap = FlexBox::Wrap::wrap;
mainbox.items.add(FlexItem(minslidwidth, vpminh, *m_viewport).withMargin(0).withFlex(0));
mainbox.items.add(FlexItem(100, 3).withMargin(0));
mainbox.items.add(FlexItem(100, 50, m_env).withMargin(0).withFlex(3));
}
mainbox.performLayout(getLocalBounds()); mainbox.performLayout(getLocalBounds());
auto contw = m_viewport->getWidth() - (minh > m_viewport->getHeight() ? m_viewport->getScrollBarThickness() : 0);
auto contbounds = Rectangle<int>(0, 0, contw, minh);
m_container.setBounds(contbounds);
slidbox.performLayout(contbounds);
} }
void FreeFilterComponent::paint(Graphics & g) void FreeFilterComponent::paint(Graphics & g)
{ {
g.setColour(Colour(0xff222222)); g.setColour(Colour(0xff222222));
g.fillRect(0, 0, m_slidwidth, getHeight()); g.fillRect(0, 0, getWidth(), getHeight());
} }
void FreeFilterComponent::updateParameterComponents() void FreeFilterComponent::updateParameterComponents()
@ -2263,14 +2422,20 @@ ParameterGroupComponent::ParameterGroupComponent(const String & name_, int group
m_enableButton->setColour(DrawableButton::backgroundOnColourId, Colours::transparentBlack); m_enableButton->setColour(DrawableButton::backgroundOnColourId, Colours::transparentBlack);
m_enableButton->onClick = [this]() { m_enableButton->onClick = [this]() {
auto order = m_proc->getStretchSource()->getSpectrumProcessOrder(); if (groupId < 0) {
for (int i=0; i < order.size(); ++i) { if (EnabledChangedCallback)
if (order[i].m_index == groupId) { EnabledChangedCallback();
toggleBool(order[i].m_enabled); }
m_enableButton->setToggleState(order[i].m_enabled->get(), dontSendNotification); else {
if (EnabledChangedCallback) auto order = m_proc->getStretchSource()->getSpectrumProcessOrder();
EnabledChangedCallback(); for (int i=0; i < order.size(); ++i) {
break; if (order[i].m_index == groupId) {
toggleBool(order[i].m_enabled);
m_enableButton->setToggleState(order[i].m_enabled->get(), dontSendNotification);
if (EnabledChangedCallback)
EnabledChangedCallback();
break;
}
} }
} }
}; };
@ -2291,7 +2456,6 @@ int ParameterGroupComponent::getMinimumHeight(int forWidth)
return m_minHeight; return m_minHeight;
} }
void ParameterGroupComponent::addParameterComponent(ParameterComponent * pcomp) void ParameterGroupComponent::addParameterComponent(ParameterComponent * pcomp)
{ {
if (pcomp) { if (pcomp) {
@ -2381,7 +2545,7 @@ void ParameterGroupComponent::resized()
void ParameterGroupComponent::paint(Graphics & g) void ParameterGroupComponent::paint(Graphics & g)
{ {
if (m_enableButton && m_enableButton->getToggleState()) { if (m_enableButton && groupId >= 0 && m_enableButton->getToggleState()) {
g.setColour(m_selbgcolor); g.setColour(m_selbgcolor);
} else { } else {
g.setColour(m_bgcolor); g.setColour(m_bgcolor);
@ -2394,7 +2558,7 @@ void ParameterGroupComponent::updateParameterComponents()
{ {
bool enabled = true; bool enabled = true;
if (m_enableButton) { if (m_enableButton && groupId >= 0) {
auto order = m_proc->getStretchSource()->getSpectrumProcessOrder(); auto order = m_proc->getStretchSource()->getSpectrumProcessOrder();
for (int i=0; i < order.size(); ++i) { for (int i=0; i < order.size(); ++i) {
if (order[i].m_index == groupId) { if (order[i].m_index == groupId) {

View File

@ -85,7 +85,7 @@ class ParameterComponent : public Component,
public Slider::Listener, public Button::Listener public Slider::Listener, public Button::Listener
{ {
public: public:
ParameterComponent(AudioProcessorParameter* par, bool notifyOnlyOnRelease); ParameterComponent(AudioProcessorParameter* par, bool notifyOnlyOnRelease, bool useDrawableToggle=false);
void resized() override; void resized() override;
void sliderValueChanged(Slider* slid) override; void sliderValueChanged(Slider* slid) override;
void sliderDragStarted(Slider* slid) override; void sliderDragStarted(Slider* slid) override;
@ -94,7 +94,10 @@ public:
void updateComponent(); void updateComponent();
void setHighLighted(bool b); void setHighLighted(bool b);
int m_group_id = -1; int m_group_id = -1;
Slider* getSlider() { return m_slider.get(); } Slider* getSlider() const { return m_slider.get(); }
DrawableButton* getDrawableButton() const { return m_drawtogglebut.get(); }
ToggleButton* getToggleButton() const { return m_togglebut.get(); }
private: private:
Label m_label; Label m_label;
@ -102,6 +105,7 @@ private:
std::unique_ptr<MySlider> m_slider; std::unique_ptr<MySlider> m_slider;
std::unique_ptr<ComboBox> m_combobox; std::unique_ptr<ComboBox> m_combobox;
std::unique_ptr<ToggleButton> m_togglebut; std::unique_ptr<ToggleButton> m_togglebut;
std::unique_ptr<DrawableButton> m_drawtogglebut;
bool m_notify_only_on_release = false; bool m_notify_only_on_release = false;
bool m_dragging = false; bool m_dragging = false;
Colour m_labeldefcolor; Colour m_labeldefcolor;
@ -124,6 +128,9 @@ public:
void setBackgroundColor(Colour col) { m_bgcolor = col; } void setBackgroundColor(Colour col) { m_bgcolor = col; }
Colour getBackgroundColor() const { return m_bgcolor; } Colour getBackgroundColor() const { return m_bgcolor; }
void setToggleEnabled(bool flag){ if (m_enableButton) m_enableButton->setToggleState(flag, dontSendNotification); }
bool getToggleEnabled() const { if (m_enableButton) return m_enableButton->getToggleState(); return false; }
String name; String name;
int groupId = -1; int groupId = -1;
@ -305,7 +312,9 @@ public:
private: private:
EnvelopeComponent m_env; EnvelopeComponent m_env;
uptrvec<ParameterComponent> m_parcomps; uptrvec<ParameterComponent> m_parcomps;
CriticalSection* m_cs = nullptr; std::unique_ptr<Viewport> m_viewport;
Component m_container;
CriticalSection* m_cs = nullptr;
PaulstretchpluginAudioProcessor* m_proc = nullptr; PaulstretchpluginAudioProcessor* m_proc = nullptr;
int m_slidwidth = 350; int m_slidwidth = 350;
}; };
@ -563,7 +572,7 @@ private:
TextButton m_import_button; TextButton m_import_button;
TextButton m_settings_button; TextButton m_settings_button;
TextButton m_render_button; TextButton m_render_button;
TextButton m_rewind_button; std::unique_ptr<DrawableButton> m_rewind_button;
Label m_info_label; Label m_info_label;
SpectralChainEditor m_spec_order_ed; SpectralChainEditor m_spec_order_ed;
double m_lastspec_select_time = 0.0; double m_lastspec_select_time = 0.0;
@ -587,6 +596,32 @@ private:
std::unique_ptr<FileChooser> fileChooser; std::unique_ptr<FileChooser> fileChooser;
WildcardFileFilter m_filefilter; WildcardFileFilter m_filefilter;
class CustomTooltipWindow : public TooltipWindow
{
public:
CustomTooltipWindow(PaulstretchpluginAudioProcessorEditor * parent_, Component * viewparent) : TooltipWindow(viewparent), parent(parent_) {}
virtual ~CustomTooltipWindow() {
if (parent) {
// reset our smart pointer without a delete! someone else is deleting it
parent->tooltipWindow.release();
}
}
/*
String getTipFor (Component& c) override
{
if (parent->popTip && parent->popTip->isShowing()) {
return {};
}
return TooltipWindow::getTipFor(c);
}
*/
PaulstretchpluginAudioProcessorEditor * parent;
};
std::unique_ptr<CustomTooltipWindow> tooltipWindow;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PaulstretchpluginAudioProcessorEditor) JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PaulstretchpluginAudioProcessorEditor)
}; };

View File

@ -227,7 +227,7 @@ PaulstretchpluginAudioProcessor::~PaulstretchpluginAudioProcessor()
if (m_thumb) if (m_thumb)
m_thumb->removeAllChangeListeners(); m_thumb->removeAllChangeListeners();
m_thumb = nullptr; m_thumb = nullptr;
m_bufferingthread.stopThread(1000); m_bufferingthread.stopThread(3000);
} }
void PaulstretchpluginAudioProcessor::resetParameters() void PaulstretchpluginAudioProcessor::resetParameters()
@ -489,8 +489,10 @@ void PaulstretchpluginAudioProcessor::startplay(Range<double> playrange, int num
m_bufferingthread, false, bufamt, numoutchans, false); m_bufferingthread, false, bufamt, numoutchans, false);
m_recreate_buffering_source = false; m_recreate_buffering_source = false;
} }
if (m_bufferingthread.isThreadRunning() == false) if (m_bufferingthread.isThreadRunning() == false) {
m_bufferingthread.startThread(); m_bufferingthread.setPriority(8);
m_bufferingthread.startThread();
}
m_stretch_source->setNumOutChannels(numoutchans); m_stretch_source->setNumOutChannels(numoutchans);
m_stretch_source->setFFTSize(m_fft_size_to_use); m_stretch_source->setFFTSize(m_fft_size_to_use);
m_stretch_source->setProcessParameters(&m_ppar); m_stretch_source->setProcessParameters(&m_ppar);

View File

@ -277,7 +277,7 @@ private:
std::vector<int> m_bufamounts{ 4096,8192,16384,32768,65536,262144 }; std::vector<int> m_bufamounts{ 4096,8192,16384,32768,65536,262144 };
ProcessParameters m_ppar; ProcessParameters m_ppar;
int mPluginWindowWidth = 820; int mPluginWindowWidth = 820;
int mPluginWindowHeight = 700; int mPluginWindowHeight = 710;
void setFFTSize(double size); void setFFTSize(double size);
void startplay(Range<double> playrange, int numoutchans, int maxBlockSize, String& err); void startplay(Range<double> playrange, int numoutchans, int maxBlockSize, String& err);

View File

@ -25,6 +25,14 @@ EnvelopeComponent::EnvelopeComponent(CriticalSection* cs) : m_cs(cs)
XFromNormalized = [](double x) { return x; }; XFromNormalized = [](double x) { return x; };
addChildComponent(&m_bubble); addChildComponent(&m_bubble);
setOpaque(true); setOpaque(true);
//#if JUCE_IOS
m_menubutton.setButtonText("...");
m_menubutton.onClick = [this]() {
showPopupMenu();
};
addAndMakeVisible(&m_menubutton);
//#endif
} }
EnvelopeComponent::~EnvelopeComponent() EnvelopeComponent::~EnvelopeComponent()
@ -50,6 +58,16 @@ void EnvelopeComponent::show_bubble(int x, int y, const envelope_point& node)
m_bubble.showAt({ x,y,100,20 }, temp , 5000); m_bubble.showAt({ x,y,100,20 }, temp , 5000);
} }
void EnvelopeComponent::resized()
{
//#if JUCE_IOS
int butw = 38;
int buth = 38;
m_menubutton.setBounds(getWidth() - butw - 1, 1, butw, buth);
//#endif
}
void EnvelopeComponent::paint(Graphics& g) void EnvelopeComponent::paint(Graphics& g)
{ {
float targsize = 8.0; float targsize = 8.0;
@ -223,51 +241,57 @@ void EnvelopeComponent::mouseMove(const MouseEvent & ev)
} }
} }
void EnvelopeComponent::showPopupMenu()
{
PopupMenu menu;
PopupMenu::Options opts;
menu.addItem(1, "Reset");
menu.addItem(2, "Invert");
menu.addItem(3, "Wrap envelope X transform", true, m_envelope->m_transform_wrap_x);
menu.addItem(4, "Envelope Y random linear interpolation", true, m_envelope->m_transform_y_random_linear_interpolation);
#if JUCE_IOS
opts = opts.withStandardItemHeight(34);
#endif
auto callback = [this] (int r) {
if (r == 1)
{
ScopedLock locker(*m_cs);
m_envelope->ResetEnvelope();
}
if (r == 2)
{
for (int i = 0; i < m_envelope->GetNumPoints(); ++i)
{
double val = 1.0 - m_envelope->GetNodeAtIndex(i).pt_y;
m_envelope->GetNodeAtIndex(i).pt_y = val;
}
}
if (r == 3)
{
toggleBool(m_envelope->m_transform_wrap_x);
}
if (r == 4)
{
toggleBool(m_envelope->m_transform_y_random_linear_interpolation);
}
repaint();
};
if (!JUCEApplicationBase::isStandaloneApp()) {
opts = opts.withParentComponent(this);
}
menu.showMenuAsync(opts, callback);
}
void EnvelopeComponent::mouseDown(const MouseEvent & ev) void EnvelopeComponent::mouseDown(const MouseEvent & ev)
{ {
if (m_envelope == nullptr) if (m_envelope == nullptr)
return; return;
if (ev.mods.isRightButtonDown() == true) if (ev.mods.isRightButtonDown() == true)
{ {
PopupMenu menu; showPopupMenu();
PopupMenu::Options opts;
menu.addItem(1, "Reset");
menu.addItem(2, "Invert");
menu.addItem(3, "Wrap envelope X transform", true, m_envelope->m_transform_wrap_x);
menu.addItem(4, "Envelope Y random linear interpolation", true, m_envelope->m_transform_y_random_linear_interpolation);
auto callback = [this] (int r) {
if (r == 1)
{
ScopedLock locker(*m_cs);
m_envelope->ResetEnvelope();
}
if (r == 2)
{
for (int i = 0; i < m_envelope->GetNumPoints(); ++i)
{
double val = 1.0 - m_envelope->GetNodeAtIndex(i).pt_y;
m_envelope->GetNodeAtIndex(i).pt_y = val;
}
}
if (r == 3)
{
toggleBool(m_envelope->m_transform_wrap_x);
}
if (r == 4)
{
toggleBool(m_envelope->m_transform_y_random_linear_interpolation);
}
repaint();
};
if (!JUCEApplicationBase::isStandaloneApp()) {
opts = opts.withParentComponent(this);
}
menu.showMenuAsync(opts, callback);
return; return;
} }
m_node_to_drag = find_hot_envelope_point(ev.x, ev.y); m_node_to_drag = find_hot_envelope_point(ev.x, ev.y);
@ -312,7 +336,9 @@ void EnvelopeComponent::mouseDown(const MouseEvent & ev)
m_envelope->SortNodes(); m_envelope->SortNodes();
m_cs->exit(); m_cs->exit();
m_envelope->updateMinMaxValues(); m_envelope->updateMinMaxValues();
m_mouse_down = false;
m_node_to_drag = find_hot_envelope_point(ev.x, ev.y);
//m_mouse_down = false;
OnEnvelopeEdited(m_envelope.get()); OnEnvelopeEdited(m_envelope.get());
repaint(); repaint();
} }
@ -413,7 +439,7 @@ int EnvelopeComponent::find_hot_envelope_point(double xcor, double ycor)
double ptycor = (double)getHeight() - jmap(pt.pt_y, m_view_start_value, m_view_end_value, 0.0, (double)getHeight()); double ptycor = (double)getHeight() - jmap(pt.pt_y, m_view_start_value, m_view_end_value, 0.0, (double)getHeight());
float targsize = 8.0; float targsize = 8.0;
#if JUCE_IOS #if JUCE_IOS
targsize = 16.0; targsize = 20;
#endif #endif
juce::Rectangle<double> target(ptxcor - targsize*0.5f, ptycor - targsize*0.5, targsize, targsize); juce::Rectangle<double> target(ptxcor - targsize*0.5f, ptycor - targsize*0.5, targsize, targsize);
if (target.contains(xcor, ycor) == true) if (target.contains(xcor, ycor) == true)
@ -428,7 +454,7 @@ int EnvelopeComponent::findHotEnvelopeSegment(double xcor, double ycor, bool det
{ {
float targsize = 8.0; float targsize = 8.0;
#if JUCE_IOS #if JUCE_IOS
targsize = 16.0; targsize = 20.0;
#endif #endif
if (m_envelope == nullptr) if (m_envelope == nullptr)

View File

@ -32,6 +32,7 @@ public:
EnvelopeComponent(CriticalSection* cs); EnvelopeComponent(CriticalSection* cs);
~EnvelopeComponent(); ~EnvelopeComponent();
void paint(Graphics& g) override; void paint(Graphics& g) override;
void resized() override;
void set_envelope(std::shared_ptr<breakpoint_envelope> env, String name = String()); void set_envelope(std::shared_ptr<breakpoint_envelope> env, String name = String());
std::shared_ptr<breakpoint_envelope> get_envelope() { return m_envelope; } std::shared_ptr<breakpoint_envelope> get_envelope() { return m_envelope; }
String get_name() { return m_name; } String get_name() { return m_name; }
@ -53,6 +54,8 @@ public:
void timerCallback(int id) override; void timerCallback(int id) override;
//String getTooltip() override; //String getTooltip() override;
private: private:
void showPopupMenu();
std::shared_ptr<breakpoint_envelope> m_envelope; std::shared_ptr<breakpoint_envelope> m_envelope;
String m_name; String m_name;
Colour m_env_color{ Colours::yellow }; Colour m_env_color{ Colours::yellow };
@ -68,6 +71,7 @@ private:
int m_node_that_was_dragged = -1; int m_node_that_was_dragged = -1;
String m_last_tip; String m_last_tip;
BubbleMessageComponent m_bubble; BubbleMessageComponent m_bubble;
TextButton m_menubutton;
void show_bubble(int x, int y, const envelope_point &node); void show_bubble(int x, int y, const envelope_point &node);
CriticalSection* m_cs = nullptr; CriticalSection* m_cs = nullptr;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(EnvelopeComponent) JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(EnvelopeComponent)

119
images/freeze.svg Normal file
View File

@ -0,0 +1,119 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.0"
width="30"
height="30"
id="svg1437"
sodipodi:docname="freeze.svg"
inkscape:version="1.1 (c4e8f9e, 2021-05-24)"
inkscape:export-filename="/Users/jesse/src/sonoaudio/tonalenergy/images/circleslash_icon.png"
inkscape:export-xdpi="102.4"
inkscape:export-ydpi="102.4"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<metadata
id="metadata4595">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
inkscape:snap-bbox="false"
pagecolor="#000000"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1124"
inkscape:window-height="686"
id="namedview4593"
showgrid="false"
inkscape:snap-nodes="true"
inkscape:snap-global="true"
inkscape:zoom="6.7315007"
inkscape:cx="25.031565"
inkscape:cy="12.92431"
inkscape:window-x="2680"
inkscape:window-y="314"
inkscape:window-maximized="0"
inkscape:current-layer="svg1437"
inkscape:pagecheckerboard="true"
inkscape:document-rotation="0"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0">
<inkscape:grid
id="grid11889"
type="xygrid" />
</sodipodi:namedview>
<defs
id="defs1440">
<marker
inkscape:isstock="true"
style="overflow:visible"
id="EmptyTriangleInS"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="EmptyTriangleInS">
<path
transform="scale(-0.2) translate(-3.0,0)"
style="fill-rule:evenodd;fill:#cccccc;stroke:#cccccc;stroke-width:1pt;stroke-opacity:1;fill-opacity:1"
d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
id="path1125" />
</marker>
<marker
inkscape:isstock="true"
style="overflow:visible;"
id="Arrow1Send"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Send">
<path
transform="scale(0.2) rotate(180) translate(6,0)"
style="fill-rule:evenodd;stroke:#cccccc;stroke-width:1pt;stroke-opacity:1;fill:#cccccc;fill-opacity:1"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path983" />
</marker>
<marker
inkscape:isstock="true"
style="overflow:visible"
id="marker2864"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="TriangleInM">
<path
transform="scale(-0.4)"
style="fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:#cccccc;stroke-width:1pt;stroke-opacity:1"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path2862" />
</marker>
</defs>
<rect
y="0"
x="0"
height="30"
width="30"
id="rect9748"
style="opacity:1;fill:#000000;fill-opacity:0;stroke:none;stroke-width:0.214092;stroke-linecap:round;stroke-opacity:1" />
<path
d="m 25.396273,19.723459 -1.726856,-0.997513 a 4.5472171,4.5472171 0 0 1 1.06354,-0.812638 1.1173771,1.1173771 0 0 0 -1.080808,-1.955918 6.7865425,6.7865425 0 0 0 -1.95795,1.630355 l -4.475095,-2.587744 4.47408,-2.583172 a 6.7784161,6.7784161 0 0 0 1.957949,1.630354 1.1173771,1.1173771 0 1 0 1.080809,-1.955917 4.557883,4.557883 0 0 1 -1.06354,-0.812638 l 1.726855,-0.997513 A 1.1173771,1.1173771 0 1 0 24.278896,8.346529 L 22.55204,9.343534 A 4.557883,4.557883 0 0 1 22.378339,8.015379 1.1173771,1.1173771 0 0 0 21.282294,6.873623 h -0.02082 a 1.1173771,1.1173771 0 0 0 -1.117377,1.096553 6.7860346,6.7860346 0 0 0 0.431713,2.509527 L 16.101731,13.0644 V 7.898562 A 6.7804477,6.7804477 0 0 0 18.49241,7.018374 1.117458,1.117458 0 0 0 17.338972,5.104104 4.5487408,4.5487408 0 0 1 16.101731,5.617589 V 3.9278069 a 1.1173771,1.1173771 0 0 0 -2.234754,0 V 5.617589 a 4.5487408,4.5487408 0 0 1 -1.237242,-0.513485 1.117458,1.117458 0 1 0 -1.153438,1.91427 6.7804477,6.7804477 0 0 0 2.39068,0.880188 V 13.0644 L 9.3928969,10.479703 A 6.7860346,6.7860346 0 0 0 9.8256269,7.96916 1.1173771,1.1173771 0 0 0 8.7082489,6.872607 h -0.02184 A 1.1173771,1.1173771 0 0 0 7.5898549,8.010808 4.557883,4.557883 0 0 1 7.4166619,9.340995 L 5.6898061,8.346529 a 1.1173771,1.1173771 0 1 0 -1.117377,1.935094 l 1.726856,0.997513 a 4.557883,4.557883 0 0 1 -1.06354,0.812638 1.1173771,1.1173771 0 1 0 1.080808,1.955917 6.7865425,6.7865425 0 0 0 1.9579498,-1.630354 l 4.4750951,2.582664 -4.4740791,2.583173 a 6.7865425,6.7865425 0 0 0 -1.9579498,-1.630355 1.1173771,1.1173771 0 1 0 -1.080808,1.955918 4.557883,4.557883 0 0 1 1.06354,0.812638 l -1.727872,1.002084 a 1.1173771,1.1173771 0 1 0 1.117377,1.935094 l 1.7268558,-0.997005 a 4.557883,4.557883 0 0 1 0.173701,1.328155 1.1173771,1.1173771 0 0 0 1.096046,1.136677 h 0.02082 A 1.1173771,1.1173771 0 0 0 9.8246059,22.029827 6.7860346,6.7860346 0 0 0 9.3928919,19.5203 l 4.4740801,-2.584697 v 5.165838 a 6.7804477,6.7804477 0 0 0 -2.39068,0.880188 1.117458,1.117458 0 1 0 1.153438,1.91427 4.5487408,4.5487408 0 0 1 1.237242,-0.513485 v 1.689779 a 1.1173771,1.1173771 0 0 0 2.234754,0 v -1.689779 a 4.5487408,4.5487408 0 0 1 1.237241,0.513485 1.117458,1.117458 0 0 0 1.153438,-1.91427 6.7804477,6.7804477 0 0 0 -2.390679,-0.880188 v -5.165838 l 4.474079,2.584697 a 6.7860346,6.7860346 0 0 0 -0.432729,2.510543 1.1173771,1.1173771 0 0 0 1.117377,1.096553 h 0.02184 a 1.1173771,1.1173771 0 0 0 1.096553,-1.138201 4.557883,4.557883 0 0 1 0.173193,-1.330187 l 1.726856,0.997006 a 1.1173771,1.1173771 0 1 0 1.117378,-1.932555 z"
id="path7816"
style="fill:#cdcdcd;fill-opacity:1;stroke-width:0.0507899" />
</svg>

After

Width:  |  Height:  |  Size: 6.1 KiB

137
images/loop_icon.svg Normal file
View File

@ -0,0 +1,137 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
inkscape:export-ydpi="102.4"
inkscape:export-xdpi="102.4"
inkscape:export-filename="/Users/jesse/src/sonoaudio/tonalenergy/images/circleslash_icon.png"
inkscape:version="1.1 (c4e8f9e, 2021-05-24)"
sodipodi:docname="loop_icon.svg"
id="svg1437"
height="30"
width="30"
version="1.0"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<metadata
id="metadata4595">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
fit-margin-bottom="0"
fit-margin-right="0"
fit-margin-left="0"
fit-margin-top="0"
inkscape:document-rotation="0"
inkscape:pagecheckerboard="true"
inkscape:current-layer="svg1437"
inkscape:window-maximized="0"
inkscape:window-y="512"
inkscape:window-x="2446"
inkscape:cy="17.689025"
inkscape:cx="10.200241"
inkscape:zoom="7.7449151"
inkscape:snap-global="true"
inkscape:snap-nodes="true"
showgrid="false"
id="namedview4593"
inkscape:window-height="686"
inkscape:window-width="1145"
inkscape:pageshadow="2"
inkscape:pageopacity="0"
guidetolerance="10"
gridtolerance="10"
objecttolerance="10"
borderopacity="1"
bordercolor="#666666"
pagecolor="#000000"
inkscape:snap-bbox="false">
<inkscape:grid
type="xygrid"
id="grid11889" />
</sodipodi:namedview>
<defs
id="defs1440">
<marker
inkscape:stockid="EmptyTriangleInS"
orient="auto"
refY="0.0"
refX="0.0"
id="EmptyTriangleInS"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1125"
d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
style="fill-rule:evenodd;fill:#cccccc;stroke:#cccccc;stroke-width:1pt;stroke-opacity:1;fill-opacity:1"
transform="scale(-0.2) translate(-3.0,0)" />
</marker>
<marker
inkscape:stockid="Arrow1Send"
orient="auto"
refY="0.0"
refX="0.0"
id="Arrow1Send"
style="overflow:visible;"
inkscape:isstock="true">
<path
id="path983"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
style="fill-rule:evenodd;stroke:#cccccc;stroke-width:1pt;stroke-opacity:1;fill:#cccccc;fill-opacity:1"
transform="scale(0.2) rotate(180) translate(6,0)" />
</marker>
<marker
inkscape:stockid="TriangleInM"
orient="auto"
refY="0"
refX="0"
id="marker2864"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path2862"
d="M 5.77,0 -2.88,5 V -5 Z"
style="fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:#cccccc;stroke-width:1pt;stroke-opacity:1"
transform="scale(-0.4)" />
</marker>
</defs>
<rect
style="fill:#000000;fill-opacity:0;stroke:none;stroke-width:0.214092;stroke-linecap:round;stroke-opacity:1"
id="rect9748"
width="30"
height="30"
x="0"
y="0" />
<g
id="g9133">
<polyline
id="polyline2221"
style="fill:none;fill-opacity:1;stroke:#cccccc;stroke-width:37.1429;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
points="320 120 368 168 320 216"
transform="matrix(0.06730769,0,0,0.06730769,-1.585184,-4.2307686)" />
<path
id="path2223"
style="fill:none;fill-opacity:1;stroke:#cccccc;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 22.107123,7.0769233 H 8.107124 A 5.400769,5.400769 0 0 0 2.722509,12.461539 v 1.076923" />
<polyline
id="polyline2225"
style="fill:none;fill-opacity:1;stroke:#cccccc;stroke-width:37.1429;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
points="192 392 144 344 192 296"
transform="matrix(0.06730769,0,0,0.06730769,-2.747237,-0.2307686)" />
<path
id="path2227"
style="fill:none;fill-opacity:1;stroke:#cccccc;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 8.021994,22.923077 h 13.999999 a 5.400769,5.400769 0 0 0 5.384616,-5.384615 v -1.076923" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.8 KiB

74
images/passthru.svg Normal file
View File

@ -0,0 +1,74 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
inkscape:version="1.1 (c4e8f9e, 2021-05-24)"
sodipodi:docname="passthru.svg"
xml:space="preserve"
viewBox="0 0 875 450"
height="450"
width="875"
y="0px"
x="0px"
id="Layer_1"
version="1.1"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"><defs
id="defs976" /><sodipodi:namedview
fit-margin-bottom="0"
fit-margin-right="0"
fit-margin-top="0"
fit-margin-left="0"
inkscape:current-layer="Layer_1"
inkscape:window-maximized="0"
inkscape:window-y="132"
inkscape:window-x="1788"
inkscape:cy="96.472959"
inkscape:cx="375.5889"
inkscape:zoom="0.53382835"
showgrid="false"
id="namedview974"
inkscape:window-height="785"
inkscape:window-width="1558"
inkscape:pageshadow="2"
inkscape:pageopacity="0"
guidetolerance="10"
gridtolerance="10"
objecttolerance="10"
borderopacity="1"
bordercolor="#666666"
pagecolor="#656565"
inkscape:document-rotation="0"
inkscape:pagecheckerboard="true"
width="875px" /><rect
y="0"
x="0"
height="450"
width="825"
id="rect8876"
style="fill:#000000;fill-opacity:0;stroke:none;stroke-width:26.396;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /><metadata
id="metadata971"><rdf:RDF><rdf:Description
dc:language="en"
dc:format="image/svg+xml"
dc:date="2017-09-24"
dc:publisher="Iconscout"
dc:description="ios,arrow,thin,right"
dc:title="ios,arrow,thin,right"
about="https://iconscout.com/legal#licenses"><dc:creator><rdf:Bag><rdf:li>Benjamin J Sperry</rdf:li></rdf:Bag></dc:creator></rdf:Description><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><path
style="fill:#cccccc;fill-opacity:1;stroke-width:0.0998643"
d="m 192.68345,331.50477 v 75.49708 c 0,5.79209 -4.69361,10.38583 -10.38584,10.38583 -5.79211,0 -10.38585,-4.6936 -10.38585,-10.38583 V 331.50477 C 140.05521,329.0082 111.39428,314.92739 90.02343,293.55651 66.35571,269.8888 51.67572,237.23332 51.67572,201.28233 c 0,-5.7921 4.6936,-10.38585 10.38583,-10.38585 5.79211,0 10.38586,4.69361 10.38586,10.38585 0,30.15887 12.3831,57.62146 32.256,77.59419 19.87291,19.87292 47.33546,32.25604 77.5942,32.25604 30.15889,0 57.62145,-12.38312 77.59421,-32.25604 19.8729,-19.87288 32.25602,-47.33542 32.25602,-77.59419 0,-5.7921 4.6936,-10.38585 10.38583,-10.38585 5.79212,0 10.38586,4.69361 10.38586,10.38585 0,35.95099 -14.68,68.60647 -38.34772,92.27418 -21.37086,21.37088 -50.03178,35.45169 -81.88836,37.94826 z M 182.99666,32.61232 c 19.97277,0 38.14798,8.18881 51.33001,21.37084 13.18205,13.18203 21.37086,31.35726 21.37086,51.33003 v 93.97186 c 0,19.97278 -8.18881,38.14802 -21.37086,51.33002 -13.18203,13.18202 -31.35724,21.37086 -51.33001,21.37086 -19.97277,0 -38.14799,-8.18884 -51.33002,-21.37086 -13.18203,-13.182 -21.37085,-31.35724 -21.37085,-51.33002 v -93.97186 c 0,-19.97277 8.18882,-38.148 21.37085,-51.33003 13.18203,-13.18203 31.35725,-21.37084 51.33002,-21.37084 z m 36.55016,36.05084 c -9.38721,-9.38721 -22.36949,-15.17932 -36.55016,-15.17932 -14.28053,0 -27.16297,5.79211 -36.55017,15.17931 -9.38719,9.3872 -15.1793,22.36949 -15.1793,36.55016 v 93.9719 c 0,14.28052 5.79211,27.16295 15.1793,36.55017 9.3872,9.38719 22.3695,15.17927 36.55017,15.17927 14.28052,0 27.16295,-5.79208 36.55016,-15.17927 9.38721,-9.38721 15.17932,-22.36952 15.17932,-36.55016 v -93.9719 c 0,-14.28051 -5.79211,-27.16297 -15.17932,-36.55016 z"
fill-rule="nonzero"
id="path7563" /><path
id="path969"
d="m 395.75001,278.70692 c -3.1,-3.1 -3,-8 0,-11.3 l 26.40003,-34.4 h -70.59998 c -4.4,0 -8,-3.6 -8,-8 0,-4.4 3.6,-8 8,-8 h 70.59998 l -26.30003,-34.4 c -2.9,-3.4 -3.2,-8.1 -0.1,-11.2 3.1,-3.1 8.5,-3.3 11.4,-0.1 0,0 39.19999,47 39.99999,48 0.8,1 2.4,2.8 2.4,5.7 0,2.9 -1.6,4.9 -2.4,5.7 -0.8,0.8 -39.99999,48 -39.99999,48 -1.5,1.5 -3.6,2.3 -5.7,2.3 -2.1,0 -4.1,-0.8 -5.7,-2.3 z"
style="fill:#a9afb8;fill-opacity:0.848083"
sodipodi:nodetypes="cccsssccscssscsc" /><path
id="path7431"
fill="#e5e5e5"
d="m 494.477,305.677 c 6.089,3.582 8.06,11.46301 4.299,17.55201 -3.583,6.087 -11.463,8.061 -17.552,4.299 -5.91,-3.582 -10.924,-8.775 -14.506,-14.86501 -3.401,-5.909 -5.372,-12.895 -5.372,-20.057 V 171.185 c 0,-11.283 4.655,-21.491 11.999,-28.833 7.342,-7.343 17.55,-11.998 28.833,-11.998 h 94.557 l 80.59,-81.12701 c 5.015,-5.016 13.074,-5.016 18.089,0 2.507,2.507 3.761,5.73 3.761,9.133 V 124.801 c 0,7.164 -5.73,12.896 -12.895,12.896 -7.162,0 -12.895,-5.731 -12.895,-12.896 V 89.342 L 611.6,151.486 c -2.328,2.686 -5.91,4.478 -9.67,4.478 h -99.932 c -4.119,0 -7.879,1.791 -10.745,4.477 -2.686,2.687 -4.478,6.626 -4.478,10.746 v 121.421 c 0,2.686 0.717,5.191 1.97,7.343 1.254,2.326 3.225,4.298 5.553,5.552 z m 8.418,86.86001 c -5.015,5.015 -13.074,5.015 -18.089,0 -5.014,-5.016 -5.014,-13.075 0,-18.088 L 749.497,109.757 c 5.015,-5.014 13.074,-5.014 18.089,0 5.015,5.015 5.015,13.074 0,18.088 z M 673.743,256.789 c 0,-7.164 5.732,-12.895 12.896,-12.895 7.164,0 12.895,5.73 12.895,12.895 v 134.85101 c 0,7.165 -5.731,12.895 -12.895,12.895 -3.402,0 -6.627,-1.432 -8.775,-3.582 l -66.801,-54.443 c -5.551,-4.476 -6.267,-12.536 -1.79,-17.906 4.478,-5.552 12.537,-6.269 17.91,-1.792 l 46.739,37.966 V 256.788 Z"
style="fill:#cccccc;fill-opacity:1" /></svg>

After

Width:  |  Height:  |  Size: 5.7 KiB

View File

@ -0,0 +1,75 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
inkscape:version="1.1 (c4e8f9e, 2021-05-24)"
sodipodi:docname="passthru_enabled.svg"
xml:space="preserve"
viewBox="0 0 875 450"
height="450"
width="875"
y="0px"
x="0px"
id="Layer_1"
version="1.1"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"><defs
id="defs976" /><sodipodi:namedview
fit-margin-bottom="0"
fit-margin-right="0"
fit-margin-top="0"
fit-margin-left="0"
inkscape:current-layer="Layer_1"
inkscape:window-maximized="0"
inkscape:window-y="787"
inkscape:window-x="1836"
inkscape:cy="218.45096"
inkscape:cx="281.6623"
inkscape:zoom="0.53787816"
showgrid="false"
id="namedview974"
inkscape:window-height="785"
inkscape:window-width="1558"
inkscape:pageshadow="2"
inkscape:pageopacity="0"
guidetolerance="10"
gridtolerance="10"
objecttolerance="10"
borderopacity="1"
bordercolor="#666666"
pagecolor="#656565"
inkscape:document-rotation="0"
inkscape:pagecheckerboard="true"
width="875px" /><rect
y="0"
x="0"
height="450"
width="875"
id="rect8876"
style="fill:#000000;fill-opacity:0;stroke:none;stroke-width:27.184;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /><metadata
id="metadata971"><rdf:RDF><rdf:Description
dc:language="en"
dc:format="image/svg+xml"
dc:date="2017-09-24"
dc:publisher="Iconscout"
dc:description="ios,arrow,thin,right"
dc:title="ios,arrow,thin,right"
about="https://iconscout.com/legal#licenses"><dc:creator><rdf:Bag><rdf:li>Benjamin J Sperry</rdf:li></rdf:Bag></dc:creator></rdf:Description><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><path
style="fill:#e6e6e6;fill-opacity:1;stroke-width:0.0998643"
d="m 192.68345,331.50477 v 75.49708 c 0,5.79209 -4.69361,10.38583 -10.38584,10.38583 -5.79211,0 -10.38585,-4.6936 -10.38585,-10.38583 v -75.49708 c -31.85655,-2.49657 -60.51748,-16.57738 -81.888332,-37.94826 -23.66772,-23.66771 -38.34771,-56.32319 -38.34771,-92.27418 0,-5.7921 4.6936,-10.38585 10.38583,-10.38585 5.79211,0 10.38586,4.69361 10.38586,10.38585 0,30.15887 12.3831,57.62146 32.256002,77.59419 19.87291,19.87292 47.33546,32.25604 77.5942,32.25604 30.15889,0 57.62145,-12.38312 77.59421,-32.25604 19.8729,-19.87288 32.25602,-47.33542 32.25602,-77.59419 0,-5.7921 4.6936,-10.38585 10.38583,-10.38585 5.79212,0 10.38586,4.69361 10.38586,10.38585 0,35.95099 -14.68,68.60647 -38.34772,92.27418 -21.37086,21.37088 -50.03178,35.45169 -81.88836,37.94826 z M 182.99666,32.612321 c 19.97277,0 38.14798,8.188803 51.33001,21.370835 13.18205,13.182039 21.37086,31.357264 21.37086,51.330034 v 93.97186 c 0,19.97278 -8.18881,38.14802 -21.37086,51.33002 -13.18203,13.18202 -31.35724,21.37086 -51.33001,21.37086 -19.97277,0 -38.14799,-8.18884 -51.33002,-21.37086 -13.18203,-13.182 -21.37085,-31.35724 -21.37085,-51.33002 v -93.97186 c 0,-19.97277 8.18882,-38.147995 21.37085,-51.330034 13.18203,-13.182031 31.35725,-21.370835 51.33002,-21.370835 z m 36.55016,36.050834 c -9.38721,-9.387204 -22.36949,-15.17932 -36.55016,-15.17932 -14.28053,0 -27.16297,5.792115 -36.55017,15.179319 -9.38719,9.387195 -15.1793,22.369485 -15.1793,36.550156 v 93.9719 c 0,14.28052 5.79211,27.16295 15.1793,36.55017 9.3872,9.38719 22.3695,15.17927 36.55017,15.17927 14.28052,0 27.16295,-5.79208 36.55016,-15.17927 9.38721,-9.38721 15.17932,-22.36952 15.17932,-36.55016 v -93.9719 c 0,-14.280511 -5.79211,-27.162971 -15.17932,-36.550165 z"
fill-rule="nonzero"
id="path7563" /><path
id="path969"
d="m 727.75001,318.70692 c -3.1,-3.1 -3,-8 0,-11.3 l 66.40003,-74.4 H 363.55006 c -4.4,0 -8,-3.6 -8,-8 0,-4.4 3.6,-8 8,-8 h 430.59998 l -66.30003,-74.4 c -2.9,-3.4 -3.2,-8.1 -0.1,-11.2 3.1,-3.1 8.5,-3.3 11.4,-0.1 0,0 79.19999,87 79.99999,88 0.8,1 2.4,2.8 2.4,5.7 0,2.9 -1.6,4.9 -2.4,5.7 -0.8,0.8 -79.99999,88 -79.99999,88 -1.5,1.5 -3.6,2.3 -5.7,2.3 -2.1,0 -4.1,-0.8 -5.7,-2.3 z"
style="fill:#a5bde0;fill-opacity:1"
sodipodi:nodetypes="cccsssccscssscsc" /><path
id="path7296-9"
fill-rule="nonzero"
d="m 497.42647,130.62944 h 95.87809 l 85.25848,-82.214541 c 4.31551,-4.315516 13.31363,-4.315516 17.62915,0 2.21607,2.21607 3.26579,5.01532 3.26579,7.81457 V 392.78558 c 0,6.18168 -7.01533,12.03616 -13.08037,12.03616 -3.14916,0 -5.94841,-1.28299 -7.93121,-3.38242 l -98.55867,-75.15689 -84.49538,2 c -9.67804,0.22908 -18.54504,-3.96561 -24.95999,-10.38056 -6.41495,-6.41495 -9.28939,-17.27924 -9.28485,-26.95998 l 0.0568,-121.08854 c 0.005,-9.68075 4.73061,-22.54504 11.14556,-28.95999 6.41495,-6.41495 15.27924,-10.38056 24.95999,-10.38056 z M 601.3335,156.79018 H 499.42647 c -3.6157,0 -6.88149,1.51626 -9.33083,3.84896 -2.33271,2.33271 -3.84897,5.71514 -3.84897,9.33084 v 119.08854 c 0,3.6157 1.51626,6.88149 3.84897,9.33084 2.3327,2.33271 5.71513,3.84897 9.33083,3.84897 h 92.54351 c 2.56598,0 5.01532,0.81645 7.11476,2.56598 l 74.93712,61.35243 V 87.334029 l -64.29061,65.607181 c -1.98281,2.3327 -5.01533,3.84897 -8.39775,3.84897 z"
style="fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.116635;stroke-opacity:1"
sodipodi:nodetypes="cccssssccsssssccsscsscssccccs" /></svg>

After

Width:  |  Height:  |  Size: 5.6 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 44 KiB

129
images/pause_icon.svg Normal file
View File

@ -0,0 +1,129 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:export-ydpi="102.4"
inkscape:export-xdpi="102.4"
inkscape:export-filename="/Users/jesse/src/sonoaudio/tonalenergy/images/circleslash_icon.png"
inkscape:version="1.0 (4035a4f, 2020-05-01)"
sodipodi:docname="pause_icon.svg"
id="svg1437"
height="30"
width="30"
version="1.0">
<metadata
id="metadata4595">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
fit-margin-bottom="0"
fit-margin-right="0"
fit-margin-left="0"
fit-margin-top="0"
inkscape:document-rotation="0"
inkscape:pagecheckerboard="true"
inkscape:current-layer="svg1437"
inkscape:window-maximized="0"
inkscape:window-y="825"
inkscape:window-x="2586"
inkscape:cy="36.580348"
inkscape:cx="22.140088"
inkscape:zoom="4.4293493"
inkscape:snap-global="true"
inkscape:snap-nodes="true"
showgrid="false"
id="namedview4593"
inkscape:window-height="686"
inkscape:window-width="1145"
inkscape:pageshadow="2"
inkscape:pageopacity="0"
guidetolerance="10"
gridtolerance="10"
objecttolerance="10"
borderopacity="1"
bordercolor="#666666"
pagecolor="#000000"
inkscape:snap-bbox="false">
<inkscape:grid
type="xygrid"
id="grid11889" />
</sodipodi:namedview>
<defs
id="defs1440">
<marker
inkscape:stockid="EmptyTriangleInS"
orient="auto"
refY="0.0"
refX="0.0"
id="EmptyTriangleInS"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1125"
d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
style="fill-rule:evenodd;fill:#cccccc;stroke:#cccccc;stroke-width:1pt;stroke-opacity:1;fill-opacity:1"
transform="scale(-0.2) translate(-3.0,0)" />
</marker>
<marker
inkscape:stockid="Arrow1Send"
orient="auto"
refY="0.0"
refX="0.0"
id="Arrow1Send"
style="overflow:visible;"
inkscape:isstock="true">
<path
id="path983"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
style="fill-rule:evenodd;stroke:#cccccc;stroke-width:1pt;stroke-opacity:1;fill:#cccccc;fill-opacity:1"
transform="scale(0.2) rotate(180) translate(6,0)" />
</marker>
<marker
inkscape:stockid="TriangleInM"
orient="auto"
refY="0"
refX="0"
id="marker2864"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path2862"
d="M 5.77,0 -2.88,5 V -5 Z"
style="fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:#cccccc;stroke-width:1pt;stroke-opacity:1"
transform="scale(-0.4)" />
</marker>
</defs>
<rect
style="fill:#000000;fill-opacity:0;stroke:none;stroke-width:0.214092;stroke-linecap:round;stroke-opacity:1"
id="rect9748"
width="30"
height="30"
x="0"
y="0" />
<g
style="fill:#cccccc;fill-opacity:1"
transform="matrix(0.06875,0,0,0.06875,-2.6,-2.6)"
id="g6825">
<path
style="fill:#cccccc;fill-opacity:1"
id="path4251"
d="M 191,112 V 400 H 144 V 112 h 47 m 16,-16 h -79 v 320 h 79 z" />
<path
style="fill:#cccccc;fill-opacity:1"
id="path4253"
d="M 368,112 V 400 H 321 V 112 h 47 m 16,-16 h -79 v 320 h 79 z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

120
images/play_icon.svg Normal file
View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.0"
width="30"
height="30"
id="svg1437"
sodipodi:docname="play_icon.svg"
inkscape:version="1.0 (4035a4f, 2020-05-01)"
inkscape:export-filename="/Users/jesse/src/sonoaudio/tonalenergy/images/circleslash_icon.png"
inkscape:export-xdpi="102.4"
inkscape:export-ydpi="102.4">
<metadata
id="metadata4595">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
inkscape:snap-bbox="false"
pagecolor="#000000"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1145"
inkscape:window-height="686"
id="namedview4593"
showgrid="false"
inkscape:snap-nodes="true"
inkscape:snap-global="true"
inkscape:zoom="9.6637918"
inkscape:cx="16.163546"
inkscape:cy="22.25382"
inkscape:window-x="2422"
inkscape:window-y="762"
inkscape:window-maximized="0"
inkscape:current-layer="svg1437"
inkscape:pagecheckerboard="true"
inkscape:document-rotation="0"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0">
<inkscape:grid
id="grid11889"
type="xygrid" />
</sodipodi:namedview>
<defs
id="defs1440">
<marker
inkscape:isstock="true"
style="overflow:visible"
id="EmptyTriangleInS"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="EmptyTriangleInS">
<path
transform="scale(-0.2) translate(-3.0,0)"
style="fill-rule:evenodd;fill:#cccccc;stroke:#cccccc;stroke-width:1pt;stroke-opacity:1;fill-opacity:1"
d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
id="path1125" />
</marker>
<marker
inkscape:isstock="true"
style="overflow:visible;"
id="Arrow1Send"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Send">
<path
transform="scale(0.2) rotate(180) translate(6,0)"
style="fill-rule:evenodd;stroke:#cccccc;stroke-width:1pt;stroke-opacity:1;fill:#cccccc;fill-opacity:1"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path983" />
</marker>
<marker
inkscape:isstock="true"
style="overflow:visible"
id="marker2864"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="TriangleInM">
<path
transform="scale(-0.4)"
style="fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:#cccccc;stroke-width:1pt;stroke-opacity:1"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path2862" />
</marker>
</defs>
<rect
y="0"
x="0"
height="30"
width="30"
id="rect9748"
style="fill:#000000;fill-opacity:0;stroke:none;stroke-width:0.214092;stroke-linecap:round;stroke-opacity:1" />
<path
style="fill:#cccccc;fill-opacity:1;stroke-width:0.084375"
d="M 5.55,3.9384375 23.251875,15 5.55,26.061562 V 3.9384375 M 4.2,1.5 v 27 L 25.8,15 Z"
id="path4930" />
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

122
images/record.svg Normal file
View File

@ -0,0 +1,122 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.0"
width="30"
height="30"
id="svg1437"
sodipodi:docname="record.svg"
inkscape:version="1.0 (4035a4f, 2020-05-01)"
inkscape:export-filename="/Users/jesse/src/sonoaudio/tonalenergy/images/circleslash_icon.png"
inkscape:export-xdpi="102.4"
inkscape:export-ydpi="102.4">
<metadata
id="metadata4595">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
inkscape:snap-bbox="false"
pagecolor="#000000"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1124"
inkscape:window-height="686"
id="namedview4593"
showgrid="false"
inkscape:snap-nodes="true"
inkscape:snap-global="true"
inkscape:zoom="2.9373164"
inkscape:cx="-2.6694151"
inkscape:cy="38.218399"
inkscape:window-x="2571"
inkscape:window-y="380"
inkscape:window-maximized="0"
inkscape:current-layer="svg1437"
inkscape:pagecheckerboard="true"
inkscape:document-rotation="0"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0">
<inkscape:grid
id="grid11889"
type="xygrid" />
</sodipodi:namedview>
<defs
id="defs1440">
<marker
inkscape:isstock="true"
style="overflow:visible"
id="EmptyTriangleInS"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="EmptyTriangleInS">
<path
transform="scale(-0.2) translate(-3.0,0)"
style="fill-rule:evenodd;fill:#cccccc;stroke:#cccccc;stroke-width:1pt;stroke-opacity:1;fill-opacity:1"
d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
id="path1125" />
</marker>
<marker
inkscape:isstock="true"
style="overflow:visible;"
id="Arrow1Send"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Send">
<path
transform="scale(0.2) rotate(180) translate(6,0)"
style="fill-rule:evenodd;stroke:#cccccc;stroke-width:1pt;stroke-opacity:1;fill:#cccccc;fill-opacity:1"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path983" />
</marker>
<marker
inkscape:isstock="true"
style="overflow:visible"
id="marker2864"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="TriangleInM">
<path
transform="scale(-0.4)"
style="fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:#cccccc;stroke-width:1pt;stroke-opacity:1"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path2862" />
</marker>
</defs>
<rect
y="0"
x="0"
height="30"
width="30"
id="rect9748"
style="opacity:1;fill:#000000;fill-opacity:0;stroke:none;stroke-width:0.214092;stroke-linecap:round;stroke-opacity:1" />
<circle
style="fill:#cd2828;fill-opacity:0.49596775;stroke:#cccccc;stroke-width:1.2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path886"
cx="15"
cy="15"
r="10.826572" />
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

122
images/record_active.svg Normal file
View File

@ -0,0 +1,122 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.0"
width="30"
height="30"
id="svg1437"
sodipodi:docname="record_active.svg"
inkscape:version="1.0 (4035a4f, 2020-05-01)"
inkscape:export-filename="/Users/jesse/src/sonoaudio/tonalenergy/images/circleslash_icon.png"
inkscape:export-xdpi="102.4"
inkscape:export-ydpi="102.4">
<metadata
id="metadata4595">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
inkscape:snap-bbox="false"
pagecolor="#616161"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1145"
inkscape:window-height="686"
id="namedview4593"
showgrid="false"
inkscape:snap-nodes="true"
inkscape:snap-global="true"
inkscape:zoom="8.0764685"
inkscape:cx="11.072755"
inkscape:cy="23.634281"
inkscape:window-x="2137"
inkscape:window-y="843"
inkscape:window-maximized="0"
inkscape:current-layer="svg1437"
inkscape:pagecheckerboard="true"
inkscape:document-rotation="0"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0">
<inkscape:grid
id="grid11889"
type="xygrid" />
</sodipodi:namedview>
<defs
id="defs1440">
<marker
inkscape:isstock="true"
style="overflow:visible"
id="EmptyTriangleInS"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="EmptyTriangleInS">
<path
transform="scale(-0.2) translate(-3.0,0)"
style="fill-rule:evenodd;fill:#cccccc;stroke:#cccccc;stroke-width:1pt;stroke-opacity:1;fill-opacity:1"
d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
id="path1125" />
</marker>
<marker
inkscape:isstock="true"
style="overflow:visible;"
id="Arrow1Send"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Send">
<path
transform="scale(0.2) rotate(180) translate(6,0)"
style="fill-rule:evenodd;stroke:#cccccc;stroke-width:1pt;stroke-opacity:1;fill:#cccccc;fill-opacity:1"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path983" />
</marker>
<marker
inkscape:isstock="true"
style="overflow:visible"
id="marker2864"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="TriangleInM">
<path
transform="scale(-0.4)"
style="fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:#cccccc;stroke-width:1pt;stroke-opacity:1"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path2862" />
</marker>
</defs>
<rect
y="0"
x="0"
height="30"
width="30"
id="rect9748"
style="opacity:1;fill:#000000;fill-opacity:0;stroke:none;stroke-width:0.214092;stroke-linecap:round;stroke-opacity:1" />
<circle
style="fill:#f74848;fill-opacity:1;stroke:#cccccc;stroke-width:1.2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path886"
cx="15"
cy="15"
r="10.826573" />
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

71
images/skipback_icon.svg Normal file
View File

@ -0,0 +1,71 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:version="1.0 (4035a4f, 2020-05-01)"
sodipodi:docname="skipback_icon.svg"
id="svg22877"
version="1.1"
viewBox="0 0 512 512"
height="512"
width="512">
<metadata
id="metadata22883">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>ionicons-v5-c</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs22881" />
<sodipodi:namedview
inkscape:current-layer="svg22877"
inkscape:window-maximized="0"
inkscape:window-y="554"
inkscape:window-x="1872"
inkscape:cy="-28.607681"
inkscape:cx="88.588957"
inkscape:zoom="0.21106898"
showgrid="false"
id="namedview22879"
inkscape:window-height="480"
inkscape:window-width="776"
inkscape:pageshadow="2"
inkscape:pageopacity="0"
guidetolerance="10"
gridtolerance="10"
objecttolerance="10"
borderopacity="1"
bordercolor="#666666"
pagecolor="#ffffff" />
<title
id="title22871">ionicons-v5-c</title>
<rect
y="0"
x="0"
height="512"
width="512"
id="rect24508"
style="fill:none;stroke:none;stroke-width:22;stroke-linecap:round;stroke-opacity:1" />
<path
id="path22873"
style="fill:none;stroke:#cccccc;stroke-miterlimit:10;stroke-width:32px;stroke-opacity:1"
d="M400,111V401c0,17.44-17,28.52-31,20.16L121.09,272.79c-12.12-7.25-12.12-26.33,0-33.58L369,90.84C383,82.48,400,93.56,400,111Z" />
<line
id="line22875"
style="fill:none;stroke:#cccccc;stroke-linecap:round;stroke-miterlimit:10;stroke-width:32px;stroke-opacity:1"
y2="432"
x2="112"
y1="80"
x1="112" />
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -2,24 +2,36 @@
<JUCERPROJECT id="fn1Rg8" name="PaulXStretch" displaySplashScreen="0" reportAppUsage="0" <JUCERPROJECT id="fn1Rg8" name="PaulXStretch" displaySplashScreen="0" reportAppUsage="0"
splashScreenColour="Dark" projectType="audioplug" version="1.5.0" splashScreenColour="Dark" projectType="audioplug" version="1.5.0"
bundleIdentifier="com.xenakios.paulxstretch" includeBinaryInAppConfig="1" bundleIdentifier="com.sonosaurus.paulxstretch" includeBinaryInAppConfig="1"
cppLanguageStandard="latest" companyCopyright="" buildVST="0" cppLanguageStandard="latest" companyCopyright="" buildVST="0"
buildVST3="1" buildAU="1" buildAUv3="0" buildRTAS="0" buildAAX="0" buildVST3="1" buildAU="1" buildAUv3="0" buildRTAS="0" buildAAX="0"
buildStandalone="1" enableIAA="0" pluginName="PaulXStretch" pluginDesc="PaulXStretch" buildStandalone="1" enableIAA="0" pluginName="PaulXStretch" pluginDesc="PaulXStretch"
pluginManufacturer="Xenakios" pluginManufacturerCode="XenS" pluginCode="Fn1r" pluginManufacturer="Sonosaurus" pluginManufacturerCode="Sono"
pluginIsSynth="0" pluginWantsMidiIn="0" pluginProducesMidiOut="0" pluginCode="Pxst" pluginIsSynth="0" pluginWantsMidiIn="0" pluginProducesMidiOut="0"
pluginIsMidiEffectPlugin="0" pluginEditorRequiresKeys="0" pluginAUExportPrefix="paulxstretchAU" pluginIsMidiEffectPlugin="0" pluginEditorRequiresKeys="0" pluginAUExportPrefix="paulxstretchAU"
aaxIdentifier="com.yourcompany.paulstretchplugin" pluginAAXCategory="2" aaxIdentifier="com.sonosaurus.paulxstretch" pluginAAXCategory="2"
headerPath="&#10;&#10;" pluginFormats="buildAU,buildStandalone,buildVST3" headerPath="&#10;&#10;" pluginFormats="buildAU,buildStandalone,buildVST3"
jucerFormatVersion="1" useAppConfig="0" defines="JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=1"> jucerFormatVersion="1" useAppConfig="0" defines="JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=1">
<MAINGROUP id="nozXHl" name="PaulXStretch"> <MAINGROUP id="nozXHl" name="PaulXStretch">
<GROUP id="{F2FF95A8-60F3-2FB2-CE4F-933A28090D76}" name="images"> <GROUP id="{F2FF95A8-60F3-2FB2-CE4F-933A28090D76}" name="images">
<FILE id="TfUptN" name="freeze.svg" compile="0" resource="1" file="images/freeze.svg"/>
<FILE id="zJaIhl" name="loop_icon.svg" compile="0" resource="1" file="images/loop_icon.svg"/>
<FILE id="RIDaIb" name="passthru.svg" compile="0" resource="1" file="images/passthru.svg"/>
<FILE id="PzIN7l" name="passthru_enabled.svg" compile="0" resource="1"
file="images/passthru_enabled.svg"/>
<FILE id="Yny1oQ" name="paulxstretch_icon_256_rounded.png" compile="0" <FILE id="Yny1oQ" name="paulxstretch_icon_256_rounded.png" compile="0"
resource="0" file="images/paulxstretch_icon_256_rounded.png"/> resource="0" file="images/paulxstretch_icon_256_rounded.png"/>
<FILE id="hG1CYd" name="paulxstretch_icon_1024_rounded.png" compile="0" <FILE id="hG1CYd" name="paulxstretch_icon_1024_rounded.png" compile="0"
resource="0" file="images/paulxstretch_icon_1024_rounded.png"/> resource="0" file="images/paulxstretch_icon_1024_rounded.png"/>
<FILE id="U8ebq1" name="pause_icon.svg" compile="0" resource="1" file="images/pause_icon.svg"/>
<FILE id="OhlmmO" name="play_icon.svg" compile="0" resource="1" file="images/play_icon.svg"/>
<FILE id="PLvX8b" name="power.svg" compile="0" resource="1" file="images/power.svg"/> <FILE id="PLvX8b" name="power.svg" compile="0" resource="1" file="images/power.svg"/>
<FILE id="PMRzOf" name="power_sel.svg" compile="0" resource="1" file="images/power_sel.svg"/> <FILE id="PMRzOf" name="power_sel.svg" compile="0" resource="1" file="images/power_sel.svg"/>
<FILE id="s7ZAxz" name="record.svg" compile="0" resource="1" file="images/record.svg"/>
<FILE id="DhBJaN" name="record_active.svg" compile="0" resource="1"
file="images/record_active.svg"/>
<FILE id="M5ArEf" name="skipback_icon.svg" compile="0" resource="1"
file="images/skipback_icon.svg"/>
</GROUP> </GROUP>
<GROUP id="{03DA6B32-F666-FF60-F168-4385D0847058}" name="Source"> <GROUP id="{03DA6B32-F666-FF60-F168-4385D0847058}" name="Source">
<GROUP id="{3B6D1AF9-E53E-2F78-24A5-D12A34009E6A}" name="PS_Source"> <GROUP id="{3B6D1AF9-E53E-2F78-24A5-D12A34009E6A}" name="PS_Source">
@ -76,7 +88,7 @@
microphonePermissionsText="This application requires audio input to capture live audio for processing" microphonePermissionsText="This application requires audio input to capture live audio for processing"
hardenedRuntime="1" hardenedRuntimeOptions="com.apple.security.device.audio-input" hardenedRuntime="1" hardenedRuntimeOptions="com.apple.security.device.audio-input"
xcodeValidArchs="arm64,x86_64" buildNumber="100" applicationCategory="public.app-category.music" xcodeValidArchs="arm64,x86_64" buildNumber="100" applicationCategory="public.app-category.music"
smallIcon="Yny1oQ" bigIcon="hG1CYd"> smallIcon="Yny1oQ" bigIcon="hG1CYd" iosDevelopmentTeamID="XCS435894D">
<CONFIGURATIONS> <CONFIGURATIONS>
<CONFIGURATION name="Debug" enablePluginBinaryCopyStep="1" isDebug="1" optimisation="1" <CONFIGURATION name="Debug" enablePluginBinaryCopyStep="1" isDebug="1" optimisation="1"
linkTimeOptimisation="0" targetName="PaulXStretch" headerPath="Source/PS_Source&#10;Source/WDL&#10;${HOME}/devstatic/include&#10;" linkTimeOptimisation="0" targetName="PaulXStretch" headerPath="Source/PS_Source&#10;Source/WDL&#10;${HOME}/devstatic/include&#10;"

View File

@ -15,12 +15,24 @@
jucerFormatVersion="1" useAppConfig="0" defines="JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=1"> jucerFormatVersion="1" useAppConfig="0" defines="JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=1">
<MAINGROUP id="nozXHl" name="PaulXStretch"> <MAINGROUP id="nozXHl" name="PaulXStretch">
<GROUP id="{69E87EB6-7140-DB40-3383-82191582FEA1}" name="images"> <GROUP id="{69E87EB6-7140-DB40-3383-82191582FEA1}" name="images">
<FILE id="krdp8M" name="freeze.svg" compile="0" resource="1" file="images/freeze.svg"/>
<FILE id="DHdvWm" name="loop_icon.svg" compile="0" resource="1" file="images/loop_icon.svg"/>
<FILE id="eqafbl" name="passthru.svg" compile="0" resource="1" file="images/passthru.svg"/>
<FILE id="JDf2c6" name="passthru_enabled.svg" compile="0" resource="1"
file="images/passthru_enabled.svg"/>
<FILE id="yM4pfJ" name="paulxstretch_icon_256.png" compile="0" resource="0" <FILE id="yM4pfJ" name="paulxstretch_icon_256.png" compile="0" resource="0"
file="images/paulxstretch_icon_256.png"/> file="images/paulxstretch_icon_256.png"/>
<FILE id="eZYcsl" name="paulxstretch_icon_1024.png" compile="0" resource="0" <FILE id="eZYcsl" name="paulxstretch_icon_1024.png" compile="0" resource="0"
file="images/paulxstretch_icon_1024.png"/> file="images/paulxstretch_icon_1024.png"/>
<FILE id="bg7hAk" name="pause_icon.svg" compile="0" resource="1" file="images/pause_icon.svg"/>
<FILE id="uGTN39" name="play_icon.svg" compile="0" resource="1" file="images/play_icon.svg"/>
<FILE id="OyhaIc" name="power.svg" compile="0" resource="1" file="images/power.svg"/> <FILE id="OyhaIc" name="power.svg" compile="0" resource="1" file="images/power.svg"/>
<FILE id="uMLkyi" name="power_sel.svg" compile="0" resource="1" file="images/power_sel.svg"/> <FILE id="uMLkyi" name="power_sel.svg" compile="0" resource="1" file="images/power_sel.svg"/>
<FILE id="kOKR8S" name="record.svg" compile="0" resource="1" file="images/record.svg"/>
<FILE id="aogj2H" name="record_active.svg" compile="0" resource="1"
file="images/record_active.svg"/>
<FILE id="MKkrTg" name="skipback_icon.svg" compile="0" resource="1"
file="images/skipback_icon.svg"/>
</GROUP> </GROUP>
<GROUP id="{03DA6B32-F666-FF60-F168-4385D0847058}" name="Source"> <GROUP id="{03DA6B32-F666-FF60-F168-4385D0847058}" name="Source">
<GROUP id="{3B6D1AF9-E53E-2F78-24A5-D12A34009E6A}" name="PS_Source"> <GROUP id="{3B6D1AF9-E53E-2F78-24A5-D12A34009E6A}" name="PS_Source">
@ -76,7 +88,7 @@
</MAINGROUP> </MAINGROUP>
<EXPORTFORMATS> <EXPORTFORMATS>
<XCODE_IPHONE targetFolder="Builds/iOS" iosDevelopmentTeamID="XCS435894D" microphonePermissionNeeded="1" <XCODE_IPHONE targetFolder="Builds/iOS" iosDevelopmentTeamID="XCS435894D" microphonePermissionNeeded="1"
iosBackgroundAudio="1" buildNumber="101" iosScreenOrientation="UIInterfaceOrientationLandscapeLeft,UIInterfaceOrientationLandscapeRight,UIInterfaceOrientationPortrait,UIInterfaceOrientationPortraitUpsideDown" iosBackgroundAudio="1" buildNumber="103" iosScreenOrientation="UIInterfaceOrientationLandscapeLeft,UIInterfaceOrientationLandscapeRight,UIInterfaceOrientationPortrait,UIInterfaceOrientationPortraitUpsideDown"
iPadScreenOrientation="UIInterfaceOrientationLandscapeLeft,UIInterfaceOrientationLandscapeRight,UIInterfaceOrientationPortrait,UIInterfaceOrientationPortraitUpsideDown" iPadScreenOrientation="UIInterfaceOrientationLandscapeLeft,UIInterfaceOrientationLandscapeRight,UIInterfaceOrientationPortrait,UIInterfaceOrientationPortraitUpsideDown"
UIStatusBarHidden="0" UIRequiresFullScreen="0" customPList="&lt;plist version=&quot;1.0&quot;&gt;&#10;&lt;dict&gt;&#10;&#10;&#10;&lt;key&gt;ITSAppUsesNonExemptEncryption&lt;/key&gt;&#10;&#9;&lt;false/&gt;&#10;&#10;&lt;key&gt;UIStatusBarHidden&lt;/key&gt;&#10;&#9;&lt;false/&gt;&#10;&#9;&lt;key&gt;UIStatusBarStyle&lt;/key&gt;&#10;&#9;&lt;string&gt;UIStatusBarStyleLightContent&lt;/string&gt;&#10;&#10;&lt;key&gt;UIViewControllerBasedStatusBarAppearance&lt;/key&gt;&#10;&lt;false/&gt;&#10;&#10;&#10;&lt;key&gt;NSLocalNetworkUsageDescription&lt;/key&gt;&#10;&#9;&lt;string&gt;DrumJamPad uses networking to communicate with other local services&lt;/string&gt;&#10;&#10;&lt;key&gt;CFBundleDocumentTypes&lt;/key&gt;&#10;&#9;&lt;array&gt;&#10;&#9;&#9;&lt;dict&gt;&#10;&#9;&#9;&#9;&lt;key&gt;CFBundleTypeIconFiles&lt;/key&gt;&#10;&#9;&#9;&#9;&lt;array/&gt;&#10;&#9;&#9;&#9;&lt;key&gt;CFBundleTypeName&lt;/key&gt;&#10;&#9;&#9;&#9;&lt;string&gt;Audio File&lt;/string&gt;&#10;&#9;&#9;&#9;&lt;key&gt;CFBundleTypeRole&lt;/key&gt;&#10;&#9;&#9;&#9;&lt;string&gt;Viewer&lt;/string&gt;&#10;&#9;&#9;&#9;&lt;key&gt;LSHandlerRank&lt;/key&gt;&#10;&#9;&#9;&#9;&lt;string&gt;Owner&lt;/string&gt;&#10;&#9;&#9;&#9;&lt;key&gt;LSItemContentTypes&lt;/key&gt;&#10;&#9;&#9;&#9;&lt;array&gt;&#10;&#9;&#9;&#9;&#9;&lt;string&gt;com.microsoft.waveform-audio&lt;/string&gt;&#10;&#9;&#9;&#9;&#9;&lt;string&gt;public.aiff-audio&lt;/string&gt;&#10;&#9;&#9;&#9;&#9;&lt;string&gt;com.apple.coreaudio-format&lt;/string&gt;&#10;&#9;&#9;&#9;&#9;&lt;string&gt;public.mpeg-4-audio&lt;/string&gt;&#10;&#9;&#9;&#9;&#9;&lt;string&gt;public.mp3&lt;/string&gt;&#10;&#9;&#9;&#9;&lt;/array&gt;&#10;&#9;&#9;&lt;/dict&gt;&#10;&#9;&#9;&lt;/array&gt;&#10;&#10;&lt;/dict&gt;&#10;&lt;/plist&gt;" UIStatusBarHidden="0" UIRequiresFullScreen="0" customPList="&lt;plist version=&quot;1.0&quot;&gt;&#10;&lt;dict&gt;&#10;&#10;&#10;&lt;key&gt;ITSAppUsesNonExemptEncryption&lt;/key&gt;&#10;&#9;&lt;false/&gt;&#10;&#10;&lt;key&gt;UIStatusBarHidden&lt;/key&gt;&#10;&#9;&lt;false/&gt;&#10;&#9;&lt;key&gt;UIStatusBarStyle&lt;/key&gt;&#10;&#9;&lt;string&gt;UIStatusBarStyleLightContent&lt;/string&gt;&#10;&#10;&lt;key&gt;UIViewControllerBasedStatusBarAppearance&lt;/key&gt;&#10;&lt;false/&gt;&#10;&#10;&#10;&lt;key&gt;NSLocalNetworkUsageDescription&lt;/key&gt;&#10;&#9;&lt;string&gt;DrumJamPad uses networking to communicate with other local services&lt;/string&gt;&#10;&#10;&lt;key&gt;CFBundleDocumentTypes&lt;/key&gt;&#10;&#9;&lt;array&gt;&#10;&#9;&#9;&lt;dict&gt;&#10;&#9;&#9;&#9;&lt;key&gt;CFBundleTypeIconFiles&lt;/key&gt;&#10;&#9;&#9;&#9;&lt;array/&gt;&#10;&#9;&#9;&#9;&lt;key&gt;CFBundleTypeName&lt;/key&gt;&#10;&#9;&#9;&#9;&lt;string&gt;Audio File&lt;/string&gt;&#10;&#9;&#9;&#9;&lt;key&gt;CFBundleTypeRole&lt;/key&gt;&#10;&#9;&#9;&#9;&lt;string&gt;Viewer&lt;/string&gt;&#10;&#9;&#9;&#9;&lt;key&gt;LSHandlerRank&lt;/key&gt;&#10;&#9;&#9;&#9;&lt;string&gt;Owner&lt;/string&gt;&#10;&#9;&#9;&#9;&lt;key&gt;LSItemContentTypes&lt;/key&gt;&#10;&#9;&#9;&#9;&lt;array&gt;&#10;&#9;&#9;&#9;&#9;&lt;string&gt;com.microsoft.waveform-audio&lt;/string&gt;&#10;&#9;&#9;&#9;&#9;&lt;string&gt;public.aiff-audio&lt;/string&gt;&#10;&#9;&#9;&#9;&#9;&lt;string&gt;com.apple.coreaudio-format&lt;/string&gt;&#10;&#9;&#9;&#9;&#9;&lt;string&gt;public.mpeg-4-audio&lt;/string&gt;&#10;&#9;&#9;&#9;&#9;&lt;string&gt;public.mp3&lt;/string&gt;&#10;&#9;&#9;&#9;&lt;/array&gt;&#10;&#9;&#9;&lt;/dict&gt;&#10;&#9;&#9;&lt;/array&gt;&#10;&#10;&lt;/dict&gt;&#10;&lt;/plist&gt;"
UIFileSharingEnabled="1" UISupportsDocumentBrowser="1" extraDefs="PS_USE_VDSP_FFT=1" UIFileSharingEnabled="1" UISupportsDocumentBrowser="1" extraDefs="PS_USE_VDSP_FFT=1"