Add default ADSR envelope and control shape of curve with alt + mouse drag

pull/170/head
James Ball 2023-10-19 16:12:30 +01:00
rodzic 3959dafe28
commit 95dd9a5f4b
4 zmienionych plików z 95 dodań i 71 usunięć

Wyświetl plik

@ -102,6 +102,7 @@ MainComponent::MainComponent(OscirenderAudioProcessor& p, OscirenderAudioProcess
); );
addAndMakeVisible(envelope); addAndMakeVisible(envelope);
envelope.setEnv(audioProcessor.adsrEnv);
} }
MainComponent::~MainComponent() { MainComponent::~MainComponent() {

Wyświetl plik

@ -21,6 +21,7 @@
#include "audio/WobbleEffect.h" #include "audio/WobbleEffect.h"
#include "audio/PerspectiveEffect.h" #include "audio/PerspectiveEffect.h"
#include "obj/ObjectServer.h" #include "obj/ObjectServer.h"
#include "UGen/Env.h"
//============================================================================== //==============================================================================
/** /**
@ -192,6 +193,8 @@ public:
std::atomic<bool> objectServerRendering = false; std::atomic<bool> objectServerRendering = false;
juce::ChangeBroadcaster fileChangeBroadcaster; juce::ChangeBroadcaster fileChangeBroadcaster;
Env adsrEnv = Env::adsr(0.1, 0.1, 0.1, 0.1, 0.1);
private: private:
juce::SpinLock consumerLock; juce::SpinLock consumerLock;
std::vector<std::shared_ptr<BufferConsumer>> consumers; std::vector<std::shared_ptr<BufferConsumer>> consumers;

Wyświetl plik

@ -257,18 +257,18 @@ void EnvelopeHandleComponent::mouseDown(const juce::MouseEvent& e)
return; // dont send drag msg return; // dont send drag msg
} }
else if(e.mods.isCtrlDown()) //else if(e.mods.isCtrlDown())
{ //{
if(getParentComponent()->getAllowNodeEditing()) // if(getParentComponent()->getAllowNodeEditing())
{ // {
ignoreDrag = true; // ignoreDrag = true;
//
if(PopupComponent::getActivePopups() < 1) // if(PopupComponent::getActivePopups() < 1)
{ // {
EnvelopeNodePopup::create(this, getScreenX()+e.x, getScreenY()+e.y); // EnvelopeNodePopup::create(this, getScreenX()+e.x, getScreenY()+e.y);
} // }
} // }
} //}
else else
{ {
@ -299,20 +299,7 @@ void EnvelopeHandleComponent::mouseDrag(const juce::MouseEvent& e)
{ {
if(ignoreDrag == true) return; if(ignoreDrag == true) return;
if(e.mods.isAltDown()) {
int moveX = e.x-offsetX;
int moveY = offsetY-e.y;
offsetTimeAndValue(moveX * FINETUNE, moveY * FINETUNE, FINETUNE);
ignoreDrag = true;
setMousePositionToThisHandle();
ignoreDrag = false;
} else {
dragger.dragComponent(this, e, &resizeLimits); dragger.dragComponent(this, e, &resizeLimits);
}
updateLegend(); updateLegend();
getParentComponent()->repaint(); getParentComponent()->repaint();
@ -548,6 +535,7 @@ EnvelopeComponent::EnvelopeComponent()
gridDisplayMode(GridNone), gridDisplayMode(GridNone),
gridQuantiseMode(GridNone), gridQuantiseMode(GridNone),
draggingHandle(0), draggingHandle(0),
adjustingHandle(nullptr),
curvePoints(64), curvePoints(64),
releaseNode(-1), releaseNode(-1),
loopNode(-1), loopNode(-1),
@ -637,6 +625,18 @@ void EnvelopeComponent::recalculateHandles()
} }
} }
EnvelopeHandleComponent* EnvelopeComponent::findHandle(double time) {
EnvelopeHandleComponent* handle = nullptr;
for (int i = 0; i < handles.size(); i++) {
handle = handles.getUnchecked(i);
if (handle->getTime() > time)
break;
}
return handle;
}
void EnvelopeComponent::setGrid(const GridMode display, const GridMode quantise, const double domainQ, const double valueQ) void EnvelopeComponent::setGrid(const GridMode display, const GridMode quantise, const double domainQ, const double valueQ)
{ {
if(quantise != GridLeaveUnchanged) if(quantise != GridLeaveUnchanged)
@ -836,47 +836,42 @@ void EnvelopeComponent::mouseDown(const juce::MouseEvent& e)
// not needed ? // not needed ?
} }
else if(e.mods.isCtrlDown()) //else if(e.mods.isCtrlDown())
{ //{
if(getAllowCurveEditing()) // if(getAllowCurveEditing())
{ // {
float timeAtClick = convertPixelsToDomain(e.x); // float timeAtClick = convertPixelsToDomain(e.x);
//
int i; // EnvelopeHandleComponent* handle = findHandle(timeAtClick);
EnvelopeHandleComponent* handle = 0; //
// if(PopupComponent::getActivePopups() < 1)
for(i = 0; i < handles.size(); i++) { // {
handle = handles.getUnchecked(i); // EnvelopeHandleComponent* prev = handle->getPreviousHandle();
if(handle->getTime() > timeAtClick) //
break; // if(!prev)
} // {
// EnvelopeCurvePopup::create(handle, getScreenX()+e.x, getScreenY()+e.y);
if(PopupComponent::getActivePopups() < 1) // }
{ // else
EnvelopeHandleComponent* prev = handle->getPreviousHandle(); // {
// EnvelopeCurvePopup::create(handle,
if(!prev) // (handle->getScreenX() + prev->getScreenX())/2,
{ // juce::jmax(handle->getScreenY(), prev->getScreenY())+10);
EnvelopeCurvePopup::create(handle, getScreenX()+e.x, getScreenY()+e.y); // }
} // }
else // }
{ //}
EnvelopeCurvePopup::create(handle, else if (e.mods.isAltDown()) {
(handle->getScreenX() + prev->getScreenX())/2, adjustingHandle = findHandle(convertPixelsToDomain(e.x));
juce::jmax(handle->getScreenY(), prev->getScreenY())+10); prevCurveValue = adjustingHandle->getCurve().getCurve();
} } else {
} //draggingHandle = addHandle(e.x,e.y, EnvCurve::Numerical);
} //
} //if(draggingHandle != 0) {
else // setMouseCursor(juce::MouseCursor::NoCursor);
{ // draggingHandle->mouseDown(e.getEventRelativeTo(draggingHandle));
draggingHandle = addHandle(e.x,e.y, EnvCurve::Linear); // draggingHandle->updateLegend();
//}
if(draggingHandle != 0) {
setMouseCursor(juce::MouseCursor::NoCursor);
draggingHandle->mouseDown(e.getEventRelativeTo(draggingHandle));
draggingHandle->updateLegend();
}
} }
} }
@ -886,9 +881,27 @@ void EnvelopeComponent::mouseDrag(const juce::MouseEvent& e)
printf("MyEnvelopeComponent::mouseDrag(%d, %d)\n", e.x, e.y); printf("MyEnvelopeComponent::mouseDrag(%d, %d)\n", e.x, e.y);
#endif #endif
if(draggingHandle != 0) if (e.mods.isAltDown() && adjustingHandle != nullptr) {
EnvCurve curve = adjustingHandle->getCurve();
EnvelopeHandleComponent* prevHandle = adjustingHandle->getPreviousHandle();
// get distance as proportion of height
double originalValue = e.getDistanceFromDragStartY() / (double) getHeight();
double value = originalValue * 5;
value = value * value;
if (originalValue < 0) {
value = -value;
}
// make the value change the prevValue rather than overwriting it
if (prevHandle != nullptr && prevHandle->getValue() > adjustingHandle->getValue()) {
value = -value;
}
value = juce::jmin(prevCurveValue + value, 50.0);
curve.setCurve(value);
adjustingHandle->setCurve(curve);
} else if (draggingHandle != 0) {
draggingHandle->mouseDrag(e.getEventRelativeTo(draggingHandle)); draggingHandle->mouseDrag(e.getEventRelativeTo(draggingHandle));
} }
}
void EnvelopeComponent::mouseUp(const juce::MouseEvent& e) void EnvelopeComponent::mouseUp(const juce::MouseEvent& e)
{ {
@ -896,6 +909,10 @@ void EnvelopeComponent::mouseUp(const juce::MouseEvent& e)
printf("MyEnvelopeComponent::mouseUp\n"); printf("MyEnvelopeComponent::mouseUp\n");
#endif #endif
if (adjustingHandle != nullptr) {
adjustingHandle = nullptr;
}
if(draggingHandle != 0) if(draggingHandle != 0)
{ {
if(e.mods.isCtrlDown() == false) if(e.mods.isCtrlDown() == false)

Wyświetl plik

@ -240,6 +240,7 @@ public:
private: private:
void recalculateHandles(); void recalculateHandles();
EnvelopeHandleComponent* findHandle(double time);
juce::SortedSet <void*> listeners; juce::SortedSet <void*> listeners;
juce::Array<EnvelopeHandleComponent*> handles; juce::Array<EnvelopeHandleComponent*> handles;
@ -249,11 +250,13 @@ private:
double valueGrid, domainGrid; double valueGrid, domainGrid;
GridMode gridDisplayMode, gridQuantiseMode; GridMode gridDisplayMode, gridQuantiseMode;
EnvelopeHandleComponent* draggingHandle; EnvelopeHandleComponent* draggingHandle;
EnvelopeHandleComponent* adjustingHandle;
double prevCurveValue = 0.0;
int curvePoints; int curvePoints;
int releaseNode, loopNode; int releaseNode, loopNode;
bool allowCurveEditing:1; bool allowCurveEditing = false;
bool allowNodeEditing:1; bool allowNodeEditing = false;
juce::Colour colours[NumEnvColours]; juce::Colour colours[NumEnvColours];
}; };