added waveform selectors
This commit is contained in:
@@ -20,6 +20,8 @@ enum class ParamId : uint16_t {
|
|||||||
FilterResonanceEnvD,
|
FilterResonanceEnvD,
|
||||||
FilterResonanceEnvS,
|
FilterResonanceEnvS,
|
||||||
FilterResonanceEnvR,
|
FilterResonanceEnvR,
|
||||||
|
Osc1WaveSelector1,
|
||||||
|
Osc1WaveSelector2,
|
||||||
// ... and so on
|
// ... and so on
|
||||||
// this list could be like 200 long if I really wanted to
|
// this list could be like 200 long if I really wanted to
|
||||||
Count // for sizing
|
Count // for sizing
|
||||||
@@ -47,7 +49,6 @@ constexpr std::array<EnvelopeParam, static_cast<size_t>(EnvelopeId::Count)> ENV_
|
|||||||
{ ParamId::Osc1VolumeEnvA, ParamId::Osc1VolumeEnvD, ParamId::Osc1VolumeEnvS, ParamId::Osc1VolumeEnvR }, // Osc3Volume (not implemented)
|
{ ParamId::Osc1VolumeEnvA, ParamId::Osc1VolumeEnvD, ParamId::Osc1VolumeEnvS, ParamId::Osc1VolumeEnvR }, // Osc3Volume (not implemented)
|
||||||
{ ParamId::FilterCutoffEnvA, ParamId::FilterCutoffEnvR, ParamId::FilterCutoffEnvS, ParamId::FilterCutoffEnvR }, // FilterCutoff
|
{ ParamId::FilterCutoffEnvA, ParamId::FilterCutoffEnvR, ParamId::FilterCutoffEnvS, ParamId::FilterCutoffEnvR }, // FilterCutoff
|
||||||
{ ParamId::FilterResonanceEnvA, ParamId::FilterResonanceEnvR, ParamId::FilterResonanceEnvS, ParamId::FilterResonanceEnvR }, // FilterResonance
|
{ ParamId::FilterResonanceEnvA, ParamId::FilterResonanceEnvR, ParamId::FilterResonanceEnvS, ParamId::FilterResonanceEnvR }, // FilterResonance
|
||||||
|
|
||||||
}};
|
}};
|
||||||
|
|
||||||
struct ParamDefault {
|
struct ParamDefault {
|
||||||
@@ -59,20 +60,22 @@ struct ParamDefault {
|
|||||||
// TODO: make these configurable via yml file too
|
// TODO: make these configurable via yml file too
|
||||||
// later TODO: and then when I have full on profile saving there will be a default profile to load from
|
// later TODO: and then when I have full on profile saving there will be a default profile to load from
|
||||||
constexpr std::array<ParamDefault, static_cast<size_t>(ParamId::Count)> PARAM_DEFS {{
|
constexpr std::array<ParamDefault, static_cast<size_t>(ParamId::Count)> PARAM_DEFS {{
|
||||||
{ 100.0f, 20.0f, 600.0f}, // Osc1Freq
|
{ 100.0f, 20.0f, 600.0f}, // Osc1Freq
|
||||||
{ 0.8f, 0.0f, 1.0f}, // Osc1Gain
|
{ 0.8f, 0.0f, 1.0f}, // Osc1Gain
|
||||||
{ 0.05f, 0.0f, 2.0f}, // Osc1VolumeEnvA,
|
{ 0.05f, 0.0f, 2.0f}, // Osc1VolumeEnvA
|
||||||
{ 0.2f, 0.0f, 2.0f}, // Osc1VolumeEnvD,
|
{ 0.2f, 0.0f, 2.0f}, // Osc1VolumeEnvD
|
||||||
{ 0.7f, 0.0f, 1.0f}, // Osc1VolumeEnvS,
|
{ 0.7f, 0.0f, 1.0f}, // Osc1VolumeEnvS
|
||||||
{ 0.2f, 0.0f, 2.0f}, // Osc1VolumeEnvR,
|
{ 0.2f, 0.0f, 2.0f}, // Osc1VolumeEnvR
|
||||||
{ 10.0f, 0.0f, 1000.0f}, // FilterCutoffEnvA,
|
{ 10.0f, 0.0f, 1000.0f}, // FilterCutoffEnvA
|
||||||
{ 10.0f, 0.0f, 1000.0f}, // FilterCutoffEnvD,
|
{ 10.0f, 0.0f, 1000.0f}, // FilterCutoffEnvD
|
||||||
{ 10.0f, 0.0f, 1000.0f}, // FilterCutoffEnvS,
|
{ 10.0f, 0.0f, 1000.0f}, // FilterCutoffEnvS
|
||||||
{ 10.0f, 0.0f, 1000.0f}, // FilterCutoffEnvR,
|
{ 10.0f, 0.0f, 1000.0f}, // FilterCutoffEnvR
|
||||||
{ 10.0f, 0.0f, 1000.0f}, // FilterResonanceEnvA,
|
{ 10.0f, 0.0f, 1000.0f}, // FilterResonanceEnvA
|
||||||
{ 10.0f, 0.0f, 1000.0f}, // FilterResonanceEnvD,
|
{ 10.0f, 0.0f, 1000.0f}, // FilterResonanceEnvD
|
||||||
{ 10.0f, 0.0f, 1000.0f}, // FilterResonanceEnvS,
|
{ 10.0f, 0.0f, 1000.0f}, // FilterResonanceEnvS
|
||||||
{ 10.0f, 0.0f, 1000.0f}, // FilterResonanceEnvR,
|
{ 10.0f, 0.0f, 1000.0f}, // FilterResonanceEnvR
|
||||||
|
{ 1.0f, 0.0f, 0.0f}, // Osc1WaveSelector1
|
||||||
|
{ 1.0f, 0.0f, 0.0f}, // Osc1WaveSelector2
|
||||||
}};
|
}};
|
||||||
|
|
||||||
constexpr size_t PARAM_COUNT = static_cast<size_t>(ParamId::Count);
|
constexpr size_t PARAM_COUNT = static_cast<size_t>(ParamId::Count);
|
||||||
@@ -85,8 +88,10 @@ public:
|
|||||||
~ParameterStore() = default;
|
~ParameterStore() = default;
|
||||||
|
|
||||||
void set(ParamId id, float value);
|
void set(ParamId id, float value);
|
||||||
|
void set(ParamId id, int32_t value) { set(id, static_cast<float>(value)); }
|
||||||
void set(EnvelopeId, float a, float d, float s, float r);
|
void set(EnvelopeId, float a, float d, float s, float r);
|
||||||
float get(ParamId id) const;
|
float get(ParamId id) const;
|
||||||
|
int32_t getInt(ParamId id) const { return static_cast<int32_t>(get(id)); }
|
||||||
void resetToDefaults();
|
void resetToDefaults();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ Envelope::Envelope() {
|
|||||||
|
|
||||||
void Envelope::noteOn() {
|
void Envelope::noteOn() {
|
||||||
state_ = State::Attack;
|
state_ = State::Attack;
|
||||||
|
// there's interntionally no envelope value_ reset here because slurs
|
||||||
}
|
}
|
||||||
|
|
||||||
void Envelope::noteOff() {
|
void Envelope::noteOff() {
|
||||||
@@ -26,7 +27,7 @@ float Envelope::process() {
|
|||||||
state_ = State::Decay;
|
state_ = State::Decay;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case State::Decay: // TODO: if noteOff occurs during decay, release doesn't trigger until decay finishes
|
case State::Decay:
|
||||||
value_ -= (1.0f - sustain_) / (decay_ * sampleRate_);
|
value_ -= (1.0f - sustain_) / (decay_ * sampleRate_);
|
||||||
if(value_ <= sustain_) {
|
if(value_ <= sustain_) {
|
||||||
value_ = sustain_;
|
value_ = sustain_;
|
||||||
|
|||||||
@@ -4,6 +4,8 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
|
|
||||||
|
// the scope buffer is used by the ui to visualize the audio waveform
|
||||||
|
// the ui thread shouldn't read directly from memory being read from/written to so it copies the data into this class
|
||||||
class ScopeBuffer {
|
class ScopeBuffer {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@@ -22,6 +24,7 @@ public:
|
|||||||
|
|
||||||
// NOTE: there are limits to the wavelengths that the scope can show cleanly due to the size of the audio buffer
|
// NOTE: there are limits to the wavelengths that the scope can show cleanly due to the size of the audio buffer
|
||||||
// at a buffer size of 256 at 44100hz the min visible steady frequency is ~172hz
|
// at a buffer size of 256 at 44100hz the min visible steady frequency is ~172hz
|
||||||
|
// the min visible steady frequency can be lowered by increasing buffer size (increases latency) or decreasing sample rate (decreases audio fidelity)
|
||||||
private:
|
private:
|
||||||
|
|
||||||
std::vector<float> buffer_;
|
std::vector<float> buffer_;
|
||||||
|
|||||||
@@ -94,8 +94,25 @@ void Synth::process(float* out, uint32_t nFrames, uint32_t sampleRate) {
|
|||||||
// TODO: wavetables should be scaled by their RMS for equal loudness (prelim standard = 0.707)
|
// TODO: wavetables should be scaled by their RMS for equal loudness (prelim standard = 0.707)
|
||||||
float sineSample = std::sin(phase_);
|
float sineSample = std::sin(phase_);
|
||||||
float squareSample = (phase_ >= M_PI) ? 0.707f : -0.707f;
|
float squareSample = (phase_ >= M_PI) ? 0.707f : -0.707f;
|
||||||
float sawSample = ((phase_ / M_PI) - 1.0f) / 0.577f * 0.707f;
|
float sawSample = ((phase_ / M_PI) - 1.0f) / 0.577f * 0.707f;
|
||||||
sampleOut = squareSample * gain;
|
// switch statement will be replaced with an array index for our array of wavetables
|
||||||
|
switch (static_cast<int32_t>(std::round(getParam(ParamId::Osc1WaveSelector1)))) {
|
||||||
|
case 0:
|
||||||
|
sampleOut = sineSample * gain;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
sampleOut = squareSample * gain;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
sampleOut = sawSample * gain;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
// TODO: no triable wave yet :(
|
||||||
|
sampleOut = sineSample * gain;
|
||||||
|
break;
|
||||||
|
default: // unreachable
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
// write to buffer
|
// write to buffer
|
||||||
out[2*i] = sampleOut; // left
|
out[2*i] = sampleOut; // left
|
||||||
@@ -113,6 +130,7 @@ void Synth::process(float* out, uint32_t nFrames, uint32_t sampleRate) {
|
|||||||
if(!triggered) {
|
if(!triggered) {
|
||||||
scope_->setTrigger(i); // this is where we consider the start of a waveform
|
scope_->setTrigger(i); // this is where we consider the start of a waveform
|
||||||
triggered = true;
|
triggered = true;
|
||||||
|
// TODO: investigate triggering accross buffers when a single wave period transcends a single audio buffer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,14 +20,32 @@ MainWindow::MainWindow(QWidget *parent) :
|
|||||||
|
|
||||||
// Connect buttons to slots
|
// Connect buttons to slots
|
||||||
connect(ui_->buttonReset, &QPushButton::clicked, this, &MainWindow::onResetClicked);
|
connect(ui_->buttonReset, &QPushButton::clicked, this, &MainWindow::onResetClicked);
|
||||||
|
onResetClicked(); // manually reset
|
||||||
|
|
||||||
// connect envelopeGenerator
|
// connect envelopeGenerators
|
||||||
ui_->envelopeOsc1Volume->init(EnvelopeId::Osc1Volume);
|
|
||||||
connect(ui_->envelopeOsc1Volume, &EnvelopeGenerator::envelopeChanged,
|
connect(ui_->envelopeOsc1Volume, &EnvelopeGenerator::envelopeChanged,
|
||||||
this, [this](float a, float d, float s, float r) {
|
this, [this](float a, float d, float s, float r) {
|
||||||
audio_->parameters()->set(EnvelopeId::Osc1Volume, a, d, s, r);
|
audio_->parameters()->set(EnvelopeId::Osc1Volume, a, d, s, r);
|
||||||
});
|
});
|
||||||
// this should be easy enough to put into a for each envelopeGenerator loop
|
connect(ui_->envelopeFilterCutoff, &EnvelopeGenerator::envelopeChanged,
|
||||||
|
this, [this](float a, float d, float s, float r) {
|
||||||
|
audio_->parameters()->set(EnvelopeId::FilterCutoff, a, d, s, r);
|
||||||
|
});
|
||||||
|
connect(ui_->envelopeFilterResonance, &EnvelopeGenerator::envelopeChanged,
|
||||||
|
this, [this](float a, float d, float s, float r) {
|
||||||
|
audio_->parameters()->set(EnvelopeId::FilterResonance, a, d, s, r);
|
||||||
|
});
|
||||||
|
// this should be easy enough to put into a for each envelopeGenerator loop, each ui element just needs an EnvelopeId specifiers
|
||||||
|
|
||||||
|
// other ui elements
|
||||||
|
connect(ui_->comboOsc1WaveSelector1, QOverload<int>::of(&QComboBox::currentIndexChanged),
|
||||||
|
this, [this](int index) {
|
||||||
|
audio_->parameters()->set(ParamId::Osc1WaveSelector1, index);
|
||||||
|
});
|
||||||
|
connect(ui_->comboOsc1WaveSelector2, QOverload<int>::of(&QComboBox::currentIndexChanged),
|
||||||
|
this, [this](int index) {
|
||||||
|
audio_->parameters()->set(ParamId::Osc1WaveSelector2, index);
|
||||||
|
});
|
||||||
|
|
||||||
// synth business
|
// synth business
|
||||||
audio_->start();
|
audio_->start();
|
||||||
@@ -49,5 +67,14 @@ void MainWindow::keyReleaseEvent(QKeyEvent* event) {
|
|||||||
void MainWindow::onResetClicked() {
|
void MainWindow::onResetClicked() {
|
||||||
|
|
||||||
// initialize to defaults
|
// initialize to defaults
|
||||||
|
|
||||||
|
// envelopeGenerators
|
||||||
ui_->envelopeOsc1Volume->init(EnvelopeId::Osc1Volume);
|
ui_->envelopeOsc1Volume->init(EnvelopeId::Osc1Volume);
|
||||||
|
ui_->envelopeFilterCutoff->init(EnvelopeId::FilterCutoff);
|
||||||
|
ui_->envelopeFilterResonance->init(EnvelopeId::FilterResonance);
|
||||||
|
|
||||||
|
// comboBoxes
|
||||||
|
ui_->comboOsc1WaveSelector1->setCurrentIndex(static_cast<int>(PARAM_DEFS[static_cast<size_t>(ParamId::Osc1WaveSelector1)].def));
|
||||||
|
ui_->comboOsc1WaveSelector2->setCurrentIndex(static_cast<int>(PARAM_DEFS[static_cast<size_t>(ParamId::Osc1WaveSelector2)].def));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>800</width>
|
<width>940</width>
|
||||||
<height>600</height>
|
<height>600</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
@@ -38,10 +38,10 @@
|
|||||||
<widget class="EnvelopeGenerator" name="envelopeOsc1Volume" native="true">
|
<widget class="EnvelopeGenerator" name="envelopeOsc1Volume" native="true">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>150</x>
|
<x>20</x>
|
||||||
<y>230</y>
|
<y>270</y>
|
||||||
<width>500</width>
|
<width>300</width>
|
||||||
<height>360</height>
|
<height>300</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="acceptDrops">
|
<property name="acceptDrops">
|
||||||
@@ -54,7 +54,7 @@
|
|||||||
<widget class="Scope" name="scope" native="true">
|
<widget class="Scope" name="scope" native="true">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>200</x>
|
<x>270</x>
|
||||||
<y>20</y>
|
<y>20</y>
|
||||||
<width>400</width>
|
<width>400</width>
|
||||||
<height>200</height>
|
<height>200</height>
|
||||||
@@ -64,6 +64,203 @@
|
|||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
|
<widget class="EnvelopeGenerator" name="envelopeFilterCutoff" native="true">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>320</x>
|
||||||
|
<y>270</y>
|
||||||
|
<width>300</width>
|
||||||
|
<height>300</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="acceptDrops">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="autoFillBackground">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<widget class="EnvelopeGenerator" name="envelopeFilterResonance" native="true">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>620</x>
|
||||||
|
<y>270</y>
|
||||||
|
<width>300</width>
|
||||||
|
<height>300</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="acceptDrops">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="autoFillBackground">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<widget class="QLabel" name="label">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>110</x>
|
||||||
|
<y>240</y>
|
||||||
|
<width>101</width>
|
||||||
|
<height>16</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<pointsize>12</pointsize>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Osc1Volume</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignmentFlag::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<widget class="QLabel" name="label_2">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>420</x>
|
||||||
|
<y>240</y>
|
||||||
|
<width>101</width>
|
||||||
|
<height>16</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<pointsize>12</pointsize>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>FilterCutoff</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignmentFlag::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<widget class="QLabel" name="label_3">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>710</x>
|
||||||
|
<y>240</y>
|
||||||
|
<width>121</width>
|
||||||
|
<height>16</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<pointsize>12</pointsize>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>FilterResonance</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignmentFlag::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<widget class="QComboBox" name="comboOsc1WaveSelector1">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>120</x>
|
||||||
|
<y>90</y>
|
||||||
|
<width>86</width>
|
||||||
|
<height>26</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Sine</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Square</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Saw</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Triangle</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
<widget class="QLabel" name="label_4">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>10</x>
|
||||||
|
<y>90</y>
|
||||||
|
<width>101</width>
|
||||||
|
<height>21</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<pointsize>8</pointsize>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Osc1WaveSelector1</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<widget class="QComboBox" name="comboOsc1WaveSelector2">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>120</x>
|
||||||
|
<y>120</y>
|
||||||
|
<width>86</width>
|
||||||
|
<height>26</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Sine</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Square</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Saw</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Triangle</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
<widget class="QLabel" name="label_5">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>10</x>
|
||||||
|
<y>120</y>
|
||||||
|
<width>101</width>
|
||||||
|
<height>21</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<pointsize>8</pointsize>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Osc1WaveSelector2</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
<customwidgets>
|
<customwidgets>
|
||||||
|
|||||||
@@ -6,8 +6,8 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>500</width>
|
<width>300</width>
|
||||||
<height>360</height>
|
<height>300</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
@@ -22,10 +22,10 @@
|
|||||||
<widget class="SmartSlider" name="sliderDecay" native="true">
|
<widget class="SmartSlider" name="sliderDecay" native="true">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>130</x>
|
<x>80</x>
|
||||||
<y>50</y>
|
<y>20</y>
|
||||||
<width>120</width>
|
<width>65</width>
|
||||||
<height>300</height>
|
<height>280</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="autoFillBackground">
|
<property name="autoFillBackground">
|
||||||
@@ -35,10 +35,10 @@
|
|||||||
<widget class="SmartSlider" name="sliderRelease" native="true">
|
<widget class="SmartSlider" name="sliderRelease" native="true">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>370</x>
|
<x>220</x>
|
||||||
<y>50</y>
|
<y>20</y>
|
||||||
<width>120</width>
|
<width>65</width>
|
||||||
<height>300</height>
|
<height>280</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="autoFillBackground">
|
<property name="autoFillBackground">
|
||||||
@@ -48,10 +48,10 @@
|
|||||||
<widget class="SmartSlider" name="sliderSustain" native="true">
|
<widget class="SmartSlider" name="sliderSustain" native="true">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>250</x>
|
<x>150</x>
|
||||||
<y>50</y>
|
<y>20</y>
|
||||||
<width>120</width>
|
<width>65</width>
|
||||||
<height>300</height>
|
<height>280</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="autoFillBackground">
|
<property name="autoFillBackground">
|
||||||
@@ -62,9 +62,9 @@
|
|||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>10</x>
|
<x>10</x>
|
||||||
<y>50</y>
|
<y>20</y>
|
||||||
<width>120</width>
|
<width>65</width>
|
||||||
<height>300</height>
|
<height>280</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="autoFillBackground">
|
<property name="autoFillBackground">
|
||||||
@@ -75,8 +75,8 @@
|
|||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>340</y>
|
<y>290</y>
|
||||||
<width>491</width>
|
<width>291</width>
|
||||||
<height>20</height>
|
<height>20</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
@@ -88,8 +88,8 @@
|
|||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>30</y>
|
<y>10</y>
|
||||||
<width>491</width>
|
<width>291</width>
|
||||||
<height>20</height>
|
<height>20</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
@@ -100,15 +100,15 @@
|
|||||||
<widget class="QLabel" name="label">
|
<widget class="QLabel" name="label">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>50</x>
|
<x>30</x>
|
||||||
<y>0</y>
|
<y>-10</y>
|
||||||
<width>21</width>
|
<width>21</width>
|
||||||
<height>31</height>
|
<height>31</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="font">
|
<property name="font">
|
||||||
<font>
|
<font>
|
||||||
<pointsize>20</pointsize>
|
<pointsize>12</pointsize>
|
||||||
</font>
|
</font>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@@ -121,15 +121,15 @@
|
|||||||
<widget class="QLabel" name="label_2">
|
<widget class="QLabel" name="label_2">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>170</x>
|
<x>100</x>
|
||||||
<y>0</y>
|
<y>-10</y>
|
||||||
<width>30</width>
|
<width>21</width>
|
||||||
<height>31</height>
|
<height>31</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="font">
|
<property name="font">
|
||||||
<font>
|
<font>
|
||||||
<pointsize>20</pointsize>
|
<pointsize>12</pointsize>
|
||||||
</font>
|
</font>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@@ -142,15 +142,15 @@
|
|||||||
<widget class="QLabel" name="label_3">
|
<widget class="QLabel" name="label_3">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>300</x>
|
<x>170</x>
|
||||||
<y>0</y>
|
<y>-10</y>
|
||||||
<width>20</width>
|
<width>20</width>
|
||||||
<height>31</height>
|
<height>31</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="font">
|
<property name="font">
|
||||||
<font>
|
<font>
|
||||||
<pointsize>20</pointsize>
|
<pointsize>12</pointsize>
|
||||||
</font>
|
</font>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@@ -163,15 +163,15 @@
|
|||||||
<widget class="QLabel" name="label_4">
|
<widget class="QLabel" name="label_4">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>420</x>
|
<x>240</x>
|
||||||
<y>0</y>
|
<y>-10</y>
|
||||||
<width>20</width>
|
<width>20</width>
|
||||||
<height>31</height>
|
<height>31</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="font">
|
<property name="font">
|
||||||
<font>
|
<font>
|
||||||
<pointsize>20</pointsize>
|
<pointsize>12</pointsize>
|
||||||
</font>
|
</font>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ void Scope::paintEvent(QPaintEvent*) {
|
|||||||
|
|
||||||
for (int32_t i = 1; i < samples_.size(); i++) {
|
for (int32_t i = 1; i < samples_.size(); i++) {
|
||||||
p.drawLine(
|
p.drawLine(
|
||||||
(i - 1) * width() / samples_.size(),
|
(i) * width() / samples_.size(),
|
||||||
midY - samples_[i - 1] * scaleY,
|
midY - samples_[i - 1] * scaleY,
|
||||||
i * width() / samples_.size(),
|
i * width() / samples_.size(),
|
||||||
midY - samples_[i] * scaleY
|
midY - samples_[i] * scaleY
|
||||||
|
|||||||
@@ -6,8 +6,8 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>120</width>
|
<width>65</width>
|
||||||
<height>300</height>
|
<height>280</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
@@ -22,8 +22,8 @@
|
|||||||
<widget class="QSlider" name="slider">
|
<widget class="QSlider" name="slider">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>50</x>
|
<x>23</x>
|
||||||
<y>90</y>
|
<y>80</y>
|
||||||
<width>16</width>
|
<width>16</width>
|
||||||
<height>160</height>
|
<height>160</height>
|
||||||
</rect>
|
</rect>
|
||||||
@@ -44,9 +44,9 @@
|
|||||||
<widget class="QDoubleSpinBox" name="spinMin">
|
<widget class="QDoubleSpinBox" name="spinMin">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>20</x>
|
<x>6</x>
|
||||||
<y>260</y>
|
<y>250</y>
|
||||||
<width>82</width>
|
<width>51</width>
|
||||||
<height>24</height>
|
<height>24</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
@@ -56,13 +56,19 @@
|
|||||||
<verstretch>0</verstretch>
|
<verstretch>0</verstretch>
|
||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignmentFlag::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
<property name="buttonSymbols">
|
||||||
|
<enum>QAbstractSpinBox::ButtonSymbols::NoButtons</enum>
|
||||||
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QDoubleSpinBox" name="spinMax">
|
<widget class="QDoubleSpinBox" name="spinMax">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>20</x>
|
<x>6</x>
|
||||||
<y>60</y>
|
<y>50</y>
|
||||||
<width>82</width>
|
<width>51</width>
|
||||||
<height>24</height>
|
<height>24</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
@@ -72,13 +78,22 @@
|
|||||||
<verstretch>0</verstretch>
|
<verstretch>0</verstretch>
|
||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignmentFlag::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
<property name="buttonSymbols">
|
||||||
|
<enum>QAbstractSpinBox::ButtonSymbols::NoButtons</enum>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<double>40000.000000000000000</double>
|
||||||
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QDoubleSpinBox" name="spinValue">
|
<widget class="QDoubleSpinBox" name="spinValue">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>20</x>
|
<x>6</x>
|
||||||
<y>20</y>
|
<y>10</y>
|
||||||
<width>82</width>
|
<width>51</width>
|
||||||
<height>31</height>
|
<height>31</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
@@ -93,14 +108,23 @@
|
|||||||
<pointsize>12</pointsize>
|
<pointsize>12</pointsize>
|
||||||
</font>
|
</font>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="layoutDirection">
|
||||||
|
<enum>Qt::LayoutDirection::LeftToRight</enum>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignmentFlag::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
<property name="buttonSymbols">
|
||||||
|
<enum>QAbstractSpinBox::ButtonSymbols::NoButtons</enum>
|
||||||
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="Line" name="line">
|
<widget class="Line" name="line">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>-7</x>
|
||||||
<y>10</y>
|
<y>10</y>
|
||||||
<width>20</width>
|
<width>20</width>
|
||||||
<height>271</height>
|
<height>261</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
@@ -116,10 +140,10 @@
|
|||||||
<widget class="Line" name="line_2">
|
<widget class="Line" name="line_2">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>100</x>
|
<x>50</x>
|
||||||
<y>10</y>
|
<y>10</y>
|
||||||
<width>20</width>
|
<width>20</width>
|
||||||
<height>271</height>
|
<height>261</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
|
|||||||
Reference in New Issue
Block a user