kopia lustrzana https://github.com/jameshball/osci-render
Add default ADSR envelope and control shape of curve with alt + mouse drag
rodzic
3959dafe28
commit
95dd9a5f4b
|
@ -102,6 +102,7 @@ MainComponent::MainComponent(OscirenderAudioProcessor& p, OscirenderAudioProcess
|
|||
);
|
||||
|
||||
addAndMakeVisible(envelope);
|
||||
envelope.setEnv(audioProcessor.adsrEnv);
|
||||
}
|
||||
|
||||
MainComponent::~MainComponent() {
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include "audio/WobbleEffect.h"
|
||||
#include "audio/PerspectiveEffect.h"
|
||||
#include "obj/ObjectServer.h"
|
||||
#include "UGen/Env.h"
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
|
@ -192,6 +193,8 @@ public:
|
|||
std::atomic<bool> objectServerRendering = false;
|
||||
juce::ChangeBroadcaster fileChangeBroadcaster;
|
||||
|
||||
Env adsrEnv = Env::adsr(0.1, 0.1, 0.1, 0.1, 0.1);
|
||||
|
||||
private:
|
||||
juce::SpinLock consumerLock;
|
||||
std::vector<std::shared_ptr<BufferConsumer>> consumers;
|
||||
|
|
|
@ -257,18 +257,18 @@ void EnvelopeHandleComponent::mouseDown(const juce::MouseEvent& e)
|
|||
return; // dont send drag msg
|
||||
|
||||
}
|
||||
else if(e.mods.isCtrlDown())
|
||||
{
|
||||
if(getParentComponent()->getAllowNodeEditing())
|
||||
{
|
||||
ignoreDrag = true;
|
||||
|
||||
if(PopupComponent::getActivePopups() < 1)
|
||||
{
|
||||
EnvelopeNodePopup::create(this, getScreenX()+e.x, getScreenY()+e.y);
|
||||
}
|
||||
}
|
||||
}
|
||||
//else if(e.mods.isCtrlDown())
|
||||
//{
|
||||
// if(getParentComponent()->getAllowNodeEditing())
|
||||
// {
|
||||
// ignoreDrag = true;
|
||||
//
|
||||
// if(PopupComponent::getActivePopups() < 1)
|
||||
// {
|
||||
// EnvelopeNodePopup::create(this, getScreenX()+e.x, getScreenY()+e.y);
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
else
|
||||
{
|
||||
|
||||
|
@ -299,20 +299,7 @@ void EnvelopeHandleComponent::mouseDrag(const juce::MouseEvent& e)
|
|||
{
|
||||
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();
|
||||
getParentComponent()->repaint();
|
||||
|
@ -548,6 +535,7 @@ EnvelopeComponent::EnvelopeComponent()
|
|||
gridDisplayMode(GridNone),
|
||||
gridQuantiseMode(GridNone),
|
||||
draggingHandle(0),
|
||||
adjustingHandle(nullptr),
|
||||
curvePoints(64),
|
||||
releaseNode(-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)
|
||||
{
|
||||
if(quantise != GridLeaveUnchanged)
|
||||
|
@ -836,47 +836,42 @@ void EnvelopeComponent::mouseDown(const juce::MouseEvent& e)
|
|||
// not needed ?
|
||||
|
||||
}
|
||||
else if(e.mods.isCtrlDown())
|
||||
{
|
||||
if(getAllowCurveEditing())
|
||||
{
|
||||
float timeAtClick = convertPixelsToDomain(e.x);
|
||||
|
||||
int i;
|
||||
EnvelopeHandleComponent* handle = 0;
|
||||
|
||||
for(i = 0; i < handles.size(); i++) {
|
||||
handle = handles.getUnchecked(i);
|
||||
if(handle->getTime() > timeAtClick)
|
||||
break;
|
||||
}
|
||||
|
||||
if(PopupComponent::getActivePopups() < 1)
|
||||
{
|
||||
EnvelopeHandleComponent* prev = handle->getPreviousHandle();
|
||||
|
||||
if(!prev)
|
||||
{
|
||||
EnvelopeCurvePopup::create(handle, getScreenX()+e.x, getScreenY()+e.y);
|
||||
}
|
||||
else
|
||||
{
|
||||
EnvelopeCurvePopup::create(handle,
|
||||
(handle->getScreenX() + prev->getScreenX())/2,
|
||||
juce::jmax(handle->getScreenY(), prev->getScreenY())+10);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
draggingHandle = addHandle(e.x,e.y, EnvCurve::Linear);
|
||||
|
||||
if(draggingHandle != 0) {
|
||||
setMouseCursor(juce::MouseCursor::NoCursor);
|
||||
draggingHandle->mouseDown(e.getEventRelativeTo(draggingHandle));
|
||||
draggingHandle->updateLegend();
|
||||
}
|
||||
//else if(e.mods.isCtrlDown())
|
||||
//{
|
||||
// if(getAllowCurveEditing())
|
||||
// {
|
||||
// float timeAtClick = convertPixelsToDomain(e.x);
|
||||
//
|
||||
// EnvelopeHandleComponent* handle = findHandle(timeAtClick);
|
||||
//
|
||||
// if(PopupComponent::getActivePopups() < 1)
|
||||
// {
|
||||
// EnvelopeHandleComponent* prev = handle->getPreviousHandle();
|
||||
//
|
||||
// if(!prev)
|
||||
// {
|
||||
// EnvelopeCurvePopup::create(handle, getScreenX()+e.x, getScreenY()+e.y);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// EnvelopeCurvePopup::create(handle,
|
||||
// (handle->getScreenX() + prev->getScreenX())/2,
|
||||
// juce::jmax(handle->getScreenY(), prev->getScreenY())+10);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
else if (e.mods.isAltDown()) {
|
||||
adjustingHandle = findHandle(convertPixelsToDomain(e.x));
|
||||
prevCurveValue = adjustingHandle->getCurve().getCurve();
|
||||
} else {
|
||||
//draggingHandle = addHandle(e.x,e.y, EnvCurve::Numerical);
|
||||
//
|
||||
//if(draggingHandle != 0) {
|
||||
// setMouseCursor(juce::MouseCursor::NoCursor);
|
||||
// draggingHandle->mouseDown(e.getEventRelativeTo(draggingHandle));
|
||||
// draggingHandle->updateLegend();
|
||||
//}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -885,9 +880,27 @@ void EnvelopeComponent::mouseDrag(const juce::MouseEvent& e)
|
|||
#ifdef MYDEBUG
|
||||
printf("MyEnvelopeComponent::mouseDrag(%d, %d)\n", e.x, e.y);
|
||||
#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));
|
||||
}
|
||||
}
|
||||
|
||||
void EnvelopeComponent::mouseUp(const juce::MouseEvent& e)
|
||||
|
@ -895,6 +908,10 @@ void EnvelopeComponent::mouseUp(const juce::MouseEvent& e)
|
|||
#ifdef MYDEBUG
|
||||
printf("MyEnvelopeComponent::mouseUp\n");
|
||||
#endif
|
||||
|
||||
if (adjustingHandle != nullptr) {
|
||||
adjustingHandle = nullptr;
|
||||
}
|
||||
|
||||
if(draggingHandle != 0)
|
||||
{
|
||||
|
|
|
@ -240,6 +240,7 @@ public:
|
|||
|
||||
private:
|
||||
void recalculateHandles();
|
||||
EnvelopeHandleComponent* findHandle(double time);
|
||||
|
||||
juce::SortedSet <void*> listeners;
|
||||
juce::Array<EnvelopeHandleComponent*> handles;
|
||||
|
@ -249,11 +250,13 @@ private:
|
|||
double valueGrid, domainGrid;
|
||||
GridMode gridDisplayMode, gridQuantiseMode;
|
||||
EnvelopeHandleComponent* draggingHandle;
|
||||
EnvelopeHandleComponent* adjustingHandle;
|
||||
double prevCurveValue = 0.0;
|
||||
int curvePoints;
|
||||
int releaseNode, loopNode;
|
||||
|
||||
bool allowCurveEditing:1;
|
||||
bool allowNodeEditing:1;
|
||||
bool allowCurveEditing = false;
|
||||
bool allowNodeEditing = false;
|
||||
|
||||
juce::Colour colours[NumEnvColours];
|
||||
};
|
||||
|
|
Ładowanie…
Reference in New Issue