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);
|
addAndMakeVisible(envelope);
|
||||||
|
envelope.setEnv(audioProcessor.adsrEnv);
|
||||||
}
|
}
|
||||||
|
|
||||||
MainComponent::~MainComponent() {
|
MainComponent::~MainComponent() {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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];
|
||||||
};
|
};
|
||||||
|
|
Ładowanie…
Reference in New Issue