Moved widgets in subfolder

This commit is contained in:
2022-12-27 10:15:13 +01:00
parent e612fa163d
commit 818f462ae8
37 changed files with 175 additions and 132 deletions

View File

@ -2,9 +2,9 @@ QT = core multimedia gui widgets network
CONFIG += c++20 CONFIG += c++20
release: QMAKE_CXXFLAGS_RELEASE -= -O1 #release: QMAKE_CXXFLAGS_RELEASE -= -O1
release: QMAKE_CXXFLAGS_RELEASE -= -O2 #release: QMAKE_CXXFLAGS_RELEASE -= -O2
release: QMAKE_CXXFLAGS_RELEASE += -O3 -ffast-math -march=native -mtune=native #release: QMAKE_CXXFLAGS_RELEASE += -O3 -ffast-math -march=native -mtune=native
LIBS += -lrtmidi -lportaudio LIBS += -lrtmidi -lportaudio
@ -14,64 +14,64 @@ SOURCES += \
audiodecoder.cpp \ audiodecoder.cpp \
audioformat.cpp \ audioformat.cpp \
audioplayer.cpp \ audioplayer.cpp \
djwidget.cpp \
drummachinesettings.cpp \ drummachinesettings.cpp \
drumpadwidget.cpp \
filesmodel.cpp \ filesmodel.cpp \
graphrenderer.cpp \ graphrenderer.cpp \
jsonconverters.cpp \ jsonconverters.cpp \
main.cpp \ main.cpp \
mainwindow.cpp \
midicontainers.cpp \ midicontainers.cpp \
midiinwrapper.cpp \ midiinwrapper.cpp \
midioutwrapper.cpp \ midioutwrapper.cpp \
presetdetailwidget.cpp \
presets.cpp \ presets.cpp \
presetsmodel.cpp \ presetsmodel.cpp \
previewwidget.cpp \
sampleswidget.cpp \
samplewidget.cpp \
scratchwidget.cpp \
sequencerwidget.cpp \
synthisizer.cpp \ synthisizer.cpp \
synthisizerwidget.cpp \ treetotableproxymodel.cpp \
trackdeck.cpp \ widgets/djwidget.cpp \
treetotableproxymodel.cpp widgets/drumpadwidget.cpp \
widgets/mainwindow.cpp \
widgets/presetdetailwidget.cpp \
widgets/previewwidget.cpp \
widgets/sampleswidget.cpp \
widgets/samplewidget.cpp \
widgets/scratchwidget.cpp \
widgets/sequencerwidget.cpp \
widgets/synthisizerwidget.cpp \
widgets/trackdeck.cpp
HEADERS += \ HEADERS += \
audiodecoder.h \ audiodecoder.h \
audioformat.h \ audioformat.h \
audioplayer.h \ audioplayer.h \
djwidget.h \
drummachinesettings.h \ drummachinesettings.h \
drumpadwidget.h \
filesmodel.h \ filesmodel.h \
graphrenderer.h \ graphrenderer.h \
jsonconverters.h \ jsonconverters.h \
mainwindow.h \
midicontainers.h \ midicontainers.h \
midiinwrapper.h \ midiinwrapper.h \
midioutwrapper.h \ midioutwrapper.h \
presetdetailwidget.h \
presets.h \ presets.h \
presetsmodel.h \ presetsmodel.h \
previewwidget.h \
sampleswidget.h \
samplewidget.h \
scratchwidget.h \
sequencerwidget.h \
synthisizer.h \ synthisizer.h \
synthisizerwidget.h \ treetotableproxymodel.h \
trackdeck.h \ widgets/djwidget.h \
treetotableproxymodel.h widgets/drumpadwidget.h \
widgets/mainwindow.h \
widgets/presetdetailwidget.h \
widgets/previewwidget.h \
widgets/sampleswidget.h \
widgets/samplewidget.h \
widgets/scratchwidget.h \
widgets/sequencerwidget.h \
widgets/synthisizerwidget.h \
widgets/trackdeck.h
FORMS += \ FORMS += \
djwidget.ui \ widgets/djwidget.ui \
drumpadwidget.ui \ widgets/drumpadwidget.ui \
mainwindow.ui \ widgets/mainwindow.ui \
presetdetailwidget.ui \ widgets/presetdetailwidget.ui \
sampleswidget.ui \ widgets/sampleswidget.ui \
samplewidget.ui \ widgets/samplewidget.ui \
sequencerwidget.ui \ widgets/sequencerwidget.ui \
synthisizerwidget.ui \ widgets/synthisizerwidget.ui \
trackdeck.ui widgets/trackdeck.ui

