added waveform selectors

This commit is contained in:
2025-12-27 14:30:49 -06:00
parent 6b52f8fa4f
commit 814002f0d9
9 changed files with 354 additions and 79 deletions

View File

@@ -20,14 +20,32 @@ MainWindow::MainWindow(QWidget *parent) :
// Connect buttons to slots
connect(ui_->buttonReset, &QPushButton::clicked, this, &MainWindow::onResetClicked);
onResetClicked(); // manually reset
// connect envelopeGenerator
ui_->envelopeOsc1Volume->init(EnvelopeId::Osc1Volume);
// connect envelopeGenerators
connect(ui_->envelopeOsc1Volume, &EnvelopeGenerator::envelopeChanged,
this, [this](float a, float d, float s, float 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
audio_->start();
@@ -49,5 +67,14 @@ void MainWindow::keyReleaseEvent(QKeyEvent* event) {
void MainWindow::onResetClicked() {
// initialize to defaults
// envelopeGenerators
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));
}

View File

@@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<width>940</width>
<height>600</height>
</rect>
</property>
@@ -38,10 +38,10 @@
<widget class="EnvelopeGenerator" name="envelopeOsc1Volume" native="true">
<property name="geometry">
<rect>
<x>150</x>
<y>230</y>
<width>500</width>
<height>360</height>
<x>20</x>
<y>270</y>
<width>300</width>
<height>300</height>
</rect>
</property>
<property name="acceptDrops">
@@ -54,7 +54,7 @@
<widget class="Scope" name="scope" native="true">
<property name="geometry">
<rect>
<x>200</x>
<x>270</x>
<y>20</y>
<width>400</width>
<height>200</height>
@@ -64,6 +64,203 @@
<bool>true</bool>
</property>
</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>
<customwidgets>

View File

@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>500</width>
<height>360</height>
<width>300</width>
<height>300</height>
</rect>
</property>
<property name="sizePolicy">
@@ -22,10 +22,10 @@
<widget class="SmartSlider" name="sliderDecay" native="true">
<property name="geometry">
<rect>
<x>130</x>
<y>50</y>
<width>120</width>
<height>300</height>
<x>80</x>
<y>20</y>
<width>65</width>
<height>280</height>
</rect>
</property>
<property name="autoFillBackground">
@@ -35,10 +35,10 @@
<widget class="SmartSlider" name="sliderRelease" native="true">
<property name="geometry">
<rect>
<x>370</x>
<y>50</y>
<width>120</width>
<height>300</height>
<x>220</x>
<y>20</y>
<width>65</width>
<height>280</height>
</rect>
</property>
<property name="autoFillBackground">
@@ -48,10 +48,10 @@
<widget class="SmartSlider" name="sliderSustain" native="true">
<property name="geometry">
<rect>
<x>250</x>
<y>50</y>
<width>120</width>
<height>300</height>
<x>150</x>
<y>20</y>
<width>65</width>
<height>280</height>
</rect>
</property>
<property name="autoFillBackground">
@@ -62,9 +62,9 @@
<property name="geometry">
<rect>
<x>10</x>
<y>50</y>
<width>120</width>
<height>300</height>
<y>20</y>
<width>65</width>
<height>280</height>
</rect>
</property>
<property name="autoFillBackground">
@@ -75,8 +75,8 @@
<property name="geometry">
<rect>
<x>0</x>
<y>340</y>
<width>491</width>
<y>290</y>
<width>291</width>
<height>20</height>
</rect>
</property>
@@ -88,8 +88,8 @@
<property name="geometry">
<rect>
<x>0</x>
<y>30</y>
<width>491</width>
<y>10</y>
<width>291</width>
<height>20</height>
</rect>
</property>
@@ -100,15 +100,15 @@
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>50</x>
<y>0</y>
<x>30</x>
<y>-10</y>
<width>21</width>
<height>31</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>20</pointsize>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
@@ -121,15 +121,15 @@
<widget class="QLabel" name="label_2">
<property name="geometry">
<rect>
<x>170</x>
<y>0</y>
<width>30</width>
<x>100</x>
<y>-10</y>
<width>21</width>
<height>31</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>20</pointsize>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
@@ -142,15 +142,15 @@
<widget class="QLabel" name="label_3">
<property name="geometry">
<rect>
<x>300</x>
<y>0</y>
<x>170</x>
<y>-10</y>
<width>20</width>
<height>31</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>20</pointsize>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
@@ -163,15 +163,15 @@
<widget class="QLabel" name="label_4">
<property name="geometry">
<rect>
<x>420</x>
<y>0</y>
<x>240</x>
<y>-10</y>
<width>20</width>
<height>31</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>20</pointsize>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">

View File

@@ -53,7 +53,7 @@ void Scope::paintEvent(QPaintEvent*) {
for (int32_t i = 1; i < samples_.size(); i++) {
p.drawLine(
(i - 1) * width() / samples_.size(),
(i) * width() / samples_.size(),
midY - samples_[i - 1] * scaleY,
i * width() / samples_.size(),
midY - samples_[i] * scaleY

View File

@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>120</width>
<height>300</height>
<width>65</width>
<height>280</height>
</rect>
</property>
<property name="sizePolicy">
@@ -22,8 +22,8 @@
<widget class="QSlider" name="slider">
<property name="geometry">
<rect>
<x>50</x>
<y>90</y>
<x>23</x>
<y>80</y>
<width>16</width>
<height>160</height>
</rect>
@@ -44,9 +44,9 @@
<widget class="QDoubleSpinBox" name="spinMin">
<property name="geometry">
<rect>
<x>20</x>
<y>260</y>
<width>82</width>
<x>6</x>
<y>250</y>
<width>51</width>
<height>24</height>
</rect>
</property>
@@ -56,13 +56,19 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
<property name="buttonSymbols">
<enum>QAbstractSpinBox::ButtonSymbols::NoButtons</enum>
</property>
</widget>
<widget class="QDoubleSpinBox" name="spinMax">
<property name="geometry">
<rect>
<x>20</x>
<y>60</y>
<width>82</width>
<x>6</x>
<y>50</y>
<width>51</width>
<height>24</height>
</rect>
</property>
@@ -72,13 +78,22 @@
<verstretch>0</verstretch>
</sizepolicy>
</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 class="QDoubleSpinBox" name="spinValue">
<property name="geometry">
<rect>
<x>20</x>
<y>20</y>
<width>82</width>
<x>6</x>
<y>10</y>
<width>51</width>
<height>31</height>
</rect>
</property>
@@ -93,14 +108,23 @@
<pointsize>12</pointsize>
</font>
</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 class="Line" name="line">
<property name="geometry">
<rect>
<x>0</x>
<x>-7</x>
<y>10</y>
<width>20</width>
<height>271</height>
<height>261</height>
</rect>
</property>
<property name="sizePolicy">
@@ -116,10 +140,10 @@
<widget class="Line" name="line_2">
<property name="geometry">
<rect>
<x>100</x>
<x>50</x>
<y>10</y>
<width>20</width>
<height>271</height>
<height>261</height>
</rect>
</property>
<property name="sizePolicy">