mirror of
https://github.com/yokemura/Magical8bitPlug2.git
synced 2025-06-03 00:58:05 -04:00
Added 'bend resolution' slider
This allows for pitch bend to be quantized into semitones (or smaller increments) for a more 'chipped' feel.
This commit is contained in:
parent
b2f6f4f1b8
commit
09d21d5c90
@ -59,7 +59,10 @@ AdvancedParamsComponent::AdvancedParamsComponent (Magical8bitPlug2AudioProcessor
|
|||||||
coarseOrFineChoice.reset (new ChoiceComponent (p, "pitchSequenceMode_raw", "Resolution"));
|
coarseOrFineChoice.reset (new ChoiceComponent (p, "pitchSequenceMode_raw", "Resolution"));
|
||||||
addAndMakeVisible (coarseOrFineChoice.get());
|
addAndMakeVisible (coarseOrFineChoice.get());
|
||||||
coarseOrFineChoice->setName ("Coarse or fine");
|
coarseOrFineChoice->setName ("Coarse or fine");
|
||||||
|
|
||||||
|
bendResolutionSlider.reset(new SliderComponent(p, "bendResolution", "Bend Reso"));
|
||||||
|
addAndMakeVisible(bendResolutionSlider.get());
|
||||||
|
bendResolutionSlider->setName("bend resolution component");
|
||||||
|
|
||||||
//[UserPreSize]
|
//[UserPreSize]
|
||||||
//[/UserPreSize]
|
//[/UserPreSize]
|
||||||
@ -109,6 +112,7 @@ void AdvancedParamsComponent::resized()
|
|||||||
pitchCompo->setBounds (0, 82, getWidth() - 204, 56);
|
pitchCompo->setBounds (0, 82, getWidth() - 204, 56);
|
||||||
dutyCompo->setBounds (0, 138, getWidth() - 160, 56);
|
dutyCompo->setBounds (0, 138, getWidth() - 160, 56);
|
||||||
coarseOrFineChoice->setBounds (getWidth() - 4 - 200, 86, 200, 28);
|
coarseOrFineChoice->setBounds (getWidth() - 4 - 200, 86, 200, 28);
|
||||||
|
bendResolutionSlider->setBounds(0, 200, getWidth() - 50, 80);
|
||||||
//[UserResized] Add your own custom resize handling here..
|
//[UserResized] Add your own custom resize handling here..
|
||||||
//[/UserResized]
|
//[/UserResized]
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#include "../JuceLibraryCode/JuceHeader.h"
|
#include "../JuceLibraryCode/JuceHeader.h"
|
||||||
#include "CustomEnvelopeComponent.h"
|
#include "CustomEnvelopeComponent.h"
|
||||||
#include "ChoiceComponent.h"
|
#include "ChoiceComponent.h"
|
||||||
|
#include "SliderComponent.h"
|
||||||
//[/Headers]
|
//[/Headers]
|
||||||
|
|
||||||
|
|
||||||
@ -62,6 +63,7 @@ private:
|
|||||||
std::unique_ptr<CustomEnvelopeComponent> pitchCompo;
|
std::unique_ptr<CustomEnvelopeComponent> pitchCompo;
|
||||||
std::unique_ptr<CustomEnvelopeComponent> dutyCompo;
|
std::unique_ptr<CustomEnvelopeComponent> dutyCompo;
|
||||||
std::unique_ptr<ChoiceComponent> coarseOrFineChoice;
|
std::unique_ptr<ChoiceComponent> coarseOrFineChoice;
|
||||||
|
std::unique_ptr<SliderComponent> bendResolutionSlider;
|
||||||
|
|
||||||
|
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
|
@ -156,7 +156,7 @@ struct
|
|||||||
+ genericControlHeight * 4;
|
+ genericControlHeight * 4;
|
||||||
const int advCompoHeight = componentMargin * 2
|
const int advCompoHeight = componentMargin * 2
|
||||||
+ indexHeight
|
+ indexHeight
|
||||||
+ customEnvelopeHeight * 3;
|
+ customEnvelopeHeight * 4;
|
||||||
const int totalHeight (bool isAdvOptOn, bool isMono)
|
const int totalHeight (bool isAdvOptOn, bool isMono)
|
||||||
{
|
{
|
||||||
int retHeight = topMargin
|
int retHeight = topMargin
|
||||||
|
@ -121,7 +121,10 @@ Magical8bitPlug2AudioProcessor::Magical8bitPlug2AudioProcessor()
|
|||||||
std::make_unique<AudioParameterBool> ("isVolumeSequenceEnabled_raw", "Enabled", false),
|
std::make_unique<AudioParameterBool> ("isVolumeSequenceEnabled_raw", "Enabled", false),
|
||||||
std::make_unique<AudioParameterBool> ("isPitchSequenceEnabled_raw", "Enabled", false),
|
std::make_unique<AudioParameterBool> ("isPitchSequenceEnabled_raw", "Enabled", false),
|
||||||
std::make_unique<AudioParameterBool> ("isDutySequenceEnabled_raw", "Enabled", false),
|
std::make_unique<AudioParameterBool> ("isDutySequenceEnabled_raw", "Enabled", false),
|
||||||
std::make_unique<AudioParameterChoice> ("pitchSequenceMode_raw", "Mode", StringArray ({"Coarse", "Fine"}), 0)
|
std::make_unique<AudioParameterChoice> ("pitchSequenceMode_raw", "Mode", StringArray ({"Coarse", "Fine"}), 0),
|
||||||
|
//Pitch steps
|
||||||
|
//0 is max resolution, 1 will cause pitch bend to only work in semitones
|
||||||
|
std::make_unique<AudioParameterFloat> ("bendResolution", "Bend Resolution", 0.0f, 1.0f, 1.0f)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
, settingRefs (¶meters)
|
, settingRefs (¶meters)
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "TonalVoice.h"
|
#include "TonalVoice.h"
|
||||||
|
|
||||||
|
@ -146,6 +146,8 @@ struct SettingRefs
|
|||||||
float* isPitchSequenceEnabled_raw = nullptr;
|
float* isPitchSequenceEnabled_raw = nullptr;
|
||||||
float* isDutySequenceEnabled_raw = nullptr;
|
float* isDutySequenceEnabled_raw = nullptr;
|
||||||
float* pitchSequenceMode_raw = nullptr;
|
float* pitchSequenceMode_raw = nullptr;
|
||||||
|
//pitch resolution
|
||||||
|
float* bendResolution = nullptr;
|
||||||
|
|
||||||
FrameSequence volumeSequence;
|
FrameSequence volumeSequence;
|
||||||
FrameSequence pitchSequence;
|
FrameSequence pitchSequence;
|
||||||
@ -223,6 +225,7 @@ struct SettingRefs
|
|||||||
isPitchSequenceEnabled_raw = (float*) parameters->getRawParameterValue ("isPitchSequenceEnabled_raw");
|
isPitchSequenceEnabled_raw = (float*) parameters->getRawParameterValue ("isPitchSequenceEnabled_raw");
|
||||||
isDutySequenceEnabled_raw = (float*) parameters->getRawParameterValue ("isDutySequenceEnabled_raw");
|
isDutySequenceEnabled_raw = (float*) parameters->getRawParameterValue ("isDutySequenceEnabled_raw");
|
||||||
pitchSequenceMode_raw = (float*) parameters->getRawParameterValue ("pitchSequenceMode_raw");
|
pitchSequenceMode_raw = (float*) parameters->getRawParameterValue ("pitchSequenceMode_raw");
|
||||||
|
//Pitch resolution
|
||||||
|
bendResolution = (float*) parameters->getRawParameterValue("bendResolution");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -79,7 +79,6 @@ void TonalVoice::calculateAngleDelta()
|
|||||||
+ currentAutoBendAmount
|
+ currentAutoBendAmount
|
||||||
+ vibratoAmount
|
+ vibratoAmount
|
||||||
+ finePitchInSeq;
|
+ finePitchInSeq;
|
||||||
|
|
||||||
auto cyclesPerSecond = noteNoToHeltzDouble (noteNoInDouble);
|
auto cyclesPerSecond = noteNoToHeltzDouble (noteNoInDouble);
|
||||||
auto cyclesPerSample = cyclesPerSecond / getSampleRate();
|
auto cyclesPerSample = cyclesPerSecond / getSampleRate();
|
||||||
|
|
||||||
@ -203,6 +202,8 @@ void TonalVoice::shiftNoteBuffer(int index) {
|
|||||||
|
|
||||||
double TonalVoice::noteNoToHeltzDouble (double noteNoInDouble, const double frequencyOfA)
|
double TonalVoice::noteNoToHeltzDouble (double noteNoInDouble, const double frequencyOfA)
|
||||||
{
|
{
|
||||||
|
double resolution = 1.0 - (*settingRefs->bendResolution); //in the equation, 0 is max res and 1 is 1 semitone
|
||||||
|
noteNoInDouble = floor(noteNoInDouble/resolution)*resolution;
|
||||||
return frequencyOfA * std::pow (2.0, (noteNoInDouble - 69) / 12.0);
|
return frequencyOfA * std::pow (2.0, (noteNoInDouble - 69) / 12.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user