View File

@ -5,7 +5,7 @@
#include "portaudio.h" #include "portaudio.h"
#include "mainwindow.h" #include "widgets/mainwindow.h"
namespace { namespace {
template<typename T> template<typename T>

View File

@ -2,17 +2,17 @@
#include <cmath> #include <cmath>
#include "midicontainers.h"
constexpr double pi = std::acos(-1); constexpr double pi = std::acos(-1);
void Synthisizer::writeSamples(frame_t *begin, frame_t *end) void Synthisizer::writeSamples(frame_t *begin, frame_t *end)
{ {
const auto volume = m_volume;
const auto frequency = m_frequency; const auto frequency = m_frequency;
if (frequency) if (frequency)
std::transform(begin, end, begin, [&](frame_t frame){ std::transform(begin, end, begin, [&](frame_t frame){
std::transform(std::cbegin(frame), std::cend(frame), std::begin(frame), std::transform(std::cbegin(frame), std::cend(frame), std::begin(frame),
[value=std::sin(m_phase)](const sample_t &sample) { return sample + value; }); [value=std::sin(m_phase),&volume](const sample_t &sample) { return (sample + value) * volume; });
m_phase += pi*2./frameRate*m_actualFrequency; m_phase += pi*2./frameRate*m_actualFrequency;
if (m_phase >= pi*2.) if (m_phase >= pi*2.)
@ -22,14 +22,3 @@ void Synthisizer::writeSamples(frame_t *begin, frame_t *end)
}); });
m_actualFrequency = float(m_actualFrequency+m_frequency)/2.f; m_actualFrequency = float(m_actualFrequency+m_frequency)/2.f;
} }
void Synthisizer::messageReceived(const midi::MidiMessage &message)
{
if (message.cmd == midi::Command::NoteOff || (message.cmd == midi::Command::NoteOn && message.velocity == 0))
{
if (m_frequency == int16_t(440.*std::pow(std::pow(2., 1./12.), message.note-48)))
m_frequency = 0;
}
else if (message.cmd == midi::Command::NoteOn)
m_frequency = 440.*std::pow(std::pow(2., 1./12.), message.note-48);
}

View File

@ -1,24 +1,29 @@
#pragma once #pragma once
#include <QObject>
#include "audioformat.h" #include "audioformat.h"
namespace midi { class MidiMessage; } namespace midi { class MidiMessage; }
class DrumMachineSettings; class DrumMachineSettings;
class Synthisizer class Synthisizer : public QObject
{ {
public: public:
float volume() const { return m_volume; }
void setVolume(float volume) { m_volume = volume; }
int16_t frequency() const { return m_frequency; }
void setFrequency(int16_t frequency) { m_frequency = frequency; } void setFrequency(int16_t frequency) { m_frequency = frequency; }
void writeSamples(frame_t *begin, frame_t *end); void writeSamples(frame_t *begin, frame_t *end);
void messageReceived(const midi::MidiMessage &message);
signals: signals:
void sendMidi(const midi::MidiMessage &midiMsg); void sendMidi(const midi::MidiMessage &midiMsg);
private: private:
float m_volume{1.f};
int16_t m_frequency{}; int16_t m_frequency{};
int16_t m_actualFrequency{}; int16_t m_actualFrequency{};
double m_phase{}; double m_phase{};

View File

@ -1,33 +0,0 @@
#include "synthisizerwidget.h"
#include "ui_synthisizerwidget.h"
SynthisizerWidget::SynthisizerWidget(QWidget *parent) :
QWidget{parent},
m_ui{std::make_unique<Ui::SynthisizerWidget>()}
{
m_ui->setupUi(this);
}
SynthisizerWidget::~SynthisizerWidget() = default;
void SynthisizerWidget::writeSamples(frame_t *begin, frame_t *end)
{
m_synthisizer.writeSamples(begin, end);
}
void SynthisizerWidget::loadSettings(DrumMachineSettings &settings)
{
}
void SynthisizerWidget::unsendColors()
{
}
void SynthisizerWidget::sendColors()
{
}
void SynthisizerWidget::messageReceived(const midi::MidiMessage &message)
{
m_synthisizer.messageReceived(message);
}

View File

@ -1,32 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>SynthisizerWidget</class>
<widget class="QWidget" name="SynthisizerWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>30</x>
<y>60</y>
<width>221</width>
<height>31</height>
</rect>
</property>
<property name="text">
<string>Hier könnte ihr Synthisizer stehen.</string>
</property>
</widget>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -140,7 +140,7 @@
<customwidget> <customwidget>
<class>TrackDeck</class> <class>TrackDeck</class>
<extends>QWidget</extends> <extends>QWidget</extends>
<header>trackdeck.h</header> <header>widgets/trackdeck.h</header>
<container>1</container> <container>1</container>
</customwidget> </customwidget>
</customwidgets> </customwidgets>

View File

@ -119,8 +119,6 @@ void DrumPadWidget::loadPresets()
void DrumPadWidget::requestFinished() void DrumPadWidget::requestFinished()
{ {
qDebug() << "called";
if (!m_reply) if (!m_reply)
{ {
qWarning() << "no valid reply"; qWarning() << "no valid reply";

View File

@ -87,19 +87,19 @@
<customwidget> <customwidget>
<class>SamplesWidget</class> <class>SamplesWidget</class>
<extends>QWidget</extends> <extends>QWidget</extends>
<header>sampleswidget.h</header> <header>widgets/sampleswidget.h</header>
<container>1</container> <container>1</container>
</customwidget> </customwidget>
<customwidget> <customwidget>
<class>PresetDetailWidget</class> <class>PresetDetailWidget</class>
<extends>QScrollArea</extends> <extends>QScrollArea</extends>
<header>presetdetailwidget.h</header> <header>widgets/presetdetailwidget.h</header>
<container>1</container> <container>1</container>
</customwidget> </customwidget>
<customwidget> <customwidget>
<class>SequencerWidget</class> <class>SequencerWidget</class>
<extends>QWidget</extends> <extends>QWidget</extends>
<header>sequencerwidget.h</header> <header>widgets/sequencerwidget.h</header>
<container>1</container> <container>1</container>
</customwidget> </customwidget>
</customwidgets> </customwidgets>

View File

@ -37,6 +37,7 @@ MainWindow::MainWindow(QWidget *parent) :
m_ui->setupUi(this); m_ui->setupUi(this);
m_cache.setCacheDirectory("cache"); m_cache.setCacheDirectory("cache");
m_cache.setMaximumCacheSize(2ull * 1024 * 1024 * 1024);
m_networkAccessManager.setCache(&m_cache); m_networkAccessManager.setCache(&m_cache);
m_ui->drumPadWidget->injectNetworkAccessManager(m_networkAccessManager); m_ui->drumPadWidget->injectNetworkAccessManager(m_networkAccessManager);
@ -100,6 +101,8 @@ paDefault:
MainWindow::~MainWindow() MainWindow::~MainWindow()
{ {
m_paStream = nullptr;
m_decoderThread.exit(); m_decoderThread.exit();
m_decoderThread.wait(); m_decoderThread.wait();
} }

View File

@ -240,19 +240,19 @@
<customwidget> <customwidget>
<class>DjWidget</class> <class>DjWidget</class>
<extends>QWidget</extends> <extends>QWidget</extends>
<header>djwidget.h</header> <header>widgets/djwidget.h</header>
<container>1</container> <container>1</container>
</customwidget> </customwidget>
<customwidget> <customwidget>
<class>DrumPadWidget</class> <class>DrumPadWidget</class>
<extends>QWidget</extends> <extends>QWidget</extends>
<header>drumpadwidget.h</header> <header>widgets/drumpadwidget.h</header>
<container>1</container> <container>1</container>
</customwidget> </customwidget>
<customwidget> <customwidget>
<class>SynthisizerWidget</class> <class>SynthisizerWidget</class>
<extends>QWidget</extends> <extends>QWidget</extends>
<header>synthisizerwidget.h</header> <header>widgets/synthisizerwidget.h</header>
<container>1</container> <container>1</container>
</customwidget> </customwidget>
</customwidgets> </customwidgets>

View File

@ -175,7 +175,7 @@
<customwidget> <customwidget>
<class>SampleWidget</class> <class>SampleWidget</class>
<extends>QWidget</extends> <extends>QWidget</extends>
<header>samplewidget.h</header> <header>widgets/samplewidget.h</header>
<container>1</container> <container>1</container>
</customwidget> </customwidget>
</customwidgets> </customwidgets>

View File

@ -63,7 +63,7 @@ public:
signals: signals:
void chokeTriggered(int choke); void chokeTriggered(int choke);
void startDecoding(const std::shared_ptr<QIODevice> &device); void startDecoding(std::shared_ptr<QIODevice> device);
void sendMidi(const midi::MidiMessage &midiMsg); void sendMidi(const midi::MidiMessage &midiMsg);
private slots: private slots:

View File

@ -0,0 +1,46 @@
#include "synthisizerwidget.h"
#include "ui_synthisizerwidget.h"
#include <cmath>
#include "midicontainers.h"
SynthisizerWidget::SynthisizerWidget(QWidget *parent) :
QWidget{parent},
m_ui{std::make_unique<Ui::SynthisizerWidget>()}
{
m_ui->setupUi(this);
connect(m_ui->horizontalSliderVolume, &QSlider::valueChanged,
&m_synthisizer, [&synthisizer=m_synthisizer](int value){ synthisizer.setVolume(float(value) / 100.f); });
}
SynthisizerWidget::~SynthisizerWidget() = default;
void SynthisizerWidget::writeSamples(frame_t *begin, frame_t *end)
{
m_synthisizer.writeSamples(begin, end);
}
void SynthisizerWidget::loadSettings(DrumMachineSettings &settings)
{
}
void SynthisizerWidget::unsendColors()
{
}
void SynthisizerWidget::sendColors()
{
}
void SynthisizerWidget::messageReceived(const midi::MidiMessage &message)
{
if (message.cmd == midi::Command::NoteOff || (message.cmd == midi::Command::NoteOn && message.velocity == 0))
{
if (m_synthisizer.frequency() == int16_t(440.*std::pow(std::pow(2., 1./12.), message.note-48)))
m_synthisizer.setFrequency(0);
}
else if (message.cmd == midi::Command::NoteOn)
m_synthisizer.setFrequency(440.*std::pow(std::pow(2., 1./12.), message.note-48));
}

View File

@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>SynthisizerWidget</class>
<widget class="QWidget" name="SynthisizerWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>30</x>
<y>60</y>
<width>221</width>
<height>31</height>
</rect>
</property>
<property name="text">
<string>Hier könnte ihr Synthisizer stehen.</string>
</property>
</widget>
<widget class="QSlider" name="horizontalSliderVolume">
<property name="geometry">
<rect>
<x>110</x>
<y>110</y>
<width>160</width>
<height>16</height>
</rect>
</property>
<property name="maximum">
<number>100</number>
</property>
<property name="value">
<number>100</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
<widget class="QLabel" name="labelVolume">
<property name="geometry">
<rect>
<x>20</x>
<y>110</y>
<width>55</width>
<height>18</height>
</rect>
</property>
<property name="text">
<string>Volume:</string>
</property>
<property name="buddy">
<cstring>horizontalSliderVolume</cstring>
</property>
</widget>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -399,13 +399,13 @@
<customwidget> <customwidget>
<class>PreviewWidget</class> <class>PreviewWidget</class>
<extends>QWidget</extends> <extends>QWidget</extends>
<header>previewwidget.h</header> <header>widgets/previewwidget.h</header>
<container>1</container> <container>1</container>
</customwidget> </customwidget>
<customwidget> <customwidget>
<class>ScratchWidget</class> <class>ScratchWidget</class>
<extends>QWidget</extends> <extends>QWidget</extends>
<header>scratchwidget.h</header> <header>widgets/scratchwidget.h</header>
<container>1</container> <container>1</container>
</customwidget> </customwidget>
</customwidgets> </customwidgets>